Browse Source

Add option to disabling sending notes to plugins (reverse on)

Signed-off-by: falkTX <falktx@falktx.com>
tags/v2.2.0-RC1
falkTX 4 years ago
parent
commit
53b3a2cbac
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
13 changed files with 113 additions and 28 deletions
  1. +8
    -1
      resources/ui/carla_edit.ui
  2. +7
    -0
      source/backend/CarlaBackend.h
  3. +6
    -0
      source/backend/plugin/CarlaPluginBridge.cpp
  4. +18
    -11
      source/backend/plugin/CarlaPluginFluidSynth.cpp
  5. +6
    -0
      source/backend/plugin/CarlaPluginJack.cpp
  6. +5
    -0
      source/backend/plugin/CarlaPluginJuce.cpp
  7. +23
    -16
      source/backend/plugin/CarlaPluginLADSPADSSI.cpp
  8. +5
    -0
      source/backend/plugin/CarlaPluginLV2.cpp
  9. +9
    -0
      source/backend/plugin/CarlaPluginNative.cpp
  10. +5
    -0
      source/backend/plugin/CarlaPluginSFZero.cpp
  11. +5
    -0
      source/backend/plugin/CarlaPluginVST2.cpp
  12. +5
    -0
      source/frontend/carla_backend.py
  13. +11
    -0
      source/frontend/carla_widgets.py

+ 8
- 1
resources/ui/carla_edit.ui View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>537</width>
<height>535</height>
<height>525</height>
</rect>
</property>
<property name="windowTitle">
@@ -405,6 +405,13 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ch_send_notes">
<property name="text">
<string>Send Notes</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ch_send_program_changes">
<property name="text">


+ 7
- 0
source/backend/CarlaBackend.h View File

@@ -260,6 +260,13 @@ static const uint PLUGIN_OPTION_SEND_ALL_SOUND_OFF = 0x100;
*/
static const uint PLUGIN_OPTION_SEND_PROGRAM_CHANGES = 0x200;

/*!
* Skip sending MIDI note events.
* This if off-by-default as a way to keep backwards compatibility.
* We always want notes enabled by default, not the contrary.
*/
static const uint PLUGIN_OPTION_SKIP_SENDING_NOTES = 0x400;

