Fixed: Sound never stops when MIDI channels of note-on and note-off are different

This commit is contained in:
Takeshi Yokemura 2021-08-07 17:21:22 +09:00
parent 7efbf2a409
commit c57469edaf
3 changed files with 11 additions and 8 deletions

View File

@ -61,13 +61,13 @@ void CustomSynth::noteOn(int midiChannel, int midiNoteNumber, float velocity) {
case kLegato: case kLegato:
// start note and set legato mode // start note and set legato mode
Synthesiser::noteOn(midiChannel, midiNoteNumber, velocity); Synthesiser::noteOn(midiChannel, midiNoteNumber, velocity);
voice->setLegatoMode(*(processor.settingRefs.portamentoTime)); voice->setLegatoMode(*(processor.settingRefs.portamentoTime), midiChannel);
break; break;
case kArpeggioUp: case kArpeggioUp:
case kArpeggioDown: case kArpeggioDown:
// start note and calc arpeggio interval // start note and calc arpeggio interval
Synthesiser::noteOn(midiChannel, midiNoteNumber, velocity); Synthesiser::noteOn(midiChannel, midiNoteNumber, velocity);
voice->setArpeggioMode(calcArpeggioInterval()); voice->setArpeggioMode(calcArpeggioInterval(), midiChannel);
break; break;
default: default:
// no-op // no-op
@ -123,7 +123,7 @@ void CustomSynth::noteOff(int midiChannel, int midiNoteNumber, float velocity, b
{ {
int numBuffer = voice->removeLegatoNote(midiNoteNumber); int numBuffer = voice->removeLegatoNote(midiNoteNumber);
if (numBuffer < 1) { if (numBuffer < 1) {
Synthesiser::noteOff(midiChannel, voice->getCurrentlyPlayingNote(), velocity, allowTailOff); Synthesiser::noteOff(voice->primaryMidiChannel, voice->getCurrentlyPlayingNote(), velocity, allowTailOff);
} }
} }
break; break;
@ -132,7 +132,7 @@ void CustomSynth::noteOff(int midiChannel, int midiNoteNumber, float velocity, b
{ {
int numBuffer = voice->removeArpeggioNote(midiNoteNumber); int numBuffer = voice->removeArpeggioNote(midiNoteNumber);
if (numBuffer < 1) { if (numBuffer < 1) {
Synthesiser::noteOff(midiChannel, voice->getCurrentlyPlayingNote(), velocity, allowTailOff); Synthesiser::noteOff(voice->primaryMidiChannel, voice->getCurrentlyPlayingNote(), velocity, allowTailOff);
} }
} }
break; break;

View File

@ -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; portamentoTime = time;
primaryMidiChannel = midiCh;
} }
// The interface says "add" but the implementation is just using the latest value. // 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; arpeggioFrameLength = interval;
arpeggioFrameTimer = 0; arpeggioFrameTimer = 0;
currentArpeggioFrame = 0; currentArpeggioFrame = 0;
currentNumNoteBuffer = 1; currentNumNoteBuffer = 1;
noteBuffer[0] = noteNumber; noteBuffer[0] = noteNumber;
primaryMidiChannel = midiCh;
} }
void TonalVoice::addArpeggioNoteAscending(int midiNoteNumber) void TonalVoice::addArpeggioNoteAscending(int midiNoteNumber)

View File

@ -38,6 +38,7 @@ struct TonalVoice : public BaseVoice // The base for Pulse and Triangle
// Legato/Arpeggio // Legato/Arpeggio
int noteBuffer[10]; int noteBuffer[10];
int currentNumNoteBuffer = 0; int currentNumNoteBuffer = 0;
int primaryMidiChannel = 1;
// Legato // Legato
double portamentoTime = 0; double portamentoTime = 0;
@ -54,11 +55,11 @@ struct TonalVoice : public BaseVoice // The base for Pulse and Triangle
void pitchWheelMoved (int) override; void pitchWheelMoved (int) override;
void controllerMoved (int, int) override; void controllerMoved (int, int) override;
void setLegatoMode(double time); void setLegatoMode(double time, int midiCh);
void addLegatoNote (int midiNoteNumber, float velocity); void addLegatoNote (int midiNoteNumber, float velocity);
int removeLegatoNote(int midiNoteNumber); int removeLegatoNote(int midiNoteNumber);
void setArpeggioMode(double interval); void setArpeggioMode(double interval, int midiCh);
void addArpeggioNoteAscending(int midiNoteNumber); void addArpeggioNoteAscending(int midiNoteNumber);
void addArpeggioNoteDescending(int midiNoteNumber); void addArpeggioNoteDescending(int midiNoteNumber);
int removeArpeggioNote(int midiNoteNumber); int removeArpeggioNote(int midiNoteNumber);