1 
2 #define MUSIC_IT AL_ID('I','M','P','M')
3 
4 typedef struct MODULUS_MUSIC_INFO {
5 	char Name[29];
6     int Type;
7 } MODULUS_MUSIC_INFO;
8 
9 #define ENVELOPE_ON 1
10 #define ENVELOPE_LOOP_ON 2
11 #define ENVELOPE_SUSTAINLOOP 4
12 
13 typedef struct MODULUS_ENVELOPE {
14 	unsigned char Flag,
15     	NumNodes,
16         LoopBegin, LoopEnd, SustainLoopBegin, SustainLoopEnd; //in nodes.
17     char NodeY[25];
18     short NodeTick[25];
19 } MODULUS_ENVELOPE;
20 
21 typedef struct MODULUS_VENVELOPE {
22     char CurNode;
23     unsigned char CurTick;
24 	char End;
25     //float CVolume;
26     MODULUS_ENVELOPE *Envelope;
27 } MODULUS_VENVELOPE;
28 
29 #define NNA_NOTECUT      1
30 #define NNA_NOTECONTINUE 2
31 #define NNA_NOTEOFF      3
32 #define NNA_NOTEFADE     4
33 
34 #define DCT_OFF 0
35 #define DCT_NOTE 1
36 #define DCT_SAMPLE 2
37 #define DCT_INSTRUMENT 3
38 
39 #define DCA_CUT 0
40 #define DCA_NOTEOFF 1
41 #define DCA_NOTEFADE 2
42 
43 typedef struct MOULUS_INSTRUMENT {
44 	unsigned char Flag;
45     char VolumeLoopNodeStart, VolumeLoopNodeEnd;
46     char SustainLoopNodeStart, SustainLoopNodeEnd;
47     char DuplicateCheckType;
48     char DuplicateCheckAction;
49     char NewNoteAction;
50     int FadeOut;
51 
52     unsigned char PitchPanSeperation, //0->64, Bit7: Don't use
53     	PitchPanCenter; //Note, from C-0 to B-9
54     unsigned char GlobalVolume, //0->128
55     	DefaultPan; //0->64, Bit7: Don't use
56 
57 
58     unsigned char NoteSample[120];
59     unsigned char NoteNote[120];
60 
61     MODULUS_ENVELOPE VolumeEnvelope, PanningEnvelope, PitchEnvelope;
62 } MODULUS_INSTRUMENT;
63 
64 #define SAMPLE_HASSAMPLE       1
65 #define SAMPLE_16BIT           2
66 #define SAMPLE_STEREO          4
67 #define SAMPLE_USELOOP        16
68 #define SAMPLE_USESUSTAINLOOP 32
69 #define SAMPLE_PINGPONGLOOP   64
70 #define SAMPLE_PINGPONGSUSTAINLOOP 128
71 
72 #define VIBRATO_SINE 0
73 #define VIBRATO_RAMPDOWN 1
74 #define VIBRATO_SQUARE 2
75 #define VIBRATO_RANDOM 3
76 
77 typedef struct MODULUS_SAMPLE {
78 	unsigned char GlobalVolume; //0->64
79     unsigned char Flag;
80     unsigned char Volume;
81     int SampleLength; //in samples, not bytes !
82     int LoopBegin, LoopEnd; //in samples
83     int SustainLoopBegin, SustainLoopEnd;
84     int C5Speed; //Number of bytes/sec for C-5
85 
86     SAMPLE *Sample;
87 
88     char VibratoSpeed; //0->64
89     char VibratoDepth; //0->64
90     char VibratoWaveForm;
91     char VibratoRate; //0->64
92 } MODULUS_SAMPLE;
93 
94 typedef struct MODULUS_NOTE {
95 	char Mask; //If Bit0: Note, Bit1: Instrument, Bit2: Volume, Bit3: Panning, Bit4: Command
96 	char Channel; //if -1, then end of row.
97     unsigned char Note;
98     char Instrument;
99     unsigned char Volume, Panning;
100     unsigned char Command, CommandValue;
101 } MODULUS_NOTE;
102 
103 typedef struct MODULUS_PATTERN {
104 	int NumRows;
105     int NumNotes;
106     MODULUS_NOTE *Note;
107 } MODULUS_PATTERN;
108 
109 typedef struct MODULUS_VCHANNEL {
110 	MODULUS_SAMPLE *Sample;  //NULL is unused
111     char voice;
112     char ChannelVolume;
113     char NoteOn;
114     char NNA;
115     short FadeOutCount, FadeOut;
116     float MixVolume, MixPan;
117     MODULUS_VENVELOPE *VVolumeEnvelope, *VPanningEnvelope, *VPitchEnvelope;
118     MODULUS_VCHANNEL *next, *prev;
119 } MODULUS_VCHANNEL;
120 
121 typedef struct MODULUS_CHANNEL {
122 	unsigned char Volume; //0->64
123     unsigned char Pan;    //0->32->64, 100 = surround, Bit7: Disable
124     char LastNote, LastInstrument, LastSample;
125     MODULUS_VCHANNEL *VChannel;
126 } MODULUS_CHANNEL;
127 
128 #define FLAG_STEREO         1
129 #define FLAG_USEINSTRUMENTS 4
130 #define FLAG_LINEARSLIDES   8
131 #define FLAG_OLDEFFECT     16
132 
133 typedef struct MODULUS {
134 	MODULUS_INSTRUMENT *Instrument;
135     MODULUS_SAMPLE *Sample;
136     MODULUS_PATTERN *Pattern;
137 
138 	int NumOrders;
139     int NumInstruments;
140     int NumSamples;
141     int NumPatterns;
142     int Flags;
143     short Version;
144     char GlobalVolume;
145     char MixVolume;
146     unsigned char Speed, Tempo;
147     char PanningSeperation;
148 
149     unsigned char *Order;
150 
151     MODULUS_CHANNEL Channel[64];
152 
153 } MODULUS;
154 
155 #define COMMAND_SET_SONG_SPEED        1
156 #define COMMAND_JUMP_TO_ORDER         2
157 #define COMMAND_PATTERN_BREAK_TO_ROW  3
158 #define COMMAND_SET_CHANNEL_VOLUME   13
159 #define COMMAND_SET_SONG_TEMPO       20
160 #define COMMAND_SET_GLOBAL_VOLUME    22
161 
162 typedef struct MODULUS_PLAY {
163 	MODULUS *Music;
164     int Loop, Tick;
165     int CurOrder, CurPattern, CurPos;
166     int Command, CommandVal0, CommandVal1, CommandVal2;
167     int pos;
168 } MODULUS_PLAY;
169 extern MODULUS_PLAY *song;
170 
171 extern int IT_Play_Method;
172 
173 MODULUS *load_it(char*);
174 int get_module_size(MODULUS *);
175 
176 int play_it(MODULUS *j, int loop);
177 void install_modulus();
178 void set_mix_volume(int i);
179 
180 void stop_it();
181 int is_music_done();
182 void destroy_it(MODULUS *j);
183 
184 //Should be internal:
185 extern MODULUS_PLAY *song;
186 extern int note_freq[120];
187 
188 extern void MOD_Interrupt(...);
189 extern int MOD_Poller(void*);
190 
191 #define IT_TIMER 0
192 #define IT_POLL  1
193 
194