From c57469edaf478ad8d046fdc02cc656ee590e36db Mon Sep 17 00:00:00 2001 From: Takeshi Yokemura Date: Sat, 7 Aug 2021 17:21:22 +0900 Subject: [PATCH] Fixed: Sound never stops when MIDI channels of note-on and note-off are different --- Source/CustomSynth.cpp | 8 ++++---- Source/TonalVoice.cpp | 6 ++++-- Source/TonalVoice.h | 5 +++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Source/CustomSynth.cpp b/Source/CustomSynth.cpp index d864b57..a39c966 100644 --- a/Source/CustomSynth.cpp +++ b/Source/CustomSynth.cpp @@ -61,13 +61,13 @@ void CustomSynth::noteOn(int midiChannel, int midiNoteNumber, float velocity) { case kLegato: // start note and set legato mode Synthesiser::noteOn(midiChannel, midiNoteNumber, velocity); - voice->setLegatoMode(*(processor.settingRefs.portamentoTime)); + voice->setLegatoMode(*(processor.settingRefs.portamentoTime), midiChannel); break; case kArpeggioUp: case kArpeggioDown: // start note and calc arpeggio interval Synthesiser::noteOn(midiChannel, midiNoteNumber, velocity); - voice->setArpeggioMode(calcArpeggioInterval()); + voice->setArpeggioMode(calcArpeggioInterval(), midiChannel); break; default: // no-op @@ -123,7 +123,7 @@ void CustomSynth::noteOff(int midiChannel, int midiNoteNumber, float velocity, b { int numBuffer = voice->removeLegatoNote(midiNoteNumber); if (numBuffer < 1) { - Synthesiser::noteOff(midiChannel, voice->getCurrentlyPlayingNote(), velocity, allowTailOff); + Synthesiser::noteOff(voice->primaryMidiChannel, voice->getCurrentlyPlayingNote(), velocity, allowTailOff); } } break; @@ -132,7 +132,7 @@ void CustomSynth::noteOff(int midiChannel, int midiNoteNumber, float velocity, b { int numBuffer = voice->removeArpeggioNote(midiNoteNumber); if (numBuffer < 1) { - Synthesiser::noteOff(midiChannel, voice->getCurrentlyPlayingNote(), velocity, allowTailOff); + Synthesiser::noteOff(voice->primaryMidiChannel, voice->getCurrentlyPlayingNote(), velocity, allowTailOff); } } break; diff --git a/Source/TonalVoice.cpp b/Source/TonalVoice.cpp index 2939b09..9c49fbb 100644 --- a/Source/TonalVoice.cpp +++ b/Source/TonalVoice.cpp @@ -98,8 +98,9 @@ void TonalVoice::controllerMoved (int type, int amount) } -void TonalVoice::setLegatoMode(double time) { +void TonalVoice::setLegatoMode(double time, int midiCh) { portamentoTime = time; + primaryMidiChannel = midiCh; } // The interface says "add" but the implementation is just using the latest value. @@ -128,13 +129,14 @@ int TonalVoice::removeLegatoNote(int midiNoteNumber) { } -void TonalVoice::setArpeggioMode(double interval) +void TonalVoice::setArpeggioMode(double interval, int midiCh) { arpeggioFrameLength = interval; arpeggioFrameTimer = 0; currentArpeggioFrame = 0; currentNumNoteBuffer = 1; noteBuffer[0] = noteNumber; + primaryMidiChannel = midiCh; } void TonalVoice::addArpeggioNoteAscending(int midiNoteNumber) diff --git a/Source/TonalVoice.h b/Source/TonalVoice.h index 80d6cba..d273f81 100644 --- a/Source/TonalVoice.h +++ b/Source/TonalVoice.h @@ -38,6 +38,7 @@ struct TonalVoice : public BaseVoice // The base for Pulse and Triangle // Legato/Arpeggio int noteBuffer[10]; int currentNumNoteBuffer = 0; + int primaryMidiChannel = 1; // Legato double portamentoTime = 0; @@ -54,11 +55,11 @@ struct TonalVoice : public BaseVoice // The base for Pulse and Triangle void pitchWheelMoved (int) override; void controllerMoved (int, int) override; - void setLegatoMode(double time); + void setLegatoMode(double time, int midiCh); void addLegatoNote (int midiNoteNumber, float velocity); int removeLegatoNote(int midiNoteNumber); - void setArpeggioMode(double interval); + void setArpeggioMode(double interval, int midiCh); void addArpeggioNoteAscending(int midiNoteNumber); void addArpeggioNoteDescending(int midiNoteNumber); int removeArpeggioNote(int midiNoteNumber);