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:
// 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;

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;
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)

View File

@ -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);