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