/[svn]/linuxsampler/trunk/src/drivers/midi/MidiInputPort.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/drivers/midi/MidiInputPort.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2558 by schoenebeck, Fri Jan 10 12:20:05 2014 UTC revision 2559 by schoenebeck, Sun May 18 17:38:25 2014 UTC
# Line 246  namespace LinuxSampler { Line 246  namespace LinuxSampler {
246          MidiChannelMapReader.Unlock();          MidiChannelMapReader.Unlock();
247      }      }
248    
249        void MidiInputPort::DispatchChannelPressure(uint8_t Value, uint MidiChannel) {
250            if (Value > 127 || MidiChannel > 16) return;
251            const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock();
252            // dispatch event for engines listening to the same MIDI channel
253            {
254                std::set<EngineChannel*>::iterator engineiter = midiChannelMap[MidiChannel].begin();
255                std::set<EngineChannel*>::iterator end        = midiChannelMap[MidiChannel].end();
256                for (; engineiter != end; engineiter++) (*engineiter)->SendChannelPressure(Value, MidiChannel);
257            }
258            // dispatch event for engines listening to ALL MIDI channels
259            {
260                std::set<EngineChannel*>::iterator engineiter = midiChannelMap[midi_chan_all].begin();
261                std::set<EngineChannel*>::iterator end        = midiChannelMap[midi_chan_all].end();
262                for (; engineiter != end; engineiter++) (*engineiter)->SendChannelPressure(Value, MidiChannel);
263            }
264            MidiChannelMapReader.Unlock();
265        }
266    
267        void MidiInputPort::DispatchChannelPressure(uint8_t Value, uint MidiChannel, int32_t FragmentPos) {
268            if (Value > 127 || MidiChannel > 16) return;
269            const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock();
270            // dispatch event for engines listening to the same MIDI channel
271            {
272                std::set<EngineChannel*>::iterator engineiter = midiChannelMap[MidiChannel].begin();
273                std::set<EngineChannel*>::iterator end        = midiChannelMap[MidiChannel].end();
274                for (; engineiter != end; engineiter++) (*engineiter)->SendChannelPressure(Value, MidiChannel, FragmentPos);
275            }
276            // dispatch event for engines listening to ALL MIDI channels
277            {
278                std::set<EngineChannel*>::iterator engineiter = midiChannelMap[midi_chan_all].begin();
279                std::set<EngineChannel*>::iterator end        = midiChannelMap[midi_chan_all].end();
280                for (; engineiter != end; engineiter++) (*engineiter)->SendChannelPressure(Value, MidiChannel, FragmentPos);
281            }
282            MidiChannelMapReader.Unlock();
283        }
284    
285        void MidiInputPort::DispatchPolyphonicKeyPressure(uint8_t Key, uint8_t Value, uint MidiChannel) {
286            if (Key > 127 || Value > 127 || MidiChannel > 16) return;
287            const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock();
288            // dispatch event for engines listening to the same MIDI channel
289            {
290                std::set<EngineChannel*>::iterator engineiter = midiChannelMap[MidiChannel].begin();
291                std::set<EngineChannel*>::iterator end        = midiChannelMap[MidiChannel].end();
292                for (; engineiter != end; engineiter++) (*engineiter)->SendPolyphonicKeyPressure(Key, Value, MidiChannel);
293            }
294            // dispatch event for engines listening to ALL MIDI channels
295            {
296                std::set<EngineChannel*>::iterator engineiter = midiChannelMap[midi_chan_all].begin();
297                std::set<EngineChannel*>::iterator end        = midiChannelMap[midi_chan_all].end();
298                for (; engineiter != end; engineiter++) (*engineiter)->SendPolyphonicKeyPressure(Key, Value, MidiChannel);
299            }
300            MidiChannelMapReader.Unlock();
301        }
302    
303        void MidiInputPort::DispatchPolyphonicKeyPressure(uint8_t Key, uint8_t Value, uint MidiChannel, int32_t FragmentPos) {
304            if (Key > 127 || Value > 127 || MidiChannel > 16) return;
305            const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock();
306            // dispatch event for engines listening to the same MIDI channel
307            {
308                std::set<EngineChannel*>::iterator engineiter = midiChannelMap[MidiChannel].begin();
309                std::set<EngineChannel*>::iterator end        = midiChannelMap[MidiChannel].end();
310                for (; engineiter != end; engineiter++) (*engineiter)->SendPolyphonicKeyPressure(Key, Value, MidiChannel, FragmentPos);
311            }
312            // dispatch event for engines listening to ALL MIDI channels
313            {
314                std::set<EngineChannel*>::iterator engineiter = midiChannelMap[midi_chan_all].begin();
315                std::set<EngineChannel*>::iterator end        = midiChannelMap[midi_chan_all].end();
316                for (; engineiter != end; engineiter++) (*engineiter)->SendPolyphonicKeyPressure(Key, Value, MidiChannel, FragmentPos);
317            }
318            MidiChannelMapReader.Unlock();
319        }
320    
321      void MidiInputPort::DispatchControlChange(uint8_t Controller, uint8_t Value, uint MidiChannel) {      void MidiInputPort::DispatchControlChange(uint8_t Controller, uint8_t Value, uint MidiChannel) {
322          if (Controller > 128 || Value > 127 || MidiChannel > 16) return;          if (Controller > 128 || Value > 127 || MidiChannel > 16) return;
323          const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock();          const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock();
# Line 430  namespace LinuxSampler { Line 502  namespace LinuxSampler {
502                  DispatchNoteOff(pData[1], pData[2], channel);                  DispatchNoteOff(pData[1], pData[2], channel);
503              }              }
504              break;              break;
505            case 0xA0:
506                DispatchPolyphonicKeyPressure(pData[1], pData[2], channel);
507                break;
508          case 0xb0:          case 0xb0:
509              if (pData[1] == 0) {              if (pData[1] == 0) {
510                  DispatchBankSelectMsb(pData[2], channel);                  DispatchBankSelectMsb(pData[2], channel);
# Line 442  namespace LinuxSampler { Line 517  namespace LinuxSampler {
517              DispatchProgramChange(pData[1], channel);              DispatchProgramChange(pData[1], channel);
518              break;              break;
519          case 0xd0:          case 0xd0:
520              DispatchControlChange(128, pData[1], channel);              DispatchChannelPressure(pData[1], channel);
521              break;              break;
522          case 0xe0:          case 0xe0:
523              DispatchPitchbend((pData[1] | pData[2] << 7) - 8192, channel);              DispatchPitchbend((pData[1] | pData[2] << 7) - 8192, channel);
# Line 465  namespace LinuxSampler { Line 540  namespace LinuxSampler {
540                  DispatchNoteOff(pData[1], pData[2], channel, FragmentPos);                  DispatchNoteOff(pData[1], pData[2], channel, FragmentPos);
541              }              }
542              break;              break;
543            case 0xA0:
544                DispatchPolyphonicKeyPressure(pData[1], pData[2], channel, FragmentPos);
545                break;
546          case 0xb0:          case 0xb0:
547              if (pData[1] == 0) {              if (pData[1] == 0) {
548                  DispatchBankSelectMsb(pData[2], channel);                  DispatchBankSelectMsb(pData[2], channel);
# Line 477  namespace LinuxSampler { Line 555  namespace LinuxSampler {
555              DispatchProgramChange(pData[1], channel);              DispatchProgramChange(pData[1], channel);
556              break;              break;
557          case 0xd0:          case 0xd0:
558              DispatchControlChange(128, pData[1], channel, FragmentPos);              DispatchChannelPressure(pData[1], channel, FragmentPos);
559              break;              break;
560          case 0xe0:          case 0xe0:
561              DispatchPitchbend((pData[1] | pData[2] << 7) - 8192, channel, FragmentPos);              DispatchPitchbend((pData[1] | pData[2] << 7) - 8192, channel, FragmentPos);

Legend:
Removed from v.2558  
changed lines
  Added in v.2559

  ViewVC Help
Powered by ViewVC