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