mirror of
https://github.com/yokemura/Magical8bitPlug2.git
synced 2025-06-03 00:58:05 -04:00
Fixed: Sound never stops when MIDI channels of note-on and note-off are different
This commit is contained in:
parent
7efbf2a409
commit
c57469edaf
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user