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 // 15d38efbbaSMatthias Ringwald // Written by: Jean Francois DEL NERO 16a4cd9b30SMilanka Ringwald // 17a4cd9b30SMilanka Ringwald // Change History (most recent first): 18a4cd9b30SMilanka Ringwald /////////////////////////////////////////////////////////////////////////////////// 198201da88SMatthias Ringwald #ifndef MODPLAY_DEF 208201da88SMatthias Ringwald #define MODPLAY_DEF 21a4cd9b30SMilanka Ringwald 228201da88SMatthias Ringwald #ifdef __cplusplus 23b0920f25SMilanka Ringwald extern "C" { 24b0920f25SMilanka Ringwald #endif 25b0920f25SMilanka Ringwald 268201da88SMatthias Ringwald #ifndef HXCMOD_SLOW_TARGET 278201da88SMatthias Ringwald #define HXCMOD_STATE_REPORT_SUPPORT 1 288201da88SMatthias Ringwald #define HXCMOD_OUTPUT_FILTER 1 298201da88SMatthias Ringwald #define HXCMOD_OUTPUT_STEREO_MIX 1 308201da88SMatthias Ringwald #define HXCMOD_CLIPPING_CHECK 1 318201da88SMatthias Ringwald #endif 32b0920f25SMilanka Ringwald 338201da88SMatthias Ringwald // Warning : The following option 348201da88SMatthias Ringwald // required 32KB of additional RAM : 358201da88SMatthias Ringwald // #define HXCMOD_USE_PRECALC_VOLUME_TABLE 1 36a4cd9b30SMilanka Ringwald 37a4cd9b30SMilanka Ringwald // Basic type 38a4cd9b30SMilanka Ringwald typedef unsigned char muchar; 39afc6fe18SMatthias Ringwald typedef signed char mchar; 40a4cd9b30SMilanka Ringwald typedef unsigned short muint; 41a4cd9b30SMilanka Ringwald typedef short mint; 42a4cd9b30SMilanka Ringwald typedef unsigned long mulong; 43a4cd9b30SMilanka Ringwald 448201da88SMatthias Ringwald #ifdef HXCMOD_16BITS_TARGET 458201da88SMatthias Ringwald typedef unsigned short mssize; 468201da88SMatthias Ringwald #else 478201da88SMatthias Ringwald typedef unsigned long mssize; 488201da88SMatthias Ringwald #endif 498201da88SMatthias Ringwald 508201da88SMatthias Ringwald #ifdef HXCMOD_8BITS_OUTPUT 518201da88SMatthias Ringwald #ifdef HXCMOD_UNSIGNED_OUTPUT 528201da88SMatthias Ringwald typedef unsigned char msample; 538201da88SMatthias Ringwald #else 548201da88SMatthias Ringwald typedef signed char msample; 558201da88SMatthias Ringwald #endif 568201da88SMatthias Ringwald #else 578201da88SMatthias Ringwald #ifdef HXCMOD_UNSIGNED_OUTPUT 588201da88SMatthias Ringwald typedef unsigned short msample; 598201da88SMatthias Ringwald #else 608201da88SMatthias Ringwald typedef signed short msample; 618201da88SMatthias Ringwald #endif 628201da88SMatthias Ringwald #endif 638201da88SMatthias Ringwald 648201da88SMatthias Ringwald #ifdef HXCMOD_MAXCHANNELS 658201da88SMatthias Ringwald #define NUMMAXCHANNELS HXCMOD_MAXCHANNELS 668201da88SMatthias Ringwald #else 67a4cd9b30SMilanka Ringwald #define NUMMAXCHANNELS 32 688201da88SMatthias Ringwald #endif 698201da88SMatthias Ringwald 70a4cd9b30SMilanka Ringwald #define MAXNOTES 12*12 718201da88SMatthias Ringwald 72a4cd9b30SMilanka Ringwald // 73a4cd9b30SMilanka Ringwald // MOD file structures 74a4cd9b30SMilanka Ringwald // 75a4cd9b30SMilanka Ringwald 76a4cd9b30SMilanka Ringwald #pragma pack(1) 77a4cd9b30SMilanka Ringwald 78a4cd9b30SMilanka Ringwald typedef struct { 79a4cd9b30SMilanka Ringwald muchar name[22]; 80a4cd9b30SMilanka Ringwald muint length; 81a4cd9b30SMilanka Ringwald muchar finetune; 82a4cd9b30SMilanka Ringwald muchar volume; 83a4cd9b30SMilanka Ringwald muint reppnt; 84a4cd9b30SMilanka Ringwald muint replen; 85a4cd9b30SMilanka Ringwald } sample; 86a4cd9b30SMilanka Ringwald 87a4cd9b30SMilanka Ringwald typedef struct { 88a4cd9b30SMilanka Ringwald muchar sampperiod; 89a4cd9b30SMilanka Ringwald muchar period; 90a4cd9b30SMilanka Ringwald muchar sampeffect; 91a4cd9b30SMilanka Ringwald muchar effect; 92a4cd9b30SMilanka Ringwald } note; 93a4cd9b30SMilanka Ringwald 94a4cd9b30SMilanka Ringwald typedef struct { 95a4cd9b30SMilanka Ringwald muchar title[20]; 96a4cd9b30SMilanka Ringwald sample samples[31]; 97a4cd9b30SMilanka Ringwald muchar length; 98a4cd9b30SMilanka Ringwald muchar protracker; 99a4cd9b30SMilanka Ringwald muchar patterntable[128]; 100a4cd9b30SMilanka Ringwald muchar signature[4]; 101a4cd9b30SMilanka Ringwald muchar speed; 102a4cd9b30SMilanka Ringwald } module; 103a4cd9b30SMilanka Ringwald 104a4cd9b30SMilanka Ringwald #pragma pack() 105a4cd9b30SMilanka Ringwald 106a4cd9b30SMilanka Ringwald // 107a4cd9b30SMilanka Ringwald // HxCMod Internal structures 108a4cd9b30SMilanka Ringwald // 109a4cd9b30SMilanka Ringwald typedef struct { 110afc6fe18SMatthias Ringwald mchar * sampdata; 111a4cd9b30SMilanka Ringwald muint length; 112a4cd9b30SMilanka Ringwald muint reppnt; 113a4cd9b30SMilanka Ringwald muint replen; 1148201da88SMatthias Ringwald muchar sampnum; 1158201da88SMatthias Ringwald 1168201da88SMatthias Ringwald mchar * nxt_sampdata; 1178201da88SMatthias Ringwald muint nxt_length; 1188201da88SMatthias Ringwald muint nxt_reppnt; 1198201da88SMatthias Ringwald muint nxt_replen; 1208201da88SMatthias Ringwald muchar update_nxt_repeat; 1218201da88SMatthias Ringwald 1228201da88SMatthias Ringwald mchar * dly_sampdata; 1238201da88SMatthias Ringwald muint dly_length; 1248201da88SMatthias Ringwald muint dly_reppnt; 1258201da88SMatthias Ringwald muint dly_replen; 1268201da88SMatthias Ringwald muchar note_delay; 1278201da88SMatthias Ringwald 1288201da88SMatthias Ringwald mchar * lst_sampdata; 1298201da88SMatthias Ringwald muint lst_length; 1308201da88SMatthias Ringwald muint lst_reppnt; 1318201da88SMatthias Ringwald muint lst_replen; 1328201da88SMatthias Ringwald muchar retrig_cnt; 1338201da88SMatthias Ringwald muchar retrig_param; 1348201da88SMatthias Ringwald 1358201da88SMatthias Ringwald muint funkoffset; 1368201da88SMatthias Ringwald mint funkspeed; 1378201da88SMatthias Ringwald 1388201da88SMatthias Ringwald mint glissando; 1398201da88SMatthias Ringwald 140a4cd9b30SMilanka Ringwald mulong samppos; 1418201da88SMatthias Ringwald mulong sampinc; 142a4cd9b30SMilanka Ringwald muint period; 143a4cd9b30SMilanka Ringwald muchar volume; 1448201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE 1458201da88SMatthias Ringwald mint * volume_table; 1468201da88SMatthias Ringwald #endif 147a4cd9b30SMilanka Ringwald muchar effect; 148a4cd9b30SMilanka Ringwald muchar parameffect; 149a4cd9b30SMilanka Ringwald muint effect_code; 150a4cd9b30SMilanka Ringwald 1518201da88SMatthias Ringwald mulong last_set_offset; 152a4cd9b30SMilanka Ringwald 153a4cd9b30SMilanka Ringwald mint decalperiod; 154a4cd9b30SMilanka Ringwald mint portaspeed; 155a4cd9b30SMilanka Ringwald mint portaperiod; 156a4cd9b30SMilanka Ringwald mint vibraperiod; 157a4cd9b30SMilanka Ringwald mint Arpperiods[3]; 158a4cd9b30SMilanka Ringwald muchar ArpIndex; 159a4cd9b30SMilanka Ringwald 160a4cd9b30SMilanka Ringwald muchar volumeslide; 161a4cd9b30SMilanka Ringwald 162a4cd9b30SMilanka Ringwald muchar vibraparam; 163a4cd9b30SMilanka Ringwald muchar vibrapointeur; 164a4cd9b30SMilanka Ringwald 165a4cd9b30SMilanka Ringwald muchar finetune; 166a4cd9b30SMilanka Ringwald 167a4cd9b30SMilanka Ringwald muchar cut_param; 168a4cd9b30SMilanka Ringwald 169a4cd9b30SMilanka Ringwald muint patternloopcnt; 170a4cd9b30SMilanka Ringwald muint patternloopstartpoint; 171*b7454a87SMatthias Ringwald } hxcmod_channel_t; 172a4cd9b30SMilanka Ringwald 173a4cd9b30SMilanka Ringwald typedef struct { 174a4cd9b30SMilanka Ringwald module song; 175afc6fe18SMatthias Ringwald mchar * sampledata[31]; 176a4cd9b30SMilanka Ringwald note * patterndata[128]; 177a4cd9b30SMilanka Ringwald 1788201da88SMatthias Ringwald #ifdef HXCMOD_16BITS_TARGET 1798201da88SMatthias Ringwald muint playrate; 1808201da88SMatthias Ringwald #else 181a4cd9b30SMilanka Ringwald mulong playrate; 1828201da88SMatthias Ringwald #endif 1838201da88SMatthias Ringwald 184a4cd9b30SMilanka Ringwald muint tablepos; 185a4cd9b30SMilanka Ringwald muint patternpos; 186a4cd9b30SMilanka Ringwald muint patterndelay; 1878201da88SMatthias Ringwald muchar jump_loop_effect; 188a4cd9b30SMilanka Ringwald muchar bpm; 1898201da88SMatthias Ringwald 1908201da88SMatthias Ringwald #ifdef HXCMOD_16BITS_TARGET 1918201da88SMatthias Ringwald muint patternticks; 1928201da88SMatthias Ringwald muint patterntickse; 1938201da88SMatthias Ringwald muint patternticksaim; 1948201da88SMatthias Ringwald muint patternticksem; 1958201da88SMatthias Ringwald muint tick_cnt; 1968201da88SMatthias Ringwald #else 197a4cd9b30SMilanka Ringwald mulong patternticks; 198a4cd9b30SMilanka Ringwald mulong patterntickse; 199a4cd9b30SMilanka Ringwald mulong patternticksaim; 2008201da88SMatthias Ringwald mulong patternticksem; 2018201da88SMatthias Ringwald mulong tick_cnt; 2028201da88SMatthias Ringwald #endif 2038201da88SMatthias Ringwald 204a4cd9b30SMilanka Ringwald mulong sampleticksconst; 205a4cd9b30SMilanka Ringwald 206*b7454a87SMatthias Ringwald hxcmod_channel_t channels[NUMMAXCHANNELS]; 207a4cd9b30SMilanka Ringwald 208a4cd9b30SMilanka Ringwald muint number_of_channels; 209a4cd9b30SMilanka Ringwald 210a4cd9b30SMilanka Ringwald muint mod_loaded; 211a4cd9b30SMilanka Ringwald 212a4cd9b30SMilanka Ringwald mint last_r_sample; 213a4cd9b30SMilanka Ringwald mint last_l_sample; 214a4cd9b30SMilanka Ringwald 215a4cd9b30SMilanka Ringwald mint stereo; 216a4cd9b30SMilanka Ringwald mint stereo_separation; 217a4cd9b30SMilanka Ringwald mint bits; 218a4cd9b30SMilanka Ringwald mint filter; 219a4cd9b30SMilanka Ringwald 2208201da88SMatthias Ringwald #ifdef EFFECTS_USAGE_STATE 2218201da88SMatthias Ringwald int effects_event_counts[32]; 2228201da88SMatthias Ringwald #endif 2238201da88SMatthias Ringwald 2248201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE 2258201da88SMatthias Ringwald mint precalc_volume_array[65*256]; 2268201da88SMatthias Ringwald mint * volume_selection_table[65]; 2278201da88SMatthias Ringwald #endif 2288201da88SMatthias Ringwald 229a4cd9b30SMilanka Ringwald } modcontext; 230a4cd9b30SMilanka Ringwald 231a4cd9b30SMilanka Ringwald // 232a4cd9b30SMilanka Ringwald // Player states structures 233a4cd9b30SMilanka Ringwald // 234a4cd9b30SMilanka Ringwald typedef struct track_state_ 235a4cd9b30SMilanka Ringwald { 236a4cd9b30SMilanka Ringwald unsigned char instrument_number; 237a4cd9b30SMilanka Ringwald unsigned short cur_period; 238a4cd9b30SMilanka Ringwald unsigned char cur_volume; 239a4cd9b30SMilanka Ringwald unsigned short cur_effect; 240a4cd9b30SMilanka Ringwald unsigned short cur_parameffect; 241a4cd9b30SMilanka Ringwald }track_state; 242a4cd9b30SMilanka Ringwald 243a4cd9b30SMilanka Ringwald typedef struct tracker_state_ 244a4cd9b30SMilanka Ringwald { 245a4cd9b30SMilanka Ringwald int number_of_tracks; 246a4cd9b30SMilanka Ringwald int bpm; 247a4cd9b30SMilanka Ringwald int speed; 248a4cd9b30SMilanka Ringwald int cur_pattern; 249a4cd9b30SMilanka Ringwald int cur_pattern_pos; 250a4cd9b30SMilanka Ringwald int cur_pattern_table_pos; 251a4cd9b30SMilanka Ringwald unsigned int buf_index; 2528201da88SMatthias Ringwald track_state tracks[NUMMAXCHANNELS]; 253a4cd9b30SMilanka Ringwald }tracker_state; 254a4cd9b30SMilanka Ringwald 255a4cd9b30SMilanka Ringwald typedef struct tracker_state_instrument_ 256a4cd9b30SMilanka Ringwald { 257a4cd9b30SMilanka Ringwald char name[22]; 258a4cd9b30SMilanka Ringwald int active; 259a4cd9b30SMilanka Ringwald }tracker_state_instrument; 260a4cd9b30SMilanka Ringwald 261a4cd9b30SMilanka Ringwald typedef struct tracker_buffer_state_ 262a4cd9b30SMilanka Ringwald { 263a4cd9b30SMilanka Ringwald int nb_max_of_state; 264a4cd9b30SMilanka Ringwald int nb_of_state; 265a4cd9b30SMilanka Ringwald int cur_rd_index; 266a4cd9b30SMilanka Ringwald int sample_step; 267a4cd9b30SMilanka Ringwald char name[64]; 268a4cd9b30SMilanka Ringwald tracker_state_instrument instruments[31]; 269a4cd9b30SMilanka Ringwald tracker_state * track_state_buf; 270a4cd9b30SMilanka Ringwald }tracker_buffer_state; 271a4cd9b30SMilanka Ringwald 272a4cd9b30SMilanka Ringwald /////////////////////////////////////////////////////////////////////////////////// 273a4cd9b30SMilanka Ringwald // HxCMOD Core API: 274a4cd9b30SMilanka Ringwald // ------------------------------------------- 275a4cd9b30SMilanka Ringwald // int hxcmod_init(modcontext * modctx) 276a4cd9b30SMilanka Ringwald // 277a4cd9b30SMilanka Ringwald // - Initialize the modcontext buffer. Must be called before doing anything else. 278a4cd9b30SMilanka Ringwald // Return 1 if success. 0 in case of error. 279a4cd9b30SMilanka Ringwald // ------------------------------------------- 280a4cd9b30SMilanka Ringwald // int hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size ) 281a4cd9b30SMilanka Ringwald // 282a4cd9b30SMilanka Ringwald // - "Load" a MOD from memory (from "mod_data" with size "mod_data_size"). 283a4cd9b30SMilanka Ringwald // Return 1 if success. 0 in case of error. 284a4cd9b30SMilanka Ringwald // ------------------------------------------- 2858201da88SMatthias Ringwald // void hxcmod_fillbuffer( modcontext * modctx, unsigned short * outbuffer, mssize nbsample, tracker_buffer_state * trkbuf ) 286a4cd9b30SMilanka Ringwald // 287a4cd9b30SMilanka Ringwald // - Generate and return the next samples chunk to outbuffer. 288a4cd9b30SMilanka Ringwald // nbsample specify the number of stereo 16bits samples you want. 289a4cd9b30SMilanka Ringwald // The output format is signed 44100Hz 16-bit Stereo PCM samples. 290a4cd9b30SMilanka Ringwald // The output buffer size in byte must be equal to ( nbsample * 2 * 2 ). 291a4cd9b30SMilanka Ringwald // The optional trkbuf parameter can be used to get detailed status of the player. Put NULL/0 is unused. 292a4cd9b30SMilanka Ringwald // ------------------------------------------- 293a4cd9b30SMilanka Ringwald // void hxcmod_unload( modcontext * modctx ) 2948201da88SMatthias Ringwald // 295a4cd9b30SMilanka Ringwald // - "Unload" / clear the player status. 296a4cd9b30SMilanka Ringwald // ------------------------------------------- 297a4cd9b30SMilanka Ringwald /////////////////////////////////////////////////////////////////////////////////// 298a4cd9b30SMilanka Ringwald 299a4cd9b30SMilanka Ringwald int hxcmod_init( modcontext * modctx ); 3008201da88SMatthias Ringwald int hxcmod_setcfg( modcontext * modctx, int samplerate, int stereo_separation, int filter ); 301a4cd9b30SMilanka Ringwald int hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size ); 3028201da88SMatthias Ringwald void hxcmod_fillbuffer( modcontext * modctx, msample * outbuffer, mssize nbsample, tracker_buffer_state * trkbuf ); 303a4cd9b30SMilanka Ringwald void hxcmod_unload( modcontext * modctx ); 304a4cd9b30SMilanka Ringwald 3058201da88SMatthias Ringwald #ifdef __cplusplus 306b0920f25SMilanka Ringwald } 307b0920f25SMilanka Ringwald #endif 308b0920f25SMilanka Ringwald 3098201da88SMatthias Ringwald #endif /* MODPLAY_DEF */ 310