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,
135 uint8 getNumberOfOperators()
const;
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" 324 ALLOCATION_MODE_STATIC
349 INSTRUMENT_WRITE_MODE_FIRST_NOTE_ON
365 RHYTHM_INSTRUMENT_MODE_RHYTHM_TYPE
387 MODULATION_DEPTH_HIGH
407 static const uint8 OPL2_NUM_CHANNELS = 9;
408 static const uint8 OPL3_NUM_CHANNELS = 18;
413 static const uint8 MELODIC_CHANNELS_OPL2[9];
418 static const uint8 MELODIC_CHANNELS_OPL2_RHYTHM[6];
423 static const uint8 MELODIC_CHANNELS_OPL3[18];
428 static const uint8 MELODIC_CHANNELS_OPL3_RHYTHM[15];
432 static const uint8 OPL_NUM_RHYTHM_INSTRUMENTS = 5;
437 static const uint8 OPL_RHYTHM_INSTRUMENT_CHANNELS[OPL_NUM_RHYTHM_INSTRUMENTS];
442 static const uint8 OPL_REGISTER_TEST = 0x01;
443 static const uint8 OPL_REGISTER_TIMER1 = 0x02;
444 static const uint8 OPL_REGISTER_TIMER2 = 0x03;
445 static const uint8 OPL_REGISTER_TIMERCONTROL = 0x04;
450 static const uint8 OPL_REGISTER_NOTESELECT_CSM = 0x08;
451 static const uint8 OPL_REGISTER_RHYTHM = 0xBD;
456 static const uint8 OPL_REGISTER_BASE_FREQMULT_MISC = 0x20;
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;
465 static const uint8 OPL_REGISTER_BASE_FNUMLOW = 0xA0;
466 static const uint8 OPL_REGISTER_BASE_FNUMHIGH_BLOCK_KEYON = 0xB0;
467 static const uint8 OPL_REGISTER_BASE_CONNECTION_FEEDBACK_PANNING = 0xC0;
472 static const uint16 OPL3_REGISTER_CONNECTIONSELECT = 0x104;
473 static const uint16 OPL3_REGISTER_NEW = 0x105;
478 static const uint16 OPL_REGISTER_SET_2_OFFSET = 0x100;
483 static const uint8 OPL_REGISTER_RHYTHM_OFFSETS[];
488 static const uint8 OPL_MASK_LEVEL = 0x3F;
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;
496 static const uint8 OPL_PANNING_CENTER = 0x30;
497 static const uint8 OPL_PANNING_LEFT = 0x10;
498 static const uint8 OPL_PANNING_RIGHT = 0x20;
513 static const uint8 OPL_LEVEL_DEFAULT = 0x3F;
518 static const uint8 OPL_MIDI_PANNING_LEFT_LIMIT = 0x2F;
522 static const uint8 OPL_MIDI_PANNING_RIGHT_LIMIT = 0x51;
528 static const uint16 OPL_NOTE_FREQUENCIES[];
532 static const uint8 OPL_VOLUME_LOOKUP[];
539 uint8 channelPressure;
549 uint8 pitchBendSensitivity;
550 uint8 pitchBendSensitivityCents;
551 uint16 masterTuningFine;
552 uint8 masterTuningCoarse;
697 bool isOpen()
const override;
698 void close()
override;
699 uint32 property(
int prop, uint32 param)
override;
700 uint32 getBaseTempo()
override;
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;
718 void stopAllNotes(
bool stopSustainedNotes =
false)
override;
720 void stopAllNotes(uint8 source, uint8 channel)
override;
721 void deinitSource(uint8 source)
override;
724 void applySourceVolume(uint8 source)
override;
729 virtual void initOpl();
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);
777 virtual void programChange(uint8 channel, uint8 program, uint8 source);
787 virtual void channelAftertouch(uint8 channel, uint8 pressure, uint8 source);
798 virtual void pitchBend(uint8 channel, uint8 pitchBendLsb, uint8 pitchBendMsb, uint8 source);
809 virtual void modulation(uint8 channel, uint8 modulation, uint8 source);
823 virtual void dataEntry(uint8 channel, uint8 dataMsb, uint8 dataLsb, uint8 source);
831 virtual void volume(uint8 channel, uint8 volume, uint8 source);
841 virtual void panning(uint8 channel, uint8 panning, uint8 source);
849 virtual void expression(uint8 channel, uint8 expression, uint8 source);
857 virtual void sustain(uint8 channel, uint8 sustain, uint8 source);
872 virtual void registeredParameterNumber(uint8 channel, uint8 rpnMsb, uint8 rpnLsb, uint8 source);
884 virtual void allSoundOff(uint8 channel, uint8 source);
900 virtual void resetAllControllers(uint8 channel, uint8 source);
909 virtual void allNotesOff(uint8 channel, uint8 source);
920 virtual void applyControllerDefaults(uint8 source);
931 virtual void recalculateFrequencies(uint8 channel, uint8 source);
942 virtual void recalculateVolumes(uint8 channel, uint8 source);
956 virtual InstrumentInfo determineInstrument(uint8 channel, uint8 source, uint8 note);
979 virtual uint8 allocateOplChannel(uint8 channel, uint8 source,
InstrumentInfo &instrumentInfo);
987 void determineMelodicChannels();
1008 virtual uint16 calculateFrequency(uint8 channel, uint8 source, uint8 note);
1023 virtual int32 calculatePitchBend(uint8 channel, uint8 source, uint16 oplFrequency);
1046 virtual uint8 calculateVolume(uint8 channel, uint8 source, uint8 velocity,
const OplInstrumentDefinition &instrumentDef, uint8 operatorNum);
1068 virtual uint8 calculateUnscaledVolume(uint8 channel, uint8 source, uint8 velocity,
const OplInstrumentDefinition &instrumentDef, uint8 operatorNum);
1090 virtual uint8 calculatePanning(uint8 channel, uint8 source);
1104 virtual void setRhythmMode(
bool rhythmMode);
1125 uint16 determineOperatorRegisterOffset(uint8 oplChannel, uint8 operatorNum, OplInstrumentRhythmType rhythmType = RHYTHM_TYPE_UNDEFINED,
bool fourOperator =
false);
1136 uint16 determineChannelRegisterOffset(uint8 oplChannel,
bool fourOperator =
false);
1144 void writeInstrument(uint8 oplChannel,
InstrumentInfo instrument);
1159 void writeKeyOff(uint8 oplChannel, OplInstrumentRhythmType rhythmType = RHYTHM_TYPE_UNDEFINED,
bool forceWrite =
false);
1165 void writeRhythm(
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);
1216 void writeRegister(uint16 reg, uint8 value,
bool forceWrite =
false);
1226 int _timerFrequency;
1236 bool _rhythmModeRewriteSharedRegister;
1238 bool _rhythmModeIgnoreNoteOffs;
1244 uint8 _defaultChannelVolume;
1259 uint8 _rhythmBankFirstNote;
1261 uint8 _rhythmBankLastNote;
1272 uint8 _channelAllocations[MAXIMUM_SOURCES][MIDI_CHANNEL_COUNT];
1274 const uint8 *_melodicChannels;
1276 uint8 _numMelodicChannels;
1278 uint32 _noteCounter;
1282 float _oplFrequencyConversionFactor;
1284 uint8 _shadowRegisters[0x200];
int8 transpose
Definition: adlib_ms.h:245
uint8 keyScalingLevel
Definition: adlib_ms.h:159
uint8 oplNote
Definition: adlib_ms.h:603
uint8 connectionFeedback1
Definition: adlib_ms.h:102
uint8 instrumentType
Definition: adlib_ms.h:193
int16 lastWrittenInstrumentId
Definition: adlib_ms.h:627
AccuracyMode
Definition: adlib_ms.h:300
Definition: mididrv_ms.h:86
uint8 note
Definition: adlib_ms.h:580
const OplInstrumentDefinition * instrumentDef
Definition: adlib_ms.h:631
OplInstrumentOperatorDefinition operator0
Definition: adlib_ms.h:88
uint8 oplNote
Definition: adlib_ms.h:656
uint8 rhythmVoiceNumber
Definition: adlib_ms.h:197
Definition: adlib_ms.h:358
Definition: adlib_ms.h:153
Definition: adlib_ms.h:189
uint8 instrumentId
Definition: adlib_ms.h:622
Definition: adlib_ms.h:565
Definition: adlib_ms.h:397
uint8 rhythmNote
Definition: adlib_ms.h:110
Definition: adlib_ms.h:651
Definition: adlib_ms.h:295
uint8 instrumentId
Definition: adlib_ms.h:664
uint8 waveformSelect0
Definition: adlib_ms.h:208
Definition: adlib_ms.h:337
uint8 connectionFeedback0
Definition: adlib_ms.h:98
const OplInstrumentDefinition * instrumentDef
Definition: adlib_ms.h:660
RhythmInstrumentMode
Definition: adlib_ms.h:352
uint8 rhythmType
Definition: adlib_ms.h:241
uint8 decayAttack
Definition: adlib_ms.h:56
uint8 level
Definition: adlib_ms.h:52
Definition: adlib_ms.h:304
Definition: adlib_ms.h:383
OplType
Definition: fmopl.h:58
OplInstrumentRhythmType rhythmType
Definition: adlib_ms.h:116
uint32 noteCounterValue
Definition: adlib_ms.h:614
NoteSelectMode
Definition: adlib_ms.h:371
Definition: adlib_ms.h:344
uint8 channel
Definition: adlib_ms.h:589
Definition: adlib_ms.h:537
InstrumentWriteMode
Definition: adlib_ms.h:330
uint8 freqMultMisc
Definition: adlib_ms.h:48
uint8 waveformSelect
Definition: adlib_ms.h:64
ChannelAllocationMode
Definition: adlib_ms.h:314
bool noteSustained
Definition: adlib_ms.h:575
Definition: mididrv.h:539
Definition: adlib_ms.h:226
Definition: adlib_ms.h:319
void send(uint32 b) override
uint8 releaseSustain
Definition: adlib_ms.h:60
uint8 velocity
Definition: adlib_ms.h:584
int8 transpose
Definition: adlib_ms.h:122
VibratoDepth
Definition: adlib_ms.h:393
uint16 oplFrequency
Definition: adlib_ms.h:609
bool channelAllocated
Definition: adlib_ms.h:638
bool fourOperator
Definition: adlib_ms.h:83
Definition: adlib_ms.h:79
AdLibBnkInstrumentOperatorDefinition operator0
Definition: adlib_ms.h:202
ModulationDepth
Definition: adlib_ms.h:379
Definition: adlib_ms.h:43
bool noteActive
Definition: adlib_ms.h:570
uint8 source
Definition: adlib_ms.h:594