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