From 58f789b9eb4a1c191db77001d1abbeb4bffd2e84 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 15 Jan 2023 23:34:01 -0500 Subject: [PATCH 01/31] YM2612: fix forceIns DAC clicking --- src/engine/platform/fmsharedbase.h | 11 +++++---- src/engine/platform/genesis.cpp | 38 ++++++++++++++++++------------ 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/engine/platform/fmsharedbase.h b/src/engine/platform/fmsharedbase.h index 0c09b64a..9da1c69f 100644 --- a/src/engine/platform/fmsharedbase.h +++ b/src/engine/platform/fmsharedbase.h @@ -83,6 +83,7 @@ class DivPlatformFMBase: public DivDispatch { unsigned char lastBusy; int delay; + bool flushFirst; unsigned char regPool[512]; short oldWrites[512]; @@ -103,7 +104,7 @@ class DivPlatformFMBase: public DivDispatch { } inline void urgentWrite(unsigned short a, unsigned char v) { if (!skipRegisterWrites) { - if (writes.empty()) { + if (writes.empty() || flushFirst) { writes.push_back(QueuedWrite(a,v)); } else if (writes.size()>16 || writes.front().addrOrVal) { writes.push_back(QueuedWrite(a,v)); @@ -118,9 +119,11 @@ class DivPlatformFMBase: public DivDispatch { friend void putDispatchChan(void*,int,int); - DivPlatformFMBase():DivDispatch(), - lastBusy(0), - delay(0) {} + DivPlatformFMBase(): + DivDispatch(), + lastBusy(0), + delay(0), + flushFirst(false) {} }; #endif diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 5131afd9..8621a123 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -141,23 +141,26 @@ void DivPlatformGenesis::acquire_nuked(short** buf, size_t len) { os[0]=0; os[1]=0; for (int i=0; i<6; i++) { - if (!writes.empty() && --delay<0) { - delay=0; - QueuedWrite& w=writes.front(); - if (w.addrOrVal) { - OPN2_Write(&fm,0x1+((w.addr>>8)<<1),w.val); - //printf("write: %x = %.2x\n",w.addr,w.val); - lastBusy=0; - regPool[w.addr&0x1ff]=w.val; - writes.pop_front(); - } else { - lastBusy++; - if (fm.write_busy==0) { - //printf("busycounter: %d\n",lastBusy); - OPN2_Write(&fm,0x0+((w.addr>>8)<<1),w.addr); - w.addrOrVal=true; + if (!writes.empty()) { + if (--delay<0) { + delay=0; + QueuedWrite& w=writes.front(); + if (w.addrOrVal) { + //logV("%.3x = %.2x",w.addr,w.val); + OPN2_Write(&fm,0x1+((w.addr>>8)<<1),w.val); + lastBusy=0; + regPool[w.addr&0x1ff]=w.val; + writes.pop_front(); + } else { + lastBusy++; + if (fm.write_busy==0) { + OPN2_Write(&fm,0x0+((w.addr>>8)<<1),w.addr); + w.addrOrVal=true; + } } } + } else { + flushFirst=false; } OPN2_Clock(&fm,o); os[0]+=o[0]; os[1]+=o[1]; @@ -207,6 +210,8 @@ void DivPlatformGenesis::acquire_ymfm(short** buf, size_t len) { regPool[w.addr&0x1ff]=w.val; writes.pop_front(); lastBusy=1; + } else { + flushFirst=false; } if (ladder) { @@ -1127,6 +1132,7 @@ void DivPlatformGenesis::forceIns() { rWrite(0x2b,0x80); } immWrite(0x22,lfoValue); + flushFirst=true; } void DivPlatformGenesis::toggleRegisterDump(bool enable) { @@ -1180,6 +1186,7 @@ void DivPlatformGenesis::reset() { lfoValue=8; softPCMTimer=0; extMode=false; + flushFirst=false; if (softPCM) { chan[5].dacMode=true; @@ -1282,6 +1289,7 @@ int DivPlatformGenesis::init(DivEngine* p, int channels, int sugRate, const DivC dumpWrites=false; ladder=false; skipRegisterWrites=false; + flushFirst=false; for (int i=0; i<10; i++) { isMuted[i]=false; oscBuf[i]=new DivDispatchOscBuffer; From 2c528c9ca834ab2b0d7cd143acadb266a93a08db Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 16 Jan 2023 16:10:34 -0500 Subject: [PATCH 02/31] OPN: add LFO speed macro issue #927 --- papers/doc/3-pattern/effects.md | 4 ++-- src/engine/platform/genesis.cpp | 4 ++++ src/engine/platform/ym2608.cpp | 4 ++++ src/engine/platform/ym2610.cpp | 4 ++++ src/engine/platform/ym2610b.cpp | 4 ++++ src/gui/insEdit.cpp | 3 +++ 6 files changed, 21 insertions(+), 2 deletions(-) diff --git a/papers/doc/3-pattern/effects.md b/papers/doc/3-pattern/effects.md index 9965d22c..0aa1fc03 100644 --- a/papers/doc/3-pattern/effects.md +++ b/papers/doc/3-pattern/effects.md @@ -135,7 +135,7 @@ ex | FM | OPM | OPZ | OPLL | AY-3-8910 | AY8930 | Lynx W | | LFO Shape | LFO Shape | Patch | Waveform | Waveform | | Waveform | Waveform | Waveform | Waveform | Waveform | Waveform | | | | Waveform | | 1 | | AMD | AMD | | | Duty | | FilterMode | Envelope | EnvMode | WaveLen | Mod Depth | Cutoff | Filter K1 | ClockDiv | EchoFeedback | Special | GroupAtk | 2 | | PMD | PMD | | Envelope | Envelope | | Resonance | | Envelope | WaveUpdate | Mod Speed | Resonance | Filter K2 | | Echo Length | Gain | GroupDec | - 3 | | LFO Speed | LFO Speed | | AutoEnvNum | AutoEnvNum | | Special | | AutoEnvNum | WaveLoad W | | Control | Env Count | | | | Noise | + 3 | LFOSpd | LFO Speed | LFO Speed | | AutoEnvNum | AutoEnvNum | | Special | | AutoEnvNum | WaveLoad W | | Control | Env Count | | | | Noise | A | ALG | ALG | ALG | | AutoEnvDen | AutoEnvDen | | | | AutoEnvDen | WaveLoad P | | | Control | | | | | B | FB | FB | FB | | | Noise AND | | | | | WaveLoad L | | | | | | | | C | FMS | FMS | FMS | | | Noise OR | | | | | WaveLoad T | | | | | | | | @@ -144,4 +144,4 @@ ex | FM | OPM | OPZ | OPLL | AY-3-8910 | AY8930 | Lynx 5 | | | AMD2 | | | | | | | | | | | EnvRampR | | | | | 6 | | | PMD2 | | | | | | | | | | | EnvRampK1 | | | | | 7 | | | LFO2Speed | | | | | | | | | | | EnvRampK2 | | | | | - 8 | | | LFO2Shape | | | | | | | | | | | Env Mode | | | | | \ No newline at end of file + 8 | | | LFO2Shape | | | | | | | | | | | Env Mode | | | | | diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 8621a123..a04a6f00 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -394,6 +394,10 @@ void DivPlatformGenesis::tick(bool sysTick) { chan[i].state.ams=chan[i].std.ams.val; rWrite(chanOffs[i]+ADDR_LRAF,(IS_REALLY_MUTED(i)?0:(chan[i].pan<<6))|(chan[i].state.fms&7)|((chan[i].state.ams&3)<<4)); } + if (chan[i].std.ex3.had) { + lfoValue=(chan[i].std.ex3.val>7)?0:(8|(chan[i].std.ex3.val&7)); + rWrite(0x22,lfoValue); + } if (chan[i].std.ex4.had && chan[i].active) { chan[i].opMask=chan[i].std.ex4.val&15; chan[i].opMaskChanged=true; diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 16953746..15200232 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -545,6 +545,10 @@ void DivPlatformYM2608::tick(bool sysTick) { chan[i].state.ams=chan[i].std.ams.val; rWrite(chanOffs[i]+ADDR_LRAF,(isMuted[i]?0:(chan[i].pan<<6))|(chan[i].state.fms&7)|((chan[i].state.ams&3)<<4)); } + if (chan[i].std.ex3.had) { + lfoValue=(chan[i].std.ex3.val>7)?0:(8|(chan[i].std.ex3.val&7)); + rWrite(0x22,lfoValue); + } if (chan[i].std.ex4.had && chan[i].active) { chan[i].opMask=chan[i].std.ex4.val&15; chan[i].opMaskChanged=true; diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index bec65c78..48fa4ca0 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -478,6 +478,10 @@ void DivPlatformYM2610::tick(bool sysTick) { chan[i].state.ams=chan[i].std.ams.val; rWrite(chanOffs[i]+ADDR_LRAF,(isMuted[i]?0:(chan[i].pan<<6))|(chan[i].state.fms&7)|((chan[i].state.ams&3)<<4)); } + if (chan[i].std.ex3.had) { + lfoValue=(chan[i].std.ex3.val>7)?0:(8|(chan[i].std.ex3.val&7)); + rWrite(0x22,lfoValue); + } if (chan[i].std.ex4.had && chan[i].active) { chan[i].opMask=chan[i].std.ex4.val&15; chan[i].opMaskChanged=true; diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 4a58878e..875383e7 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -545,6 +545,10 @@ void DivPlatformYM2610B::tick(bool sysTick) { chan[i].state.ams=chan[i].std.ams.val; rWrite(chanOffs[i]+ADDR_LRAF,(isMuted[i]?0:(chan[i].pan<<6))|(chan[i].state.fms&7)|((chan[i].state.ams&3)<<4)); } + if (chan[i].std.ex3.had) { + lfoValue=(chan[i].std.ex3.val>7)?0:(8|(chan[i].std.ex3.val&7)); + rWrite(0x22,lfoValue); + } if (chan[i].std.ex4.had && chan[i].active) { chan[i].opMask=chan[i].std.ex4.val&15; chan[i].opMaskChanged=true; diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 7ac35345..76424e84 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -3796,6 +3796,9 @@ void FurnaceGUI::drawInsEdit() { } } + if (ins->type==DIV_INS_FM) { + macroList.push_back(FurnaceGUIMacroDesc("LFO Speed",&ins->std.ex3Macro,0,8,96,uiColors[GUI_COLOR_MACRO_OTHER])); + } if (ins->type==DIV_INS_OPZ || ins->type==DIV_INS_OPM) { macroList.push_back(FurnaceGUIMacroDesc("AM Depth",&ins->std.ex1Macro,0,127,128,uiColors[GUI_COLOR_MACRO_OTHER])); macroList.push_back(FurnaceGUIMacroDesc("PM Depth",&ins->std.ex2Macro,0,127,128,uiColors[GUI_COLOR_MACRO_OTHER])); From bf49b43e7b3965f2bccb96e013c3538feada957e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 16 Jan 2023 16:20:10 -0500 Subject: [PATCH 03/31] YM2612: fix another pop --- src/engine/platform/genesis.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index a04a6f00..25986df5 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -1126,14 +1126,17 @@ void DivPlatformGenesis::forceIns() { rWrite(chanOffs[i]+ADDR_FB_ALG,(chan[i].state.alg&7)|(chan[i].state.fb<<3)); rWrite(chanOffs[i]+ADDR_LRAF,(IS_REALLY_MUTED(i)?0:(chan[i].pan<<6))|(chan[i].state.fms&7)|((chan[i].state.ams&3)<<4)); if (chan[i].active) { - chan[i].keyOn=true; - chan[i].freqChanged=true; + if (i<5 || !chan[i].dacMode) { + chan[i].keyOn=true; + chan[i].freqChanged=true; + } } } + rWrite(0x2b,0x00); + rWrite(0x2a,0x00); if (chan[5].dacMode) { chan[5].dacSample=-1; chan[6].dacSample=-1; - rWrite(0x2b,0x80); } immWrite(0x22,lfoValue); flushFirst=true; From 13b782c7b18276e5d06beab3deffbed99bc480db Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 16 Jan 2023 18:41:56 -0500 Subject: [PATCH 04/31] YM2612: yet another fix --- src/engine/platform/fmsharedbase.h | 4 ++-- src/engine/platform/genesis.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/engine/platform/fmsharedbase.h b/src/engine/platform/fmsharedbase.h index 9da1c69f..f64c723a 100644 --- a/src/engine/platform/fmsharedbase.h +++ b/src/engine/platform/fmsharedbase.h @@ -103,8 +103,8 @@ class DivPlatformFMBase: public DivDispatch { } } inline void urgentWrite(unsigned short a, unsigned char v) { - if (!skipRegisterWrites) { - if (writes.empty() || flushFirst) { + if (!skipRegisterWrites && !flushFirst) { + if (writes.empty()) { writes.push_back(QueuedWrite(a,v)); } else if (writes.size()>16 || writes.front().addrOrVal) { writes.push_back(QueuedWrite(a,v)); diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 25986df5..3d46c0e9 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -34,7 +34,7 @@ void DivYM2612Interface::ymfm_set_timer(uint32_t tnum, int32_t duration_in_clock } else if (tnum==0) { countA=duration_in_clocks; } - logV("ymfm_set_timer(%d,%d)",tnum,duration_in_clocks); + //logV("ymfm_set_timer(%d,%d)",tnum,duration_in_clocks); } void DivYM2612Interface::clock() { @@ -1132,8 +1132,8 @@ void DivPlatformGenesis::forceIns() { } } } - rWrite(0x2b,0x00); - rWrite(0x2a,0x00); + immWrite(0x2b,0x00); + //rWrite(0x2a,0x00); if (chan[5].dacMode) { chan[5].dacSample=-1; chan[6].dacSample=-1; From 39349d2fdee3c3babe4a3c936b957a35e3f4c704 Mon Sep 17 00:00:00 2001 From: brickblock369 <59150779+brickblock369@users.noreply.github.com> Date: Mon, 16 Jan 2023 18:51:35 -0800 Subject: [PATCH 05/31] Another update to my OPL3 slap bass (#933) * Adding another OPL instrument * Adding another OPL instrument Updated the SL from 6 to 5. * Updated the OP1's ML macro to improve the slap --- instruments/OPL/2-OP OPL3 Slap Bass.fui | Bin 101 -> 101 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/instruments/OPL/2-OP OPL3 Slap Bass.fui b/instruments/OPL/2-OP OPL3 Slap Bass.fui index fb8f1c1439f61f6e8eb153f9cc640886b50bcda1..04e8aadfdcb64628f5199cf26d99785253301ee3 100644 GIT binary patch delta 18 ZcmYdIoe;sx$}hz9|33pG10xILe*iF)1nd9+ delta 18 ZcmYdIoe;sx$uGq8|33pG10xILe*iGZ1n>X= From 0d5c7da774ce5a9c6c2c62125a952e3da7e677b0 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 16 Jan 2023 22:38:46 -0500 Subject: [PATCH 06/31] MSVC DEBUG! MSVC DEBUG! MSVC DEBUG! DO NOT USE! I AM DEBUGGING A CRASH! ONLY FOR TESTER --- .github/workflows/build.yml | 14 +++++++------- extern/nfd-modified/src/nfd_win.cpp | 29 +++++++++++++++++++++-------- src/audio/rtmidi.cpp | 2 +- src/gui/doAction.cpp | 2 +- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9c4b11c4..b27ee2d8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,20 +11,20 @@ defaults: shell: bash env: - BUILD_TYPE: Release + BUILD_TYPE: Debug jobs: build: strategy: matrix: config: - - { name: 'Windows MSVC x86', os: windows-latest, compiler: msvc, arch: x86 } + #- { name: 'Windows MSVC x86', os: windows-latest, compiler: msvc, arch: x86 } - { name: 'Windows MSVC x86_64', os: windows-latest, compiler: msvc, arch: x86_64 } - - { name: 'Windows MinGW x86', os: ubuntu-20.04, compiler: mingw, arch: x86 } - - { name: 'Windows MinGW x86_64', os: ubuntu-20.04, compiler: mingw, arch: x86_64 } - - { name: 'macOS x86_64', os: macos-latest, arch: x86_64 } - - { name: 'macOS ARM', os: macos-latest, arch: arm64 } - - { name: 'Linux x86_64', os: ubuntu-18.04, arch: x86_64 } + #- { name: 'Windows MinGW x86', os: ubuntu-20.04, compiler: mingw, arch: x86 } + #- { name: 'Windows MinGW x86_64', os: ubuntu-20.04, compiler: mingw, arch: x86_64 } + #- { name: 'macOS x86_64', os: macos-latest, arch: x86_64 } + #- { name: 'macOS ARM', os: macos-latest, arch: arm64 } + #- { name: 'Linux x86_64', os: ubuntu-18.04, arch: x86_64 } #- { name: 'Linux ARM', os: ubuntu-18.04, arch: armhf } fail-fast: false diff --git a/extern/nfd-modified/src/nfd_win.cpp b/extern/nfd-modified/src/nfd_win.cpp index b4fa5a5f..e4342243 100644 --- a/extern/nfd-modified/src/nfd_win.cpp +++ b/extern/nfd-modified/src/nfd_win.cpp @@ -30,6 +30,9 @@ // hack I know #include "../../../src/utfutils.h" +// hack 2... +#include "../../../src/ta-log.h" + class NFDWinEvents: public IFileDialogEvents { nfdselcallback_t selCallback; size_t refCount; @@ -38,21 +41,21 @@ class NFDWinEvents: public IFileDialogEvents { } public: IFACEMETHODIMP QueryInterface(REFIID riid, void** ppv) { - printf("QueryInterface called DAMN IT\n"); + logV("%p: QueryInterface called DAMN IT",(const void*)this); *ppv=NULL; return E_NOTIMPL; } IFACEMETHODIMP_(ULONG) AddRef() { - printf("AddRef() called\n"); + logV("%p: AddRef() called",(const void*)this); return InterlockedIncrement(&refCount); } IFACEMETHODIMP_(ULONG) Release() { - printf("Release() called\n"); + logV("%p: Release() called",(const void*)this); LONG ret=InterlockedDecrement(&refCount); if (ret==0) { - printf("Destroying the final object.\n"); + logV("%p: Destroying the final object.",(const void*)this); delete this; } return ret; @@ -67,30 +70,40 @@ class NFDWinEvents: public IFileDialogEvents { IFACEMETHODIMP OnSelectionChange(IFileDialog* dialog) { // Get the file name + logV("%p: OnSelectionChange() called",(const void*)this); ::IShellItem *shellItem(NULL); + logV("%p: GetCurrentSelection",(const void*)this); HRESULT result = dialog->GetCurrentSelection(&shellItem); if ( !SUCCEEDED(result) ) { - printf("failure!\n"); + logV("%p: failure!",(const void*)this); return S_OK; } wchar_t *filePath(NULL); result = shellItem->GetDisplayName(::SIGDN_FILESYSPATH, &filePath); if ( !SUCCEEDED(result) ) { - printf("GDN failure!\n"); + logV("%p: GDN failure!",(const void*)this); shellItem->Release(); return S_OK; } std::string utf8FilePath=utf16To8(filePath); - if (selCallback!=NULL) selCallback(utf8FilePath.c_str()); - printf("I got you for a value of %s\n",utf8FilePath.c_str()); + if (selCallback!=NULL) { + logV("%p: calling back.",(const void*)this); + selCallback(utf8FilePath.c_str()); + logV("%p: end of callback",(const void*)this); + } else { + logV("%p: no callback.",(const void*)this); + } + logV("%p: I got you for a value of %s",(const void*)this,utf8FilePath.c_str()); shellItem->Release(); + logV("%p: shellItem->Release()",(const void*)this); return S_OK; } NFDWinEvents(nfdselcallback_t callback): selCallback(callback), refCount(1) { + logV("%p: CONSTRUCT!",(const void*)this); } }; diff --git a/src/audio/rtmidi.cpp b/src/audio/rtmidi.cpp index 258f6929..568ea061 100644 --- a/src/audio/rtmidi.cpp +++ b/src/audio/rtmidi.cpp @@ -58,7 +58,7 @@ bool TAMidiInRtMidi::gather() { if (m.type!=TA_MIDI_SYSEX && msg.size()>1) { memcpy(m.data,msg.data()+1,MIN(msg.size()-1,7)); } else if (m.type==TA_MIDI_SYSEX) { - m.sysExData.reset(new unsigned char[msg.size()]); + m.sysExData=std::shared_ptr(new unsigned char[msg.size()],std::default_delete()); m.sysExLen=msg.size(); logD("got a SysEx of length %ld!",msg.size()); memcpy(m.sysExData.get(),msg.data(),msg.size()); diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 288a5504..2b3a2749 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -163,7 +163,7 @@ void FurnaceGUI::doAction(int what) { case GUI_ACTION_TX81Z_REQUEST: { TAMidiMessage msg; msg.type=TA_MIDI_SYSEX; - msg.sysExData.reset(new unsigned char[15]); + msg.sysExData.reset(new unsigned char[15],std::default_delete()); msg.sysExLen=15; memcpy(msg.sysExData.get(),avRequest,15); if (!e->sendMidiMessage(msg)) { From 0383b0c50fc85a0b2a852f65faa50e49ddb7c304 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 16 Jan 2023 23:59:34 -0500 Subject: [PATCH 07/31] YM2612: fix one more click... --- src/engine/platform/genesis.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 3d46c0e9..c6e6a4de 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -463,6 +463,10 @@ void DivPlatformGenesis::tick(bool sysTick) { for (int i=0; i<512; i++) { if (pendingWrites[i]!=oldWrites[i]) { + if (i==0x2b && pendingWrites[i]!=0 && !parent->song.brokenDACMode) { + if (chan[5].keyOn) chan[5].keyOn=false; + chan[5].keyOff=true; + } immWrite(i,pendingWrites[i]&0xff); oldWrites[i]=pendingWrites[i]; } From 1d446bd56b4e2bd77202e564bdac5fafd0364fd8 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 17 Jan 2023 01:11:08 -0500 Subject: [PATCH 08/31] dev137 - new mixing volumes YM2612 is now twice as loud SN76489 and OPLL are 1.5x loud X1-010 is four times louder --- papers/format.md | 1 + src/engine/engine.h | 4 ++-- src/engine/fileOps.cpp | 26 ++++++++++++++++++++++++++ src/engine/platform/genesis.cpp | 4 ++++ src/engine/platform/genesis.h | 1 + src/engine/platform/opll.cpp | 4 ++++ src/engine/platform/opll.h | 1 + src/engine/platform/sms.cpp | 4 ++++ src/engine/platform/sms.h | 1 + src/engine/platform/x1_010.cpp | 4 ++++ src/engine/platform/x1_010.h | 1 + src/engine/vgmOps.cpp | 16 ++++++++-------- 12 files changed, 57 insertions(+), 10 deletions(-) diff --git a/papers/format.md b/papers/format.md index 6522760e..5aef984e 100644 --- a/papers/format.md +++ b/papers/format.md @@ -32,6 +32,7 @@ these fields are 0 in format versions prior to 100 (0.6pre1). the format versions are: +- 137: Furnace dev137 - 136: Furnace dev136 - 135: Furnace dev135 - 134: Furnace dev134 diff --git a/src/engine/engine.h b/src/engine/engine.h index ffa97d75..88e6e676 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -47,8 +47,8 @@ #define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock(); #define BUSY_END isBusy.unlock(); softLocked=false; -#define DIV_VERSION "dev136" -#define DIV_ENGINE_VERSION 136 +#define DIV_VERSION "dev137" +#define DIV_ENGINE_VERSION 137 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index ffe04cfd..2365da59 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -2574,6 +2574,32 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { } } + // new YM2612/SN/X1-010 volumes + if (ds.version<137) { + for (int i=0; ichipClock; - CHIP_VOL(0,2.0); + CHIP_VOL(0,4.0); willExport[i]=true; switch (song.systemFlags[i].getInt("chipType",0)) { case 1: // real SN @@ -1065,7 +1065,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p } else if (!(hasSN&0x40000000)) { isSecond[i]=true; willExport[i]=true; - CHIP_VOL_SECOND(0,2.0); + CHIP_VOL_SECOND(0,4.0); hasSN|=0x40000000; howManyChips++; } @@ -1130,12 +1130,12 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p case DIV_SYSTEM_X1_010: if (!hasX1) { hasX1=disCont[i].dispatch->chipClock; - CHIP_VOL(38,0.5); + CHIP_VOL(38,2.0); willExport[i]=true; writeX1010[0]=disCont[i].dispatch; } else if (!(hasX1&0x40000000)) { isSecond[i]=true; - CHIP_VOL_SECOND(38,0.5); + CHIP_VOL_SECOND(38,2.0); willExport[i]=true; writeX1010[1]=disCont[i].dispatch; hasX1|=0x40000000; @@ -1232,12 +1232,12 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p case DIV_SYSTEM_YM2612_DUALPCM_EXT: if (!hasOPN2) { hasOPN2=disCont[i].dispatch->chipClock; - CHIP_VOL(2,0.8); + CHIP_VOL(2,1.6); willExport[i]=true; writeDACSamples=true; } else if (!(hasOPN2&0x40000000)) { isSecond[i]=true; - CHIP_VOL_SECOND(2,0.8); + CHIP_VOL_SECOND(2,1.6); willExport[i]=true; hasOPN2|=0x40000000; howManyChips++; @@ -1296,11 +1296,11 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p case DIV_SYSTEM_VRC7: if (!hasOPLL) { hasOPLL=disCont[i].dispatch->chipClock; - CHIP_VOL(1,1.6); + CHIP_VOL(1,3.2); willExport[i]=true; } else if (!(hasOPLL&0x40000000)) { isSecond[i]=true; - CHIP_VOL_SECOND(1,1.6); + CHIP_VOL_SECOND(1,3.2); willExport[i]=true; hasOPLL|=0x40000000; howManyChips++; From f7b30771d89778b58c5ff7d678efb1c810b5091d Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 17 Jan 2023 01:11:44 -0500 Subject: [PATCH 09/31] CI: re-enable the rest of platforms --- .github/workflows/build.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b27ee2d8..11940eda 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,13 +18,13 @@ jobs: strategy: matrix: config: - #- { name: 'Windows MSVC x86', os: windows-latest, compiler: msvc, arch: x86 } + - { name: 'Windows MSVC x86', os: windows-latest, compiler: msvc, arch: x86 } - { name: 'Windows MSVC x86_64', os: windows-latest, compiler: msvc, arch: x86_64 } - #- { name: 'Windows MinGW x86', os: ubuntu-20.04, compiler: mingw, arch: x86 } - #- { name: 'Windows MinGW x86_64', os: ubuntu-20.04, compiler: mingw, arch: x86_64 } - #- { name: 'macOS x86_64', os: macos-latest, arch: x86_64 } - #- { name: 'macOS ARM', os: macos-latest, arch: arm64 } - #- { name: 'Linux x86_64', os: ubuntu-18.04, arch: x86_64 } + - { name: 'Windows MinGW x86', os: ubuntu-20.04, compiler: mingw, arch: x86 } + - { name: 'Windows MinGW x86_64', os: ubuntu-20.04, compiler: mingw, arch: x86_64 } + - { name: 'macOS x86_64', os: macos-latest, arch: x86_64 } + - { name: 'macOS ARM', os: macos-latest, arch: arm64 } + - { name: 'Linux x86_64', os: ubuntu-18.04, arch: x86_64 } #- { name: 'Linux ARM', os: ubuntu-18.04, arch: armhf } fail-fast: false From 539b2ec2db3d5dee5cf77fcaad5f6e81362ca185 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 17 Jan 2023 01:58:59 -0500 Subject: [PATCH 10/31] dev138 - fix broken porta after legato --- papers/format.md | 4 ++++ src/engine/engine.h | 4 ++-- src/engine/fileOps.cpp | 16 ++++++++++++++++ src/engine/playback.cpp | 2 +- src/engine/song.h | 4 +++- src/gui/compatFlags.cpp | 4 ++++ 6 files changed, 30 insertions(+), 4 deletions(-) diff --git a/papers/format.md b/papers/format.md index 5aef984e..389b6e61 100644 --- a/papers/format.md +++ b/papers/format.md @@ -32,6 +32,7 @@ these fields are 0 in format versions prior to 100 (0.6pre1). the format versions are: +- 138: Furnace dev138 - 137: Furnace dev137 - 136: Furnace dev136 - 135: Furnace dev135 @@ -399,6 +400,9 @@ size | description 4?? | patchbay | - see next section for more details. 1 | automatic patchbay (>=136) + --- | **a couple more compat flags** (>=138) + 1 | broken portamento during legato + 7 | reserved ``` # patchbay diff --git a/src/engine/engine.h b/src/engine/engine.h index 88e6e676..75b0ad94 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -47,8 +47,8 @@ #define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock(); #define BUSY_END isBusy.unlock(); softLocked=false; -#define DIV_VERSION "dev137" -#define DIV_ENGINE_VERSION 137 +#define DIV_VERSION "dev138" +#define DIV_ENGINE_VERSION 138 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index 2365da59..c049545a 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -1716,6 +1716,9 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { if (ds.version<130) { ds.oldArpStrategy=true; } + if (ds.version<138) { + ds.brokenPortaLegato=true; + } ds.isDMF=false; reader.readS(); // reserved @@ -2221,6 +2224,13 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { if (ds.version>=136) song.patchbayAuto=reader.readC(); + if (ds.version>=138) { + ds.brokenPortaArp=reader.readC(); + for (int i=0; i<7; i++) { + reader.readC(); + } + } + // read system flags if (ds.version>=119) { logD("reading chip flags..."); @@ -4515,6 +4525,12 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) { } w->writeC(song.patchbayAuto); + // even more compat flags + w->writeC(song.brokenPortaLegato); + for (int i=0; i<7; i++) { + w->writeC(0); + } + blockEndSeek=w->tell(); w->seek(blockStartSeek,SEEK_SET); w->writeI(blockEndSeek-blockStartSeek-4); diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 33f2d66c..88a115a3 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -896,7 +896,7 @@ void DivEngine::processRow(int i, bool afterDelay) { chan[i].vibratoPos=0; } dispatchCmd(DivCommand(DIV_CMD_PITCH,i,chan[i].pitch+(((chan[i].vibratoDepth*vibTable[chan[i].vibratoPos]*chan[i].vibratoFine)>>4)/15))); - if (chan[i].legato) { + if (chan[i].legato && (!chan[i].inPorta || song.brokenPortaLegato)) { dispatchCmd(DivCommand(DIV_CMD_LEGATO,i,chan[i].note)); dispatchCmd(DivCommand(DIV_CMD_HINT_LEGATO,i,chan[i].note)); } else { diff --git a/src/engine/song.h b/src/engine/song.h index dfe579bb..61083c18 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -330,6 +330,7 @@ struct DivSong { bool autoSystem; bool oldArpStrategy; bool patchbayAuto; + bool brokenPortaLegato; std::vector ins; std::vector wave; @@ -439,7 +440,8 @@ struct DivSong { disableSampleMacro(false), autoSystem(true), oldArpStrategy(false), - patchbayAuto(true) { + patchbayAuto(true), + brokenPortaLegato(false) { for (int i=0; isong.brokenPortaLegato); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("behavior changed in 0.6pre4"); + } } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_COMPAT_FLAGS; ImGui::End(); From 2cfed1336a4b221c6a953d2a2bcb00bc4772cc8f Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 17 Jan 2023 02:00:04 -0500 Subject: [PATCH 11/31] whoops!!!!!!!! --- src/engine/fileOps.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index c049545a..9ba9dd9b 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -2225,7 +2225,7 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { if (ds.version>=136) song.patchbayAuto=reader.readC(); if (ds.version>=138) { - ds.brokenPortaArp=reader.readC(); + ds.brokenPortaLegato=reader.readC(); for (int i=0; i<7; i++) { reader.readC(); } From c60aceec8b47d7f0b88f9b9e601846487524247f Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 17 Jan 2023 02:07:29 -0500 Subject: [PATCH 12/31] GUI: add single-digit effects for 00-0F setting --- src/gui/gui.h | 2 ++ src/gui/pattern.cpp | 6 +++++- src/gui/settings.cpp | 8 ++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/gui/gui.h b/src/gui/gui.h index 48488eac..57f4b303 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1295,6 +1295,7 @@ class FurnaceGUI { double exportFadeOut; int macroLayout; float doubleClickTime; + int oneDigitEffects; unsigned int maxUndoSteps; String mainFontPath; String patFontPath; @@ -1430,6 +1431,7 @@ class FurnaceGUI { exportFadeOut(0.0), macroLayout(0), doubleClickTime(0.3f), + oneDigitEffects(0), maxUndoSteps(100), mainFontPath(""), patFontPath(""), diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index fbaf4e65..8ce95852 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -287,10 +287,14 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int if (pat->data[i][index]>0xff) { snprintf(id,63,"??##PE%d_%d_%d",k,i,j); ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_INVALID]); - } else { + } else if (pat->data[i][index]>0x10 || settings.oneDigitEffects==0) { const unsigned char data=pat->data[i][index]; snprintf(id,63,"%.2X##PE%d_%d_%d",data,k,i,j); ImGui::PushStyleColor(ImGuiCol_Text,uiColors[fxColors[data]]); + } else { + const unsigned char data=pat->data[i][index]; + snprintf(id,63," %.1X##PE%d_%d_%d",data,k,i,j); + ImGui::PushStyleColor(ImGuiCol_Text,uiColors[fxColors[data]]); } } ImGui::SameLine(0.0f,0.0f); diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index bcb90d35..7e4d809b 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -1602,6 +1602,11 @@ void FurnaceGUI::drawSettings() { settings.germanNotation=germanNotationB; } + bool oneDigitEffectsB=settings.oneDigitEffects; + if (ImGui::Checkbox("Single-digit effects for 00-0F",&oneDigitEffectsB)) { + settings.oneDigitEffects=oneDigitEffectsB; + } + bool centerPatternB=settings.centerPattern; if (ImGui::Checkbox("Center pattern view",¢erPatternB)) { settings.centerPattern=centerPatternB; @@ -2565,6 +2570,7 @@ void FurnaceGUI::syncSettings() { settings.exportFadeOut=e->getConfDouble("exportFadeOut",0.0); settings.macroLayout=e->getConfInt("macroLayout",0); settings.doubleClickTime=e->getConfFloat("doubleClickTime",0.3f); + settings.oneDigitEffects=e->getConfInt("oneDigitEffects",0); clampSetting(settings.mainFontSize,2,96); clampSetting(settings.patFontSize,2,96); @@ -2676,6 +2682,7 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.persistFadeOut,0,1); clampSetting(settings.macroLayout,0,4); clampSetting(settings.doubleClickTime,0.02,1.0); + clampSetting(settings.oneDigitEffects,0,1); if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; @@ -2880,6 +2887,7 @@ void FurnaceGUI::commitSettings() { e->setConf("exportFadeOut",settings.exportFadeOut); e->setConf("macroLayout",settings.macroLayout); e->setConf("doubleClickTime",settings.doubleClickTime); + e->setConf("oneDigitEffects",settings.oneDigitEffects); // colors for (int i=0; i Date: Tue, 17 Jan 2023 13:37:51 -0500 Subject: [PATCH 13/31] GUI: it's not like FamiTracker --- src/gui/compatFlags.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/compatFlags.cpp b/src/gui/compatFlags.cpp index 97913cf3..7a9fd962 100644 --- a/src/gui/compatFlags.cpp +++ b/src/gui/compatFlags.cpp @@ -214,7 +214,7 @@ void FurnaceGUI::drawCompatFlags() { e->song.delayBehavior=2; } if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("no checks (like FamiTracker)"); + ImGui::SetTooltip("no checks"); } ImGui::Text("Simultaneous jump (0B+0D) treatment:"); From 5cdd04eca854a6dffa57a38f350acde2f981c6d7 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 17 Jan 2023 17:57:42 -0500 Subject: [PATCH 14/31] GUI: catch display connect/dis events --- src/gui/gui.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index c22a1c2b..8d57083d 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3132,6 +3132,14 @@ bool FurnaceGUI::loop() { break; case SDL_DISPLAYEVENT: { switch (ev.display.event) { + case SDL_DISPLAYEVENT_CONNECTED: + logD("display %d connected!",ev.display.display); + updateWindow=true; + break; + case SDL_DISPLAYEVENT_DISCONNECTED: + logD("display %d disconnected!",ev.display.display); + updateWindow=true; + break; case SDL_DISPLAYEVENT_ORIENTATION: logD("display oriented to %d",ev.display.data1); updateWindow=true; From e24963c5ea841f6663079e5743ee3b14ad5806c3 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 17 Jan 2023 18:12:58 -0500 Subject: [PATCH 15/31] new demo song by Clingojam --- demos/snes/amalgam.fur | Bin 0 -> 71333 bytes src/gui/about.cpp | 1 + src/gui/editControls.cpp | 4 +++- 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 demos/snes/amalgam.fur diff --git a/demos/snes/amalgam.fur b/demos/snes/amalgam.fur new file mode 100644 index 0000000000000000000000000000000000000000..c1287c1721cca1e9275170d8b99a2f6b0edf5687 GIT binary patch literal 71333 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

Z5wUABBmAn+zAXlKd95KqC;}AUiJ{ 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 Date: Tue, 17 Jan 2023 18:20:18 -0500 Subject: [PATCH 16/31] update --- demos/snes/amalgam.fur | Bin 71333 -> 71335 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/demos/snes/amalgam.fur b/demos/snes/amalgam.fur index c1287c1721cca1e9275170d8b99a2f6b0edf5687..6359b14556fc86963b18efc4db69aa9e2aa6c4a2 100644 GIT binary patch delta 5977 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 Hk*tzwApM%g delta 5975 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 Date: Wed, 18 Jan 2023 01:17:50 -0500 Subject: [PATCH 17/31] TIA: whaaaaaaaaaaaaaaaaaaaaaaaaaaat? --- src/engine/platform/tia.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/platform/tia.cpp b/src/engine/platform/tia.cpp index 02f42201..04a1432a 100644 --- a/src/engine/platform/tia.cpp +++ b/src/engine/platform/tia.cpp @@ -135,7 +135,7 @@ void DivPlatformTIA::tick(bool sysTick) { int bf=chan[i].baseFreq; if (!parent->song.oldArpStrategy) { if (!chan[i].fixedArp) { - bf+=chan[i].baseFreq+chan[i].arpOff; + bf+=chan[i].arpOff; } } chan[i].freq=dealWithFreq(chan[i].shape,bf,chan[i].pitch)+chan[i].pitch2; From 3555ac3907c5ee2683174dd249ee9385392b7928 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 18 Jan 2023 13:15:00 -0500 Subject: [PATCH 18/31] crash test --- extern/nfd-modified/src/nfd_win.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extern/nfd-modified/src/nfd_win.cpp b/extern/nfd-modified/src/nfd_win.cpp index e4342243..4f19827a 100644 --- a/extern/nfd-modified/src/nfd_win.cpp +++ b/extern/nfd-modified/src/nfd_win.cpp @@ -422,7 +422,7 @@ nfdresult_t NFD_OpenDialog( const std::vector& filterList, nfdselcallback_t selCallback ) { nfdresult_t nfdResult = NFD_ERROR; - NFDWinEvents* winEvents; + //NFDWinEvents* winEvents; bool hasEvents=true; DWORD eventID=0; @@ -458,14 +458,14 @@ nfdresult_t NFD_OpenDialog( const std::vector& filterList, } // Pass the callback - winEvents=new NFDWinEvents(selCallback); + /*winEvents=new NFDWinEvents(selCallback); if ( !SUCCEEDED(fileOpenDialog->Advise(winEvents,&eventID)) ) { // error... ignore hasEvents=false; winEvents->Release(); } else { winEvents->Release(); - } + }*/ // Show the dialog. // TODO: pass the Furnace window here From eb1531ac1cc5edc21591bfa21a9a5bec22f40157 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 18 Jan 2023 14:22:36 -0500 Subject: [PATCH 19/31] Revert "crash test" This reverts commit 3555ac3907c5ee2683174dd249ee9385392b7928. --- extern/nfd-modified/src/nfd_win.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extern/nfd-modified/src/nfd_win.cpp b/extern/nfd-modified/src/nfd_win.cpp index 4f19827a..e4342243 100644 --- a/extern/nfd-modified/src/nfd_win.cpp +++ b/extern/nfd-modified/src/nfd_win.cpp @@ -422,7 +422,7 @@ nfdresult_t NFD_OpenDialog( const std::vector& filterList, nfdselcallback_t selCallback ) { nfdresult_t nfdResult = NFD_ERROR; - //NFDWinEvents* winEvents; + NFDWinEvents* winEvents; bool hasEvents=true; DWORD eventID=0; @@ -458,14 +458,14 @@ nfdresult_t NFD_OpenDialog( const std::vector& filterList, } // Pass the callback - /*winEvents=new NFDWinEvents(selCallback); + winEvents=new NFDWinEvents(selCallback); if ( !SUCCEEDED(fileOpenDialog->Advise(winEvents,&eventID)) ) { // error... ignore hasEvents=false; winEvents->Release(); } else { winEvents->Release(); - }*/ + } // Show the dialog. // TODO: pass the Furnace window here From 3032ad515ce053aca53481399e56078c752a10ec Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 18 Jan 2023 14:26:48 -0500 Subject: [PATCH 20/31] is it threading? --- src/gui/fileDialog.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/gui/fileDialog.h b/src/gui/fileDialog.h index b4a6d46e..208e5d4d 100644 --- a/src/gui/fileDialog.h +++ b/src/gui/fileDialog.h @@ -11,9 +11,7 @@ #include #include -#ifdef __APPLE__ #define NFD_NON_THREADED -#endif #elif defined(ANDROID) #include From fd8b7030aec9a43c66553cabb47bd2f40f5608eb Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 18 Jan 2023 14:57:01 -0500 Subject: [PATCH 21/31] it may be --- src/gui/fileDialog.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/fileDialog.h b/src/gui/fileDialog.h index 208e5d4d..b4a6d46e 100644 --- a/src/gui/fileDialog.h +++ b/src/gui/fileDialog.h @@ -11,7 +11,9 @@ #include #include +#ifdef __APPLE__ #define NFD_NON_THREADED +#endif #elif defined(ANDROID) #include From ed2bc592dc498f646af5a6b9520864c0556d40a6 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 18 Jan 2023 16:29:16 -0500 Subject: [PATCH 22/31] do we have a .pdb --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 11940eda..f50a7ca2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -278,6 +278,9 @@ jobs: cp -v ../LICENSE LICENSE.txt cp -v ../README.md README.txt cp -vr ../{papers,demos,instruments} ../${binPath}/furnace.exe ./ + if [ '${{ matrix.config.compiler }}' == 'msvc' ]; then + cp -v ../${binPath}/furnace.pdb ./ + fi sha256sum ../${binPath}/furnace.exe > checksum.txt popd From fa6badc8656fbf9ff95c4473b290fed519d70fa0 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 18 Jan 2023 17:17:27 -0500 Subject: [PATCH 23/31] YM2612: notifyInsDeletion --- src/engine/platform/genesis.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 686df2ed..c344e8ae 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -1238,6 +1238,9 @@ void DivPlatformGenesis::notifyInsChange(int ins) { } void DivPlatformGenesis::notifyInsDeletion(void* ins) { + for (int i=0; i<10; i++) { + chan[i].std.notifyInsDeletion((DivInstrument*)ins); + } } void DivPlatformGenesis::poke(unsigned int addr, unsigned short val) { From 5125e3ebb4031d8919d29ec7df700d2258248bef Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 18 Jan 2023 19:20:07 -0500 Subject: [PATCH 24/31] GUI: reset chanOscVol on stop --- src/gui/gui.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 8d57083d..c7e847ab 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1026,6 +1026,9 @@ void FurnaceGUI::stop() { curNibble=false; orderNibble=false; activeNotes.clear(); + memset(chanOscVol,0,DIV_MAX_CHANS*sizeof(float)); + memset(chanOscPitch,0,DIV_MAX_CHANS*sizeof(float)); + memset(chanOscBright,0,DIV_MAX_CHANS*sizeof(float)); } void FurnaceGUI::previewNote(int refChan, int note, bool autoNote) { From bb4dc216038d6efefcb2d45278b78ce51a7fd43b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 18 Jan 2023 19:22:43 -0500 Subject: [PATCH 25/31] GUI: one more --- src/gui/gui.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index c7e847ab..e0716732 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1000,6 +1000,9 @@ float FurnaceGUI::calcBPM(int s1, int s2, float hz, int vN, int vD) { } void FurnaceGUI::play(int row) { + memset(chanOscVol,0,DIV_MAX_CHANS*sizeof(float)); + memset(chanOscPitch,0,DIV_MAX_CHANS*sizeof(float)); + memset(chanOscBright,0,DIV_MAX_CHANS*sizeof(float)); e->walkSong(loopOrder,loopRow,loopEnd); memset(lastIns,-1,sizeof(int)*DIV_MAX_CHANS); if (!followPattern) e->setOrder(curOrder); From f05ba977b73fb73766e7ef2fb97cc8ffce7ca404 Mon Sep 17 00:00:00 2001 From: Clingojam <122941951+Clingojam@users.noreply.github.com> Date: Wed, 18 Jan 2023 22:28:08 -0500 Subject: [PATCH 26/31] updated amalgam.fur (#937) --- demos/snes/amalgam.fur | Bin 71335 -> 71334 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/demos/snes/amalgam.fur b/demos/snes/amalgam.fur index 6359b14556fc86963b18efc4db69aa9e2aa6c4a2..44e15b2574c533c5402a63dc53df593a39a0cb9c 100644 GIT binary patch delta 69613 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

s3V8Z>=5X-@YAbY2J88);3vg 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än7(ak;%vh)Q=w}MXC?okMS@onbvd@>N1%|-J)vH zE2(Z|J~5M6hu6d!BQ4?ka4+N@atqmv{)c;r7epReoat`mtQ##oDIMF7G=m4jSx{HN zqjin!(@FDWr1!mWS9Av6h%81Gqh1ovu>VjQNke}cLpjD%ZIo7CpQ-oMJLr9kVL)4G zK8zrPkj=5hKFaA~#tLEUbafPWzGkyLmx_z}1YY&Wg?BWX6*C0sXb5BCY)@;48j z7ks^uSoY7iB}7psdW#SF2tq)46R-io0f*K*Z25gj(PN*aHq zTopTtRi#Jbze0b05x0>aDz#9q$iw9hYD43tx!7!Ge$zPK0FBWj&(E>m*J*ByjwGp@Voy2yv;L z$(0sf3V%n|AVuCKFH~Bn*=lditvAyrXvdZL(hOlEf0h3!1jWDQK3bG{$f$p(=W9E( zKehikki1MDue8>d7>Pi9WWV>BX`l-V0e#FYW419;ucsO65iKLapl|dUMhUZ>S=;oO zA3+v$m zq-7+BZbUa=tMIFMDWWY=gl~Vq8{;x&VhlbIuS#6R|G+Mw3(!O8S8NeJ9AAfDC7zMj zsmF8)%ROr++YVcbeW2}(r5y8vYEM%51*9(&70JWD!EIOv`lqG4t)63=yH8BFn9c6q zjwjZ9%VEYrjzfar8i+(Xz>C1Apo+XF*IJi5TDaP~_q*FfHH@AR1v!7~TR!6};Gtj- z;Hx<-lCBx35SfU(s2fZdYkzxl=PVcC;_a|~eruPK+1}O9ebogx##l;Fw6pAe+CvIo$wk&8xpd_I5M5n9WmB9 z^qB}H|B3DdPU?pK!`y!ZUV<%{4R1}9r$n8=r^`LF=NUkOg3UU?tE2=o0aK5Eju6xQk$@t#ldYExnIyj(MT# zKuNv7`c)mL&od}MgN|ZZL^Wy`ZMUFS#bPoi>2>5|jD!CJL34kZI#Q}FW{UUa+S);5 zGPnv$U?$lCXRf1x{iLNkH5ik@ry3%?;@9v8c}6TPe^miO&P?t|q+X1P_PP`axwPsk$TaJCkF;GZY1u1}j0ELEfM=zkFDH$ikt#z>mPk&|WS^cq)GukLc2Cpa%kBL(x>^BRm!k zfQoTT887bOIz-aqh)|hOZs2NQW4MgiP_3=qRVVBFfvr#vhyap}9R0TL)0(Q=r7glu z9^r#*$MD5qrQmv47DJ(0OQ0{4PrBO`VFk>Zg?iTAm|;cg*oXi2bf;FG_8kPM$--TZuE zztl%vr(ZBSM|yb<0GNl=6zLy+IX9fW9;^}Q5by*R1fK@6@E|^3{!=BjZCV}Uwb>qM zY_`$csO#n7(hE@+9`fh7w%iK#a=0J+lPfMHNezFLqiVAL#n1o&x(XGTE%h9=u6joi z<*|_(`XOGG%c>{Tmg;)7rx6CSfUf2*BVO2Ts5B&oN z;D6zpP)G2zdE8i_8|o!>vt}CYp?7dH(h5C~{fU>wUm#Hx4dsHXfP3chNVoir-5_=nwTOR67qi?lopDnb*@Qer zHY1~n8(3rXESw0}f$ZRUzzw}YrsH*p^2C200wQCncJu~%3iS{14y%fl#e(PybS8ET zZ%NLl?9?`*3Sl8mVt=9Q(Z^^z^fbaEYq4HLGx8HrnmiHdq+xV*vMg`34Q=Ya3#1E@S2^>re*`+5O@q~3EzR8$Q`&V?1CFXC4n(Ux}K(gRIf$&wwT`2 z3@)nIWb9_fm{LJFX^z?O*SRhARPD#Ae_UaBkKlFKXi6iJ<9l!$m(3Fv=c@CUdU z9BQ6WH%P<8KZSIzC;Kj}vsd_I!d59m@oT)1Z9XuMns1Fi_1o$w`Ls}$@5aC9ck*@l zsS%xWh<(K)LTh23FjqV$t(7||7nGaIf68lRtI|$hBaRcs@te3zb`QIdZO6`Mw{REv zt-=)XxmZlRFI*8sp@G;;d@Fy97c%&A{1Jp}mRWr4(##M8TF<<*nIV!1KRuJ(I^JV+S`0Tz9{w3iN!WX%j zR@%_a>L3FSG&gCl}K7YEOT5AZYOWtypnjADPlCE%9XQy&*e zs%53?;#Q#}M~1(J{*SpY50Ij~_Wf$7CC0O65B-SjWRlEf?0xL-$Pw$hT%|r= zeLpi(c_#hc^ovk+b!yM$dhCDWKHy*CQ`|cCm*ggTEZ3`FtTlhBx$Mu?uWRe{2XnVt z`>ah?hqVCMF%JBmq%564e?*tjwDpvAq4n?PUyUmLO1v3Hr{meYC+s(D#=e-oY5ljQn!I^)?#sD9-0P6be{auZ z>Y1O~KKl=LtG$rkXMM$Lw*K2}&wbVWlJ$snEq&HLL{#D>Gi-~->1O($^h@-l^>^#L z^dzma*V{A5OXLq^4hfN@eJz>7tYp@ZgLIR5o%xh?0JK`0yVhJy-y@eX-)DZodiWju zGq9$*jhTN$?y&dKhpn5;mANUP!Gloo2e?*NV1wL$@@x1t+|}$B=6{$~kev)7lC$kn zyUqRynateD%wm7REpUBP5QO=z>s>bg2=^GX*8VEpXx&Etm)!;x<;}p~Ka@5}pNYrB zBhtn4b<%$b7x5Asv2UfE-Xt94 zFXDgk&!TUrCghu6zj5WQ-&i@5+z&5)v>^W@ea;_7XCNIDQ#b9bYBD69lq&*Wx7#Za zUSP7xgs$ibJrOk%h6&g?9Icsh{JDekZ@#G1OePGS6YWH#r%!i#jkux%JzBBuME2MT zj*sm*s*_}Y&*9yB4|jAN*u8u2-n|D79^8MobI-v;2lnnecQnl8Fz{+wBJ7JYU3^(~7oy=dW*>%V-}wO3y@|I&qvE}qwX)t9eawD8i4 zE?IQdRq*7p=0%IHY`*l;g7^IXpF5{%+O(;Y>T9bj%0s~tugDS0$fkee z(Y{E}v5rIgcJJKr(TDGCey6?t%{ShBq^8*jY++UxNDwbx$X_}Z%*-+K3*H(q=FjrPs& zefZIqciK09xMMGILrJgKlX;5GpSsi~>1s(`H=w$e~A6bzJjy#NZgEQ%t; z4bO252R{U%Lu|`5bX8TeN-}|4JQj;ZqtX7pNF;(kCr%uPt*5)YyA!r!$BuP&9(A^k z4tO|rEdK(YjCgkJXh-4w4%~n8&*918!^IzX#2@F){3v)DjNJ(nb@%k(oF`zz2M_^e z>Fe(YvHG3IC-oK3_{ zb~ZE<{CJ(s=NtLk=fmH=;?Derhr02!{ORI|Ek80E+?fgIbY{k1!yA87+(>@2i=l26 ze_QCK;!A6IPyT39Jke2)aUNiEM$YR9^EtB@9)yC@d|q!sEa+b_MgF~^EiWXGXc;Z% zkhq1%yoK%JZacqg#P1<(3c6T@t?;C{=M;t`L(a2@M;|da8Jc_O{mxXC1X;cz+QX z!(bS)E|(AK(``lTpKjxdKf?zXj5Xw}`~f2jHf*-hLB|Zo-N=8@M>u>q=!ZgT3=f=n z8z~1Fa-BWacZEnAf@|Jx!xl7$0DgMcj(Rop?(jkR*f?c7UDS>hW%$*|fEgJ!3^T@l zqk^Pph#|KOA$c^WPqPh22I{d3i1_X9twfHaYp!UwEIS)oEhbdwnwF)G1>l{i5KgC^lNnF9?kTeInHE1| zR-mUP;?b&(io+pY$0|F_$Hm9dEPWf%) zG5k3uKu4P741PX?+K%ex7{J@3l^>3^Vdcr067c`cHb(uiMi?FCpAYncgU^(s&+PxP zHW+{7elnD8m@$d_pV&vvo1jhP_=3yyA<~o74ISYq3-8S+MG9 zNa!D#Z?x4;*_cz{`8h}(S!{mJ_74zOu#bN|5_)IGU{RZbVy7|7$k%3}{vI9g*2pF8 zKWnqoTkBMWjlkCFtu=bz|DnP1=o&KE7*m~E;o8M&>P+?=ZCh(7FZ@F|7R>p%mi)ZQ z#)|lVwK2v2L(cfeAK7rHJQ+6o=|0Ullj%;cT~Y7PwV)I8g~R_(2G1Mr|HWXRx7mNi zT6DMoANAxPoqMXNc-gYK*12r?AGhE9{ckprQ0+f=-LiN+ra-nsQ&39br)Yzs-&lBN zQ_I9)Fbs>rD`H!e1$W8=+ z@JE|>?du@19?6>^GbT4)^X0jVmQ;WD90^@EQ*twhKiItW(9!ody|X**){ku8b~I-3 zAFV&cm)6!+RR)7zsj{B#KV-!Ybszk2XUD<)kW=9NGWoyYIjL_RbGCf3#!Qp{^s{I;&@C+Me7rd+~qL^UCFt z$Ov&;o+Yjyfa6gxb z@aI+bN7%5;nblLO-R{bX;mQimUlypHBqSO6NWAf)V2p35PS_!L|K1OGz4v;z)&Jqn zzU+Wbd*0o3yyL+8>-YJLbf|x{?@*7TMEeqn!-w>E$F7ZCdV*ois+pCQi>{qjIlblb z=1XTcRZsfLVy`-F*|Z7GwehrJ1%$|e&!3i?`~!kSt>_6|JFs6DBK?A;#*gfc*j$zq zj~x-h$CDM+vfHgh`cjtN)7#&DG)07}5TETnq}Tc*N@Z!BDK%0hzV3e>))(o~%vfLN z(Y|Cf7UB~cW0tkd_sNrLr~lhmE^eAU|LfnHEeoNBORk+Yd5X*iXHAjgjCAA#ucx=X z9Jh9DPDZ;T>5hHI(bqm;1N)!tv?Buv!xBn_6C|vp#9+2l^&kG=C*yWx>BRyMp_wL`X2qH;DO}U~>(D^`+ zr&c`Cy>-B!ifW>G%>IoN5cUROjPMv(g zMV0Q-+Oq1h;DmZ3>UJ}{?DHK{Ym!NxHzHd)$%*~Pc=>DC1pV>oimYVcr%$&`nd`2u7Rv>Q?W$yS6HSf(yU}>vy>r5kHS)oC%V@A z;YV31w&#C9Z-Tmy^~8JQ{k@6azEp2q<5(r3memHSqUr*%?5c)pcc5u@W3alstgJQ= z57bxJ&h(3uYip|;>fEMVuuBrhs5i?>YBZq{U9U8|m2^i}&q2E?!0D+(T9C_SL(M9t zl%{%|4`{k53rbH`R%3~NHT8ann~&;xcOOq9X~}<|?Bq+1MtN3Y0}QcrpWo)a6#;>| z%L3(f6(tpAK|aNmQPm${7|Rq$in4}fv!WpQtILc5T~C;-*ncqLXM1BDt7{x@%fVpm zu;JD$-q1|q^RbL>g=^F-(c(!h+0~crPRKMS2Y4cuRWjak){ZkWO9h)P@vF(&$sr;( z)aZX!pn|d7Qn;?lo3i8zK1TIOubmpmX5&`8%dYdr(kjoeyeP_CsKz30J!-L9tgC0B zFBM{wjKBqXwIqelZh~f&ls5!Zs%R;;X{CQ-w%RoiBE3S5&&M0AI~=eSj%W<8Bo((z zd|}qClv8>@vg7>{*MFRoe4K9fB}%M5TZvhT{U@@qXm8wzrWq|BOQZ~9uoZ!n5tI$P zyh^4)zq_)WuvLC8SR1aWs|xx6BPotB5;0|yaH$yenQ3J}u~W2KG=PG5%kJ;D!9Rc9 z{fw0W3XL91N}|$}avP=_a-I?4!(5`@qG}>bEgcdkXIN@V_DeF5j1|>=JoQ$F!Lg!h zNPbyUWIr3Kl1aGIrxT80WhQGH!Ag=AOTr~g*hfMk-4522iN10{F*qbK$n``|L?l_ADG>~YQ=%u>axN8DjaV;*Jg%55lcoML5oDLbHU6+K=;PhhA&poj zWyGKr=V^a;B$Z0^_ntW3-93fdLoKB&cQm@$1`IpF140gjdhs!>j(f=m-J)h+g&NG1FF4Ng0L zJf2ksBB@w!Pj~O}{w!2Q91uPsylm@G8~{;3uD=NZzq>3P4%b!#m;}hQ94D~6w_LDT zGtC4A!=Q{3GdbW7NE3#diuFegj@UwwQDHWjm^4tziaf`$Lb#NZf)ycN2>UsIUa)(+ zH7lF!)2!Z(NIY_)KNjyh))9$C`(wJH8ivjCi~%*7J1E(v91`4aF%SkG6=aDGPb?LJ z^}!Nvd59HcuU8-hz+~8*ZnzMl?*T-lE!&_NH zOZ2CWbV|=gqsgr53nXIhFpcYfj6f|pVD;;)tut;bOL(`KRsCL*^NO6?9W3<=zS6RC z$rqH}g1drCT9lZ&#HJ`Gh26HPWfj#VG(Di3x~*ijWK3r)MP(@A43%YV^oEr(M1W;B znlx42Oh@C%I8cFZauQ_)Q7qw29@i19Zi}otBuW9654!y!NQER=8J4|&A-~A7ep@dI zL)B^|`_i@+)3sP!*HrkG($#EAwUjh4y=qt-M@-I5Oy2Ddc~#(H678dQBAw3aF^$z! zh9neT1Z}ex=k*7WO{z<4D!1$9Q&pE`%jN}%1JlbsKg$EYA+Z3sHA;9(HFY9?NHV7wAiTx7MWWi0 z#K>V#lJm+cNb=gSLO7%q&iL9v%r1fl87u`e0Ao!H);ye@R#+&&a3V-aGAjhUj4cQxmY@Qqg69WQ;QeM{6AP5imlDuACk_C?Sd0B9bXj5J=5@`)IGI2$Qn9dSComEXr)igLT zna=q1#|q+f+10 z1mns+RpDjlLlTVsEU=iFR;i`}ULp0eHY57WB+Bu;SLRtrNSc~XSZpe3fTbX@GHf=X zq;*`EGCZ1>g>@bS02CpK!-NI_R4KYB0fX6Di$bn{<7~W1R6v?wH3%eND+prIFHivr zj-;Zf@w6zLP=0tN8Q#t6V8*Or879Ls*(8N>(=by&5WL6{LK#8yiK5>P#A|}Zr4q@= zT7U`D6nK`S7Vr|!GF(X@90F&#SvUn;3UgQ-YiO3GXBE7E74P&^k}1Mb6SzxBTSgYV zE;5jRWLe#WWQLz%QPpHQK!RZtlkp0$=CJ{)8L=%Ap$Xo|t|cqT_!J7r0t4TXuWa{?q}2KI^)SRF`20Cjjy zIiZ2+|0Q#ju>)58yN{u%yOFq9ibX zu&5CQNr2pG>#D)}y%h432I)jsYzoe2Y*nQuMlfOZMA{;fPXH(Z-r!`&)rdi=o2(={ zAA}Jj88=8ak)~=a%Yqdk=c8>w3WzK~i^MQ6Eu;tu^Z+aZtyoZ>P-HLsThhE?urhBE z#xzX`4O6phEtxbZ3U^bTMM3y+y@`qvJL}6WE z8MdB-A^*CeOEX%=|ggT!=LD?j@;m7$z&W0oarHdOpj>rI*m_*Zo z5EF6R&4N*M3%m{`si8}O60gX^x*Eb2xQJMQE=b{u%|oKs)s$j_WsyJ`o?~QxH~0?V zjdBoxAd4dbQBXzgWn@}u#s#9$KHb1CkuAg1pg+}nvzUXw*VC!1C<=h@H~aM z;qjhG(7}euc&LyVK>#r7j(J6Yun$(048x%UpcDo1&8*IGN}6)`c^GJBXi&nMSSwo; zF;o)ry8%B?HJGXfltN*NmV#`?qxD4~C6++8g6D9mMF1*rDg=rJ`4TdMrWrQgNeYC* zA$<|_8v$Fxf){XrcaJ-=Lxk$YgzTq+@?cEO<|UE9spw%FpkuHs#<`Y%g*wBazzAs* zGX!|i3pC3~B{Bp)Bw-8q)_@qWoq1Uce!=<=suNqY1W4E--U%x+P$1Kkg5{h7y4ntC z3?&N;4jBlD-U5|uATo&s2S7?8oPbUSI{=&*U^R`f=v>h)d!c>?>ZgcwHDL%G1d1%< z{m>8!upeqC5ix;xMN4jf5iCUU<4K4-n*+ErAfyFI2l}FrL_l~1m!bjY0ViN_L?oC8 zmLNQU2d`2f0zqWkK@-F;!2n}fm=ThQBnU7s#H*>Qw!k`9DJ@=PkTocQh^Dv-aziNs zitwy+sTM(I0@;A7u+rsu29AOB$RN9^761pt1zW*dgur0VhoyvnK+XXF0@MKPyyW&u z`Fn>Y2Ka;rx@AQfG6&02Eequ*pc=D?W`X)JfDWd%G~EX7!!-^;RInn_3SboQzz_>q z0Tw4B@E?J?g>gR51xUi-z_MUeYGR%Pde%{X$P_$_i3`kv?gXK5a!!Qh5C9h=2>^+q z3DyP?EX&L)7J+ns%%hPQ$lIz4tO`73A@*dM!#G4w0TGx`5JGZ50E6v;2w-Ufr?7ZU z28IM<0jn9N6ESdtg{3_j3kzLh;pwm+&fpxff)fl)(OJ;V!dL^Of%LEhV<@Cs8L|$P z;9lTX3RIMZ(Xb@Lo1YlKV10=x3qrj~OlgJS4G6gYh>NRXgV{sNk_7cqsc3wA!`z(@|hVHb<5UI4ap z&0lx!WygXMwSz!{5*g}3NH306@n#j)@e^7W>l=c9@r}BoEeLf29pC|Iq2VyifiE2qoGUQ-juHeUI+HqpCl00{$ebe! zXQRJ=8FVQvUaF$FIoe@5F>xj0T)?5ubxTT_!WBF;n(ZVT^a1JtPq0WYIMQ}1I7d93 z*m$pg{l$bdvcZAS;IPTD;nZazWX^1C=OK4PwgE|U1dgfJjOk6O5 zqXk-pbtr=5wM6|K;LZejGdn&gs8s+J#v4@6b(^X!X2hhwkev z1h(T$QoM`Bwu_fvhY?B&pvcp#BS8`SPORi9w-7ycLA!$2oM*TeDNLBhnsdpPW$dDI zg%BBvseFCqxVI3N&MsQ8b-|^1EeeF=m@$7)p5gKV!RGN&1a4t-4$2ciAv}hE)X&?{ z!3D`<1g$>u!Z)r8@~A6pD2|;6){wOjH#n3%taXv1NdZL8R>&m7_f{9_1}~;BZy;oG z%Z-Z`-8iF(tPT=#`HT6Vz~@{`$AKE)Ux$r99d?`D0>4|F*ZKGIKgF$~@UOV{US=+B zCo{!sPt?_XspP-^`i;sDn{M2HHJ4tq(8I(|+@aQc4|?jjjrJO=kJ}RcduUDVPd=&9 zUp@P_#O;SBOq2sZkErMTCHwm=e{UE+uK#eXA|!p|GlRW3yux1Bv(a8z^XJ~ZgV!wl zQ(*SHE9_=-TvvCMHg1aA&h>Fij0)Fw>(!6rTH%LpTH|tO<$B|PmYTYSomhT% zeC}rh#&r$1)Flpn;c$1A{e?S}pC0)`#f#^x+;sfF{TEiJR~&zO;UQSZ%z6IlfzIsXo(%0Jf2hcvj9V|Jj=C00;of%mq*)&29i-fNzGf9uhoE$ZmD zv&Sx;5WHxcky|GIy#G7i^B4S}z5c*=ubTYMk`Ir6?ViwUZws}*+Wl!_+U*B>$7=`b zJ{g=4+i`A1@Cmj z@qamVQRQk<$6dF7FYCWx@z*~Me_TD~>z{53TsEz7b({V0_e0Wo?cW!EJMZSfuWj0D zeCupqU8zT!u-Lfj`0X9*#2*Kqjn_{K^+v2K?;oBl;3U+etK!=hucnUzU6~`KV6?$@KWQ$1LppRC_A|iYMh0U3(jg{#vkd{zxu_$ zKKH=PANbmLc61!=E2?PFZj&6b;{HQpY8wb+)HHNS;rdZeQnzv%7095?*6bdnp`m6 z)w4X8x#rKk^^sppn&-c#^A5Gq_`WcyZ;}ufXKws|;{3neNP7O~lb_H1?~j{*Rkr*O z734=JFZu4>n_pf(@b^ak=+npFDt)VT)v=c=C-r?;cK1bF;!0cC`_aFKw*BDX`HlNOo5fefBEpQM_oF|5pMTl3m$$7Sc;&3GRbI3Gk-;0zeRjed zk!W&T#pT&o&RWN(w={QOqug-r!pKuMzdWA&=(>ixuByrY?r@;-k#T?AId5P?U3b;P z1IMOqaJ>;}vlo~Cyhhl0Sx5NnWqjRq0LsyZV-NMkoJ&udbHuz>f2N+qb&rtl)L=@khKBwaC=8$Iq%>9{;`Lw^psG-H~~1V19Vko^f4AsszimH5m$i;fe$kef#*_vo~~|*nD5b zoSE(93i%fab?}k!OGh^KSIu8i+p~AuoH)OI=i{E+ryUOe+WXWYA0Irc&fN5WtM|@p z7Gmo7Y(>j9v3d6$>Q>`%Py4aQJr7=R)$zEOL6s_b?JqloY;KxIdb&E{a>8FeL~5=Pb-B^Y2WQ7_wzTNtuj(oR#iNOb^2dr`1`Nbc9{6;Zmt}>5Cesf-2>^gSM%OAPhXS_PN=cH@lv+^}P zANhXUH~;+;!AR{_2ZCok(X1VLtGkZ-ICWk86^~$jds3{rXYWEU__OXL9Q~Eamsj0> zs5AZc@e4nhSy4OdlGy9ncj^~Lw(oq!v&#JF%_`}sDgDvV1-DK7;$LfjyQfsFIyUQM zGO$ftQu~a0r}g5X;W{W?66;L=?xJAs!_Hsq_3>P2gX^hsBX>i_ck<5jYP-V&o#juZ z*LKdCxz5^XFP<^A=d+k#E!VCr_noYsbgO=e=aElmXMR>SBYC7M)O*i+m(BQ^^yc2P zOIo>W`%X^y!DRpbsbx2Rry_RkC#|iPkmOrIrWP~ya$=VJp1~tcMg2#Kx<9sl<#f-aprdyEjF%;UmtjX*d)H(Nmk& z)Si84wZ84dx6_wbHQSGb<2`GQ{o^5%AG>=(Utcn?n5(H;V;t*nmCX-#9ecehn5*Ni znD~>F_UYmA^jxh9Jna8V$>XvANpzO4r@OQVdmr{c z#y;m>Vyz8j2D-R^yQAr{TeHsq<2|D;*QTBL)#M3@yQ4Q`F7!Nna*zM8-mZVQbpE)@ zbir^b$4bfuJ)GtSWIEZ=dxOZXy^!S8e*|A1n&+a*{rkcCARh(TC@5#_)W^w5rzZ|%K>iBi>SI=I1G^TpbfB58T z(plb4?%UeV{k&$%)~_VLGxrYVrBA==ULhP{JG1|O?DlE9;mog;%^wV8R+Hzo{auTu zJraK9@3+(?1Gnt@o@`2wOIMc5f$QQg9r1~K{Exc6B`x@DdG53NmHobxmoJ)`+t6kC ze_!_UXKO5fA8^fJ?OWwv>y0W)jQeZ%478HJ`9hy9d_ zE}2>HKgz$qYv?hp3O{rHVZee;-Tqp@6@KR7*pZS{?`R@f3POWhsV;Mx*5r9b-KOxzuhPUhl! zPG0EwO4)s)OBpwF{J5=0=ZEKy+qQAS#GCw5{PL=rs;!3awGR6y=lYj~1JW!)w4bsi?5Bes4_+Qu7 z)qM5fUWj#Gy~K0(gx^J9>HS9K3j4vcjIKKF+Um=*7ifFKX9XV_yjuMa@3+$*`Bs&_ zBRsro+KCeP9qJ94dqO8CY&G79%=yCW`pW*Dxkp_$?h@ULroFD8KhRhml8jw{%KV{! z;U>s@KbN>2vNa(evE;0BBY#jmp+~~=2hST^SYx=JI&|Dy@4d^Y z_fCp_oSI9gC=+5ETu-F04@@oFXx|+u8w{VloR#)$tKg^J+4AOKv*3>e#P;FS$c$ z+kH=Hp8t99HukNsYpTB1TYG#N-(e>MS0vV0TdVIfrtRBgc0(lpvgADXjRU@u z&E`kGZ55B5wIj38dwp~_HFCk+0@r@5cjWIsIp=r2`GdV=LU1m9 zcHh0sePSy&&o5XH-V?ecM#wt8Gg}t^p8RI4 z*6uP7_AV;1X1 zRWW~Dn|(vZ!z^VsbUjtxKo$e)%fd1B!jwVZ5n4#e;4Q8a_lx1*C=2_4+c}~3{DCL+ ziRJf+x3I~KPi!=z%1tNlp76*xrFYObi@(J+A=X&^J^4Ea80*fawaof~Ik~sWuZ#aa z`Q7r)^dbMNQv0#H<8PIp=boK;)RpxwWgb2`z?6k2MZYm#U|u-cW|oCpxmP7#-A`{} zgX|TFuev8BHn{4&TLR{P;8oEV{2?h~bn8!L7q~*w{rsXJug=e2re7Cd=v^UzHN=hf zO`dV7hbXS#)>tq2OWZ%sY+#p($xOHY8>L?Us{0mKqXBHC-^<9pFMGN8O0%(AJn@}K zAfs0{aD9F4=jQu#@^z8nv=W9bDn$8$##80 zaE0(3M9^X`s@z`E3~NVTeXBI=x+3x7V5$F`p67Ep&+=SfUx|COdN1=G`Dx+DsW%fV zP1JQ6P}j{ne2$3KvJM%_7c zJOABos5YgJ-QV=Y!4~Vpr{&kP>0DH~-nXyvzfKtJgkUh&ncb|eF>WtutbSy0XYN&L z7XP#CM*AV!t{x)GT zw_H;P*YQWH`lFwM$Dh}JSrS#Y9&KX2>b^T(>Msi)i)}Iu*Lu2vO}LjBKhBs^&htdN z!=4{r@Yzy-1}kw~vu|J@9ylo79U$cTzyMP+*qNRYDm}TzT3Nr}b^YNz;E|_~<8_C) zb%1?bx-C}XzE7+(YxGw8H&5wb9Z!`_)X7LD`FV5&3s3QTk7EVg@^ss>2IgkSaCkcE-`w+)?1mC=FO?^ z$#Zh+X-52(^q1@!V}t8C_oJ@O>WiswNrJI|!1c(uHO9DG7M4O|qrF4OC{yNpj0cDT*H zE%ANf+)$T!fNi!n14G=;FXl=HuM(ar-=(FsdhZHbu$F+_KE9niM7N16%{9i_&^={; zKkwgUJ`HlVl0L41c)$zw-bUkzv`|I8jU&UPt`UbVHo&>_*osCm+<#bFVb-GQxBfx7~V(c0kUr(3kOT!lmhr z_5z5B)uh?J6FfVY-bf$FZDs0z7p1-4Mv6 zbE~+uOggvSO6MBL2G@n2HP*P4!9GMU(|2io-1AV&_Xz7LA?xWK>I1p8OceCLz2su{ z8MV~&if5Ph8|8cQwv*ImXPib2~+3*?(Q>;t(9SB?I>CRmSqHmiThUL~v( zU)LX^0@F?)1A@<50Qc>BiTeSldX_R7vE6L5pL4sE-zfLCra==#$xix!G z+RA*K+Q3ExJO&~`+`#Upv-pFMQD-CveQmZccT%pkTgkl)tSYD}MTC{+pE6xsBlEn5 zGIW_M%}b6?=H5!fer^uCz;z1?-qg~$ zO=gGvv`okoX#pZNx3Yc@C9cNuGpWx!ai#0Rn1N>sn;E7}%mcZ* zj8$AK*KDt_o51n|%rk1OUB}hh2iR^>XKv?jVFjx*+fKgeG1$4Z9cu1&^0bWA#T<4c zaBv6U*W2B(Q#B><+u>gW z>DC|AJj^@7`vzL!UO>a6u18(VbAlmQcq>uPvyQ(LJcV(z#A;#;cBR=2{^Qlv#Bi+v z{gyI@YdgQ1+^UCZH%S9?+~T?y>bb>SJNU8zVr?U6mk|dTeAaB%!Yr#v1Y-9wmXKQ8 z19qt64oWS5WV_X720^d!+5M0!)&U>f4|T*YZ2&SI0oIwrPKAA~fXLNkH{A~swV4L! z1l5Y!3VHK+4J)itPrHejuY}NdcSXMwAWef=40$*@E%6>3OizdNTR@WnUA^}ndKlGBC;9gf5o#E zB5uG)=N_VU;QL!#_w(r-A#FBB%N(`?d_R{y10G!9x>a8Th`tq=;89mAnQG0+-Dyp= zI_v@9?Ww>FD}*_@ow?N{4)u34Ab)4hpcSrl;`87agMHL>C&;`Otg;61wv0C*6FtVZ zo9k(Rv)!$CnRVPMZlm4B?WWtobM2&oY%-geAlt;W0}`fM0*~XTwWZ8DKCP9Th)|TF zg&1(mPT;tWVBrJcox?gxYq0Md4?sq02irsa0$lYF-jMtleAdxmh zJ_xdRB2rwB0XH>(4-tQ>305`-*riM>`1}EXh?p*}g{-j}2;y)(NO~`Gr)A`jZyy2{ zAmC+SNyra)OatlS+POQerJzL{*c$x_^{)94utY0J@epV}6}*g}JvYO-E5QF-;g|-% zJg#1VPjk-$Lo5c4XaJ3XPe`+X^;5aIlp%nXow*H=)mMU@9s|8vNSnFIypgVDTDcB? z$cJ-5{u=>rE5I&WnKt_lwF}VY0XBXVSg;*pzXkZ98T72R4Hl1R2kc=*zR})I+w3r1 zPj}NL)&_QfL4*f^FM_!>)*N;{_+u;M!$^c#+lc`jy)(DbM&xg0ra}w?W5bzCAU`xR z$iP7sKRX#9}$E_Rb0E50+0XhZQyMXytaZ3OjD02fbU_aCre4E4O z=qH0kwAXQnOvI94)j_q;Z0`pf>7g9d)4PjbLYi*~(znzY};4tFa)92m-6Z zjF?+0p}xKo@C$ql75hf#np-XC11lE5C32MqED^Ubx84bO!un@7_&y8>*uWy+ECqbP zT7Y_hSFvKjkqtoqognvG=3WMWV`MGhE)Cx82BagWwgYA!gX7|W@yDQIK(4? zupw>$H5-B9mZQEF&faEY9%ul*5Ex_*uq{Z@0N!o|mTb21oi>Y=hA-I^!0`9dIN38(@&VmV)&jgD7uBjN2H;2cW8Y2z=85awD&Qwh-iz-GC5e z=Q%8%fnI2a@#jE&9)_8NEY5#`#mE5eBpAK304bZyRt_Z@0L{8gL9`kKB&eQ6k zubVV64u1jX8EiY51DuI*xE`=^ufz5oPE5Ch7dP6tR%o*^ryvg2!f`hOB6>lyrJyO) ztzdUV;~bdnA;2N7GP+EEMCD4zX=q2xJS}jRLDA|0*kJ|OaE*ogapqRe10z6og7KRe zthUjYwP3#v*n{~y16XS%SQRu79J$rG3Oi81bu&ma2hiUFM*t2@l&KB8(G7E=lqhkt zjVoisLIY^!VbGuL4pXh-5QXgoqXu}Kpmmx+*SQoK262ybt%jq2mjb>q3eYm$&iQTd zd@IxKcu#e zoV(hwui#W)7|j{*5_+x8sX5U*9`FO!n@1hQi$s zC^2FaIb((Me61r9o==>7iMUwp+y{aA18tL+whiQ3%3us4b07zHJ9t1#W@sKun77cX zs~w&4F(oho$lmz8zb=U^6+u+QFcJVNOXyFzo>Jh0ZSBqo8JX5rR)-6u# zwmSRJ-@OiZprkn0YO>L(j`4S!Gh_Z95aP&$Xl!wE$Wq7Kh?&&{ZGd}`!P*@wymbow-#|wk9yM#=@rAyub)@Mg`S%+fZ#Xp}K?!k;q9mat(k+e8henhNEF!!Pq9S+Jn9PUH!qcm7cb~w2Vb;dK$vJC|Z+ZXyht*+eBYm%P;zQYRaMg@GEXuI zmB}6N?C$A3*}4BfXJ4eFyYFNoqoh-P-N*a-R9nvx=T>%ACA`xSAeL5ER9A+7{IVQ? z-{qC%GEBmVUXRBw+c}#dIa}my;*wbmsU}Q&fh3XGx9{HG2Hep_4@R$~<;R5|t1|p*jhb212Dl(yN5( zOL@ZheMC(sVhZmgi4+OQdOU5ay*($RkvQJy9_u*RnJ|gy;$1Wy?>nBzq!enaN+uD* zcDY!zudnyGDf84MHVIaa2Z>owU9{C4@nHYBOJ+<$sgF%WV!G_1sSF=~kiikr7z`@Q zJTC_VJnsnvWRNga>hT22$CuXDmyWL-UkYk_{NPMKn#EfUb~bg&!%Lnw6RDJ*%Vf+< zCI`^bbt?0U&X_EUqGs?$W0HwR<0{^kn~BAt955;2L02`SsHUFFDT$m*BjF(phA{zHItheC z)+2kpEXu($VxZI``btp|IFsRB=v`h0X!G!!0;Cj^2Wa{OUfBcxz(Is}$)QSc452vy z9)J~O!j3za-=*seZ)Z?`J*TE&QV_*-xxnzAkk4Q0CrT!hO2J8gAh)hNw=GjN2G}1v zkZcMA#Z_WvluSwoqoiS2c%|la+vOqgKAq%X2TkcLjh{?FIKo*TKf(KSd7o$#u)0D# zBEzseAl>B;5XxX16cZ>7@FsB)g5Ry-@q_TLV1Sss*IycxK|tM<1F{EzH@@5j!!o56 zU=gD7{s5Cm`2wJSvWpjeUZSRQG?PQYO$EGa5;LJ@`i`f;**Q~*os7q$v3NACq-;^< zu^kYOr8=l=#^dQ&#0dF&ZJkeRd2=oAwitvPynOu(b zx?BN2{s9)A@IF5aerB+n3N(R}cmNCU;{mTAAn!D+fXy5+h{%ICiO&0&Oj^|)${_#= zfLR>Qb#DDt6VbkeO#tnRqJwh)q^WpDMFJriz`RXZ+zYd)I0M7FSW|^TTrP)&8SDpg z8f$Fg4alN@3?5@emve(V@A1Gf)Z}GW&A<`h62`gP9dAWC&+AdxlG03QgFoSFjxX-)+k znu-E6p+clW$Ys)sND8x#AOD88v7dKnV|50m?i)&7m)UP#DA@g%JqMf`pR;V1O_PLwrC00qSjR zt-+CyOb|9enGk~x!BW)}adOq9Ie;GkNY9wE3_$~=j3er{?B$)#1c)VUDI@re003$j z4)OtmS~I+dw;2zlK-Mdw3-aYh;hubKz;t=Q1TZ1!1$x?P-G$xIC^KlKs6=E{U|QsV zx`J2^tEVB^nP#Co0&=^I-S@a7=X4QZIp7k#J}|J01;bIsU~jDBO_H}6Q~Vll-sSiJG(!(S zm|+mIge5~?Ux?j$*qMkB0!P{uQa1>V%@`=BvpG$76tn`KMTNmvNG!!JG{hcQn4)-& zE3y9%dvBe-HQU6p0^0%sel{Y1#}OLa1Q`rwd<%uaGQrHZFF6X@PE!+)L`v9vTmqzd zw)mHU@EnNmyg_*f^iIzZw)Zj!I5d@0uHvzx%c-vT!na@&k{1-Q=cojH;lv9?FB9r0 znaA?b88{sla(U7yv@H@okAI4T5A_`7Bio?^=d`@s#V#p$!n66lnmlQL6^CPnhRq|I z7P<}#jX(vRflx40GWljdr&D!kVTFx-`9?1X#;ns7<V5u=&uuh6b=DU=3{{tpAoCzP~9?kPI2w&*U^{+J#=p zVfPdlsw`_`{wOGvXE!{G7COu@T$w@}pwsr{@NjV)?5oY&o-cZ#(8A-&Gz^X%E-Omg=i7Bc{3JqR=MP!qquMHiVv)H#; z>|!K&OjDCEWHbN@&5!xCf$`~dw~?W6D+~#6$ak*V1+u~@;D?;$%rj*3d|P61*dhJ% z%#Qjw`jR1R4KW4ccUWzw!x0hT_+sP-4(!mNj%<0_a$xBA&|%h*7R(0&TX^k|)X>@3 z<2z)G5$-CURcsZ1W_f1R-_Kx2xYuD-T4?Yiq}b=@M1HZg+1YF6*} zJ({oVVN({rt~c-2ksDKN-DKF|PQM|UodiYm?TU0*xsk}s_t)A(dxs}*D5PKrhrf%x zjKyA2GD;Md86Kl(WlHnzFZ6ku!yHxoYTGf& zF>#DZ)+B^1!4N`wWxIbYh2C;y|0$F%y9>)6$8x>>XJP5V{eA3l(0`UdIVcOIuvb`m zltL+#E~OBELQ7~duES))L>7@nWbw{gorQXzuQW4~$3MoCv1>b{S7`LC_ulvS=lhlP zq{;swN3Q+mXiiDFAJfS%y#=*Af&7oRY~rJ3nog9pEWE?#joUu3X%QB;foL;VT`O$5 zFSzj!X?4~@>5hJ)Z#OQyVGiHsxR18`Uk1qAF2}`xw_A+pmxpanaMr0SxA3tY+5op; z5B~1$cg;Z>YMZF`!NwE)zQjg48$ofWkwe+`T=YVhMJrm-idM9ubv1hQ|CYhnPk;W} zzx?CRfBMg_z5Y7;m685b$?vZ3{P15%Zem1H7}AYWCAp<8CH@jqYD&vlJneIP^WA=FxZNBKl2i`l=*-K{!@aqg1JsO+(jJPM-plzVFM3K84St zz;i(%As0$t#=w`3iFzc zCbY>Q-Q3(v)u69V#y;d}IMBCVs#J{_TsK`Why77WKLri1lGt|0(-cv0(!85)p@yHaDk7 zPSf_`6K1)jYnoAlGg@beJb-D z+Opy}fzYwgrJLmlE4d-u-KrLN}RV4&}Uz+e5UJzg|*J<5rS4jVmmVv`^$_YEUMx{W&hj7^MK zF-rd8f)n@pB@^NH$7}7ffG+C8Z?EG|eo-9l@!t2EbBlVG(`-0=&$c zO~(s8j{(jDxP5$SR@I5ifD3>v;!{@@Q7Z935-27+5cteg0ALS81ea7aJ(f{f152gafB3Bj0%b zh6%fbp2K+ro0=x28=>)lzST@tQfel`ip7uvX@l`lQ3F|jny=D>+BgW{<2n&4mEi0F zmbDv;mgD%k-b5aVqgW`uy@=3(+1S;;uK}0?x9JH58KG2$n*#O#yKn$XXQIY@fCaor zfCK5fOpO9|eO~4CgxX~W#;PU2mX6qk*SgKcIuue47i_SGPy)8szq)JF^WE~Z^T-m? zvYH|N`~g6JvLrZHDAs%r;4iDQUL7b2;tGP&Z`iPI9Gf@ikUrp9o}%-Z>lI`+K!PNM zY%JMcR0$TAq*gH@eB?I1_{>Hk)y(N*WkvU=R^V!p_6PtG1NH@s*r}J+nyVtNQeQ8iu|gMysec)P`+M`J#sb# zMaWc2ybuirf^420)Z~&M7>Eg|EoRL-jR0_8RrRYksw_bBeMTSV){t#fhP4Aq?yg?8 z7V8e<$#Yj#*o(*jv8slAcFv69r2yz;nr`ZUssQ{b4Efo!bpu&S0ki;X;Y1d|HC8Jo z)306C!CV-4p+YW>r~zWZb3>q^bPfNryNgog3gqQFYcvtIkrw;meaMi}DLzC7d`)6_%PXQ~>*Dpsg2++J{h z;extG8OK?2!MYFu1P}Z0Qn_@k6iLc#5i$?$-_!NvaXq7tum{x|GO$!o*7A^74A+4Y zBBWU3>Lncz4$E>lB77B9gDdq4l1*c2aY<7ak)sgmO6-LqtXokCoMNmrH=_o$CDKhc zJ*ePOiIQ(H12(;=7F%=%l{ck?$O-`J^t({Cf4Q0>v4rbU(XQ&q&Peo#P!yL-3vtpID7EzIStPbF zln(9d0Wmd^Ln4rnGs05r1R=&HK7MwcFrOIvRAiYYjwC_*yw!^l*d77}L&O9ap#stn?vMOtmT zgfb1jP7fYALX-+*TyFSDtzY7{Ck1>I7@=q(YD$D0(u7{Ene_Q?*9z(9JPhQg$fG)p zYOjb@xYcYTy#%<{QH`K!M}iWwQm&Obe~s`_zi~?GWeOS;2M(%erj=vQg)7lT6E`&v z3-G(zB-K}OOM z!%!p;o<&qL3%cC(5iIb34*OaXr4VXju5)*>iD}S3GBmCu1oIjeh2i+6;sm3Gsf9pDe-yBQ4O~pt zQ2+V$C3w6eRocc3rs;|tS6@~bp^y)gq7>I-VRK2+p5KV_AJhqdLdYX9NMXqa9Y8Zf z297wKItEuL5wW@pM8~Bi*Q?Vt8`$q_R=qM4Ws& zrVALlXi{i#IFmxp%##a$e-2b|k;q{dTqJ-A4F+}*Z1ihkberPu)Z`6?mwx>Gt5?3y zXb&sBo$%ZL*~J?QaeJFgYyVm6=11Cz+dB{9)_+@_Om@L#LqfUoaQX4d{kxxi^2x^^ zymRZ;tvCPUKX1MB{-^iW#xMWqwb$QxE z*M9u`wb{wj+DII(e=dLX<>#M%^6^I>y!XeqZoT#PyYGK|d*S}0aP-XV6hO;c(h8!<|89Qn>aT& z|J(~ddJ!D{#IcTvyVRb^ZOrtdiySfS!1JP<71i_AqK_R#95N$^0oQ->z8LI zC$tf^E*~#Hf4H}>05Kj*`S{VphYy#Rm+`+xE30d<7(0FD?BwLR$;q>4&z_kW18)g) zj~`*o{cpbh@;0?QB+!H9#~?O-W|Gu}@n_DQo*18)NamkCGft$|R#%oEK0w3jk5^Zv zTw9Oh_4W0{gP^@JjGjDq0qxvrTr{jcdidbpH{U>0e_-Y@+R7uEejl2HUDp9RXedp&V@#>Y@FW&;;?e{0QV$ z#o>8&3w);_K^JD%nv*enNX> zA$YhZe`y|3iup*w95F+zjkcO-b4H50Pm+@?Yin)B))N+iMI&OA763IAZEJ}R=tL_} z6oqlp7iw4BFCL z);iyGon6^{mCY##l}%Z8{wqDSEUL zQ5usQ6ZOe5+sAa{D@<%)2mpW8Sfty;3GT+oX%(TdVZBR*zR6;B7g(9<9 zi(bz4Qk`|yY`1u)#&T+Ix#0#DH}TBcB|r=jHP?gILkK5cGpiuzvvhJr?j5| zLb|nW1edK@;Hp7&T^>2bcB|9?v#;l0N9YtUYQ^V|AuhwWzm+UGY`c$_J4 zh>@NS(FTO=D#U*EyWat^*9k=&azHrIlK&XJc$YiB+1|SZfb9X{cn1(h*bf;kxSIvG zQrHMf87k%%^NaaMYkmh1j&&{>2pz7llk`QN&g;@UEYN3PBO1XNB5b(gZ96k{R|Lz4iJ70K={8c5vBly0uTmSzW{{8Eq@LW+LsLE zus=)&o$S1ve}D`Y{qMAYtOsBf{r&Bq>H>^BK+rv)JfLiKPpEr*-k!S|p92IX2MFJt z0*e0O>MMo)hr6EvLW&**APjeZ*a2Z=$mP!g!ifZb5KiP2()l>s0WrwgGkZ?I_hYl+ zmR}ii`G?*9IY3C>hGL?14}n3EqaLvSdz~NMXZ{Y_|9YO!03mJpcNvPO3`M`_4_QA0glr$eG4>L` z;J?{c6LxbAc8vXP0w!CX7Xz*@daU1TJ|XlV^warIPM;4bKOa#3UVSm3enb!br~|IA z4ygZL{m}vW8|}g0LHl1HfN*>$06`s)zB(X({Zj+dKef+*u-^`Q*a7kQfczcr!QXzz z*B$~wdmq9Hc8dK?a`)gQ`zvctIF{^?J_IGrKKE1k)0ag~vfmH6{KIGeQ%r1Wf6m5+ zLjD{er27z#Coe!>U{87vA)Wu^3~5Z+Fn{ygk~^OlUFQ#6!F~2A18A(&`CGq;pU%&J z`f68S>*{x}ue9v{r2H#|{Rir+1L|)N0U_OoP*ey-g)qz&!m!&v2MFmtgac=&=pS%~ z%Jv~-fKX){$G6Y_zQ_4u{*%t9JqX!+)^&b+`wiSr0O5H1YY5q6$L_(!adA8p$5}w+ zeh>MenJSKp<}5=z)A~1mKe*@@{i6Sr_cK69Go*%#=TTNg|K$xg6%Gx< zhrEB_A2=AWFB1Ew$N8HohlRhx-aqR0&jA9@0YZAR0EFRl2)fH!0K${^kGlPHfN;D3 zggxjVb%!Vb;b_~RHkh446w`}ow2wqh`uX!GHuUMacfOwkg!Wy8!=>P&U-XNA{&(1K z-(^qtsTGf%isKQQ|Wj|pursNWXECm$FQgNIUr8#GylEl4!VwdK!73k$dUJIodE*k zco7gqK*Xi5Aqct$7yY7N^q=y61_%@EgzUSpyJv`Q+n?A$A%iNc*ZhM1&h+~V&>pg(K@F>LY=+|K|ZyUShx z!qZFtX%C2Dmwyid;Y0@zP9|ITe!t2DDI39}QEFjWsxL5Ck(&l=>p56582b;&Fn*`G1Qtr5#JHC)RzQG3J zr@!%o>tVl-4;!C*#n0ZZ(}!PW0g-M@X*EBP`5+OUz{+kZKX>c#f8BO`p4M*0A4UF^ZPr(F{O89g z+wgyE8~(Rj|JW}0$9d-W2HtTCS{_|tRHvB8w@V}e&w;P|Q PwVUxrk$?98{2`KT^Ehrh delta 69601 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 DRM<@{ From c1e26ee749a2b618cf0845225a4d408599f700b3 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 19 Jan 2023 00:37:37 -0500 Subject: [PATCH 27/31] fix more possible crashes when deleting ins and added a fatal error if implementation is missing --- src/engine/platform/abstract.cpp | 4 +++- src/engine/platform/arcade.cpp | 6 ++++++ src/engine/platform/arcade.h | 1 + src/engine/platform/dummy.cpp | 4 ++++ src/engine/platform/dummy.h | 1 + src/engine/platform/genesis.h | 2 +- src/engine/platform/genesisext.cpp | 7 +++++++ src/engine/platform/genesisext.h | 1 + src/engine/platform/msm6258.cpp | 3 +++ src/engine/platform/msm6295.cpp | 3 +++ src/engine/platform/opl.cpp | 3 +++ src/engine/platform/opll.cpp | 3 +++ src/engine/platform/qsound.cpp | 6 +++--- src/engine/platform/segapcm.cpp | 6 ++++++ src/engine/platform/segapcm.h | 1 + src/engine/platform/tx81z.cpp | 6 ++++++ src/engine/platform/tx81z.h | 1 + src/engine/platform/vera.cpp | 2 +- src/engine/platform/ym2203.cpp | 3 +++ src/engine/platform/ym2203.h | 2 +- src/engine/platform/ym2203ext.cpp | 7 +++++++ src/engine/platform/ym2203ext.h | 1 + src/engine/platform/ym2608.cpp | 6 ++++++ src/engine/platform/ym2608.h | 2 +- src/engine/platform/ym2608ext.cpp | 7 +++++++ src/engine/platform/ym2608ext.h | 1 + src/engine/platform/ym2610.cpp | 6 ++++++ src/engine/platform/ym2610.h | 2 +- src/engine/platform/ym2610b.cpp | 6 ++++++ src/engine/platform/ym2610b.h | 2 +- src/engine/platform/ym2610bext.cpp | 7 +++++++ src/engine/platform/ym2610bext.h | 1 + src/engine/platform/ym2610ext.cpp | 7 +++++++ src/engine/platform/ym2610ext.h | 1 + 34 files changed, 111 insertions(+), 10 deletions(-) diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index 21415725..bd3efa72 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -18,6 +18,7 @@ */ #include "../dispatch.h" +#include "../../ta-log.h" void DivDispatch::acquire(short** buf, size_t len) { } @@ -121,7 +122,8 @@ void DivDispatch::notifyWaveChange(int ins) { } void DivDispatch::notifyInsDeletion(void* ins) { - + logE("notifyInsDeletion NOT implemented!"); + abort(); } void DivDispatch::notifyPlaybackStop() { diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 1984e5a1..7251ef90 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -800,6 +800,12 @@ void DivPlatformArcade::notifyInsChange(int ins) { } } +void DivPlatformArcade::notifyInsDeletion(void* ins) { + for (int i=0; i<8; i++) { + chan[i].std.notifyInsDeletion((DivInstrument*)ins); + } +} + void* DivPlatformArcade::getChanState(int ch) { return &chan[ch]; } diff --git a/src/engine/platform/arcade.h b/src/engine/platform/arcade.h index 0bbd9b2c..45c2e6b5 100644 --- a/src/engine/platform/arcade.h +++ b/src/engine/platform/arcade.h @@ -76,6 +76,7 @@ class DivPlatformArcade: public DivPlatformOPM { void muteChannel(int ch, bool mute); DivMacroInt* getChanMacroInt(int ch); void notifyInsChange(int ins); + void notifyInsDeletion(void* ins); void setFlags(const DivConfig& flags); int getOutputCount(); void setYMFM(bool use); diff --git a/src/engine/platform/dummy.cpp b/src/engine/platform/dummy.cpp index 28cb5d40..42ce1ad5 100644 --- a/src/engine/platform/dummy.cpp +++ b/src/engine/platform/dummy.cpp @@ -131,6 +131,10 @@ int DivPlatformDummy::dispatch(DivCommand c) { return 1; } +void DivPlatformDummy::notifyInsDeletion(void* ins) { + // nothing +} + void DivPlatformDummy::reset() { for (int i=0; i8)?12:0; } diff --git a/src/engine/platform/genesisext.h b/src/engine/platform/genesisext.h index 304f609f..67955adc 100644 --- a/src/engine/platform/genesisext.h +++ b/src/engine/platform/genesisext.h @@ -41,6 +41,7 @@ class DivPlatformGenesisExt: public DivPlatformGenesis { bool keyOffAffectsArp(int ch); bool keyOffAffectsPorta(int ch); void notifyInsChange(int ins); + void notifyInsDeletion(void* ins); int getPortaFloor(int ch); void setCSMChannel(unsigned char ch); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); diff --git a/src/engine/platform/msm6258.cpp b/src/engine/platform/msm6258.cpp index af1472af..7814d23e 100644 --- a/src/engine/platform/msm6258.cpp +++ b/src/engine/platform/msm6258.cpp @@ -353,6 +353,9 @@ void DivPlatformMSM6258::notifyInsChange(int ins) { } void DivPlatformMSM6258::notifyInsDeletion(void* ins) { + for (int i=0; i<1; i++) { + chan[i].std.notifyInsDeletion((DivInstrument*)ins); + } } void DivPlatformMSM6258::setFlags(const DivConfig& flags) { diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index bc41091c..60842900 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -326,6 +326,9 @@ void DivPlatformMSM6295::notifyInsChange(int ins) { } void DivPlatformMSM6295::notifyInsDeletion(void* ins) { + for (int i=0; i<4; i++) { + chan[i].std.notifyInsDeletion((DivInstrument*)ins); + } } const void* DivPlatformMSM6295::getSampleMem(int index) { diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 2c6c1590..855c56e1 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -1640,6 +1640,9 @@ void DivPlatformOPL::notifyInsChange(int ins) { } void DivPlatformOPL::notifyInsDeletion(void* ins) { + for (int i=0; inotifyInsDeletion(ins); + for (int i=0; i<3; i++) { + chan[i].std.notifyInsDeletion((DivInstrument*)ins); + } } void DivPlatformYM2203::setSkipRegisterWrites(bool value) { diff --git a/src/engine/platform/ym2203.h b/src/engine/platform/ym2203.h index 2f4da5b4..8b8c0d6b 100644 --- a/src/engine/platform/ym2203.h +++ b/src/engine/platform/ym2203.h @@ -73,7 +73,7 @@ class DivPlatformYM2203: public DivPlatformOPN { int getOutputCount(); bool keyOffAffectsArp(int ch); void notifyInsChange(int ins); - void notifyInsDeletion(void* ins); + virtual void notifyInsDeletion(void* ins); void setSkipRegisterWrites(bool val); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); diff --git a/src/engine/platform/ym2203ext.cpp b/src/engine/platform/ym2203ext.cpp index 701ae9e5..99d53357 100644 --- a/src/engine/platform/ym2203ext.cpp +++ b/src/engine/platform/ym2203ext.cpp @@ -641,6 +641,13 @@ void DivPlatformYM2203Ext::notifyInsChange(int ins) { } } +void DivPlatformYM2203Ext::notifyInsDeletion(void* ins) { + DivPlatformYM2203::notifyInsDeletion(ins); + for (int i=0; i<4; i++) { + opChan[i].std.notifyInsDeletion((DivInstrument*)ins); + } +} + int DivPlatformYM2203Ext::init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) { DivPlatformYM2203::init(parent,channels,sugRate,flags); for (int i=0; i<4; i++) { diff --git a/src/engine/platform/ym2203ext.h b/src/engine/platform/ym2203ext.h index 14535e2d..6d8bb0ba 100644 --- a/src/engine/platform/ym2203ext.h +++ b/src/engine/platform/ym2203ext.h @@ -39,6 +39,7 @@ class DivPlatformYM2203Ext: public DivPlatformYM2203 { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); void notifyInsChange(int ins); + void notifyInsDeletion(void* ins); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformYM2203Ext(); diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 15200232..08969eea 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -1458,6 +1458,12 @@ void DivPlatformYM2608::notifyInsChange(int ins) { void DivPlatformYM2608::notifyInsDeletion(void* ins) { ay->notifyInsDeletion(ins); + for (int i=0; i& wlist); diff --git a/src/engine/platform/ym2608ext.cpp b/src/engine/platform/ym2608ext.cpp index 0a6abe7a..e8e35cdc 100644 --- a/src/engine/platform/ym2608ext.cpp +++ b/src/engine/platform/ym2608ext.cpp @@ -679,6 +679,13 @@ void DivPlatformYM2608Ext::notifyInsChange(int ins) { } } +void DivPlatformYM2608Ext::notifyInsDeletion(void* ins) { + DivPlatformYM2608::notifyInsDeletion(ins); + for (int i=0; i<4; i++) { + opChan[i].std.notifyInsDeletion((DivInstrument*)ins); + } +} + int DivPlatformYM2608Ext::init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) { DivPlatformYM2608::init(parent,channels,sugRate,flags); for (int i=0; i<4; i++) { diff --git a/src/engine/platform/ym2608ext.h b/src/engine/platform/ym2608ext.h index 01afb361..e99518fb 100644 --- a/src/engine/platform/ym2608ext.h +++ b/src/engine/platform/ym2608ext.h @@ -39,6 +39,7 @@ class DivPlatformYM2608Ext: public DivPlatformYM2608 { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); void notifyInsChange(int ins); + void notifyInsDeletion(void* ins); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformYM2608Ext(); diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 48fa4ca0..5c62a491 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -1406,6 +1406,12 @@ void DivPlatformYM2610::notifyInsChange(int ins) { void DivPlatformYM2610::notifyInsDeletion(void* ins) { ay->notifyInsDeletion(ins); + for (int i=0; i& wlist); diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 875383e7..a8f2329e 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -1477,6 +1477,12 @@ void DivPlatformYM2610B::notifyInsChange(int ins) { void DivPlatformYM2610B::notifyInsDeletion(void* ins) { ay->notifyInsDeletion(ins); + for (int i=0; i& wlist); diff --git a/src/engine/platform/ym2610bext.cpp b/src/engine/platform/ym2610bext.cpp index c8d0b645..28563b20 100644 --- a/src/engine/platform/ym2610bext.cpp +++ b/src/engine/platform/ym2610bext.cpp @@ -670,6 +670,13 @@ void DivPlatformYM2610BExt::notifyInsChange(int ins) { } } +void DivPlatformYM2610BExt::notifyInsDeletion(void* ins) { + DivPlatformYM2610B::notifyInsDeletion(ins); + for (int i=0; i<4; i++) { + opChan[i].std.notifyInsDeletion((DivInstrument*)ins); + } +} + int DivPlatformYM2610BExt::init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) { DivPlatformYM2610B::init(parent,channels,sugRate,flags); for (int i=0; i<4; i++) { diff --git a/src/engine/platform/ym2610bext.h b/src/engine/platform/ym2610bext.h index c7764959..50bd5bad 100644 --- a/src/engine/platform/ym2610bext.h +++ b/src/engine/platform/ym2610bext.h @@ -39,6 +39,7 @@ class DivPlatformYM2610BExt: public DivPlatformYM2610B { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); void notifyInsChange(int ins); + void notifyInsDeletion(void* ins); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformYM2610BExt(); diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index 54bbd2b7..03442dc5 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -670,6 +670,13 @@ void DivPlatformYM2610Ext::notifyInsChange(int ins) { } } +void DivPlatformYM2610Ext::notifyInsDeletion(void* ins) { + DivPlatformYM2610::notifyInsDeletion(ins); + for (int i=0; i<4; i++) { + opChan[i].std.notifyInsDeletion((DivInstrument*)ins); + } +} + int DivPlatformYM2610Ext::init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) { DivPlatformYM2610::init(parent,channels,sugRate,flags); for (int i=0; i<4; i++) { diff --git a/src/engine/platform/ym2610ext.h b/src/engine/platform/ym2610ext.h index 5e78c53f..e4103338 100644 --- a/src/engine/platform/ym2610ext.h +++ b/src/engine/platform/ym2610ext.h @@ -39,6 +39,7 @@ class DivPlatformYM2610Ext: public DivPlatformYM2610 { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); void notifyInsChange(int ins); + void notifyInsDeletion(void* ins); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformYM2610Ext(); From 1b05fe577ddfef89c0676b549246df2a18a7b6b7 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 19 Jan 2023 02:23:05 -0500 Subject: [PATCH 28/31] OPN/2/A/B: Seamless Legato Ins Change --- src/engine/platform/genesis.cpp | 87 ++++++++++++++++++--------------- src/engine/platform/genesis.h | 1 + src/engine/platform/ym2203.cpp | 83 +++++++++++++++++-------------- src/engine/platform/ym2203.h | 2 + src/engine/platform/ym2608.cpp | 79 +++++++++++++++++------------- src/engine/platform/ym2608.h | 2 + src/engine/platform/ym2610.cpp | 79 +++++++++++++++++------------- src/engine/platform/ym2610.h | 2 + src/engine/platform/ym2610b.cpp | 79 +++++++++++++++++------------- src/engine/platform/ym2610b.h | 2 + 10 files changed, 238 insertions(+), 178 deletions(-) diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index c344e8ae..5cbed89e 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -569,6 +569,47 @@ void DivPlatformGenesis::muteChannel(int ch, bool mute) { rWrite(chanOffs[ch]+ADDR_LRAF,(IS_REALLY_MUTED(ch)?0:(chan[ch].pan<<6))|(chan[ch].state.fms&7)|((chan[ch].state.ams&3)<<4)); } +void DivPlatformGenesis::commitState(int ch, DivInstrument* ins) { + if (chan[ch].insChanged) { + chan[ch].state=ins->fm; + chan[ch].opMask= + (chan[ch].state.op[0].enable?1:0)| + (chan[ch].state.op[2].enable?2:0)| + (chan[ch].state.op[1].enable?4:0)| + (chan[ch].state.op[3].enable?8:0); + } + + for (int i=0; i<4; i++) { + unsigned short baseAddr=chanOffs[ch]|opOffs[i]; + DivInstrumentFM::Operator& op=chan[ch].state.op[i]; + if (isMuted[ch]) { + rWrite(baseAddr+ADDR_TL,127); + } else { + if (KVS(ch,i)) { + if (!chan[ch].active || chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } + } else { + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,op.tl); + } + } + } + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); + rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); + rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); + rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31); + rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); + rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15); + } + } + if (chan[ch].insChanged) { + rWrite(chanOffs[ch]+ADDR_FB_ALG,(chan[ch].state.alg&7)|(chan[ch].state.fb<<3)); + rWrite(chanOffs[ch]+ADDR_LRAF,(IS_REALLY_MUTED(ch)?0:(chan[ch].pan<<6))|(chan[ch].state.fms&7)|((chan[ch].state.ams&3)<<4)); + } +} + int DivPlatformGenesis::dispatch(DivCommand c) { switch (c.cmd) { case DIV_CMD_NOTE_ON: { @@ -651,49 +692,12 @@ int DivPlatformGenesis::dispatch(DivCommand c) { } if (c.chan>=6) break; - if (chan[c.chan].insChanged) { - chan[c.chan].state=ins->fm; - chan[c.chan].opMask= - (chan[c.chan].state.op[0].enable?1:0)| - (chan[c.chan].state.op[2].enable?2:0)| - (chan[c.chan].state.op[1].enable?4:0)| - (chan[c.chan].state.op[3].enable?8:0); - } - chan[c.chan].macroInit(ins); if (!chan[c.chan].std.vol.will) { chan[c.chan].outVol=chan[c.chan].vol; } - - for (int i=0; i<4; i++) { - unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; - DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; - if (isMuted[c.chan]) { - rWrite(baseAddr+ADDR_TL,127); - } else { - if (KVS(c.chan,i)) { - if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); - } - } else { - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,op.tl); - } - } - } - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); - rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); - rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); - rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31); - rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); - rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15); - } - } - if (chan[c.chan].insChanged) { - rWrite(chanOffs[c.chan]+ADDR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)); - rWrite(chanOffs[c.chan]+ADDR_LRAF,(IS_REALLY_MUTED(c.chan)?0:(chan[c.chan].pan<<6))|(chan[c.chan].state.fms&7)|((chan[c.chan].state.ams&3)<<4)); - } + + commitState(c.chan,ins); chan[c.chan].insChanged=false; if (c.value!=DIV_NOTE_NULL) { @@ -876,6 +880,11 @@ int DivPlatformGenesis::dispatch(DivCommand c) { } else if (c.chan>=5 && chan[c.chan].furnaceDac && chan[c.chan].dacMode) { chan[c.chan].baseFreq=parent->calcBaseFreq(1,1,c.value,false); } else { + if (chan[c.chan].insChanged) { + DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM); + commitState(c.chan,ins); + chan[c.chan].insChanged=false; + } chan[c.chan].baseFreq=NOTE_FNUM_BLOCK(c.value,11); } chan[c.chan].note=c.value; diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index f3032cf9..c420ac5d 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -92,6 +92,7 @@ class DivPlatformGenesis: public DivPlatformOPN { friend void putDispatchChan(void*,int,int); inline void processDAC(int iRate); + inline void commitState(int ch, DivInstrument* ins); void acquire_nuked(short** buf, size_t len); void acquire_ymfm(short** buf, size_t len); diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index b76a5adb..c2a547d8 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -474,6 +474,46 @@ void DivPlatformYM2203::tick(bool sysTick) { } } +void DivPlatformYM2203::commitState(int ch, DivInstrument* ins) { + if (chan[ch].insChanged) { + chan[ch].state=ins->fm; + chan[ch].opMask= + (chan[ch].state.op[0].enable?1:0)| + (chan[ch].state.op[2].enable?2:0)| + (chan[ch].state.op[1].enable?4:0)| + (chan[ch].state.op[3].enable?8:0); + } + + for (int i=0; i<4; i++) { + unsigned short baseAddr=chanOffs[ch]|opOffs[i]; + DivInstrumentFM::Operator& op=chan[ch].state.op[i]; + if (isMuted[ch]) { + rWrite(baseAddr+ADDR_TL,127); + } else { + if (KVS(ch,i)) { + if (!chan[ch].active || chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } + } else { + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,op.tl); + } + } + } + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); + rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); + rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); + rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31); + rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); + rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15); + } + } + if (chan[ch].insChanged) { + rWrite(chanOffs[ch]+ADDR_FB_ALG,(chan[ch].state.alg&7)|(chan[ch].state.fb<<3)); + } +} + int DivPlatformYM2203::dispatch(DivCommand c) { if (c.chan>2) { c.chan-=3; @@ -489,43 +529,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { } } - if (chan[c.chan].insChanged) { - chan[c.chan].state=ins->fm; - chan[c.chan].opMask= - (chan[c.chan].state.op[0].enable?1:0)| - (chan[c.chan].state.op[2].enable?2:0)| - (chan[c.chan].state.op[1].enable?4:0)| - (chan[c.chan].state.op[3].enable?8:0); - } - - for (int i=0; i<4; i++) { - unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; - DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; - if (isMuted[c.chan]) { - rWrite(baseAddr+ADDR_TL,127); - } else { - if (KVS(c.chan,i)) { - if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); - } - } else { - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,op.tl); - } - } - } - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); - rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); - rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); - rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31); - rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); - rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15); - } - } - if (chan[c.chan].insChanged) { - rWrite(chanOffs[c.chan]+ADDR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)); - } + commitState(c.chan,ins); chan[c.chan].insChanged=false; if (c.value!=DIV_NOTE_NULL) { @@ -616,6 +620,11 @@ int DivPlatformYM2203::dispatch(DivCommand c) { break; } case DIV_CMD_LEGATO: { + if (chan[c.chan].insChanged) { + DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM); + commitState(c.chan,ins); + chan[c.chan].insChanged=false; + } chan[c.chan].baseFreq=NOTE_FNUM_BLOCK(c.value,11); chan[c.chan].freqChanged=true; break; diff --git a/src/engine/platform/ym2203.h b/src/engine/platform/ym2203.h index 8b8c0d6b..503f470b 100644 --- a/src/engine/platform/ym2203.h +++ b/src/engine/platform/ym2203.h @@ -55,6 +55,8 @@ class DivPlatformYM2203: public DivPlatformOPN { friend void putDispatchChip(void*,int); + inline void commitState(int ch, DivInstrument* ins); + void acquire_combo(short** buf, size_t len); void acquire_ymfm(short** buf, size_t len); diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 08969eea..063b3870 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -789,6 +789,43 @@ void DivPlatformYM2608::tick(bool sysTick) { ay->getRegisterWrites().clear(); } +void DivPlatformYM2608::commitState(int ch, DivInstrument* ins) { + if (chan[ch].insChanged) { + chan[ch].state=ins->fm; + chan[ch].opMask= + (chan[ch].state.op[0].enable?1:0)| + (chan[ch].state.op[2].enable?2:0)| + (chan[ch].state.op[1].enable?4:0)| + (chan[ch].state.op[3].enable?8:0); + } + + for (int i=0; i<4; i++) { + unsigned short baseAddr=chanOffs[ch]|opOffs[i]; + DivInstrumentFM::Operator& op=chan[ch].state.op[i]; + if (KVS(ch,i)) { + if (!chan[ch].active || chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } + } else { + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,op.tl); + } + } + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); + rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); + rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); + rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31); + rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); + rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15); + } + } + if (chan[ch].insChanged) { + rWrite(chanOffs[ch]+ADDR_FB_ALG,(chan[ch].state.alg&7)|(chan[ch].state.fb<<3)); + rWrite(chanOffs[ch]+ADDR_LRAF,(isMuted[ch]?0:(chan[ch].pan<<6))|(chan[ch].state.fms&7)|((chan[ch].state.ams&3)<<4)); + } +} + int DivPlatformYM2608::dispatch(DivCommand c) { if (c.chan>5 && c.chan<9) { c.chan-=6; @@ -902,40 +939,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { } } - if (chan[c.chan].insChanged) { - chan[c.chan].state=ins->fm; - chan[c.chan].opMask= - (chan[c.chan].state.op[0].enable?1:0)| - (chan[c.chan].state.op[2].enable?2:0)| - (chan[c.chan].state.op[1].enable?4:0)| - (chan[c.chan].state.op[3].enable?8:0); - } - - for (int i=0; i<4; i++) { - unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; - DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; - if (KVS(c.chan,i)) { - if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); - } - } else { - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,op.tl); - } - } - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); - rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); - rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); - rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31); - rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); - rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15); - } - } - if (chan[c.chan].insChanged) { - rWrite(chanOffs[c.chan]+ADDR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)); - rWrite(chanOffs[c.chan]+ADDR_LRAF,(isMuted[c.chan]?0:(chan[c.chan].pan<<6))|(chan[c.chan].state.fms&7)|((chan[c.chan].state.ams&3)<<4)); - } + commitState(c.chan,ins); chan[c.chan].insChanged=false; if (c.value!=DIV_NOTE_NULL) { @@ -1063,6 +1067,13 @@ int DivPlatformYM2608::dispatch(DivCommand c) { break; case DIV_CMD_LEGATO: { if (c.chan==15 && !chan[c.chan].furnacePCM) break; + if (c.chan<=psgChanOffs) { + if (chan[c.chan].insChanged) { + DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM); + commitState(c.chan,ins); + chan[c.chan].insChanged=false; + } + } chan[c.chan].baseFreq=NOTE_OPNB(c.chan,c.value); chan[c.chan].freqChanged=true; break; diff --git a/src/engine/platform/ym2608.h b/src/engine/platform/ym2608.h index 8d41997f..f533497f 100644 --- a/src/engine/platform/ym2608.h +++ b/src/engine/platform/ym2608.h @@ -70,6 +70,8 @@ class DivPlatformYM2608: public DivPlatformOPN { friend void putDispatchChip(void*,int); + inline void commitState(int ch, DivInstrument* ins); + void acquire_combo(short** buf, size_t len); void acquire_ymfm(short** buf, size_t len); diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 5c62a491..ba1c9440 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -724,6 +724,43 @@ void DivPlatformYM2610::tick(bool sysTick) { ay->getRegisterWrites().clear(); } +void DivPlatformYM2610::commitState(int ch, DivInstrument* ins) { + if (chan[ch].insChanged) { + chan[ch].state=ins->fm; + chan[ch].opMask= + (chan[ch].state.op[0].enable?1:0)| + (chan[ch].state.op[2].enable?2:0)| + (chan[ch].state.op[1].enable?4:0)| + (chan[ch].state.op[3].enable?8:0); + } + + for (int i=0; i<4; i++) { + unsigned short baseAddr=chanOffs[ch]|opOffs[i]; + DivInstrumentFM::Operator& op=chan[ch].state.op[i]; + if (KVS(ch,i)) { + if (!chan[ch].active || chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } + } else { + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,op.tl); + } + } + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); + rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); + rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); + rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31); + rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); + rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15); + } + } + if (chan[ch].insChanged) { + rWrite(chanOffs[ch]+ADDR_FB_ALG,(chan[ch].state.alg&7)|(chan[ch].state.fb<<3)); + rWrite(chanOffs[ch]+ADDR_LRAF,(isMuted[ch]?0:(chan[ch].pan<<6))|(chan[ch].state.fms&7)|((chan[ch].state.ams&3)<<4)); + } +} + int DivPlatformYM2610::dispatch(DivCommand c) { if (c.chan>=psgChanOffs && c.chanfm; - chan[c.chan].opMask= - (chan[c.chan].state.op[0].enable?1:0)| - (chan[c.chan].state.op[2].enable?2:0)| - (chan[c.chan].state.op[1].enable?4:0)| - (chan[c.chan].state.op[3].enable?8:0); - } - - for (int i=0; i<4; i++) { - unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; - DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; - if (KVS(c.chan,i)) { - if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); - } - } else { - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,op.tl); - } - } - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); - rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); - rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); - rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31); - rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); - rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15); - } - } - if (chan[c.chan].insChanged) { - rWrite(chanOffs[c.chan]+ADDR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)); - rWrite(chanOffs[c.chan]+ADDR_LRAF,(isMuted[c.chan]?0:(chan[c.chan].pan<<6))|(chan[c.chan].state.fms&7)|((chan[c.chan].state.ams&3)<<4)); - } + commitState(c.chan,ins); chan[c.chan].insChanged=false; if (c.value!=DIV_NOTE_NULL) { @@ -1039,6 +1043,13 @@ int DivPlatformYM2610::dispatch(DivCommand c) { break; case DIV_CMD_LEGATO: { if (c.chan==adpcmBChanOffs && !chan[c.chan].furnacePCM) break; + if (c.chan<=psgChanOffs) { + if (chan[c.chan].insChanged) { + DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM); + commitState(c.chan,ins); + chan[c.chan].insChanged=false; + } + } chan[c.chan].baseFreq=NOTE_OPNB(c.chan,c.value); chan[c.chan].freqChanged=true; break; diff --git a/src/engine/platform/ym2610.h b/src/engine/platform/ym2610.h index bdf92dd5..3c95e2fb 100644 --- a/src/engine/platform/ym2610.h +++ b/src/engine/platform/ym2610.h @@ -38,6 +38,8 @@ class DivPlatformYM2610: public DivPlatformYM2610Base { friend void putDispatchChip(void*,int); + void commitState(int ch, DivInstrument* ins); + void acquire_combo(short** buf, size_t len); void acquire_ymfm(short** buf, size_t len); diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index a8f2329e..39285d65 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -791,6 +791,43 @@ void DivPlatformYM2610B::tick(bool sysTick) { ay->getRegisterWrites().clear(); } +void DivPlatformYM2610B::commitState(int ch, DivInstrument* ins) { + if (chan[ch].insChanged) { + chan[ch].state=ins->fm; + chan[ch].opMask= + (chan[ch].state.op[0].enable?1:0)| + (chan[ch].state.op[2].enable?2:0)| + (chan[ch].state.op[1].enable?4:0)| + (chan[ch].state.op[3].enable?8:0); + } + + for (int i=0; i<4; i++) { + unsigned short baseAddr=chanOffs[ch]|opOffs[i]; + DivInstrumentFM::Operator& op=chan[ch].state.op[i]; + if (KVS(ch,i)) { + if (!chan[ch].active || chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } + } else { + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,op.tl); + } + } + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); + rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); + rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); + rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31); + rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); + rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15); + } + } + if (chan[ch].insChanged) { + rWrite(chanOffs[ch]+ADDR_FB_ALG,(chan[ch].state.alg&7)|(chan[ch].state.fb<<3)); + rWrite(chanOffs[ch]+ADDR_LRAF,(isMuted[ch]?0:(chan[ch].pan<<6))|(chan[ch].state.fms&7)|((chan[ch].state.ams&3)<<4)); + } +} + int DivPlatformYM2610B::dispatch(DivCommand c) { if (c.chan>=psgChanOffs && c.chanfm; - chan[c.chan].opMask= - (chan[c.chan].state.op[0].enable?1:0)| - (chan[c.chan].state.op[2].enable?2:0)| - (chan[c.chan].state.op[1].enable?4:0)| - (chan[c.chan].state.op[3].enable?8:0); - } - - for (int i=0; i<4; i++) { - unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; - DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; - if (KVS(c.chan,i)) { - if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); - } - } else { - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,op.tl); - } - } - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); - rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); - rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); - rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31); - rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); - rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15); - } - } - if (chan[c.chan].insChanged) { - rWrite(chanOffs[c.chan]+ADDR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)); - rWrite(chanOffs[c.chan]+ADDR_LRAF,(isMuted[c.chan]?0:(chan[c.chan].pan<<6))|(chan[c.chan].state.fms&7)|((chan[c.chan].state.ams&3)<<4)); - } + commitState(c.chan,ins); chan[c.chan].insChanged=false; if (c.value!=DIV_NOTE_NULL) { @@ -1106,6 +1110,13 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { break; case DIV_CMD_LEGATO: { if (c.chan==adpcmBChanOffs && !chan[c.chan].furnacePCM) break; + if (c.chan<=psgChanOffs) { + if (chan[c.chan].insChanged) { + DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM); + commitState(c.chan,ins); + chan[c.chan].insChanged=false; + } + } chan[c.chan].baseFreq=NOTE_OPNB(c.chan,c.value); chan[c.chan].freqChanged=true; break; diff --git a/src/engine/platform/ym2610b.h b/src/engine/platform/ym2610b.h index 7f0bad81..1e66b03f 100644 --- a/src/engine/platform/ym2610b.h +++ b/src/engine/platform/ym2610b.h @@ -34,6 +34,8 @@ class DivPlatformYM2610B: public DivPlatformYM2610Base { friend void putDispatchChip(void*,int); + void commitState(int ch, DivInstrument* ins); + void acquire_combo(short** buf, size_t len); void acquire_ymfm(short** buf, size_t len); From 6832f92b994515d7fefe7a69e42118336da44fdb Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 19 Jan 2023 02:28:12 -0500 Subject: [PATCH 29/31] OPM/OPZ: Seamless Legato Ins Change --- src/engine/platform/arcade.cpp | 83 +++++++++++++++++-------------- src/engine/platform/arcade.h | 1 + src/engine/platform/tx81z.cpp | 89 +++++++++++++++++++--------------- src/engine/platform/tx81z.h | 1 + 4 files changed, 97 insertions(+), 77 deletions(-) diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 7251ef90..dece6b67 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -382,53 +382,57 @@ void DivPlatformArcade::muteChannel(int ch, bool mute) { } } +void DivPlatformArcade::commitState(int ch, DivInstrument* ins) { + if (chan[ch].insChanged) { + chan[ch].state=ins->fm; + chan[ch].opMask= + (chan[ch].state.op[0].enable?1:0)| + (chan[ch].state.op[2].enable?2:0)| + (chan[ch].state.op[1].enable?4:0)| + (chan[ch].state.op[3].enable?8:0); + } + + for (int i=0; i<4; i++) { + unsigned short baseAddr=chanOffs[ch]|opOffs[i]; + DivInstrumentFM::Operator op=chan[ch].state.op[i]; + if (KVS(ch,i)) { + if (!chan[ch].active || chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } + } else { + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,op.tl); + } + } + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); + rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); + rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); + rWrite(baseAddr+ADDR_DT2_D2R,(op.d2r&31)|(op.dt2<<6)); + rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); + } + } + if (chan[ch].insChanged) { + if (isMuted[ch]) { + rWrite(chanOffs[ch]+ADDR_LR_FB_ALG,(chan[ch].state.alg&7)|(chan[ch].state.fb<<3)); + } else { + rWrite(chanOffs[ch]+ADDR_LR_FB_ALG,(chan[ch].state.alg&7)|(chan[ch].state.fb<<3)|((chan[ch].chVolL&1)<<6)|((chan[ch].chVolR&1)<<7)); + } + rWrite(chanOffs[ch]+ADDR_FMS_AMS,((chan[ch].state.fms&7)<<4)|(chan[ch].state.ams&3)); + } +} + int DivPlatformArcade::dispatch(DivCommand c) { switch (c.cmd) { case DIV_CMD_NOTE_ON: { DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM); - if (chan[c.chan].insChanged) { - chan[c.chan].state=ins->fm; - chan[c.chan].opMask= - (chan[c.chan].state.op[0].enable?1:0)| - (chan[c.chan].state.op[2].enable?2:0)| - (chan[c.chan].state.op[1].enable?4:0)| - (chan[c.chan].state.op[3].enable?8:0); - } - chan[c.chan].macroInit(ins); if (!chan[c.chan].std.vol.will) { chan[c.chan].outVol=chan[c.chan].vol; } - for (int i=0; i<4; i++) { - unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; - DivInstrumentFM::Operator op=chan[c.chan].state.op[i]; - if (KVS(c.chan,i)) { - if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); - } - } else { - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,op.tl); - } - } - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); - rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); - rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); - rWrite(baseAddr+ADDR_DT2_D2R,(op.d2r&31)|(op.dt2<<6)); - rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); - } - } - if (chan[c.chan].insChanged) { - if (isMuted[c.chan]) { - rWrite(chanOffs[c.chan]+ADDR_LR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)); - } else { - rWrite(chanOffs[c.chan]+ADDR_LR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)|((chan[c.chan].chVolL&1)<<6)|((chan[c.chan].chVolR&1)<<7)); - } - rWrite(chanOffs[c.chan]+ADDR_FMS_AMS,((chan[c.chan].state.fms&7)<<4)|(chan[c.chan].state.ams&3)); - } + commitState(c.chan,ins); chan[c.chan].insChanged=false; if (c.value!=DIV_NOTE_NULL) { @@ -521,6 +525,11 @@ int DivPlatformArcade::dispatch(DivCommand c) { break; } case DIV_CMD_LEGATO: { + if (chan[c.chan].insChanged) { + DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_OPM); + commitState(c.chan,ins); + chan[c.chan].insChanged=false; + } chan[c.chan].baseFreq=NOTE_LINEAR(c.value); chan[c.chan].freqChanged=true; break; diff --git a/src/engine/platform/arcade.h b/src/engine/platform/arcade.h index 45c2e6b5..f571ff34 100644 --- a/src/engine/platform/arcade.h +++ b/src/engine/platform/arcade.h @@ -57,6 +57,7 @@ class DivPlatformArcade: public DivPlatformOPM { int octave(int freq); int toFreq(int freq); + void commitState(int ch, DivInstrument* ins); void acquire_nuked(short** buf, size_t len); void acquire_ymfm(short** buf, size_t len); diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index 12e724c6..09a75cac 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -350,56 +350,60 @@ void DivPlatformTX81Z::muteChannel(int ch, bool mute) { } } +void DivPlatformTX81Z::commitState(int ch, DivInstrument* ins) { + if (chan[ch].insChanged) { + chan[ch].state=ins->fm; + } + + for (int i=0; i<4; i++) { + unsigned short baseAddr=chanOffs[ch]|opOffs[i]; + DivInstrumentFM::Operator op=chan[ch].state.op[i]; + if (isMuted[ch]) { + rWrite(baseAddr+ADDR_TL,127); + } else { + if (KVS(ch,i)) { + if (!chan[ch].active || chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } + } else { + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,op.tl); + } + } + } + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|((op.egt?(op.dt&7):dtTable[op.dt&7])<<4)); + rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.egt<<5)|(op.rs<<6)); + rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); + rWrite(baseAddr+ADDR_DT2_D2R,(op.d2r&31)|(op.dt2<<6)); + rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); + rWrite(baseAddr+ADDR_WS_FINE,(op.dvb&15)|(op.ws<<4)); + rWrite(baseAddr+ADDR_EGS_REV,(op.dam&7)|(op.ksl<<6)); + } + } + if (chan[ch].insChanged) { + /* + if (isMuted[ch]) { + rWrite(chanOffs[ch]+ADDR_LR_FB_ALG,(chan[ch].state.alg&7)|(chan[ch].state.fb<<3)); + } else { + rWrite(chanOffs[ch]+ADDR_LR_FB_ALG,(chan[ch].state.alg&7)|(chan[ch].state.fb<<3)|((chan[ch].chVolL&1)<<6)|((chan[ch].chVolR&1)<<7)); + }*/ + rWrite(chanOffs[ch]+ADDR_FMS_AMS,((chan[ch].state.fms&7)<<4)|(chan[ch].state.ams&3)); + //rWrite(chanOffs[ch]+ADDR_FMS_AMS,0x84|((chan[ch].state.fms2&7)<<4)|(chan[ch].state.ams2&3)); + } +} + int DivPlatformTX81Z::dispatch(DivCommand c) { switch (c.cmd) { case DIV_CMD_NOTE_ON: { DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_OPZ); - if (chan[c.chan].insChanged) { - chan[c.chan].state=ins->fm; - } - chan[c.chan].macroInit(ins); if (!chan[c.chan].std.vol.will) { chan[c.chan].outVol=chan[c.chan].vol; } - for (int i=0; i<4; i++) { - unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; - DivInstrumentFM::Operator op=chan[c.chan].state.op[i]; - if (isMuted[c.chan]) { - rWrite(baseAddr+ADDR_TL,127); - } else { - if (KVS(c.chan,i)) { - if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); - } - } else { - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,op.tl); - } - } - } - if (chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|((op.egt?(op.dt&7):dtTable[op.dt&7])<<4)); - rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.egt<<5)|(op.rs<<6)); - rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7)); - rWrite(baseAddr+ADDR_DT2_D2R,(op.d2r&31)|(op.dt2<<6)); - rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); - rWrite(baseAddr+ADDR_WS_FINE,(op.dvb&15)|(op.ws<<4)); - rWrite(baseAddr+ADDR_EGS_REV,(op.dam&7)|(op.ksl<<6)); - } - } - if (chan[c.chan].insChanged) { - /* - if (isMuted[c.chan]) { - rWrite(chanOffs[c.chan]+ADDR_LR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)); - } else { - rWrite(chanOffs[c.chan]+ADDR_LR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)|((chan[c.chan].chVolL&1)<<6)|((chan[c.chan].chVolR&1)<<7)); - }*/ - rWrite(chanOffs[c.chan]+ADDR_FMS_AMS,((chan[c.chan].state.fms&7)<<4)|(chan[c.chan].state.ams&3)); - //rWrite(chanOffs[c.chan]+ADDR_FMS_AMS,0x84|((chan[c.chan].state.fms2&7)<<4)|(chan[c.chan].state.ams2&3)); - } + commitState(c.chan,ins); chan[c.chan].insChanged=false; if (c.value!=DIV_NOTE_NULL) { @@ -498,6 +502,11 @@ int DivPlatformTX81Z::dispatch(DivCommand c) { break; } case DIV_CMD_LEGATO: { + if (chan[c.chan].insChanged) { + DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_OPZ); + commitState(c.chan,ins); + chan[c.chan].insChanged=false; + } chan[c.chan].baseFreq=NOTE_LINEAR(c.value); chan[c.chan].freqChanged=true; break; diff --git a/src/engine/platform/tx81z.h b/src/engine/platform/tx81z.h index 68c9922b..928fa546 100644 --- a/src/engine/platform/tx81z.h +++ b/src/engine/platform/tx81z.h @@ -57,6 +57,7 @@ class DivPlatformTX81Z: public DivPlatformOPM { int octave(int freq); int toFreq(int freq); + void commitState(int ch, DivInstrument* ins); friend void putDispatchChip(void*,int); public: From 9bbc1e2c82a1af07695e4d47726200e61806458a Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 19 Jan 2023 02:45:02 -0500 Subject: [PATCH 30/31] OPLL/OPL: Seamless Legato Ins Change --- src/engine/platform/opl.cpp | 215 ++++++++++++++++++----------------- src/engine/platform/opl.h | 1 + src/engine/platform/opll.cpp | 101 +++++++++------- src/engine/platform/opll.h | 1 + 4 files changed, 172 insertions(+), 146 deletions(-) diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 855c56e1..014f2a40 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -689,6 +689,112 @@ void DivPlatformOPL::muteChannel(int ch, bool mute) { } } +void DivPlatformOPL::commitState(int ch, DivInstrument* ins) { + if (chan[ch].insChanged) { + if (ch>melodicChans && ins->type==DIV_INS_OPL_DRUMS) { + for (int i=0; i<4; i++) { + chan[melodicChans+i+1].state.alg=ins->fm.alg; + chan[melodicChans+i+1].state.fb=ins->fm.fb; + chan[melodicChans+i+1].state.opllPreset=ins->fm.opllPreset; + chan[melodicChans+i+1].state.fixedDrums=ins->fm.fixedDrums; + chan[melodicChans+i+1].state.kickFreq=ins->fm.kickFreq; + chan[melodicChans+i+1].state.snareHatFreq=ins->fm.snareHatFreq; + chan[melodicChans+i+1].state.tomTopFreq=ins->fm.tomTopFreq; + chan[melodicChans+i+1].state.op[0]=ins->fm.op[i]; + } + } else { + chan[ch].state=ins->fm; + } + } + + if (chan[ch].insChanged) { + if (ch>melodicChans && ins->type==DIV_INS_OPL_DRUMS) { + for (int i=0; i<4; i++) { + int ch=melodicChans+1+i; + unsigned char slot=slots[0][ch]; + if (slot==255) continue; + unsigned short baseAddr=slotMap[slot]; + DivInstrumentFM::Operator& op=chan[ch].state.op[0]; + chan[ch].fourOp=false; + + if (isMuted[ch]) { + rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); + } else { + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); + } + + rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,(op.am<<7)|(op.vib<<6)|(op.sus<<5)|(op.ksr<<4)|op.mult); + rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|op.dr); + rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|op.rr); + if (oplType>1) { + rWrite(baseAddr+ADDR_WS,op.ws&((oplType==3)?7:3)); + } + + if (isMuted[ch]) { + oldWrites[chanMap[ch]+ADDR_LR_FB_ALG]=-1; + rWrite(chanMap[ch]+ADDR_LR_FB_ALG,(chan[ch].state.alg&1)|(chan[ch].state.fb<<1)); + } else { + oldWrites[chanMap[ch]+ADDR_LR_FB_ALG]=-1; + rWrite(chanMap[ch]+ADDR_LR_FB_ALG,(chan[ch].state.alg&1)|(chan[ch].state.fb<<1)|((chan[ch].pan&15)<<4)); + } + } + } else { + int ops=(slots[3][ch]!=255 && chan[ch].state.ops==4 && oplType==3)?4:2; + chan[ch].fourOp=(ops==4); + if (chan[ch].fourOp) { + /* + if (chan[ch+1].active) { + chan[ch+1].keyOff=true; + chan[ch+1].keyOn=false; + chan[ch+1].active=false; + }*/ + chan[ch+1].insChanged=true; + chan[ch+1].macroInit(NULL); + } + update4OpMask=true; + for (int i=0; imelodicChans) { + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); + } else { + rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); + } + } + + rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,(op.am<<7)|(op.vib<<6)|(op.sus<<5)|(op.ksr<<4)|op.mult); + rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|op.dr); + rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|op.rr); + if (oplType>1) { + rWrite(baseAddr+ADDR_WS,op.ws&((oplType==3)?7:3)); + } + } + + if (isMuted[ch]) { + oldWrites[chanMap[ch]+ADDR_LR_FB_ALG]=-1; + rWrite(chanMap[ch]+ADDR_LR_FB_ALG,(chan[ch].state.alg&1)|(chan[ch].state.fb<<1)); + if (ops==4) { + oldWrites[chanMap[ch+1]+ADDR_LR_FB_ALG]=-1; + rWrite(chanMap[ch+1]+ADDR_LR_FB_ALG,((chan[ch].state.alg>>1)&1)|(chan[ch].state.fb<<1)); + } + } else { + oldWrites[chanMap[ch]+ADDR_LR_FB_ALG]=-1; + rWrite(chanMap[ch]+ADDR_LR_FB_ALG,(chan[ch].state.alg&1)|(chan[ch].state.fb<<1)|((chan[ch].pan&15)<<4)); + if (ops==4) { + oldWrites[chanMap[ch+1]+ADDR_LR_FB_ALG]=-1; + rWrite(chanMap[ch+1]+ADDR_LR_FB_ALG,((chan[ch].state.alg>>1)&1)|(chan[ch].state.fb<<1)|((chan[ch].pan&15)<<4)); + } + } + } + } +} + int DivPlatformOPL::dispatch(DivCommand c) { if (c.chan>=totalChans && c.chan!=adpcmChan) return 0; // ineffective in 4-op mode @@ -771,114 +877,12 @@ int DivPlatformOPL::dispatch(DivCommand c) { } DivInstrument* ins=parent->getIns(chan[c.chan].ins,c.chan>melodicChans?DIV_INS_OPL_DRUMS:DIV_INS_OPL); - if (chan[c.chan].insChanged) { - if (c.chan>melodicChans && ins->type==DIV_INS_OPL_DRUMS) { - for (int i=0; i<4; i++) { - chan[melodicChans+i+1].state.alg=ins->fm.alg; - chan[melodicChans+i+1].state.fb=ins->fm.fb; - chan[melodicChans+i+1].state.opllPreset=ins->fm.opllPreset; - chan[melodicChans+i+1].state.fixedDrums=ins->fm.fixedDrums; - chan[melodicChans+i+1].state.kickFreq=ins->fm.kickFreq; - chan[melodicChans+i+1].state.snareHatFreq=ins->fm.snareHatFreq; - chan[melodicChans+i+1].state.tomTopFreq=ins->fm.tomTopFreq; - chan[melodicChans+i+1].state.op[0]=ins->fm.op[i]; - } - } else { - chan[c.chan].state=ins->fm; - } - } - chan[c.chan].macroInit(ins); if (!chan[c.chan].std.vol.will) { chan[c.chan].outVol=chan[c.chan].vol; } - if (chan[c.chan].insChanged) { - if (c.chan>melodicChans && ins->type==DIV_INS_OPL_DRUMS) { - for (int i=0; i<4; i++) { - int ch=melodicChans+1+i; - unsigned char slot=slots[0][ch]; - if (slot==255) continue; - unsigned short baseAddr=slotMap[slot]; - DivInstrumentFM::Operator& op=chan[ch].state.op[0]; - chan[ch].fourOp=false; - if (isMuted[ch]) { - rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); - } else { - rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); - } - - rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,(op.am<<7)|(op.vib<<6)|(op.sus<<5)|(op.ksr<<4)|op.mult); - rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|op.dr); - rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|op.rr); - if (oplType>1) { - rWrite(baseAddr+ADDR_WS,op.ws&((oplType==3)?7:3)); - } - - if (isMuted[ch]) { - oldWrites[chanMap[ch]+ADDR_LR_FB_ALG]=-1; - rWrite(chanMap[ch]+ADDR_LR_FB_ALG,(chan[ch].state.alg&1)|(chan[ch].state.fb<<1)); - } else { - oldWrites[chanMap[ch]+ADDR_LR_FB_ALG]=-1; - rWrite(chanMap[ch]+ADDR_LR_FB_ALG,(chan[ch].state.alg&1)|(chan[ch].state.fb<<1)|((chan[ch].pan&15)<<4)); - } - } - } else { - int ops=(slots[3][c.chan]!=255 && chan[c.chan].state.ops==4 && oplType==3)?4:2; - chan[c.chan].fourOp=(ops==4); - if (chan[c.chan].fourOp) { - /* - if (chan[c.chan+1].active) { - chan[c.chan+1].keyOff=true; - chan[c.chan+1].keyOn=false; - chan[c.chan+1].active=false; - }*/ - chan[c.chan+1].insChanged=true; - chan[c.chan+1].macroInit(NULL); - } - update4OpMask=true; - for (int i=0; imelodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); - } else { - rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); - } - } - - rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,(op.am<<7)|(op.vib<<6)|(op.sus<<5)|(op.ksr<<4)|op.mult); - rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|op.dr); - rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|op.rr); - if (oplType>1) { - rWrite(baseAddr+ADDR_WS,op.ws&((oplType==3)?7:3)); - } - } - - if (isMuted[c.chan]) { - oldWrites[chanMap[c.chan]+ADDR_LR_FB_ALG]=-1; - rWrite(chanMap[c.chan]+ADDR_LR_FB_ALG,(chan[c.chan].state.alg&1)|(chan[c.chan].state.fb<<1)); - if (ops==4) { - oldWrites[chanMap[c.chan+1]+ADDR_LR_FB_ALG]=-1; - rWrite(chanMap[c.chan+1]+ADDR_LR_FB_ALG,((chan[c.chan].state.alg>>1)&1)|(chan[c.chan].state.fb<<1)); - } - } else { - oldWrites[chanMap[c.chan]+ADDR_LR_FB_ALG]=-1; - rWrite(chanMap[c.chan]+ADDR_LR_FB_ALG,(chan[c.chan].state.alg&1)|(chan[c.chan].state.fb<<1)|((chan[c.chan].pan&15)<<4)); - if (ops==4) { - oldWrites[chanMap[c.chan+1]+ADDR_LR_FB_ALG]=-1; - rWrite(chanMap[c.chan+1]+ADDR_LR_FB_ALG,((chan[c.chan].state.alg>>1)&1)|(chan[c.chan].state.fb<<1)|((chan[c.chan].pan&15)<<4)); - } - } - } - } - + commitState(c.chan,ins); chan[c.chan].insChanged=false; if (c.value!=DIV_NOTE_NULL) { @@ -1075,6 +1079,11 @@ int DivPlatformOPL::dispatch(DivCommand c) { iface.sampleBank=sampleBank; break; case DIV_CMD_LEGATO: { + if (chan[c.chan].insChanged) { + DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM); + commitState(c.chan,ins); + chan[c.chan].insChanged=false; + } chan[c.chan].baseFreq=(c.chan==adpcmChan)?(NOTE_ADPCMB(c.value)):(NOTE_FREQUENCY(c.value)); chan[c.chan].note=c.value; chan[c.chan].freqChanged=true; diff --git a/src/engine/platform/opl.h b/src/engine/platform/opl.h index 5e6b5316..b5285701 100644 --- a/src/engine/platform/opl.h +++ b/src/engine/platform/opl.h @@ -100,6 +100,7 @@ class DivPlatformOPL: public DivDispatch { int octave(int freq); int toFreq(int freq); double NOTE_ADPCMB(int note); + void commitState(int ch, DivInstrument* ins); friend void putDispatchChip(void*,int); friend void putDispatchChan(void*,int,int); diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index 68cb58b0..a1011f60 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -19,6 +19,7 @@ #include "opll.h" #include "../engine.h" +#include "../../ta-log.h" #include #include @@ -331,6 +332,55 @@ void DivPlatformOPLL::muteChannel(int ch, bool mute) { isMuted[ch]=mute; } +void DivPlatformOPLL::commitState(int ch, DivInstrument* ins) { + if (chan[ch].insChanged) { + chan[ch].state=ins->fm; + } + + if (chan[ch].insChanged) { + // update custom preset + if (chan[ch].state.opllPreset==0) { + DivInstrumentFM::Operator& mod=chan[ch].state.op[0]; + DivInstrumentFM::Operator& car=chan[ch].state.op[1]; + rWrite(0x00,(mod.am<<7)|(mod.vib<<6)|((mod.ssgEnv&8)<<2)|(mod.ksr<<4)|(mod.mult)); + rWrite(0x01,(car.am<<7)|(car.vib<<6)|((car.ssgEnv&8)<<2)|(car.ksr<<4)|(car.mult)); + rWrite(0x02,(mod.ksl<<6)|(mod.tl&63)); + rWrite(0x03,(car.ksl<<6)|((chan[ch].state.fms&1)<<4)|((chan[ch].state.ams&1)<<3)|chan[ch].state.fb); + rWrite(0x04,(mod.ar<<4)|(mod.dr)); + rWrite(0x05,(car.ar<<4)|(car.dr)); + rWrite(0x06,(mod.sl<<4)|(mod.rr)); + rWrite(0x07,(car.sl<<4)|(car.rr)); + lastCustomMemory=ch; + } + if (chan[ch].state.opllPreset==16) { // compatible drums mode + if (ch>=6) { + drums=true; + immWrite(0x16,0x20); + immWrite(0x26,0x05); + immWrite(0x16,0x20); + immWrite(0x26,0x05); + immWrite(0x17,0x50); + immWrite(0x27,0x05); + immWrite(0x17,0x50); + immWrite(0x27,0x05); + immWrite(0x18,0xC0); + immWrite(0x28,0x01); + } + } else { + if (ch>=6) { + if (drums) { + drums=false; + immWrite(0x0e,0); + drumState=0; + } + } + if (ch<9) { + rWrite(0x30+ch,((15-VOL_SCALE_LOG_BROKEN(chan[ch].outVol,15-chan[ch].state.op[1].tl,15))&15)|(chan[ch].state.opllPreset<<4)); + } + } + } +} + int DivPlatformOPLL::dispatch(DivCommand c) { switch (c.cmd) { case DIV_CMD_NOTE_ON: { @@ -375,49 +425,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) { break; } - if (chan[c.chan].insChanged) { - // update custom preset - if (chan[c.chan].state.opllPreset==0) { - DivInstrumentFM::Operator& mod=chan[c.chan].state.op[0]; - DivInstrumentFM::Operator& car=chan[c.chan].state.op[1]; - rWrite(0x00,(mod.am<<7)|(mod.vib<<6)|((mod.ssgEnv&8)<<2)|(mod.ksr<<4)|(mod.mult)); - rWrite(0x01,(car.am<<7)|(car.vib<<6)|((car.ssgEnv&8)<<2)|(car.ksr<<4)|(car.mult)); - rWrite(0x02,(mod.ksl<<6)|(mod.tl&63)); - rWrite(0x03,(car.ksl<<6)|((chan[c.chan].state.fms&1)<<4)|((chan[c.chan].state.ams&1)<<3)|chan[c.chan].state.fb); - rWrite(0x04,(mod.ar<<4)|(mod.dr)); - rWrite(0x05,(car.ar<<4)|(car.dr)); - rWrite(0x06,(mod.sl<<4)|(mod.rr)); - rWrite(0x07,(car.sl<<4)|(car.rr)); - lastCustomMemory=c.chan; - } - if (chan[c.chan].state.opllPreset==16) { // compatible drums mode - if (c.chan>=6) { - drums=true; - immWrite(0x16,0x20); - immWrite(0x26,0x05); - immWrite(0x16,0x20); - immWrite(0x26,0x05); - immWrite(0x17,0x50); - immWrite(0x27,0x05); - immWrite(0x17,0x50); - immWrite(0x27,0x05); - immWrite(0x18,0xC0); - immWrite(0x28,0x01); - } - } else { - if (c.chan>=6) { - if (drums) { - drums=false; - immWrite(0x0e,0); - drumState=0; - } - } - if (c.chan<9) { - rWrite(0x30+c.chan,((15-VOL_SCALE_LOG_BROKEN(chan[c.chan].outVol,15-chan[c.chan].state.op[1].tl,15))&15)|(chan[c.chan].state.opllPreset<<4)); - } - } - } - + commitState(c.chan,ins); chan[c.chan].insChanged=false; if (c.value!=DIV_NOTE_NULL) { @@ -541,6 +549,13 @@ int DivPlatformOPLL::dispatch(DivCommand c) { } case DIV_CMD_LEGATO: { if (c.chan>=9 && !properDrums) return 0; + if (c.chan<6 || (!drums && !properDrums)) { + if (chan[c.chan].insChanged) { + DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_OPLL); + commitState(c.chan,ins); + chan[c.chan].insChanged=false; + } + } chan[c.chan].baseFreq=NOTE_FREQUENCY(c.value); chan[c.chan].note=c.value; chan[c.chan].freqChanged=true; diff --git a/src/engine/platform/opll.h b/src/engine/platform/opll.h index d36c119e..258113c4 100644 --- a/src/engine/platform/opll.h +++ b/src/engine/platform/opll.h @@ -73,6 +73,7 @@ class DivPlatformOPLL: public DivDispatch { int octave(int freq); int toFreq(int freq); + void commitState(int ch, DivInstrument* ins); friend void putDispatchChip(void*,int); friend void putDispatchChan(void*,int,int); From 3e43cdacd227511f66429669b65c007b8c4400e9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 19 Jan 2023 02:49:55 -0500 Subject: [PATCH 31/31] update Nuked-OPLL to latest version --- extern/Nuked-OPLL/opll.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/extern/Nuked-OPLL/opll.c b/extern/Nuked-OPLL/opll.c index bd59709a..e160ce05 100644 --- a/extern/Nuked-OPLL/opll.c +++ b/extern/Nuked-OPLL/opll.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Nuke.YKT + * Copyright (C) 2019-2023 Nuke.YKT * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -17,7 +17,7 @@ * siliconpr0n.org(digshadow, John McMaster): * VRC VII decap and die shot. * - * version: 1.0.1 + * version: 1.0.2 */ #include @@ -132,7 +132,7 @@ static const opll_patch_t patch_ds1001[opll_patch_max] = { { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x01, 0x00 },{ 0x00, 0x00 },{ 0x0c, 0x00 },{ 0x08, 0x00 },{ 0x0a, 0x00 },{ 0x07, 0x00 } }, { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x05, 0x00 },{ 0x00, 0x00 },{ 0x0f, 0x00 },{ 0x08, 0x00 },{ 0x05, 0x00 },{ 0x09, 0x00 } }, { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x01 },{ 0x00, 0x00 },{ 0x00, 0x0f },{ 0x00, 0x08 },{ 0x00, 0x06 },{ 0x00, 0x0d } }, - { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x01 },{ 0x00, 0x00 },{ 0x00, 0x0d },{ 0x00, 0x08 },{ 0x00, 0x06 },{ 0x00, 0x08 } }, + { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x01 },{ 0x00, 0x00 },{ 0x00, 0x0d },{ 0x00, 0x08 },{ 0x00, 0x04 },{ 0x00, 0x08 } }, { 0x00, 0x00, 0x00, 0x00,{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x00 },{ 0x00, 0x01 },{ 0x00, 0x00 },{ 0x00, 0x0a },{ 0x00, 0x0a },{ 0x00, 0x05 },{ 0x00, 0x05 } } }; @@ -1018,6 +1018,9 @@ static void OPLL_Operator(opll_t *chip) { } } + if (!(chip->rm_enable & 0x80)) + routput = 0; + chip->ch_out = ismod1 ? routput : (output>>3); if (!ismod1) {