From cd685a23e00614d64a09a73f51549ae9af325297 Mon Sep 17 00:00:00 2001 From: zsknight <> Date: Sun, 15 Apr 2001 08:08:44 +0000 Subject: [PATCH] Cubic Spline Sound Interpolation [from AntiResonance] --- zsnes/src/cpu/dspproc.asm | 188 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 178 insertions(+), 10 deletions(-) diff --git a/zsnes/src/cpu/dspproc.asm b/zsnes/src/cpu/dspproc.asm index 2af29e25..50319f0e 100644 --- a/zsnes/src/cpu/dspproc.asm +++ b/zsnes/src/cpu/dspproc.asm @@ -130,6 +130,7 @@ EXTSYM NoiseData,SoundCompD,Voice0Disable,csounddisable,dssel,spcRamcmp EXTSYM cfgecho,Surround,SoundBufEn EXTSYM echobuf EXTSYM LowPassFilter +EXTSYM UseCubicSpline NEWSYM DspProcAsmStart @@ -173,7 +174,10 @@ tempstuff db 0 ALIGN32 DSPInterP: - times 512 dw 0 + times 1024 dw 0 + + +Gaussian: dw 1305,1305,1304,1304,1304,1304,1304,1303 dw 1303,1303,1302,1302,1301,1300,1300,1299 dw 1298,1297,1297,1296,1295,1294,1293,1292 @@ -246,6 +250,139 @@ DSPInterP: dw 0, 0, 0, 0, 0, 0, 0, 0 dw 0, 0, 0, 0, 0, 0, 0, 0 +CubicSpline: + dw 0, 0, 0, 0, 0, 0, 0, 0 + dw 0, -1, -1, -1, -2, -2, -2, -3 + dw -3, -4, -4, -5, -5, -6, -6, -7 + dw -8, -8, -9, -10, -10, -11, -12, -13 + dw -14, -14, -15, -16, -17, -18, -19, -20 + dw -21, -22, -23, -24, -25, -26, -27, -28 + dw -29, -30, -31, -32, -33, -34, -35, -37 + dw -38, -39, -40, -41, -43, -44, -45, -46 + dw -48, -49, -50, -51, -53, -54, -55, -56 + dw -58, -59, -60, -62, -63, -64, -66, -67 + dw -68, -70, -71, -72, -74, -75, -76, -78 + dw -79, -80, -82, -83, -84, -86, -87, -88 + dw -90, -91, -92, -93, -95, -96, -97, -99 + dw -100,-101,-102,-104,-105,-106,-107,-109 + dw -110,-111,-112,-113,-114,-116,-117,-118 + dw -119,-120,-121,-122,-123,-124,-125,-126 + dw -128,-128,-129,-130,-131,-132,-133,-134 + dw -135,-136,-137,-137,-138,-139,-140,-141 + dw -141,-142,-143,-143,-144,-144,-145,-146 + dw -146,-147,-147,-148,-148,-148,-149,-149 + dw -150,-150,-150,-150,-151,-151,-151,-151 + dw -151,-151,-151,-151,-151,-151,-151,-151 + dw -151,-151,-150,-150,-150,-149,-149,-149 + dw -148,-148,-147,-147,-146,-146,-145,-144 + dw -144,-143,-142,-141,-140,-139,-138,-137 + dw -136,-135,-134,-133,-132,-130,-129,-128 + dw -126,-125,-123,-122,-120,-119,-117,-115 + dw -113,-112,-110,-108,-106,-104,-102,-100 + dw -98, -95, -93, -91, -88, -86, -83, -81 + dw -78, -76, -73, -70, -67, -65, -62, -59 + dw -56, -53, -50, -46, -43, -40, -36, -33 + dw -30, -26, -22, -19, -15, -11, -7, -3 + + dw 0, 4, 8, 12, 16, 21, 26, 30 + dw 35, 40, 46, 51, 56, 62, 67, 73 + dw 79, 85, 91, 97, 103, 109, 116, 122 + dw 129, 136, 143, 149, 156, 164, 171, 178 + dw 186, 193, 201, 208, 216, 224, 232, 240 + dw 248, 256, 264, 273, 281, 289, 298, 307 + dw 315, 324, 333, 342, 351, 360, 369, 378 + dw 387, 397, 406, 415, 425, 435, 444, 454 + dw 464, 473, 483, 493, 503, 513, 523, 533 + dw 543, 553, 564, 574, 584, 594, 605, 615 + dw 626, 636, 647, 657, 668, 679, 689, 700 + dw 711, 721, 732, 743, 754, 765, 776, 787 + dw 798, 808, 819, 830, 841, 852, 863, 874 + dw 886, 897, 908, 919, 930, 941, 952, 963 + dw 974, 985, 996,1008,1019,1030,1041,1052 + dw 1063,1074,1085,1096,1107,1118,1129,1140 + dw 1152,1162,1173,1184,1195,1206,1217,1228 + dw 1239,1250,1261,1271,1282,1293,1303,1314 + dw 1325,1335,1346,1356,1367,1377,1388,1398 + dw 1408,1419,1429,1439,1449,1459,1470,1480 + dw 1490,1499,1509,1519,1529,1539,1548,1558 + dw 1567,1577,1586,1595,1605,1614,1623,1632 + dw 1641,1650,1659,1668,1677,1685,1694,1702 + dw 1711,1719,1727,1736,1744,1752,1760,1768 + dw 1776,1783,1791,1798,1806,1813,1820,1828 + dw 1835,1842,1849,1855,1862,1869,1875,1881 + dw 1888,1894,1900,1906,1912,1918,1923,1929 + dw 1934,1940,1945,1950,1955,1960,1964,1969 + dw 1974,1978,1982,1986,1990,1994,1998,2002 + dw 2005,2008,2012,2015,2018,2021,2023,2026 + dw 2028,2031,2033,2035,2037,2038,2040,2041 + dw 2043,2044,2045,2046,2046,2047,2047,2047 + + dw 2048,2047,2047,2047,2046,2046,2045,2044 + dw 2043,2041,2040,2038,2037,2035,2033,2031 + dw 2028,2026,2023,2021,2018,2015,2012,2008 + dw 2005,2002,1998,1994,1990,1986,1982,1978 + dw 1974,1969,1964,1960,1955,1950,1945,1940 + dw 1934,1929,1923,1918,1912,1906,1900,1894 + dw 1888,1881,1875,1869,1862,1855,1849,1842 + dw 1835,1828,1820,1813,1806,1798,1791,1783 + dw 1776,1768,1760,1752,1744,1736,1727,1719 + dw 1711,1702,1694,1685,1677,1668,1659,1650 + dw 1641,1632,1623,1614,1605,1595,1586,1577 + dw 1567,1558,1548,1539,1529,1519,1509,1499 + dw 1490,1480,1470,1459,1449,1439,1429,1419 + dw 1408,1398,1388,1377,1367,1356,1346,1335 + dw 1325,1314,1303,1293,1282,1271,1261,1250 + dw 1239,1228,1217,1206,1195,1184,1173,1162 + dw 1152,1140,1129,1118,1107,1096,1085,1074 + dw 1063,1052,1041,1030,1019,1008, 996, 985 + dw 974, 963, 952, 941, 930, 919, 908, 897 + dw 886, 874, 863, 852, 841, 830, 819, 808 + dw 798, 787, 776, 765, 754, 743, 732, 721 + dw 711, 700, 689, 679, 668, 657, 647, 636 + dw 626, 615, 605, 594, 584, 574, 564, 553 + dw 543, 533, 523, 513, 503, 493, 483, 473 + dw 464, 454, 444, 435, 425, 415, 406, 397 + dw 387, 378, 369, 360, 351, 342, 333, 324 + dw 315, 307, 298, 289, 281, 273, 264, 256 + dw 248, 240, 232, 224, 216, 208, 201, 193 + dw 186, 178, 171, 164, 156, 149, 143, 136 + dw 129, 122, 116, 109, 103, 97, 91, 85 + dw 79, 73, 67, 62, 56, 51, 46, 40 + dw 35, 30, 26, 21, 16, 12, 8, 4 + + dw 0, -3, -7, -11, -15, -19, -22, -26 + dw -30, -33, -36, -40, -43, -46, -50, -53 + dw -56, -59, -62, -65, -67, -70, -73, -76 + dw -78, -81, -83, -86, -88, -91, -93, -95 + dw -98,-100,-102,-104,-106,-108,-110,-112 + dw -113,-115,-117,-119,-120,-122,-123,-125 + dw -126,-128,-129,-130,-132,-133,-134,-135 + dw -136,-137,-138,-139,-140,-141,-142,-143 + dw -144,-144,-145,-146,-146,-147,-147,-148 + dw -148,-149,-149,-149,-150,-150,-150,-151 + dw -151,-151,-151,-151,-151,-151,-151,-151 + dw -151,-151,-151,-151,-151,-150,-150,-150 + dw -150,-149,-149,-148,-148,-148,-147,-147 + dw -146,-146,-145,-144,-144,-143,-143,-142 + dw -141,-141,-140,-139,-138,-137,-137,-136 + dw -135,-134,-133,-132,-131,-130,-129,-128 + dw -128,-126,-125,-124,-123,-122,-121,-120 + dw -119,-118,-117,-116,-114,-113,-112,-111 + dw -110,-109,-107,-106,-105,-104,-102,-101 + dw -100, -99, -97, -96, -95, -93, -92, -91 + dw -90, -88, -87, -86, -84, -83, -82, -80 + dw -79, -78, -76, -75, -74, -72, -71, -70 + dw -68, -67, -66, -64, -63, -62, -60, -59 + dw -58, -56, -55, -54, -53, -51, -50, -49 + dw -48, -46, -45, -44, -43, -41, -40, -39 + dw -38, -37, -35, -34, -33, -32, -31, -30 + dw -29, -28, -27, -26, -25, -24, -23, -22 + dw -21, -20, -19, -18, -17, -16, -15, -14 + dw -14, -13, -12, -11, -10, -10, -9, -8 + dw -8, -7, -6, -6, -5, -5, -4, -4 + dw -3, -3, -2, -2, -2, -1, -1, -1 + dw 0, 0, 0, 0, 0, 0, 0, 0 + ALIGN32 NEWSYM spcWptr, times 16 dd 0 ; SPC Write pointers (point to their own functions) @@ -370,6 +507,41 @@ NEWSYM conv2speed NEWSYM AdjustFrequency + cmp byte[UseCubicSpline],1 + je .cubicspline + ; Copy from Gaussian to DSPInterP + mov ebx,DSPInterP + mov edx,DSPInterP+2046 + mov ecx,512 +.intrploop + xor eax,eax + mov ax,[edx+1024] + mov [edx],ax + mov [ebx],ax + add ebx,2 + sub edx,2 + loop .intrploop + jmp .notgaussian +.cubicspline + ; Copy from CubicSpline to DSPInterP + mov ebx,CubicSpline + mov edx,DSPInterP + mov ecx,1024 +.intrploopb + xor eax,eax + mov ax,[ebx] + push ebx + mov bx,ax + sar bx,3 + sub ax,bx + pop ebx + mov [edx],ax + add ebx,2 + add edx,2 + loop .intrploopb +.notgaussian + + cmp byte[StereoSound],1 jne .nostereo8b cmp byte[SBHDMA],0 @@ -452,21 +624,17 @@ NEWSYM InitSPC push edx ; Mirror Interpolation Table - mov ebx,DSPInterP - mov edx,DSPInterP+2046 + mov ebx,Gaussian mov ecx,512 -.intrploop - xor eax,eax - mov ax,[edx] +.intloop + mov ax,[ebx] or ax,ax jz .nodec dec ax .nodec - mov [edx],ax mov [ebx],ax - add ebx,2 - sub edx,2 - loop .intrploop + dec ecx + jnz .intloop call AdjustFrequency