1 /* MikMod sound library 2 (c) 1998, 1999 Miodrag Vallat and others - see file AUTHORS for 3 complete list. 4 5 This library is free software; you can redistribute it and/or modify 6 it under the terms of the GNU Library General Public License as 7 published by the Free Software Foundation; either version 2 of 8 the License, or (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU Library General Public License for more details. 14 15 You should have received a copy of the GNU Library General Public 16 License along with this library; if not, write to the Free Software 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 18 02111-1307, USA. 19 */ 20 21 /*============================================================================== 22 23 $Id$ 24 25 MikMod sound library include file 26 27 ==============================================================================*/ 28 29 #ifndef _UNIMOD_H_ 30 #define _UNIMOD_H_ 31 32 #include <stdio.h> 33 #include <stdlib.h> 34 #include "url.h" 35 36 #ifdef __cplusplus 37 extern "C" 38 { 39 #endif 40 41 /* 42 * ========== Platform independent-type definitions 43 */ 44 45 #ifdef __W32__ 46 #define WIN32_LEAN_AND_MEAN 47 #if defined(__POCC__) && defined(RC_NONE) 48 #undef RC_NONE 49 #endif 50 #include <windows.h> 51 #ifdef __POCC__ 52 #ifdef RC_NONE 53 #undef RC_NONE 54 #endif 55 #define RC_NONE 0 56 #endif 57 #include <io.h> 58 #elif defined(__OS2__)||defined(__EMX__) 59 #define INCL_DOSSEMAPHORES 60 #include <os2.h> 61 #else 62 typedef char CHAR; 63 #endif 64 65 #if defined(__alpha) || defined(_LP64) || defined (__LP64__) 66 /* 64 bit architectures */ 67 68 typedef signed char SBYTE; /* 1 byte, signed */ 69 typedef unsigned char UBYTE; /* 1 byte, unsigned */ 70 typedef signed short SWORD; /* 2 bytes, signed */ 71 typedef unsigned short UWORD; /* 2 bytes, unsigned */ 72 typedef signed int SLONG; /* 4 bytes, signed */ 73 typedef unsigned int ULONG; /* 4 bytes, unsigned */ 74 typedef int BOOL; /* 0=false, <>0 true */ 75 76 #else 77 /* 32 bit architectures */ 78 79 typedef signed char SBYTE; /* 1 byte, signed */ 80 typedef unsigned char UBYTE; /* 1 byte, unsigned */ 81 typedef signed short SWORD; /* 2 bytes, signed */ 82 typedef unsigned short UWORD; /* 2 bytes, unsigned */ 83 typedef signed long SLONG; /* 4 bytes, signed */ 84 #if !defined(__OS2__)&&!defined(__EMX__)&&!defined(__W32__) 85 typedef unsigned long ULONG; /* 4 bytes, unsigned */ 86 typedef int BOOL; /* 0=false, <>0 true */ 87 #endif 88 #endif 89 90 /* 91 * ========== Error handling and error codes 92 */ 93 94 extern int ML_errno; 95 extern char *ML_strerror (int); 96 97 enum 98 { 99 MMERR_OPENING_FILE = 1, 100 MMERR_OUT_OF_MEMORY, 101 MMERR_DYNAMIC_LINKING, 102 103 MMERR_SAMPLE_TOO_BIG, 104 MMERR_OUT_OF_HANDLES, 105 MMERR_UNKNOWN_WAVE_TYPE, 106 107 MMERR_LOADING_PATTERN, 108 MMERR_LOADING_TRACK, 109 MMERR_LOADING_HEADER, 110 MMERR_LOADING_SAMPLEINFO, 111 MMERR_NOT_A_MODULE, 112 MMERR_NOT_A_STREAM, 113 MMERR_MED_SYNTHSAMPLES, 114 MMERR_ITPACK_INVALID_DATA, 115 116 MMERR_MAX 117 }; 118 119 /*========== Internal module representation (UniMod) interface */ 120 121 /* number of notes in an octave */ 122 #define OCTAVE 12 123 124 extern void UniSetRow (UBYTE *); 125 extern UBYTE UniGetByte (void); 126 extern UWORD UniGetWord (void); 127 extern UBYTE *UniFindRow (UBYTE *, UWORD); 128 extern void UniSkipOpcode (UBYTE); 129 extern void UniReset (void); 130 extern void UniWriteByte (UBYTE); 131 extern void UniWriteWord (UWORD); 132 extern void UniNewline (void); 133 extern UBYTE *UniDup (void); 134 extern BOOL UniInit (void); 135 extern void UniCleanup (void); 136 extern void UniEffect (UWORD, UWORD); 137 #define UniInstrument(x) UniEffect(UNI_INSTRUMENT,x) 138 #define UniNote(x) UniEffect(UNI_NOTE,x) 139 extern void UniPTEffect (UBYTE, UBYTE); 140 extern void UniVolEffect (UWORD, UBYTE); 141 142 /*========== Module Commands */ 143 144 enum 145 { 146 /* Simple note */ 147 UNI_NOTE = 1, 148 /* Instrument change */ 149 UNI_INSTRUMENT, 150 /* Protracker effects */ 151 UNI_PTEFFECT0, /* arpeggio */ 152 UNI_PTEFFECT1, /* porta up */ 153 UNI_PTEFFECT2, /* porta down */ 154 UNI_PTEFFECT3, /* porta to note */ 155 UNI_PTEFFECT4, /* vibrato */ 156 UNI_PTEFFECT5, /* dual effect 3+A */ 157 UNI_PTEFFECT6, /* dual effect 4+A */ 158 UNI_PTEFFECT7, /* tremolo */ 159 UNI_PTEFFECT8, /* pan */ 160 UNI_PTEFFECT9, /* sample offset */ 161 UNI_PTEFFECTA, /* volume slide */ 162 UNI_PTEFFECTB, /* pattern jump */ 163 UNI_PTEFFECTC, /* set volume */ 164 UNI_PTEFFECTD, /* pattern break */ 165 UNI_PTEFFECTE, /* extended effects */ 166 UNI_PTEFFECTF, /* set speed */ 167 /* Scream Tracker effects */ 168 UNI_S3MEFFECTA, /* set speed */ 169 UNI_S3MEFFECTD, /* volume slide */ 170 UNI_S3MEFFECTE, /* porta down */ 171 UNI_S3MEFFECTF, /* porta up */ 172 UNI_S3MEFFECTI, /* tremor */ 173 UNI_S3MEFFECTQ, /* retrig */ 174 UNI_S3MEFFECTR, /* tremolo */ 175 UNI_S3MEFFECTT, /* set tempo */ 176 UNI_S3MEFFECTU, /* fine vibrato */ 177 UNI_KEYOFF, /* note off */ 178 /* Fast Tracker effects */ 179 UNI_KEYFADE, /* note fade */ 180 UNI_VOLEFFECTS, /* volume column effects */ 181 UNI_XMEFFECT4, /* vibrato */ 182 UNI_XMEFFECTA, /* volume slide */ 183 UNI_XMEFFECTE1, /* fine porta up */ 184 UNI_XMEFFECTE2, /* fine porta down */ 185 UNI_XMEFFECTEA, /* fine volume slide up */ 186 UNI_XMEFFECTEB, /* fine volume slide down */ 187 UNI_XMEFFECTG, /* set global volume */ 188 UNI_XMEFFECTH, /* global volume slide */ 189 UNI_XMEFFECTL, /* set envelope position */ 190 UNI_XMEFFECTP, /* pan slide */ 191 UNI_XMEFFECTX1, /* extra fine porta up */ 192 UNI_XMEFFECTX2, /* extra fine porta down */ 193 /* Impulse Tracker effects */ 194 UNI_ITEFFECTG, /* porta to note */ 195 UNI_ITEFFECTH, /* vibrato */ 196 UNI_ITEFFECTI, /* tremor (xy not incremented) */ 197 UNI_ITEFFECTM, /* set channel volume */ 198 UNI_ITEFFECTN, /* slide / fineslide channel volume */ 199 UNI_ITEFFECTP, /* slide / fineslide channel panning */ 200 UNI_ITEFFECTT, /* slide tempo */ 201 UNI_ITEFFECTU, /* fine vibrato */ 202 UNI_ITEFFECTW, /* slide / fineslide global volume */ 203 UNI_ITEFFECTY, /* panbrello */ 204 UNI_ITEFFECTZ, /* resonant filters */ 205 UNI_ITEFFECTS0, 206 /* UltraTracker effects */ 207 UNI_ULTEFFECT9, /* Sample fine offset */ 208 /* OctaMED effects */ 209 UNI_MEDSPEED, 210 UNI_MEDEFFECTF1, /* play note twice */ 211 UNI_MEDEFFECTF2, /* delay note */ 212 UNI_MEDEFFECTF3, /* play note three times */ 213 214 UNI_LAST 215 }; 216 217 extern UWORD unioperands[UNI_LAST]; 218 219 /* IT / S3M Extended SS effects: */ 220 enum 221 { 222 SS_GLISSANDO = 1, 223 SS_FINETUNE, 224 SS_VIBWAVE, 225 SS_TREMWAVE, 226 SS_PANWAVE, 227 SS_FRAMEDELAY, 228 SS_S7EFFECTS, 229 SS_PANNING, 230 SS_SURROUND, 231 SS_HIOFFSET, 232 SS_PATLOOP, 233 SS_NOTECUT, 234 SS_NOTEDELAY, 235 SS_PATDELAY 236 }; 237 238 /* IT Volume column effects */ 239 enum 240 { 241 VOL_VOLUME = 1, 242 VOL_PANNING, 243 VOL_VOLSLIDE, 244 VOL_PITCHSLIDEDN, 245 VOL_PITCHSLIDEUP, 246 VOL_PORTAMENTO, 247 VOL_VIBRATO 248 }; 249 250 /* IT resonant filter information */ 251 252 #define FILT_CUT 0x80 253 #define FILT_RESONANT 0x81 254 255 typedef struct FILTER 256 { 257 UBYTE filter, inf; 258 } 259 FILTER; 260 261 /*========== Instruments */ 262 263 /* Instrument format flags */ 264 #define IF_OWNPAN 1 265 #define IF_PITCHPAN 2 266 267 /* Envelope flags: */ 268 #define EF_ON 1 269 #define EF_SUSTAIN 2 270 #define EF_LOOP 4 271 #define EF_VOLENV 8 272 273 /* New Note Action Flags */ 274 #define NNA_CUT 0 275 #define NNA_CONTINUE 1 276 #define NNA_OFF 2 277 #define NNA_FADE 3 278 279 #define NNA_MASK 3 280 281 #define DCT_OFF 0 282 #define DCT_NOTE 1 283 #define DCT_SAMPLE 2 284 #define DCT_INST 3 285 286 #define DCA_CUT 0 287 #define DCA_OFF 1 288 #define DCA_FADE 2 289 290 #define KEY_KICK 0 291 #define KEY_OFF 1 292 #define KEY_FADE 2 293 #define KEY_KILL (KEY_OFF|KEY_FADE) 294 295 #define KICK_ABSENT 0 296 #define KICK_NOTE 1 297 #define KICK_KEYOFF 2 298 #define KICK_ENV 4 299 300 #define AV_IT 1 /* IT vs. XM vibrato info */ 301 302 303 /* 304 * ========== Samples 305 */ 306 307 /* Sample format [loading and in-memory] flags: */ 308 #define SF_16BITS 0x0001 309 #define SF_STEREO 0x0002 310 #define SF_SIGNED 0x0004 311 #define SF_BIG_ENDIAN 0x0008 312 #define SF_DELTA 0x0010 313 #define SF_ITPACKED 0x0020 314 315 #define SF_FORMATMASK 0x003F 316 317 /* General Playback flags */ 318 319 #define SF_LOOP 0x0100 320 #define SF_BIDI 0x0200 321 #define SF_REVERSE 0x0400 322 #define SF_SUSTAIN 0x0800 323 324 #define SF_PLAYBACKMASK 0x0C00 325 326 /* Module-only Playback Flags */ 327 328 #define SF_OWNPAN 0x1000 329 #define SF_UST_LOOP 0x2000 330 331 #define SF_EXTRAPLAYBACKMASK 0x3000 332 333 /* Panning constants */ 334 #define PAN_LEFT 0 335 #define PAN_CENTER 128 336 #define PAN_RIGHT 255 337 #define PAN_SURROUND 512 /* panning value for Dolby Surround */ 338 339 /* This stuff is all filled -- it's up to you whether to implement it. */ 340 typedef struct SAMPLE 341 { 342 SWORD panning; /* panning (0-255 or PAN_SURROUND) */ 343 ULONG speed; /* Base playing speed/frequency of note */ 344 UBYTE volume; /* volume 0-64 */ 345 UWORD inflags; /* sample format on disk */ 346 UWORD flags; /* sample format in memory */ 347 ULONG length; /* length of sample (in samples!) */ 348 ULONG loopstart; /* repeat position (relative to start, in samples) */ 349 ULONG loopend; /* repeat end */ 350 ULONG susbegin; /* sustain loop begin (in samples) */ 351 ULONG susend; /* sustain loop end */ 352 353 UBYTE globvol; /* global volume */ 354 UBYTE vibflags; /* autovibrato flag stuffs */ 355 UBYTE vibtype; /* Vibratos moved from INSTRUMENT to SAMPLE */ 356 UBYTE vibsweep; 357 UBYTE vibdepth; 358 UBYTE vibrate; 359 CHAR *samplename; /* name of the sample */ 360 361 UWORD id; /* available for user */ 362 UBYTE divfactor; /* for sample scaling */ 363 ULONG seekpos; /* seek position in file -- internal */ 364 SWORD *data; /* ptr to actual sample data */ 365 } 366 SAMPLE; 367 368 /* 369 * ========== Internal module representation (UniMod) 370 */ 371 372 /* 373 Instrument definition - for information only, the only field which may be 374 of use in user programs is the name field 375 */ 376 377 /* Instrument note count */ 378 #define INSTNOTES 120 379 380 /* Envelope point */ 381 typedef struct ENVPT 382 { 383 SWORD pos; 384 SWORD val; 385 } 386 ENVPT; 387 388 /* Envelope point count */ 389 #define ENVPOINTS 32 390 391 /* Instrument structure */ 392 typedef struct INSTRUMENT 393 { 394 CHAR *insname; 395 396 UBYTE flags; 397 UWORD samplenumber[INSTNOTES]; 398 UBYTE samplenote[INSTNOTES]; 399 400 UBYTE nnatype; 401 UBYTE dca; /* duplicate check action */ 402 UBYTE dct; /* duplicate check type */ 403 UBYTE globvol; 404 UWORD volfade; 405 SWORD panning; /* instrument-based panning var */ 406 407 UBYTE pitpansep; /* pitch pan separation (0 to 255) */ 408 UBYTE pitpancenter; /* pitch pan center (0 to 119) */ 409 UBYTE rvolvar; /* random volume varations (0 - 100%) */ 410 UBYTE rpanvar; /* random panning varations (0 - 100%) */ 411 412 /* volume envelope */ 413 UBYTE volflg; /* bit 0: on 1: sustain 2: loop */ 414 UBYTE volpts; 415 UBYTE volsusbeg; 416 UBYTE volsusend; 417 UBYTE volbeg; 418 UBYTE volend; 419 ENVPT volenv[ENVPOINTS]; 420 /* panning envelope */ 421 UBYTE panflg; /* bit 0: on 1: sustain 2: loop */ 422 UBYTE panpts; 423 UBYTE pansusbeg; 424 UBYTE pansusend; 425 UBYTE panbeg; 426 UBYTE panend; 427 ENVPT panenv[ENVPOINTS]; 428 /* pitch envelope */ 429 UBYTE pitflg; /* bit 0: on 1: sustain 2: loop */ 430 UBYTE pitpts; 431 UBYTE pitsusbeg; 432 UBYTE pitsusend; 433 UBYTE pitbeg; 434 UBYTE pitend; 435 ENVPT pitenv[ENVPOINTS]; 436 } 437 INSTRUMENT; 438 439 #define UF_MAXCHAN 64 440 #define UF_MAXMACRO 0x10 441 #define UF_MAXFILTER 0x100 442 443 /* Module flags */ 444 #define UF_XMPERIODS 0x0001 /* XM periods / finetuning */ 445 #define UF_LINEAR 0x0002 /* LINEAR periods (UF_XMPERIODS must be set) */ 446 #define UF_INST 0x0004 /* Instruments are used */ 447 #define UF_NNA 0x0008 /* IT: NNA used, set numvoices rather than numchn */ 448 #define UF_S3MSLIDES 0x0010 /* uses old S3M volume slides */ 449 #define UF_BGSLIDES 0x0020 /* continue volume slides in the background */ 450 #define UF_HIGHBPM 0x0040 /* MED: can use >255 bpm */ 451 #define UF_NOWRAP 0x0080 /* XM-type (i.e. illogical) pattern brk semantics */ 452 #define UF_ARPMEM 0x0100 /* IT: need arpeggio memory */ 453 #define UF_FT2QUIRKS 0x0200 /* emulate some FT2 replay quirks */ 454 455 typedef struct MODULE 456 { 457 /* general module information */ 458 CHAR *songname; /* name of the song */ 459 CHAR *modtype; /* string type of module loaded */ 460 CHAR *comment; /* module comments */ 461 462 UWORD flags; /* See module flags above */ 463 UBYTE numchn; /* number of module channels */ 464 UBYTE numvoices; /* max # voices used for full NNA playback */ 465 UWORD numpos; /* number of positions in this song */ 466 UWORD numpat; /* number of patterns in this song */ 467 UWORD numins; /* number of instruments */ 468 UWORD numsmp; /* number of samples */ 469 INSTRUMENT *instruments; /* all instruments */ 470 SAMPLE *samples; /* all samples */ 471 472 /* playback settings */ 473 UWORD reppos; /* restart position */ 474 UBYTE initspeed; /* initial song speed */ 475 UWORD inittempo; /* initial song tempo */ 476 UBYTE initvolume; /* initial global volume (0 - 128) */ 477 UWORD panning[UF_MAXCHAN]; /* 64 panning positions */ 478 UBYTE chanvol[UF_MAXCHAN]; /* 64 channel positions */ 479 UWORD bpm; /* current beats-per-minute speed */ 480 481 /* internal module representation */ 482 UWORD numtrk; /* number of tracks */ 483 UBYTE **tracks; /* array of numtrk pointers to tracks */ 484 UWORD *patterns; /* array of Patterns */ 485 UWORD *pattrows; /* array of number of rows for each pattern */ 486 UWORD *positions; /* all positions */ 487 } 488 MODULE; 489 490 /* used to convert c4spd to linear XM periods (IT and IMF loaders). */ 491 extern UWORD finetune[]; 492 extern UWORD getlinearperiod (UWORD, ULONG); 493 extern UWORD getlogperiod (UWORD note, ULONG fine); 494 extern UWORD getoldperiod (UWORD, ULONG); 495 extern ULONG getfrequency (UBYTE, ULONG); 496 extern ULONG getAmigaPeriod (UBYTE, ULONG); 497 498 /* 499 * ========== External interface 500 */ 501 502 extern UWORD finetune[]; 503 extern BOOL ML_8bitsamples; 504 extern BOOL ML_monosamples; 505 extern CHAR *ML_InfoLoader (void); 506 extern void ML_RegisterAllLoaders (void); 507 extern BOOL ML_Test (URL); 508 extern MODULE *ML_Load (URL, int, BOOL); 509 extern CHAR *ML_LoadTitle (URL); 510 extern void ML_Free (MODULE *); 511 512 #ifdef __cplusplus 513 } 514 #endif 515 516 #endif 517 518 /* ex:set ts=4: */ 519