shithub: ft2-clone

Download patch

ref: b8597d3238c967105640024555278aec78a5eae1
parent: 1e5706a2419f55dc66900ecf6783a9a17172ee50
author: Olav Sørensen <olav.sorensen@live.no>
date: Mon Jun 15 18:38:41 EDT 2020

Arpeggio is now 100% correct for ticks 31..99

These speed settings are only obtainable by hex-editing XMs

--- a/src/ft2_replayer.c
+++ b/src/ft2_replayer.c
@@ -1727,7 +1727,15 @@
 	// 0xy - Arpeggio
 	if (ch->effTyp == 0)
 	{
-		tick = arpTab[song.timer & 0x1F]; // 8bitbubsy: AND it for security
+		int16_t timer = song.timer;
+
+		/* Non-FT2 protection for our extended 100-byte arp table.
+		** (this shouldn't happen, but just in case)
+		*/
+		if (timer > 99)
+			timer = 99;
+
+		tick = arpTab[timer];
 		if (tick == 0)
 		{
 			ch->outPeriod = ch->realPeriod;
--- a/src/ft2_tables.c
+++ b/src/ft2_tables.c
@@ -10,12 +10,21 @@
 /*                             REPLAYER TABLES                             */
 /* ----------------------------------------------------------------------- */
 
-const uint8_t arpTab[32] =
+const uint8_t arpTab[100] =
 {
 	0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,
-	// the following are overflown values from vibTab in the FT2 replayer code
-	0,24,49,74,97,120,141,161,180,
-	197,212,224,235,244,250,253
+	
+	/* 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
 };
 
 const int8_t vibSineTab[256] = // for auto-vibrato
--- a/src/ft2_tables.h
+++ b/src/ft2_tables.h
@@ -10,7 +10,7 @@
 #define KEY2EFX_ENTRIES (signed)(sizeof (key2EfxTab) / sizeof (SDL_Keycode))
 #define KEY2HEX_ENTRIES (signed)(sizeof (key2HexTab) / sizeof (SDL_Keycode))
 
-extern const uint8_t arpTab[32];
+extern const uint8_t arpTab[100];
 extern const int8_t vibSineTab[256]; // for auto-vibrato
 extern const uint8_t vibTab[32];
 extern const uint16_t amigaPeriod[12 * 8];