173 lines
7.7 KiB
C
173 lines
7.7 KiB
C
#ifndef _EMU2413_H_
|
||
#define _EMU2413_H_
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#ifdef EMU2413_DLL_EXPORTS
|
||
#define EMU2413_API __declspec(dllexport)
|
||
#elif EMU2413_DLL_IMPORTS
|
||
#define EMU2413_API __declspec(dllimport)
|
||
#else
|
||
#define EMU2413_API
|
||
#endif
|
||
|
||
#define PI 3.14159265358979
|
||
|
||
#ifndef __VMTYPES_INCLUDED__
|
||
typedef unsigned int uint32 ;
|
||
typedef int int32 ;
|
||
typedef signed short int16 ;
|
||
typedef unsigned short uint16 ;
|
||
//typedef signed char int8 ;
|
||
typedef char int8 ;
|
||
typedef unsigned char uint8 ;
|
||
#endif
|
||
|
||
enum {OPLL_2413_TONE=0, OPLL_VRC7_TONE=1} ;
|
||
|
||
/* voice data */
|
||
typedef struct {
|
||
unsigned int TL,FB,EG,ML,AR,DR,SL,RR,KR,KL,AM,PM,WF ;
|
||
} OPLL_PATCH ;
|
||
|
||
/* slot */
|
||
typedef struct {
|
||
|
||
OPLL_PATCH *patch;
|
||
|
||
int type ; /* 0 : modulator 1 : carrier */
|
||
|
||
/* OUTPUT */
|
||
int32 feedback ;
|
||
int32 output[5] ; /* Output value of slot */
|
||
|
||
/* for Phase Generator (PG) */
|
||
uint32 *sintbl ; /* Wavetable */
|
||
uint32 phase ; /* Phase */
|
||
uint32 dphase ; /* Phase increment amount */
|
||
uint32 pgout ; /* output */
|
||
|
||
/* for Envelope Generator (EG) */
|
||
int fnum ; /* F-Number */
|
||
int block ; /* Block */
|
||
int volume ; /* Current volume */
|
||
int sustine ; /* Sustine 1 = ON, 0 = OFF */
|
||
uint32 tll ; /* Total Level + Key scale level*/
|
||
uint32 rks ; /* Key scale offset (Rks) */
|
||
int eg_mode ; /* Current state */
|
||
uint32 eg_phase ; /* Phase */
|
||
uint32 eg_dphase ; /* Phase increment amount */
|
||
uint32 egout ; /* output */
|
||
|
||
|
||
/* refer to opll-> */
|
||
int32 *plfo_pm ;
|
||
int32 *plfo_am ;
|
||
|
||
|
||
} OPLL_SLOT ;
|
||
|
||
/* Channel */
|
||
typedef struct {
|
||
|
||
int patch_number ;
|
||
int key_status ;
|
||
OPLL_SLOT *mod, *car ;
|
||
|
||
} OPLL_CH ;
|
||
|
||
/* Mask */
|
||
#define OPLL_MASK_CH(x) (1<<(x))
|
||
#define OPLL_MASK_HH (1<<(9))
|
||
#define OPLL_MASK_CYM (1<<(10))
|
||
#define OPLL_MASK_TOM (1<<(11))
|
||
#define OPLL_MASK_SD (1<<(12))
|
||
#define OPLL_MASK_BD (1<<(13))
|
||
#define OPLL_MASK_RYTHM ( OPLL_MASK_HH | OPLL_MASK_CYM | OPLL_MASK_TOM | OPLL_MASK_SD | OPLL_MASK_BD )
|
||
|
||
/* opll */
|
||
typedef struct {
|
||
|
||
uint32 adr ;
|
||
|
||
int32 output[2] ;
|
||
|
||
/* Register */
|
||
unsigned char reg[0x40] ;
|
||
int slot_on_flag[18] ;
|
||
|
||
/* Rythm Mode : 0 = OFF, 1 = ON */
|
||
int rythm_mode ;
|
||
|
||
/* Pitch Modulator */
|
||
uint32 pm_phase ;
|
||
int32 lfo_pm ;
|
||
|
||
/* Amp Modulator */
|
||
int32 am_phase ;
|
||
int32 lfo_am ;
|
||
|
||
|
||
/* Noise Generator */
|
||
uint32 noise_seed ;
|
||
uint32 whitenoise ;
|
||
uint32 noiseA ;
|
||
uint32 noiseB ;
|
||
uint32 noiseA_phase ;
|
||
uint32 noiseB_phase ;
|
||
uint32 noiseA_idx ;
|
||
uint32 noiseB_idx ;
|
||
uint32 noiseA_dphase ;
|
||
uint32 noiseB_dphase ;
|
||
|
||
/* Channel & Slot */
|
||
OPLL_CH *ch[9] ;
|
||
OPLL_SLOT *slot[18] ;
|
||
|
||
/* Voice Data */
|
||
OPLL_PATCH *patch[19*2] ;
|
||
int patch_update[2] ; /* flag for check patch update */
|
||
|
||
uint32 mask ;
|
||
|
||
int masterVolume ; /* 0min -- 64 -- 127 max (Liner) */
|
||
|
||
} OPLL ;
|
||
|
||
/* Initialize */
|
||
EMU2413_API void OPLL_init(uint32 clk, uint32 rate) ;
|
||
EMU2413_API void OPLL_close(void) ;
|
||
|
||
/* Create Object */
|
||
EMU2413_API OPLL *OPLL_new(void) ;
|
||
EMU2413_API void OPLL_delete(OPLL *) ;
|
||
|
||
/* Setup */
|
||
EMU2413_API void OPLL_reset(OPLL *) ;
|
||
EMU2413_API void OPLL_reset_patch(OPLL *, int) ;
|
||
EMU2413_API void OPLL_setClock(uint32 c, uint32 r) ;
|
||
|
||
/* Port/Register access */
|
||
EMU2413_API void OPLL_writeIO(OPLL *, uint32 reg, uint32 val) ;
|
||
EMU2413_API void OPLL_writeReg(OPLL *, uint32 reg, uint32 val) ;
|
||
|
||
/* Synthsize */
|
||
EMU2413_API int16 OPLL_calc(OPLL *) ;
|
||
|
||
/* Misc */
|
||
EMU2413_API void OPLL_copyPatch(OPLL *, int, OPLL_PATCH *) ;
|
||
EMU2413_API void OPLL_forceRefresh(OPLL *) ;
|
||
EMU2413_API void dump2patch(unsigned char *, OPLL_PATCH *) ;
|
||
|
||
/* Channel Mask */
|
||
EMU2413_API uint32 OPLL_setMask(OPLL *, uint32 mask) ;
|
||
EMU2413_API uint32 OPLL_toggleMask(OPLL *, uint32 mask) ;
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif
|