#define OPM_CLOCK 4000000L // X1 & X68000 OPM 4MHz
#define OPMCH_MAX 8
enum {
FMDIV_BITS = 9,
FMDIV_ENT = (1 << FMDIV_BITS),
FMVOL_SFTBIT = 5
};
#if !defined(_WIN32_WCE)
#define SIN_BITS 10
#define EVC_BITS 10
#else
#define SIN_BITS 8
#define EVC_BITS 7
#endif
#define ENV_BITS 16
#define KF_BITS 6
#define FREQ_BITS 20
#define ENVTBL_BIT 14
#define SINTBL_BIT 14
#define TL_BITS (FREQ_BITS + 2)
#define OPM_OUTSB (TL_BITS + 2 - 16) // OPM output 16bit
#define SIN_ENT (1 << SIN_BITS)
#define EVC_ENT (1 << EVC_BITS)
#define EC_ATTACK 0 // ATTACK start
#define EC_DECAY (EVC_ENT << ENV_BITS) // DECAY start
#define EC_OFF ((2 * EVC_ENT) << ENV_BITS) // OFF
#define TL_MAX (EVC_ENT * 2)
enum {
OPMSLOT1 = 0,
OPMSLOT2 = 2,
OPMSLOT3 = 1,
OPMSLOT4 = 3,
EM_ATTACK = 4,
EM_DECAY1 = 3,
EM_DECAY2 = 2,
EM_RELEASE = 1,
EM_OFF = 0
};
typedef struct {
SINT32 *detune1; // detune1
SINT32 detune2; // detune2
SINT32 totallevel; // total level
SINT32 decaylevel; // decay level
const SINT32 *attack; // attack ratio
const SINT32 *decay1; // decay1 ratio
const SINT32 *decay2; // decay2 ratio
const SINT32 *release; // release ratio
SINT32 freq_cnt; // frequency count
SINT32 freq_inc; // frequency step
UINT8 keyscale; // key scale
UINT8 multiple; // multiple
UINT8 env_mode; // envelope mode
UINT8 envratio; // envelope raito
SINT32 env_cnt; // envelope count
SINT32 env_end; // envelope end count
SINT32 env_inc; // envelope step
SINT32 env_inc_attack; // envelope attack step
SINT32 env_inc_decay1; // envelope decay1 step
SINT32 env_inc_decay2; // envelope decay2 step
SINT32 env_inc_release; // envelope release step
} OPMSLOT;
typedef struct {
OPMSLOT slot[4];
UINT8 algorithm; // algorythm
UINT8 feedback; // self feedback
UINT8 playing;
UINT8 outslot;
SINT32 op1fb; // operator1 feedback
SINT32 *connect1; // operator1 connect
SINT32 *connect3; // operator3 connect
SINT32 *connect2; // operator2 connect
SINT32 *connect4; // operator4 connect
UINT32 keynote; // key note
UINT8 keyfunc; // key function
UINT8 kcode; // key code
UINT8 pan; // pan
UINT8 padding;
} OPMCH;
typedef struct {
UINT playing;
UINT8 mode;
UINT8 padding[3];
SINT32 feedback2;
SINT32 feedback3;
SINT32 feedback4;
SINT32 outdl;
SINT32 outdc;
SINT32 outdr;
SINT32 calcremain;
UINT8 keyreg[OPMCH_MAX];
} _OPMGEN, *OPMGEN;
typedef struct {
SINT32 calc1024;
SINT32 fmvol;
SINT32 sintable[SIN_ENT];
SINT32 envtable[EVC_ENT];
SINT32 envcurve[(EVC_ENT * 2) + 1];
} OPMCFG;
#ifdef __cplusplus
extern "C" {
#endif
void opmgen_initialize(UINT rate);
void opmgen_setvol(UINT vol);
void opmgen_reset(void);
void opmgen_setreg(REG8 reg, REG8 value);
void SOUNDCALL opmgen_getpcm(void *hdl, SINT32 *pcm, UINT count);
#ifdef __cplusplus
}
#endif
RetroPC.NET-CVS <cvs@retropc.net>