00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __LS_MIDIINPUTPORT_H__
00025 #define __LS_MIDIINPUTPORT_H__
00026
00027 #include "../../common/global.h"
00028 #include "../../common/Mutex.h"
00029 #include "../../common/Exception.h"
00030 #include "../DeviceParameter.h"
00031 #include "midi.h"
00032 #include "MidiInputDevice.h"
00033 #include "../../engines/EngineChannel.h"
00034 #include "../../common/SynchronizedConfig.h"
00035
00036 namespace LinuxSampler {
00037
00038
00039 class MidiInputDevice;
00040 class EngineChannel;
00041 class VirtualMidiDevice;
00042
00043 class MidiInputPort {
00044 public:
00045
00047
00048
00053 class ParameterName : public DeviceRuntimeParameterString {
00054 public:
00055 ParameterName(MidiInputPort* pPort);
00056 ParameterName(MidiInputPort* pPort, String val);
00057 virtual String Description();
00058 virtual bool Fix();
00059 virtual std::vector<String> PossibilitiesAsString();
00060 virtual void OnSetValue(String s) throw (Exception);
00061 protected:
00062 MidiInputPort* pPort;
00063 };
00064
00065
00066
00068
00069
00070
00083 void Connect(EngineChannel* pEngineChannel, midi_chan_t MidiChannel);
00084
00092 void Disconnect(EngineChannel* pEngineChannel);
00093
00097 MidiInputDevice* GetDevice();
00098
00103 uint GetPortNumber();
00104
00108 std::map<String,DeviceRuntimeParameter*> PortParameters();
00109
00113 static void AddSysexListener(Engine* engine);
00114
00122 static bool RemoveSysexListener(Engine* engine);
00123
00130 void Connect(VirtualMidiDevice* pDevice);
00131
00135 void Disconnect(VirtualMidiDevice* pDevice);
00136
00137
00139
00140
00141
00157 void DispatchNoteOn(uint8_t Key, uint8_t Velocity, uint MidiChannel);
00158
00175 void DispatchNoteOn(uint8_t Key, uint8_t Velocity, uint MidiChannel, int32_t FragmentPos);
00176
00192 void DispatchNoteOff(uint8_t Key, uint8_t Velocity, uint MidiChannel);
00193
00210 void DispatchNoteOff(uint8_t Key, uint8_t Velocity, uint MidiChannel, int32_t FragmentPos);
00211
00225 void DispatchPitchbend(int Pitch, uint MidiChannel);
00226
00241 void DispatchPitchbend(int Pitch, uint MidiChannel, int32_t FragmentPos);
00242
00258 void DispatchControlChange(uint8_t Controller, uint8_t Value, uint MidiChannel);
00259
00276 void DispatchControlChange(uint8_t Controller, uint8_t Value, uint MidiChannel, int32_t FragmentPos);
00277
00298 void DispatchProgramChange(uint8_t Program, uint MidiChannel);
00299
00300 void DispatchBankSelectMsb(uint8_t BankMsb, uint MidiChannel);
00301
00302 void DispatchBankSelectLsb(uint8_t BankLsb, uint MidiChannel);
00303
00312 void DispatchSysex(void* pData, uint Size);
00313
00320 void DispatchRaw(uint8_t* pData);
00321
00330 void DispatchRaw(uint8_t* pData, int32_t FragmentPos);
00331
00332 protected:
00333 MidiInputDevice* pDevice;
00334 int portNumber;
00335 std::map<String,DeviceRuntimeParameter*> Parameters;
00336 typedef std::set<EngineChannel*> MidiChannelMap_t[17];
00337 SynchronizedConfig<MidiChannelMap_t> MidiChannelMap;
00338 SynchronizedConfig<MidiChannelMap_t>::Reader MidiChannelMapReader;
00339 Mutex MidiChannelMapMutex;
00340 SynchronizedConfig<std::set<Engine*> >::Reader SysexListenersReader;
00341 SynchronizedConfig<std::vector<VirtualMidiDevice*> > virtualMidiDevices;
00342 SynchronizedConfig<std::vector<VirtualMidiDevice*> >::Reader virtualMidiDevicesReader;
00343 Mutex virtualMidiDevicesMutex;
00344
00348 MidiInputPort(MidiInputDevice* pDevice, int portNumber);
00349
00353 virtual ~MidiInputPort();
00354
00355 friend class MidiInputDevice;
00356
00357 private:
00358 static SynchronizedConfig<std::set<Engine*> > SysexListeners;
00359 };
00360
00361 }
00362
00363 #endif // __LS_MIDIINPUTPORT_H__