00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef FMOPL_H
00026 #define FMOPL_H
00027
00028 #ifdef USE_FMOPL_MIDI
00029
00030 #include "common_types.h"
00031
00032 typedef void (*OPL_TIMERHANDLER)(int channel,double interval_Sec);
00033 typedef void (*OPL_IRQHANDLER)(int param,int irq);
00034 typedef void (*OPL_UPDATEHANDLER)(int param,int min_interval_us);
00035
00036 #define OPL_TYPE_WAVESEL 0x01
00037
00038
00039
00040 typedef struct fm_opl_slot {
00041 int TL;
00042 int TLL;
00043 uint8 KSR;
00044 int *AR;
00045 int *DR;
00046 int SL;
00047 int *RR;
00048 uint8 ksl;
00049 uint8 ksr;
00050 uint32 mul;
00051 uint32 Cnt;
00052 uint32 Incr;
00053
00054
00055 uint8 eg_typ;
00056 uint8 evm;
00057 int evc;
00058 int eve;
00059 int evs;
00060 int evsa;
00061 int evsd;
00062 int evsr;
00063
00064
00065 uint8 ams;
00066 uint8 vib;
00067
00068 int **wavetable;
00069 } OPL_SLOT;
00070
00071
00072 typedef struct fm_opl_channel {
00073 OPL_SLOT SLOT[2];
00074 uint8 CON;
00075 uint8 FB;
00076 int *connect1;
00077 int *connect2;
00078 int op1_out[2];
00079
00080
00081 uint32 block_fnum;
00082 uint8 kcode;
00083 uint32 fc;
00084 uint32 ksl_base;
00085 uint8 keyon;
00086 } OPL_CH;
00087
00088
00089 typedef struct fm_opl_f {
00090 uint8 type;
00091 int clock;
00092 int rate;
00093 double freqbase;
00094 double TimerBase;
00095 uint8 address;
00096 uint8 status;
00097 uint8 statusmask;
00098 uint32 mode;
00099
00100
00101 int T[2];
00102 uint8 st[2];
00103
00104
00105 OPL_CH *P_CH;
00106 int max_ch;
00107
00108
00109 uint8 rythm;
00110
00111
00112 int AR_TABLE[75];
00113 int DR_TABLE[75];
00114 uint32 FN_TABLE[1024];
00115
00116
00117 int *ams_table;
00118 int *vib_table;
00119 int amsCnt;
00120 int amsIncr;
00121 int vibCnt;
00122 int vibIncr;
00123
00124
00125 uint8 wavesel;
00126
00127
00128 OPL_TIMERHANDLER TimerHandler;
00129 int TimerParam;
00130 OPL_IRQHANDLER IRQHandler;
00131 int IRQParam;
00132 OPL_UPDATEHANDLER UpdateHandler;
00133 int UpdateParam;
00134 } FM_OPL;
00135
00136
00137 #define OPL_TYPE_YM3526 (0)
00138 #define OPL_TYPE_YM3812 (OPL_TYPE_WAVESEL)
00139
00140
00141 #define OPL_REG_AVEKM_M 0x20
00142 #define OPL_REG_KSLTL_M 0x40
00143 #define OPL_REG_AD_M 0x60
00144 #define OPL_REG_SR_M 0x80
00145 #define OPL_REG_WAVE_M 0xE0
00146
00147
00148 #define OPL_REG_AVEKM_C 0x23
00149 #define OPL_REG_KSLTL_C 0x43
00150 #define OPL_REG_AD_C 0x63
00151 #define OPL_REG_SR_C 0x83
00152 #define OPL_REG_WAVE_C 0xE3
00153
00154 #define OPL_REG_FB_C 0xC0
00155
00156
00157 FM_OPL *OPLCreate(int type, int clock, int rate);
00158 void OPLDestroy(FM_OPL *OPL);
00159 void OPLSetTimerHandler(FM_OPL *OPL,OPL_TIMERHANDLER TimerHandler,int channelOffset);
00160 void OPLSetIRQHandler(FM_OPL *OPL,OPL_IRQHANDLER IRQHandler,int param);
00161 void OPLSetUpdateHandler(FM_OPL *OPL,OPL_UPDATEHANDLER UpdateHandler,int param);
00162
00163 void OPLResetChip(FM_OPL *OPL);
00164 int OPLWrite(FM_OPL *OPL,int a,int v);
00165 unsigned char OPLRead(FM_OPL *OPL,int a);
00166 int OPLTimerOver(FM_OPL *OPL,int c);
00167 void OPLWriteReg(FM_OPL *OPL, int r, int v);
00168 void YM3812UpdateOne(FM_OPL *OPL, sint16 *buffer, int length);
00169
00170
00171 #endif //USE_FMOPL_MIDI
00172
00173 #endif //FMOPL_H