From 2fa51e482af5053f44c4f7abb6a853250503d345 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 22 May 2022 23:47:41 -0500 Subject: [PATCH] OPN(A/B/2/B-B): fix absolutely everything --- src/engine/platform/fmshared_OPN.h | 61 ++++++++++++++++++++++++++++++ src/engine/platform/genesis.cpp | 51 +------------------------ src/engine/platform/genesisext.cpp | 47 +---------------------- src/engine/platform/genesisext.h | 3 +- src/engine/platform/ym2203.cpp | 51 +------------------------ src/engine/platform/ym2203ext.cpp | 47 +---------------------- src/engine/platform/ym2203ext.h | 6 ++- src/engine/platform/ym2608.cpp | 51 +------------------------ src/engine/platform/ym2608ext.cpp | 47 +---------------------- src/engine/platform/ym2608ext.h | 6 ++- src/engine/platform/ym2610.cpp | 51 +------------------------ src/engine/platform/ym2610b.cpp | 51 +------------------------ src/engine/platform/ym2610bext.cpp | 47 +---------------------- src/engine/platform/ym2610bext.h | 6 ++- src/engine/platform/ym2610ext.cpp | 47 +---------------------- src/engine/platform/ym2610ext.h | 6 ++- 16 files changed, 89 insertions(+), 489 deletions(-) diff --git a/src/engine/platform/fmshared_OPN.h b/src/engine/platform/fmshared_OPN.h index 00573980..a709aa1a 100644 --- a/src/engine/platform/fmshared_OPN.h +++ b/src/engine/platform/fmshared_OPN.h @@ -32,4 +32,65 @@ #define ADDR_FB_ALG 0xb0 #define ADDR_LRAF 0xb4 +#define PLEASE_HELP_ME(_targetChan) \ + int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); \ + int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); \ + int destFreq=NOTE_FNUM_BLOCK(c.value2,11); \ + int newFreq; \ + bool return2=false; \ + if (_targetChan.portaPause) { \ + if (parent->song.oldOctaveBoundary) { \ + if ((_targetChan.portaPauseFreq&0xf800)>(_targetChan.baseFreq&0xf800)) { \ + _targetChan.baseFreq=((_targetChan.baseFreq&0x7ff)>>1)|(_targetChan.portaPauseFreq&0xf800); \ + } else { \ + _targetChan.baseFreq=((_targetChan.baseFreq&0x7ff)<<1)|(_targetChan.portaPauseFreq&0xf800); \ + } \ + c.value*=2; \ + } else { \ + _targetChan.baseFreq=_targetChan.portaPauseFreq; \ + } \ + } \ + if (destFreq>_targetChan.baseFreq) { \ + newFreq=_targetChan.baseFreq+c.value; \ + if (newFreq>=destFreq) { \ + newFreq=destFreq; \ + return2=true; \ + } \ + } else { \ + newFreq=_targetChan.baseFreq-c.value; \ + if (newFreq<=destFreq) { \ + newFreq=destFreq; \ + return2=true; \ + } \ + } \ + /* check for octave boundary */ \ + /* what the heck! */ \ + if (!_targetChan.portaPause) { \ + if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { \ + if (parent->song.fbPortaPause) { \ + _targetChan.portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800); \ + _targetChan.portaPause=true; \ + break; \ + } else { \ + newFreq=((newFreq&0x7ff)>>1)|((newFreq+0x800)&0xf800); \ + } \ + } \ + if ((newFreq&0x7ff)0) { \ + if (parent->song.fbPortaPause) { \ + _targetChan.portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800); \ + _targetChan.portaPause=true; \ + break; \ + } else { \ + newFreq=((newFreq&0x7ff)<<1)|((newFreq-0x800)&0xf800); \ + } \ + } \ + } \ + _targetChan.portaPause=false; \ + _targetChan.freqChanged=true; \ + _targetChan.baseFreq=newFreq; \ + if (return2) { \ + _targetChan.inPorta=false; \ + return 2; \ + } + #endif \ No newline at end of file diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index c61f5c01..e4a041d8 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -756,56 +756,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) { } break; } - int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); - int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); - int destFreq=NOTE_FNUM_BLOCK(c.value2,11); - int newFreq; - bool return2=false; - if (chan[c.chan].portaPause) { - chan[c.chan].baseFreq=chan[c.chan].portaPauseFreq; - } - if (destFreq>chan[c.chan].baseFreq) { - newFreq=chan[c.chan].baseFreq+c.value; - if (newFreq>=destFreq) { - newFreq=destFreq; - return2=true; - } - } else { - newFreq=chan[c.chan].baseFreq-c.value; - if (newFreq<=destFreq) { - newFreq=destFreq; - return2=true; - } - } - // check for octave boundary - // what the heck! - if (!chan[c.chan].portaPause) { - if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { - if (parent->song.fbPortaPause) { - chan[c.chan].portaPauseFreq=(parent->song.oldOctaveBoundary?(newFreq>>1):boundaryBottom)|((newFreq+0x800)&0xf800); - chan[c.chan].portaPause=true; - break; - } else { - newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800); - } - } - if ((newFreq&0x7ff)0) { - if (parent->song.fbPortaPause) { - chan[c.chan].portaPauseFreq=newFreq=(parent->song.oldOctaveBoundary?(newFreq<<1):(boundaryTop-1))|((newFreq-0x800)&0xf800); - chan[c.chan].portaPause=true; - break; - } else { - newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800); - } - } - } - chan[c.chan].portaPause=false; - chan[c.chan].freqChanged=true; - chan[c.chan].baseFreq=newFreq; - if (return2) { - chan[c.chan].inPorta=false; - return 2; - } + PLEASE_HELP_ME(chan[c.chan]); break; } case DIV_CMD_SAMPLE_MODE: { diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index d9f2b7a8..9f768ad2 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -150,52 +150,7 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { } break; } - int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); - int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); - int destFreq=NOTE_FNUM_BLOCK(c.value2,11); - int newFreq; - bool return2=false; - if (opChan[ch].portaPause) { - opChan[ch].baseFreq=opChan[ch].portaPauseFreq; - } - if (destFreq>opChan[ch].baseFreq) { - newFreq=opChan[ch].baseFreq+c.value; - if (newFreq>=destFreq) { - newFreq=destFreq; - return2=true; - } - } else { - newFreq=opChan[ch].baseFreq-c.value; - if (newFreq<=destFreq) { - newFreq=destFreq; - return2=true; - } - } - // what the heck! - if (!opChan[ch].portaPause) { - if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { - if (parent->song.fbPortaPause) { - opChan[ch].portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800); - opChan[ch].portaPause=true; - break; - } else { - newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800); - } - } - if ((newFreq&0x7ff)0) { - if (parent->song.fbPortaPause) { - opChan[ch].portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800); - opChan[ch].portaPause=true; - break; - } else { - newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800); - } - } - } - opChan[ch].portaPause=false; - opChan[ch].freqChanged=true; - opChan[ch].baseFreq=newFreq; - if (return2) return 2; + PLEASE_HELP_ME(opChan[ch]); break; } case DIV_CMD_SAMPLE_MODE: { diff --git a/src/engine/platform/genesisext.h b/src/engine/platform/genesisext.h index b482663c..f6c1e3dc 100644 --- a/src/engine/platform/genesisext.h +++ b/src/engine/platform/genesisext.h @@ -27,7 +27,7 @@ class DivPlatformGenesisExt: public DivPlatformGenesis { unsigned char freqH, freqL; int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins; signed char konCycles; - bool active, insChanged, freqChanged, keyOn, keyOff, portaPause; + bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta; int vol; unsigned char pan; OpChannel(): @@ -45,6 +45,7 @@ class DivPlatformGenesisExt: public DivPlatformGenesis { keyOn(false), keyOff(false), portaPause(false), + inPorta(false), vol(0), pan(3) {} }; diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index 6c139398..3303fbf8 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -659,56 +659,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { } break; } - int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); - int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); - int destFreq=NOTE_FNUM_BLOCK(c.value2,11); - int newFreq; - bool return2=false; - if (chan[c.chan].portaPause) { - chan[c.chan].baseFreq=chan[c.chan].portaPauseFreq; - } - if (destFreq>chan[c.chan].baseFreq) { - newFreq=chan[c.chan].baseFreq+c.value; - if (newFreq>=destFreq) { - newFreq=destFreq; - return2=true; - } - } else { - newFreq=chan[c.chan].baseFreq-c.value; - if (newFreq<=destFreq) { - newFreq=destFreq; - return2=true; - } - } - // check for octave boundary - // what the heck! - if (!chan[c.chan].portaPause) { - if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { - if (parent->song.fbPortaPause) { - chan[c.chan].portaPauseFreq=(parent->song.oldOctaveBoundary?(newFreq>>1):boundaryBottom)|((newFreq+0x800)&0xf800); - chan[c.chan].portaPause=true; - break; - } else { - newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800); - } - } - if ((newFreq&0x7ff)0) { - if (parent->song.fbPortaPause) { - chan[c.chan].portaPauseFreq=newFreq=(parent->song.oldOctaveBoundary?(newFreq<<1):(boundaryTop-1))|((newFreq-0x800)&0xf800); - chan[c.chan].portaPause=true; - break; - } else { - newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800); - } - } - } - chan[c.chan].portaPause=false; - chan[c.chan].freqChanged=true; - chan[c.chan].baseFreq=newFreq; - if (return2) { - chan[c.chan].inPorta=false; - return 2; - } + PLEASE_HELP_ME(chan[c.chan]); break; } case DIV_CMD_LEGATO: { diff --git a/src/engine/platform/ym2203ext.cpp b/src/engine/platform/ym2203ext.cpp index 7052027c..929687fe 100644 --- a/src/engine/platform/ym2203ext.cpp +++ b/src/engine/platform/ym2203ext.cpp @@ -143,52 +143,7 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) { } break; } - int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); - int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); - int destFreq=NOTE_FNUM_BLOCK(c.value2,11); - int newFreq; - bool return2=false; - if (opChan[ch].portaPause) { - opChan[ch].baseFreq=opChan[ch].portaPauseFreq; - } - if (destFreq>opChan[ch].baseFreq) { - newFreq=opChan[ch].baseFreq+c.value; - if (newFreq>=destFreq) { - newFreq=destFreq; - return2=true; - } - } else { - newFreq=opChan[ch].baseFreq-c.value; - if (newFreq<=destFreq) { - newFreq=destFreq; - return2=true; - } - } - // what the heck! - if (!opChan[ch].portaPause) { - if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { - if (parent->song.fbPortaPause) { - opChan[ch].portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800); - opChan[ch].portaPause=true; - break; - } else { - newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800); - } - } - if ((newFreq&0x7ff)0) { - if (parent->song.fbPortaPause) { - opChan[ch].portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800); - opChan[ch].portaPause=true; - break; - } else { - newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800); - } - } - } - opChan[ch].portaPause=false; - opChan[ch].freqChanged=true; - opChan[ch].baseFreq=newFreq; - if (return2) return 2; + PLEASE_HELP_ME(opChan[ch]); break; } case DIV_CMD_LEGATO: { diff --git a/src/engine/platform/ym2203ext.h b/src/engine/platform/ym2203ext.h index 7dde3abb..5025881c 100644 --- a/src/engine/platform/ym2203ext.h +++ b/src/engine/platform/ym2203ext.h @@ -27,10 +27,12 @@ class DivPlatformYM2203Ext: public DivPlatformYM2203 { unsigned char freqH, freqL; int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins; signed char konCycles; - bool active, insChanged, freqChanged, keyOn, keyOff, portaPause; + bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta; int vol; unsigned char pan; - OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), vol(0), pan(3) {} + // UGLY + OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), + inPorta(false), vol(0), pan(3) {} }; OpChannel opChan[4]; bool isOpMuted[4]; diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 532d1f2f..b6f1e16f 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -980,56 +980,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { } break; } - int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); - int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); - int destFreq=NOTE_FNUM_BLOCK(c.value2,11); - int newFreq; - bool return2=false; - if (chan[c.chan].portaPause) { - chan[c.chan].baseFreq=chan[c.chan].portaPauseFreq; - } - if (destFreq>chan[c.chan].baseFreq) { - newFreq=chan[c.chan].baseFreq+c.value; - if (newFreq>=destFreq) { - newFreq=destFreq; - return2=true; - } - } else { - newFreq=chan[c.chan].baseFreq-c.value; - if (newFreq<=destFreq) { - newFreq=destFreq; - return2=true; - } - } - // check for octave boundary - // what the heck! - if (!chan[c.chan].portaPause) { - if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { - if (parent->song.fbPortaPause) { - chan[c.chan].portaPauseFreq=(parent->song.oldOctaveBoundary?(newFreq>>1):boundaryBottom)|((newFreq+0x800)&0xf800); - chan[c.chan].portaPause=true; - break; - } else { - newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800); - } - } - if ((newFreq&0x7ff)0) { - if (parent->song.fbPortaPause) { - chan[c.chan].portaPauseFreq=newFreq=(parent->song.oldOctaveBoundary?(newFreq<<1):(boundaryTop-1))|((newFreq-0x800)&0xf800); - chan[c.chan].portaPause=true; - break; - } else { - newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800); - } - } - } - chan[c.chan].portaPause=false; - chan[c.chan].freqChanged=true; - chan[c.chan].baseFreq=newFreq; - if (return2) { - chan[c.chan].inPorta=false; - return 2; - } + PLEASE_HELP_ME(chan[c.chan]); break; } case DIV_CMD_SAMPLE_BANK: diff --git a/src/engine/platform/ym2608ext.cpp b/src/engine/platform/ym2608ext.cpp index f2b1f62d..285e350d 100644 --- a/src/engine/platform/ym2608ext.cpp +++ b/src/engine/platform/ym2608ext.cpp @@ -143,52 +143,7 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) { } break; } - int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); - int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); - int destFreq=NOTE_FNUM_BLOCK(c.value2,11); - int newFreq; - bool return2=false; - if (opChan[ch].portaPause) { - opChan[ch].baseFreq=opChan[ch].portaPauseFreq; - } - if (destFreq>opChan[ch].baseFreq) { - newFreq=opChan[ch].baseFreq+c.value; - if (newFreq>=destFreq) { - newFreq=destFreq; - return2=true; - } - } else { - newFreq=opChan[ch].baseFreq-c.value; - if (newFreq<=destFreq) { - newFreq=destFreq; - return2=true; - } - } - // what the heck! - if (!opChan[ch].portaPause) { - if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { - if (parent->song.fbPortaPause) { - opChan[ch].portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800); - opChan[ch].portaPause=true; - break; - } else { - newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800); - } - } - if ((newFreq&0x7ff)0) { - if (parent->song.fbPortaPause) { - opChan[ch].portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800); - opChan[ch].portaPause=true; - break; - } else { - newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800); - } - } - } - opChan[ch].portaPause=false; - opChan[ch].freqChanged=true; - opChan[ch].baseFreq=newFreq; - if (return2) return 2; + PLEASE_HELP_ME(opChan[ch]); break; } case DIV_CMD_LEGATO: { diff --git a/src/engine/platform/ym2608ext.h b/src/engine/platform/ym2608ext.h index aedbd831..a0966dfe 100644 --- a/src/engine/platform/ym2608ext.h +++ b/src/engine/platform/ym2608ext.h @@ -27,10 +27,12 @@ class DivPlatformYM2608Ext: public DivPlatformYM2608 { unsigned char freqH, freqL; int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins; signed char konCycles; - bool active, insChanged, freqChanged, keyOn, keyOff, portaPause; + bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta; int vol; unsigned char pan; - OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), vol(0), pan(3) {} + // UGLY + OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), + inPorta(false), vol(0), pan(3) {} }; OpChannel opChan[4]; bool isOpMuted[4]; diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 6f0cf32e..89ccc6c0 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -1027,56 +1027,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { } break; } - int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); - int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); - int destFreq=NOTE_FNUM_BLOCK(c.value2,11); - int newFreq; - bool return2=false; - if (chan[c.chan].portaPause) { - chan[c.chan].baseFreq=chan[c.chan].portaPauseFreq; - } - if (destFreq>chan[c.chan].baseFreq) { - newFreq=chan[c.chan].baseFreq+c.value; - if (newFreq>=destFreq) { - newFreq=destFreq; - return2=true; - } - } else { - newFreq=chan[c.chan].baseFreq-c.value; - if (newFreq<=destFreq) { - newFreq=destFreq; - return2=true; - } - } - // check for octave boundary - // what the heck! - if (!chan[c.chan].portaPause) { - if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { - if (parent->song.fbPortaPause) { - chan[c.chan].portaPauseFreq=(parent->song.oldOctaveBoundary?(newFreq>>1):boundaryBottom)|((newFreq+0x800)&0xf800); - chan[c.chan].portaPause=true; - break; - } else { - newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800); - } - } - if ((newFreq&0x7ff)0) { - if (parent->song.fbPortaPause) { - chan[c.chan].portaPauseFreq=newFreq=(parent->song.oldOctaveBoundary?(newFreq<<1):(boundaryTop-1))|((newFreq-0x800)&0xf800); - chan[c.chan].portaPause=true; - break; - } else { - newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800); - } - } - } - chan[c.chan].portaPause=false; - chan[c.chan].freqChanged=true; - chan[c.chan].baseFreq=newFreq; - if (return2) { - chan[c.chan].inPorta=false; - return 2; - } + PLEASE_HELP_ME(chan[c.chan]); break; } case DIV_CMD_SAMPLE_BANK: diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 35b894e4..0e466f6f 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -1005,56 +1005,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { } break; } - int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); - int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); - int destFreq=NOTE_FNUM_BLOCK(c.value2,11); - int newFreq; - bool return2=false; - if (chan[c.chan].portaPause) { - chan[c.chan].baseFreq=chan[c.chan].portaPauseFreq; - } - if (destFreq>chan[c.chan].baseFreq) { - newFreq=chan[c.chan].baseFreq+c.value; - if (newFreq>=destFreq) { - newFreq=destFreq; - return2=true; - } - } else { - newFreq=chan[c.chan].baseFreq-c.value; - if (newFreq<=destFreq) { - newFreq=destFreq; - return2=true; - } - } - // check for octave boundary - // what the heck! - if (!chan[c.chan].portaPause) { - if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { - if (parent->song.fbPortaPause) { - chan[c.chan].portaPauseFreq=(parent->song.oldOctaveBoundary?(newFreq>>1):boundaryBottom)|((newFreq+0x800)&0xf800); - chan[c.chan].portaPause=true; - break; - } else { - newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800); - } - } - if ((newFreq&0x7ff)0) { - if (parent->song.fbPortaPause) { - chan[c.chan].portaPauseFreq=newFreq=(parent->song.oldOctaveBoundary?(newFreq<<1):(boundaryTop-1))|((newFreq-0x800)&0xf800); - chan[c.chan].portaPause=true; - break; - } else { - newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800); - } - } - } - chan[c.chan].portaPause=false; - chan[c.chan].freqChanged=true; - chan[c.chan].baseFreq=newFreq; - if (return2) { - chan[c.chan].inPorta=false; - return 2; - } + PLEASE_HELP_ME(chan[c.chan]); break; } case DIV_CMD_SAMPLE_BANK: diff --git a/src/engine/platform/ym2610bext.cpp b/src/engine/platform/ym2610bext.cpp index ced8a640..20b56c01 100644 --- a/src/engine/platform/ym2610bext.cpp +++ b/src/engine/platform/ym2610bext.cpp @@ -143,52 +143,7 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) { } break; } - int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); - int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); - int destFreq=NOTE_FNUM_BLOCK(c.value2,11); - int newFreq; - bool return2=false; - if (opChan[ch].portaPause) { - opChan[ch].baseFreq=opChan[ch].portaPauseFreq; - } - if (destFreq>opChan[ch].baseFreq) { - newFreq=opChan[ch].baseFreq+c.value; - if (newFreq>=destFreq) { - newFreq=destFreq; - return2=true; - } - } else { - newFreq=opChan[ch].baseFreq-c.value; - if (newFreq<=destFreq) { - newFreq=destFreq; - return2=true; - } - } - // what the heck! - if (!opChan[ch].portaPause) { - if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { - if (parent->song.fbPortaPause) { - opChan[ch].portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800); - opChan[ch].portaPause=true; - break; - } else { - newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800); - } - } - if ((newFreq&0x7ff)0) { - if (parent->song.fbPortaPause) { - opChan[ch].portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800); - opChan[ch].portaPause=true; - break; - } else { - newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800); - } - } - } - opChan[ch].portaPause=false; - opChan[ch].freqChanged=true; - opChan[ch].baseFreq=newFreq; - if (return2) return 2; + PLEASE_HELP_ME(opChan[ch]); break; } case DIV_CMD_LEGATO: { diff --git a/src/engine/platform/ym2610bext.h b/src/engine/platform/ym2610bext.h index 4e3f7c5f..c17fd8d8 100644 --- a/src/engine/platform/ym2610bext.h +++ b/src/engine/platform/ym2610bext.h @@ -27,10 +27,12 @@ class DivPlatformYM2610BExt: public DivPlatformYM2610B { unsigned char freqH, freqL; int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins; signed char konCycles; - bool active, insChanged, freqChanged, keyOn, keyOff, portaPause; + bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta; int vol; unsigned char pan; - OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), vol(0), pan(3) {} + // UGLY + OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), + inPorta(false), vol(0), pan(3) {} }; OpChannel opChan[4]; bool isOpMuted[4]; diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index b12fd3de..a3d5df21 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -143,52 +143,7 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) { } break; } - int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); - int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); - int destFreq=NOTE_FNUM_BLOCK(c.value2,11); - int newFreq; - bool return2=false; - if (opChan[ch].portaPause) { - opChan[ch].baseFreq=opChan[ch].portaPauseFreq; - } - if (destFreq>opChan[ch].baseFreq) { - newFreq=opChan[ch].baseFreq+c.value; - if (newFreq>=destFreq) { - newFreq=destFreq; - return2=true; - } - } else { - newFreq=opChan[ch].baseFreq-c.value; - if (newFreq<=destFreq) { - newFreq=destFreq; - return2=true; - } - } - // what the heck! - if (!opChan[ch].portaPause) { - if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { - if (parent->song.fbPortaPause) { - opChan[ch].portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800); - opChan[ch].portaPause=true; - break; - } else { - newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800); - } - } - if ((newFreq&0x7ff)0) { - if (parent->song.fbPortaPause) { - opChan[ch].portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800); - opChan[ch].portaPause=true; - break; - } else { - newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800); - } - } - } - opChan[ch].portaPause=false; - opChan[ch].freqChanged=true; - opChan[ch].baseFreq=newFreq; - if (return2) return 2; + PLEASE_HELP_ME(opChan[ch]); break; } case DIV_CMD_LEGATO: { diff --git a/src/engine/platform/ym2610ext.h b/src/engine/platform/ym2610ext.h index 287bf08b..492eb5de 100644 --- a/src/engine/platform/ym2610ext.h +++ b/src/engine/platform/ym2610ext.h @@ -27,10 +27,12 @@ class DivPlatformYM2610Ext: public DivPlatformYM2610 { unsigned char freqH, freqL; int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins; signed char konCycles; - bool active, insChanged, freqChanged, keyOn, keyOff, portaPause; + bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta; int vol; unsigned char pan; - OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), vol(0), pan(3) {} + // UGLY + OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), + inPorta(false), vol(0), pan(3) {} }; OpChannel opChan[4]; bool isOpMuted[4];