pub const MASTER_VOL_TO_AMP_SUBTRACTION: [i32; 101] = [
255, 106, 90, 80, 74, 69, 64, 61, 58, 55, 53, 50, 48, 47, 45, 43, 42, 40,
39, 38, 37, 36, 34, 33, 32, 32, 31, 30, 29, 28, 27, 27, 26, 25, 24, 24, 23,
22, 22, 21, 21, 20, 20, 19, 18, 18, 17, 17, 16, 16, 16, 15, 15, 14, 14, 13,
13, 12, 12, 12, 11, 11, 11, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, 6,
5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0,
];
pub const LEVEL_TO_AMP_SUBTRACTION: [i32; 101] = [
257, 218, 195, 179, 167, 157, 148, 141, 134, 129, 123, 118, 114, 110, 106,
102, 99, 96, 93, 90, 87, 85, 82, 80, 78, 75, 73, 71, 69, 67, 66, 64, 62,
60, 59, 57, 56, 54, 53, 51, 50, 49, 47, 46, 45, 44, 42, 41, 40, 39, 38, 37,
36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 24, 23, 22, 21, 20, 20,
19, 18, 17, 16, 16, 15, 14, 14, 13, 12, 12, 11, 10, 10, 9, 8, 8, 7, 6, 6,
5, 5, 4, 3, 3, 2, 2, 1, 1, 0,
];
pub const ENV_LOG_TIME: [u8; 256] = [
64, 64, 72, 77, 80, 83, 85, 87, 88, 90, 91, 92, 93, 94, 95, 96, 96, 97, 98,
98, 99, 100, 100, 101, 101, 102, 102, 103, 103, 103, 104, 104, 104, 105,
105, 106, 106, 106, 106, 107, 107, 107, 108, 108, 108, 108, 109, 109, 109,
109, 110, 110, 110, 110, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112,
112, 113, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 114, 115, 115,
115, 115, 115, 115, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117,
117, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119,
119, 119, 119, 119, 119, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123,
123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 124, 124, 124,
124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
127, 127, 127, 127, 127, 127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
];
pub const PULSE_WIDTH_100_TO_255: [u8; 101] = [
0, 3, 5, 8, 10, 13, 15, 18, 20, 23, 26, 28, 31, 33, 36, 38, 41, 43, 46, 48,
51, 54, 56, 59, 61, 64, 66, 69, 71, 74, 77, 79, 82, 84, 87, 89, 92, 94, 97,
99, 102, 105, 107, 110, 112, 115, 117, 120, 122, 125, 128, 130, 133, 135,
138, 140, 143, 145, 148, 150, 153, 156, 158, 161, 163, 166, 168, 171, 173,
176, 179, 181, 184, 186, 189, 191, 194, 196, 199, 201, 204, 207, 209, 212,
214, 217, 219, 222, 224, 227, 230, 232, 235, 237, 240, 242, 245, 247, 250,
252, 255,
];
pub const EXP9_TABLE: [u16; 512] = [
10, 21, 32, 43, 54, 65, 76, 87, 98, 109, 120, 131, 142, 153, 164, 175, 185,
196, 207, 218, 229, 239, 250, 261, 272, 282, 293, 304, 314, 325, 336, 346,
357, 368, 378, 389, 399, 410, 420, 431, 441, 452, 462, 473, 483, 494, 504,
514, 525, 535, 546, 556, 566, 577, 587, 597, 607, 618, 628, 638, 648, 659,
669, 679, 689, 699, 709, 719, 730, 740, 750, 760, 770, 780, 790, 800, 810,
820, 830, 840, 850, 860, 870, 880, 889, 899, 909, 919, 929, 939, 949, 958,
968, 978, 988, 997, 1007, 1017, 1027, 1036, 1046, 1056, 1065, 1075, 1085,
1094, 1104, 1113, 1123, 1132, 1142, 1152, 1161, 1171, 1180, 1190, 1199,
1208, 1218, 1227, 1237, 1246, 1256, 1265, 1274, 1284, 1293, 1302, 1312,
1321, 1330, 1340, 1349, 1358, 1367, 1377, 1386, 1395, 1404, 1413, 1423,
1432, 1441, 1450, 1459, 1468, 1477, 1486, 1495, 1505, 1514, 1523, 1532,
1541, 1550, 1559, 1568, 1577, 1585, 1594, 1603, 1612, 1621, 1630, 1639,
1648, 1657, 1665, 1674, 1683, 1692, 1701, 1710, 1718, 1727, 1736, 1745,
1753, 1762, 1771, 1779, 1788, 1797, 1805, 1814, 1823, 1831, 1840, 1848,
1857, 1866, 1874, 1883, 1891, 1900, 1908, 1917, 1925, 1934, 1942, 1951,
1959, 1967, 1976, 1984, 1993, 2001, 2009, 2018, 2026, 2035, 2043, 2051,
2059, 2068, 2076, 2084, 2093, 2101, 2109, 2117, 2126, 2134, 2142, 2150,
2158, 2166, 2175, 2183, 2191, 2199, 2207, 2215, 2223, 2231, 2239, 2247,
2255, 2264, 2272, 2280, 2288, 2296, 2304, 2311, 2319, 2327, 2335, 2343,
2351, 2359, 2367, 2375, 2383, 2391, 2398, 2406, 2414, 2422, 2430, 2437,
2445, 2453, 2461, 2469, 2476, 2484, 2492, 2499, 2507, 2515, 2523, 2530,
2538, 2545, 2553, 2561, 2568, 2576, 2584, 2591, 2599, 2606, 2614, 2621,
2629, 2636, 2644, 2651, 2659, 2666, 2674, 2681, 2689, 2696, 2704, 2711,
2719, 2726, 2733, 2741, 2748, 2755, 2763, 2770, 2778, 2785, 2792, 2799,
2807, 2814, 2821, 2829, 2836, 2843, 2850, 2858, 2865, 2872, 2879, 2886,
2894, 2901, 2908, 2915, 2922, 2929, 2936, 2943, 2951, 2958, 2965, 2972,
2979, 2986, 2993, 3000, 3007, 3014, 3021, 3028, 3035, 3042, 3049, 3056,
3063, 3070, 3077, 3084, 3091, 3097, 3104, 3111, 3118, 3125, 3132, 3139,
3146, 3152, 3159, 3166, 3173, 3180, 3186, 3193, 3200, 3207, 3213, 3220,
3227, 3234, 3240, 3247, 3254, 3260, 3267, 3274, 3280, 3287, 3294, 3300,
3307, 3313, 3320, 3327, 3333, 3340, 3346, 3353, 3359, 3366, 3372, 3379,
3386, 3392, 3398, 3405, 3411, 3418, 3424, 3431, 3437, 3444, 3450, 3457,
3463, 3469, 3476, 3482, 3488, 3495, 3501, 3508, 3514, 3520, 3527, 3533,
3539, 3545, 3552, 3558, 3564, 3571, 3577, 3583, 3589, 3595, 3602, 3608,
3614, 3620, 3626, 3633, 3639, 3645, 3651, 3657, 3663, 3670, 3676, 3682,
3688, 3694, 3700, 3706, 3712, 3718, 3724, 3730, 3736, 3742, 3748, 3754,
3760, 3766, 3772, 3778, 3784, 3790, 3796, 3802, 3808, 3814, 3820, 3826,
3832, 3838, 3844, 3849, 3855, 3861, 3867, 3873, 3879, 3885, 3890, 3896,
3902, 3908, 3914, 3919, 3925, 3931, 3937, 3943, 3948, 3954, 3960, 3965,
3971, 3977, 3983, 3988, 3994, 4000, 4005, 4011, 4017, 4022, 4028, 4034,
4039, 4045, 4050, 4056, 4062, 4067, 4073, 4078, 4084, 4089, 4095,
];
pub fn exp9_interpolate(fract: u32) -> u32 {
let idx = (fract >> 3) as usize;
let extra = (!fract & 7) as u16;
let entry2 = 8191u16.wrapping_sub(EXP9_TABLE[idx]);
let entry1 = if idx == 0 {
8191
} else {
8191u16.wrapping_sub(EXP9_TABLE[idx - 1])
};
let delta = entry1.wrapping_sub(entry2);
let interp = (delta * extra) >> 3;
(entry2 + interp) as u32
}
pub const LOGSIN9_TABLE: [u16; 512] = [
8191, 7950, 7195, 6698, 6327, 6030, 5784, 5572, 5387, 5223, 5075, 4941,
4818, 4704, 4599, 4500, 4408, 4321, 4239, 4161, 4088, 4017, 3950, 3886,
3825, 3766, 3709, 3655, 3602, 3551, 3502, 3454, 3408, 3364, 3320, 3278,
3238, 3198, 3159, 3121, 3085, 3049, 3014, 2980, 2946, 2914, 2882, 2851,
2820, 2790, 2761, 2732, 2704, 2676, 2649, 2623, 2596, 2571, 2546, 2521,
2496, 2473, 2449, 2426, 2403, 2381, 2359, 2337, 2315, 2294, 2274, 2253,
2233, 2213, 2193, 2174, 2155, 2136, 2117, 2099, 2081, 2063, 2046, 2028,
2011, 1994, 1977, 1961, 1944, 1928, 1912, 1896, 1881, 1865, 1850, 1835,
1820, 1805, 1790, 1776, 1762, 1748, 1734, 1720, 1706, 1692, 1679, 1666,
1652, 1639, 1626, 1614, 1601, 1588, 1576, 1564, 1552, 1539, 1527, 1516,
1504, 1492, 1481, 1469, 1458, 1447, 1436, 1425, 1414, 1403, 1392, 1381,
1371, 1360, 1350, 1340, 1329, 1319, 1309, 1299, 1289, 1279, 1270, 1260,
1250, 1241, 1232, 1222, 1213, 1204, 1195, 1185, 1176, 1167, 1159, 1150,
1141, 1132, 1124, 1115, 1107, 1098, 1090, 1082, 1073, 1065, 1057, 1049,
1041, 1033, 1025, 1017, 1010, 1002, 994, 987, 979, 972, 964, 957, 949, 942,
935, 928, 920, 913, 906, 899, 892, 885, 879, 872, 865, 858, 851, 845, 838,
832, 825, 819, 812, 806, 799, 793, 787, 781, 774, 768, 762, 756, 750, 744,
738, 732, 726, 721, 715, 709, 703, 698, 692, 686, 681, 675, 670, 664, 659,
653, 648, 642, 637, 632, 627, 621, 616, 611, 606, 601, 596, 591, 586, 581,
576, 571, 566, 561, 556, 552, 547, 542, 537, 533, 528, 523, 519, 514, 510,
505, 501, 496, 492, 487, 483, 479, 474, 470, 466, 462, 457, 453, 449, 445,
441, 437, 433, 429, 425, 421, 417, 413, 409, 405, 401, 397, 394, 390, 386,
382, 378, 375, 371, 367, 364, 360, 357, 353, 350, 346, 343, 339, 336, 332,
329, 325, 322, 319, 315, 312, 309, 306, 302, 299, 296, 293, 290, 286, 283,
280, 277, 274, 271, 268, 265, 262, 259, 256, 253, 251, 248, 245, 242, 239,
236, 234, 231, 228, 225, 223, 220, 217, 215, 212, 209, 207, 204, 202, 199,
197, 194, 192, 189, 187, 184, 182, 180, 177, 175, 173, 170, 168, 166, 163,
161, 159, 157, 155, 152, 150, 148, 146, 144, 142, 140, 138, 136, 134, 132,
130, 128, 126, 124, 122, 120, 118, 116, 114, 112, 110, 109, 107, 105, 103,
102, 100, 98, 96, 95, 93, 91, 90, 88, 87, 85, 83, 82, 80, 79, 77, 76, 74,
73, 71, 70, 69, 67, 66, 64, 63, 62, 60, 59, 58, 56, 55, 54, 53, 51, 50, 49,
48, 47, 46, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29,
28, 27, 26, 26, 25, 24, 23, 22, 22, 21, 20, 19, 19, 18, 17, 16, 16, 15, 14,
14, 13, 13, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4,
4, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
];
pub const RES_AMP_DECAY_FACTORS: [u8; 8] = [31, 16, 12, 8, 5, 3, 2, 1];
pub fn calc_bias_distance(bias_point: i32, key: u8) -> Option<i32> {
if (bias_point & 0x40) == 0 {
let bias = bias_point + 33 - (key as i32);
if bias > 0 {
return Some(bias);
}
} else {
let bias = bias_point - 31 - (key as i32);
if bias < 0 {
return Some(-bias);
}
}
None
}
const KEY_TO_PITCH_TABLE: [i32; 68] = [
0, 341, 683, 1024, 1365, 1707, 2048, 2389, 2731, 3072, 3413, 3755, 4096,
4437, 4779, 5120, 5461, 5803, 6144, 6485, 6827, 7168, 7509, 7851, 8192,
8533, 8875, 9216, 9557, 9899, 10240, 10581, 10923, 11264, 11605, 11947,
12288, 12629, 12971, 13312, 13653, 13995, 14336, 14677, 15019, 15360,
15701, 16043, 16384, 16725, 17067, 17408, 17749, 18091, 18432, 18773,
19115, 19456, 19797, 20139, 20480, 20821, 21163, 21504, 21845, 22187,
22528, 22869,
];
const PITCH_KEYFOLLOW_MULT: [i32; 17] = [
-8192, -4096, -2048, 0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192,
10240, 12288, 16384, 8198, 8226,
];
fn key_to_pitch(key: u8) -> i32 {
let k = key as i32;
let abs_offset = (k - 60).unsigned_abs() as usize;
let pitch = KEY_TO_PITCH_TABLE[abs_offset];
if key < 60 { -pitch } else { pitch }
}
pub fn calc_base_pitch(
key: u8,
pitch_keyfollow: usize,
pitch_coarse_offset: i32,
pitch_fine_offset: i32,
patch_fine_offset: i32,
pcm_pitch: i32,
) -> u32 {
let mut base_pitch = key_to_pitch(key);
base_pitch = (base_pitch * PITCH_KEYFOLLOW_MULT[pitch_keyfollow]) >> 13;
base_pitch += pitch_coarse_offset;
base_pitch += pitch_fine_offset;
base_pitch += patch_fine_offset;
base_pitch += pcm_pitch;
base_pitch.clamp(0, 59392) as u32
}