1 #ifndef _EMU2413_H_
2 #define _EMU2413_H_
3 
4 #define PI 3.14159265358979323846
5 
6 enum {EMU2413_2413_TONE = 0};
7 
8 /* voice data */
9 typedef struct {
10   uint32 TL,FB,EG,ML,AR,DR,SL,RR,KR,KL,AM,PM,WF ;
11 } EMU2413_PATCH ;
12 
13 /* slot */
14 typedef struct {
15 
16   EMU2413_PATCH *patch;
17 
18   int32 type ;          /* 0 : modulator 1 : carrier */
19 
20   /* OUTPUT */
21   int32 feedback ;
22   int32 output[2] ;   /* Output value of slot */
23 
24   /* for Phase Generator (PG) */
25   uint32 *sintbl ;    /* Wavetable */
26   uint32 phase ;      /* Phase */
27   uint32 dphase ;     /* Phase increment amount */
28   uint32 pgout ;      /* output */
29 
30   /* for Envelope Generator (EG) */
31   int32 fnum ;          /* F-Number */
32   int32 block ;         /* Block */
33   int32 volume ;        /* Current volume */
34   int32 sustine ;       /* Sustine 1 = ON, 0 = OFF */
35   uint32 tll ;	      /* Total Level + Key scale level*/
36   uint32 rks ;        /* Key scale offset (Rks) */
37   int32 eg_mode ;       /* Current state */
38   uint32 eg_phase ;   /* Phase */
39   uint32 eg_dphase ;  /* Phase increment amount */
40   uint32 egout ;      /* output */
41 
42 } EMU2413_SLOT ;
43 
44 /* Mask */
45 #define EMU2413_MASK_CH(x) (1<<(x))
46 #define EMU2413_MASK_HH (1<<(9))
47 #define EMU2413_MASK_CYM (1<<(10))
48 #define EMU2413_MASK_TOM (1<<(11))
49 #define EMU2413_MASK_SD (1<<(12))
50 #define EMU2413_MASK_BD (1<<(13))
51 #define EMU2413_MASK_RHYTHM ( EMU2413_MASK_HH | EMU2413_MASK_CYM | EMU2413_MASK_TOM | EMU2413_MASK_SD | EMU2413_MASK_BD )
52 
53 /* opll */
54 typedef struct
55 {
56 
57   uint32 adr ;
58   int32 out ;
59 
60   uint32 pan[16];
61 
62   /* Register */
63   uint8 reg[0x40] ;
64   int32 slot_on_flag[18] ;
65 
66   /* Pitch Modulator */
67   uint32 pm_phase ;
68   int32 lfo_pm ;
69 
70   /* Amp Modulator */
71   int32 am_phase ;
72   int32 lfo_am ;
73 
74   /* Noise Generator */
75   uint32 noise_seed ;
76 
77   /* Channel Data */
78   int32 patch_number[9];
79   int32 key_status[9] ;
80 
81   /* Slot */
82   EMU2413_SLOT slot[18] ;
83 
84   /* Voice Data */
85   EMU2413_PATCH patch[19*2] ;
86   int32 patch_update[2] ; /* flag for check patch update */
87 
88   uint32 mask ;
89 
90 } EMU2413 ;
91 
92 /* Create Object */
93 EMU2413 *EMU2413_new(uint32 clk);
94 void EMU2413_delete(EMU2413 *);
95 
96 /* Setup */
97 void EMU2413_reset(EMU2413 *);
98 void EMU2413_reset_patch(EMU2413 *, int32);
99 void EMU2413_set_pan(EMU2413 *, uint32 ch, uint32 pan);
100 
101 /* Port/Register access */
102 void EMU2413_writeIO(EMU2413 *, uint32 reg, uint32 val) ;
103 void EMU2413_writeReg(EMU2413 *, uint32 reg, uint32 val) ;
104 
105 /* Synthsize */
106 int32 EMU2413_calc(EMU2413 *) ;
107 void EMU2413_calc_stereo(EMU2413 *, int32 out[2]) ;
108 
109 /* Misc */
110 void EMU2413_setPatch(EMU2413 *, const uint8 *dump) ;
111 void EMU2413_copyPatch(EMU2413 *, int32, EMU2413_PATCH *) ;
112 void EMU2413_forceRefresh(EMU2413 *) ;
113 
114 /* Utility */
115 void EMU2413_dump2patch(const uint8 *dump, EMU2413_PATCH *patch) ;
116 void EMU2413_patch2dump(const EMU2413_PATCH *patch, uint8 *dump) ;
117 void EMU2413_getDefaultPatch(int32 type, int32 num, EMU2413_PATCH *) ;
118 
119 /* Channel Mask */
120 uint32 EMU2413_setMask(EMU2413 *, uint32 mask) ;
121 uint32 EMU2413_toggleMask(EMU2413 *, uint32 mask) ;
122 
123 #endif
124