From 245f03a932589d214dcbd6575ffaf3f48b16a05f Mon Sep 17 00:00:00 2001 From: tsone Date: Fri, 24 Jan 2025 11:44:53 +0100 Subject: [PATCH 1/2] improve apu pulse channels non-linear mixing precision --- xgm/devices/Sound/nes_apu.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/xgm/devices/Sound/nes_apu.cpp b/xgm/devices/Sound/nes_apu.cpp index 9d50dfc7..4d28ab40 100644 --- a/xgm/devices/Sound/nes_apu.cpp +++ b/xgm/devices/Sound/nes_apu.cpp @@ -147,19 +147,18 @@ namespace xgm if(option[OPT_NONLINEAR_MIXER]) { - INT32 voltage = square_table[out[0] + out[1]]; - m[0] = out[0] << 6; - m[1] = out[1] << 6; - INT32 ref = m[0] + m[1]; + INT32 ref = out[0] + out[1]; if (ref > 0) { - m[0] = (m[0] * voltage) / ref; - m[1] = (m[1] * voltage) / ref; + INT32 voltage = square_table[ref]; + m[0] = (out[0] * voltage) / ref; + m[1] = (out[1] * voltage) / ref; } else { - m[0] = voltage; - m[1] = voltage; + // square_table[0] = 0; + m[0] = 0; + m[1] = 0; } } else @@ -170,11 +169,11 @@ namespace xgm b[0] = m[0] * sm[0][0]; b[0] += m[1] * sm[0][1]; - b[0] >>= 7; + b[0] >>= 11; b[1] = m[0] * sm[1][0]; b[1] += m[1] * sm[1][1]; - b[1] >>= 7; + b[1] >>= 11; return 2; } @@ -190,8 +189,8 @@ namespace xgm option[OPT_NEGATE_SWEEP_INIT] = false; square_table[0] = 0; - for(int i=1;i<32;i++) - square_table[i]=(INT32)((8192.0*95.88)/(8128.0/i+100)); + for(int i=1;i<32;i++) + square_table[i]=(INT32)round((16.0*8192.0*95.88)/(8128.0/i+100)); square_linear = square_table[15]; // match linear scale to one full volume square of nonlinear From fbe2e214f5f546485c73a3bb2cb8316feea37ec7 Mon Sep 17 00:00:00 2001 From: tsone Date: Tue, 4 Feb 2025 13:32:13 +0800 Subject: [PATCH 2/2] change square_table lookup generation use (1<<17) --- xgm/devices/Sound/nes_apu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xgm/devices/Sound/nes_apu.cpp b/xgm/devices/Sound/nes_apu.cpp index 4d28ab40..d4f4420e 100644 --- a/xgm/devices/Sound/nes_apu.cpp +++ b/xgm/devices/Sound/nes_apu.cpp @@ -190,7 +190,7 @@ namespace xgm square_table[0] = 0; for(int i=1;i<32;i++) - square_table[i]=(INT32)round((16.0*8192.0*95.88)/(8128.0/i+100)); + square_table[i]=(INT32)round(((1<<17)*95.88)/(8128.0/i+100)); square_linear = square_table[15]; // match linear scale to one full volume square of nonlinear