22 #ifndef AUDIO_MT32GM_H 23 #define AUDIO_MT32GM_H 25 #include "audio/mididrv.h" 26 #include "audio/mididrv_ms.h" 27 #include "common/list.h" 28 #include "common/mutex.h" 113 static const byte MT32_DEFAULT_INSTRUMENTS[8];
114 static const int16 MT32_DEFAULT_INSTRUMENTS_CONTROLLER_DEFAULTS[16];
115 static const byte MT32_DEFAULT_PANNING[8];
116 static const uint8 MT32_DEFAULT_CHANNEL_VOLUME = 102;
117 static const uint8 GM_DEFAULT_CHANNEL_VOLUME = 100;
119 static const uint8 GS_DRUMKIT_FALLBACK_MAP[128];
121 static const uint8 MT32_DISPLAY_NUM_CHARS = 20;
122 static const uint32 MT32_DISPLAY_MEMORY_ADDRESS = 0x20 << 14;
125 static const uint8 MAXIMUM_MT32_ACTIVE_NOTES = 48;
126 static const uint8 MAXIMUM_GM_ACTIVE_NOTES = 96;
139 bool sourceVolumeApplied;
145 byte channelPressure;
159 byte pitchBendSensitivity;
162 sourceVolumeApplied(
false),
163 pitchWheel(MIDI_PITCH_BEND_DEFAULT),
170 panPosition(MIDI_PANNING_DEFAULT),
171 expression(MIDI_EXPRESSION_DEFAULT),
174 pitchBendSensitivity(0) { }
191 uint16 neutralVolume;
193 uint16 fadeStartVolume;
195 uint16 fadeEndVolume;
197 int32 fadePassedTime;
201 int8 channelMap[MIDI_CHANNEL_COUNT];
203 uint16 availableChannels;
207 fadeEndVolume(0), fadePassedTime(0), fadeDuration(0), availableChannels(0xFFFF) {
208 memset(channelMap, 0,
sizeof(channelMap));
245 memset(data, 0,
sizeof(data));
253 static void timerCallback(
void *data);
262 void close()
override;
263 bool isOpen()
const override {
return _isOpen; }
264 bool isReady(int8 source = -1)
override;
265 uint32
property(
int prop, uint32 param)
override;
268 void send(uint32 b)
override;
269 void send(int8 source, uint32 b)
override;
270 void sysEx(
const byte *msg, uint16 length)
override;
271 uint16
sysExNoDelay(
const byte *msg, uint16 length)
override;
279 void sysExQueue(
const byte *msg, uint16 length, int8 source = -1);
299 uint16
sysExMT32(
const byte *msg, uint16 length,
const uint32 targetAddress,
bool queue =
false,
bool delay =
true, int8 source = -1);
300 void metaEvent(int8 source, byte type,
const byte *data, uint16 length)
override;
302 void stopAllNotes(
bool stopSustainedNotes =
false)
override;
351 virtual void initMT32(
bool initForGM);
361 virtual void initGM(
bool initForMT32,
bool enableGS);
377 virtual void processEvent(int8 source, uint32 b, uint8 outputChannel,
405 virtual void noteOnOff(byte outputChannel, byte command, byte note, byte velocity,
419 virtual void polyAftertouch(byte outputChannel, byte note, byte pressure,
432 virtual void controlChange(byte outputChannel, byte controllerNumber, byte controllerValue,
446 virtual void programChange(byte outputChannel, byte patchId, int8 source,
475 virtual void pitchBend(byte outputChannel, uint8 pitchBendLsb, uint8 pitchBendMsb,
481 virtual bool addActiveNote(uint8 outputChannel, uint8 note, int8 source);
485 virtual bool removeActiveNote(uint8 outputChannel, uint8 note, int8 source);
530 void stopAllNotes(uint8 source, uint8 channel)
override;
551 bool _midiDataReversePanning;
556 bool _midiDeviceReversePanning;
558 bool _scaleGSPercussionVolumeToMT32;
563 uint16 _outputChannelMask;
575 const byte *_mt32ToGMInstrumentMap;
576 const byte *_gmToMT32InstrumentMap;
578 uint8 _maximumActiveNotes;
byte correctInstrumentBank(byte outputChannel, byte patchId)
bool isReady(int8 source=-1) override
virtual void channelAftertouch(byte outputChannel, byte pressure, int8 source, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false)
virtual void programChange(byte outputChannel, byte patchId, int8 source, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false)
virtual void controlChange(byte outputChannel, byte controllerNumber, byte controllerValue, int8 source, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false)
virtual bool allocateSourceChannels(uint8 source, uint8 numChannels)
virtual int8 mapSourceChannel(uint8 source, uint8 dataChannel)
bool isOutputChannelUsed(int8 outputChannel)
Definition: mididrv_ms.h:114
virtual void noteOnOff(byte outputChannel, byte command, byte note, byte velocity, int8 source, MidiChannelControlData &controlData)
Definition: mididrv_ms.h:86
MusicType
Definition: mididrv.h:44
virtual void removeActiveNotes(uint8 outputChannel, bool sustainedNotes)
virtual byte mapGMInstrumentToMT32(byte gmInstrument)
virtual void initMT32(bool initForGM)
Definition: mididrv.h:313
uint32 property(int prop, uint32 param) override
virtual void initMidiDevice()
void deinitSource(uint8 source) override
bool isOpen() const override
Definition: mt32gm.h:263
void applySourceVolume(uint8 source) override
virtual void initControlData()
static const uint8 MAXIMUM_SOURCES
Definition: mididrv_ms.h:92
virtual void processEvent(int8 source, uint32 b, uint8 outputChannel, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false)
SourceType
Definition: mididrv_ms.h:110
virtual bool removeActiveNote(uint8 outputChannel, uint8 note, int8 source)
void send(uint32 b) override
virtual void pitchBend(byte outputChannel, uint8 pitchBendLsb, uint8 pitchBendMsb, int8 source, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false)
void sysEx(const byte *msg, uint16 length) override
Definition: mididrv.h:541
uint16 sysExNoDelay(const byte *msg, uint16 length) override
uint32 getBaseTempo() override
virtual void initGM(bool initForMT32, bool enableGS)
virtual void applyControllerDefaults(uint8 source, MidiChannelControlData &controlData, uint8 outputChannel, bool channelLockedByOtherSource)
static const uint16 DEFAULT_SOURCE_NEUTRAL_VOLUME
Definition: mididrv_ms.h:100
virtual void polyAftertouch(byte outputChannel, byte note, byte pressure, int8 source, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false)
void sysExQueue(const byte *msg, uint16 length, int8 source=-1)
virtual bool addActiveNote(uint8 outputChannel, uint8 note, int8 source)
void metaEvent(int8 source, byte type, const byte *data, uint16 length) override
virtual void send(uint32 b)=0
virtual byte mapMT32InstrumentToGM(byte mt32Instrument)
uint16 sysExMT32(const byte *msg, uint16 length, const uint32 targetAddress, bool queue=false, bool delay=true, int8 source=-1)
void stopAllNotes(bool stopSustainedNotes=false) override