22#ifndef AUDIO_ADLIB_MS_H
23#define AUDIO_ADLIB_MS_H
25#include "audio/mididrv_ms.h"
26#include "audio/fmopl.h"
31enum OplInstrumentRhythmType {
32 RHYTHM_TYPE_UNDEFINED,
36 RHYTHM_TYPE_SNARE_DRUM,
147#include "common/pack-start.h"
160 uint8 frequencyMultiplier;
164 uint8 envelopeGainType;
168 uint8 amplitudeModulation;
170 uint8 keyScalingRate;
209 uint8 waveformSelect1;
227 uint8 o0FreqMultMisc;
228 uint8 o1FreqMultMisc;
233 uint8 o0ReleaseSustain;
234 uint8 o1ReleaseSustain;
235 uint8 o0WaveformSelect;
236 uint8 o1WaveformSelect;
237 uint8 connectionFeedback;
260#include "common/pack-end.h"
408 static const uint8 OPL3_NUM_CHANNELS = 18;
443 static const uint8 OPL_REGISTER_TIMER1 = 0x02;
444 static const uint8 OPL_REGISTER_TIMER2 = 0x03;
445 static const uint8 OPL_REGISTER_TIMERCONTROL = 0x04;
451 static const uint8 OPL_REGISTER_RHYTHM = 0xBD;
457 static const uint8 OPL_REGISTER_BASE_LEVEL = 0x40;
458 static const uint8 OPL_REGISTER_BASE_DECAY_ATTACK = 0x60;
459 static const uint8 OPL_REGISTER_BASE_RELEASE_SUSTAIN = 0x80;
460 static const uint8 OPL_REGISTER_BASE_WAVEFORMSELECT = 0xE0;
466 static const uint8 OPL_REGISTER_BASE_FNUMHIGH_BLOCK_KEYON = 0xB0;
467 static const uint8 OPL_REGISTER_BASE_CONNECTION_FEEDBACK_PANNING = 0xC0;
473 static const uint16 OPL3_REGISTER_NEW = 0x105;
489 static const uint8 OPL_MASK_FNUMHIGH_BLOCK = 0x1F;
490 static const uint8 OPL_MASK_KEYON = 0x20;
491 static const uint8 OPL_MASK_PANNING = 0xF0;
497 static const uint8 OPL_PANNING_LEFT = 0x10;
498 static const uint8 OPL_PANNING_RIGHT = 0x20;
539 uint8 channelPressure;
549 uint8 pitchBendSensitivity;
550 uint8 pitchBendSensitivityCents;
551 uint16 masterTuningFine;
552 uint8 masterTuningCoarse;
715 void send(int8 source, uint32 b)
override;
716 void sysEx(
const byte *msg, uint16 length)
override;
717 void metaEvent(int8 source,
byte type,
const byte *data, uint16 length)
override;
739 virtual void noteOff(uint8 channel, uint8 note, uint8 velocity, uint8 source);
748 virtual void noteOn(uint8 channel, uint8 note, uint8 velocity, uint8 source);
759 virtual void polyAftertouch(uint8 channel, uint8 note, uint8 pressure, uint8 source);
769 virtual void controlChange(uint8 channel, uint8 controller, uint8 value, uint8 source);
798 virtual void pitchBend(uint8 channel, uint8 pitchBendLsb, uint8 pitchBendMsb, uint8 source);
823 virtual void dataEntry(uint8 channel, uint8 dataMsb, uint8 dataLsb, uint8 source);
1159 void writeKeyOff(uint8 oplChannel, OplInstrumentRhythmType rhythmType = RHYTHM_TYPE_UNDEFINED,
bool forceWrite =
false);
1179 virtual void writeVolume(uint8 oplChannel, uint8 operatorNum, OplInstrumentRhythmType rhythmType = RHYTHM_TYPE_UNDEFINED);
1190 virtual void writePanning(uint8 oplChannel, OplInstrumentRhythmType rhythmType = RHYTHM_TYPE_UNDEFINED);
1202 virtual void writeFrequency(uint8 oplChannel, OplInstrumentRhythmType rhythmType = RHYTHM_TYPE_UNDEFINED);
1226 int _timerFrequency;
1236 bool _rhythmModeRewriteSharedRegister;
1238 bool _rhythmModeIgnoreNoteOffs;
1244 uint8 _defaultChannelVolume;
1259 uint8 _rhythmBankFirstNote;
1261 uint8 _rhythmBankLastNote;
1274 const uint8 *_melodicChannels;
1276 uint8 _numMelodicChannels;
1278 uint32 _noteCounter;
1282 float _oplFrequencyConversionFactor;
1284 uint8 _shadowRegisters[0x200];
Definition: mididrv.h:541
Definition: adlib_ms.h:295
static const uint8 OPL_NUM_RHYTHM_INSTRUMENTS
Definition: adlib_ms.h:432
virtual void applyControllerDefaults(uint8 source)
void writeInstrument(uint8 oplChannel, InstrumentInfo instrument)
virtual void recalculateFrequencies(uint8 channel, uint8 source)
static const uint8 MELODIC_CHANNELS_OPL2[9]
Definition: adlib_ms.h:413
virtual void writePanning(uint8 oplChannel, OplInstrumentRhythmType rhythmType=RHYTHM_TYPE_UNDEFINED)
virtual uint8 allocateOplChannel(uint8 channel, uint8 source, InstrumentInfo &instrumentInfo)
VibratoDepth
Definition: adlib_ms.h:393
@ VIBRATO_DEPTH_LOW
Definition: adlib_ms.h:397
@ VIBRATO_DEPTH_HIGH
Definition: adlib_ms.h:401
void deinitSource(uint8 source) override
virtual InstrumentInfo determineInstrument(uint8 channel, uint8 source, uint8 note)
void send(int8 source, uint32 b) override
static const uint8 OPL_REGISTER_TEST
Definition: adlib_ms.h:442
MidiChannel * getPercussionChannel() override
virtual void sustain(uint8 channel, uint8 sustain, uint8 source)
static const uint8 OPL_RHYTHM_INSTRUMENT_CHANNELS[OPL_NUM_RHYTHM_INSTRUMENTS]
Definition: adlib_ms.h:437
virtual int32 calculatePitchBend(uint8 channel, uint8 source, uint16 oplFrequency)
uint32 property(int prop, uint32 param) override
static const uint8 OPL_REGISTER_BASE_FNUMLOW
Definition: adlib_ms.h:465
static const uint8 OPL_REGISTER_NOTESELECT_CSM
Definition: adlib_ms.h:450
void determineMelodicChannels()
uint16 determineChannelRegisterOffset(uint8 oplChannel, bool fourOperator=false)
virtual void panning(uint8 channel, uint8 panning, uint8 source)
void writeKeyOff(uint8 oplChannel, OplInstrumentRhythmType rhythmType=RHYTHM_TYPE_UNDEFINED, bool forceWrite=false)
static const OplInstrumentDefinition OPL_INSTRUMENT_BANK[]
Definition: adlib_ms.h:503
uint32 getBaseTempo() override
static const uint8 MELODIC_CHANNELS_OPL2_RHYTHM[6]
Definition: adlib_ms.h:418
virtual void allNotesOff(uint8 channel, uint8 source)
virtual void recalculateVolumes(uint8 channel, uint8 source)
ChannelAllocationMode
Definition: adlib_ms.h:314
@ ALLOCATION_MODE_STATIC
Definition: adlib_ms.h:324
@ ALLOCATION_MODE_DYNAMIC
Definition: adlib_ms.h:319
MidiChannel * allocateChannel() override
virtual void expression(uint8 channel, uint8 expression, uint8 source)
void stopAllNotes(uint8 source, uint8 channel) override
InstrumentWriteMode
Definition: adlib_ms.h:330
@ INSTRUMENT_WRITE_MODE_FIRST_NOTE_ON
Definition: adlib_ms.h:349
@ INSTRUMENT_WRITE_MODE_NOTE_ON
Definition: adlib_ms.h:337
@ INSTRUMENT_WRITE_MODE_PROGRAM_CHANGE
Definition: adlib_ms.h:344
virtual void channelAftertouch(uint8 channel, uint8 pressure, uint8 source)
virtual void pitchBend(uint8 channel, uint8 pitchBendLsb, uint8 pitchBendMsb, uint8 source)
virtual uint8 calculateVolume(uint8 channel, uint8 source, uint8 velocity, const OplInstrumentDefinition &instrumentDef, uint8 operatorNum)
static const uint16 OPL_REGISTER_SET_2_OFFSET
Definition: adlib_ms.h:478
virtual void writeFrequency(uint8 oplChannel, OplInstrumentRhythmType rhythmType=RHYTHM_TYPE_UNDEFINED)
static const uint16 OPL_NOTE_FREQUENCIES[]
Definition: adlib_ms.h:528
static const uint8 OPL_LEVEL_DEFAULT
Definition: adlib_ms.h:513
static const uint8 OPL_PANNING_CENTER
Definition: adlib_ms.h:496
MidiDriver_ADLIB_Multisource(OPL::Config::OplType oplType, int timerFrequency=OPL::OPL::kDefaultCallbackFrequency)
NoteSelectMode
Definition: adlib_ms.h:371
bool isOpen() const override
ModulationDepth
Definition: adlib_ms.h:379
@ MODULATION_DEPTH_LOW
Definition: adlib_ms.h:383
@ MODULATION_DEPTH_HIGH
Definition: adlib_ms.h:387
static const uint8 OPL_VOLUME_LOOKUP[]
Definition: adlib_ms.h:532
virtual void resetAllControllers(uint8 channel, uint8 source)
AccuracyMode
Definition: adlib_ms.h:300
@ ACCURACY_MODE_SB16_WIN95
Definition: adlib_ms.h:304
@ ACCURACY_MODE_GM
Definition: adlib_ms.h:308
RhythmInstrumentMode
Definition: adlib_ms.h:352
@ RHYTHM_INSTRUMENT_MODE_CHANNEL_10
Definition: adlib_ms.h:358
@ RHYTHM_INSTRUMENT_MODE_RHYTHM_TYPE
Definition: adlib_ms.h:365
static const uint8 OPL2_NUM_CHANNELS
Definition: adlib_ms.h:407
virtual void registeredParameterNumber(uint8 channel, uint8 rpnMsb, uint8 rpnLsb, uint8 source)
virtual void writeVolume(uint8 oplChannel, uint8 operatorNum, OplInstrumentRhythmType rhythmType=RHYTHM_TYPE_UNDEFINED)
static const uint8 MELODIC_CHANNELS_OPL3_RHYTHM[15]
Definition: adlib_ms.h:428
void writeRhythm(bool forceWrite=false)
static bool detectOplType(OPL::Config::OplType oplType)
void applySourceVolume(uint8 source) override
void sysEx(const byte *msg, uint16 length) override
virtual void noteOff(uint8 channel, uint8 note, uint8 velocity, uint8 source)
static const uint8 OPL_MIDI_PANNING_RIGHT_LIMIT
Definition: adlib_ms.h:522
virtual void dataEntry(uint8 channel, uint8 dataMsb, uint8 dataLsb, uint8 source)
uint16 determineOperatorRegisterOffset(uint8 oplChannel, uint8 operatorNum, OplInstrumentRhythmType rhythmType=RHYTHM_TYPE_UNDEFINED, bool fourOperator=false)
virtual uint8 calculateUnscaledVolume(uint8 channel, uint8 source, uint8 velocity, const OplInstrumentDefinition &instrumentDef, uint8 operatorNum)
static const uint8 OPL_REGISTER_RHYTHM_OFFSETS[]
Definition: adlib_ms.h:483
static const uint8 OPL_MASK_LEVEL
Definition: adlib_ms.h:488
virtual void volume(uint8 channel, uint8 volume, uint8 source)
void writeRegister(uint16 reg, uint8 value, bool forceWrite=false)
virtual uint16 calculateFrequency(uint8 channel, uint8 source, uint8 note)
static const uint8 MELODIC_CHANNELS_OPL3[18]
Definition: adlib_ms.h:423
virtual void programChange(uint8 channel, uint8 program, uint8 source)
void metaEvent(int8 source, byte type, const byte *data, uint16 length) override
virtual void setRhythmMode(bool rhythmMode)
virtual void polyAftertouch(uint8 channel, uint8 note, uint8 pressure, uint8 source)
static const uint8 OPL_MIDI_PANNING_LEFT_LIMIT
Definition: adlib_ms.h:518
static const uint16 OPL3_REGISTER_CONNECTIONSELECT
Definition: adlib_ms.h:472
virtual void noteOn(uint8 channel, uint8 note, uint8 velocity, uint8 source)
static const uint8 OPL_REGISTER_BASE_FREQMULT_MISC
Definition: adlib_ms.h:456
virtual void allSoundOff(uint8 channel, uint8 source)
virtual void modulation(uint8 channel, uint8 modulation, uint8 source)
virtual uint8 calculatePanning(uint8 channel, uint8 source)
virtual void controlChange(uint8 channel, uint8 controller, uint8 value, uint8 source)
void stopAllNotes(bool stopSustainedNotes=false) override
virtual bool isVolumeApplicableToOperator(const OplInstrumentDefinition &instrumentDef, uint8 operatorNum)
static const OplInstrumentDefinition OPL_RHYTHM_BANK[]
Definition: adlib_ms.h:507
Definition: mididrv_ms.h:86
static const uint8 MAXIMUM_SOURCES
Definition: mididrv_ms.h:92
void send(uint32 b) override
OplType
Definition: fmopl.h:58
@ kDefaultCallbackFrequency
Definition: fmopl.h:161
Definition: adlib_ms.h:189
uint8 waveformSelect0
Definition: adlib_ms.h:208
uint8 rhythmVoiceNumber
Definition: adlib_ms.h:197
void toOplInstrumentDefinition(OplInstrumentDefinition &instrumentDef) const
uint8 instrumentType
Definition: adlib_ms.h:193
AdLibBnkInstrumentOperatorDefinition operator0
Definition: adlib_ms.h:202
Definition: adlib_ms.h:153
void toOplInstrumentOperatorDefinition(OplInstrumentOperatorDefinition &operatorDef, uint8 waveformSelect) const
uint8 keyScalingLevel
Definition: adlib_ms.h:159
Definition: adlib_ms.h:226
int8 transpose
Definition: adlib_ms.h:245
uint8 rhythmType
Definition: adlib_ms.h:241
void toOplInstrumentDefinition(OplInstrumentDefinition &instrumentDef) const
Definition: adlib_ms.h:565
int16 lastWrittenInstrumentId
Definition: adlib_ms.h:627
uint8 instrumentId
Definition: adlib_ms.h:622
uint8 note
Definition: adlib_ms.h:580
uint8 channel
Definition: adlib_ms.h:589
uint8 oplNote
Definition: adlib_ms.h:603
bool noteSustained
Definition: adlib_ms.h:575
uint8 velocity
Definition: adlib_ms.h:584
const OplInstrumentDefinition * instrumentDef
Definition: adlib_ms.h:631
bool channelAllocated
Definition: adlib_ms.h:638
uint8 source
Definition: adlib_ms.h:594
bool noteActive
Definition: adlib_ms.h:570
uint16 oplFrequency
Definition: adlib_ms.h:609
uint32 noteCounterValue
Definition: adlib_ms.h:614
Definition: adlib_ms.h:651
const OplInstrumentDefinition * instrumentDef
Definition: adlib_ms.h:660
uint8 instrumentId
Definition: adlib_ms.h:664
uint8 oplNote
Definition: adlib_ms.h:656
Definition: adlib_ms.h:537
Definition: adlib_ms.h:79
int8 transpose
Definition: adlib_ms.h:122
uint8 connectionFeedback0
Definition: adlib_ms.h:98
uint8 getNumberOfOperators() const
bool fourOperator
Definition: adlib_ms.h:83
const OplInstrumentOperatorDefinition & getOperatorDefinition(uint8 operatorNum) const
uint8 connectionFeedback1
Definition: adlib_ms.h:102
uint8 rhythmNote
Definition: adlib_ms.h:110
OplInstrumentOperatorDefinition operator0
Definition: adlib_ms.h:88
OplInstrumentRhythmType rhythmType
Definition: adlib_ms.h:116
Definition: adlib_ms.h:43
uint8 freqMultMisc
Definition: adlib_ms.h:48
uint8 releaseSustain
Definition: adlib_ms.h:60
uint8 level
Definition: adlib_ms.h:52
uint8 waveformSelect
Definition: adlib_ms.h:64
uint8 decayAttack
Definition: adlib_ms.h:56