xref: /btstack/3rd-party/hxcmod-player/hxcmod.h (revision 8201da882231bee1019f0a84a70494b65e0d959a)
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 ///////////////////////////////////////////////////////////////////////////////////
19*8201da88SMatthias Ringwald #ifndef MODPLAY_DEF
20*8201da88SMatthias Ringwald #define MODPLAY_DEF
21a4cd9b30SMilanka Ringwald 
22*8201da88SMatthias Ringwald #ifdef __cplusplus
23b0920f25SMilanka Ringwald extern "C" {
24b0920f25SMilanka Ringwald #endif
25b0920f25SMilanka Ringwald 
26*8201da88SMatthias Ringwald #ifndef HXCMOD_SLOW_TARGET
27*8201da88SMatthias Ringwald 	#define HXCMOD_STATE_REPORT_SUPPORT 1
28*8201da88SMatthias Ringwald 	#define HXCMOD_OUTPUT_FILTER 1
29*8201da88SMatthias Ringwald 	#define HXCMOD_OUTPUT_STEREO_MIX 1
30*8201da88SMatthias Ringwald 	#define HXCMOD_CLIPPING_CHECK 1
31*8201da88SMatthias Ringwald #endif
32b0920f25SMilanka Ringwald 
33*8201da88SMatthias Ringwald // Warning : The following option
34*8201da88SMatthias Ringwald // required 32KB of additional RAM :
35*8201da88SMatthias 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 
44*8201da88SMatthias Ringwald #ifdef HXCMOD_16BITS_TARGET
45*8201da88SMatthias Ringwald 	typedef unsigned short  mssize;
46*8201da88SMatthias Ringwald #else
47*8201da88SMatthias Ringwald 	typedef unsigned long   mssize;
48*8201da88SMatthias Ringwald #endif
49*8201da88SMatthias Ringwald 
50*8201da88SMatthias Ringwald #ifdef HXCMOD_8BITS_OUTPUT
51*8201da88SMatthias Ringwald 	#ifdef HXCMOD_UNSIGNED_OUTPUT
52*8201da88SMatthias Ringwald 	typedef unsigned char  msample;
53*8201da88SMatthias Ringwald 	#else
54*8201da88SMatthias Ringwald 	typedef signed char    msample;
55*8201da88SMatthias Ringwald 	#endif
56*8201da88SMatthias Ringwald #else
57*8201da88SMatthias Ringwald 	#ifdef HXCMOD_UNSIGNED_OUTPUT
58*8201da88SMatthias Ringwald 	typedef unsigned short msample;
59*8201da88SMatthias Ringwald 	#else
60*8201da88SMatthias Ringwald 	typedef signed short   msample;
61*8201da88SMatthias Ringwald 	#endif
62*8201da88SMatthias Ringwald #endif
63*8201da88SMatthias Ringwald 
64*8201da88SMatthias Ringwald #ifdef HXCMOD_MAXCHANNELS
65*8201da88SMatthias Ringwald 	#define NUMMAXCHANNELS HXCMOD_MAXCHANNELS
66*8201da88SMatthias Ringwald #else
67a4cd9b30SMilanka Ringwald 	#define NUMMAXCHANNELS 32
68*8201da88SMatthias Ringwald #endif
69*8201da88SMatthias Ringwald 
70a4cd9b30SMilanka Ringwald #define MAXNOTES 12*12
71*8201da88SMatthias 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;
114*8201da88SMatthias Ringwald 	muchar  sampnum;
115*8201da88SMatthias Ringwald 
116*8201da88SMatthias Ringwald 	mchar * nxt_sampdata;
117*8201da88SMatthias Ringwald 	muint   nxt_length;
118*8201da88SMatthias Ringwald 	muint   nxt_reppnt;
119*8201da88SMatthias Ringwald 	muint   nxt_replen;
120*8201da88SMatthias Ringwald 	muchar  update_nxt_repeat;
121*8201da88SMatthias Ringwald 
122*8201da88SMatthias Ringwald 	mchar * dly_sampdata;
123*8201da88SMatthias Ringwald 	muint   dly_length;
124*8201da88SMatthias Ringwald 	muint   dly_reppnt;
125*8201da88SMatthias Ringwald 	muint   dly_replen;
126*8201da88SMatthias Ringwald 	muchar  note_delay;
127*8201da88SMatthias Ringwald 
128*8201da88SMatthias Ringwald 	mchar * lst_sampdata;
129*8201da88SMatthias Ringwald 	muint   lst_length;
130*8201da88SMatthias Ringwald 	muint   lst_reppnt;
131*8201da88SMatthias Ringwald 	muint   lst_replen;
132*8201da88SMatthias Ringwald 	muchar  retrig_cnt;
133*8201da88SMatthias Ringwald 	muchar  retrig_param;
134*8201da88SMatthias Ringwald 
135*8201da88SMatthias Ringwald 	muint   funkoffset;
136*8201da88SMatthias Ringwald 	mint    funkspeed;
137*8201da88SMatthias Ringwald 
138*8201da88SMatthias Ringwald 	mint    glissando;
139*8201da88SMatthias Ringwald 
140a4cd9b30SMilanka Ringwald 	mulong  samppos;
141*8201da88SMatthias Ringwald 	mulong  sampinc;
142a4cd9b30SMilanka Ringwald 	muint   period;
143a4cd9b30SMilanka Ringwald 	muchar  volume;
144*8201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
145*8201da88SMatthias Ringwald 	mint  * volume_table;
146*8201da88SMatthias Ringwald #endif
147a4cd9b30SMilanka Ringwald 	muchar  effect;
148a4cd9b30SMilanka Ringwald 	muchar  parameffect;
149a4cd9b30SMilanka Ringwald 	muint   effect_code;
150a4cd9b30SMilanka Ringwald 
151*8201da88SMatthias 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*8201da88SMatthias Ringwald } channel;
172a4cd9b30SMilanka Ringwald 
173a4cd9b30SMilanka Ringwald typedef struct {
174a4cd9b30SMilanka Ringwald 	module  song;
175afc6fe18SMatthias Ringwald 	mchar * sampledata[31];
176a4cd9b30SMilanka Ringwald 	note *  patterndata[128];
177a4cd9b30SMilanka Ringwald 
178*8201da88SMatthias Ringwald #ifdef HXCMOD_16BITS_TARGET
179*8201da88SMatthias Ringwald 	muint   playrate;
180*8201da88SMatthias Ringwald #else
181a4cd9b30SMilanka Ringwald 	mulong  playrate;
182*8201da88SMatthias Ringwald #endif
183*8201da88SMatthias Ringwald 
184a4cd9b30SMilanka Ringwald 	muint   tablepos;
185a4cd9b30SMilanka Ringwald 	muint   patternpos;
186a4cd9b30SMilanka Ringwald 	muint   patterndelay;
187*8201da88SMatthias Ringwald 	muchar  jump_loop_effect;
188a4cd9b30SMilanka Ringwald 	muchar  bpm;
189*8201da88SMatthias Ringwald 
190*8201da88SMatthias Ringwald #ifdef HXCMOD_16BITS_TARGET
191*8201da88SMatthias Ringwald 	muint   patternticks;
192*8201da88SMatthias Ringwald 	muint   patterntickse;
193*8201da88SMatthias Ringwald 	muint   patternticksaim;
194*8201da88SMatthias Ringwald 	muint   patternticksem;
195*8201da88SMatthias Ringwald 	muint   tick_cnt;
196*8201da88SMatthias Ringwald #else
197a4cd9b30SMilanka Ringwald 	mulong  patternticks;
198a4cd9b30SMilanka Ringwald 	mulong  patterntickse;
199a4cd9b30SMilanka Ringwald 	mulong  patternticksaim;
200*8201da88SMatthias Ringwald 	mulong  patternticksem;
201*8201da88SMatthias Ringwald 	mulong  tick_cnt;
202*8201da88SMatthias Ringwald #endif
203*8201da88SMatthias Ringwald 
204a4cd9b30SMilanka Ringwald 	mulong  sampleticksconst;
205a4cd9b30SMilanka Ringwald 
206*8201da88SMatthias Ringwald 	channel 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 
220*8201da88SMatthias Ringwald #ifdef EFFECTS_USAGE_STATE
221*8201da88SMatthias Ringwald 	int effects_event_counts[32];
222*8201da88SMatthias Ringwald #endif
223*8201da88SMatthias Ringwald 
224*8201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
225*8201da88SMatthias Ringwald 	mint    precalc_volume_array[65*256];
226*8201da88SMatthias Ringwald 	mint  * volume_selection_table[65];
227*8201da88SMatthias Ringwald #endif
228*8201da88SMatthias 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;
252*8201da88SMatthias 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 // -------------------------------------------
285*8201da88SMatthias 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 )
294*8201da88SMatthias Ringwald //
295a4cd9b30SMilanka Ringwald // - "Unload" / clear the player status.
296a4cd9b30SMilanka Ringwald // -------------------------------------------
297a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
298a4cd9b30SMilanka Ringwald 
299a4cd9b30SMilanka Ringwald int  hxcmod_init( modcontext * modctx );
300*8201da88SMatthias 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 );
302*8201da88SMatthias Ringwald void hxcmod_fillbuffer( modcontext * modctx, msample * outbuffer, mssize nbsample, tracker_buffer_state * trkbuf );
303a4cd9b30SMilanka Ringwald void hxcmod_unload( modcontext * modctx );
304a4cd9b30SMilanka Ringwald 
305*8201da88SMatthias Ringwald #ifdef __cplusplus
306b0920f25SMilanka Ringwald }
307b0920f25SMilanka Ringwald #endif
308b0920f25SMilanka Ringwald 
309*8201da88SMatthias Ringwald #endif /* MODPLAY_DEF */
310