diff --git a/doc/Sound2Light_Tool_Anleitung.pdf b/doc/Sound2Light_Tool_Anleitung.pdf index 4d5d599..525cc1f 100644 Binary files a/doc/Sound2Light_Tool_Anleitung.pdf and b/doc/Sound2Light_Tool_Anleitung.pdf differ diff --git a/doc/Sound2Light_Tool_Manual_en.pdf b/doc/Sound2Light_Tool_Manual_en.pdf index e987fa2..ea522a7 100644 Binary files a/doc/Sound2Light_Tool_Manual_en.pdf and b/doc/Sound2Light_Tool_Manual_en.pdf differ diff --git a/doc/s2l_changelog.md b/doc/s2l_changelog.md index 9c0078f..390ecba 100644 --- a/doc/s2l_changelog.md +++ b/doc/s2l_changelog.md @@ -1,6 +1,10 @@ # Sound2Light Change Log +### Version 0.0.2.1.0.9 - 1 Mar 2017 + +- Supports Muting the OSC output of individual channels + ### Version 0.0.2.1.0.8 - 1 Mar 2017 - Fixed BPM OSC Messages with a one digit value being interpreted falsely on EOS diff --git a/doc/screenshot_main_window.png b/doc/screenshot_main_window.png index 020bfbf..9a2c2f0 100644 Binary files a/doc/screenshot_main_window.png and b/doc/screenshot_main_window.png differ diff --git a/src/BPMOscControler.cpp b/src/BPMOscControler.cpp index aa760b2..b400f00 100644 --- a/src/BPMOscControler.cpp +++ b/src/BPMOscControler.cpp @@ -21,11 +21,25 @@ #include "BPMOscControler.h" BPMOscControler::BPMOscControler(OSCNetworkManager &osc) : - m_osc(osc) + m_bpmMute(false) + , m_osc(osc) , m_oscCommands() { } +void BPMOscControler::setBPMMute(bool mute) +{ + m_bpmMute = mute; + + m_osc.sendMessage("/s2l/out/bpm/mute", (m_bpmMute ? "1" : "0"), true); +} + +void BPMOscControler::toggleBPMMute() +{ + m_bpmMute = !m_bpmMute; + m_osc.sendMessage("/s2l/out/bpm/mute", (m_bpmMute ? "1" : "0"), true); +} + // Restore the commands from e.g. a preset or whatever else void BPMOscControler::restore(QSettings& settings) { @@ -55,6 +69,9 @@ inline int round(float value) { return (fmod(value,1.0) < 0.5) ? value : value + // Called by the bpm detector to make the controller send the new bpm to the clients void BPMOscControler::transmitBPM(float bpm) { + // Don't transmit if mute is engaged + if (m_bpmMute) return; + // Send user specified commands for (QString& command : m_oscCommands) { diff --git a/src/BPMOscControler.h b/src/BPMOscControler.h index 13b8c2b..04674c7 100644 --- a/src/BPMOscControler.h +++ b/src/BPMOscControler.h @@ -29,6 +29,11 @@ class BPMOscControler public: BPMOscControler(OSCNetworkManager& osc); + // Getter/Setter for mute + bool getBPMMute() { return m_bpmMute; } + void setBPMMute(bool mute); + void toggleBPMMute(); + // Called by the bpm detector to make the controller send the new bpm to the clients void transmitBPM(float bpm); @@ -49,6 +54,7 @@ class BPMOscControler protected: + bool m_bpmMute; // If the bpm osc is muted OSCNetworkManager& m_osc; // The network manager to send network signals thorugh QStringList m_oscCommands; // The osc messages to be sent on a tempo changed. Delivered as finished strings with the (, etc. for fractions from 1/4 to 4) qualifier to be changed. The message is generated in the qml because thats the way tim did it with the other osc messages }; diff --git a/src/LICENSE.txt b/src/LICENSE.txt new file mode 100644 index 0000000..77ea748 --- /dev/null +++ b/src/LICENSE.txt @@ -0,0 +1,19 @@ +// Copyright (c) 2016 Electronic Theatre Controls, Inc., http://www.etcconnect.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. diff --git a/src/MainController.cpp b/src/MainController.cpp index 81644ad..0c28aa7 100644 --- a/src/MainController.cpp +++ b/src/MainController.cpp @@ -474,6 +474,8 @@ void MainController::loadPreset(const QString &constFileName, bool createIfNotEx // Restore the manual BPM m_bpmTap.setBpm(settings.value("bpm/tapvalue", 60).toInt()); + m_bpmOSC.setBPMMute(settings.value("bpm/mute", false).toBool()); + // this is now the loaded preset, update the preset name: m_currentPresetFilename = fileName; emit presetNameChanged(); @@ -491,6 +493,7 @@ void MainController::loadPreset(const QString &constFileName, bool createIfNotEx emit bpmActiveChanged(); emit bpmRangeChanged(); emit waveformVisibleChanged(); + emit bpmMuteChanged(); emit m_bassController->parameterChanged(); emit m_loMidController->parameterChanged(); @@ -505,6 +508,13 @@ void MainController::loadPreset(const QString &constFileName, bool createIfNotEx emit m_highController->oscLabelTextChanged(); emit m_envelopeController->oscLabelTextChanged(); emit m_silenceController->oscLabelTextChanged(); + + emit m_bassController->muteChanged(); + emit m_loMidController->muteChanged(); + emit m_hiMidController->muteChanged(); + emit m_highController->muteChanged(); + emit m_envelopeController->muteChanged(); + emit m_silenceController->muteChanged(); } void MainController::savePresetAs(const QString &constFileName, bool isAutosave) @@ -547,9 +557,12 @@ void MainController::savePresetAs(const QString &constFileName, bool isAutosave) // save the settings in the BPMOscController m_bpmOSC.save(settings); - // Restore the manual BPM + // save the manual BPM settings.setValue("bpm/tapvalue", m_bpmTap.getBpm()); + // save bpm mute + settings.setValue("bpm/mute", m_bpmOSC.getBPMMute()); + if (!isAutosave) { // this is now the loaded preset, update the preset name: m_currentPresetFilename = fileName; emit presetNameChanged(); diff --git a/src/MainController.h b/src/MainController.h index ae6665c..8f55a69 100644 --- a/src/MainController.h +++ b/src/MainController.h @@ -130,6 +130,9 @@ class MainController : public QObject // emitted if the waveform visiblity changed void waveformVisibleChanged(); + // emitted if the bpm mute changed + void bpmMuteChanged(); + // forwarded from OSCNetworkManager: void messageReceived(OSCMessage msg); void packetSent(); @@ -246,6 +249,10 @@ public slots: // gets the minium bpm of the range int getMinBPM() { return m_bpm.getMinBPM(); } + // set/get bpm mute + bool getBPMMute() { return m_bpmOSC.getBPMMute(); } + void toggleBPMMute() { m_bpmOSC.toggleBPMMute(); emit bpmMuteChanged(); } + // set/get the waveform visibility bool getWaveformVisible() { return m_waveformVisible & m_bpmActive; } void setWaveformVisible(bool value) { m_waveformVisible = value; emit waveformVisibleChanged();} diff --git a/src/OSCMapping.cpp b/src/OSCMapping.cpp index 1038a88..44de0cf 100644 --- a/src/OSCMapping.cpp +++ b/src/OSCMapping.cpp @@ -82,6 +82,20 @@ void OSCMapping::handleMessage(OSCMessage msg) if (msg.arguments().size() == 0 || msg.arguments().at(0).toBool()) { m_controller->triggerBeat(); } + } else if (msg.pathStartsWith("/s2l/bpm/mute")) { + m_controller->toggleBPMMute(); + } else if (msg.pathStartsWith("/s2l/bass/mute")) { + m_controller->m_bassController->toggleMute(); + } else if (msg.pathStartsWith("/s2l/lo_mid/mute")) { + m_controller->m_loMidController->toggleMute(); + } else if (msg.pathStartsWith("/s2l/hi_mid/mute")) { + m_controller->m_hiMidController->toggleMute(); + } else if (msg.pathStartsWith("/s2l/high/mute")) { + m_controller->m_highController->toggleMute(); + } else if (msg.pathStartsWith("/s2l/level/mute")) { + m_controller->m_envelopeController->toggleMute(); + } else if (msg.pathStartsWith("/s2l/silence/mute")) { + m_controller->m_silenceController->toggleMute(); } } diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..91f9d25 --- /dev/null +++ b/src/README.md @@ -0,0 +1,19 @@ +# Sound2Light Tool + +The Sound2Light tool converts live audio signals to trigger events that can be sent as OSC messages. It can reproduce the sound-to-light function of the NT/NTX consoles with systems of the Eos-, Cobalt- and ColorSource-family. It can also be remotely controlled by OSC. + +## About this ETCLabs Project +The Sound2Light Tool is open-source software designed to interact with Electronic Theatre Controls products. This is not official ETC software. +ETC Support is not familiar with this software and will not be able to assist if issues arise. + +We also welcome pull requests for bug fixes and feature additions. + +# Download + +The current release for Windows and Mac is available here: [Download](https://github.com/ElectronicTheatreControlsLabs/Sound2Light/releases) + +The manual can be found here: [Manual](https://github.com/ElectronicTheatreControlsLabs/Sound2Light/blob/master/doc/Sound2Light_Tool_Manual_en.pdf) + +# Screenshot + +![screenshot](https://github.com/ElectronicTheatreControlsLabs/Sound2Light/blob/master/doc/screenshot_main_window.png) diff --git a/src/TriggerFilter.cpp b/src/TriggerFilter.cpp index 8d7c5dc..238defe 100644 --- a/src/TriggerFilter.cpp +++ b/src/TriggerFilter.cpp @@ -25,8 +25,9 @@ #include #include -TriggerFilter::TriggerFilter(OSCNetworkManager* osc, TriggerOscParameters& oscParameters) +TriggerFilter::TriggerFilter(OSCNetworkManager* osc, TriggerOscParameters& oscParameters, bool mute) : QObject(0) + , m_mute(mute) , m_onDelay(0.0) , m_offDelay(0.0) , m_maxHold(0.0) @@ -75,14 +76,14 @@ void TriggerFilter::triggerOff() void TriggerFilter::sendOnSignal() { QString message = m_oscParameters.getOnMessage(); - if (!message.isEmpty()) m_osc->sendMessage(message); + if (!message.isEmpty() && !m_mute) m_osc->sendMessage(message); emit onSignalSent(); } void TriggerFilter::sendOffSignal() { QString message = m_oscParameters.getOffMessage(); - if (!message.isEmpty()) m_osc->sendMessage(message); + if (!message.isEmpty() && !m_mute) m_osc->sendMessage(message); emit offSignalSent(); } diff --git a/src/TriggerFilter.h b/src/TriggerFilter.h index 52d427d..e8a794f 100644 --- a/src/TriggerFilter.h +++ b/src/TriggerFilter.h @@ -41,7 +41,9 @@ class TriggerFilter : public QObject Q_OBJECT public: - explicit TriggerFilter(OSCNetworkManager* osc, TriggerOscParameters& oscParameters); + explicit TriggerFilter(OSCNetworkManager* osc, TriggerOscParameters& oscParameters, bool mute); + + void setMute(bool mute) { m_mute = mute; } // returns the on delay time in seconds qreal getOnDelay() const { return m_onDelay; } @@ -105,6 +107,7 @@ public slots: void onMaxHoldEnd(); protected: + bool m_mute; // Wether the associated band is muted qreal m_onDelay; // On delay in seconds qreal m_offDelay; // Off delay in seconds qreal m_maxHold; // max hold time (decay) in seconds diff --git a/src/TriggerGenerator.cpp b/src/TriggerGenerator.cpp index 4ecff68..27b009f 100644 --- a/src/TriggerGenerator.cpp +++ b/src/TriggerGenerator.cpp @@ -30,17 +30,34 @@ TriggerGenerator::TriggerGenerator(QString name, OSCNetworkManager* osc, bool is , m_name(name) , m_osc(osc) , m_invert(invert) + , m_mute(false) , m_midFreq(midFreq) , m_defaultMidFreq(midFreq) , m_width(0.1) , m_threshold(0.5) , m_isActive(false) , m_oscParameters() - , m_filter(osc, m_oscParameters) + , m_filter(osc, m_oscParameters, m_mute) { resetParameters(); } +// toggles mute on and off +void TriggerGenerator::toggleMute() +{ + m_mute = !m_mute; + m_filter.setMute(m_mute); + m_osc->sendMessage("/s2l/out/" + m_name + "/mute", (m_mute ? "1" : "0"), true); +} + +// toggles mute on and off +void TriggerGenerator::setMute(bool mute) +{ + m_mute = mute; + m_filter.setMute(m_mute); + m_osc->sendMessage("/s2l/out/" + m_name + "/mute", (m_mute ? "1" : "0"), true); +} + bool TriggerGenerator::checkForTrigger(ScaledSpectrum &spectrum, bool forceRelease) { qreal value; @@ -51,7 +68,7 @@ bool TriggerGenerator::checkForTrigger(ScaledSpectrum &spectrum, bool forceRelea } if (m_invert) value = 1 - value; - // check for trigger: + // check for trigger: if ((!m_isActive && value >= m_threshold) && !forceRelease) { // activate trigger: m_isActive = true; @@ -60,19 +77,19 @@ bool TriggerGenerator::checkForTrigger(ScaledSpectrum &spectrum, bool forceRelea // release trigger: m_isActive = false; m_filter.triggerOff(); - } + } - // send level if levelMessage is set: + // send level if levelMessage is set and band is not muted: // and if difference to last value is greater than 0.001: - qreal diff = qAbs(m_lastValue - value); - if (diff > 0.001 && !m_oscParameters.getLevelMessage().isEmpty() && m_threshold > 0) { - qreal valueUnderThreshold = limit(0, (value / m_threshold), 1); - qreal minValue = m_oscParameters.getMinLevelValue(); - qreal maxValue = m_oscParameters.getMaxLevelValue(); - qreal scaledValue = minValue + valueUnderThreshold * (maxValue - minValue); - QString oscMessage = m_oscParameters.getLevelMessage() + QString::number(scaledValue, 'f', 3); - m_osc->sendMessage(oscMessage); - } + qreal diff = qAbs(m_lastValue - value); + if (diff > 0.001 && !m_oscParameters.getLevelMessage().isEmpty() && m_threshold > 0 && !m_mute) { + qreal valueUnderThreshold = limit(0, (value / m_threshold), 1); + qreal minValue = m_oscParameters.getMinLevelValue(); + qreal maxValue = m_oscParameters.getMaxLevelValue(); + qreal scaledValue = minValue + valueUnderThreshold * (maxValue - minValue); + QString oscMessage = m_oscParameters.getLevelMessage() + QString::number(scaledValue, 'f', 3); + m_osc->sendMessage(oscMessage); + } m_lastValue = value; return m_isActive; @@ -80,7 +97,8 @@ bool TriggerGenerator::checkForTrigger(ScaledSpectrum &spectrum, bool forceRelea void TriggerGenerator::save(QSettings& settings) const { - settings.setValue(m_name + "/threshold", m_threshold); + settings.setValue(m_name + "/mute", m_mute); + settings.setValue(m_name + "/threshold", m_threshold); settings.setValue(m_name + "/midFreq", m_midFreq); settings.setValue(m_name + "/width", m_width); m_filter.save(m_name, settings); @@ -89,17 +107,19 @@ void TriggerGenerator::save(QSettings& settings) const void TriggerGenerator::restore(QSettings& settings) { + m_mute = settings.value(m_name + "/mute", false).toBool(); setThreshold(settings.value(m_name + "/threshold").toReal()); setMidFreq(settings.value(m_name + "/midFreq").toReal()); setWidth(settings.value(m_name + "/width").toReal()); m_filter.restore(m_name, settings); - m_oscParameters.restore(m_name, settings); + m_oscParameters.restore(m_name, settings); } void TriggerGenerator::resetParameters() { - setMidFreq(m_defaultMidFreq); + setMidFreq(m_defaultMidFreq); setWidth(0.1); + m_mute = false; if (m_isBandpass) { setThreshold(0.5); // default Bandpass settings: diff --git a/src/TriggerGenerator.h b/src/TriggerGenerator.h index e6715f3..8a2d16d 100644 --- a/src/TriggerGenerator.h +++ b/src/TriggerGenerator.h @@ -50,6 +50,16 @@ class TriggerGenerator : public TriggerGeneratorInterface // ---------------- Parameters ------------- + // returns wether the frequency band is muted + bool getMute() const { return m_mute; } + + // toggles mute on and off + void toggleMute(); + + // toggles mute on and off + void setMute(bool mute); + + // returns the middle frequency of the frequency band [20...22050] int getMidFreq() const { return m_midFreq; } @@ -97,9 +107,10 @@ class TriggerGenerator : public TriggerGeneratorInterface void resetParameters(); protected: - const QString m_name; // name of the Trigger (used for save, restore and UI) + const QString m_name; // name of the Trigger (used for save, restore and UI) OSCNetworkManager* m_osc; // pointer to OSCNetworkManager instance (i.e. of MainController) const bool m_invert; // true if signal values should be inverted (i.e. for "silence" trigger) + bool m_mute; // true if the band is muted, which will supress OSC Output int m_midFreq; // middle frequency of bandpass in Hz const int m_defaultMidFreq; // default midFreq in Hz, used for reset qreal m_width; // width of bandpass [0...1] diff --git a/src/TriggerGuiController.h b/src/TriggerGuiController.h index 6dede1e..bbb07be 100644 --- a/src/TriggerGuiController.h +++ b/src/TriggerGuiController.h @@ -58,12 +58,18 @@ class TriggerGuiController : public QObject void oscLabelTextChanged(); // emitted when a value of the preset changed void presetChanged(); + // emmited when mute changes + void muteChanged(); public slots: // forward calls to TriggerGenerator // see TriggerGenerator.h for documentation + bool getMute() const { return m_trigger->getMute(); } + void toggleMute() { m_trigger->toggleMute(); emit muteChanged(); } + void setMute(bool mute) { m_trigger->setMute(mute); emit muteChanged(); } + int getMidFreq() const { return m_trigger->getMidFreq(); } void setMidFreq(const int& value) { m_trigger->setMidFreq(value); emit parameterChanged(); emit presetChanged(); } diff --git a/src/images.qrc b/src/images.qrc index 5adeaf8..4642dc8 100644 --- a/src/images.qrc +++ b/src/images.qrc @@ -9,5 +9,7 @@ images/maximize.png images/minimize.png images/edit.png + images/play.png + images/pause.png diff --git a/src/images/pause.png b/src/images/pause.png new file mode 100644 index 0000000..3da73e6 Binary files /dev/null and b/src/images/pause.png differ diff --git a/src/images/play.png b/src/images/play.png new file mode 100644 index 0000000..cfc2a1a Binary files /dev/null and b/src/images/play.png differ diff --git a/src/qml/BPMSettings.qml b/src/qml/BPMSettings.qml index 1cafc4e..b489f67 100644 --- a/src/qml/BPMSettings.qml +++ b/src/qml/BPMSettings.qml @@ -260,11 +260,49 @@ Item { text: "BPM Target" onClicked: controller.openDialog("qrc:/qml/BPMOscMessageDialog.qml") } + // ------------------------------- Mute --------------------------- + DarkButton { + id: muteButton + visible: !minimalMode + x: 10 + width: parent.width - 2*x + height: 30 + text: "" + highlighted: true + highlightColor: controller.getBPMMute() ? "#FF6633" : "lightgreen" + Image { + id: playimage + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + width: height + source: "qrc:/images/play.png" + visible: controller.getBPMMute() + } + Image { + id: pauseimage + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + width: height + source: "qrc:/images/pause.png" + visible: !controller.getBPMMute() + } + Connections { + target: controller + onBpmMuteChanged: { + muteButton.highlightColor = controller.getBPMMute() ? "#FF6633" : "lightgreen" + playimage.visible = controller.getBPMMute() + pauseimage.visible = !controller.getBPMMute() + } + } + onClicked: controller.toggleBPMMute() + } // --------------------------- Spacer ----------------------------- Item { width: parent.width - height: parent.height - bpmLabelItem.height - activationRow.height - rangePicker.height - (minimalMode ? 0 : waveformVisibleCheckbox.height + oscSettingsButton.height) - minimalModeButton.height - 10 + height: parent.height - bpmLabelItem.height - activationRow.height - rangePicker.height - (minimalMode ? 0 : waveformVisibleCheckbox.height + oscSettingsButton.height + muteButton.height) - minimalModeButton.height - 10 } // ----------------------- Minimal Mode Button -------------------- diff --git a/src/qml/TriggerSettings.qml b/src/qml/TriggerSettings.qml index ebab947..6995478 100644 --- a/src/qml/TriggerSettings.qml +++ b/src/qml/TriggerSettings.qml @@ -88,7 +88,7 @@ Item { SliderWithIndicator { id: thresholdSlider width: parent.width - height: parent.height - 40 - details.height + height: parent.height - 40 - details.height - muteButton.height value: triggerController.threshold onValueChanged: if (triggerController.threshold !== value) triggerController.threshold = value @@ -101,7 +101,7 @@ Item { id: details visible: detailsVisible width: parent.width - height: detailsVisible ? 30*6 : 0 + height: detailsVisible ? 30*6 : 0 Column { // ------------------ Frequency and Width - only visible if this is a Bandpass --------- width: parent.width @@ -176,7 +176,44 @@ Item { height: 30 text: (triggerController.oscLabelText !== "") ? triggerController.oscLabelText : "---" onClicked: controller.openDialog("qrc:/qml/OscMessageDialog.qml", "triggerController", root.triggerController) - } + } } // details Column + + // ------------------------------- Mute --------------------------- + DarkButton { + id: muteButton + width: parent.width + height: 30 + text: "" + highlighted: true + highlightColor: triggerController.getMute() ? "#FF6633" : "lightgreen" + Image { + id: playimage + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + width: height + source: "qrc:/images/play.png" + visible: triggerController.getMute() + } + Image { + id: pauseimage + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + width: height + source: "qrc:/images/pause.png" + visible: !triggerController.getMute() + } + Connections { + target: triggerController + onMuteChanged: { + muteButton.highlightColor = triggerController.getMute() ? "#FF6633" : "lightgreen" + playimage.visible = triggerController.getMute() + pauseimage.visible = !triggerController.getMute() + } + } + onClicked: triggerController.toggleMute() + } } // Column } diff --git a/src/qml/TriggerSettingsLegend.qml b/src/qml/TriggerSettingsLegend.qml index ae6193d..df001a2 100644 --- a/src/qml/TriggerSettingsLegend.qml +++ b/src/qml/TriggerSettingsLegend.qml @@ -79,7 +79,7 @@ Column { Item { // spacer width: parent.width - height: parent.height - details.height - 30*6 + height: parent.height - details.height - 30*7 } // ----------------------- Show / Hide Details Button ----------------- @@ -95,7 +95,7 @@ Column { id: details visible: detailsVisible width: parent.width - height: detailsVisible ? 30*6 : 0 // 6 labels with 30px height each + height: detailsVisible ? 30*6 : 0 // 6 labels with 30px height each CenterLabel { text: "Frequency" } @@ -113,6 +113,9 @@ Column { } CenterLabel { text: "OSC Message" - } + } } + CenterLabel { + text: "OSC Mute" + } } diff --git a/src/qml/main.qml b/src/qml/main.qml index 21780f8..b26b997 100644 --- a/src/qml/main.qml +++ b/src/qml/main.qml @@ -84,14 +84,14 @@ ApplicationWindow { SpectrumWithControls { id: spectrumWithControls Layout.fillHeight: true - Layout.minimumHeight: minimalMode ? 200 : 260 + Layout.minimumHeight: minimalMode ? 200 : 300 } // -------------------------- Bottom Area with Trigger Settings --------------------------- TriggerSettingsArea { id: triggerSettingsArea visible: minimalMode ? false : true - Layout.minimumHeight: minimalMode ? 0 : detailsVisible ? 370 : 250 + Layout.minimumHeight: minimalMode ? 0 : detailsVisible ? 390 : 280 height: minimalMode ? 0 : 400 } diff --git a/src/sound2light_installer_data_windows.zip b/src/sound2light_installer_data_windows.zip new file mode 100644 index 0000000..3090e64 Binary files /dev/null and b/src/sound2light_installer_data_windows.zip differ diff --git a/src/versionInfo.h b/src/versionInfo.h index 9b088bf..b68a76a 100644 --- a/src/versionInfo.h +++ b/src/versionInfo.h @@ -25,7 +25,7 @@ // This file includes the version number of this software. -static const QString VERSION_STRING = "0.0.2.1.0.8"; +static const QString VERSION_STRING = "0.0.2.1.0.9"; static const int SETTINGS_FORMAT_VERSION = 1; #endif // VERSIONINFO_H