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