xref: /btstack/3rd-party/hxcmod-player/hxcmod.h (revision d38efbba5c7565403822c9c38ce512c8d5cc1815)
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 //
15*d38efbbaSMatthias Ringwald // Written by: Jean Francois DEL NERO
16a4cd9b30SMilanka Ringwald //
17a4cd9b30SMilanka Ringwald // Change History (most recent first):
18a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
19a4cd9b30SMilanka Ringwald 
20b0920f25SMilanka Ringwald #ifndef __HXCMOD_H
21b0920f25SMilanka Ringwald #define __HXCMOD_H
22b0920f25SMilanka Ringwald 
23b0920f25SMilanka Ringwald #if defined __cplusplus
24b0920f25SMilanka Ringwald extern "C" {
25b0920f25SMilanka Ringwald #endif
26b0920f25SMilanka Ringwald 
27b0920f25SMilanka Ringwald 
28a4cd9b30SMilanka Ringwald #ifndef MODPLAY_DEF
29a4cd9b30SMilanka Ringwald #define MODPLAY_DEF
30a4cd9b30SMilanka Ringwald 
31a4cd9b30SMilanka Ringwald // Basic type
32a4cd9b30SMilanka Ringwald typedef unsigned char	muchar;
33afc6fe18SMatthias Ringwald typedef signed   char   mchar;
34a4cd9b30SMilanka Ringwald typedef unsigned short	muint;
35a4cd9b30SMilanka Ringwald typedef          short	mint;
36a4cd9b30SMilanka Ringwald typedef unsigned long	mulong;
37a4cd9b30SMilanka Ringwald 
38a4cd9b30SMilanka Ringwald #define NUMMAXCHANNELS 32
39a4cd9b30SMilanka Ringwald #define MAXNOTES 12*12
40a4cd9b30SMilanka Ringwald #define SAMPLE_RATE 44100
41a4cd9b30SMilanka Ringwald //
42a4cd9b30SMilanka Ringwald // MOD file structures
43a4cd9b30SMilanka Ringwald //
44a4cd9b30SMilanka Ringwald 
45a4cd9b30SMilanka Ringwald #pragma pack(1)
46a4cd9b30SMilanka Ringwald 
47a4cd9b30SMilanka Ringwald typedef struct {
48a4cd9b30SMilanka Ringwald 	muchar  name[22];
49a4cd9b30SMilanka Ringwald 	muint   length;
50a4cd9b30SMilanka Ringwald 	muchar  finetune;
51a4cd9b30SMilanka Ringwald 	muchar  volume;
52a4cd9b30SMilanka Ringwald 	muint   reppnt;
53a4cd9b30SMilanka Ringwald 	muint   replen;
54a4cd9b30SMilanka Ringwald } sample;
55a4cd9b30SMilanka Ringwald 
56a4cd9b30SMilanka Ringwald typedef struct {
57a4cd9b30SMilanka Ringwald 	muchar  sampperiod;
58a4cd9b30SMilanka Ringwald 	muchar  period;
59a4cd9b30SMilanka Ringwald 	muchar  sampeffect;
60a4cd9b30SMilanka Ringwald 	muchar  effect;
61a4cd9b30SMilanka Ringwald } note;
62a4cd9b30SMilanka Ringwald 
63a4cd9b30SMilanka Ringwald typedef struct {
64a4cd9b30SMilanka Ringwald 	muchar  title[20];
65a4cd9b30SMilanka Ringwald 	sample  samples[31];
66a4cd9b30SMilanka Ringwald 	muchar  length;
67a4cd9b30SMilanka Ringwald 	muchar  protracker;
68a4cd9b30SMilanka Ringwald 	muchar  patterntable[128];
69a4cd9b30SMilanka Ringwald 	muchar  signature[4];
70a4cd9b30SMilanka Ringwald 	muchar  speed;
71a4cd9b30SMilanka Ringwald } module;
72a4cd9b30SMilanka Ringwald 
73a4cd9b30SMilanka Ringwald #pragma pack()
74a4cd9b30SMilanka Ringwald 
75a4cd9b30SMilanka Ringwald //
76a4cd9b30SMilanka Ringwald // HxCMod Internal structures
77a4cd9b30SMilanka Ringwald //
78a4cd9b30SMilanka Ringwald typedef struct {
79afc6fe18SMatthias Ringwald 	mchar * sampdata;
80a4cd9b30SMilanka Ringwald 	muint   sampnum;
81a4cd9b30SMilanka Ringwald 	muint   length;
82a4cd9b30SMilanka Ringwald 	muint   reppnt;
83a4cd9b30SMilanka Ringwald 	muint   replen;
84a4cd9b30SMilanka Ringwald 	mulong  samppos;
85a4cd9b30SMilanka Ringwald 	muint   period;
86a4cd9b30SMilanka Ringwald 	muchar  volume;
87a4cd9b30SMilanka Ringwald 	mulong  ticks;
88a4cd9b30SMilanka Ringwald 	muchar  effect;
89a4cd9b30SMilanka Ringwald 	muchar  parameffect;
90a4cd9b30SMilanka Ringwald 	muint   effect_code;
91a4cd9b30SMilanka Ringwald 
92a4cd9b30SMilanka Ringwald 
93a4cd9b30SMilanka Ringwald 	mint    decalperiod;
94a4cd9b30SMilanka Ringwald 	mint    portaspeed;
95a4cd9b30SMilanka Ringwald 	mint    portaperiod;
96a4cd9b30SMilanka Ringwald 	mint    vibraperiod;
97a4cd9b30SMilanka Ringwald 	mint    Arpperiods[3];
98a4cd9b30SMilanka Ringwald 	muchar  ArpIndex;
99a4cd9b30SMilanka Ringwald 
100a4cd9b30SMilanka Ringwald 	mint    oldk;
101a4cd9b30SMilanka Ringwald 	muchar  volumeslide;
102a4cd9b30SMilanka Ringwald 
103a4cd9b30SMilanka Ringwald 	muchar  vibraparam;
104a4cd9b30SMilanka Ringwald 	muchar  vibrapointeur;
105a4cd9b30SMilanka Ringwald 
106a4cd9b30SMilanka Ringwald 	muchar  finetune;
107a4cd9b30SMilanka Ringwald 
108a4cd9b30SMilanka Ringwald 	muchar  cut_param;
109a4cd9b30SMilanka Ringwald 
110a4cd9b30SMilanka Ringwald 	muint   patternloopcnt;
111a4cd9b30SMilanka Ringwald 	muint   patternloopstartpoint;
112664a636eSMatthias Ringwald } hxcmod_channel;
113a4cd9b30SMilanka Ringwald 
114a4cd9b30SMilanka Ringwald typedef struct {
115a4cd9b30SMilanka Ringwald 	module  song;
116afc6fe18SMatthias Ringwald 	mchar * sampledata[31];
117a4cd9b30SMilanka Ringwald 	note *  patterndata[128];
118a4cd9b30SMilanka Ringwald 
119a4cd9b30SMilanka Ringwald 	mulong  playrate;
120a4cd9b30SMilanka Ringwald 	muint   tablepos;
121a4cd9b30SMilanka Ringwald 	muint   patternpos;
122a4cd9b30SMilanka Ringwald 	muint   patterndelay;
123a4cd9b30SMilanka Ringwald 	muint   jump_loop_effect;
124a4cd9b30SMilanka Ringwald 	muchar  bpm;
125a4cd9b30SMilanka Ringwald 	mulong  patternticks;
126a4cd9b30SMilanka Ringwald 	mulong  patterntickse;
127a4cd9b30SMilanka Ringwald 	mulong  patternticksaim;
128a4cd9b30SMilanka Ringwald 	mulong  sampleticksconst;
129a4cd9b30SMilanka Ringwald 
130a4cd9b30SMilanka Ringwald 	mulong  samplenb;
131a4cd9b30SMilanka Ringwald 
132664a636eSMatthias Ringwald 	hxcmod_channel channels[NUMMAXCHANNELS];
133a4cd9b30SMilanka Ringwald 
134a4cd9b30SMilanka Ringwald 	muint   number_of_channels;
135a4cd9b30SMilanka Ringwald 
136a4cd9b30SMilanka Ringwald 	muint   fullperiod[MAXNOTES * 8];
137a4cd9b30SMilanka Ringwald 
138a4cd9b30SMilanka Ringwald 	muint   mod_loaded;
139a4cd9b30SMilanka Ringwald 
140a4cd9b30SMilanka Ringwald 	mint    last_r_sample;
141a4cd9b30SMilanka Ringwald 	mint    last_l_sample;
142a4cd9b30SMilanka Ringwald 
143a4cd9b30SMilanka Ringwald 	mint    stereo;
144a4cd9b30SMilanka Ringwald 	mint    stereo_separation;
145a4cd9b30SMilanka Ringwald 	mint    bits;
146a4cd9b30SMilanka Ringwald 	mint    filter;
147a4cd9b30SMilanka Ringwald 
148a4cd9b30SMilanka Ringwald } modcontext;
149a4cd9b30SMilanka Ringwald 
150a4cd9b30SMilanka Ringwald //
151a4cd9b30SMilanka Ringwald // Player states structures
152a4cd9b30SMilanka Ringwald //
153a4cd9b30SMilanka Ringwald typedef struct track_state_
154a4cd9b30SMilanka Ringwald {
155a4cd9b30SMilanka Ringwald 	unsigned char instrument_number;
156a4cd9b30SMilanka Ringwald 	unsigned short cur_period;
157a4cd9b30SMilanka Ringwald 	unsigned char  cur_volume;
158a4cd9b30SMilanka Ringwald 	unsigned short cur_effect;
159a4cd9b30SMilanka Ringwald 	unsigned short cur_parameffect;
160a4cd9b30SMilanka Ringwald }track_state;
161a4cd9b30SMilanka Ringwald 
162a4cd9b30SMilanka Ringwald typedef struct tracker_state_
163a4cd9b30SMilanka Ringwald {
164a4cd9b30SMilanka Ringwald 	int number_of_tracks;
165a4cd9b30SMilanka Ringwald 	int bpm;
166a4cd9b30SMilanka Ringwald 	int speed;
167a4cd9b30SMilanka Ringwald 	int cur_pattern;
168a4cd9b30SMilanka Ringwald 	int cur_pattern_pos;
169a4cd9b30SMilanka Ringwald 	int cur_pattern_table_pos;
170a4cd9b30SMilanka Ringwald 	unsigned int buf_index;
171a4cd9b30SMilanka Ringwald 	track_state tracks[32];
172a4cd9b30SMilanka Ringwald }tracker_state;
173a4cd9b30SMilanka Ringwald 
174a4cd9b30SMilanka Ringwald typedef struct tracker_state_instrument_
175a4cd9b30SMilanka Ringwald {
176a4cd9b30SMilanka Ringwald 	char name[22];
177a4cd9b30SMilanka Ringwald 	int active;
178a4cd9b30SMilanka Ringwald }tracker_state_instrument;
179a4cd9b30SMilanka Ringwald 
180a4cd9b30SMilanka Ringwald typedef struct tracker_buffer_state_
181a4cd9b30SMilanka Ringwald {
182a4cd9b30SMilanka Ringwald 	int nb_max_of_state;
183a4cd9b30SMilanka Ringwald 	int nb_of_state;
184a4cd9b30SMilanka Ringwald 	int cur_rd_index;
185a4cd9b30SMilanka Ringwald 	int sample_step;
186a4cd9b30SMilanka Ringwald 	char name[64];
187a4cd9b30SMilanka Ringwald 	tracker_state_instrument instruments[31];
188a4cd9b30SMilanka Ringwald 	tracker_state * track_state_buf;
189a4cd9b30SMilanka Ringwald }tracker_buffer_state;
190a4cd9b30SMilanka Ringwald 
191a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
192a4cd9b30SMilanka Ringwald // HxCMOD Core API:
193a4cd9b30SMilanka Ringwald // -------------------------------------------
194a4cd9b30SMilanka Ringwald // int  hxcmod_init(modcontext * modctx)
195a4cd9b30SMilanka Ringwald //
196a4cd9b30SMilanka Ringwald // - Initialize the modcontext buffer. Must be called before doing anything else.
197a4cd9b30SMilanka Ringwald //   Return 1 if success. 0 in case of error.
198a4cd9b30SMilanka Ringwald // -------------------------------------------
199a4cd9b30SMilanka Ringwald // int  hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size )
200a4cd9b30SMilanka Ringwald //
201a4cd9b30SMilanka Ringwald // - "Load" a MOD from memory (from "mod_data" with size "mod_data_size").
202a4cd9b30SMilanka Ringwald //   Return 1 if success. 0 in case of error.
203a4cd9b30SMilanka Ringwald // -------------------------------------------
204a4cd9b30SMilanka Ringwald // void hxcmod_fillbuffer( modcontext * modctx, unsigned short * outbuffer, unsigned long nbsample, tracker_buffer_state * trkbuf )
205a4cd9b30SMilanka Ringwald //
206a4cd9b30SMilanka Ringwald // - Generate and return the next samples chunk to outbuffer.
207a4cd9b30SMilanka Ringwald //   nbsample specify the number of stereo 16bits samples you want.
208a4cd9b30SMilanka Ringwald //   The output format is signed 44100Hz 16-bit Stereo PCM samples.
209a4cd9b30SMilanka Ringwald //   The output buffer size in byte must be equal to ( nbsample * 2 * 2 ).
210a4cd9b30SMilanka Ringwald //   The optional trkbuf parameter can be used to get detailed status of the player. Put NULL/0 is unused.
211a4cd9b30SMilanka Ringwald // -------------------------------------------
212a4cd9b30SMilanka Ringwald // void hxcmod_unload( modcontext * modctx )
213a4cd9b30SMilanka Ringwald // - "Unload" / clear the player status.
214a4cd9b30SMilanka Ringwald // -------------------------------------------
215a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
216a4cd9b30SMilanka Ringwald 
217a4cd9b30SMilanka Ringwald int  hxcmod_init( modcontext * modctx );
218a4cd9b30SMilanka Ringwald int  hxcmod_setcfg( modcontext * modctx, int samplerate, int bits, int stereo, int stereo_separation, int filter);
219a4cd9b30SMilanka Ringwald int  hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size );
220a4cd9b30SMilanka Ringwald void hxcmod_fillbuffer( modcontext * modctx, unsigned short * outbuffer, unsigned long nbsample, tracker_buffer_state * trkbuf );
221a4cd9b30SMilanka Ringwald void hxcmod_unload( modcontext * modctx );
222a4cd9b30SMilanka Ringwald 
223a4cd9b30SMilanka Ringwald #endif
224a4cd9b30SMilanka Ringwald 
225b0920f25SMilanka Ringwald 
226b0920f25SMilanka Ringwald #if defined __cplusplus
227b0920f25SMilanka Ringwald }
228b0920f25SMilanka Ringwald #endif
229b0920f25SMilanka Ringwald 
230b0920f25SMilanka Ringwald #endif // __HXCMOD_H
231