ref: aa1481048c9a0e969ebb944cbbc01978003fc1d3
parent: a7452c7104ef45f520c7c0f9a9d0b4b470aba10d
author: Olav Sørensen <olav.sorensen@live.no>
date: Wed May 21 09:05:23 EDT 2025
Code cleanup
--- a/src/ft2_replayer.c
+++ b/src/ft2_replayer.c
@@ -1769,7 +1769,7 @@
{
uint8_t note;
- const uint8_t tick = arpeggioTab[song.tick & 255];
+ const uint8_t tick = arpeggioTab[song.tick & 31];
if (tick == 0)
{
ch->outPeriod = ch->realPeriod;
@@ -2272,12 +2272,12 @@
}
// for song playback counter (hh:mm:ss)
- if (song.BPM >= MIN_BPM && song.BPM <= MAX_BPM)
+ if (song.BPM >= MIN_BPM && song.BPM <= MAX_BPM) // just in case
{
- song.playbackSecondsFrac += musicTimeTab52[song.BPM-MIN_BPM];
- if (song.playbackSecondsFrac >= 1ULL << 52)
+ song.playbackSecondsFrac += songTickDuration35fp[song.BPM-MIN_BPM];
+ if (song.playbackSecondsFrac >= 1ULL << 35)
{
- song.playbackSecondsFrac &= (1ULL << 52)-1;
+ song.playbackSecondsFrac &= (1ULL << 35)-1;
song.playbackSeconds++;
}
}
--- a/src/ft2_tables.c
+++ b/src/ft2_tables.c
@@ -10,38 +10,23 @@
/* REPLAYER TABLES */
/* ----------------------------------------------------------------------- */
-const uint16_t ptPeriods[3 * 12] =
+// Formula (supposed to be):
+// for (i = 0 to 31) x = i % 3
+//
+const uint8_t arpeggioTab[32] =
{
- 856,808,762,720,678,640,604,570,538,508,480,453,
- 428,404,381,360,339,320,302,285,269,254,240,226,
- 214,202,190,180,170,160,151,143,135,127,120,113
-};
-
-const uint8_t arpeggioTab[256] =
-{
0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,
- /* The following are overflown bytes from FT2's binary.
- ** (confirmed to be the same on FT2.08 and FT2.09)
+ /* This table is too short in FT2. The following are overflown bytes from
+ ** FT2's binary (confirmed to be the same on FT2.08 and FT2.09).
*/
- 0x00,0x18,0x31,0x4A,0x61,0x78,0x8D,0xA1,0xB4,0xC5,0xD4,0xE0,0xEB,0xF4,0xFA,0xFD,
- 0xFF,0xFD,0xFA,0xF4,0xEB,0xE0,0xD4,0xC5,0xB4,0xA1,0x8D,0x78,0x61,0x4A,0x31,0x18,
- 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x02,0x00,0x04,0x00,0x00,
- 0x00,0x05,0x06,0x00,0x00,0x07,0x00,0x01,0x00,0x02,0x00,0x03,0x04,0x05,0x00,0x00,
- 0x0B,0x00,0x0A,0x02,0x01,0x03,0x04,0x07,0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00,
- 0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x79,0x02,0x00,0x00,0x8F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x4F,0x52,0x4D,0x49,0x4C,0x42,0x4D,0x42,0x4D
+ 0x00,0x18,0x31,0x4A,0x61,0x78,0x8D,0xA1,0xB4,0xC5,0xD4,0xE0,0xEB,0xF4,0xFA,0xFD
};
-const int8_t autoVibSineTab[256] =
+// Formula:
+// for (i = 0 to 255) x = round[64 * sin(-i * 2 * PI / 256)]
+//
+const int8_t autoVibSineTab[256] =
{
0, -2, -3, -5, -6, -8, -9, -11, -12, -14, -16, -17, -19, -20, -22, -23,
-24, -26, -27, -29, -30, -32, -33, -34, -36, -37, -38, -39, -41, -42, -43, -44,
@@ -61,6 +46,9 @@
24, 23, 22, 20, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 3, 2
};
+// Formula:
+// for (i = 0 to 31) x = floor[255 * sin(i * PI / 32)]
+//
const uint8_t vibratoTab[32] = // for normal vibrato/tremolo
{
0, 24, 49, 74, 97,120,141,161,180,197,212,224,235,244,250,253,
@@ -67,18 +55,6 @@
255,253,250,244,235,224,212,197,180,161,141,120, 97, 74, 49, 24
};
-const uint16_t modPeriods[8 * 12] = // used for .MOD loading/saving
-{
- 6848, 6464, 6096, 5760, 5424, 5120, 4832, 4560, 4304, 4064, 3840, 3624,
- 3424, 3232, 3048, 2880, 2712, 2560, 2416, 2280, 2152, 2032, 1920, 1812,
- 1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016, 960, 906,
- 856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453,
- 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226,
- 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113,
- 107, 101, 95, 90, 85, 80, 75, 71, 67, 63, 60, 56,
- 53, 50, 47, 45, 42, 40, 37, 35, 33, 31, 30, 28
-};
-
// Formula:
// for (i = 0 to 1935) x = (1936 - i) * 4
//
@@ -337,6 +313,74 @@
22, 16, 8, 0, 16, 32, 24, 16, 8, 0, 16, 32, 24, 16, 8, 0, 0
};
+const uint16_t ptPeriods[3 * 12] =
+{
+ 856,808,762,720,678,640,604,570,538,508,480,453,
+ 428,404,381,360,339,320,302,285,269,254,240,226,
+ 214,202,190,180,170,160,151,143,135,127,120,113
+};
+
+const uint16_t modPeriods[8 * 12] = // used for .MOD loading/saving
+{
+ 6848, 6464, 6096, 5760, 5424, 5120, 4832, 4560, 4304, 4064, 3840, 3624,
+ 3424, 3232, 3048, 2880, 2712, 2560, 2416, 2280, 2152, 2032, 1920, 1812,
+ 1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016, 960, 906,
+ 856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453,
+ 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226,
+ 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113,
+ 107, 101, 95, 90, 85, 80, 75, 71, 67, 63, 60, 56,
+ 53, 50, 47, 45, 42, 40, 37, 35, 33, 31, 30, 28
+};
+
+/*
+** For song playback time counter.
+** Precision is 35 bits (highest possible when output is uint32_t).
+**
+** Formula:
+** for (bpm = 32 to 255) x = round[2^35 / (bpm / 2.5)]
+*/
+const uint32_t songTickDuration35fp[(MAX_BPM-MIN_BPM)+1] =
+{
+ 0xA0000000, 0x9B26C9B2, 0x96969697, 0x92492492, 0x8E38E38E, 0x8A60DD68,
+ 0x86BCA1AF, 0x83483483, 0x80000000, 0x7CE0C7CE, 0x79E79E7A, 0x7711DC47,
+ 0x745D1746, 0x71C71C72, 0x6F4DE9BD, 0x6CEFA8DA, 0x6AAAAAAB, 0x687D6344,
+ 0x66666666, 0x64646464, 0x62762762, 0x609A90E8, 0x5ED097B4, 0x5D1745D1,
+ 0x5B6DB6DB, 0x59D31675, 0x58469EE6, 0x56C797DD, 0x55555555, 0x53EF368F,
+ 0x5294A529, 0x51451451, 0x50000000, 0x4EC4EC4F, 0x4D9364D9, 0x4C6AFC2E,
+ 0x4B4B4B4B, 0x4A33F129, 0x49249249, 0x481CD857, 0x471C71C7, 0x46231189,
+ 0x45306EB4, 0x44444444, 0x435E50D8, 0x427E5671, 0x41A41A42, 0x40CF6475,
+ 0x40000000, 0x3F35BA78, 0x3E7063E7, 0x3DAFCEA7, 0x3CF3CF3D, 0x3C3C3C3C,
+ 0x3B88EE24, 0x3AD9BF44, 0x3A2E8BA3, 0x398730E6, 0x38E38E39, 0x38438438,
+ 0x37A6F4DF, 0x370DC371, 0x3677D46D, 0x35E50D79, 0x35555555, 0x34C893CB,
+ 0x343EB1A2, 0x33B79891, 0x33333333, 0x32B16CFD, 0x32323232, 0x31B56FD8,
+ 0x313B13B1, 0x30C30C31, 0x304D4874, 0x2FD9B839, 0x2F684BDA, 0x2EF8F442,
+ 0x2E8BA2E9, 0x2E2049CD, 0x2DB6DB6E, 0x2D4F4AC3, 0x2CE98B3A, 0x2C8590B2,
+ 0x2C234F73, 0x2BC2BC2C, 0x2B63CBEF, 0x2B06742B, 0x2AAAAAAB, 0x2A50658E,
+ 0x29F79B47, 0x29A0429A, 0x294A5295, 0x28F5C28F, 0x28A28A29, 0x2850A143,
+ 0x28000000, 0x27B09EC2, 0x27627627, 0x27157F06, 0x26C9B26D, 0x267F09A0,
+ 0x26357E17, 0x25ED097B, 0x25A5A5A6, 0x255F4C9D, 0x2519F894, 0x24D5A3EA,
+ 0x24924925, 0x244FE2F3, 0x240E6C2B, 0x23CDDFC7, 0x238E38E4, 0x234F72C2,
+ 0x231188C4, 0x22D4766C, 0x2298375A, 0x225CC74D, 0x22222222, 0x21E843D1,
+ 0x21AF286C, 0x2176CC21, 0x213F2B39, 0x21084211, 0x20D20D21, 0x209C88F8,
+ 0x2067B23A, 0x203385A3, 0x20000000, 0x1FCD1E36, 0x1F9ADD3C, 0x1F693A1C,
+ 0x1F3831F4, 0x1F07C1F0, 0x1ED7E753, 0x1EA89F6D, 0x1E79E79E, 0x1E4BBD59,
+ 0x1E1E1E1E, 0x1DF1077C, 0x1DC47712, 0x1D986A8B, 0x1D6CDFA2, 0x1D41D41D,
+ 0x1D1745D1, 0x1CED329F, 0x1CC39873, 0x1C9A7546, 0x1C71C71C, 0x1C498C06,
+ 0x1C21C21C, 0x1BFA6785, 0x1BD37A6F, 0x1BACF915, 0x1B86E1B8, 0x1B6132A7,
+ 0x1B3BEA36, 0x1B1706C6, 0x1AF286BD, 0x1ACE688B, 0x1AAAAAAB, 0x1A874B9B,
+ 0x1A6449E6, 0x1A41A41A, 0x1A1F58D1, 0x19FD66A9, 0x19DBCC48, 0x19BA885D,
+ 0x1999999A, 0x1978FEBA, 0x1958B67F, 0x1938BFAF, 0x19191919, 0x18F9C190,
+ 0x18DAB7EC, 0x18BBFB0E, 0x189D89D9, 0x187F6337, 0x18618618, 0x1843F171,
+ 0x1826A43A, 0x18099D72, 0x17ECDC1D, 0x17D05F41, 0x17B425ED, 0x17982F30,
+ 0x177C7A21, 0x176105D8, 0x1745D174, 0x172ADC17, 0x171024E7, 0x16F5AB0D,
+ 0x16DB6DB7, 0x16C16C17, 0x16A7A561, 0x168E18D0, 0x1674C59D, 0x165BAB0A,
+ 0x1642C859, 0x162A1CD0, 0x1611A7B9, 0x15F96861, 0x15E15E16, 0x15C9882C,
+ 0x15B1E5F7, 0x159A76D2, 0x15833A16, 0x156C2F21, 0x15555555, 0x153EAC15,
+ 0x152832C7, 0x1511E8D3, 0x14FBCDA4, 0x14E5E0A7, 0x14D0214D, 0x14BA8F07,
+ 0x14A5294A, 0x148FEF8D, 0x147AE148, 0x1465FDF6, 0x14514514, 0x143CB622,
+ 0x142850A1, 0x14141414
+};
+
/* ----------------------------------------------------------------------- */
/* GUI TABLES */
/* ----------------------------------------------------------------------- */
@@ -873,77 +917,4 @@
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x00,0x03,0x00,0x40,0x1F,0x40,
0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,
0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x01,0x00,0x00,0x08,0x00,0x00,0x00
-};
-
-/* ----------------------------------------------------------------------- */
-/* MISCELLANEOUS TABLES */
-/* ----------------------------------------------------------------------- */
-
-/*
-** For playback time counter.
-**
-** for (int32_t bpm = 32; bpm <= 255; bpm++)
-** {
-** const double dBpmHz = bpm / 2.5;
-** uint64_t musicTimeTab48[i] = (uint64_t)round((1ULL << 52) / dBpmHz);
-** }
-*/
-const uint64_t musicTimeTab52[(MAX_BPM-MIN_BPM)+1] =
-{
- 0x1400000000000,0x1364D9364D936,0x12D2D2D2D2D2D,0x1249249249249,
- 0x11C71C71C71C7,0x114C1BACF914C,0x10D79435E50D8,0x1069069069069,
- 0x1000000000000,0x0F9C18F9C18FA,0x0F3CF3CF3CF3D,0x0EE23B88EE23C,
- 0x0E8BA2E8BA2E9,0x0E38E38E38E39,0x0DE9BD37A6F4E,0x0D9DF51B3BEA3,
- 0x0D55555555555,0x0D0FAC687D634,0x0CCCCCCCCCCCD,0x0C8C8C8C8C8C9,
- 0x0C4EC4EC4EC4F,0x0C13521CFB2B8,0x0BDA12F684BDA,0x0BA2E8BA2E8BA,
- 0x0B6DB6DB6DB6E,0x0B3A62CE98B3A,0x0B08D3DCB08D4,0x0AD8F2FBA9387,
- 0x0AAAAAAAAAAAB,0x0A7DE6D1D6086,0x0A5294A5294A5,0x0A28A28A28A29,
- 0x0A00000000000,0x09D89D89D89D9,0x09B26C9B26C9B,0x098D5F85BB395,
- 0x0969696969697,0x09467E2519F89,0x0924924924925,0x09039B0AD1207,
- 0x08E38E38E38E4,0x08C46231188C4,0x08A60DD67C8A6,0x0888888888889,
- 0x086BCA1AF286C,0x084FCACE213F3,0x0834834834835,0x0819EC8E95103,
- 0x0800000000000,0x07E6B74F03291,0x07CE0C7CE0C7D,0x07B5F9D4D1BC2,
- 0x079E79E79E79E,0x0787878787878,0x07711DC47711E,0x075B37E875B38,
- 0x0745D1745D174,0x0730E61CC3987,0x071C71C71C71C,0x0708708708708,
- 0x06F4DE9BD37A7,0x06E1B86E1B86E,0x06CEFA8D9DF52,0x06BCA1AF286BD,
- 0x06AAAAAAAAAAB,0x0699127966ED8,0x0687D6343EB1A,0x0676F31219DBD,
- 0x0666666666666,0x06562D9FAEE42,0x0646464646464,0x0636ADFB0774D,
- 0x0627627627627,0x0618618618618,0x0609A90E7D95C,0x05FB37072D754,
- 0x05ED097B425ED,0x05DF1E88385DF,0x05D1745D1745D,0x05C40939A85C4,
- 0x05B6DB6DB6DB7,0x05A9E9585A9E9,0x059D31674C59D,0x0590B21642C86,
- 0x058469EE5846A,0x0578578578578,0x056C797DD49C3,0x0560CE8560CE8,
- 0x0555555555555,0x054A0CB1B810F,0x053EF368EB043,0x0534085340853,
- 0x05294A5294A53,0x051EB851EB852,0x0514514514514,0x050A142850A14,
- 0x0500000000000,0x04F613D84F614,0x04EC4EC4EC4EC,0x04E2AFE0BB9A6,
- 0x04D9364D9364E,0x04CFE133F84D0,0x04C6AFC2DD9CB,0x04BDA12F684BE,
- 0x04B4B4B4B4B4B,0x04ABE9939ED50,0x04A33F128CFC5,0x049AB47D3CC6F,
- 0x0492492492492,0x0489FC5E694E1,0x0481CD8568904,0x0479BBF8D6D34,
- 0x0471C71C71C72,0x0469EE58469EE,0x046231188C462,0x045A8ECD7F211,
- 0x045306EB3E453,0x044B98E9AA181,0x0444444444444,0x043D087A10F42,
- 0x0435E50D79436,0x042ED9842ED98,0x0427E567109F9,0x0421084210842,
- 0x041A41A41A41A,0x0413911EFB1BC,0x040CF6474A882,0x040670B453B93,
- 0x0400000000000,0x03F9A3C6C1FCD,0x03F35BA781949,0x03ED274388A35,
- 0x03E7063E7063E,0x03E0F83E0F83E,0x03DAFCEA68DE1,0x03D513ED9AD39,
- 0x03CF3CF3CF3CF,0x03C977AB2BEDD,0x03C3C3C3C3C3C,0x03BE20EF883BE,
- 0x03B88EE23B88F,0x03B30D5163250,0x03AD9BF43AD9C,0x03A83A83A83A8,
- 0x03A2E8BA2E8BA,0x039DA653E312D,0x0398730E61CC4,0x03934EA8C280B,
- 0x038E38E38E38E,0x03893180B509E,0x0384384384384,0x037F4CF09CAD7,
- 0x037A6F4DE9BD3,0x03759F2298376,0x0370DC370DC37,0x036C2654E0837,
- 0x03677D46CEFA9,0x0362E0D8B8363,0x035E50D79435E,0x0359CD116C90C,
- 0x0355555555555,0x0350E97366228,0x034C893CB376C,0x0348348348348,
- 0x0343EB1A1F58D,0x033FACD51DE37,0x033B79890CEDE,0x0337510B93F09,
- 0x0333333333333,0x032F1FD73E687,0x032B16CFD7721,0x032717F5E94CF,
- 0x0323232323232,0x031F3831F3832,0x031B56FD83BA7,0x03177F61B352E,
- 0x0313B13B13B14,0x030FEC66E3D3E,0x030C30C30C30C,0x03087E2E1AB12,
- 0x0304D4873ECAE,0x030133AE45B58,0x02FD9B8396BAA,0x02FA0BE82FA0C,
- 0x02F684BDA12F7,0x02F305E60BCC1,0x02EF8F441C2F0,0x02EC20BB082EC,
- 0x02E8BA2E8BA2F,0x02E55B82E55B8,0x02E2049CD42E2,0x02DEB5619416F,
- 0x02DB6DB6DB6DB,0x02D82D82D82D8,0x02D4F4AC2D4F5,0x02D1C319F0362,
- 0x02CE98B3A62CF,0x02CB756141F4D,0x02C8590B21643,0x02C5439A0B151,
- 0x02C234F72C235,0x02BF2D0C15F97,0x02BC2BC2BC2BC,0x02B9310572621,
- 0x02B63CBEEA4E2,0x02B34EDA31B01,0x02B06742B0674,0x02AD85E4268F9,
- 0x02AAAAAAAAAAB,0x02A7D582A7D58,0x02A50658DC087,0x02A23D1A56630,
- 0x029F79B475822,0x029CBC14E5E0A,0x029A0429A042A,0x029751E0E8297,
- 0x0294A5294A529,0x0291FDF19B3EB,0x028F5C28F5C29,0x028CBFBEB9A02,
- 0x028A28A28A28A,0x028796C44CE6B,0x02850A142850A,0x0282828282828
};
--- a/src/ft2_tables.h
+++ b/src/ft2_tables.h
@@ -10,14 +10,14 @@
#define KEY2EFX_ENTRIES (signed)(sizeof (key2EfxTab) / sizeof (SDL_Keycode))
#define KEY2HEX_ENTRIES (signed)(sizeof (key2HexTab) / sizeof (SDL_Keycode))
-extern const uint16_t ptPeriods[3 * 12];
-
-extern const uint8_t arpeggioTab[256];
+extern const uint8_t arpeggioTab[32];
extern const int8_t autoVibSineTab[256];
extern const uint8_t vibratoTab[32];
-extern const uint16_t modPeriods[8 * 12];
extern const uint16_t linearPeriodLUT[1936];
extern const uint16_t amigaPeriodLUT[1936];
+extern const uint16_t ptPeriods[3 * 12];
+extern const uint16_t modPeriods[8 * 12];
+extern const uint32_t songTickDuration35fp[(MAX_BPM-MIN_BPM)+1];
extern const char *dec2StrTab[100];
extern const char *dec3StrTab[256];
@@ -46,5 +46,3 @@
extern const uint16_t scopeLenTab[16][32];
extern const uint8_t defConfigData[CONFIG_FILE_SIZE];
-
-extern const uint64_t musicTimeTab52[(MAX_BPM-MIN_BPM)+1];
--
⑨