123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- #if defined(_MSC_VER) && _MSC_VER <= 1600
- #include <windows.h>
- #define uintptr_t ULONG_PTR
- #define intptr_t LONG_PTR
- #define uint32_t DWORD
- #define int32_t INT
- #define uint16_t WORD
- #define int16_t SHORT
- #define uint8_t BYTE
- #define int8_t CHAR
- #else
- #include <stdint.h>
- #endif
- typedef uintptr_t Bitu;
- typedef intptr_t Bits;
- typedef uint32_t Bit32u;
- typedef int32_t Bit32s;
- typedef uint16_t Bit16u;
- typedef int16_t Bit16s;
- typedef uint8_t Bit8u;
- typedef int8_t Bit8s;
- #define OPL_INLINE inline
- #define GCC_UNLIKELY(x) (x)
- #define WAVE_HANDLER 10
- #define WAVE_TABLELOG 11
- #define WAVE_TABLEMUL 12
- #define DBOPL_WAVE WAVE_TABLEMUL
- namespace DBOPL {
- struct Chip;
- struct Operator;
- struct Channel;
- #if (DBOPL_WAVE == WAVE_HANDLER)
- typedef Bits(DB_FASTCALL *WaveHandler) (Bitu i, Bitu volume);
- #endif
- typedef Bits(DBOPL::Operator::*VolumeHandler) ();
- typedef Channel* (DBOPL::Channel::*SynthHandler) (Chip* chip, Bit32u samples, Bit32s* output);
-
- typedef enum {
- sm2AM,
- sm2FM,
- sm3AM,
- sm3FM,
- sm4Start,
- sm3FMFM,
- sm3AMFM,
- sm3FMAM,
- sm3AMAM,
- sm6Start,
- sm2Percussion,
- sm3Percussion,
- } SynthMode;
-
- enum {
- SHIFT_KSLBASE = 16,
- SHIFT_KEYCODE = 24,
- };
- struct Operator {
- public:
-
- enum {
- MASK_KSR = 0x10,
- MASK_SUSTAIN = 0x20,
- MASK_VIBRATO = 0x40,
- MASK_TREMOLO = 0x80,
- };
- typedef enum {
- OFF,
- RELEASE,
- SUSTAIN,
- DECAY,
- ATTACK,
- } State;
- VolumeHandler volHandler;
- #if (DBOPL_WAVE == WAVE_HANDLER)
- WaveHandler waveHandler;
- #else
- Bit16s* waveBase;
- Bit32u waveMask;
- Bit32u waveStart;
- #endif
- Bit32u waveIndex;
- Bit32u waveAdd;
- Bit32u waveCurrent;
- Bit32u chanData;
- Bit32u freqMul;
- Bit32u vibrato;
- Bit32s sustainLevel;
- Bit32s totalLevel;
- Bit32u currentLevel;
- Bit32s volume;
- Bit32u attackAdd;
- Bit32u decayAdd;
- Bit32u releaseAdd;
- Bit32u rateIndex;
- Bit8u rateZero;
- Bit8u keyOn;
-
- Bit8u reg20, reg40, reg60, reg80, regE0;
-
- Bit8u state;
-
- Bit8u tremoloMask;
-
- Bit8u vibStrength;
-
- Bit8u ksr;
- private:
- void SetState(Bit8u s);
- void UpdateAttack(const Chip* chip);
- void UpdateRelease(const Chip* chip);
- void UpdateDecay(const Chip* chip);
- public:
- void UpdateAttenuation();
- void UpdateRates(const Chip* chip);
- void UpdateFrequency();
- void Write20(const Chip* chip, Bit8u val);
- void Write40(const Chip* chip, Bit8u val);
- void Write60(const Chip* chip, Bit8u val);
- void Write80(const Chip* chip, Bit8u val);
- void WriteE0(const Chip* chip, Bit8u val);
- bool Silent() const;
- void Prepare(const Chip* chip);
- void KeyOn(Bit8u mask);
- void KeyOff(Bit8u mask);
- template< State state>
- Bits TemplateVolume();
- Bit32s RateForward(Bit32u add);
- Bitu ForwardWave();
- Bitu ForwardVolume();
- Bits GetSample(Bits modulation);
- Bits GetWave(Bitu index, Bitu vol);
- public:
- Operator();
- };
- struct Channel {
- Operator op[2];
- inline Operator* Op(Bitu index) {
- return &((this + (index >> 1))->op[index & 1]);
- }
- SynthHandler synthHandler;
- Bit32u chanData;
- Bit32s old[2];
- Bit8u feedback;
- Bit8u regB0;
- Bit8u regC0;
-
- Bit8u fourMask;
- Bit8s maskLeft;
- Bit8s maskRight;
-
- void SetChanData(const Chip* chip, Bit32u data);
-
- void UpdateFrequency(const Chip* chip, Bit8u fourOp);
- void WriteA0(const Chip* chip, Bit8u val);
- void WriteB0(const Chip* chip, Bit8u val);
- void WriteC0(const Chip* chip, Bit8u val);
- void ResetC0(const Chip* chip);
-
- template< bool opl3Mode >
- void GeneratePercussion(Chip* chip, Bit32s* output);
-
- template<SynthMode mode>
- Channel* BlockTemplate(Chip* chip, Bit32u samples, Bit32s* output);
- Channel();
- };
- struct Chip {
-
- Bit32u lfoCounter;
- Bit32u lfoAdd;
- Bit32u noiseCounter;
- Bit32u noiseAdd;
- Bit32u noiseValue;
-
- Bit32u freqMul[16];
-
- Bit32u linearRates[76];
-
- Bit32u attackRates[76];
-
- Channel chan[18];
- Bit8u reg104;
- Bit8u reg08;
- Bit8u reg04;
- Bit8u regBD;
- Bit8u vibratoIndex;
- Bit8u tremoloIndex;
- Bit8s vibratoSign;
- Bit8u vibratoShift;
- Bit8u tremoloValue;
- Bit8u vibratoStrength;
- Bit8u tremoloStrength;
-
- Bit8u waveFormMask;
-
- Bit8s opl3Active;
-
- Bit32u ForwardLFO(Bit32u samples);
- Bit32u ForwardNoise();
- void WriteBD(Bit8u val);
- void WriteReg(Bit32u reg, Bit8u val);
- Bit32u WriteAddr(Bit32u port, Bit8u val);
- void GenerateBlock2(Bitu samples, Bit32s* output);
- void GenerateBlock3(Bitu samples, Bit32s* output);
-
- void Setup(Bit32u r);
- Chip();
- };
- bool InitTables(void);
- };
|