add missing tools/pngdump to the repo
[gbajam22] / libs / maxmod / mm_types.h
1 /****************************************************************************
2  *                                                          __              *
3  *                ____ ___  ____ __  ______ ___  ____  ____/ /              *
4  *               / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __  /               *
5  *              / / / / / / /_/ />  </ / / / / / /_/ / /_/ /                *
6  *             /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/                 *
7  *                                                                          *
8  *         Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org)         *
9  *                                                                          *
10  * Permission to use, copy, modify, and/or distribute this software for any *
11  * purpose with or without fee is hereby granted, provided that the above   *
12  * copyright notice and this permission notice appear in all copies.        *
13  *                                                                          *
14  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
15  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF         *
16  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR  *
17  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES   *
18  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN    *
19  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF  *
20  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.           *
21  ****************************************************************************/
22
23 // TYPE DEFINITIONS
24
25 #ifndef MM_TYPES_H
26 #define MM_TYPES_H
27
28 typedef unsigned int    mm_word;        // 32 bits
29 typedef unsigned short  mm_hword;       // 16 bits
30 typedef unsigned char   mm_byte;        // 8 bits
31
32 typedef unsigned short  mm_sfxhand;     // sound effect handle
33
34 typedef unsigned char   mm_bool;        // boolean value
35
36 typedef void*                   mm_addr;        // pointer
37 typedef void*                   mm_reg;         // hardware register
38
39 typedef enum
40 {
41         MM_MODE_A,
42         MM_MODE_B,
43         MM_MODE_C
44 } mm_mode_enum;
45
46 typedef enum
47 {
48         MM_STREAM_8BIT_MONO                                     = 0x0,  // 000b
49         MM_STREAM_8BIT_STEREO                           = 0x1,  // 001b
50         
51         MM_STREAM_16BIT_MONO                            = 0x2,  // 010b
52         MM_STREAM_16BIT_STEREO                          = 0x3,  // 011b
53         
54 //      MM_STREAM_ADPCM_MONO                            = 0x4,  // 100b
55 //      MM_STREAM_ADPCM_STEREO                          = 0x5,  // 101b
56
57 //      adpcm streaming is not supported by the ds hardware
58 //      (the loop point data gets recorded so ring buffers are not possible)
59
60 //-----------------------------------------------------------------------------
61 } mm_stream_formats;
62 //-----------------------------------------------------------------------------
63
64 typedef mm_word (*mm_callback)( mm_word msg, mm_word param );
65 typedef mm_word (*mm_stream_func)( mm_word length, mm_addr dest, mm_stream_formats format );
66
67 typedef enum
68 {
69         MMRF_MEMORY             =0x01,
70         MMRF_DELAY              =0x02,
71         MMRF_RATE               =0x04,
72         MMRF_FEEDBACK   =0x08,
73         MMRF_PANNING    =0x10,
74         MMRF_LEFT               =0x20,
75         MMRF_RIGHT              =0x40,
76         MMRF_BOTH               =0x60,
77         
78         MMRF_INVERSEPAN =0x80,
79         MMRF_NODRYLEFT  =0x100,
80         MMRF_NODRYRIGHT =0x200,
81         MMRF_8BITLEFT   =0x400,
82         MMRF_16BITLEFT  =0x800,
83         MMRF_8BITRIGHT  =0x1000,
84         MMRF_16BITRIGHT =0x2000,
85         MMRF_DRYLEFT    =0x4000,
86         MMRF_DRYRIGHT   =0x8000
87 //-----------------------------------------------------------------------------
88 } mm_reverbflags;
89 //-----------------------------------------------------------------------------
90
91 typedef enum
92 {
93         MMRC_LEFT = 1,
94         MMRC_RIGHT = 2,
95         MMRC_BOTH = 3
96 //-----------------------------------------------------------------------------
97 } mm_reverbch;
98 //-----------------------------------------------------------------------------
99
100
101 typedef struct mmreverbcfg
102 {
103         mm_word                         flags;
104         mm_addr                         memory;
105         mm_hword                        delay;
106         mm_hword                        rate;
107         mm_hword                        feedback;
108         mm_byte                         panning;
109 //-----------------------------------------------------------------------------
110 } mm_reverb_cfg;
111 //-----------------------------------------------------------------------------
112
113 typedef enum
114 {
115         MM_PLAY_LOOP,
116         MM_PLAY_ONCE
117 //-----------------------------------------------------------------------------
118 } mm_pmode;
119 //-----------------------------------------------------------------------------
120
121 typedef enum
122 {
123         MM_MIX_8KHZ,
124         MM_MIX_10KHZ,
125         MM_MIX_13KHZ,
126         MM_MIX_16KHZ,
127         MM_MIX_18KHZ,
128         MM_MIX_21KHZ,
129         MM_MIX_27KHZ,
130         MM_MIX_31KHZ
131 //-----------------------------------------------------------------------------
132 } mm_mixmode;
133 //-----------------------------------------------------------------------------
134
135 typedef enum
136 {
137         MM_TIMER0,      // hardware timer 0
138         MM_TIMER1,      // hardware timer 1
139         MM_TIMER2,      // hardware timer 2
140         MM_TIMER3       // hardware timer 3
141
142 //-----------------------------------------------------------------------------
143 } mm_stream_timer;
144 //-----------------------------------------------------------------------------
145
146 typedef struct t_mmdssample
147 {
148         mm_word         loop_start;
149         union {
150         mm_word         loop_length;
151         mm_word         length;
152         };
153         mm_byte         format;
154         mm_byte         repeat_mode;
155         mm_hword        base_rate;
156         mm_addr         data;
157 //-----------------------------------------------------------------------------
158 } mm_ds_sample;
159 //-----------------------------------------------------------------------------
160
161 typedef struct t_mmsoundeffect
162 {
163         union {
164 // sample ID (defined in soundbank header)
165         mm_word id;
166         
167 // external sample address, not valid on GBA system
168         mm_ds_sample* sample;
169         };
170         
171 // playback rate
172         mm_hword rate;
173         
174 // sound handle
175         mm_sfxhand handle;
176         
177 // volume, 0..255
178         mm_byte volume;
179         
180 // panning, 0..255
181         mm_byte panning;
182         
183 //-----------------------------------------------------------------------------
184 } mm_sound_effect;
185 //-----------------------------------------------------------------------------
186
187 typedef struct t_mmgbasystem 
188 {
189         mm_mixmode      mixing_mode;
190         mm_word         mod_channel_count;
191         mm_word         mix_channel_count;
192         mm_addr         module_channels;
193         mm_addr         active_channels;
194         mm_addr         mixing_channels;
195         mm_addr         mixing_memory;
196         mm_addr         wave_memory;
197         mm_addr         soundbank;
198 //-----------------------------------------------------------------------------
199 } mm_gba_system;
200 //-----------------------------------------------------------------------------
201
202 typedef struct t_mmdssystem
203 {
204
205 // give MSL_NSONGS
206         mm_word         mod_count;
207
208 // pass MSL_NSAMPS
209         mm_word         samp_count;
210         
211 // pass pointer to memory buffer
212 // (mm_word mem_bank[MSL_BANKSIZE])
213         mm_word*        mem_bank;
214         
215 // fifo channel to use (usually 7)
216         mm_word         fifo_channel;
217
218 //----------------------------------------------------------------------------- 
219 } mm_ds_system;
220 //-----------------------------------------------------------------------------
221
222 typedef struct t_mmstream
223 {       
224 // sampling rate. 1024->32768 (HZ)
225         mm_word sampling_rate;
226         
227 // number of samples to buffer
228         mm_word buffer_length;
229         
230 // pointer to filling routine
231         mm_stream_func callback;
232
233 // stream format (mm_stream_formats)
234         mm_word format;
235         
236 // hardware timer selection (mm_stream_timers)
237         mm_word timer;
238
239 // if set, user must call mmStreamUpdate manually
240         mm_bool manual;
241         
242 //-----------------------------------------------------------------------------
243 } mm_stream;
244 //-----------------------------------------------------------------------------
245
246 typedef struct t_mmlayer
247 {
248
249 // current tick count
250         mm_byte tick;
251
252 // current row being played
253         mm_byte row;
254         
255 // module sequence position
256         mm_byte position;
257         
258 // number of rows in current pattern
259         mm_byte nrows;
260
261 // global volume multiplier
262         mm_byte global_volume;
263
264 // speed of module (ticks/row)
265         mm_byte speed;
266
267 // module is active
268         mm_byte active;
269
270 // tempo of module
271         mm_byte bpm;
272
273 //-----------------------------------------------------------------------------
274 } mm_modlayer;
275 //-----------------------------------------------------------------------------
276
277 typedef struct tmm_voice
278 {
279
280 // data source information
281         mm_addr         source;         // address to sample data
282         mm_word         length;         // length of sample data OR loop length (expressed in WORDS)
283         mm_hword        loop_start;     // loop start position (expressed in WORDS)
284
285 // frequency divider
286         mm_hword        timer;
287
288 // update flags
289         mm_byte         flags;
290
291 // source format
292         mm_byte         format;         // 0: 8-bit
293                                                         // 1: 16-bit
294                                                         // 2: adpcm
295 // repeat mode
296         mm_byte         repeat;         // 0: manual
297                                                         // 1: forward loop
298                                                         // 2: one shot
299
300 // volume + divider setting
301         mm_byte         volume;         // 0->127
302         mm_byte         divider;        // 0->3 = /1, /2, /4, /16
303
304 // panning setting
305         mm_byte         panning;        // 0->127
306
307 // index of voice
308         mm_byte         index;          // 0->15
309
310 // pad to 20 bytes
311         mm_byte         reserved[1];
312
313 //-----------------------------------------------------------------------------
314 } mm_voice;
315 //-----------------------------------------------------------------------------
316
317 enum {
318         MMVF_FREQ               =2,             // update frequency when this flag is set
319         MMVF_VOLUME             =4,             // update volume
320         MMVF_PANNING    =8,             // update panning
321         MMVF_SOURCE             =16,    // update source and start note
322         MMVF_STOP               =32             // stop voice (cut sound)
323 };
324
325 //-----------------------------------------------------------------------------
326
327 #endif