00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __LS_MIDIINSTRUMENTMAPPER_H__
00022 #define __LS_MIDIINSTRUMENTMAPPER_H__
00023
00024 #include <map>
00025
00026 #include "../../EventListeners.h"
00027 #include "../../common/global.h"
00028 #include "../../common/optional.h"
00029 #include "../../engines/InstrumentManager.h"
00030 #include "midi.h"
00031
00032 namespace LinuxSampler {
00033
00034
00035 class MidiInputPort;
00036
00050 class MidiInstrumentMapper {
00051 public:
00055 enum mode_t {
00056 ON_DEMAND = 0,
00057 ON_DEMAND_HOLD = 1,
00058 PERSISTENT = 2,
00059 #if !defined(WIN32)
00060 VOID = 127,
00061 #endif
00062 DONTCARE = 127
00063 };
00064
00069 struct entry_t {
00070 String EngineName;
00071 String InstrumentFile;
00072 uint InstrumentIndex;
00073 mode_t LoadMode;
00074 float Volume;
00075 String Name;
00076 };
00077
00082 static void AddMidiInstrumentCountListener(MidiInstrumentCountListener* l);
00083
00087 static void RemoveMidiInstrumentCountListener(MidiInstrumentCountListener* l);
00088
00093 static void AddMidiInstrumentInfoListener(MidiInstrumentInfoListener* l);
00094
00098 static void RemoveMidiInstrumentInfoListener(MidiInstrumentInfoListener* l);
00099
00104 static void AddMidiInstrumentMapCountListener(MidiInstrumentMapCountListener* l);
00105
00109 static void RemoveMidiInstrumentMapCountListener(MidiInstrumentMapCountListener* l);
00110
00115 static void AddMidiInstrumentMapInfoListener(MidiInstrumentMapInfoListener* l);
00116
00120 static void RemoveMidiInstrumentMapInfoListener(MidiInstrumentMapInfoListener* l);
00121
00146 static void AddOrReplaceEntry(int Map, midi_prog_index_t Index, entry_t Entry, bool bInBackground = false) throw (Exception);
00147
00154 static entry_t GetEntry(int Map, uint MidiBank, uint MidiProg);
00155
00162 static void RemoveEntry(int Map, midi_prog_index_t Index);
00163
00170 static void RemoveAllEntries(int Map);
00171
00179 static std::map<midi_prog_index_t,entry_t> Entries(int Map) throw (Exception);
00180
00185 static std::vector<int> Maps();
00186
00195 static int AddMap(String MapName = "") throw (Exception) ;
00196
00203 static String MapName(int Map) throw (Exception);
00204
00213 static void RenameMap(int Map, String NewName) throw (Exception);
00214
00220 static void RemoveMap(int Map);
00221
00225 static void RemoveAllMaps();
00226
00230 static int GetMapCount();
00231
00236 static int GetInstrumentCount();
00237
00242 static int GetInstrumentCount(int Map);
00243
00250 static int GetDefaultMap();
00251
00256 static void SetDefaultMap(int MapId);
00257
00258 protected:
00265 static void fireMidiInstrumentCountChanged(int MapId, int NewCount);
00266
00274 static void fireMidiInstrumentInfoChanged(int MapId, int Bank, int Program);
00275
00280 static void fireMidiInstrumentMapCountChanged(int NewCount);
00281
00285 static void fireMidiInstrumentMapInfoChanged(int MapId);
00286
00287 static optional<entry_t> GetEntry(int Map, midi_prog_index_t Index);
00288 friend class EngineChannel;
00289
00290 private:
00296 static void SetLoadMode(entry_t* pEntry);
00297
00298 static ListenerList<MidiInstrumentCountListener*> llMidiInstrumentCountListeners;
00299 static ListenerList<MidiInstrumentInfoListener*> llMidiInstrumentInfoListeners;
00300 static ListenerList<MidiInstrumentMapCountListener*> llMidiInstrumentMapCountListeners;
00301 static ListenerList<MidiInstrumentMapInfoListener*> llMidiInstrumentMapInfoListeners;
00302
00303 static int DefaultMap;
00304 };
00305
00306 }
00307
00308 #endif // __LS_MIDIINSTRUMENTMAPPER_H__