|
| MidiDriver_MT32GM (MusicType midiType) |
|
int | open () override |
|
virtual int | open (MidiDriver *driver, bool nativeMT32) |
|
void | close () override |
|
bool | isOpen () const override |
|
bool | isReady (int8 source=-1) override |
|
uint32 | property (int prop, uint32 param) override |
|
void | send (uint32 b) override |
|
void | send (int8 source, uint32 b) override |
|
void | sysEx (const byte *msg, uint16 length) override |
|
uint16 | sysExNoDelay (const byte *msg, uint16 length) override |
|
void | sysExQueue (const byte *msg, uint16 length, int8 source=-1) |
|
uint16 | sysExMT32 (const byte *msg, uint16 length, const uint32 targetAddress, bool queue=false, bool delay=true, int8 source=-1) |
|
void | metaEvent (int8 source, byte type, byte *data, uint16 length) override |
|
void | stopAllNotes (bool stopSustainedNotes=false) override |
|
void | clearSysExQueue () |
|
MidiChannel * | allocateChannel () override |
|
MidiChannel * | getPercussionChannel () override |
|
uint32 | getBaseTempo () override |
|
virtual bool | allocateSourceChannels (uint8 source, uint8 numChannels) |
|
void | deinitSource (uint8 source) override |
|
void | setSourceType (SourceType type) |
|
void | setSourceType (uint8 source, SourceType type) |
|
void | setSourceVolume (uint16 volume) |
|
void | setSourceVolume (uint8 source, uint16 volume) |
|
void | resetSourceVolume () |
|
void | resetSourceVolume (uint8 source) |
|
void | setSourceNeutralVolume (uint16 volume) |
|
void | setSourceNeutralVolume (uint8 source, uint16 volume) |
|
void | startFade (uint16 duration, uint16 targetVolume) |
|
void | startFade (uint8 source, uint16 duration, uint16 targetVolume) |
|
void | abortFade (FadeAbortType abortType=FADE_ABORT_TYPE_END_VOLUME) |
|
void | abortFade (uint8 source, FadeAbortType abortType=FADE_ABORT_TYPE_END_VOLUME) |
|
bool | isFading () |
|
bool | isFading (uint8 source) |
|
void | setControllerDefault (ControllerDefaultType type) |
|
void | setControllerDefault (ControllerDefaultType type, int16 value) |
|
void | setControllerDefaults (ControllerDefaultType type, int16 *values) |
|
void | clearControllerDefault (ControllerDefaultType type) |
|
void | setInstrumentRemapping (const byte *instrumentRemapping) |
|
void | syncSoundSettings () |
|
void | setTimerCallback (void *timer_param, Common::TimerManager::TimerProc timer_proc) override |
|
void | midiDriverCommonSend (uint32 b) |
|
void | midiDriverCommonSysEx (const byte *msg, uint16 length) |
|
virtual void | setPitchBendRange (byte channel, uint range) |
|
void | sendMT32Reset () |
|
void | sendGMReset () |
|
virtual void | setEngineSoundFont (Common::SeekableReadStream *soundFontData) |
|
virtual bool | acceptsSoundFontData () |
|
void | send (byte status, byte firstOp, byte secondOp) |
|
void | send (int8 source, byte status, byte firstOp, byte secondOp) |
|
virtual void | metaEvent (byte type, byte *data, uint16 length) |
|
|
static const byte | MT32_DEFAULT_INSTRUMENTS [8] |
|
static const byte | MT32_DEFAULT_PANNING [8] |
|
static const uint8 | MT32_DEFAULT_CHANNEL_VOLUME = 102 |
|
static const uint8 | GM_DEFAULT_CHANNEL_VOLUME = 100 |
|
static const uint8 | GS_DRUMKIT_FALLBACK_MAP [128] |
|
static const uint8 | MT32_DISPLAY_NUM_CHARS = 20 |
|
static const uint32 | MT32_DISPLAY_MEMORY_ADDRESS = 0x20 << 14 |
|
static const uint8 | MAXIMUM_SOURCES = 10 |
|
static const uint16 | DEFAULT_SOURCE_NEUTRAL_VOLUME = 255 |
|
static const byte | _mt32ToGm [128] |
|
static const byte | _gmToMt32 [128] |
|
static const uint8 | MIDI_CHANNEL_COUNT = 16 |
|
static const uint8 | MIDI_RHYTHM_CHANNEL = 9 |
|
static const byte | MIDI_COMMAND_NOTE_OFF = 0x80 |
|
static const byte | MIDI_COMMAND_NOTE_ON = 0x90 |
|
static const byte | MIDI_COMMAND_POLYPHONIC_AFTERTOUCH = 0xA0 |
|
static const byte | MIDI_COMMAND_CONTROL_CHANGE = 0xB0 |
|
static const byte | MIDI_COMMAND_PROGRAM_CHANGE = 0xC0 |
|
static const byte | MIDI_COMMAND_CHANNEL_AFTERTOUCH = 0xD0 |
|
static const byte | MIDI_COMMAND_PITCH_BEND = 0xE0 |
|
static const byte | MIDI_COMMAND_SYSTEM = 0xF0 |
|
static const byte | MIDI_CONTROLLER_BANK_SELECT_MSB = 0x00 |
|
static const byte | MIDI_CONTROLLER_MODULATION = 0x01 |
|
static const byte | MIDI_CONTROLLER_DATA_ENTRY_MSB = 0x06 |
|
static const byte | MIDI_CONTROLLER_VOLUME = 0x07 |
|
static const byte | MIDI_CONTROLLER_BALANCE = 0x08 |
|
static const byte | MIDI_CONTROLLER_PANNING = 0x0A |
|
static const byte | MIDI_CONTROLLER_EXPRESSION = 0x0B |
|
static const byte | MIDI_CONTROLLER_BANK_SELECT_LSB = 0x20 |
|
static const byte | MIDI_CONTROLLER_DATA_ENTRY_LSB = 0x26 |
|
static const byte | MIDI_CONTROLLER_SUSTAIN = 0x40 |
|
static const byte | MIDI_CONTROLLER_PORTAMENTO = 0x41 |
|
static const byte | MIDI_CONTROLLER_SOSTENUTO = 0x42 |
|
static const byte | MIDI_CONTROLLER_SOFT = 0x43 |
|
static const byte | MIDI_CONTROLLER_REVERB = 0x5B |
|
static const byte | MIDI_CONTROLLER_CHORUS = 0x5D |
|
static const byte | MIDI_CONTROLLER_RPN_LSB = 0x64 |
|
static const byte | MIDI_CONTROLLER_RPN_MSB = 0x65 |
|
static const byte | MIDI_CONTROLLER_ALL_SOUND_OFF = 0x78 |
|
static const byte | MIDI_CONTROLLER_RESET_ALL_CONTROLLERS = 0x79 |
|
static const byte | MIDI_CONTROLLER_ALL_NOTES_OFF = 0x7B |
|
static const byte | MIDI_CONTROLLER_OMNI_ON = 0x7C |
|
static const byte | MIDI_CONTROLLER_OMNI_OFF = 0x7D |
|
static const byte | MIDI_CONTROLLER_MONO_ON = 0x7E |
|
static const byte | MIDI_CONTROLLER_POLY_ON = 0x7F |
|
static const uint16 | MIDI_RPN_PITCH_BEND_SENSITIVITY = 0x0000 |
|
static const uint16 | MIDI_RPN_MASTER_TUNING_FINE = 0x0001 |
|
static const uint16 | MIDI_RPN_MASTER_TUNING_COARSE = 0x0002 |
|
static const uint16 | MIDI_RPN_NULL = 0x7F7F |
|
static const uint8 | MIDI_META_END_OF_TRACK = 0x2F |
|
static const uint8 | MIDI_META_SEQUENCER = 0x7F |
|
static const uint16 | MIDI_PITCH_BEND_DEFAULT = 0x2000 |
|
static const uint8 | MIDI_PANNING_DEFAULT = 0x40 |
|
static const uint8 | MIDI_EXPRESSION_DEFAULT = 0x7F |
|
static const uint16 | MIDI_MASTER_TUNING_FINE_DEFAULT = 0x2000 |
|
static const uint8 | MIDI_MASTER_TUNING_COARSE_DEFAULT = 0x40 |
|
static const uint8 | MT32_PITCH_BEND_SENSITIVITY_DEFAULT = 0x0C |
|
static const uint8 | GM_PITCH_BEND_SENSITIVITY_DEFAULT = 0x02 |
|
static const uint8 | GS_RHYTHM_FIRST_NOTE = 0x1B |
|
static const uint8 | GS_RHYTHM_LAST_NOTE = 0x58 |
|
|
virtual void | initControlData () |
|
virtual void | initMidiDevice () |
|
virtual void | initMT32 (bool initForGM) |
|
virtual void | initGM (bool initForMT32, bool enableGS) |
|
virtual void | processEvent (int8 source, uint32 b, uint8 outputChannel, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false) |
|
virtual void | applyControllerDefaults (uint8 source, MidiChannelControlData &controlData, uint8 outputChannel, bool channelLockedByOtherSource) |
|
virtual void | noteOnOff (byte outputChannel, byte command, byte note, byte velocity, int8 source, MidiChannelControlData &controlData) |
|
virtual void | polyAftertouch (byte outputChannel, byte note, byte pressure, int8 source, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false) |
|
virtual void | controlChange (byte outputChannel, byte controllerNumber, byte controllerValue, int8 source, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false) |
|
virtual void | programChange (byte outputChannel, byte patchId, int8 source, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false) |
|
virtual void | channelAftertouch (byte outputChannel, byte pressure, int8 source, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false) |
|
virtual void | pitchBend (byte outputChannel, uint8 pitchBendLsb, uint8 pitchBendMsb, int8 source, MidiChannelControlData &controlData, bool channelLockedByOtherSource=false) |
|
virtual bool | addActiveNote (uint8 outputChannel, uint8 note, int8 source) |
|
virtual bool | removeActiveNote (uint8 outputChannel, uint8 note, int8 source) |
|
virtual void | removeActiveNotes (uint8 outputChannel, bool sustainedNotes) |
|
bool | isOutputChannelUsed (int8 outputChannel) |
|
virtual byte | mapMT32InstrumentToGM (byte mt32Instrument) |
|
virtual byte | mapGMInstrumentToMT32 (byte gmInstrument) |
|
byte | correctInstrumentBank (byte outputChannel, byte patchId) |
|
virtual int8 | mapSourceChannel (uint8 source, uint8 dataChannel) |
|
void | applySourceVolume (uint8 source) override |
|
void | stopAllNotes (uint8 source, uint8 channel) override |
|
void | onTimer () override |
|
void | updateFading () |
|
void | midiDumpInit () |
|
int | midiDumpVarLength (const uint32 &delta) |
|
void | midiDumpDelta () |
|
void | midiDumpDo (uint32 b) |
|
void | midiDumpSysEx (const byte *msg, uint16 length) |
|
void | midiDumpFinish () |
|
|
enum | SourceType { SOURCE_TYPE_UNDEFINED,
SOURCE_TYPE_MUSIC,
SOURCE_TYPE_SFX
} |
|
enum | FadeAbortType { FADE_ABORT_TYPE_END_VOLUME,
FADE_ABORT_TYPE_CURRENT_VOLUME,
FADE_ABORT_TYPE_START_VOLUME
} |
|
enum | ControllerDefaultType {
CONTROLLER_DEFAULT_PROGRAM,
CONTROLLER_DEFAULT_INSTRUMENT_BANK,
CONTROLLER_DEFAULT_DRUMKIT,
CONTROLLER_DEFAULT_CHANNEL_PRESSURE,
CONTROLLER_DEFAULT_PITCH_BEND,
CONTROLLER_DEFAULT_MODULATION,
CONTROLLER_DEFAULT_VOLUME,
CONTROLLER_DEFAULT_PANNING,
CONTROLLER_DEFAULT_EXPRESSION,
CONTROLLER_DEFAULT_SUSTAIN,
CONTROLLER_DEFAULT_RPN,
CONTROLLER_DEFAULT_PITCH_BEND_SENSITIVITY
} |
|
enum | DeviceStringType { kDriverName,
kDriverId,
kDeviceName,
kDeviceId
} |
|
enum | { MERR_CANNOT_CONNECT = 1,
MERR_DEVICE_NOT_AVAILABLE = 3,
MERR_ALREADY_OPEN = 4
} |
|
enum | {
PROP_OLD_ADLIB = 2,
PROP_CHANNEL_MASK = 3,
PROP_SCUMM_OPL3 = 4,
PROP_USER_VOLUME_SCALING = 5,
PROP_MIDI_DATA_REVERSE_PANNING = 6,
PROP_OPL_ACCURACY_MODE = 7,
PROP_OPL_CHANNEL_ALLOCATION_MODE = 8,
PROP_MILES_VERSION = 9,
PROP_OPL_RHYTHM_MODE_IGNORE_NOTE_OFF = 10
} |
|
typedef uint32 | DeviceHandle |
|
MIDI driver for MT-32 and GM compatible emulators and devices.
This class contains some commonly needed functionality for these devices and the MIDI data that targets them. It wraps the MidiDriver instance that does the actual communication with the MT-32 or GM device.
This driver has the following features:
- MIDI device initialization Construct the driver with the type of MIDI data that will be sent to it. When the driver is opened, it will create an output MIDI driver appropriate for the user configuration settings and the type of MIDI data. You can also create the output MIDI driver yourself and pass it to the open function. The driver will take care of initializing the MIDI device and setting up for playback of MT-32 data on a GM/GS device or the other way around.
- MT-32 <> GM conversion If the incoming MIDI data has been set to MT-32 and the output device is GM, the driver will map MT-32 instruments to GM equivalents. GM playback on an MT-32 device is also supported. Set the _mt32ToGMInstrumentMap and _gmToMT32InstrumentMap variables to override the standard instrument maps, or override the mapMT32InstrumentToGM and mapGMInstrumentToMT32 functions for more advanced mapping algorithms.
- Reverse stereo If the game has MIDI data with reversed stereo compared to the targeted output device, set the MIDI_DATA_REVERSE_PANNING property to reverse stereo. The driver wil automatically reverse stereo when MT-32 data is sent to a GM/GS device or the other way around.
- Correct Roland GS bank and drumkit selects Some games' MIDI data relies on a feature of the Roland SC-55 MIDI module which automatically corrects invalid bank selects and drumkit program changes. The driver replicates this feature to ensure correct instrument banks and drumkits on other hardware or softsynths.
- SysEx queue The sysExQueue function will queue a SysEx message and return immediately. You can send more messages to the queue while the driver sends the messages asynchronously with the necessary delays to the MIDI device. Use the isReady function to check if the device has received all messages and is ready to start playback. Use this instead of the sysEx function to prevent the main game loop from being blocked while the driver waits the necessary amount of time for the MIDI device to process the message. Use clearSysExQueue to remove all messages from the queue, in case device initialization has to be aborted.
- Multiple MIDI sources If the game plays multiple streams of MIDI data at the same time, each stream can be marked with a source number. This enables the following feature:
- Channel mapping If multiple sources use the same MIDI channels, the driver can map the data channels to different output channels to avoid conflicts. Use allocateSourceChannels to allocate output channels to a source. The data channels are automatically mapped to the allocated output channels during playback. The allocated channels are freed when the source is deinitialized. If you only have one source of MIDI data or the sources do not use conflicting channels, you do not need to allocate channels - the channels in the MIDI data will be used directly. If you do use this feature, you have to use it for all MIDI sources to avoid channel conflicts. The standard channel allocation scheme will allocate the available output channels with the lowest numbers and will fail if not enough channels are available. You can override the allocateSourceChannels and mapSourceChannel functions to customize the allocation and mapping algorithms. Note that you can also use the "standard" way of allocating channels using the allocateChannel function and MidiChannel objects. These two methods are not coordinated in any way, so don't use both at the same time.
uint16 MidiDriver_MT32GM::sysExNoDelay |
( |
const byte * |
msg, |
|
|
uint16 |
length |
|
) |
| |
|
overridevirtual |
Transmit a SysEx to the MIDI device and return the necessary delay until the next SysEx event in milliseconds.
This can be used to implement an alternate delay method than the OSystem::delayMillis function used by most sysEx implementations. Note that not every driver needs a delay, or supports this method. In this case, 0 is returned and the driver itself will do a delay if necessary.
For information on the SysEx data requirements, see the sysEx method.
Reimplemented from MidiDriver_BASE.
void MidiDriver_MT32GM::stopAllNotes |
( |
bool |
stopSustainedNotes = false | ) |
|
|
overridevirtual |
Stops all currently active notes. Specify stopSustainedNotes if the MIDI data makes use of the sustain controller to make sure sustained notes are also stopped.
Usually, the MIDI parser tracks active notes and terminates them when playback is stopped. This method should be used as a backup to silence the MIDI output in case the MIDI parser makes a mistake when tracking acive notes. It can also be used when quitting or pausing a game.
By default, this method sends an All Notes Off message and, if stopSustainedNotes is true, a Sustain off message on all MIDI channels. Driver implementations can override this if they want to implement this functionality in a different way.
Reimplemented from MidiDriver_BASE.
Reimplemented in Ultima::Nuvie::MidiDriver_M_MT32.