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:
|
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;
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user