From aad5d818f26aee716cdfcf9ff98b0c6aa3cd717e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 10 May 2022 16:22:40 -0500 Subject: [PATCH] YM2612: early full linear pitch experiment u n t e s t e d --- src/engine/engine.cpp | 71 +++++++++++++++++++-------------- src/engine/engine.h | 2 +- src/engine/platform/genesis.cpp | 5 ++- 3 files changed, 44 insertions(+), 34 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 83bc56b8..7465c885 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -995,46 +995,55 @@ double DivEngine::calcBaseFreq(double clock, double divider, int note, bool peri base*(divider/clock); } +#define CONVERT_FNUM_BLOCK(bf,bits,note) \ + double tuning=song.tuning; \ + if (tuning<400.0) tuning=400.0; \ + if (tuning>500.0) tuning=500.0; \ + int boundaryBottom=tuning*pow(2.0,0.25)*(divider/clock); \ + int boundaryTop=2.0*tuning*pow(2.0,0.25)*(divider/clock); \ + int block=(note)/12; \ + if (block<0) block=0; \ + if (block>7) block=7; \ + bf>>=block; \ + if (bf<0) bf=0; \ + /* octave boundaries */ \ + while (bf>0 && bf0) { \ + bf<<=1; \ + block--; \ + } \ + if (bf>boundaryTop) { \ + while (block<7 && bf>boundaryTop) { \ + bf>>=1; \ + block++; \ + } \ + if (bf>((1<500.0) tuning=500.0; int bf=calcBaseFreq(clock,divider,note,false); - int boundaryBottom=tuning*pow(2.0,0.25)*(divider/clock); - int boundaryTop=2.0*tuning*pow(2.0,0.25)*(divider/clock); - int block=note/12; - if (block<0) block=0; - if (block>7) block=7; - bf>>=block; - if (bf<0) bf=0; - // octave boundaries - while (bf>0 && bf0) { - bf<<=1; - block--; - } - if (bf>boundaryTop) { - while (block<7 && bf>boundaryTop) { - bf>>=1; - block++; - } - if (bf>((1<0) { + CONVERT_FNUM_BLOCK(bf,blockBits,nbase>>7) + } else { + return bf; + } } if (song.linearPitch==1) { // global pitch multiplier diff --git a/src/engine/engine.h b/src/engine/engine.h index 9ac26d89..4fcc5f1b 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -484,7 +484,7 @@ class DivEngine { unsigned short calcBaseFreqFNumBlock(double clock, double divider, int note, int bits); // calculate frequency/period - int calcFreq(int base, int pitch, bool period=false, int octave=0, int pitch2=0, double clock=1.0, double divider=1.0); + int calcFreq(int base, int pitch, bool period=false, int octave=0, int pitch2=0, double clock=1.0, double divider=1.0, int blockBits=0); // convert panning formats int convertPanSplitToLinear(unsigned int val, unsigned char bits, int range); diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 4b4771a3..2136efeb 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -471,7 +471,7 @@ void DivPlatformGenesis::tick(bool sysTick) { for (int i=0; i<6; i++) { if (i==2 && extMode) continue; if (chan[i].freqChanged) { - int fNum=parent->calcFreq(chan[i].baseFreq&0x7ff,chan[i].pitch,false,4,chan[i].pitch2); + int fNum=parent->calcFreq(chan[i].baseFreq&0x7ff,chan[i].pitch,false,4,chan[i].pitch2,chipClock,CHIP_FREQBASE,11); int block=(chan[i].baseFreq&0xf800)>>11; if (fNum<0) fNum=0; if (fNum>2047) { @@ -495,7 +495,8 @@ void DivPlatformGenesis::tick(bool sysTick) { off=(double)s->centerRate/8363.0; } } - chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,false,4)+chan[i].pitch2; + // TODO: linear + chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,false,4,1,1)+chan[i].pitch2; dacRate=chan[i].freq*off; if (dacRate<1) dacRate=1; if (dumpWrites) addWrite(0xffff0001,dacRate);