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