--- linuxsampler/trunk/src/drivers/midi/MidiInputPort.cpp 2006/06/27 22:57:37 880 +++ linuxsampler/trunk/src/drivers/midi/MidiInputPort.cpp 2006/07/23 16:44:08 906 @@ -107,6 +107,23 @@ MidiChannelMapReader.Unlock(); } + void MidiInputPort::DispatchNoteOn(uint8_t Key, uint8_t Velocity, uint MidiChannel, int32_t FragmentPos) { + const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock(); + // dispatch event for engines listening to the same MIDI channel + { + std::set::iterator engineiter = midiChannelMap[MidiChannel].begin(); + std::set::iterator end = midiChannelMap[MidiChannel].end(); + for (; engineiter != end; engineiter++) (*engineiter)->SendNoteOn(Key, Velocity, FragmentPos); + } + // dispatch event for engines listening to ALL MIDI channels + { + std::set::iterator engineiter = midiChannelMap[midi_chan_all].begin(); + std::set::iterator end = midiChannelMap[midi_chan_all].end(); + for (; engineiter != end; engineiter++) (*engineiter)->SendNoteOn(Key, Velocity, FragmentPos); + } + MidiChannelMapReader.Unlock(); + } + void MidiInputPort::DispatchNoteOff(uint8_t Key, uint8_t Velocity, uint MidiChannel) { const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock(); // dispatch event for engines listening to the same MIDI channel @@ -124,6 +141,23 @@ MidiChannelMapReader.Unlock(); } + void MidiInputPort::DispatchNoteOff(uint8_t Key, uint8_t Velocity, uint MidiChannel, int32_t FragmentPos) { + const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock(); + // dispatch event for engines listening to the same MIDI channel + { + std::set::iterator engineiter = midiChannelMap[MidiChannel].begin(); + std::set::iterator end = midiChannelMap[MidiChannel].end(); + for (; engineiter != end; engineiter++) (*engineiter)->SendNoteOff(Key, Velocity, FragmentPos); + } + // dispatch event for engines listening to ALL MIDI channels + { + std::set::iterator engineiter = midiChannelMap[midi_chan_all].begin(); + std::set::iterator end = midiChannelMap[midi_chan_all].end(); + for (; engineiter != end; engineiter++) (*engineiter)->SendNoteOff(Key, Velocity, FragmentPos); + } + MidiChannelMapReader.Unlock(); + } + void MidiInputPort::DispatchPitchbend(int Pitch, uint MidiChannel) { const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock(); // dispatch event for engines listening to the same MIDI channel @@ -141,6 +175,23 @@ MidiChannelMapReader.Unlock(); } + void MidiInputPort::DispatchPitchbend(int Pitch, uint MidiChannel, int32_t FragmentPos) { + const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock(); + // dispatch event for engines listening to the same MIDI channel + { + std::set::iterator engineiter = midiChannelMap[MidiChannel].begin(); + std::set::iterator end = midiChannelMap[MidiChannel].end(); + for (; engineiter != end; engineiter++) (*engineiter)->SendPitchbend(Pitch, FragmentPos); + } + // dispatch event for engines listening to ALL MIDI channels + { + std::set::iterator engineiter = midiChannelMap[midi_chan_all].begin(); + std::set::iterator end = midiChannelMap[midi_chan_all].end(); + for (; engineiter != end; engineiter++) (*engineiter)->SendPitchbend(Pitch, FragmentPos); + } + MidiChannelMapReader.Unlock(); + } + void MidiInputPort::DispatchControlChange(uint8_t Controller, uint8_t Value, uint MidiChannel) { const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock(); // dispatch event for engines listening to the same MIDI channel @@ -157,6 +208,23 @@ } MidiChannelMapReader.Unlock(); } + + void MidiInputPort::DispatchControlChange(uint8_t Controller, uint8_t Value, uint MidiChannel, int32_t FragmentPos) { + const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock(); + // dispatch event for engines listening to the same MIDI channel + { + std::set::iterator engineiter = midiChannelMap[MidiChannel].begin(); + std::set::iterator end = midiChannelMap[MidiChannel].end(); + for (; engineiter != end; engineiter++) (*engineiter)->SendControlChange(Controller, Value, FragmentPos); + } + // dispatch event for engines listening to ALL MIDI channels + { + std::set::iterator engineiter = midiChannelMap[midi_chan_all].begin(); + std::set::iterator end = midiChannelMap[midi_chan_all].end(); + for (; engineiter != end; engineiter++) (*engineiter)->SendControlChange(Controller, Value, FragmentPos); + } + MidiChannelMapReader.Unlock(); + } void MidiInputPort::DispatchSysex(void* pData, uint Size) { const std::set allEngines = SysexListenersReader.Lock();