mirror of
https://github.com/TomHarte/CLK.git
synced 2024-08-16 16:28:59 +00:00
This is as a precursor to switching to using the proper table lookups, which I hope will automatically fix my range issues.
152 lines
5.4 KiB
C++
152 lines
5.4 KiB
C++
//
|
|
// Tables.h
|
|
// Clock Signal
|
|
//
|
|
// Created by Thomas Harte on 15/04/2020.
|
|
// Copyright © 2020 Thomas Harte. All rights reserved.
|
|
//
|
|
|
|
#ifndef Tables_h
|
|
#define Tables_h
|
|
|
|
namespace Yamaha {
|
|
namespace OPL {
|
|
|
|
/*
|
|
These are the OPL's built-in log-sin and exponentiation tables, as recovered by
|
|
Matthew Gambrell and Olli Niemitalo in 'OPLx decapsulated'. Despite the formulas
|
|
being well known, I've elected not to generate these at runtime because even if I
|
|
did, I'd just end up with the proper values laid out in full in a unit test, and
|
|
they're very compact.
|
|
*/
|
|
|
|
|
|
/// Defines the first quadrant of a sine curve, as calculated by round(-log(sin((x+0.5)*pi/256/2))/log(2)*256).
|
|
constexpr int log_sin[] = {
|
|
2137, 1731, 1543, 1419, 1326, 1252, 1190, 1137,
|
|
1091, 1050, 1013, 979, 949, 920, 894, 869,
|
|
846, 825, 804, 785, 767, 749, 732, 717,
|
|
701, 687, 672, 659, 646, 633, 621, 609,
|
|
598, 587, 576, 566, 556, 546, 536, 527,
|
|
518, 509, 501, 492, 484, 476, 468, 461,
|
|
453, 446, 439, 432, 425, 418, 411, 405,
|
|
399, 392, 386, 380, 375, 369, 363, 358,
|
|
352, 347, 341, 336, 331, 326, 321, 316,
|
|
311, 307, 302, 297, 293, 289, 284, 280,
|
|
276, 271, 267, 263, 259, 255, 251, 248,
|
|
244, 240, 236, 233, 229, 226, 222, 219,
|
|
215, 212, 209, 205, 202, 199, 196, 193,
|
|
190, 187, 184, 181, 178, 175, 172, 169,
|
|
167, 164, 161, 159, 156, 153, 151, 148,
|
|
146, 143, 141, 138, 136, 134, 131, 129,
|
|
127, 125, 122, 120, 118, 116, 114, 112,
|
|
110, 108, 106, 104, 102, 100, 98, 96,
|
|
94, 92, 91, 89, 87, 85, 83, 82,
|
|
80, 78, 77, 75, 74, 72, 70, 69,
|
|
67, 66, 64, 63, 62, 60, 59, 57,
|
|
56, 55, 53, 52, 51, 49, 48, 47,
|
|
46, 45, 43, 42, 41, 40, 39, 38,
|
|
37, 36, 35, 34, 33, 32, 31, 30,
|
|
29, 28, 27, 26, 25, 24, 23, 23,
|
|
22, 21, 20, 20, 19, 18, 17, 17,
|
|
16, 15, 15, 14, 13, 13, 12, 12,
|
|
11, 10, 10, 9, 9, 8, 8, 7,
|
|
7, 7, 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
|
|
};
|
|
|
|
/// Defines exponentiation; to get exponential of x is (exp[x&255] + 1024) << (x >> 8)
|
|
constexpr int exp[] = {
|
|
0, 3, 6, 8, 11, 14, 17, 20,
|
|
22, 25, 28, 31, 34, 37, 40, 42,
|
|
45, 48, 51, 54, 57, 60, 63, 66,
|
|
69, 72, 75, 78, 81, 84, 87, 90,
|
|
93, 96, 99, 102, 105, 108, 111, 114,
|
|
117, 120, 123, 126, 130, 133, 136, 139,
|
|
142, 145, 148, 152, 155, 158, 161, 164,
|
|
168, 171, 174, 177, 181, 184, 187, 190,
|
|
194, 197, 200, 204, 207, 210, 214, 217,
|
|
220, 224, 227, 231, 234, 237, 241, 244,
|
|
248, 251, 255, 258, 262, 265, 268, 272,
|
|
276, 279, 283, 286, 290, 293, 297, 300,
|
|
304, 308, 311, 315, 318, 322, 326, 329,
|
|
333, 337, 340, 344, 348, 352, 355, 359,
|
|
363, 367, 370, 374, 378, 382, 385, 389,
|
|
393, 397, 401, 405, 409, 412, 416, 420,
|
|
424, 428, 432, 436, 440, 444, 448, 452,
|
|
456, 460, 464, 468, 472, 476, 480, 484,
|
|
488, 492, 496, 501, 505, 509, 513, 517,
|
|
521, 526, 530, 534, 538, 542, 547, 551,
|
|
555, 560, 564, 568, 572, 577, 581, 585,
|
|
590, 594, 599, 603, 607, 612, 616, 621,
|
|
625, 630, 634, 639, 643, 648, 652, 657,
|
|
661, 666, 670, 675, 680, 684, 689, 693,
|
|
698, 703, 708, 712, 717, 722, 726, 731,
|
|
736, 741, 745, 750, 755, 760, 765, 770,
|
|
774, 779, 784, 789, 794, 799, 804, 809,
|
|
814, 819, 824, 829, 834, 839, 844, 849,
|
|
854, 859, 864, 869, 874, 880, 885, 890,
|
|
895, 900, 906, 911, 916, 921, 927, 932,
|
|
937, 942, 948, 953, 959, 964, 969, 975,
|
|
980, 986, 991, 996, 1002, 1007, 1013, 1018
|
|
};
|
|
|
|
/*
|
|
|
|
Credit for the fixed register lists goes to Nuke.YKT; I found them at:
|
|
https://siliconpr0n.org/archive/doku.php?id=vendor:yamaha:opl2#ym2413_instrument_rom
|
|
|
|
The arrays below begin with channel 1, then each line is a single channel defined
|
|
in exactly the same terms as the OPL's user-defined channel.
|
|
|
|
*/
|
|
|
|
constexpr uint8_t opll_patch_set[] = {
|
|
0x71, 0x61, 0x1e, 0x17, 0xd0, 0x78, 0x00, 0x17,
|
|
0x13, 0x41, 0x1a, 0x0d, 0xd8, 0xf7, 0x23, 0x13,
|
|
0x13, 0x01, 0x99, 0x00, 0xf2, 0xc4, 0x11, 0x23,
|
|
0x31, 0x61, 0x0e, 0x07, 0xa8, 0x64, 0x70, 0x27,
|
|
0x32, 0x21, 0x1e, 0x06, 0xe0, 0x76, 0x00, 0x28,
|
|
0x31, 0x22, 0x16, 0x05, 0xe0, 0x71, 0x00, 0x18,
|
|
0x21, 0x61, 0x1d, 0x07, 0x82, 0x81, 0x10, 0x07,
|
|
0x23, 0x21, 0x2d, 0x14, 0xa2, 0x72, 0x00, 0x07,
|
|
0x61, 0x61, 0x1b, 0x06, 0x64, 0x65, 0x10, 0x17,
|
|
0x41, 0x61, 0x0b, 0x18, 0x85, 0xf7, 0x71, 0x07,
|
|
0x13, 0x01, 0x83, 0x11, 0xfa, 0xe4, 0x10, 0x04,
|
|
0x17, 0xc1, 0x24, 0x07, 0xf8, 0xf8, 0x22, 0x12,
|
|
0x61, 0x50, 0x0c, 0x05, 0xc2, 0xf5, 0x20, 0x42,
|
|
0x01, 0x01, 0x55, 0x03, 0xc9, 0x95, 0x03, 0x02,
|
|
0x61, 0x41, 0x89, 0x03, 0xf1, 0xe4, 0x40, 0x13,
|
|
};
|
|
|
|
constexpr uint8_t vrc7_patch_set[] = {
|
|
0x03, 0x21, 0x05, 0x06, 0xe8, 0x81, 0x42, 0x27,
|
|
0x13, 0x41, 0x14, 0x0d, 0xd8, 0xf6, 0x23, 0x12,
|
|
0x11, 0x11, 0x08, 0x08, 0xfa, 0xb2, 0x20, 0x12,
|
|
0x31, 0x61, 0x0c, 0x07, 0xa8, 0x64, 0x61, 0x27,
|
|
0x32, 0x21, 0x1e, 0x06, 0xe1, 0x76, 0x01, 0x28,
|
|
0x02, 0x01, 0x06, 0x00, 0xa3, 0xe2, 0xf4, 0xf4,
|
|
0x21, 0x61, 0x1d, 0x07, 0x82, 0x81, 0x11, 0x07,
|
|
0x23, 0x21, 0x22, 0x17, 0xa2, 0x72, 0x01, 0x17,
|
|
0x35, 0x11, 0x25, 0x00, 0x40, 0x73, 0x72, 0x01,
|
|
0xb5, 0x01, 0x0f, 0x0f, 0xa8, 0xa5, 0x51, 0x02,
|
|
0x17, 0xc1, 0x24, 0x07, 0xf8, 0xf8, 0x22, 0x12,
|
|
0x71, 0x23, 0x11, 0x06, 0x65, 0x74, 0x18, 0x16,
|
|
0x01, 0x02, 0xd3, 0x05, 0xc9, 0x95, 0x03, 0x02,
|
|
0x61, 0x63, 0x0c, 0x00, 0x94, 0xc0, 0x33, 0xf6,
|
|
0x21, 0x72, 0x0d, 0x00, 0xc1, 0xd5, 0x56, 0x06,
|
|
};
|
|
|
|
constexpr uint8_t percussion_patch_set[] = {
|
|
0x01, 0x01, 0x18, 0x0f, 0xdf, 0xf8, 0x6a, 0x6d,
|
|
0x01, 0x01, 0x00, 0x00, 0xc8, 0xd8, 0xa7, 0x48,
|
|
0x05, 0x01, 0x00, 0x00, 0xf8, 0xaa, 0x59, 0x55,
|
|
};
|
|
|
|
}
|
|
}
|
|
|
|
#endif /* Tables_h */
|