xref: /btstack/3rd-party/hxcmod-player/hxcmod.h (revision b7454a87570414c67f9145a2a5890372bed956da)
1a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
2a4cd9b30SMilanka Ringwald //-------------------------------------------------------------------------------//
3a4cd9b30SMilanka Ringwald //-------------------------------------------------------------------------------//
4a4cd9b30SMilanka Ringwald //-----------H----H--X----X-----CCCCC----22222----0000-----0000------11----------//
5a4cd9b30SMilanka Ringwald //----------H----H----X-X-----C--------------2---0----0---0----0--1--1-----------//
6a4cd9b30SMilanka Ringwald //---------HHHHHH-----X------C----------22222---0----0---0----0-----1------------//
7a4cd9b30SMilanka Ringwald //--------H----H----X--X----C----------2-------0----0---0----0-----1-------------//
8a4cd9b30SMilanka Ringwald //-------H----H---X-----X---CCCCC-----222222----0000-----0000----1111------------//
9a4cd9b30SMilanka Ringwald //-------------------------------------------------------------------------------//
10a4cd9b30SMilanka Ringwald //----------------------------------------------------- http://hxc2001.free.fr --//
11a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
12a4cd9b30SMilanka Ringwald // File : hxcmod.h
13a4cd9b30SMilanka Ringwald // Contains: a tiny mod player
14a4cd9b30SMilanka Ringwald //
15d38efbbaSMatthias Ringwald // Written by: Jean Francois DEL NERO
16a4cd9b30SMilanka Ringwald //
17a4cd9b30SMilanka Ringwald // Change History (most recent first):
18a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
198201da88SMatthias Ringwald #ifndef MODPLAY_DEF
208201da88SMatthias Ringwald #define MODPLAY_DEF
21a4cd9b30SMilanka Ringwald 
228201da88SMatthias Ringwald #ifdef __cplusplus
23b0920f25SMilanka Ringwald extern "C" {
24b0920f25SMilanka Ringwald #endif
25b0920f25SMilanka Ringwald 
268201da88SMatthias Ringwald #ifndef HXCMOD_SLOW_TARGET
278201da88SMatthias Ringwald 	#define HXCMOD_STATE_REPORT_SUPPORT 1
288201da88SMatthias Ringwald 	#define HXCMOD_OUTPUT_FILTER 1
298201da88SMatthias Ringwald 	#define HXCMOD_OUTPUT_STEREO_MIX 1
308201da88SMatthias Ringwald 	#define HXCMOD_CLIPPING_CHECK 1
318201da88SMatthias Ringwald #endif
32b0920f25SMilanka Ringwald 
338201da88SMatthias Ringwald // Warning : The following option
348201da88SMatthias Ringwald // required 32KB of additional RAM :
358201da88SMatthias Ringwald // #define HXCMOD_USE_PRECALC_VOLUME_TABLE 1
36a4cd9b30SMilanka Ringwald 
37a4cd9b30SMilanka Ringwald // Basic type
38a4cd9b30SMilanka Ringwald typedef unsigned char   muchar;
39afc6fe18SMatthias Ringwald typedef signed   char   mchar;
40a4cd9b30SMilanka Ringwald typedef unsigned short  muint;
41a4cd9b30SMilanka Ringwald typedef          short  mint;
42a4cd9b30SMilanka Ringwald typedef unsigned long   mulong;
43a4cd9b30SMilanka Ringwald 
448201da88SMatthias Ringwald #ifdef HXCMOD_16BITS_TARGET
458201da88SMatthias Ringwald 	typedef unsigned short  mssize;
468201da88SMatthias Ringwald #else
478201da88SMatthias Ringwald 	typedef unsigned long   mssize;
488201da88SMatthias Ringwald #endif
498201da88SMatthias Ringwald 
508201da88SMatthias Ringwald #ifdef HXCMOD_8BITS_OUTPUT
518201da88SMatthias Ringwald 	#ifdef HXCMOD_UNSIGNED_OUTPUT
528201da88SMatthias Ringwald 	typedef unsigned char  msample;
538201da88SMatthias Ringwald 	#else
548201da88SMatthias Ringwald 	typedef signed char    msample;
558201da88SMatthias Ringwald 	#endif
568201da88SMatthias Ringwald #else
578201da88SMatthias Ringwald 	#ifdef HXCMOD_UNSIGNED_OUTPUT
588201da88SMatthias Ringwald 	typedef unsigned short msample;
598201da88SMatthias Ringwald 	#else
608201da88SMatthias Ringwald 	typedef signed short   msample;
618201da88SMatthias Ringwald 	#endif
628201da88SMatthias Ringwald #endif
638201da88SMatthias Ringwald 
648201da88SMatthias Ringwald #ifdef HXCMOD_MAXCHANNELS
658201da88SMatthias Ringwald 	#define NUMMAXCHANNELS HXCMOD_MAXCHANNELS
668201da88SMatthias Ringwald #else
67a4cd9b30SMilanka Ringwald 	#define NUMMAXCHANNELS 32
688201da88SMatthias Ringwald #endif
698201da88SMatthias Ringwald 
70a4cd9b30SMilanka Ringwald #define MAXNOTES 12*12
718201da88SMatthias Ringwald 
72a4cd9b30SMilanka Ringwald //
73a4cd9b30SMilanka Ringwald // MOD file structures
74a4cd9b30SMilanka Ringwald //
75a4cd9b30SMilanka Ringwald 
76a4cd9b30SMilanka Ringwald #pragma pack(1)
77a4cd9b30SMilanka Ringwald 
78a4cd9b30SMilanka Ringwald typedef struct {
79a4cd9b30SMilanka Ringwald 	muchar  name[22];
80a4cd9b30SMilanka Ringwald 	muint   length;
81a4cd9b30SMilanka Ringwald 	muchar  finetune;
82a4cd9b30SMilanka Ringwald 	muchar  volume;
83a4cd9b30SMilanka Ringwald 	muint   reppnt;
84a4cd9b30SMilanka Ringwald 	muint   replen;
85a4cd9b30SMilanka Ringwald } sample;
86a4cd9b30SMilanka Ringwald 
87a4cd9b30SMilanka Ringwald typedef struct {
88a4cd9b30SMilanka Ringwald 	muchar  sampperiod;
89a4cd9b30SMilanka Ringwald 	muchar  period;
90a4cd9b30SMilanka Ringwald 	muchar  sampeffect;
91a4cd9b30SMilanka Ringwald 	muchar  effect;
92a4cd9b30SMilanka Ringwald } note;
93a4cd9b30SMilanka Ringwald 
94a4cd9b30SMilanka Ringwald typedef struct {
95a4cd9b30SMilanka Ringwald 	muchar  title[20];
96a4cd9b30SMilanka Ringwald 	sample  samples[31];
97a4cd9b30SMilanka Ringwald 	muchar  length;
98a4cd9b30SMilanka Ringwald 	muchar  protracker;
99a4cd9b30SMilanka Ringwald 	muchar  patterntable[128];
100a4cd9b30SMilanka Ringwald 	muchar  signature[4];
101a4cd9b30SMilanka Ringwald 	muchar  speed;
102a4cd9b30SMilanka Ringwald } module;
103a4cd9b30SMilanka Ringwald 
104a4cd9b30SMilanka Ringwald #pragma pack()
105a4cd9b30SMilanka Ringwald 
106a4cd9b30SMilanka Ringwald //
107a4cd9b30SMilanka Ringwald // HxCMod Internal structures
108a4cd9b30SMilanka Ringwald //
109a4cd9b30SMilanka Ringwald typedef struct {
110afc6fe18SMatthias Ringwald 	mchar * sampdata;
111a4cd9b30SMilanka Ringwald 	muint   length;
112a4cd9b30SMilanka Ringwald 	muint   reppnt;
113a4cd9b30SMilanka Ringwald 	muint   replen;
1148201da88SMatthias Ringwald 	muchar  sampnum;
1158201da88SMatthias Ringwald 
1168201da88SMatthias Ringwald 	mchar * nxt_sampdata;
1178201da88SMatthias Ringwald 	muint   nxt_length;
1188201da88SMatthias Ringwald 	muint   nxt_reppnt;
1198201da88SMatthias Ringwald 	muint   nxt_replen;
1208201da88SMatthias Ringwald 	muchar  update_nxt_repeat;
1218201da88SMatthias Ringwald 
1228201da88SMatthias Ringwald 	mchar * dly_sampdata;
1238201da88SMatthias Ringwald 	muint   dly_length;
1248201da88SMatthias Ringwald 	muint   dly_reppnt;
1258201da88SMatthias Ringwald 	muint   dly_replen;
1268201da88SMatthias Ringwald 	muchar  note_delay;
1278201da88SMatthias Ringwald 
1288201da88SMatthias Ringwald 	mchar * lst_sampdata;
1298201da88SMatthias Ringwald 	muint   lst_length;
1308201da88SMatthias Ringwald 	muint   lst_reppnt;
1318201da88SMatthias Ringwald 	muint   lst_replen;
1328201da88SMatthias Ringwald 	muchar  retrig_cnt;
1338201da88SMatthias Ringwald 	muchar  retrig_param;
1348201da88SMatthias Ringwald 
1358201da88SMatthias Ringwald 	muint   funkoffset;
1368201da88SMatthias Ringwald 	mint    funkspeed;
1378201da88SMatthias Ringwald 
1388201da88SMatthias Ringwald 	mint    glissando;
1398201da88SMatthias Ringwald 
140a4cd9b30SMilanka Ringwald 	mulong  samppos;
1418201da88SMatthias Ringwald 	mulong  sampinc;
142a4cd9b30SMilanka Ringwald 	muint   period;
143a4cd9b30SMilanka Ringwald 	muchar  volume;
1448201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1458201da88SMatthias Ringwald 	mint  * volume_table;
1468201da88SMatthias Ringwald #endif
147a4cd9b30SMilanka Ringwald 	muchar  effect;
148a4cd9b30SMilanka Ringwald 	muchar  parameffect;
149a4cd9b30SMilanka Ringwald 	muint   effect_code;
150a4cd9b30SMilanka Ringwald 
1518201da88SMatthias Ringwald 	mulong  last_set_offset;
152a4cd9b30SMilanka Ringwald 
153a4cd9b30SMilanka Ringwald 	mint    decalperiod;
154a4cd9b30SMilanka Ringwald 	mint    portaspeed;
155a4cd9b30SMilanka Ringwald 	mint    portaperiod;
156a4cd9b30SMilanka Ringwald 	mint    vibraperiod;
157a4cd9b30SMilanka Ringwald 	mint    Arpperiods[3];
158a4cd9b30SMilanka Ringwald 	muchar  ArpIndex;
159a4cd9b30SMilanka Ringwald 
160a4cd9b30SMilanka Ringwald 	muchar  volumeslide;
161a4cd9b30SMilanka Ringwald 
162a4cd9b30SMilanka Ringwald 	muchar  vibraparam;
163a4cd9b30SMilanka Ringwald 	muchar  vibrapointeur;
164a4cd9b30SMilanka Ringwald 
165a4cd9b30SMilanka Ringwald 	muchar  finetune;
166a4cd9b30SMilanka Ringwald 
167a4cd9b30SMilanka Ringwald 	muchar  cut_param;
168a4cd9b30SMilanka Ringwald 
169a4cd9b30SMilanka Ringwald 	muint   patternloopcnt;
170a4cd9b30SMilanka Ringwald 	muint   patternloopstartpoint;
171*b7454a87SMatthias Ringwald } hxcmod_channel_t;
172a4cd9b30SMilanka Ringwald 
173a4cd9b30SMilanka Ringwald typedef struct {
174a4cd9b30SMilanka Ringwald 	module  song;
175afc6fe18SMatthias Ringwald 	mchar * sampledata[31];
176a4cd9b30SMilanka Ringwald 	note *  patterndata[128];
177a4cd9b30SMilanka Ringwald 
1788201da88SMatthias Ringwald #ifdef HXCMOD_16BITS_TARGET
1798201da88SMatthias Ringwald 	muint   playrate;
1808201da88SMatthias Ringwald #else
181a4cd9b30SMilanka Ringwald 	mulong  playrate;
1828201da88SMatthias Ringwald #endif
1838201da88SMatthias Ringwald 
184a4cd9b30SMilanka Ringwald 	muint   tablepos;
185a4cd9b30SMilanka Ringwald 	muint   patternpos;
186a4cd9b30SMilanka Ringwald 	muint   patterndelay;
1878201da88SMatthias Ringwald 	muchar  jump_loop_effect;
188a4cd9b30SMilanka Ringwald 	muchar  bpm;
1898201da88SMatthias Ringwald 
1908201da88SMatthias Ringwald #ifdef HXCMOD_16BITS_TARGET
1918201da88SMatthias Ringwald 	muint   patternticks;
1928201da88SMatthias Ringwald 	muint   patterntickse;
1938201da88SMatthias Ringwald 	muint   patternticksaim;
1948201da88SMatthias Ringwald 	muint   patternticksem;
1958201da88SMatthias Ringwald 	muint   tick_cnt;
1968201da88SMatthias Ringwald #else
197a4cd9b30SMilanka Ringwald 	mulong  patternticks;
198a4cd9b30SMilanka Ringwald 	mulong  patterntickse;
199a4cd9b30SMilanka Ringwald 	mulong  patternticksaim;
2008201da88SMatthias Ringwald 	mulong  patternticksem;
2018201da88SMatthias Ringwald 	mulong  tick_cnt;
2028201da88SMatthias Ringwald #endif
2038201da88SMatthias Ringwald 
204a4cd9b30SMilanka Ringwald 	mulong  sampleticksconst;
205a4cd9b30SMilanka Ringwald 
206*b7454a87SMatthias Ringwald 	hxcmod_channel_t channels[NUMMAXCHANNELS];
207a4cd9b30SMilanka Ringwald 
208a4cd9b30SMilanka Ringwald 	muint   number_of_channels;
209a4cd9b30SMilanka Ringwald 
210a4cd9b30SMilanka Ringwald 	muint   mod_loaded;
211a4cd9b30SMilanka Ringwald 
212a4cd9b30SMilanka Ringwald 	mint    last_r_sample;
213a4cd9b30SMilanka Ringwald 	mint    last_l_sample;
214a4cd9b30SMilanka Ringwald 
215a4cd9b30SMilanka Ringwald 	mint    stereo;
216a4cd9b30SMilanka Ringwald 	mint    stereo_separation;
217a4cd9b30SMilanka Ringwald 	mint    bits;
218a4cd9b30SMilanka Ringwald 	mint    filter;
219a4cd9b30SMilanka Ringwald 
2208201da88SMatthias Ringwald #ifdef EFFECTS_USAGE_STATE
2218201da88SMatthias Ringwald 	int effects_event_counts[32];
2228201da88SMatthias Ringwald #endif
2238201da88SMatthias Ringwald 
2248201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
2258201da88SMatthias Ringwald 	mint    precalc_volume_array[65*256];
2268201da88SMatthias Ringwald 	mint  * volume_selection_table[65];
2278201da88SMatthias Ringwald #endif
2288201da88SMatthias Ringwald 
229a4cd9b30SMilanka Ringwald } modcontext;
230a4cd9b30SMilanka Ringwald 
231a4cd9b30SMilanka Ringwald //
232a4cd9b30SMilanka Ringwald // Player states structures
233a4cd9b30SMilanka Ringwald //
234a4cd9b30SMilanka Ringwald typedef struct track_state_
235a4cd9b30SMilanka Ringwald {
236a4cd9b30SMilanka Ringwald 	unsigned char instrument_number;
237a4cd9b30SMilanka Ringwald 	unsigned short cur_period;
238a4cd9b30SMilanka Ringwald 	unsigned char  cur_volume;
239a4cd9b30SMilanka Ringwald 	unsigned short cur_effect;
240a4cd9b30SMilanka Ringwald 	unsigned short cur_parameffect;
241a4cd9b30SMilanka Ringwald }track_state;
242a4cd9b30SMilanka Ringwald 
243a4cd9b30SMilanka Ringwald typedef struct tracker_state_
244a4cd9b30SMilanka Ringwald {
245a4cd9b30SMilanka Ringwald 	int number_of_tracks;
246a4cd9b30SMilanka Ringwald 	int bpm;
247a4cd9b30SMilanka Ringwald 	int speed;
248a4cd9b30SMilanka Ringwald 	int cur_pattern;
249a4cd9b30SMilanka Ringwald 	int cur_pattern_pos;
250a4cd9b30SMilanka Ringwald 	int cur_pattern_table_pos;
251a4cd9b30SMilanka Ringwald 	unsigned int buf_index;
2528201da88SMatthias Ringwald 	track_state tracks[NUMMAXCHANNELS];
253a4cd9b30SMilanka Ringwald }tracker_state;
254a4cd9b30SMilanka Ringwald 
255a4cd9b30SMilanka Ringwald typedef struct tracker_state_instrument_
256a4cd9b30SMilanka Ringwald {
257a4cd9b30SMilanka Ringwald 	char name[22];
258a4cd9b30SMilanka Ringwald 	int active;
259a4cd9b30SMilanka Ringwald }tracker_state_instrument;
260a4cd9b30SMilanka Ringwald 
261a4cd9b30SMilanka Ringwald typedef struct tracker_buffer_state_
262a4cd9b30SMilanka Ringwald {
263a4cd9b30SMilanka Ringwald 	int nb_max_of_state;
264a4cd9b30SMilanka Ringwald 	int nb_of_state;
265a4cd9b30SMilanka Ringwald 	int cur_rd_index;
266a4cd9b30SMilanka Ringwald 	int sample_step;
267a4cd9b30SMilanka Ringwald 	char name[64];
268a4cd9b30SMilanka Ringwald 	tracker_state_instrument instruments[31];
269a4cd9b30SMilanka Ringwald 	tracker_state * track_state_buf;
270a4cd9b30SMilanka Ringwald }tracker_buffer_state;
271a4cd9b30SMilanka Ringwald 
272a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
273a4cd9b30SMilanka Ringwald // HxCMOD Core API:
274a4cd9b30SMilanka Ringwald // -------------------------------------------
275a4cd9b30SMilanka Ringwald // int  hxcmod_init(modcontext * modctx)
276a4cd9b30SMilanka Ringwald //
277a4cd9b30SMilanka Ringwald // - Initialize the modcontext buffer. Must be called before doing anything else.
278a4cd9b30SMilanka Ringwald //   Return 1 if success. 0 in case of error.
279a4cd9b30SMilanka Ringwald // -------------------------------------------
280a4cd9b30SMilanka Ringwald // int  hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size )
281a4cd9b30SMilanka Ringwald //
282a4cd9b30SMilanka Ringwald // - "Load" a MOD from memory (from "mod_data" with size "mod_data_size").
283a4cd9b30SMilanka Ringwald //   Return 1 if success. 0 in case of error.
284a4cd9b30SMilanka Ringwald // -------------------------------------------
2858201da88SMatthias Ringwald // void hxcmod_fillbuffer( modcontext * modctx, unsigned short * outbuffer, mssize nbsample, tracker_buffer_state * trkbuf )
286a4cd9b30SMilanka Ringwald //
287a4cd9b30SMilanka Ringwald // - Generate and return the next samples chunk to outbuffer.
288a4cd9b30SMilanka Ringwald //   nbsample specify the number of stereo 16bits samples you want.
289a4cd9b30SMilanka Ringwald //   The output format is signed 44100Hz 16-bit Stereo PCM samples.
290a4cd9b30SMilanka Ringwald //   The output buffer size in byte must be equal to ( nbsample * 2 * 2 ).
291a4cd9b30SMilanka Ringwald //   The optional trkbuf parameter can be used to get detailed status of the player. Put NULL/0 is unused.
292a4cd9b30SMilanka Ringwald // -------------------------------------------
293a4cd9b30SMilanka Ringwald // void hxcmod_unload( modcontext * modctx )
2948201da88SMatthias Ringwald //
295a4cd9b30SMilanka Ringwald // - "Unload" / clear the player status.
296a4cd9b30SMilanka Ringwald // -------------------------------------------
297a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
298a4cd9b30SMilanka Ringwald 
299a4cd9b30SMilanka Ringwald int  hxcmod_init( modcontext * modctx );
3008201da88SMatthias Ringwald int  hxcmod_setcfg( modcontext * modctx, int samplerate, int stereo_separation, int filter );
301a4cd9b30SMilanka Ringwald int  hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size );
3028201da88SMatthias Ringwald void hxcmod_fillbuffer( modcontext * modctx, msample * outbuffer, mssize nbsample, tracker_buffer_state * trkbuf );
303a4cd9b30SMilanka Ringwald void hxcmod_unload( modcontext * modctx );
304a4cd9b30SMilanka Ringwald 
3058201da88SMatthias Ringwald #ifdef __cplusplus
306b0920f25SMilanka Ringwald }
307b0920f25SMilanka Ringwald #endif
308b0920f25SMilanka Ringwald 
3098201da88SMatthias Ringwald #endif /* MODPLAY_DEF */
310