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