Skip to content

Commit a91e90b

Browse files
committed
Add a separate MIDI channel for swell.
1 parent 6edfd3d commit a91e90b

File tree

5 files changed

+53
-8
lines changed

5 files changed

+53
-8
lines changed

Source/PluginEditor.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ AeolusAudioProcessorEditor::AeolusAudioProcessorEditor (AeolusAudioProcessor& p)
5353
, _cancelButton{"Cancel"}
5454
, _midiControlChannelLabel{{}, {"Control channel"}}
5555
, _midiControlChannelComboBox{}
56+
, _midiSwellChannelLabel{{}, {"Swell channel"}}
57+
, _midiSwellChannelComboBox{}
5658
{
5759
setLookAndFeel(&ui::CustomLookAndFeel::getInstance());
5860

@@ -181,19 +183,31 @@ AeolusAudioProcessorEditor::AeolusAudioProcessorEditor (AeolusAudioProcessor& p)
181183
addAndMakeVisible(_midiKeyboard);
182184

183185
_midiControlChannelLabel.setColour(Label::textColourId, Colour(0x99, 0x99, 0x99));
186+
_midiSwellChannelLabel.setColour(Label::textColourId, Colour(0x99, 0x99, 0x99));
187+
184188
addAndMakeVisible(_midiControlChannelLabel);
189+
addAndMakeVisible(_midiSwellChannelLabel);
185190

186191
_midiControlChannelComboBox.addItem("All", 1);
192+
_midiSwellChannelComboBox.addItem("All", 1);
193+
187194
for (int i = 1; i <= 16; ++i) {
188195
_midiControlChannelComboBox.addItem(String(i), i + 1);
196+
_midiSwellChannelComboBox.addItem(String(i), i + 1);
189197
}
190198

191199
_midiControlChannelComboBox.setSelectedId(1 + _audioProcessor.getEngine().getMIDIControlChannel(), juce::dontSendNotification);
192200
_midiControlChannelComboBox.onChange = [this]() {
193201
_audioProcessor.getEngine().setMIDIControlChannel(_midiControlChannelComboBox.getSelectedId() - 1);
194202
};
195203

204+
_midiSwellChannelComboBox.setSelectedId(1 + _audioProcessor.getEngine().getMIDISwellChannel(), juce::dontSendNotification);
205+
_midiSwellChannelComboBox.onChange = [this]() {
206+
_audioProcessor.getEngine().setMIDISwellChannel(_midiSwellChannelComboBox.getSelectedId() - 1);
207+
};
208+
196209
addAndMakeVisible(_midiControlChannelComboBox);
210+
addAndMakeVisible(_midiSwellChannelComboBox);
197211

198212
// Overlay and sequencer must go on the very top
199213

@@ -287,9 +301,13 @@ void AeolusAudioProcessorEditor::resized()
287301
_cancelButton.setColour(TextButton::buttonColourId, Colour(0x33, 0x33, 0x33));
288302
_cancelButton.setBounds((_midiKeyboard.getX() - 120)/2, getHeight() - 60, 60, 35);
289303

290-
int x = _midiKeyboard.getRight() + (getWidth() - _midiKeyboard.getRight() - 100) / 2;
304+
int x = _midiKeyboard.getRight() + (getWidth() - _midiKeyboard.getRight() - 200) / 2;
305+
291306
_midiControlChannelLabel.setBounds(x, _midiKeyboard.getY(), 100, 20);
292-
_midiControlChannelComboBox.setBounds(x, _midiControlChannelLabel.getBottom() + 5, 100, 20);
307+
_midiControlChannelComboBox.setBounds(_midiControlChannelLabel.getRight() + 5, _midiControlChannelLabel.getY(), 100, 20);
308+
309+
_midiSwellChannelLabel.setBounds(x, _midiControlChannelLabel.getBottom() + 5, 100, 20);
310+
_midiSwellChannelComboBox.setBounds(_midiSwellChannelLabel.getRight() + 5, _midiSwellChannelLabel.getY(), 100, 20);
293311
}
294312

