1 2 typedef char int8; 3 typedef unsigned char uint8; 4 typedef short int16; 5 typedef unsigned short uint16; 6 typedef int int32; 7 typedef unsigned int uint32; 8 typedef double float64; 9 typedef char TEXT; 10 typedef int BOOL; 11 12 #define TRUE 1 13 #define FALSE 0 14 15 // Woohoo! 16 #define MAX_CHANNELS 16 17 18 // Some handy constants. Thanks eightbitbubsy. 19 #define AMIGA_PAL_XTAL 28375160 20 #define AMIGA_NTSC_XTAL 28636360 21 #define AMIGA_CPU_PAL_CLK ((AMIGA_PAL_XTAL / 4)) 22 #define AMIGA_CPU_NTSC_CLK ((AMIGA_NTSC_XTAL / 4)) 23 #define AMIGA_CIA_PAL_CLK ((AMIGA_CPU_PAL_CLK / 10)) 24 #define AMIGA_CIA_NTSC_CLK ((AMIGA_CPU_NTSC_CLK / 10)) 25 #define AMIGA_PAULA_PAL_CLK ((AMIGA_CPU_PAL_CLK / 2)) 26 #define AMIGA_PAULA_NTSC_CLK ((AMIGA_CPU_NTSC_CLK / 2)) 27 28 #define Period2Freq(period) ((AMIGA_PAULA_PAL_CLK * 65536.f) / (period)) 29 30 struct hvl_envelope 31 { 32 int16 aFrames, aVolume; 33 int16 dFrames, dVolume; 34 int16 sFrames; 35 int16 rFrames, rVolume; 36 int16 pad; 37 }; 38 39 struct hvl_plsentry 40 { 41 uint8 ple_Note; 42 uint8 ple_Waveform; 43 int16 ple_Fixed; 44 int8 ple_FX[2]; 45 int8 ple_FXParam[2]; 46 }; 47 48 struct hvl_plist 49 { 50 int16 pls_Speed; 51 int16 pls_Length; 52 struct hvl_plsentry *pls_Entries; 53 }; 54 55 struct hvl_instrument 56 { 57 TEXT ins_Name[128]; 58 uint8 ins_Volume; 59 uint8 ins_WaveLength; 60 uint8 ins_FilterLowerLimit; 61 uint8 ins_FilterUpperLimit; 62 uint8 ins_FilterSpeed; 63 uint8 ins_SquareLowerLimit; 64 uint8 ins_SquareUpperLimit; 65 uint8 ins_SquareSpeed; 66 uint8 ins_VibratoDelay; 67 uint8 ins_VibratoSpeed; 68 uint8 ins_VibratoDepth; 69 uint8 ins_HardCutRelease; 70 uint8 ins_HardCutReleaseFrames; 71 struct hvl_envelope ins_Envelope; 72 struct hvl_plist ins_PList; 73 }; 74 75 struct hvl_position 76 { 77 uint8 pos_Track[MAX_CHANNELS]; 78 int8 pos_Transpose[MAX_CHANNELS]; 79 }; 80 81 struct hvl_step 82 { 83 uint8 stp_Note; 84 uint8 stp_Instrument; 85 uint8 stp_FX; 86 uint8 stp_FXParam; 87 uint8 stp_FXb; 88 uint8 stp_FXbParam; 89 }; 90 91 struct hvl_voice 92 { 93 int16 vc_Track; 94 int16 vc_NextTrack; 95 int16 vc_Transpose; 96 int16 vc_NextTranspose; 97 int16 vc_OverrideTranspose; // 1.5 98 int32 vc_ADSRVolume; 99 struct hvl_envelope vc_ADSR; 100 struct hvl_instrument *vc_Instrument; 101 uint32 vc_SamplePos; 102 uint32 vc_Delta; 103 uint16 vc_InstrPeriod; 104 uint16 vc_TrackPeriod; 105 uint16 vc_VibratoPeriod; 106 uint16 vc_WaveLength; 107 int16 vc_NoteMaxVolume; 108 uint16 vc_PerfSubVolume; 109 uint8 vc_NewWaveform; 110 uint8 vc_Waveform; 111 uint8 vc_PlantPeriod; 112 uint8 vc_VoiceVolume; 113 uint8 vc_PlantSquare; 114 uint8 vc_IgnoreSquare; 115 uint8 vc_FixedNote; 116 int16 vc_VolumeSlideUp; 117 int16 vc_VolumeSlideDown; 118 int16 vc_HardCut; 119 uint8 vc_HardCutRelease; 120 int16 vc_HardCutReleaseF; 121 uint8 vc_PeriodSlideOn; 122 int16 vc_PeriodSlideSpeed; 123 int16 vc_PeriodSlidePeriod; 124 int16 vc_PeriodSlideLimit; 125 int16 vc_PeriodSlideWithLimit; 126 int16 vc_PeriodPerfSlideSpeed; 127 int16 vc_PeriodPerfSlidePeriod; 128 uint8 vc_PeriodPerfSlideOn; 129 int16 vc_VibratoDelay; 130 int16 vc_VibratoSpeed; 131 int16 vc_VibratoCurrent; 132 int16 vc_VibratoDepth; 133 int16 vc_SquareOn; 134 int16 vc_SquareInit; 135 int16 vc_SquareWait; 136 int16 vc_SquareLowerLimit; 137 int16 vc_SquareUpperLimit; 138 int16 vc_SquarePos; 139 int16 vc_SquareSign; 140 int16 vc_SquareSlidingIn; 141 int16 vc_SquareReverse; 142 uint8 vc_FilterOn; 143 uint8 vc_FilterInit; 144 int16 vc_FilterWait; 145 int16 vc_FilterSpeed; 146 int16 vc_FilterUpperLimit; 147 int16 vc_FilterLowerLimit; 148 int16 vc_FilterPos; 149 int16 vc_FilterSign; 150 int16 vc_FilterSlidingIn; 151 int16 vc_IgnoreFilter; 152 int16 vc_PerfCurrent; 153 int16 vc_PerfSpeed; 154 int16 vc_PerfWait; 155 struct hvl_plist *vc_PerfList; 156 const int8 *vc_AudioPointer; 157 const int8 *vc_AudioSource; 158 uint8 vc_NoteDelayOn; 159 uint8 vc_NoteCutOn; 160 int16 vc_NoteDelayWait; 161 int16 vc_NoteCutWait; 162 int16 vc_AudioPeriod; 163 int16 vc_AudioVolume; 164 int32 vc_WNRandom; 165 const int8 *vc_MixSource; 166 int8 vc_SquareTempBuffer[0x80]; 167 int8 vc_VoiceBuffer[0x282*4]; 168 uint8 vc_VoiceNum; 169 uint8 vc_TrackMasterVolume; 170 uint8 vc_TrackOn; 171 int16 vc_VoicePeriod; 172 uint32 vc_Pan; 173 uint32 vc_SetPan; // New for 1.4 174 uint32 vc_PanMultLeft; 175 uint32 vc_PanMultRight; 176 uint32 vc_RingSamplePos; 177 uint32 vc_RingDelta; 178 const int8 *vc_RingMixSource; 179 uint8 vc_RingPlantPeriod; 180 int16 vc_RingInstrPeriod; 181 int16 vc_RingBasePeriod; 182 int16 vc_RingAudioPeriod; 183 const int8 *vc_RingAudioSource; 184 uint8 vc_RingNewWaveform; 185 uint8 vc_RingWaveform; 186 uint8 vc_RingFixedPeriod; 187 int8 vc_RingVoiceBuffer[0x282*4]; 188 }; 189 190 struct hvl_tune 191 { 192 TEXT ht_Name[128]; 193 uint16 ht_SongNum; 194 uint32 ht_Frequency; 195 float64 ht_FreqF; 196 const int8 *ht_WaveformTab[MAX_CHANNELS]; 197 uint16 ht_Restart; 198 uint16 ht_PositionNr; 199 uint8 ht_SpeedMultiplier; 200 uint8 ht_TrackLength; 201 uint8 ht_TrackNr; 202 uint8 ht_InstrumentNr; 203 uint8 ht_SubsongNr; 204 uint16 ht_PosJump; 205 uint32 ht_PlayingTime; 206 int16 ht_Tempo; 207 int16 ht_PosNr; 208 int16 ht_StepWaitFrames; 209 int16 ht_NoteNr; 210 uint16 ht_PosJumpNote; 211 uint8 ht_GetNewPosition; 212 uint8 ht_PatternBreak; 213 uint8 ht_SongEndReached; 214 uint8 ht_Stereo; 215 uint16 *ht_Subsongs; 216 uint16 ht_Channels; 217 struct hvl_position *ht_Positions; 218 struct hvl_step ht_Tracks[256][64]; 219 struct hvl_instrument *ht_Instruments; 220 struct hvl_voice ht_Voices[MAX_CHANNELS]; 221 int32 ht_defstereo; 222 int32 ht_defpanleft; 223 int32 ht_defpanright; 224 int32 ht_mixgain; 225 uint8 ht_Version; 226 }; 227 228 void hvl_DecodeFrame( struct hvl_tune *ht, int8 *buf1, int8 *buf2, int32 bufmod ); 229 void hvl_InitReplayer( void ); 230 BOOL hvl_InitSubsong( struct hvl_tune *ht, uint32 nr ); 231 struct hvl_tune *hvl_LoadTune( const TEXT *name, uint32 freq, uint32 defstereo ); 232 struct hvl_tune *hvl_ParseTune(const uint8 *buf, uint32 buflen, uint32 freq, uint32 defstereo ); 233 void hvl_FreeTune( struct hvl_tune *ht ); 234 235