Public Member Functions | |
void | channelAftertouch (uint8 channel, uint8 pressure, uint8 source) override |
void | metaEvent (int8 source, byte type, byte *data, uint16 length) override |
![]() | |
MidiDriver_ADLIB_Multisource (OPL::Config::OplType oplType, int timerFrequency=OPL::OPL::kDefaultCallbackFrequency) | |
int | open () override |
bool | isOpen () const override |
void | close () override |
uint32 | property (int prop, uint32 param) override |
uint32 | getBaseTempo () override |
MidiChannel * | allocateChannel () override |
MidiChannel * | getPercussionChannel () override |
void | send (int8 source, uint32 b) override |
void | sysEx (const byte *msg, uint16 length) override |
void | stopAllNotes (bool stopSustainedNotes=false) override |
void | stopAllNotes (uint8 source, uint8 channel) override |
void | deinitSource (uint8 source) override |
![]() | |
void | send (uint32 b) override |
uint32 | property (int prop, uint32 param) 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 uint16 | sysExNoDelay (const byte *msg, uint16 length) |
virtual void | metaEvent (byte type, byte *data, uint16 length) |
virtual bool | isReady (int8 source=-1) |
Protected Member Functions | |
InstrumentInfo | determineInstrument (uint8 channel, uint8 source, uint8 note) override |
uint16 | calculateFrequency (uint8 channel, uint8 source, uint8 note) override |
int32 | calculatePitchBend (uint8 channel, uint8 source, uint16 oplFrequency) override |
uint8 | calculateUnscaledVolume (uint8 channel, uint8 source, uint8 velocity, const OplInstrumentDefinition &instrumentDef, uint8 operatorNum) override |
![]() | |
void | applySourceVolume (uint8 source) override |
virtual void | initOpl () |
virtual void | noteOff (uint8 channel, uint8 note, uint8 velocity, uint8 source) |
virtual void | noteOn (uint8 channel, uint8 note, uint8 velocity, uint8 source) |
virtual void | polyAftertouch (uint8 channel, uint8 note, uint8 pressure, uint8 source) |
virtual void | controlChange (uint8 channel, uint8 controller, uint8 value, uint8 source) |
virtual void | programChange (uint8 channel, uint8 program, uint8 source) |
virtual void | pitchBend (uint8 channel, uint8 pitchBendLsb, uint8 pitchBendMsb, uint8 source) |
virtual void | modulation (uint8 channel, uint8 modulation, uint8 source) |
virtual void | dataEntry (uint8 channel, uint8 dataMsb, uint8 dataLsb, uint8 source) |
virtual void | volume (uint8 channel, uint8 volume, uint8 source) |
virtual void | panning (uint8 channel, uint8 panning, uint8 source) |
virtual void | expression (uint8 channel, uint8 expression, uint8 source) |
virtual void | sustain (uint8 channel, uint8 sustain, uint8 source) |
virtual void | registeredParameterNumber (uint8 channel, uint8 rpnMsb, uint8 rpnLsb, uint8 source) |
virtual void | allSoundOff (uint8 channel, uint8 source) |
virtual void | resetAllControllers (uint8 channel, uint8 source) |
virtual void | allNotesOff (uint8 channel, uint8 source) |
virtual void | applyControllerDefaults (uint8 source) |
virtual void | recalculateFrequencies (uint8 channel, uint8 source) |
virtual void | recalculateVolumes (uint8 channel, uint8 source) |
virtual uint8 | allocateOplChannel (uint8 channel, uint8 source, InstrumentInfo &instrumentInfo) |
void | determineMelodicChannels () |
virtual uint8 | calculateVolume (uint8 channel, uint8 source, uint8 velocity, const OplInstrumentDefinition &instrumentDef, uint8 operatorNum) |
virtual bool | isVolumeApplicableToOperator (const OplInstrumentDefinition &instrumentDef, uint8 operatorNum) |
virtual uint8 | calculatePanning (uint8 channel, uint8 source) |
virtual void | setRhythmMode (bool rhythmMode) |
uint16 | determineOperatorRegisterOffset (uint8 oplChannel, uint8 operatorNum, OplInstrumentRhythmType rhythmType=RHYTHM_TYPE_UNDEFINED, bool fourOperator=false) |
uint16 | determineChannelRegisterOffset (uint8 oplChannel, bool fourOperator=false) |
void | writeInstrument (uint8 oplChannel, InstrumentInfo instrument) |
void | writeKeyOff (uint8 oplChannel, OplInstrumentRhythmType rhythmType=RHYTHM_TYPE_UNDEFINED, bool forceWrite=false) |
void | writeRhythm (bool forceWrite=false) |
virtual void | writeVolume (uint8 oplChannel, uint8 operatorNum, OplInstrumentRhythmType rhythmType=RHYTHM_TYPE_UNDEFINED) |
virtual void | writePanning (uint8 oplChannel, OplInstrumentRhythmType rhythmType=RHYTHM_TYPE_UNDEFINED) |
virtual void | writeFrequency (uint8 oplChannel, OplInstrumentRhythmType rhythmType=RHYTHM_TYPE_UNDEFINED) |
void | writeRegister (uint16 reg, uint8 value, bool forceWrite=false) |
![]() | |
void | updateFading () |
virtual void | onTimer () |
![]() | |
void | midiDumpInit () |
int | midiDumpVarLength (const uint32 &delta) |
void | midiDumpDelta () |
void | midiDumpDo (uint32 b) |
void | midiDumpSysEx (const byte *msg, uint16 length) |
void | midiDumpFinish () |
Protected Attributes | |
OplInstrumentDefinition | _instrumentDefs [10][MIDI_CHANNEL_COUNT] |
uint8 | _pitchBendSensitivity |
![]() | |
OPL::Config::OplType | _oplType |
OPL::OPL * | _opl |
bool | _isOpen |
int | _timerFrequency |
AccuracyMode | _accuracyMode |
ChannelAllocationMode | _allocationMode |
InstrumentWriteMode | _instrumentWriteMode |
bool | _rhythmModeRewriteSharedRegister |
bool | _rhythmModeIgnoreNoteOffs |
RhythmInstrumentMode | _rhythmInstrumentMode |
uint8 | _defaultChannelVolume |
NoteSelectMode | _noteSelect |
ModulationDepth | _modulationDepth |
VibratoDepth | _vibratoDepth |
bool | _rhythmMode |
const OplInstrumentDefinition * | _instrumentBank |
const OplInstrumentDefinition * | _rhythmBank |
uint8 | _rhythmBankFirstNote |
uint8 | _rhythmBankLastNote |
MidiChannelControlData | _controlData [MAXIMUM_SOURCES][MIDI_CHANNEL_COUNT] |
ActiveNote | _activeNotes [OPL3_NUM_CHANNELS] |
ActiveNote | _activeRhythmNotes [5] |
uint8 | _channelAllocations [MAXIMUM_SOURCES][MIDI_CHANNEL_COUNT] |
const uint8 * | _melodicChannels |
uint8 | _numMelodicChannels |
uint32 | _noteCounter |
float | _oplFrequencyConversionFactor |
uint8 | _shadowRegisters [0x200] |
Common::Mutex | _allocationMutex |
Common::Mutex | _activeNotesMutex |
![]() | |
MidiSource | _sources [MAXIMUM_SOURCES] |
ControllerDefaults | _controllerDefaults |
const byte * | _instrumentRemapping |
bool | _userVolumeScaling |
uint16 | _userMusicVolume |
uint16 | _userSfxVolume |
bool | _userMute |
Common::Mutex | _fadingMutex |
uint16 | _fadeDelay |
uint32 | _timerRate |
void * | _timer_param |
Common::TimerManager::TimerProc | _timer_proc |
![]() | |
bool | _midiDumpEnable |
uint32 | _prevMillis |
Common::Array< byte > | _midiDumpCache |
Static Protected Attributes | |
static const uint16 | OPL_FREQUENCY_LOOKUP [] |
![]() | |
static const uint8 | OPL_LEVEL_DEFAULT = 0x3F |
static const uint8 | OPL_MIDI_PANNING_LEFT_LIMIT = 0x2F |
static const uint8 | OPL_MIDI_PANNING_RIGHT_LIMIT = 0x51 |
static const uint16 | OPL_NOTE_FREQUENCIES [] |
static const uint8 | OPL_VOLUME_LOOKUP [] |
![]() | |
static const uint16 | FADING_DELAY = 25 * 1000 |
Additional Inherited Members | |
![]() | |
enum | AccuracyMode { ACCURACY_MODE_SB16_WIN95, ACCURACY_MODE_GM } |
enum | ChannelAllocationMode { ALLOCATION_MODE_DYNAMIC, ALLOCATION_MODE_STATIC } |
enum | InstrumentWriteMode { INSTRUMENT_WRITE_MODE_NOTE_ON, INSTRUMENT_WRITE_MODE_PROGRAM_CHANGE, INSTRUMENT_WRITE_MODE_FIRST_NOTE_ON } |
enum | RhythmInstrumentMode { RHYTHM_INSTRUMENT_MODE_CHANNEL_10, RHYTHM_INSTRUMENT_MODE_RHYTHM_TYPE } |
enum | NoteSelectMode { NOTE_SELECT_MODE_0, NOTE_SELECT_MODE_1 } |
enum | ModulationDepth { MODULATION_DEPTH_LOW, MODULATION_DEPTH_HIGH } |
enum | VibratoDepth { VIBRATO_DEPTH_LOW, VIBRATO_DEPTH_HIGH } |
![]() | |
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 |
![]() | |
static bool | detectOplType (OPL::Config::OplType oplType) |
![]() | |
static Common::String | musicType2GUIO (uint32 musicType) |
static MidiDriver * | createMidi (DeviceHandle handle) |
static DeviceHandle | detectDevice (int flags) |
static DeviceHandle | getDeviceHandle (const Common::String &identifier) |
static bool | checkDevice (DeviceHandle handle, int flags, bool quiet) |
static MusicType | getMusicType (DeviceHandle handle) |
static Common::String | getDeviceString (DeviceHandle handle, DeviceStringType type) |
static const char * | getErrorName (int error_code) |
![]() | |
static const uint8 | OPL2_NUM_CHANNELS = 9 |
static const uint8 | OPL3_NUM_CHANNELS = 18 |
static const uint8 | MELODIC_CHANNELS_OPL2 [9] |
static const uint8 | MELODIC_CHANNELS_OPL2_RHYTHM [6] |
static const uint8 | MELODIC_CHANNELS_OPL3 [18] |
static const uint8 | MELODIC_CHANNELS_OPL3_RHYTHM [15] |
static const uint8 | OPL_NUM_RHYTHM_INSTRUMENTS = 5 |
static const uint8 | OPL_RHYTHM_INSTRUMENT_CHANNELS [OPL_NUM_RHYTHM_INSTRUMENTS] |
static const uint8 | OPL_REGISTER_TEST = 0x01 |
static const uint8 | OPL_REGISTER_TIMER1 = 0x02 |
static const uint8 | OPL_REGISTER_TIMER2 = 0x03 |
static const uint8 | OPL_REGISTER_TIMERCONTROL = 0x04 |
static const uint8 | OPL_REGISTER_NOTESELECT_CSM = 0x08 |
static const uint8 | OPL_REGISTER_RHYTHM = 0xBD |
static const uint8 | OPL_REGISTER_BASE_FREQMULT_MISC = 0x20 |
static const uint8 | OPL_REGISTER_BASE_LEVEL = 0x40 |
static const uint8 | OPL_REGISTER_BASE_DECAY_ATTACK = 0x60 |
static const uint8 | OPL_REGISTER_BASE_RELEASE_SUSTAIN = 0x80 |
static const uint8 | OPL_REGISTER_BASE_WAVEFORMSELECT = 0xE0 |
static const uint8 | OPL_REGISTER_BASE_FNUMLOW = 0xA0 |
static const uint8 | OPL_REGISTER_BASE_FNUMHIGH_BLOCK_KEYON = 0xB0 |
static const uint8 | OPL_REGISTER_BASE_CONNECTION_FEEDBACK_PANNING = 0xC0 |
static const uint16 | OPL3_REGISTER_CONNECTIONSELECT = 0x104 |
static const uint16 | OPL3_REGISTER_NEW = 0x105 |
static const uint16 | OPL_REGISTER_SET_2_OFFSET = 0x100 |
static const uint8 | OPL_REGISTER_RHYTHM_OFFSETS [] |
static const uint8 | OPL_MASK_LEVEL = 0x3F |
static const uint8 | OPL_MASK_FNUMHIGH_BLOCK = 0x1F |
static const uint8 | OPL_MASK_KEYON = 0x20 |
static const uint8 | OPL_MASK_PANNING = 0x30 |
static const uint8 | OPL_PANNING_CENTER = 0x30 |
static const uint8 | OPL_PANNING_LEFT = 0x10 |
static const uint8 | OPL_PANNING_RIGHT = 0x20 |
static const OplInstrumentDefinition | OPL_INSTRUMENT_BANK [] |
static const OplInstrumentDefinition | OPL_RHYTHM_BANK [] |
![]() | |
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 |
|
overridevirtual |
Processes a MIDI channel aftertouch event. Note: this event has no default implementation because it is not implemented in the Win95 SB16 driver.
channel | The MIDI channel on which aftertouch should be applied. |
pressure | The aftertouch amount that should be applied. |
source | The source sending the aftertouch event. |
Reimplemented from MidiDriver_ADLIB_Multisource.
|
overridevirtual |
Send a meta event from a specific source. If the MIDI driver does not support multiple sources, the source parameter is ignored.
Reimplemented from MidiDriver_ADLIB_Multisource.
|
overrideprotectedvirtual |
Determines the instrument data necessary to play the specified note on the specified MIDI channel and source. This will determine the instrument definition to use, the note that should be played and an instrument ID for use by the dynamic channel allocation algorithm.
channel | The MIDI channel on which the note is played. |
source | The source playing the note. |
note | The MIDI note which is played. |
Reimplemented from MidiDriver_ADLIB_Multisource.
|
overrideprotectedvirtual |
Calculates the OPL frequency (F-num) and octave (block) to play the specified note on the specified MIDI channel and source, taking into account the MIDI controllers pitch bend and (on accuracy mode GM) pitch bend sensitivity and master tuning. The result is returned in the format of the Ax (low byte) and Bx (high byte) OPL registers. Note that the MIDI note range exceeds the frequency range of an OPL chip, so the highest MIDI notes will be shifted down one or two octaves. The SB16 Win95 accuracy mode calculates the same frequencies as the Windows 95 SB16 driver. The GM accuracy mode is more accurate, but the calculations are more CPU intensive. This mode also supports pitch bend sensitivity (which is fixed at 2 semitones in SB16 Win95 mode) and master tuning.
channel | The MIDI channel on which the note is played. |
source | The source playing the note. |
note | The MIDI note which is played. |
Reimplemented from MidiDriver_ADLIB_Multisource.
|
overrideprotectedvirtual |
Calculates the pitch bend value to apply to the specified OPL frequency (F-num) on the specified MIDI channel and source. If the accuracy mode is GM, pitch bend sensitivity and master tuning settings are also applied. The result is an adjustment which can be added to the OPL frequency to get the pitch bent note.
channel | The MIDI channel for which pitch bend should be calculated. |
source | The source for which pitch bend should be calculated. |
oplFrequency | The OPL frequency for which pitch bend should be calculated. |
Reimplemented from MidiDriver_ADLIB_Multisource.
|
overrideprotectedvirtual |
Calculates the unscaled volume for the specified operator of a note on the specified MIDI channel and source, using the specified MIDI velocity and instrument definition. The SB16 Win95 accuracy mode calculates the same values as the Windows 95 SB16 driver. The GM accuracy mode is more accurate to the volume curve in the General MIDI specification and supports the expression controller, but the calculation is more CPU intensive. The volume is returned as an OPL 2x register volume (level) value, i.e. 0 = maximum volume, 3F = minimum volume.
channel | The MIDI channel on which the note is played. |
source | The source playing the note. |
velocity | The MIDI velocity of the note for which volume should be calculated. |
instrumentDef | The instrument definition used to play the note. |
operatorNum | The number of the operator for which volume should be calculated; 0-1 for 2 operator instruments, 0-3 for 4 operator instruments. |
Reimplemented from MidiDriver_ADLIB_Multisource.