295313
void AeolusAudioProcessorEditor::timerCallback()

Source/PluginEditor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,5 +102,9 @@ class AeolusAudioProcessorEditor : public juce::AudioProcessorEditor,
102102
juce::Label _midiControlChannelLabel;
103103
juce::ComboBox _midiControlChannelComboBox;
104104

105+
/// MIDI swell channel selection
106+
juce::Label _midiSwellChannelLabel;
107+
juce::ComboBox _midiSwellChannelComboBox;
108+
105109
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AeolusAudioProcessorEditor)
106110
};

Source/aeolus/division.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -400,21 +400,30 @@ void Division::allNotesOff()
400400

401401
void Division::handleControlMessage(const juce::MidiMessage& msg)
402402
{
403-
if (!isForMIDIChannel(msg.getChannel()))
403+
const int cc{ msg.getControllerNumber() };
404+
405+
if (cc != aeolus::CC_MODULATION && cc != aeolus::CC_VOLUME)
404406
return;
405407

406-
int cc = msg.getControllerNumber();
408+
const int swellCh{ _engine.getMIDISwellChannel() };
407409
const float value{ float(msg.getControllerValue()) / 127.0f };
408410

411+
if (swellCh == 0 || swellCh == msg.getChannel() || msg.getChannel() == 0) {
412+
if (_hasSwell && cc == aeolus::CC_VOLUME) {
413+
*_paramGain = value;
414+
}
415+
416+
}
417+
418+
// Hange manual channel specific controls
419+
if (!isForMIDIChannel(msg.getChannel()))
420+
return;
421+
409422
switch (cc) {
410423
case aeolus::CC_MODULATION:
411424
if (hasTremulant())
412425
setTremulantEnabled(value > 0.5f);
413426
break;
414-
case aeolus::CC_VOLUME:
415-
if (_hasSwell)
416-
*_paramGain = value;
417-
break;
418427
default:
419428
break;
420429
}

Source/aeolus/engine.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ Engine::Engine()
349349
, _midiKeyboardState{}
350350
, _volumeLevel{}
351351
, _midiControlChannel{0}
352+
, _midiSwellChannel{0}
352353
{
353354
populateDivisions();
354355

@@ -635,6 +636,7 @@ var Engine::getPersistentState() const
635636

636637
// Save control channel
637638
obj->setProperty("midi_ctrl_channel", getMIDIControlChannel());
639+
obj->setProperty("midi_swell_channel", getMIDISwellChannel());
638640

639641
// Save the IR.
640642
int irNum = _selectedIR;
@@ -658,6 +660,7 @@ void Engine::setPersistentState(const var& state)
658660
if (const auto* obj = state.getDynamicObject()) {
659661
// Restore control channel
660662
setMIDIControlChannel(obj->getProperty("midi_ctrl_channel"));
663+
setMIDISwellChannel(obj->getProperty("midi_swell_channel"));
661664

662665
// Restore the IR
663666
int irNum = obj->getProperty("ir");

Source/aeolus/engine.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,16 @@ class Engine
228228
*/
229229
void setMIDIControlChannel(int c) noexcept { _midiControlChannel = c; }
230230

231+
/**
232+
* Returns currently set MIDI control channel.
233+
*/
234+
int getMIDISwellChannel() const noexcept { return _midiSwellChannel; }
235+
236+
/**
237+
* Assign MIDI channel to be used to control the organ stops and sequencer.
238+
*/
239+
void setMIDISwellChannel(int c) noexcept { _midiSwellChannel = c; }
240+
231241
/**
232242
* Generate audio.
233243
*/
@@ -333,6 +343,7 @@ class Engine
333343
Level _volumeLevel;
334344

335345
std::atomic<int> _midiControlChannel;
346+
std::atomic<int> _midiSwellChannel;
336347

337348
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Engine)
338349
};

0 commit comments

Comments
 (0)