From 57c4e22d70c26145828583df5f13d20f7577f071 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 01:44:51 -0500 Subject: [PATCH 1/5] add support for loading .vgi and .tfi instruments --- src/engine/engine.cpp | 579 +++++++++++++++++++++++++----------------- 1 file changed, 350 insertions(+), 229 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 5354de1a..5e0bde48 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1196,8 +1196,24 @@ int DivEngine::addInstrument(int refChan) { return insCount; } +enum DivInsFormats { + DIV_INSFORMAT_DMP, + DIV_INSFORMAT_TFI, + DIV_INSFORMAT_VGI, + DIV_INSFORMAT_FTI, + DIV_INSFORMAT_BTI +}; + bool DivEngine::addInstrumentFromFile(const char *path) { warnings=""; + + const char* pathRedux=strrchr(path,DIR_SEPARATOR); + if (pathRedux==NULL) { + pathRedux="Instrument"; + } else { + pathRedux++; + } + FILE* f=ps_fopen(path,"rb"); if (f==NULL) { lastError=strerror(errno); @@ -1274,251 +1290,356 @@ bool DivEngine::addInstrumentFromFile(const char *path) { delete[] buf; return false; } - } else { // read as .dmp - // this is a ridiculous mess - unsigned char version=0; - unsigned char sys=0; - try { - reader.seek(0,SEEK_SET); - version=reader.readC(); - } catch (EndOfFileException e) { - lastError="premature end of file"; - logE("premature end of file!\n"); - delete ins; - delete[] buf; - return false; + } else { // read as a different format + const char* ext=strrchr(path,'.'); + DivInsFormats format=DIV_INSFORMAT_DMP; + if (ext!=NULL) { + String extS; + for (; *ext; ext++) { + char i=*ext; + if (i>='A' && i<='Z') { + i+='a'-'A'; + } + extS+=i; + } + if (extS==String(".dmp")) { + format=DIV_INSFORMAT_DMP; + } else if (extS==String(".tfi")) { + format=DIV_INSFORMAT_TFI; + } else if (extS==String(".vgi")) { + format=DIV_INSFORMAT_VGI; + } else if (extS==String(".fti")) { + format=DIV_INSFORMAT_FTI; + } else if (extS==String(".bti")) { + format=DIV_INSFORMAT_BTI; + } } + switch (format) { + case DIV_INSFORMAT_DMP: { + // this is a ridiculous mess + unsigned char version=0; + unsigned char sys=0; + try { + reader.seek(0,SEEK_SET); + version=reader.readC(); + } catch (EndOfFileException e) { + lastError="premature end of file"; + logE("premature end of file!\n"); + delete ins; + delete[] buf; + return false; + } - if (version>11) { - lastError="unknown instrument version!"; - delete ins; - delete[] buf; - return false; - } + if (version>11) { + lastError="unknown instrument version!"; + delete ins; + delete[] buf; + return false; + } - if (version>=11) { // 1.0 - try { - sys=reader.readC(); - - switch (sys) { - case 1: // YMU759 - ins->type=DIV_INS_FM; - break; - case 2: // Genesis - ins->type=DIV_INS_FM; - break; - case 3: // SMS - ins->type=DIV_INS_STD; - break; - case 4: // Game Boy - ins->type=DIV_INS_GB; - break; - case 5: // PC Engine - ins->type=DIV_INS_PCE; - break; - case 6: // NES - ins->type=DIV_INS_STD; - break; - case 7: case 0x17: // C64 - ins->type=DIV_INS_C64; - break; - case 8: // Arcade - ins->type=DIV_INS_FM; - break; - default: - lastError="unknown instrument type!"; + ins->name=pathRedux; + + if (version>=11) { // 1.0 + try { + sys=reader.readC(); + + switch (sys) { + case 1: // YMU759 + ins->type=DIV_INS_FM; + break; + case 2: // Genesis + ins->type=DIV_INS_FM; + break; + case 3: // SMS + ins->type=DIV_INS_STD; + break; + case 4: // Game Boy + ins->type=DIV_INS_GB; + break; + case 5: // PC Engine + ins->type=DIV_INS_PCE; + break; + case 6: // NES + ins->type=DIV_INS_STD; + break; + case 7: case 0x17: // C64 + ins->type=DIV_INS_C64; + break; + case 8: // Arcade + ins->type=DIV_INS_FM; + break; + default: + lastError="unknown instrument type!"; + delete ins; + delete[] buf; + return false; + break; + } + } catch (EndOfFileException e) { + lastError="premature end of file"; + logE("premature end of file!\n"); delete ins; delete[] buf; return false; - break; - } - } catch (EndOfFileException e) { - lastError="premature end of file"; - logE("premature end of file!\n"); - delete ins; - delete[] buf; - return false; - } - } - - try { - bool mode=true; - if (version>1) { - mode=reader.readC(); - if (mode==0) { - if (version<11) { - ins->type=DIV_INS_STD; } - } else { - ins->type=DIV_INS_FM; } - } else { - ins->type=DIV_INS_FM; - } - if (mode) { // FM - if (version<10) { + try { + bool mode=true; if (version>1) { - ins->fm.ops=reader.readC()?4:2; - } else { - ins->fm.ops=reader.readC()?2:4; - } - } - if (version>1) { // HELP! in which version of the format did we start storing FMS! - ins->fm.fms=reader.readC(); - } - ins->fm.fb=reader.readC(); - ins->fm.alg=reader.readC(); - // DITTO - if (sys!=1) ins->fm.ams=reader.readC(); - - for (int j=0; jfm.ops; j++) { - ins->fm.op[j].mult=reader.readC(); - ins->fm.op[j].tl=reader.readC(); - ins->fm.op[j].ar=reader.readC(); - ins->fm.op[j].dr=reader.readC(); - ins->fm.op[j].sl=reader.readC(); - ins->fm.op[j].rr=reader.readC(); - ins->fm.op[j].am=reader.readC(); - // what the hell how do I tell! - if (sys==1) { // YMU759 - ins->fm.op[j].ws=reader.readC(); - ins->fm.op[j].ksl=reader.readC(); - ins->fm.op[j].vib=reader.readC(); - ins->fm.op[j].egt=reader.readC(); - ins->fm.op[j].sus=reader.readC(); - ins->fm.op[j].ksr=reader.readC(); - ins->fm.op[j].dvb=reader.readC(); - ins->fm.op[j].dam=reader.readC(); - } else { - ins->fm.op[j].rs=reader.readC(); - ins->fm.op[j].dt=reader.readC(); - ins->fm.op[j].dt2=ins->fm.op[j].dt>>4; - ins->fm.op[j].dt&=15; - ins->fm.op[j].d2r=reader.readC(); - ins->fm.op[j].ssgEnv=reader.readC(); - } - } - } else { // STD - if (ins->type!=DIV_INS_GB) { - ins->std.volMacroLen=reader.readC(); - if (version>5) { - for (int i=0; istd.volMacroLen; i++) { - ins->std.volMacro[i]=reader.readI(); + mode=reader.readC(); + if (mode==0) { + if (version<11) { + ins->type=DIV_INS_STD; + } + } else { + ins->type=DIV_INS_FM; } } else { - for (int i=0; istd.volMacroLen; i++) { - ins->std.volMacro[i]=reader.readC(); + ins->type=DIV_INS_FM; + } + + if (mode) { // FM + if (version<10) { + if (version>1) { + ins->fm.ops=reader.readC()?4:2; + } else { + ins->fm.ops=reader.readC()?2:4; + } + } + if (version>1) { // HELP! in which version of the format did we start storing FMS! + ins->fm.fms=reader.readC(); + } + ins->fm.fb=reader.readC(); + ins->fm.alg=reader.readC(); + // DITTO + if (sys!=1) ins->fm.ams=reader.readC(); + + for (int j=0; jfm.ops; j++) { + ins->fm.op[j].mult=reader.readC(); + ins->fm.op[j].tl=reader.readC(); + ins->fm.op[j].ar=reader.readC(); + ins->fm.op[j].dr=reader.readC(); + ins->fm.op[j].sl=reader.readC(); + ins->fm.op[j].rr=reader.readC(); + ins->fm.op[j].am=reader.readC(); + // what the hell how do I tell! + if (sys==1) { // YMU759 + ins->fm.op[j].ws=reader.readC(); + ins->fm.op[j].ksl=reader.readC(); + ins->fm.op[j].vib=reader.readC(); + ins->fm.op[j].egt=reader.readC(); + ins->fm.op[j].sus=reader.readC(); + ins->fm.op[j].ksr=reader.readC(); + ins->fm.op[j].dvb=reader.readC(); + ins->fm.op[j].dam=reader.readC(); + } else { + ins->fm.op[j].rs=reader.readC(); + ins->fm.op[j].dt=reader.readC(); + ins->fm.op[j].dt2=ins->fm.op[j].dt>>4; + ins->fm.op[j].dt&=15; + ins->fm.op[j].d2r=reader.readC(); + ins->fm.op[j].ssgEnv=reader.readC(); + } + } + } else { // STD + if (ins->type!=DIV_INS_GB) { + ins->std.volMacroLen=reader.readC(); + if (version>5) { + for (int i=0; istd.volMacroLen; i++) { + ins->std.volMacro[i]=reader.readI(); + } + } else { + for (int i=0; istd.volMacroLen; i++) { + ins->std.volMacro[i]=reader.readC(); + } + } + if (version<11) for (int i=0; istd.volMacroLen; i++) { + if (ins->std.volMacro[i]>15 && ins->type==DIV_INS_STD) ins->type=DIV_INS_PCE; + } + if (ins->std.volMacroLen>0) { + ins->std.volMacroOpen=true; + ins->std.volMacroLoop=reader.readC(); + } else { + ins->std.volMacroOpen=false; + } + } + + ins->std.arpMacroLen=reader.readC(); + if (version>5) { + for (int i=0; istd.arpMacroLen; i++) { + ins->std.arpMacro[i]=reader.readI(); + } + } else { + for (int i=0; istd.arpMacroLen; i++) { + ins->std.arpMacro[i]=reader.readC(); + } + } + if (ins->std.arpMacroLen>0) { + ins->std.arpMacroOpen=true; + ins->std.arpMacroLoop=reader.readC(); + } else { + ins->std.arpMacroOpen=false; + } + if (version>8) { // TODO: when? + ins->std.arpMacroMode=reader.readC(); + } + + ins->std.dutyMacroLen=reader.readC(); + if (version>5) { + for (int i=0; istd.dutyMacroLen; i++) { + ins->std.dutyMacro[i]=reader.readI(); + } + } else { + for (int i=0; istd.dutyMacroLen; i++) { + ins->std.dutyMacro[i]=reader.readC(); + } + } + if (ins->std.dutyMacroLen>0) { + ins->std.dutyMacroOpen=true; + ins->std.dutyMacroLoop=reader.readC(); + } else { + ins->std.dutyMacroOpen=false; + } + + ins->std.waveMacroLen=reader.readC(); + if (version>5) { + for (int i=0; istd.waveMacroLen; i++) { + ins->std.waveMacro[i]=reader.readI(); + } + } else { + for (int i=0; istd.waveMacroLen; i++) { + ins->std.waveMacro[i]=reader.readC(); + } + } + if (ins->std.waveMacroLen>0) { + ins->std.waveMacroOpen=true; + ins->std.waveMacroLoop=reader.readC(); + } else { + ins->std.waveMacroOpen=false; + } + + if (ins->type==DIV_INS_C64) { + ins->c64.triOn=reader.readC(); + ins->c64.sawOn=reader.readC(); + ins->c64.pulseOn=reader.readC(); + ins->c64.noiseOn=reader.readC(); + + ins->c64.a=reader.readC(); + ins->c64.d=reader.readC(); + ins->c64.s=reader.readC(); + ins->c64.r=reader.readC(); + + ins->c64.duty=(reader.readC()*4095)/100; + + ins->c64.ringMod=reader.readC(); + ins->c64.oscSync=reader.readC(); + ins->c64.toFilter=reader.readC(); + if (version<0x07) { // TODO: UNSURE + ins->c64.volIsCutoff=reader.readI(); + } else { + ins->c64.volIsCutoff=reader.readC(); + } + ins->c64.initFilter=reader.readC(); + + ins->c64.res=reader.readC(); + ins->c64.cut=(reader.readC()*2047)/100; + ins->c64.hp=reader.readC(); + ins->c64.bp=reader.readC(); + ins->c64.lp=reader.readC(); + ins->c64.ch3off=reader.readC(); + } + if (ins->type==DIV_INS_GB) { + ins->gb.envVol=reader.readC(); + ins->gb.envDir=reader.readC(); + ins->gb.envLen=reader.readC(); + ins->gb.soundLen=reader.readC(); } } - if (version<11) for (int i=0; istd.volMacroLen; i++) { - if (ins->std.volMacro[i]>15 && ins->type==DIV_INS_STD) ins->type=DIV_INS_PCE; - } - if (ins->std.volMacroLen>0) { - ins->std.volMacroOpen=true; - ins->std.volMacroLoop=reader.readC(); - } else { - ins->std.volMacroOpen=false; - } - } - - ins->std.arpMacroLen=reader.readC(); - if (version>5) { - for (int i=0; istd.arpMacroLen; i++) { - ins->std.arpMacro[i]=reader.readI(); - } - } else { - for (int i=0; istd.arpMacroLen; i++) { - ins->std.arpMacro[i]=reader.readC(); - } - } - if (ins->std.arpMacroLen>0) { - ins->std.arpMacroOpen=true; - ins->std.arpMacroLoop=reader.readC(); - } else { - ins->std.arpMacroOpen=false; - } - if (version>8) { // TODO: when? - ins->std.arpMacroMode=reader.readC(); - } - - ins->std.dutyMacroLen=reader.readC(); - if (version>5) { - for (int i=0; istd.dutyMacroLen; i++) { - ins->std.dutyMacro[i]=reader.readI(); - } - } else { - for (int i=0; istd.dutyMacroLen; i++) { - ins->std.dutyMacro[i]=reader.readC(); - } - } - if (ins->std.dutyMacroLen>0) { - ins->std.dutyMacroOpen=true; - ins->std.dutyMacroLoop=reader.readC(); - } else { - ins->std.dutyMacroOpen=false; - } - - ins->std.waveMacroLen=reader.readC(); - if (version>5) { - for (int i=0; istd.waveMacroLen; i++) { - ins->std.waveMacro[i]=reader.readI(); - } - } else { - for (int i=0; istd.waveMacroLen; i++) { - ins->std.waveMacro[i]=reader.readC(); - } - } - if (ins->std.waveMacroLen>0) { - ins->std.waveMacroOpen=true; - ins->std.waveMacroLoop=reader.readC(); - } else { - ins->std.waveMacroOpen=false; - } - - if (ins->type==DIV_INS_C64) { - ins->c64.triOn=reader.readC(); - ins->c64.sawOn=reader.readC(); - ins->c64.pulseOn=reader.readC(); - ins->c64.noiseOn=reader.readC(); - - ins->c64.a=reader.readC(); - ins->c64.d=reader.readC(); - ins->c64.s=reader.readC(); - ins->c64.r=reader.readC(); - - ins->c64.duty=(reader.readC()*4095)/100; - - ins->c64.ringMod=reader.readC(); - ins->c64.oscSync=reader.readC(); - ins->c64.toFilter=reader.readC(); - if (version<0x07) { // TODO: UNSURE - ins->c64.volIsCutoff=reader.readI(); - } else { - ins->c64.volIsCutoff=reader.readC(); - } - ins->c64.initFilter=reader.readC(); - - ins->c64.res=reader.readC(); - ins->c64.cut=(reader.readC()*2047)/100; - ins->c64.hp=reader.readC(); - ins->c64.bp=reader.readC(); - ins->c64.lp=reader.readC(); - ins->c64.ch3off=reader.readC(); - } - if (ins->type==DIV_INS_GB) { - ins->gb.envVol=reader.readC(); - ins->gb.envDir=reader.readC(); - ins->gb.envLen=reader.readC(); - ins->gb.soundLen=reader.readC(); + } catch (EndOfFileException e) { + lastError="premature end of file"; + logE("premature end of file!\n"); + delete ins; + delete[] buf; + return false; } + break; } - } catch (EndOfFileException e) { - lastError="premature end of file"; - logE("premature end of file!\n"); - delete ins; - delete[] buf; - return false; + case DIV_INSFORMAT_TFI: + try { + reader.seek(0,SEEK_SET); + + ins->type=DIV_INS_FM; + ins->name=pathRedux; + + ins->fm.alg=reader.readC(); + ins->fm.fb=reader.readC(); + + for (int i=0; i<4; i++) { + DivInstrumentFM::Operator& op=ins->fm.op[i]; + + op.mult=reader.readC(); + op.dt=reader.readC(); + op.tl=reader.readC(); + op.rs=reader.readC(); + op.ar=reader.readC(); + op.dr=reader.readC(); + op.d2r=reader.readC(); + op.rr=reader.readC(); + op.sl=reader.readC(); + op.ssgEnv=reader.readC(); + } + } catch (EndOfFileException e) { + lastError="premature end of file"; + logE("premature end of file!\n"); + delete ins; + delete[] buf; + return false; + } + break; + case DIV_INSFORMAT_VGI: + try { + reader.seek(0,SEEK_SET); + + ins->type=DIV_INS_FM; + ins->name=pathRedux; + + ins->fm.alg=reader.readC(); + ins->fm.fb=reader.readC(); + unsigned char fmsams=reader.readC(); + ins->fm.fms=fmsams&7; + ins->fm.ams=fmsams>>4; + + for (int i=0; i<4; i++) { + DivInstrumentFM::Operator& op=ins->fm.op[i]; + + op.mult=reader.readC(); + op.dt=reader.readC(); + op.tl=reader.readC(); + op.rs=reader.readC(); + op.ar=reader.readC(); + op.dr=reader.readC(); + if (op.dr&0x80) { + op.am=1; + op.dr&=0x7f; + } + op.d2r=reader.readC(); + op.rr=reader.readC(); + op.sl=reader.readC(); + op.ssgEnv=reader.readC(); + } + } catch (EndOfFileException e) { + lastError="premature end of file"; + logE("premature end of file!\n"); + delete ins; + delete[] buf; + return false; + } + break; + case DIV_INSFORMAT_FTI: + break; + case DIV_INSFORMAT_BTI: + break; } if (reader.tell() Date: Mon, 21 Feb 2022 02:33:07 -0500 Subject: [PATCH 2/5] don't round frequency apparently that wasn't too good for some songs that relied on E5xx --- src/engine/engine.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 5e0bde48..21d6789b 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -805,8 +805,8 @@ int DivEngine::calcBaseFreq(double clock, double divider, int note, bool period) int DivEngine::calcFreq(int base, int pitch, bool period, int octave) { if (song.linearPitch) { return period? - round(base*pow(2,-(double)pitch/(12.0*128.0))/(98.0+globalPitch*6.0)*98.0): - (round(base*pow(2,(double)pitch/(12.0*128.0))*(98+globalPitch*6))/98); + base*pow(2,-(double)pitch/(12.0*128.0))/(98.0+globalPitch*6.0)*98.0: + (base*pow(2,(double)pitch/(12.0*128.0))*(98+globalPitch*6))/98; } return period? base-pitch: From eb2e08c83402d3866a41ece768ca87528711742b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 03:05:00 -0500 Subject: [PATCH 3/5] GUI: add ability to rename patterns --- src/gui/gui.cpp | 4 +++- src/gui/gui.h | 6 +++--- src/gui/pattern.cpp | 35 ++++++++++++++++++++++++++++++++--- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 40a6035c..e18d3a79 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -5579,6 +5579,8 @@ FurnaceGUI::FurnaceGUI(): loopRow(-1), loopEnd(-1), isClipping(0), + extraChannelButtons(0), + patNameTarget(-1), editControlsOpen(true), ordersOpen(true), insListOpen(true), @@ -5603,13 +5605,13 @@ FurnaceGUI::FurnaceGUI(): selecting(false), curNibble(false), orderNibble(false), - extraChannelButtons(false), followOrders(true), followPattern(true), changeAllOrders(false), collapseWindow(false), demandScrollX(false), fancyPattern(false), + wantPatName(false), curWindow(GUI_WINDOW_NOTHING), nextWindow(GUI_WINDOW_NOTHING), wavePreviewOn(false), diff --git a/src/gui/gui.h b/src/gui/gui.h index 3e15b141..318ee178 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -516,14 +516,14 @@ class FurnaceGUI { char finalLayoutPath[4096]; int curIns, curWave, curSample, curOctave, oldRow, oldOrder, oldOrder1, editStep, exportLoops, soloChan, soloTimeout, orderEditMode, orderCursor; - int loopOrder, loopRow, loopEnd, isClipping; + int loopOrder, loopRow, loopEnd, isClipping, extraChannelButtons, patNameTarget; bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen; bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen; bool mixerOpen, debugOpen, oscOpen, volMeterOpen, statsOpen, compatFlagsOpen; bool pianoOpen, notesOpen, channelsOpen; SelectionPoint selStart, selEnd, cursor; - bool selecting, curNibble, orderNibble, extraChannelButtons, followOrders, followPattern, changeAllOrders; - bool collapseWindow, demandScrollX, fancyPattern; + bool selecting, curNibble, orderNibble, followOrders, followPattern, changeAllOrders; + bool collapseWindow, demandScrollX, fancyPattern, wantPatName; FurnaceGUIWindows curWindow, nextWindow; float peak[2]; float patChanX[DIV_MAX_CHANS+1]; diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 5135b304..b8618028 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -17,10 +17,12 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include #define _USE_MATH_DEFINES #include "gui.h" #include "imgui_internal.h" #include "IconsFontAwesome4.h" +#include "misc/cpp/imgui_stdlib.h" #include "guiConst.h" #include @@ -376,8 +378,8 @@ void FurnaceGUI::drawPattern() { } ImGui::TableNextRow(); ImGui::TableNextColumn(); - if (ImGui::Selectable(extraChannelButtons?" --##ExtraChannelButtons":" ++##ExtraChannelButtons",false,ImGuiSelectableFlags_NoPadWithHalfSpacing,ImVec2(0.0f,lineHeight+1.0f*dpiScale))) { - extraChannelButtons=!extraChannelButtons; + if (ImGui::Selectable((extraChannelButtons==2)?" --##ExtraChannelButtons":" ++##ExtraChannelButtons",false,ImGuiSelectableFlags_NoPadWithHalfSpacing,ImVec2(0.0f,lineHeight+1.0f*dpiScale))) { + if (++extraChannelButtons>2) extraChannelButtons=0; } if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { fancyPattern=!fancyPattern; @@ -448,7 +450,34 @@ void FurnaceGUI::drawPattern() { if (settings.soloAction!=2) if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { e->toggleSolo(i); } - if (extraChannelButtons) { + if (extraChannelButtons==2) { + DivPattern* pat=e->song.pat[i].getPattern(e->song.orders.ord[i][ord],true); + ImGui::PushFont(mainFont); + if (patNameTarget==i) { + snprintf(chanID,2048,"##PatNameI%d_%d",i,ord); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(8.0f*dpiScale)); + ImGui::SetCursorPosX(ImGui::GetCursorPosX()+4.0f*dpiScale); + ImGui::InputText(chanID,&pat->name); + if (wantPatName) { + wantPatName=false; + ImGui::SetItemDefaultFocus(); + ImGui::SetKeyboardFocusHere(-1); + } else { + if (!ImGui::IsItemActive()) { + patNameTarget=-1; + } + } + } else { + snprintf(chanID,2048," %s##PatName%d",pat->name.c_str(),i); + if (ImGui::Selectable(chanID,true,ImGuiSelectableFlags_NoPadWithHalfSpacing,ImVec2(0.0f,lineHeight+1.0f*dpiScale))) { + patNameTarget=i; + wantPatName=true; + snprintf(chanID,2048,"##PatNameI%d_%d",i,ord); + ImGui::SetActiveID(ImGui::GetID(chanID),ImGui::GetCurrentWindow()); + } + } + ImGui::PopFont(); + } else if (extraChannelButtons==1) { snprintf(chanID,2048,"%c##_HCH%d",e->song.chanCollapse[i]?'+':'-',i); ImGui::SetCursorPosX(ImGui::GetCursorPosX()+4.0f*dpiScale); if (ImGui::SmallButton(chanID)) { From d0df796c12e04acf218f5af0b9279d46d3d3419c Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 03:19:42 -0500 Subject: [PATCH 4/5] release v0.5.7 --- CMakeLists.txt | 2 +- res/Info.plist | 6 +++--- src/engine/engine.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 695206ff..f2b7cb70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ set(CMAKE_CXX_STANDARD 14) set(CMAKE_PROJECT_VERSION_MAJOR 0) set(CMAKE_PROJECT_VERSION_MINOR 5) -set(CMAKE_PROJECT_VERSION_PATCH 6) +set(CMAKE_PROJECT_VERSION_PATCH 7) if (ANDROID) set(BUILD_GUI_DEFAULT OFF) diff --git a/res/Info.plist b/res/Info.plist index 73daa246..d6f1c4a0 100644 --- a/res/Info.plist +++ b/res/Info.plist @@ -15,17 +15,17 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 0.5.6 + 0.5.7 CFBundleName Furnace CFBundlePackageType APPL CFBundleShortVersionString - 0.5.6 + 0.5.7 CFBundleSignature ???? CFBundleVersion - 0.5.6 + 0.5.7 NSHumanReadableCopyright NSHighResolutionCapable diff --git a/src/engine/engine.h b/src/engine/engine.h index ddf9f581..8b721e30 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -37,8 +37,8 @@ warnings+=(String("\n")+x); \ } -#define DIV_VERSION "0.5.7pre3" -#define DIV_ENGINE_VERSION 51 +#define DIV_VERSION "0.5.7" +#define DIV_ENGINE_VERSION 52 enum DivStatusView { DIV_STATUS_NOTHING=0, From d7bcd18c56464e515c39a8ef86eb9efe7f256247 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 04:28:25 -0500 Subject: [PATCH 5/5] wait! not yet! make it pre4 and tag it because i forgot about keybinds! --- src/engine/engine.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index 8b721e30..d3be5ae9 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -37,7 +37,7 @@ warnings+=(String("\n")+x); \ } -#define DIV_VERSION "0.5.7" +#define DIV_VERSION "0.5.7pre4" #define DIV_ENGINE_VERSION 52 enum DivStatusView {