--- linuxsampler/trunk/src/engines/EngineBase.h 2017/04/21 13:33:03 3118 +++ linuxsampler/trunk/src/engines/EngineBase.h 2017/05/19 14:23:12 3188 @@ -809,6 +809,7 @@ case Event::type_release_note: case Event::type_play_note: case Event::type_stop_note: + case Event::type_kill_note: case Event::type_note_synth_param: break; // noop } @@ -881,6 +882,10 @@ dmsg(5,("Engine: Stop Note received\n")); ProcessNoteOff((EngineChannel*)itEvent->pEngineChannel, itEvent); break; + case Event::type_kill_note: + dmsg(5,("Engine: Kill Note received\n")); + ProcessKillNote((EngineChannel*)itEvent->pEngineChannel, itEvent); + break; case Event::type_control_change: dmsg(5,("Engine: MIDI CC received\n")); ProcessControlChange((EngineChannel*)itEvent->pEngineChannel, itEvent); @@ -1927,9 +1932,27 @@ } /** + * Called on "kill note" events, which currently only happens on + * built-in real-time instrument script function fade_out(). This + * method only fulfills one task: moving the even to the Note's own + * event list so that its voices can process the kill event sample + * accurately. + */ + void ProcessKillNote(EngineChannel* pEngineChannel, RTList::Iterator& itEvent) { + EngineChannelBase* pChannel = static_cast*>(pEngineChannel); + + NoteBase* pNote = pChannel->pEngine->NoteByID( itEvent->Param.Note.ID ); + if (!pNote || pNote->hostKey < 0 || pNote->hostKey >= 128) return; + + // move note kill event to its MIDI key + MidiKey* pKey = &pChannel->pMIDIKeyInfo[pNote->hostKey]; + itEvent.moveToEndOf(pKey->pEvents); + } + + /** * Called on note synthesis parameter change events. These are * internal events caused by calling built-in real-time instrument - * script functions like change_vol(), change_pitch(), etc. + * script functions like change_vol(), change_tune(), etc. * * This method performs two tasks: * @@ -1960,6 +1983,9 @@ pNote->Override.Volume = itEvent->Param.NoteSynthParam.Delta; itEvent->Param.NoteSynthParam.AbsValue = pNote->Override.Volume; break; + case Event::synth_param_volume_time: + pNote->Override.VolumeTime = itEvent->Param.NoteSynthParam.AbsValue = itEvent->Param.NoteSynthParam.Delta; + break; case Event::synth_param_pitch: if (relative) pNote->Override.Pitch *= itEvent->Param.NoteSynthParam.Delta; @@ -1967,6 +1993,9 @@ pNote->Override.Pitch = itEvent->Param.NoteSynthParam.Delta; itEvent->Param.NoteSynthParam.AbsValue = pNote->Override.Pitch; break; + case Event::synth_param_pitch_time: + pNote->Override.PitchTime = itEvent->Param.NoteSynthParam.AbsValue = itEvent->Param.NoteSynthParam.Delta; + break; case Event::synth_param_pan: if (relative) { pNote->Override.Pan = RTMath::RelativeSummedAvg(pNote->Override.Pan, itEvent->Param.NoteSynthParam.Delta, ++pNote->Override.PanSources);