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