6 /* --- system optimize --- */
7 /* select bit size of output : 8 or 16 */
8 #define OPL_OUTPUT_BIT 16
10 /* compiler dependence */
13 typedef signed char INT8
; /* signed 8bit */
14 typedef signed short INT16
; /* signed 16bit */
15 typedef signed int INT32
; /* signed 32bit */
18 #if (OPL_OUTPUT_BIT==16)
19 typedef INT16 OPLSAMPLE
;
21 #if (OPL_OUTPUT_BIT==8)
22 typedef unsigned char OPLSAMPLE
;
25 typedef void (*OPL_TIMERHANDLER
)(int channel
,double interval_Sec
);
26 typedef void (*OPL_IRQHANDLER
)(int param
,int irq
);
27 typedef void (*OPL_UPDATEHANDLER
)(int param
,int min_interval_us
);
28 typedef void (*OPL_PORTHANDLER_W
)(int param
,unsigned char data
);
29 typedef unsigned char (*OPL_PORTHANDLER_R
)(int param
);
31 /* !!!!! here is private section , do not access there member direct !!!!! */
33 #define OPL_TYPE_WAVESEL 0x01 /* waveform select */
34 #define OPL_TYPE_ADPCM 0x02 /* DELTA-T ADPCM unit */
35 #define OPL_TYPE_KEYBOARD 0x04 /* keyboard interface */
36 #define OPL_TYPE_IO 0x08 /* I/O port */
38 /* Saving is necessary for member of the 'R' mark for suspend/resume */
39 /* ---------- OPL one of slot ---------- */
40 typedef struct fm_opl_slot
{
41 INT32 TL
; /* total level :TL << 8 */
42 INT32 TLL
; /* adjusted now TL */
43 uint8_t KSR
; /* key scale rate :(shift down bit) */
44 INT32
*AR
; /* attack rate :&AR_TABLE[AR<<2] */
45 INT32
*DR
; /* decay rate :&DR_TALBE[DR<<2] */
46 INT32 SL
; /* sustin level :SL_TALBE[SL] */
47 INT32
*RR
; /* release rate :&DR_TABLE[RR<<2] */
48 uint8_t ksl
; /* keyscale level :(shift down bits) */
49 uint8_t ksr
; /* key scale rate :kcode>>KSR */
50 uint32_t mul
; /* multiple :ML_TABLE[ML] */
51 uint32_t Cnt
; /* frequency count : */
52 uint32_t Incr
; /* frequency step : */
53 /* envelope generator state */
54 uint8_t eg_typ
; /* envelope type flag */
55 uint8_t evm
; /* envelope phase */
56 INT32 evc
; /* envelope counter */
57 INT32 eve
; /* envelope counter end point */
58 INT32 evs
; /* envelope counter step */
59 INT32 evsa
; /* envelope step for AR :AR[ksr] */
60 INT32 evsd
; /* envelope step for DR :DR[ksr] */
61 INT32 evsr
; /* envelope step for RR :RR[ksr] */
63 uint8_t ams
; /* ams flag */
64 uint8_t vib
; /* vibrate flag */
69 /* ---------- OPL one of channel ---------- */
70 typedef struct fm_opl_channel
{
72 uint8_t CON
; /* connection type */
73 uint8_t FB
; /* feed back :(shift down bit) */
74 INT32
*connect1
; /* slot1 output pointer */
75 INT32
*connect2
; /* slot2 output pointer */
76 INT32 op1_out
[2]; /* slot1 output for selfeedback */
77 /* phase generator state */
78 uint32_t block_fnum
; /* block+fnum : */
79 uint8_t kcode
; /* key code : KeyScaleCode */
80 uint32_t fc
; /* Freq. Increment base */
81 uint32_t ksl_base
; /* KeyScaleLevel Base step */
82 uint8_t keyon
; /* key on/off flag */
86 typedef struct fm_opl_f
{
87 uint8_t type
; /* chip type */
88 int clock
; /* master clock (Hz) */
89 int rate
; /* sampling rate (Hz) */
90 double freqbase
; /* frequency base */
91 double TimerBase
; /* Timer base time (==sampling time) */
92 uint8_t address
; /* address register */
93 uint8_t status
; /* status flag */
94 uint8_t statusmask
; /* status mask */
95 uint32_t mode
; /* Reg.08 : CSM , notesel,etc. */
97 int T
[2]; /* timer counter */
98 uint8_t st
[2]; /* timer enable */
99 /* FM channel slots */
100 OPL_CH
*P_CH
; /* pointer of CH */
101 int max_ch
; /* maximum channel */
103 uint8_t rhythm
; /* Rhythm mode , key flag */
104 OPL_PORTHANDLER_R porthandler_r
;
105 OPL_PORTHANDLER_W porthandler_w
;
107 OPL_PORTHANDLER_R keyboardhandler_r
;
108 OPL_PORTHANDLER_W keyboardhandler_w
;
111 INT32 AR_TABLE
[75]; /* atttack rate tables */
112 INT32 DR_TABLE
[75]; /* decay rate tables */
113 uint32_t FN_TABLE
[1024]; /* fnumber -> increment counter */
121 /* wave selector enable flag */
123 /* external event callback handler */
124 OPL_TIMERHANDLER TimerHandler
; /* TIMER handler */
125 int TimerParam
; /* TIMER parameter */
126 OPL_IRQHANDLER IRQHandler
; /* IRQ handler */
127 int IRQParam
; /* IRQ parameter */
128 OPL_UPDATEHANDLER UpdateHandler
; /* stream update handler */
129 int UpdateParam
; /* stream update parameter */
132 /* ---------- Generic interface section ---------- */
133 #define OPL_TYPE_YM3812 (OPL_TYPE_WAVESEL)
135 FM_OPL
*OPLCreate(int type
, int clock
, int rate
);
136 void OPLDestroy(FM_OPL
*OPL
);
137 void OPLSetTimerHandler(FM_OPL
*OPL
,OPL_TIMERHANDLER TimerHandler
,int channelOffset
);
138 void OPLSetIRQHandler(FM_OPL
*OPL
,OPL_IRQHANDLER IRQHandler
,int param
);
139 void OPLSetUpdateHandler(FM_OPL
*OPL
,OPL_UPDATEHANDLER UpdateHandler
,int param
);
141 void OPLResetChip(FM_OPL
*OPL
);
142 int OPLWrite(FM_OPL
*OPL
,int a
,int v
);
143 unsigned char OPLRead(FM_OPL
*OPL
,int a
);
144 int OPLTimerOver(FM_OPL
*OPL
,int c
);
146 void YM3812UpdateOne(FM_OPL
*OPL
, INT16
*buffer
, int length
);