1 #include <math.h>
2 
3 #include "hvl_replay.h"
4 #include "hvl_tables.h"
5 
6 const uint16 lentab[45] = { 3, 7, 0xf, 0x1f, 0x3f, 0x7f, 3, 7, 0xf, 0x1f, 0x3f, 0x7f,
7     0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
8     0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
9     (0x280*3)-1 };
10 
11 const int16 vib_tab[64] =
12 {
13   0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253,
14   255,253,250,244,235,224,212,197,180,161,141,120,97,74,49,24,
15   0,-24,-49,-74,-97,-120,-141,-161,-180,-197,-212,-224,-235,-244,-250,-253,
16   -255,-253,-250,-244,-235,-224,-212,-197,-180,-161,-141,-120,-97,-74,-49,-24
17 };
18 
19 const uint16 period_tab[61] =
20 {
21   0x0000, 0x0D60, 0x0CA0, 0x0BE8, 0x0B40, 0x0A98, 0x0A00, 0x0970,
22   0x08E8, 0x0868, 0x07F0, 0x0780, 0x0714, 0x06B0, 0x0650, 0x05F4,
23   0x05A0, 0x054C, 0x0500, 0x04B8, 0x0474, 0x0434, 0x03F8, 0x03C0,
24   0x038A, 0x0358, 0x0328, 0x02FA, 0x02D0, 0x02A6, 0x0280, 0x025C,
25   0x023A, 0x021A, 0x01FC, 0x01E0, 0x01C5, 0x01AC, 0x0194, 0x017D,
26   0x0168, 0x0153, 0x0140, 0x012E, 0x011D, 0x010D, 0x00FE, 0x00F0,
27   0x00E2, 0x00D6, 0x00CA, 0x00BE, 0x00B4, 0x00AA, 0x00A0, 0x0097,
28   0x008F, 0x0087, 0x007F, 0x0078, 0x0071
29 };
30 
31 const int32 stereopan_left[5]  = { 128,  96,  64,  32,   0 };
32 const int32 stereopan_right[5] = { 128, 160, 193, 225, 255 };
33 
34 const int16 filter_thing[2790] =
35 {
36 -1161, -4413, -7161, -13094, 635, 13255, 2189, 6401,
37 9041, 16130, 13460, 5360, 6349, 12699, 19049, 25398,
38 30464, 32512, 32512, 32515, 31625, 29756, 27158, 24060,
39 20667, 17156, 13970, 11375, 9263, 7543, 6142, 5002,
40 4074, 3318, 2702, 2178, 1755, 1415, 1141, 909,
41 716, 563, 444, 331, -665, -2082, -6170, -9235,
42 -13622, 12545, 9617, 3951, 8345, 11246, 18486, 6917,
43 3848, 8635, 17271, 25907, 32163, 32512, 32455, 30734,
44 27424, 23137, 18397, 13869, 10429, 7843, 5897, 4435,
45 3335, 2507, 1885, 1389, 1023, 720, 530, 353,
46 260, 173, 96, 32, -18, -55, -79, -92,
47 -95, -838, -3229, -7298, -12386, -7107, 13946, 6501,
48 5970, 9133, 14947, 16881, 6081, 3048, 10921, 21843,
49 31371, 32512, 32068, 28864, 23686, 17672, 12233, 8469,
50 5862, 4058, 2809, 1944, 1346, 900, 601, 371,
51 223, 137, 64, 7, -34, -58, -69, -70,
52 -63, -52, -39, -26, -14, -5, 4984, -4476,
53 -8102, -14892, 2894, 12723, 4883, 8010, 9750, 17887,
54 11790, 5099, 2520, 13207, 26415, 32512, 32457, 28690,
55 22093, 14665, 9312, 5913, 3754, 2384, 1513, 911,
56 548, 330, 143, 3, -86, -130, -139, -125,
57 -97, -65, -35, -11, 6, 15, 19, 19,
58 16, 12, 8, 6877, -5755, -9129, -15709, 9705,
59 10893, 4157, 9882, 10897, 19236, 8153, 4285, 2149,
60 15493, 30618, 32512, 30220, 22942, 14203, 8241, 4781,
61 2774, 1609, 933, 501, 220, 81, 35, 2,
62 -18, -26, -25, -20, -13, -7, -1, 2,
63 4, 4, 3, 2, 1, 0, 0, -1,
64 2431, -6956, -10698, -14594, 12720, 8980, 3714, 10892,
65 12622, 19554, 6915, 3745, 1872, 17779, 32512, 32622,
66 26286, 16302, 8605, 4542, 2397, 1265, 599, 283,
67 45, -92, -141, -131, -93, -49, -14, 8,
68 18, 18, 14, 8, 3, 0, -2, -3,
69 -2, -2, -1, 0, 0, -3654, -8008, -12743,
70 -11088, 13625, 7342, 3330, 11330, 14859, 18769, 6484,
71 3319, 1660, 20065, 32512, 30699, 21108, 10616, 5075,
72 2425, 1159, 477, 196, 1, -93, -109, -82,
73 -44, -12, 7, 14, 13, 9, 4, 0,
74 -2, -2, -1, -1, 0, 0, 0, 0,
75 0, 0, -7765, -8867, -14957, -5862, 13550, 6139,
76 2988, 11284, 17054, 16602, 6017, 2979, 1489, 22351,
77 32512, 28083, 15576, 6708, 2888, 1243, 535, 188,
78 32, -47, -64, -47, -22, -3, 7, 8,
79 5, 3, 0, -1, -1, -1, 0, 0,
80 0, 0, 0, 0, 0, 0, 0, -9079,
81 -9532, -16960, -335, 13001, 5333, 2704, 11192, 18742,
82 13697, 5457, 2703, 1351, 24637, 32512, 24556, 10851,
83 4185, 1614, 622, 184, 15, -57, -59, -34,
84 -9, 5, 8, 6, 2, 0, -1, -1,
85 0, 0, 0, 0, 0, 0, 0, 0,
86 0, 0, 0, 0, -8576, -10043, -18551, 4372,
87 12190, 4809, 2472, 11230, 19803, 11170, 4953, 2473,
88 1236, 26923, 32512, 20567, 7430, 2550, 875, 212,
89 51, -30, -43, -25, -6, 3, 5, 3,
90 1, 0, -1, 0, 0, 0, 0, 0,
91 0, 0, 0, 0, 0, 0, 0, 0,
92 0, -6960, -10485, -19740, 7864, 11223, 4449, 2279,
93 11623, 20380, 9488, 4553, 2280, 1140, 29209, 31829,
94 16235, 4924, 1493, 452, 86, -7, -32, -20,
95 -5, 2, 3, 2, 0, 0, 0, 0,
96 0, 0, 0, 0, 0, 0, 0, 0,
97 0, 0, 0, 0, 0, 0, -4739, -10974,
98 -19831, 10240, 10190, 4169, 2114, 12524, 20649, 8531,
99 4226, 2114, 1057, 31495, 29672, 11916, 3168, 841,
100 121, 17, -22, -18, -5, 2, 2, 1,
101 0, 0, 0, 0, 0, 0, 0, 0,
102 0, 0, 0, 0, 0, 0, 0, 0,
103 0, 0, 0, -2333, -11641, -19288, 11765, 9175,
104 3923, 1971, 13889, 20646, 8007, 3942, 1971, 985,
105 32512, 27426, 8446, 1949, 449, 45, -11, -16,
106 -5, 1, 1, 1, 0, 0, 0, 0,
107 0, 0, 0, 0, 0, 0, 0, 0,
108 0, 0, 0, 0, 0, 0, 0, 0,
109 29, -12616, -17971, 12690, 8247, 3693, 1846, 15662,
110 20271, 7658, 3692, 1846, 923, 32512, 25132, 6284,
111 1245, 246, -71, -78, -17, 8, 7, 1,
112 -1, 0, 0, 0, 0, 0, 0, 0,
113 0, 0, 0, 0, 0, 0, 0, 0,
114 0, 0, 0, 0, 0, 2232, -14001, -15234,
115 13198, 7447, 3478, 1736, 17409, 19411, 7332, 3472,
116 1736, 868, 32512, 22545, 4352, 731, 18, -117,
117 -40, 8, 9, 2, -1, -1, 0, 0,
118 0, 0, 0, 0, 0, 0, 0, 0,
119 0, 0, 0, 0, 0, 0, 0, 0,
120 0, 0, 4197, -15836, -11480, 13408, 6791, 3281,
121 1639, 19224, 18074, 6978, 3276, 1639, 819, 32512,
122 19657, 2706, 380, -148, -86, 2, 13, 3,
123 -2, 0, 0, 0, 0, 0, 0, 0,
124 0, 0, 0, 0, 0, 0, 0, 0,
125 0, 0, 0, 0, 0, 0, 0, 5863,
126 -17878, -9460, 13389, 6270, 3104, 1551, 20996, 16431,
127 6616, 3102, 1551, 776, 32512, 16633, 1921, 221,
128 -95, -39, 5, 5, 0, -1, 0, 0,
129 0, 0, 0, 0, 0, 0, 0, 0,
130 0, 0, 0, 0, 0, 0, 0, 0,
131 0, 0, 0, 0, 7180, -20270, -6194, 13181,
132 5866, 2946, 1473, 22548, 14746, 6273, 2946, 1473,
133 737, 32512, 13621, 1263, 116, -53, -15, 4,
134 2, -1, 0, 0, 0, 0, 0, 0,
135 0, 0, 0, 0, 0, 0, 0, 0,
136 0, 0, 0, 0, 0, 0, 0, 0,
137 0, 8117, -21129, -2795, 12809, 5550, 2804, 1402,
138 23717, 13326, 5962, 2804, 1402, 701, 32512, 10687,
139 776, -56, -56, 4, 4, 0, 0, 0,
140 0, 0, 0, 0, 0, 0, 0, 0,
141 0, 0, 0, 0, 0, 0, 0, 0,
142 0, 0, 0, 0, 0, 0, 8560, -19953,
143 508, 12299, 5295, 2675, 1337, 25109, 12263, 5684,
144 2675, 1338, 669, 32512, 7905, 433, -36, -22,
145 3, 1, 0, 0, 0, 0, 0, 0,
146 0, 0, 0, 0, 0, 0, 0, 0,
147 0, 0, 0, 0, 0, 0, 0, 0,
148 0, 0, 0, 8488, -18731, 3672, 11679, 5080,
149 2558, 1279, 26855, 11480, 5434, 2557, 1279, 639,
150 32512, 5357, 212, -95, 0, 4, -1, 0,
151 0, 0, 0, 0, 0, 0, 0, 0,
152 0, 0, 0, 0, 0, 0, 0, 0,
153 0, 0, 0, 0, 0, 0, 0, 0,
154 7977, -24055, 6537, 10986, 4883, 2450, 1225, 28611,
155 10918, 5206, 2450, 1225, 612, 32512, 3131, 83,
156 -35, 2, 1, 0, 0, 0, 0, 0,
157 0, 0, 0, 0, 0, 0, 0, 0,
158 0, 0, 0, 0, 0, 0, 0, 0,
159 0, 0, 0, 0, 0, 7088, -30584, 9054,
160 10265, 4696, 2351, 1176, 28707, 10494, 4996, 2351,
161 1175, 588, 32512, 1920, -155, -13, 4, -1,
162 0, 0, 0, 0, 0, 0, 0, 0,
163 0, 0, 0, 0, 0, 0, 0, 0,
164 0, 0, 0, 0, 0, 0, 0, 0,
165 0, 0, 5952, -32627, 11249, 9564, 4519, 2260,
166 1130, 28678, 10113, 4803, 2260, 1130, 565, 32512,
167 1059, -73, -1, 0, 0, 0, 0, 0,
168 0, 0, 0, 0, 0, 0, 0, 0,
169 0, 0, 0, 0, 0, 0, 0, 0,
170 0, 0, 0, 0, 0, 0, 0, 4629,
171 -32753, 13199, 8934, 4351, 2175, 1088, 28446, 9775,
172 4623, 2175, 1087, 544, 32512, 434, -22, 1,
173 0, 0, 0, 0, 0, 0, 0, 0,
174 0, 0, 0, 0, 0, 0, 0, 0,
175 0, 0, 0, 0, 0, 0, 0, 0,
176 0, 0, 0, 0, 3132, -32768, 15225, 8430,
177 4194, 2097, 1049, 30732, 9439, 4456, 2097, 1049,
178 524, 32512, 75, -6, 0, 0, 0, 0,
179 0, 0, 0, 0, 0, 0, 0, 0,
180 0, 0, 0, 0, 0, 0, 0, 0,
181 0, 0, 0, 0, 0, 0, 0, 0,
182 0, 1345, -32768, 16765, 8107, 4048, 2025, 1012,
183 32512, 9112, 4302, 2025, 1012, 506, 32385, 392,
184 5, 0, 0, 0, 0, 0, 0, 0,
185 0, 0, 0, 0, 0, 0, 0, 0,
186 0, 0, 0, 0, 0, 0, 0, 0,
187 0, 0, 0, 0, 0, 0, -706, -32768,
188 17879, 8005, 3913, 1956, 978, 32512, 8843, 4157,
189 1957, 978, 489, 31184, 1671, 122, 10, 0,
190 0, 0, 0, 0, 0, 0, 0, 0,
191 0, 0, 0, 0, 0, 0, 0, 0,
192 0, 0, 0, 0, 0, 0, 0, 0,
193 0, 0, 0, -3050, -32768, 18923, 8163, 3799,
194 1893, 946, 32512, 8613, 4022, 1893, 945, 473,
195 29903, 3074, 316, 52, 11, 3, 0, 0,
196 0, 0, 0, 0, 0, 0, 0, 0,
197 0, 0, 0, 0, 0, 0, 0, 0,
198 0, 0, 0, 0, 0, 0, 0, 0,
199 -5812, -32768, 19851, 8626, 3739, 1833, 917, 32512,
200 7982, 3889, 1833, 916, 459, 28541, 4567, 731,
201 206, 66, 23, 8, 1, 0, 0, 0,
202 0, 0, 0, 0, 0, 0, 0, 0,
203 0, 0, 0, 0, 0, 0, 0, 0,
204 0, 0, 0, 0, 0, -9235, -32768, 20587,
205 9408, 3841, 1784, 889, 32512, 6486, 3688, 1776,
206 889, 447, 27099, 6112, 1379, 313, 135, 65,
207 33, 17, 7, 4, 2, 2, 2, 2,
208 2, 2, 2, 2, 2, 2, 2, 2,
209 2, 2, 2, 2, 2, 2, 2, 2,
210 2, 2, -12713, 1188, 1318, -1178, -4304, -26320,
211 -14931, -1716, -1486, 2494, 3611, 22275, 27450, -31839,
212 -29668, -26258, -21608, -15880, -9560, -3211, 3138, 9369,
213 15281, 20717, 25571, 29774, 32512, 32512, 32512, 32512,
214 32512, 32512, 32512, 32512, 32512, 32512, 32512, 32512,
215 32512, 32748, 32600, 32750, 32566, 32659, 32730, 8886,
216 1762, 506, -1665, -12112, -24641, -8513, -2224, 247,
217 3288, 9926, 25787, 28909, -31048, -27034, -20726, -12532,
218 -3896, 4733, 13043, 20568, 27010, 32215, 32512, 32512,
219 32512, 32512, 32512, 32512, 32512, 32762, 32696, 32647,
220 32512, 32665, 32512, 32587, 32638, 32669, 32681, 32679,
221 32667, 32648, 32624, 32598, 6183, 2141, -630, -2674,
222 -21856, -18306, -5711, -2161, 2207, 4247, 17616, 26475,
223 29719, -30017, -23596, -13741, -2819, 8029, 18049, 26470,
224 32512, 32512, 32512, 32512, 32512, 32512, 32512, 32738,
225 32663, 32612, 32756, 32549, 32602, 32629, 32636, 32628,
226 32610, 32588, 32564, 32542, 32524, 32510, 32500, 32494,
227 32492, 3604, 2248, -1495, -5612, -26800, -13545, -4745,
228 -1390, 3443, 6973, 23495, 27724, 30246, -28745, -19355,
229 -6335, 6861, 19001, 28690, 32512, 32512, 32512, 32512,
230 32512, 32512, 32512, 32512, 32667, 32743, 32757, 32730,
231 32681, 32624, 32572, 32529, 32500, 32482, 32476, 32477,
232 32482, 32489, 32497, 32504, 32509, 32513, 7977, 1975,
233 -1861, -9752, -25893, -10150, -4241, 86, 4190, 10643,
234 25235, 28481, 30618, -27231, -14398, 1096, 15982, 27872,
235 32512, 32512, 32512, 32512, 32512, 32734, 32631, 32767,
236 32531, 32553, 32557, 32551, 32539, 32527, 32516, 32509,
237 32505, 32504, 32505, 32506, 32508, 32510, 32511, 32512,
238 32512, 32512, 32511, 14529, 1389, -2028, -14813, -22765,
239 -7845, -3774, 1986, 4706, 14562, 25541, 29019, 30894,
240 -25476, -9294, 8516, 23979, 32512, 32512, 32512, 32512,
241 32512, 32512, 32708, 32762, 32727, 32654, 32579, 32522,
242 32490, 32478, 32480, 32488, 32498, 32507, 32512, 32515,
243 32515, 32514, 32513, 32512, 32510, 32510, 32510, 32510,
244 17663, 557, -2504, -19988, -19501, -6436, -3340, 4135,
245 5461, 18788, 26016, 29448, 31107, -23481, -4160, 15347,
246 30045, 32512, 32512, 32512, 32512, 32512, 32674, 32700,
247 32654, 32586, 32531, 32498, 32486, 32488, 32496, 32504,
248 32510, 32513, 32514, 32513, 32512, 32511, 32510, 32510,
249 32510, 32510, 32510, 32510, 32510, 16286, -402, -3522,
250 -23951, -16641, -5631, -2983, 6251, 6837, 22781, 26712,
251 29788, 31277, -21244, 1108, 21806, 32512, 32512, 32512,
252 32512, 32695, 32576, 32622, 32600, 32557, 32520, 32501,
253 32496, 32500, 32505, 32509, 32512, 32512, 32512, 32511,
254 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
255 32510, 32510, 13436, -1351, -4793, -25948, -14224, -5151,
256 -2702, 7687, 8805, 25705, 27348, 30064, 31415, -18766,
257 5872, 26652, 32512, 32512, 32512, 32747, 32581, 32620,
258 32586, 32540, 32508, 32497, 32499, 32505, 32510, 32512,
259 32512, 32512, 32511, 32510, 32510, 32510, 32510, 32510,
260 32510, 32510, 32510, 32510, 32510, 32510, 32510, 10427,
261 -2162, -7136, -26147, -12195, -4810, -2474, 8723, 11098,
262 27251, 27832, 30293, 31530, -16047, 10877, 30990, 32512,
263 32512, 32512, 32512, 32584, 32571, 32536, 32511, 32502,
264 32503, 32507, 32510, 32512, 32512, 32511, 32511, 32511,
265 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
266 32511, 32511, 32511, 32511, 7797, -2748, -10188, -25174,
267 -10519, -4515, -2281, 9397, 13473, 27937, 28213, 30487,
268 31627, -13087, 15816, 32512, 32512, 32512, 32715, 32550,
269 32560, 32534, 32512, 32505, 32506, 32508, 32511, 32511,
270 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
271 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
272 32511, 5840, -3084, -13327, -23617, -9177, -4231, -2116,
273 9892, 15843, 28292, 28538, 30652, 31710, -9886, 20235,
274 32512, 32512, 32512, 32512, 32550, 32534, 32514, 32507,
275 32507, 32510, 32511, 32511, 32511, 32511, 32511, 32511,
276 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
277 32511, 32511, 32511, 32511, 32511, 32511, 4592, -3215,
278 -15898, -21856, -8141, -3958, -1972, 10401, 18229, 28612,
279 28824, 30796, 31781, -7103, 24037, 32512, 32512, 32745,
280 32535, 32534, 32517, 32508, 32508, 32509, 32510, 32510,
281 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
282 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
283 32510, 32510, 32510, 3964, -3262, -18721, -20087, -7368,
284 -3705, -1847, 11014, 20634, 28996, 29075, 30920, 31843,
285 -4732, 27243, 32512, 32512, 32648, 32627, 32530, 32495,
286 32500, 32510, 32512, 32512, 32511, 32511, 32511, 32511,
287 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
288 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
289 3858, -3404, -21965, -18398, -6801, -3479, -1738, 12009,
290 22960, 29429, 29294, 31030, 31898, -2281, 30194, 32512,
291 32512, 32699, 32569, 32496, 32496, 32509, 32513, 32512,
292 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
293 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
294 32510, 32510, 32510, 32510, 32510, 4177, -3869, -24180,
295 -16820, -6380, -3280, -1640, 13235, 25035, 29863, 29490,
296 31128, 31947, 251, 32758, 32512, 32749, 32652, 32508,
297 32490, 32507, 32513, 32512, 32511, 32511, 32511, 32511,
298 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
299 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
300 32511, 32511, 4837, -4913, -26436, -15364, -6056, -3103,
301 -1553, 14759, 26704, 30256, 29664, 31215, 31991, 2863,
302 32512, 32512, 32657, 32580, 32503, 32501, 32510, 32512,
303 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
304 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
305 32510, 32510, 32510, 32510, 32510, 32510, 32510, 5755,
306 -6290, -27702, -14036, -5788, -2947, -1474, 16549, 27912,
307 30602, 29821, 31294, 32030, 5555, 32512, 32512, 32592,
308 32541, 32505, 32507, 32511, 32511, 32510, 32510, 32510,
309 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
310 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
311 32510, 32510, 32510, 32510, 6898, -8911, -27788, -12841,
312 -5550, -2805, -1403, 18509, 28687, 30906, 29963, 31364,
313 32066, 8328, 32512, 32512, 32623, 32511, 32502, 32510,
314 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
315 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
316 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
317 32511, 8107, -11465, -27077, -11789, -5325, -2676, -1339,
318 19833, 29213, 31179, 30092, 31429, 32098, 11181, 32512,
319 32512, 32561, 32508, 32508, 32511, 32511, 32511, 32511,
320 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
321 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
322 32511, 32511, 32511, 32511, 32511, 32511, 9247, -13203,
323 -25808, -10886, -5109, -2559, -1280, 21060, 29636, 31428,
324 30209, 31488, 32127, 14114, 32512, 32681, 32529, 32502,
325 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
326 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
327 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
328 32511, 32511, 32511, 10252, -16863, -24251, -10137, -4902,
329 -2451, -1226, 21937, 30022, 31656, 30317, 31542, 32154,
330 17128, 32512, 32581, 32514, 32508, 32511, 32511, 32511,
331 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
332 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
333 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
334 11032, -22427, -22598, -9535, -4705, -2353, -1177, 20999,
335 30406, 31867, 30415, 31591, 32179, 20222, 32512, 32591,
336 32501, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
337 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
338 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
339 32511, 32511, 32511, 32511, 32511, 11539, -19778, -20962,
340 -9060, -4522, -2261, -1131, 19486, 30789, 32061, 30507,
341 31637, 32201, 23396, 32512, 32535, 32508, 32511, 32511,
342 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
343 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
344 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
345 32511, 32511, 11803, -12759, -19353, -8690, -4353, -2177,
346 -1089, 18499, 31165, 32240, 30591, 31678, 32222, 26651,
347 32512, 32514, 32511, 32511, 32511, 32511, 32511, 32511,
348 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
349 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
350 32511, 32511, 32511, 32511, 32511, 32511, 32511, 11826,
351 -7586, -17510, -8384, -4196, -2099, -1050, 26861, 31521,
352 32406, 30669, 31718, 32241, 29986, 32585, 32510, 32511,
353 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
354 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
355 32511, 32511, 32511, 32511, 32511, 32511, 32511, 32511,
356 32511, 32511, 32511, 32511, 11599, -2848, -15807, -8097,
357 -4051, -2025, -1014, 30693, 31850, 32561, 30743, 31755,
358 32261, 32512, 32524, 32510, 32510, 32510, 32510, 32510,
359 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
360 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
361 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
362 32510, 11037, -5302, -14051, -7770, -3913, -1958, -980,
363 28033, 32165, 32705, 30810, 31789, 32278, 32512, 32729,
364 32536, 32513, 32510, 32510, 32510, 32510, 32510, 32510,
365 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
366 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
367 32510, 32510, 32510, 32510, 32510, 32510, 10114, -7837,
368 -12293, -7348, -3782, -1894, -948, 24926, 32473, 32512,
369 30873, 31819, 32294, 32512, 32512, 32580, 32527, 32515,
370 32512, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
371 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
372 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
373 32510, 32510, 32510, 8759, -10456, -10591, -6766, -3638,
374 -1835, -917, 24058, 32600, 32512, 30934, 31850, 32309,
375 32512, 32512, 32729, 32591, 32537, 32520, 32514, 32510,
376 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
377 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
378 32510, 32510, 32510, 32510, 32510, 32510, 32510, 32510,
379 6811, -13156, -9045, -5965, -3421, -1776, -890, 31582,
380 32246, 32512, 30988, 31878, 32324, 32512, 32512, 32512,
381 32628, 32573, 32541, 32526, 32518, 32514, 32513, 32512,
382 32512, 32512, 32512, 32512, 32512, 32512, 32512, 32512,
383 32512, 32512, 32512, 32512, 32512, 32512, 32512, 32512,
384 32512, 32512, 32512, 32512, 32512, 4835
385 };
386 
hvl_GenPanningTables(void)387 void hvl_GenPanningTables( void )
388 {
389 	uint32 i;
390 	float64 aa, ab;
391 
392 	// Sine based panning table
393 	aa = (3.14159265f*2.0f)/4.0f;   // Quarter of the way through the sinewave == top peak
394 	ab = 0.0f;                      // Start of the climb from zero
395 
396 	for( i=0; i<256; i++ )
397 	{
398 		panning_left[i]  = (uint32)(sin(aa)*255.0f);
399 		panning_right[i] = (uint32)(sin(ab)*255.0f);
400 
401 		aa += (3.14159265*2.0f/4.0f)/256.0f;
402 		ab += (3.14159265*2.0f/4.0f)/256.0f;
403 	}
404 	panning_left[255] = 0;
405 	panning_right[0] = 0;
406 }
407 
hvl_GenSawtooth(int8 * buf,uint32 len)408 void hvl_GenSawtooth( int8 *buf, uint32 len )
409 {
410 	uint32 i;
411 	int32  val, add;
412 
413 	add = 256 / (len-1);
414 	val = -128;
415 
416 	for( i=0; i<len; i++, val += add )
417 		*buf++ = (int8)val;
418 }
419 
hvl_GenTriangle(int8 * buf,uint32 len)420 void hvl_GenTriangle( int8 *buf, uint32 len )
421 {
422 	uint32 i;
423 	int32  d2, d5, d1, d4;
424 	int32  val;
425 	int8   *buf2;
426 
427 	d2  = len;
428 	d5  = len >> 2;
429 	d1  = 128/d5;
430 	d4  = -(d2 >> 1);
431 	val = 0;
432 
433 	for( i=0; i<d5; i++ )
434 	{
435 		*buf++ = val;
436 		val += d1;
437 	}
438 	*buf++ = 0x7f;
439 
440 	if( d5 != 1 )
441 	{
442 		val = 128;
443 		for( i=0; i<d5-1; i++ )
444 		{
445 			val -= d1;
446 			*buf++ = val;
447 		}
448 	}
449 
450 	buf2 = buf + d4;
451 	for( i=0; i<d5*2; i++ )
452 	{
453 		int8 c;
454 
455 		c = *buf2++;
456 		if( c == 0x7f )
457 			c = 0x80;
458 		else
459 			c = -c;
460 
461 		*buf++ = c;
462 	}
463 }
464 
hvl_GenSquare(int8 * buf)465 void hvl_GenSquare( int8 *buf )
466 {
467 	uint32 i, j;
468 
469 	for( i=1; i<=0x20; i++ )
470 	{
471 		for( j=0; j<(0x40-i)*2; j++ )
472 			*buf++ = 0x80;
473 		for( j=0; j<i*2; j++ )
474 			*buf++ = 0x7f;
475 	}
476 }
477 
clipshifted8(int32 in)478 static inline int32 clipshifted8(int32 in)
479 {
480 	int16 top = (int16)(in >> 16);
481 	if (top > 127) in = 127 << 16;
482 	else if (top < -128) in = -(128 << 16);
483 	return in;
484 }
485 
hvl_GenFilterWaves(const int8 * buf,int8 * lowbuf,int8 * highbuf)486 void hvl_GenFilterWaves( const int8 *buf, int8 *lowbuf, int8 *highbuf )
487 {
488 
489 
490 	const int16 * mid_table = &filter_thing[0];
491 	const int16 * low_table = &filter_thing[1395];
492 
493 	int32 freq;
494 	int32 i;
495 
496 	for( i=0, freq = 25; i<31; i++, freq += 9 )
497 	{
498 		uint32 wv;
499 		const int8  *a0 = buf;
500 
501 		for( wv=0; wv<6+6+0x20+1; wv++ )
502 		{
503 			int32 in, fre, high, mid, low;
504 			uint32  j;
505 
506 			mid  = *mid_table++ << 8;
507 			low = *low_table++ << 8;
508 
509 			for( j=0; j<=lentab[wv]; j++ )
510 			{
511 				in   = a0[j] << 16;
512 				high = clipshifted8( in - mid - low );
513 				fre  = (high >> 8) * freq;
514 				mid  = clipshifted8(mid + fre);
515 				fre  = (mid  >> 8) * freq;
516 				low  = clipshifted8(low + fre);
517 				*highbuf++ = high >> 16;
518 				*lowbuf++  = low  >> 16;
519 			}
520 			a0 += lentab[wv]+1;
521 		}
522 	}
523 }
524 
hvl_GenWhiteNoise(int8 * buf,uint32 len)525 void hvl_GenWhiteNoise( int8 *buf, uint32 len )
526 {
527 	uint32 ays;
528 
529 	ays = 0x41595321;
530 
531 	do {
532 		uint16 ax, bx;
533 		int8 s;
534 
535 		s = ays;
536 
537 		if( ays & 0x100 )
538 		{
539 			s = 0x7f;
540 
541 			if( ays & 0x8000 )
542 				s = 0x80;
543 		}
544 
545 		*buf++ = s;
546 		len--;
547 
548 		ays = (ays >> 5) | (ays << 27);
549 		ays = (ays & 0xffffff00) | ((ays & 0xff) ^ 0x9a);
550 		bx  = ays;
551 		ays = (ays << 2) | (ays >> 30);
552 		ax  = ays;
553 		bx  += ax;
554 		ax  ^= bx;
555 		ays  = (ays & 0xffff0000) | ax;
556 		ays  = (ays >> 3) | (ays << 29);
557 	} while( len );
558 }
559 
hvl_GenTables(void)560 void hvl_GenTables( void )
561 {
562 	hvl_GenPanningTables();
563 	hvl_GenSawtooth( &waves[WO_SAWTOOTH_04], 0x04 );
564 	hvl_GenSawtooth( &waves[WO_SAWTOOTH_08], 0x08 );
565 	hvl_GenSawtooth( &waves[WO_SAWTOOTH_10], 0x10 );
566 	hvl_GenSawtooth( &waves[WO_SAWTOOTH_20], 0x20 );
567 	hvl_GenSawtooth( &waves[WO_SAWTOOTH_40], 0x40 );
568 	hvl_GenSawtooth( &waves[WO_SAWTOOTH_80], 0x80 );
569 	hvl_GenTriangle( &waves[WO_TRIANGLE_04], 0x04 );
570 	hvl_GenTriangle( &waves[WO_TRIANGLE_08], 0x08 );
571 	hvl_GenTriangle( &waves[WO_TRIANGLE_10], 0x10 );
572 	hvl_GenTriangle( &waves[WO_TRIANGLE_20], 0x20 );
573 	hvl_GenTriangle( &waves[WO_TRIANGLE_40], 0x40 );
574 	hvl_GenTriangle( &waves[WO_TRIANGLE_80], 0x80 );
575 	hvl_GenSquare( &waves[WO_SQUARES] );
576 	hvl_GenWhiteNoise( &waves[WO_WHITENOISE], WHITENOISELEN );
577 	hvl_GenFilterWaves( &waves[WO_TRIANGLE_04], &waves[WO_LOWPASSES], &waves[WO_HIGHPASSES] );
578 }
579