From c84ff399d9f649776c382a6603e1f5ac954d8cd9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 24 Apr 2022 22:45:59 -0500 Subject: [PATCH] YM2612: fix negative octaves --- src/engine/dispatch.h | 3 ++- src/engine/engine.cpp | 11 +++++++++++ src/engine/engine.h | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index b358c464c..bd3b19a68 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -426,7 +426,8 @@ class DivDispatch { #define NOTE_PERIODIC(x) round(parent->calcBaseFreq(chipClock,CHIP_DIVIDER,x,true)) #define NOTE_PERIODIC_NOROUND(x) parent->calcBaseFreq(chipClock,CHIP_DIVIDER,x,true) #define NOTE_FREQUENCY(x) parent->calcBaseFreq(chipClock,CHIP_FREQBASE,x,false) -#define NOTE_FNUM_BLOCK(x,bits) ((((int)parent->calcBaseFreq(chipClock,CHIP_FREQBASE,(x)%12,false))&((1<calcBaseFreqFNumBlock(chipClock,CHIP_FREQBASE,x,bits) #define COLOR_NTSC (315000000.0/88.0) #define COLOR_PAL (283.75*15625.0+25.0) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 905ba8aa5..2ebbd2fdb 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -887,6 +887,17 @@ double DivEngine::calcBaseFreq(double clock, double divider, int note, bool peri base*(divider/clock); } +unsigned short DivEngine::calcBaseFreqFNumBlock(double clock, double divider, int note, int bits) { + int bf=calcBaseFreq(clock,divider,note,false); + int block=note/12; + if (block<0) block=0; + if (block>7) block=7; + bf>>=block; + if (bf<0) bf=0; + if (bf>((1<