From 1a27bf3373eee870aa9f0b70fac3081c707da206 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 15 Jan 2023 14:12:23 -0500 Subject: [PATCH 01/22] GUI: fix KSL values 1/2 being swapped in OPL --- src/gui/insEdit.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index c72958ed..7ac35345 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -352,6 +352,10 @@ const int detuneUnmap[2][11]={ {0, 0, 0, 3, 4, 5, 6, 7, 2, 1, 0} }; +const int kslMap[4]={ + 0, 2, 1, 3 +}; + // do not change these! // anything other than a checkbox will look ugly! // @@ -2778,7 +2782,11 @@ void FurnaceGUI::drawInsEdit() { if (ins->type==DIV_INS_FM || ins->type==DIV_INS_OPZ || ins->type==DIV_INS_OPM) { P(CWVSliderScalar("##RS",ImVec2(20.0f*dpiScale,sliderHeight),ImGuiDataType_U8,&op.rs,&_ZERO,&_THREE)); } else { - P(CWVSliderScalar("##KSL",ImVec2(20.0f*dpiScale,sliderHeight),ImGuiDataType_U8,&op.ksl,&_ZERO,&_THREE)); + int ksl=ins->type==DIV_INS_OPLL?op.ksl:kslMap[op.ksl&3]; + if (CWVSliderInt("##KSL",ImVec2(20.0f*dpiScale,sliderHeight),&ksl,0,3)) { + op.ksl=(ins->type==DIV_INS_OPLL?ksl:kslMap[ksl&3]); + PARAMETER; + } } if (ins->type==DIV_INS_OPZ) { @@ -3226,7 +3234,7 @@ void FurnaceGUI::drawInsEdit() { break; case DIV_INS_OPL: - case DIV_INS_OPL_DRUMS: + case DIV_INS_OPL_DRUMS: { // waveform drawWaveform(op.ws&7,ins->type==DIV_INS_OPZ,ImVec2(waveWidth,waveHeight)); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -3268,9 +3276,14 @@ void FurnaceGUI::drawInsEdit() { ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); snprintf(tempID,1024,"%s: %%d",FM_NAME(FM_KSL)); - P(CWSliderScalar("##KSL",ImGuiDataType_U8,&op.ksl,&_ZERO,&_THREE,tempID)); rightClickable + int ksl=kslMap[op.ksl&3]; + if (CWSliderInt("##KSL",&ksl,0,3,tempID)) { + op.ksl=kslMap[ksl&3]; + PARAMETER; + } rightClickable break; + } case DIV_INS_OPZ: { // waveform drawWaveform(op.ws&7,ins->type==DIV_INS_OPZ,ImVec2(waveWidth,waveHeight)); @@ -3613,7 +3626,11 @@ void FurnaceGUI::drawInsEdit() { ImGui::TableNextColumn(); ImGui::Text("%s",FM_NAME(FM_RS)); } else { - P(CWSliderScalar("##KSL",ImGuiDataType_U8,&op.ksl,&_ZERO,&_THREE)); rightClickable + int ksl=ins->type==DIV_INS_OPLL?op.ksl:kslMap[op.ksl&3]; + if (CWSliderInt("##KSL",&ksl,0,3)) { + op.ksl=(ins->type==DIV_INS_OPLL?ksl:kslMap[ksl&3]); + PARAMETER; + } rightClickable ImGui::TableNextColumn(); ImGui::Text("%s",FM_NAME(FM_KSL)); } From 3174638120ffe738d25b66347866a4934f9dff06 Mon Sep 17 00:00:00 2001 From: brickblock369 <59150779+brickblock369@users.noreply.github.com> Date: Sun, 15 Jan 2023 12:44:34 -0800 Subject: [PATCH 02/22] Request to add another OPL3 instrument to the repo (#928) * Adding another OPL instrument * Adding another OPL instrument Updated the SL from 6 to 5. --- instruments/OPL/2-OP OPL3 Slap Bass.fui | Bin 0 -> 101 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 instruments/OPL/2-OP OPL3 Slap Bass.fui diff --git a/instruments/OPL/2-OP OPL3 Slap Bass.fui b/instruments/OPL/2-OP OPL3 Slap Bass.fui new file mode 100644 index 0000000000000000000000000000000000000000..fb8f1c1439f61f6e8eb153f9cc640886b50bcda1 GIT binary patch literal 101 zcmZ?s^b2lf;A8M}RAVsG^$$?+5AZQo2+m0?P;g2tE>_U+O-wGzFIGs+OH9g1O;OZj zaPt*m_{7S<5XH;y=@7!e5XivK=HmKQMg~SsejzA}h4DWC5q20> literal 0 HcmV?d00001 From 6834b3b7dbff20488a6b46918b62d1c91ed3b82b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 15 Jan 2023 17:27:16 -0500 Subject: [PATCH 03/22] maybe fix sample corruption when resampling 8-bit --- src/engine/sample.cpp | 46 +++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/src/engine/sample.cpp b/src/engine/sample.cpp index 08dee993..c9a31346 100644 --- a/src/engine/sample.cpp +++ b/src/engine/sample.cpp @@ -827,18 +827,15 @@ bool DivSample::resampleBlep(double r) { unsigned int posInt=0; double factor=r/(double)rate; float* sincITable=DivFilterTables::getSincIntegralTable(); - float s[16]; - memset(s,0,16*sizeof(float)); + float* floatData=new float[finalCount]; + memset(floatData,0,finalCount*sizeof(float)); if (depth==DIV_SAMPLE_DEPTH_16BIT) { memset(data16,0,finalCount*sizeof(short)); for (int i=0; i32767) result=32767; - data16[i]=result; + data16[i]=oldData16[posInt]; } posFrac+=1.0; @@ -853,28 +850,25 @@ bool DivSample::resampleBlep(double r) { for (int j=0; j<8; j++) { if (i-j>0) { - float result=data16[i-j]+t1[j]*-delta; - if (result<-32768) result=-32768; - if (result>32767) result=32767; - data16[i-j]=result; + floatData[i-j]+=t1[j]*-delta; } if (i+j+132767) result=32767; - data16[i+j+1]=result; + floatData[i+j+1]+=t2[j]*delta; } } } } + for (int i=0; i32767) result=32767; + data16[i]=round(result); + } } else if (depth==DIV_SAMPLE_DEPTH_8BIT) { memset(data8,0,finalCount); for (int i=0; i127) result=127; - data8[i]=result; + data8[i]=oldData8[posInt]; } posFrac+=1.0; @@ -889,20 +883,20 @@ bool DivSample::resampleBlep(double r) { for (int j=0; j<8; j++) { if (i-j>0) { - float result=data8[i-j]+t1[j]*-delta; - if (result<-128) result=-128; - if (result>127) result=127; - data8[i-j]=result; + floatData[i-j]+=t1[j]*-delta; } if (i+j+1127) result=127; - data8[i+j+1]=result; + floatData[i+j+1]+=t2[j]*delta; } } } } + for (int i=0; i127) result=127; + data16[i]=round(result); + } } RESAMPLE_END; From 3370e91aad95170d7d54f9cfd719420d196ba158 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 15 Jan 2023 17:28:47 -0500 Subject: [PATCH 04/22] MEMORY LEAK --- src/engine/sample.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/engine/sample.cpp b/src/engine/sample.cpp index c9a31346..5df46fab 100644 --- a/src/engine/sample.cpp +++ b/src/engine/sample.cpp @@ -898,6 +898,7 @@ bool DivSample::resampleBlep(double r) { data16[i]=round(result); } } + delete[] floatData; RESAMPLE_END; return true; From bf2ef2742a160ffc38c1e5f1eca1ba738ca7eb0e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 15 Jan 2023 18:05:48 -0500 Subject: [PATCH 05/22] YM2612: fix forceIns after sample --- src/engine/platform/genesis.cpp | 4 +++- src/engine/platform/genesisext.cpp | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index b547181d..5131afd9 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -586,7 +586,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) { } } if (c.chan>=5 && chan[c.chan].dacMode) { - if (skipRegisterWrites) break; + //if (skipRegisterWrites) break; if (ins->type==DIV_INS_AMIGA) { // Furnace mode if (c.value!=DIV_NOTE_NULL) chan[c.chan].dacSample=ins->amiga.getSample(c.value); if (chan[c.chan].dacSample<0 || chan[c.chan].dacSample>=parent->song.sampleLen) { @@ -1122,6 +1122,8 @@ void DivPlatformGenesis::forceIns() { } } if (chan[5].dacMode) { + chan[5].dacSample=-1; + chan[6].dacSample=-1; rWrite(0x2b,0x80); } immWrite(0x22,lfoValue); diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index 4eb34bc2..8e1e7d12 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -677,6 +677,8 @@ void DivPlatformGenesisExt::forceIns() { } } if (chan[5].dacMode) { + chan[5].dacSample=-1; + chan[6].dacSample=-1; rWrite(0x2b,0x80); } immWrite(0x22,lfoValue); From 58f789b9eb4a1c191db77001d1abbeb4bffd2e84 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 15 Jan 2023 23:34:01 -0500 Subject: [PATCH 06/22] 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 07/22] 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 08/22] 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 09/22] 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 10/22] 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 11/22] 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 12/22] 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 13/22] 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 14/22] 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 15/22] 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 16/22] 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 17/22] 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 18/22] 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 19/22] 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 20/22] 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 21/22] 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 22/22] 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;