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