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