shithub: ft²

Download patch

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];
--