/
ptform.h
591 lines (476 loc) · 20.1 KB
/
ptform.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
/*
--> The Protracker Enums
-> For MikMod 3.0
*/
#ifndef _PTFORM_H_
#define _PTFORM_H_
#ifdef __cplusplus
extern "C" {
#endif
extern UWORD mytab[12],logtab[104];
extern UBYTE VibratoTable[32],avibtab[128];
extern SBYTE PanbrelloTable[256];
extern ULONG lintab[768];
/**************************************************************************
****** Unitrack stuff: ****************************************************
**************************************************************************/
/* The UniTrack stuff is generally for internal use only, but would be */
/* required in making a tracker or a module player tha scrolls pattern */
/* data. */
/* prototypes: */
extern void UniSetRow(UBYTE *t);
extern UBYTE UniGetByte(void);
extern UBYTE *UniFindRow(UBYTE *t,UWORD row);
extern void UniReset(void);
extern void UniWrite(UBYTE data);
extern void UniNewline(void);
extern UBYTE *UniDup(void);
extern void UniSkipOpcode(UBYTE op);
extern BOOL UniInit(void);
extern void UniCleanup(void);
extern UWORD TrkLen(UBYTE *t);
extern BOOL MyCmp(UBYTE *a, UBYTE *b, UWORD l);
extern void UniInstrument(UBYTE ins);
extern void UniNote(UBYTE note);
extern void UniPTEffect(UBYTE eff, UBYTE dat);
extern void UniVolEffect(UWORD eff, UBYTE dat);
/* Enumaerated UniMod Commands */
enum
{ UNI_NOTE = 1,
UNI_INSTRUMENT,
UNI_PTEFFECT0,
UNI_PTEFFECT1,
UNI_PTEFFECT2,
UNI_PTEFFECT3,
UNI_PTEFFECT4,
UNI_PTEFFECT5,
UNI_PTEFFECT6,
UNI_PTEFFECT7,
UNI_PTEFFECT8,
UNI_PTEFFECT9,
UNI_PTEFFECTA,
UNI_PTEFFECTB,
UNI_PTEFFECTC,
UNI_PTEFFECTD,
UNI_PTEFFECTE,
UNI_PTEFFECTF,
UNI_S3MEFFECTA,
UNI_S3MEFFECTD,
UNI_S3MEFFECTE,
UNI_S3MEFFECTF,
UNI_S3MEFFECTI,
UNI_S3MEFFECTQ,
UNI_S3MEFFECTR,
UNI_S3MEFFECTT,
UNI_S3MEFFECTU,
UNI_KEYOFF,
UNI_KEYFADE,
UNI_VOLEFFECTS,
UNI_XMEFFECT4,
UNI_XMEFFECTA,
UNI_XMEFFECTE1,
UNI_XMEFFECTE2,
UNI_XMEFFECTEA,
UNI_XMEFFECTEB,
UNI_XMEFFECTG,
UNI_XMEFFECTH,
UNI_XMEFFECTL,
UNI_XMEFFECTP,
UNI_XMEFFECTX1,
UNI_XMEFFECTX2,
UNI_ITEFFECTG, /* Porta to Note .. no kick=0; */
UNI_ITEFFECTH, /* IT specific Vibrato */
UNI_ITEFFECTI, /* IT tremor (xy not incremeneted) */
UNI_ITEFFECTM, /* Set Channel Volume */
UNI_ITEFFECTN, /* Slide / Fineslide Channel Volume */
UNI_ITEFFECTP, /* Slide / Fineslide Channel Panning */
UNI_ITEFFECTU, /* IT fine vibrato */
UNI_ITEFFECTW, /* Slide / Fineslide Global volume */
UNI_ITEFFECTY, /* The Satanic Panbrello */
UNI_ITEFFECTS0,
UNI_LAST
};
/* IT / S3M Extended SS effects: */
enum
{ SS_GLISSANDO = 1,
SS_FINETUNE,
SS_VIBWAVE,
SS_TREMWAVE,
SS_PANWAVE,
SS_FRAMEDELAY,
SS_S7EFFECTS,
SS_PANNING,
SS_SURROUND,
SS_HIOFFSET,
SS_PATLOOP,
SS_NOTECUT,
SS_NOTEDELAY,
SS_PATDELAY
};
/* IT Volume column effects */
enum
{ VOL_VOLUME = 1,
VOL_PANNING,
VOL_VOLSLIDE,
VOL_PITCHSLIDEDN,
VOL_PITCHSLIDEUP,
VOL_PORTAMENTO,
VOL_VIBRATO
};
/**************************************************************************
****** Instrument stuff: **************************************************
**************************************************************************/
/* Instrument format flags */
#define IF_OWNPAN 1
#define IF_PITCHPAN 2
/* Envelope flags: */
#define EF_ON 1
#define EF_SUSTAIN 2
#define EF_LOOP 4
#define EF_VOLENV 8
/* New Note Action Flags */
#define NNA_CUT 0
#define NNA_CONTINUE 1
#define NNA_OFF 2
#define NNA_FADE 3
#define DCT_OFF 0
#define DCT_NOTE 1
#define DCT_SAMPLE 2
#define DCT_INST 3
#define DCA_CUT 0
#define DCA_OFF 1
#define DCA_FADE 2
#define KEY_KICK 0
#define KEY_OFF 1
#define KEY_FADE 2
#define KEY_KILL 3
#define AV_IT 1 /* IT vs. XM vibrato info */
typedef struct ENVPT
{ SWORD pos;
SWORD val;
} ENVPT;
typedef struct INSTRUMENT
{
UBYTE flags;
UBYTE samplenumber[120];
UBYTE samplenote[120];
UBYTE nnatype;
UBYTE dca; /* duplicate check action */
UBYTE dct; /* duplicate check type */
UBYTE globvol;
UWORD panning; /* instrument-based panning var */
UBYTE pitpansep; /* pitch pan separation (0 to 255) */
UBYTE pitpancenter; /* pitch pan center (0 to 119) */
UBYTE rvolvar; /* random volume varations (0 - 100%) */
UBYTE rpanvar; /* random panning varations (0 - 100%) */
UWORD volfade;
UBYTE volflg; /* bit 0: on 1: sustain 2: loop */
UBYTE volpts;
UBYTE volsusbeg;
UBYTE volsusend;
UBYTE volbeg;
UBYTE volend;
ENVPT volenv[32];
UBYTE panflg; /* bit 0: on 1: sustain 2: loop */
UBYTE panpts;
UBYTE pansusbeg;
UBYTE pansusend;
UBYTE panbeg;
UBYTE panend;
ENVPT panenv[32];
UBYTE pitflg; /* bit 0: on 1: sustain 2: loop */
UBYTE pitpts;
UBYTE pitsusbeg;
UBYTE pitsusend;
UBYTE pitbeg;
UBYTE pitend;
ENVPT pitenv[32];
/* UBYTE vibtype; */
/* UBYTE vibsweep; */
/* UBYTE vibdepth; */
/* UBYTE vibrate; */
CHAR *insname;
} INSTRUMENT;
/**************************************************************************
****** Player stuff: ******************************************************
**************************************************************************/
typedef struct ENVPR
{ UBYTE flg; /* envelope flag */
UBYTE pts; /* number of envelope points */
UBYTE susbeg; /* envelope sustain index begin */
UBYTE susend; /* envelope sustain index end */
UBYTE beg; /* envelope loop begin */
UBYTE end; /* envelope loop end */
SWORD p; /* current envelope counter */
UWORD a; /* envelope index a */
UWORD b; /* envelope index b */
ENVPT *env; /* envelope points */
} ENVPR;
/* Struct MP_VOICE - Used by NNA only player (audio control. AUDTMP is */
/* used for full effects control). */
typedef struct MP_VOICE
{ INSTRUMENT *i;
SAMPLE *s;
UBYTE sample; /* which instrument number */
SWORD volume; /* output volume (vol + sampcol + instvol) */
UWORD panning; /* panning position */
SBYTE chanvol; /* channel's "global" volume */
UWORD fadevol; /* fading volume rate */
UWORD period; /* period to play the sample at */
UBYTE volflg; /* volume envelope settings */
UBYTE panflg; /* panning envelope settings */
UBYTE pitflg; /* pitch envelope settings */
UBYTE keyoff; /* if true = fade out and stuff */
UBYTE kick; /* if true = sample has to be restarted */
UBYTE note; /* the audible note (as heard, direct rep of period) */
UBYTE nna; /* New note action type + master/slave flags */
SWORD handle; /* which sample-handle */
SLONG start; /* The start byte index in the sample */
/* ---------------------------------- */
/* Below here is info NOT in MP_CONTROL!! */
/* ---------------------------------- */
ENVPR venv;
ENVPR penv;
ENVPR cenv;
UWORD avibpos; /* autovibrato pos */
UWORD aswppos; /* autovibrato sweep pos */
ULONG totalvol; /* total volume of channel (before global mixings) */
BOOL mflag;
SWORD masterchn;
struct MP_CONTROL *master;/* index of "master" effects channel */
} MP_VOICE;
typedef struct MP_CONTROL
{ INSTRUMENT *i;
SAMPLE *s;
UBYTE sample; /* which sample number */
UBYTE note; /* the audible note (as heard, direct rep of period) */
SWORD outvolume; /* output volume (vol + sampcol + instvol) */
SBYTE chanvol; /* channel's "global" volume */
UWORD fadevol; /* fading volume rate */
UWORD panning; /* panning position */
UBYTE kick; /* if true = sample has to be restarted */
UBYTE muted; /* if set, channel not played */
UWORD period; /* period to play the sample at */
UBYTE nna; /* New note action type + master/slave flags */
UBYTE volflg; /* volume envelope settings */
UBYTE panflg; /* panning envelope settings */
UBYTE pitflg; /* pitch envelope settings */
UBYTE keyoff; /* if true = fade out and stuff */
SWORD handle; /* which sample-handle */
UBYTE notedelay; /* (used for note delay) */
SLONG start; /* The starting byte index in the sample */
struct MP_VOICE *slave;/* Audio Slave of current effects control channel */
UBYTE slavechn; /* Audio Slave of current effects control channel */
UBYTE anote; /* the note that indexes the audible (note seen in tracker) */
SWORD ownper;
SWORD ownvol;
UBYTE dca; /* duplicate check action */
UBYTE dct; /* duplicate check type */
UBYTE *row; /* row currently playing on this channel */
SBYTE retrig; /* retrig value (0 means don't retrig) */
ULONG speed; /* what finetune to use */
SWORD volume; /* amiga volume (0 t/m 64) to play the sample at */
SBYTE tmpvolume; /* tmp volume */
UWORD tmpperiod; /* tmp period */
UWORD wantedperiod; /* period to slide to (with effect 3 or 5) */
UBYTE pansspd; /* panslide speed */
UWORD slidespeed; /* */
UWORD portspeed; /* noteslide speed (toneportamento) */
UBYTE s3mtremor; /* s3m tremor (effect I) counter */
UBYTE s3mtronof; /* s3m tremor ontime/offtime */
UBYTE s3mvolslide; /* last used volslide */
UBYTE s3mrtgspeed; /* last used retrig speed */
UBYTE s3mrtgslide; /* last used retrig slide */
UBYTE glissando; /* glissando (0 means off) */
UBYTE wavecontrol; /* */
SBYTE vibpos; /* current vibrato position */
UBYTE vibspd; /* "" speed */
UBYTE vibdepth; /* "" depth */
SBYTE trmpos; /* current tremolo position */
UBYTE trmspd; /* "" speed */
UBYTE trmdepth; /* "" depth */
UBYTE fslideupspd;
UBYTE fslidednspd;
UBYTE fportupspd; /* fx E1 (extra fine portamento up) data */
UBYTE fportdnspd; /* fx E2 (extra fine portamento dn) data */
UBYTE ffportupspd; /* fx X1 (extra fine portamento up) data */
UBYTE ffportdnspd; /* fx X2 (extra fine portamento dn) data */
ULONG hioffset; /* last used high order of sample offset */
UWORD soffset; /* last used low order of sample-offset (effect 9) */
UBYTE sseffect; /* last used Sxx effect */
UBYTE ssdata; /* last used Sxx data info */
UBYTE chanvolslide; /* last used channel volume slide */
UBYTE panbwave; /* current panbrello waveform */
UBYTE panbpos; /* current panbrello position */
SBYTE panbspd; /* "" speed */
UBYTE panbdepth; /* "" depth */
UWORD newsamp; /* set to 1 upon a sample / inst change */
UBYTE voleffect; /* Volume Column Effect Memory as used by Impulse Tracker */
UBYTE voldata; /* Volume Column Data Memory */
} MP_CONTROL;
/******************************************************
******** MikMod UniMod type: **************************
*******************************************************/
/* UniMod flags */
#define UF_XMPERIODS 1 /* XM periods / finetuning */
#define UF_LINEAR 2 /* LINEAR periods (UF_XMPERIODS must be set as well) */
#define UF_INST 4 /* Instruments are used */
#define UF_NNA 8 /* New Note Actions used (set numvoices rather than numchn) */
typedef struct UNIMOD
{
/* This section of elements are all file-storage related. */
/* all of this information can be found in the UNIMOD disk format. */
/* For further details about there variables, see the MikMod Docs. */
UWORD flags; /* See UniMod Flags above */
UBYTE numchn; /* number of module channels */
UBYTE numvoices; /* max # voices used for full NNA playback */
UWORD numpos; /* number of positions in this song */
UWORD numpat; /* number of patterns in this song */
UWORD numtrk; /* number of tracks */
UWORD numins; /* number of instruments */
UWORD numsmp; /* number of samples */
UWORD reppos; /* restart position */
UBYTE initspeed; /* initial song speed */
UBYTE inittempo; /* initial song tempo */
UBYTE initvolume; /* initial global volume (0 - 128) */
UWORD panning[64]; /* 64 panning positions */
UBYTE chanvol[64]; /* 64 channel positions */
CHAR *songname; /* name of the song */
CHAR *composer; /* name of the composer */
CHAR *comment; /* module comments */
UBYTE **tracks; /* array of numtrk pointers to tracks */
UWORD *patterns; /* array of Patterns [pointers to tracks for each channel]. */
UWORD *pattrows; /* array of number of rows for each pattern */
UWORD *positions; /* all positions */
INSTRUMENT *instruments; /* all instruments */
SAMPLE *samples; /* all samples */
/* following are the player-instance variables. They are in no way file */
/* storage related - they are for internal replay use only. */
/* All following variables can be modified at any time. */
CHAR *modtype; /* string type of module loaded */
UBYTE bpm; /* current beats-per-minute speed */
UWORD sngspd; /* current song speed */
SWORD volume; /* song volume (0-128) (or user volume) */
BOOL extspd; /* extended speed flag (default enabled) */
BOOL panflag; /* panning flag (default enabled) */
BOOL loop; /* loop module ? (default disabled) */
BOOL forbid; /* if true, no player update! */
/* The following variables are considered useful for reading, and should */
/* should not be directly modified by the end user. */
MP_CONTROL *control; /* Effects Channel information (pf->numchn alloc'ed) */
MP_VOICE *voice; /* Audio Voice information (md_numchn alloc'ed) */
UWORD numrow; /* number of rows on current pattern */
UWORD vbtick; /* tick counter (counts from 0 to sngspd) */
UWORD patpos; /* current row number */
SWORD sngpos; /* current song position. This should not */
/* be modified directly. Use MikMod_NextPosition, */
/* MikMod_PrevPosition, and MikMod_SetPosition. */
/* The following variables should not be modified, and have information */
/* that is pretty useless outside the internal player, so just ignore :) */
UBYTE globalslide; /* global volume slide rate */
UWORD pat_reppos; /* patternloop position */
UWORD pat_repcnt; /* times to loop */
UWORD patbrk; /* position where to start a new pattern */
UBYTE patdly; /* patterndelay counter (command memory) */
UBYTE patdly2; /* patterndelay counter (real one) */
SWORD posjmp; /* flag to indicate a position jump is needed... */
/* changed since 1.00: now also indicates the */
/* direction the position has to jump to: */
/* 0: Don't do anything */
/* 1: Jump back 1 position */
/* 2: Restart on current position */
/* 3: Jump forward 1 position */
} UNIMOD;
/***************************************************
****** Loader stuff: *******************************
****************************************************/
/* loader structure: */
typedef struct MLOADER
{ struct MLOADER *next;
CHAR *type;
CHAR *version;
BOOL (*Init)(void);
BOOL (*Test)(void);
BOOL (*Load)(void);
void (*Cleanup)(void);
CHAR *(*LoadTitle)(void);
} MLOADER;
/* public loader variables: */
extern FILE *modfp;
extern UWORD finetune[16];
extern UNIMOD of; /* static unimod loading space */
extern UWORD npertab[60]; /* used by the original MOD loaders */
/* main loader prototypes: */
void ML_InfoLoader(void);
void ML_RegisterLoader(MLOADER *ldr);
UNIMOD *MikMod_LoadSongFP(FILE *fp, int maxchan);
UNIMOD *MikMod_LoadSong(CHAR *filename, int maxchan);
void MikMod_FreeSong(UNIMOD *mf);
/* other loader prototypes: (used by the loader modules) */
BOOL InitTracks(void);
void AddTrack(UBYTE *tr);
BOOL ReadComment(UWORD len);
BOOL AllocPositions(int total);
BOOL AllocPatterns(void);
BOOL AllocTracks(void);
BOOL AllocInstruments(void);
BOOL AllocSamples(void);
CHAR *DupStr(CHAR *s, UWORD len);
/* Declare external loaders: */
extern MLOADER load_uni; /* Internal UniMod Loader (Current version of UniMod only) */
extern MLOADER load_mod; /* Standard 31-instrument Module loader (Protracker, StarTracker, FastTracker, etc) */
extern MLOADER load_m15; /* 15-instrument (SoundTracker and Ultimate SoundTracker) */
extern MLOADER load_mtm; /* Multi-Tracker Module (by Renaissance) */
extern MLOADER load_s3m; /* ScreamTracker 3 (by Future Crew) */
extern MLOADER load_stm; /* ScreamTracker 2 (by Future Crew) */
extern MLOADER load_ult; /* UltraTracker */
extern MLOADER load_xm; /* FastTracker 2 (by Trition) */
extern MLOADER load_it; /* Impulse Tracker (by Jeffrey Lim) */
extern MLOADER load_669; /* 669 and Extended-669 (by Tran / Renaissance) */
extern MLOADER load_dsm; /* DSIK internal module format */
extern MLOADER load_med; /* MMD0 and MMD1 Amiga MED modules (by OctaMED) */
extern MLOADER load_far; /* Farandole Composer Module */
/* used to convert c4spd to linear XM periods (IT loader). */
extern UWORD getlinearperiod(UBYTE note, ULONG fine);
extern ULONG getfrequency(UBYTE flags, ULONG period);
#define MP_HandleTick Player_HandleTick
#define ML_LoadFN(x,y) MikMod_LoadSong(x,y)
#define ML_LoadFP(x,y) MikMod_LoadSongFP(x,y)
#define MP_PlayStart(x) Player_Start(x)
#define MP_PlayStop Player_Stop
/* MikMod Player Prototypes: */
/* =========================================================== */
/* This batch of prototypes affects the currently ACTIVE module */
/* set with MikMod_PlayStart) */
extern void Player_Start(UNIMOD *mf);
extern BOOL Player_Active(void);
extern void Player_Stop(void);
extern void Player_TogglePause(void);
extern void Player_NextPosition(void);
extern void Player_PrevPosition(void);
extern void Player_SetPosition(UWORD pos);
extern void Player_Mute(SLONG arg1, ...);
extern void Player_UnMute(SLONG arg1, ...);
extern void Player_ToggleMute(SLONG arg1, ...);
extern BOOL Player_Muted(int chan);
extern void Player_HandleTick(void);
extern void Player_SetVolume(int volume);
extern UNIMOD *Player_GetUnimod(void);
extern BOOL Player_Init(UNIMOD *mf); /* internal use only [by loader] */
extern void Player_Exit(UNIMOD *mf); /* internal use only [by loader] */
/* This batch of prototypes adheres closely to the old MikMod 2.10 */
/* naming, and affects ANY specified module (need not be active, */
/* only loaded and initialized) */
extern BOOL MP_Playing(UNIMOD *mf);
extern void MP_TogglePause(UNIMOD *mf);
extern void MP_NextPosition(UNIMOD *mf);
extern void MP_PrevPosition(UNIMOD *mf);
extern void MP_SetPosition(UNIMOD *mf, UWORD pos);
extern void MP_Mute(UNIMOD *mf, SLONG arg1, ...);
extern void MP_UnMute(UNIMOD *mf, SLONG arg1, ...);
extern void MP_ToggleMute(UNIMOD *mf, SLONG arg1, ...);
extern BOOL MP_Muted(UNIMOD *mf, int chan);
#ifdef __cplusplus
}
#endif
#endif