/*!
* Special flag to indicate that plugin options are not yet set.
* This flag exists because 0x0 as an option value is a valid one, so we need something else to indicate "null-ness".


+ 6
- 0
source/backend/plugin/CarlaPluginBridge.cpp View File

@@ -1541,6 +1541,8 @@ public:

uint8_t status = uint8_t(MIDI_GET_STATUS_FROM_DATA(midiData));

if ((status == MIDI_STATUS_NOTE_OFF || status == MIDI_STATUS_NOTE_ON) && (pData->options & PLUGIN_OPTION_SKIP_SENDING_NOTES))
continue;
if (status == MIDI_STATUS_CHANNEL_PRESSURE && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0)
continue;
if (status == MIDI_STATUS_CONTROL_CHANGE && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0)
@@ -2698,6 +2700,10 @@ public:
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_ALL_SOUND_OFF))
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;

if (fInfo.optionsAvailable & PLUGIN_OPTION_SKIP_SENDING_NOTES)
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SKIP_SENDING_NOTES))
pData->options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;

if (fInfo.optionsAvailable & PLUGIN_OPTION_SEND_PROGRAM_CHANGES)
{
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_PROGRAM_CHANGES))


+ 18
- 11
source/backend/plugin/CarlaPluginFluidSynth.cpp View File

@@ -193,6 +193,7 @@ public:
options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE;
options |= PLUGIN_OPTION_SEND_PITCHBEND;
options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;

return options;
}
@@ -1381,24 +1382,28 @@ public:

switch (status)
{
case MIDI_STATUS_NOTE_OFF: {
const uint8_t note = midiEvent.data[1];
case MIDI_STATUS_NOTE_OFF:
if ((pData->options & PLUGIN_OPTION_SKIP_SENDING_NOTES) == 0x0)
{
const uint8_t note = midiEvent.data[1];

fluid_synth_noteoff(fSynth, event.channel, note);
fluid_synth_noteoff(fSynth, event.channel, note);

pData->postponeRtEvent(kPluginPostRtEventNoteOff, true, event.channel, note, 0, 0.0f);
pData->postponeRtEvent(kPluginPostRtEventNoteOff, true, event.channel, note, 0, 0.0f);
}
break;
}

case MIDI_STATUS_NOTE_ON: {
const uint8_t note = midiEvent.data[1];
const uint8_t velo = midiEvent.data[2];
case MIDI_STATUS_NOTE_ON:
if ((pData->options & PLUGIN_OPTION_SKIP_SENDING_NOTES) == 0x0)
{
const uint8_t note = midiEvent.data[1];
const uint8_t velo = midiEvent.data[2];

fluid_synth_noteon(fSynth, event.channel, note, velo);
fluid_synth_noteon(fSynth, event.channel, note, velo);

pData->postponeRtEvent(kPluginPostRtEventNoteOn, true, event.channel, note, velo, 0.0f);
pData->postponeRtEvent(kPluginPostRtEventNoteOn, true, event.channel, note, velo, 0.0f);
}
break;
}

case MIDI_STATUS_POLYPHONIC_AFTERTOUCH:
if (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH)
@@ -1749,6 +1754,8 @@ public:
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_MAP_PROGRAM_CHANGES))
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SKIP_SENDING_NOTES))
pData->options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;

return true;
}


+ 6
- 0
source/backend/plugin/CarlaPluginJack.cpp View File

@@ -645,6 +645,7 @@ public:
options |= PLUGIN_OPTION_SEND_PITCHBEND;
options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES;
options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;
}

return options;
@@ -1200,6 +1201,8 @@ public:

uint8_t status = uint8_t(MIDI_GET_STATUS_FROM_DATA(midiData));

if ((status == MIDI_STATUS_NOTE_OFF || status == MIDI_STATUS_NOTE_ON) && (pData->options & PLUGIN_OPTION_SKIP_SENDING_NOTES))
continue;
if (status == MIDI_STATUS_CHANNEL_PRESSURE && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0)
continue;
if (status == MIDI_STATUS_CONTROL_CHANGE && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0)
@@ -1785,6 +1788,9 @@ public:
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_PROGRAM_CHANGES))
pData->options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES;

if (isPluginOptionEnabled(options, PLUGIN_OPTION_SKIP_SENDING_NOTES))
pData->options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;

return true;
}



+ 5
- 0
source/backend/plugin/CarlaPluginJuce.cpp View File

@@ -182,6 +182,7 @@ public:
options |= PLUGIN_OPTION_SEND_PITCHBEND;
options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES;
options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;
}

return options;
@@ -1049,6 +1050,8 @@ public:

uint8_t status = uint8_t(MIDI_GET_STATUS_FROM_DATA(midiData));

if ((status == MIDI_STATUS_NOTE_OFF || status == MIDI_STATUS_NOTE_ON) && (pData->options & PLUGIN_OPTION_SKIP_SENDING_NOTES))
continue;
if (status == MIDI_STATUS_CHANNEL_PRESSURE && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0)
continue;
if (status == MIDI_STATUS_CONTROL_CHANGE && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0)
@@ -1463,6 +1466,8 @@ public:
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_PROGRAM_CHANGES))
pData->options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SKIP_SENDING_NOTES))
pData->options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;
}

if (fInstance->getNumPrograms() > 1 && ((pData->options & PLUGIN_OPTION_SEND_PROGRAM_CHANGES) == 0))


+ 23
- 16
source/backend/plugin/CarlaPluginLADSPADSSI.cpp View File

@@ -519,6 +519,7 @@ public:
options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH;
options |= PLUGIN_OPTION_SEND_PITCHBEND;
options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;
}
}

@@ -1826,29 +1827,33 @@ public:

switch (status)
{
case MIDI_STATUS_NOTE_OFF: {
const uint8_t note = midiEvent.data[1];
case MIDI_STATUS_NOTE_OFF:
if ((pData->options & PLUGIN_OPTION_SKIP_SENDING_NOTES) == 0x0)
{
const uint8_t note = midiEvent.data[1];

seqEvent.type = SND_SEQ_EVENT_NOTEOFF;
seqEvent.data.note.channel = event.channel;
seqEvent.data.note.note = note;
seqEvent.type = SND_SEQ_EVENT_NOTEOFF;
seqEvent.data.note.channel = event.channel;
seqEvent.data.note.note = note;

pData->postponeRtEvent(kPluginPostRtEventNoteOff, true, event.channel, note, 0, 0.0f);
pData->postponeRtEvent(kPluginPostRtEventNoteOff, true, event.channel, note, 0, 0.0f);
}
break;
}

case MIDI_STATUS_NOTE_ON: {
const uint8_t note = midiEvent.data[1];
const uint8_t velo = midiEvent.data[2];
case MIDI_STATUS_NOTE_ON:
if ((pData->options & PLUGIN_OPTION_SKIP_SENDING_NOTES) == 0x0)
{
const uint8_t note = midiEvent.data[1];
const uint8_t velo = midiEvent.data[2];

seqEvent.type = SND_SEQ_EVENT_NOTEON;
seqEvent.data.note.channel = event.channel;
seqEvent.data.note.note = note;
seqEvent.data.note.velocity = velo;
seqEvent.type = SND_SEQ_EVENT_NOTEON;
seqEvent.data.note.channel = event.channel;
seqEvent.data.note.note = note;
seqEvent.data.note.velocity = velo;

pData->postponeRtEvent(kPluginPostRtEventNoteOn, true, event.channel, note, velo, 0.0f);
pData->postponeRtEvent(kPluginPostRtEventNoteOn, true, event.channel, note, velo, 0.0f);
}
break;
}

case MIDI_STATUS_POLYPHONIC_AFTERTOUCH:
if (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH)
@@ -3037,6 +3042,8 @@ public:
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_ALL_SOUND_OFF))
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SKIP_SENDING_NOTES))
pData->options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;
}
}



+ 5
- 0
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -961,6 +961,7 @@ public:
options |= PLUGIN_OPTION_SEND_PITCHBEND;
options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES;
options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;
}

return options;
@@ -4052,6 +4053,8 @@ public:

uint8_t status = uint8_t(MIDI_GET_STATUS_FROM_DATA(midiData));

if ((status == MIDI_STATUS_NOTE_OFF || status == MIDI_STATUS_NOTE_ON) && (pData->options & PLUGIN_OPTION_SKIP_SENDING_NOTES))
continue;
if (status == MIDI_STATUS_CHANNEL_PRESSURE && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0)
continue;
if (status == MIDI_STATUS_CONTROL_CHANGE && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0)
@@ -6393,6 +6396,8 @@ public:
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_PROGRAM_CHANGES))
pData->options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SKIP_SENDING_NOTES))
pData->options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;
}

if (fExt.programs != nullptr && (pData->options & PLUGIN_OPTION_SEND_PROGRAM_CHANGES) == 0)


+ 9
- 0
source/backend/plugin/CarlaPluginNative.cpp View File

@@ -445,6 +445,9 @@ public:
if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_ALL_SOUND_OFF)
options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;

if (fDescriptor->midiIns > 0)
options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;

if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_PROGRAM_CHANGES)
options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES;
else if (hasMidiProgs)
@@ -2192,6 +2195,8 @@ public:

uint8_t status = uint8_t(MIDI_GET_STATUS_FROM_DATA(midiEvent.data));

if ((status == MIDI_STATUS_NOTE_OFF || status == MIDI_STATUS_NOTE_ON) && (pData->options & PLUGIN_OPTION_SKIP_SENDING_NOTES))
continue;
if (status == MIDI_STATUS_CHANNEL_PRESSURE && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0)
continue;
if (status == MIDI_STATUS_CONTROL_CHANGE && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0)
@@ -3016,6 +3021,10 @@ public:
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_ALL_SOUND_OFF))
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;

if (fDescriptor->midiIns > 0)
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SKIP_SENDING_NOTES))
pData->options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;

if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_PROGRAM_CHANGES)
{
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_PROGRAM_CHANGES))


+ 5
- 0
source/backend/plugin/CarlaPluginSFZero.cpp View File

@@ -126,6 +126,7 @@ public:
options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH;
options |= PLUGIN_OPTION_SEND_PITCHBEND;
options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;

return options;
}
@@ -506,6 +507,8 @@ public:

uint8_t status = uint8_t(MIDI_GET_STATUS_FROM_DATA(midiData));

if ((status == MIDI_STATUS_NOTE_OFF || status == MIDI_STATUS_NOTE_ON) && (pData->options & PLUGIN_OPTION_SKIP_SENDING_NOTES))
continue;
if (status == MIDI_STATUS_CHANNEL_PRESSURE && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0)
continue;
if (status == MIDI_STATUS_CONTROL_CHANGE && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0)
@@ -753,6 +756,8 @@ public:
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_ALL_SOUND_OFF))
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SKIP_SENDING_NOTES))
pData->options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;

return true;
}


+ 5
- 0
source/backend/plugin/CarlaPluginVST2.cpp View File

@@ -264,6 +264,7 @@ public:
options |= PLUGIN_OPTION_SEND_PITCHBEND;
options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES;
options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;
}

return options;
@@ -1553,6 +1554,8 @@ public:

uint8_t status = uint8_t(MIDI_GET_STATUS_FROM_DATA(midiEvent.data));

if ((status == MIDI_STATUS_NOTE_OFF || status == MIDI_STATUS_NOTE_ON) && (pData->options & PLUGIN_OPTION_SKIP_SENDING_NOTES))
continue;
if (status == MIDI_STATUS_CHANNEL_PRESSURE && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0)
continue;
if (status == MIDI_STATUS_CONTROL_CHANGE && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0)
@@ -2641,6 +2644,8 @@ public:
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_PROGRAM_CHANGES))
pData->options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES;
if (isPluginOptionEnabled(options, PLUGIN_OPTION_SKIP_SENDING_NOTES))
pData->options |= PLUGIN_OPTION_SKIP_SENDING_NOTES;
}

if (fEffect->numPrograms > 1 && (pData->options & PLUGIN_OPTION_SEND_PROGRAM_CHANGES) == 0)


+ 5
- 0
source/frontend/carla_backend.py View File

@@ -273,6 +273,11 @@ PLUGIN_OPTION_SEND_ALL_SOUND_OFF = 0x100
# @note: This option conflicts with PLUGIN_OPTION_MAP_PROGRAM_CHANGES and cannot be used at the same time.
PLUGIN_OPTION_SEND_PROGRAM_CHANGES = 0x200

# SSkip sending MIDI note events.
# This if off-by-default as a way to keep backwards compatibility.
# We always want notes enabled by default, not the contrary.
PLUGIN_OPTION_SKIP_SENDING_NOTES = 0x400

# Special flag to indicate that plugin options are not yet set.
# This flag exists because 0x0 as an option value is a valid one, so we need something else to indicate "null-ness".
PLUGIN_OPTIONS_NULL = 0x10000


+ 11
- 0
source/frontend/carla_widgets.py View File

@@ -60,6 +60,7 @@ from carla_backend import (
PLUGIN_OPTION_SEND_PITCHBEND,
PLUGIN_OPTION_SEND_ALL_SOUND_OFF,
PLUGIN_OPTION_SEND_PROGRAM_CHANGES,
PLUGIN_OPTION_SKIP_SENDING_NOTES,
PARAMETER_DRYWET,
PARAMETER_VOLUME,
PARAMETER_BALANCE_LEFT,
@@ -748,6 +749,7 @@ class PluginEdit(QDialog):
self.ui.ch_force_stereo.clicked.connect(self.slot_optionChanged)
self.ui.ch_map_program_changes.clicked.connect(self.slot_optionChanged)
self.ui.ch_use_chunks.clicked.connect(self.slot_optionChanged)
self.ui.ch_send_notes.clicked.connect(self.slot_optionChanged)
self.ui.ch_send_program_changes.clicked.connect(self.slot_optionChanged)
self.ui.ch_send_control_changes.clicked.connect(self.slot_optionChanged)
self.ui.ch_send_channel_pressure.clicked.connect(self.slot_optionChanged)
@@ -974,6 +976,9 @@ class PluginEdit(QDialog):
self.ui.ch_force_stereo.setChecked(optsEnabled & PLUGIN_OPTION_FORCE_STEREO)
self.ui.ch_map_program_changes.setEnabled(optsAvailable & PLUGIN_OPTION_MAP_PROGRAM_CHANGES)
self.ui.ch_map_program_changes.setChecked(optsEnabled & PLUGIN_OPTION_MAP_PROGRAM_CHANGES)
self.ui.ch_send_notes.setEnabled(optsAvailable & PLUGIN_OPTION_SKIP_SENDING_NOTES)
self.ui.ch_send_notes.setChecked((self.ui.ch_send_notes.isEnabled() and
(optsEnabled & PLUGIN_OPTION_SKIP_SENDING_NOTES) == 0x0))
self.ui.ch_send_control_changes.setEnabled(optsAvailable & PLUGIN_OPTION_SEND_CONTROL_CHANGES)
self.ui.ch_send_control_changes.setChecked(optsEnabled & PLUGIN_OPTION_SEND_CONTROL_CHANGES)
self.ui.ch_send_channel_pressure.setEnabled(optsAvailable & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE)
@@ -1251,6 +1256,9 @@ class PluginEdit(QDialog):
widget = self.ui.ch_force_stereo
elif option == PLUGIN_OPTION_MAP_PROGRAM_CHANGES:
widget = self.ui.ch_map_program_changes
elif option == PLUGIN_OPTION_SKIP_SENDING_NOTES:
widget = self.ui.ch_send_notes
yesNo = not yesNo
elif option == PLUGIN_OPTION_SEND_PROGRAM_CHANGES:
widget = self.ui.ch_send_program_changes
elif option == PLUGIN_OPTION_SEND_CONTROL_CHANGES:
@@ -1439,6 +1447,9 @@ class PluginEdit(QDialog):
option = PLUGIN_OPTION_FORCE_STEREO
elif sender == self.ui.ch_map_program_changes:
option = PLUGIN_OPTION_MAP_PROGRAM_CHANGES
elif sender == self.ui.ch_send_notes:
option = PLUGIN_OPTION_SKIP_SENDING_NOTES
clicked = not clicked
elif sender == self.ui.ch_send_program_changes:
option = PLUGIN_OPTION_SEND_PROGRAM_CHANGES
elif sender == self.ui.ch_send_control_changes:


Loading…
Cancel
Save