22 #ifndef AUDIO_ADLIB_MS_H 23 #define AUDIO_ADLIB_MS_H 25 #include "audio/mididrv_ms.h" 26 #include "audio/fmopl.h" 31 enum OplInstrumentRhythmType {
32 RHYTHM_TYPE_UNDEFINED,
36 RHYTHM_TYPE_SNARE_DRUM,
129 uint8 getNumberOfOperators()
const;
141 #include "common/pack-start.h" 154 uint8 frequencyMultiplier;
158 uint8 envelopeGainType;
162 uint8 amplitudeModulation;
164 uint8 keyScalingRate;
203 uint8 waveformSelect1;
221 uint8 o0FreqMultMisc;
222 uint8 o1FreqMultMisc;
227 uint8 o0ReleaseSustain;
228 uint8 o1ReleaseSustain;
229 uint8 o0WaveformSelect;
230 uint8 o1WaveformSelect;
231 uint8 connectionFeedback;
254 #include "common/pack-end.h" 318 ALLOCATION_MODE_STATIC
343 INSTRUMENT_WRITE_MODE_FIRST_NOTE_ON
359 RHYTHM_INSTRUMENT_MODE_RHYTHM_TYPE
381 MODULATION_DEPTH_HIGH
401 static const uint8 OPL2_NUM_CHANNELS = 9;
402 static const uint8 OPL3_NUM_CHANNELS = 18;
407 static const uint8 MELODIC_CHANNELS_OPL2[9];
412 static const uint8 MELODIC_CHANNELS_OPL2_RHYTHM[6];
417 static const uint8 MELODIC_CHANNELS_OPL3[18];
422 static const uint8 MELODIC_CHANNELS_OPL3_RHYTHM[15];
426 static const uint8 OPL_NUM_RHYTHM_INSTRUMENTS = 5;
431 static const uint8 OPL_RHYTHM_INSTRUMENT_CHANNELS[OPL_NUM_RHYTHM_INSTRUMENTS];
436 static const uint8 OPL_REGISTER_TEST = 0x01;
437 static const uint8 OPL_REGISTER_TIMER1 = 0x02;
438 static const uint8 OPL_REGISTER_TIMER2 = 0x03;
439 static const uint8 OPL_REGISTER_TIMERCONTROL = 0x04;
444 static const uint8 OPL_REGISTER_NOTESELECT_CSM = 0x08;
445 static const uint8 OPL_REGISTER_RHYTHM = 0xBD;
450 static const uint8 OPL_REGISTER_BASE_FREQMULT_MISC = 0x20;
451 static const uint8 OPL_REGISTER_BASE_LEVEL = 0x40;
452 static const uint8 OPL_REGISTER_BASE_DECAY_ATTACK = 0x60;
453 static const uint8 OPL_REGISTER_BASE_RELEASE_SUSTAIN = 0x80;
454 static const uint8 OPL_REGISTER_BASE_WAVEFORMSELECT = 0xE0;
459 static const uint8 OPL_REGISTER_BASE_FNUMLOW = 0xA0;
460 static const uint8 OPL_REGISTER_BASE_FNUMHIGH_BLOCK_KEYON = 0xB0;
461 static const uint8 OPL_REGISTER_BASE_CONNECTION_FEEDBACK_PANNING = 0xC0;
466 static const uint16 OPL3_REGISTER_CONNECTIONSELECT = 0x104;
467 static const uint16 OPL3_REGISTER_NEW = 0x105;
472 static const uint16 OPL_REGISTER_SET_2_OFFSET = 0x100;
477 static const uint8 OPL_REGISTER_RHYTHM_OFFSETS[];
482 static const uint8 OPL_MASK_LEVEL = 0x3F;
483 static const uint8 OPL_MASK_FNUMHIGH_BLOCK = 0x1F;
484 static const uint8 OPL_MASK_KEYON = 0x20;
485 static const uint8 OPL_MASK_PANNING = 0x30;
490 static const uint8 OPL_PANNING_CENTER = 0x30;
491 static const uint8 OPL_PANNING_LEFT = 0x10;
492 static const uint8 OPL_PANNING_RIGHT = 0x20;
507 static const uint8 OPL_LEVEL_DEFAULT = 0x3F;
512 static const uint8 OPL_MIDI_PANNING_LEFT_LIMIT = 0x2F;
516 static const uint8 OPL_MIDI_PANNING_RIGHT_LIMIT = 0x51;
522 static const uint16 OPL_NOTE_FREQUENCIES[];
526 static const uint8 OPL_VOLUME_LOOKUP[];
533 uint8 channelPressure;
543 uint8 pitchBendSensitivity;
544 uint8 pitchBendSensitivityCents;
545 uint16 masterTuningFine;
546 uint8 masterTuningCoarse;
691 bool isOpen()
const override;
692 void close()
override;
693 uint32 property(
int prop, uint32 param)
override;
694 uint32 getBaseTempo()
override;
709 void send(int8 source, uint32 b)
override;
710 void sysEx(
const byte *msg, uint16 length)
override;
711 void metaEvent(int8 source, byte type, byte *data, uint16 length)
override;
712 void stopAllNotes(
bool stopSustainedNotes =
false)
override;
714 void stopAllNotes(uint8 source, uint8 channel)
override;
715 void deinitSource(uint8 source)
override;
718 void applySourceVolume(uint8 source)
override;
723 virtual void initOpl();
733 virtual void noteOff(uint8 channel, uint8 note, uint8 velocity, uint8 source);
742 virtual void noteOn(uint8 channel, uint8 note, uint8 velocity, uint8 source);
753 virtual void polyAftertouch(uint8 channel, uint8 note, uint8 pressure, uint8 source);
763 virtual void controlChange(uint8 channel, uint8 controller, uint8 value, uint8 source);
771 virtual void programChange(uint8 channel, uint8 program, uint8 source);
781 virtual void channelAftertouch(uint8 channel, uint8 pressure, uint8 source);
792 virtual void pitchBend(uint8 channel, uint8 pitchBendLsb, uint8 pitchBendMsb, uint8 source);
803 virtual void modulation(uint8 channel, uint8 modulation, uint8 source);
817 virtual void dataEntry(uint8 channel, uint8 dataMsb, uint8 dataLsb, uint8 source);
825 virtual void volume(uint8 channel, uint8 volume, uint8 source);
835 virtual void panning(uint8 channel, uint8 panning, uint8 source);
843 virtual void expression(uint8 channel, uint8 expression, uint8 source);
851 virtual void sustain(uint8 channel, uint8 sustain, uint8 source);
866 virtual void registeredParameterNumber(uint8 channel, uint8 rpnMsb, uint8 rpnLsb, uint8 source);
878 virtual void allSoundOff(uint8 channel, uint8 source);
894 virtual void resetAllControllers(uint8 channel, uint8 source);
903 virtual void allNotesOff(uint8 channel, uint8 source);
914 virtual void applyControllerDefaults(uint8 source);
925 virtual void recalculateFrequencies(uint8 channel, uint8 source);
936 virtual void recalculateVolumes(uint8 channel, uint8 source);
950 virtual InstrumentInfo determineInstrument(uint8 channel, uint8 source, uint8 note);
973 virtual uint8 allocateOplChannel(uint8 channel, uint8 source,
InstrumentInfo &instrumentInfo);
981 void determineMelodicChannels();
1001 virtual uint16 calculateFrequency(uint8 channel, uint8 source, uint8 note);
1016 virtual int32 calculatePitchBend(uint8 channel, uint8 source, uint16 oplFrequency);
1039 virtual uint8 calculateVolume(uint8 channel, uint8 source, uint8 velocity,
const OplInstrumentDefinition &instrumentDef, uint8 operatorNum);
1061 virtual uint8 calculateUnscaledVolume(uint8 channel, uint8 source, uint8 velocity,
const OplInstrumentDefinition &instrumentDef, uint8 operatorNum);
1083 virtual uint8 calculatePanning(uint8 channel, uint8 source);
1097 virtual void setRhythmMode(
bool rhythmMode);
1118 uint16 determineOperatorRegisterOffset(uint8 oplChannel, uint8 operatorNum, OplInstrumentRhythmType rhythmType = RHYTHM_TYPE_UNDEFINED,
bool fourOperator =
false);
1129 uint16 determineChannelRegisterOffset(uint8 oplChannel,
bool fourOperator =
false);
1137 void writeInstrument(uint8 oplChannel,
InstrumentInfo instrument);
1152 void writeKeyOff(uint8 oplChannel, OplInstrumentRhythmType rhythmType = RHYTHM_TYPE_UNDEFINED,
bool forceWrite =
false);
1158 void writeRhythm(
bool forceWrite =
false);
1172 virtual void writeVolume(uint8 oplChannel, uint8 operatorNum, OplInstrumentRhythmType rhythmType = RHYTHM_TYPE_UNDEFINED);
1183 virtual void writePanning(uint8 oplChannel, OplInstrumentRhythmType rhythmType = RHYTHM_TYPE_UNDEFINED);
1195 virtual void writeFrequency(uint8 oplChannel, OplInstrumentRhythmType rhythmType = RHYTHM_TYPE_UNDEFINED);
1209 void writeRegister(uint16 reg, uint8 value,
bool forceWrite =
false);
1219 int _timerFrequency;
1229 bool _rhythmModeRewriteSharedRegister;
1231 bool _rhythmModeIgnoreNoteOffs;
1237 uint8 _defaultChannelVolume;
1252 uint8 _rhythmBankFirstNote;
1254 uint8 _rhythmBankLastNote;
1265 uint8 _channelAllocations[MAXIMUM_SOURCES][MIDI_CHANNEL_COUNT];
1267 const uint8 *_melodicChannels;
1269 uint8 _numMelodicChannels;
1271 uint32 _noteCounter;
1275 float _oplFrequencyConversionFactor;
1277 uint8 _shadowRegisters[0x200];
int8 transpose
Definition: adlib_ms.h:239
uint8 keyScalingLevel
Definition: adlib_ms.h:153
uint8 oplNote
Definition: adlib_ms.h:597
uint8 connectionFeedback1
Definition: adlib_ms.h:102
uint8 instrumentType
Definition: adlib_ms.h:187
int16 lastWrittenInstrumentId
Definition: adlib_ms.h:621
AccuracyMode
Definition: adlib_ms.h:294
Definition: mididrv_ms.h:86
uint8 note
Definition: adlib_ms.h:574
const OplInstrumentDefinition * instrumentDef
Definition: adlib_ms.h:625
OplInstrumentOperatorDefinition operator0
Definition: adlib_ms.h:88
uint8 oplNote
Definition: adlib_ms.h:650
uint8 rhythmVoiceNumber
Definition: adlib_ms.h:191
Definition: adlib_ms.h:352
Definition: adlib_ms.h:147
Definition: adlib_ms.h:183
uint8 instrumentId
Definition: adlib_ms.h:616
Definition: adlib_ms.h:559
Definition: adlib_ms.h:391
uint8 rhythmNote
Definition: adlib_ms.h:110
Definition: adlib_ms.h:645
Definition: adlib_ms.h:289
uint8 instrumentId
Definition: adlib_ms.h:658
uint8 waveformSelect0
Definition: adlib_ms.h:202
Definition: adlib_ms.h:331
uint8 connectionFeedback0
Definition: adlib_ms.h:98
const OplInstrumentDefinition * instrumentDef
Definition: adlib_ms.h:654
RhythmInstrumentMode
Definition: adlib_ms.h:346
uint8 rhythmType
Definition: adlib_ms.h:235
uint8 decayAttack
Definition: adlib_ms.h:56
uint8 level
Definition: adlib_ms.h:52
Definition: adlib_ms.h:298
Definition: adlib_ms.h:377
OplType
Definition: fmopl.h:58
OplInstrumentRhythmType rhythmType
Definition: adlib_ms.h:116
uint32 noteCounterValue
Definition: adlib_ms.h:608
NoteSelectMode
Definition: adlib_ms.h:365
Definition: adlib_ms.h:338
uint8 channel
Definition: adlib_ms.h:583
Definition: adlib_ms.h:531
InstrumentWriteMode
Definition: adlib_ms.h:324
uint8 freqMultMisc
Definition: adlib_ms.h:48
uint8 waveformSelect
Definition: adlib_ms.h:64
ChannelAllocationMode
Definition: adlib_ms.h:308
bool noteSustained
Definition: adlib_ms.h:569
Definition: mididrv.h:537
Definition: adlib_ms.h:220
Definition: adlib_ms.h:313
void send(uint32 b) override
uint8 releaseSustain
Definition: adlib_ms.h:60
uint8 velocity
Definition: adlib_ms.h:578
VibratoDepth
Definition: adlib_ms.h:387
uint16 oplFrequency
Definition: adlib_ms.h:603
bool channelAllocated
Definition: adlib_ms.h:632
bool fourOperator
Definition: adlib_ms.h:83
Definition: adlib_ms.h:79
AdLibBnkInstrumentOperatorDefinition operator0
Definition: adlib_ms.h:196
ModulationDepth
Definition: adlib_ms.h:373
Definition: adlib_ms.h:43
bool noteActive
Definition: adlib_ms.h:564
uint8 source
Definition: adlib_ms.h:588