From f1b560cce993f06a6a2b81d275c624aed917cb37 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 1 Aug 2023 16:00:13 -0500 Subject: [PATCH] PC speaker: fix cut freq issue #1307 --- src/engine/platform/pcspkr.cpp | 18 +++++++++++++----- src/engine/platform/pcspkr.h | 3 +++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/engine/platform/pcspkr.cpp b/src/engine/platform/pcspkr.cpp index a275c635..d6dcc02c 100644 --- a/src/engine/platform/pcspkr.cpp +++ b/src/engine/platform/pcspkr.cpp @@ -190,9 +190,6 @@ const char** DivPlatformPCSpeaker::getRegisterSheet() { return regCheatSheetPCSpeaker; } -const float cut=0.05; -const float reso=0.06; - void DivPlatformPCSpeaker::acquire_unfilt(short** buf, size_t len) { int out=0; for (size_t i=0; i((freq+16)>>1) && !isMuted[0])?1:0; - low+=0.04*band; - band+=0.04*(next-low-band); + low+=cut*band; + band+=cut*(next-low-band); float out=(low+band)*0.75; if (out>1.0) out=1.0; if (out<-1.0) out=-1.0; @@ -612,6 +609,17 @@ void DivPlatformPCSpeaker::setFlags(const DivConfig& flags) { rate=chipClock/PCSPKR_DIVIDER; speakerType=flags.getInt("speakerType",0)&3; oscBuf->rate=rate; + + switch (speakerType) { + case 1: + cut=2.0*sin(M_PI*1900.0/rate); + reso=0.0; + break; + default: + cut=2.0*sin(M_PI*2375.0/rate); + reso=0.06; + break; + } } void DivPlatformPCSpeaker::notifyInsDeletion(void* ins) { diff --git a/src/engine/platform/pcspkr.h b/src/engine/platform/pcspkr.h index 0437a90c..d9315b5e 100644 --- a/src/engine/platform/pcspkr.h +++ b/src/engine/platform/pcspkr.h @@ -57,6 +57,9 @@ class DivPlatformPCSpeaker: public DivDispatch { float low, band; float low2, high2, band2; float low3, band3; + float cut; + float reso; + unsigned short freq, lastFreq; unsigned char regPool[2];