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