From a80cdbb1dd06bb81b5c7d64d9298db0b8cff4bc5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 22 Feb 2025 01:32:31 -0500 Subject: [PATCH] ES5506: increase precision in Amiga pitch mode issue #2120 --- src/engine/platform/es5506.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index 9eafffc76..a40e7d4d5 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -23,7 +23,7 @@ #include #define PITCH_OFFSET ((double)(16*2048*(chanMax+1))) -#define NOTE_ES5506(c,note) ((amigaPitch && parent->song.linearPitch!=2)?parent->calcBaseFreq(COLOR_NTSC,chan[c].pcm.freqOffs,note,true):parent->calcBaseFreq(chipClock,chan[c].pcm.freqOffs,note,false)) +#define NOTE_ES5506(c,note) ((amigaPitch && parent->song.linearPitch!=2)?parent->calcBaseFreq(COLOR_NTSC*16,chan[c].pcm.freqOffs,note,true):parent->calcBaseFreq(chipClock,chan[c].pcm.freqOffs,note,false)) #define rWrite(a,...) {if(!skipRegisterWrites) {hostIntf32.push_back(QueuedHostIntf(4,(a),__VA_ARGS__)); }} #define immWrite(a,...) {hostIntf32.push_back(QueuedHostIntf(4,(a),__VA_ARGS__));} @@ -639,8 +639,9 @@ void DivPlatformES5506::tick(bool sysTick) { } if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { if (amigaPitch && parent->song.linearPitch!=2) { - chan[i].freq=CLAMP(parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,2,chan[i].pitch2,COLOR_NTSC,chan[i].pcm.freqOffs),1,0xffff); - chan[i].freq=32768*(COLOR_NTSC/chan[i].freq)/(chipClock/32.0); + chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch*16,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,2,chan[i].pitch2*16,16*COLOR_NTSC,chan[i].pcm.freqOffs); + chan[i].freq=524288*(COLOR_NTSC/chan[i].freq)/(chipClock/32.0); + chan[i].freq=CLAMP(chan[i].freq,0,0x1ffff); } else { chan[i].freq=CLAMP(parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,false,2,chan[i].pitch2,chipClock,chan[i].pcm.freqOffs),0,0x1ffff); } @@ -1086,6 +1087,9 @@ int DivPlatformES5506::dispatch(DivCommand c) { int nextFreq=chan[c.chan].baseFreq; int destFreq=NOTE_ES5506(c.chan,c.value2+chan[c.chan].sampleNoteDelta); bool return2=false; + if (amigaPitch && parent->song.linearPitch!=2) { + c.value*=16; + } if (destFreq>nextFreq) { nextFreq+=c.value; if (nextFreq>=destFreq) {