AxibugEmuOnline/virtuanessrc097-master/NES/ApuEX/emu2413/emu2413.h

173 lines
7.7 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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