diff --git a/papers/format.md b/papers/format.md index 1d0027c82..0e60b08db 100644 --- a/papers/format.md +++ b/papers/format.md @@ -158,7 +158,9 @@ size | description 4 | duty macro loop 4 | wave macro loop 1 | arp macro mode - 3 | reserved + 1 | volume macro height (>=15) + 1 | duty macro height (>=15) + 1 | wave macro height (>=15) 4?? | volume macro 4?? | arp macro 4?? | duty macro diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 038e3857a..1a9cc8109 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1074,9 +1074,12 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { ins->std.dutyMacroLoop=reader.readI(); ins->std.waveMacroLoop=reader.readI(); ins->std.arpMacroMode=reader.readC(); - reader.readC(); // reserved - reader.readC(); - reader.readC(); + ins->std.volMacroHeight=reader.readC(); + ins->std.dutyMacroHeight=reader.readC(); + ins->std.waveMacroHeight=reader.readC(); + if (ins->std.volMacroHeight==0) ins->std.volMacroHeight=15; + if (ins->std.dutyMacroHeight==0) ins->std.dutyMacroHeight=3; + if (ins->std.waveMacroHeight==0) ins->std.waveMacroHeight=63; reader.read(ins->std.volMacro,4*ins->std.volMacroLen); reader.read(ins->std.arpMacro,4*ins->std.arpMacroLen); reader.read(ins->std.dutyMacro,4*ins->std.dutyMacroLen); @@ -1529,9 +1532,9 @@ SafeWriter* DivEngine::saveFur() { w->writeI(ins->std.dutyMacroLoop); w->writeI(ins->std.waveMacroLoop); w->writeC(ins->std.arpMacroMode); - w->writeC(0); // reserved - w->writeC(0); - w->writeC(0); + w->writeC(ins->std.volMacroHeight); + w->writeC(ins->std.dutyMacroHeight); + w->writeC(ins->std.waveMacroHeight); for (int j=0; jstd.volMacroLen; j++) { w->writeI(ins->std.volMacro[j]); } diff --git a/src/engine/engine.h b/src/engine/engine.h index 21dc348f5..d7973535f 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -9,8 +9,8 @@ #include #include -#define DIV_VERSION "0.2.2" -#define DIV_ENGINE_VERSION 14 +#define DIV_VERSION "0.3" +#define DIV_ENGINE_VERSION 15 enum DivStatusView { DIV_STATUS_NOTHING=0, diff --git a/src/engine/instrument.h b/src/engine/instrument.h index 36ff978c1..196ae314d 100644 --- a/src/engine/instrument.h +++ b/src/engine/instrument.h @@ -85,10 +85,14 @@ struct DivInstrumentSTD { int dutyMacro[256]; int waveMacro[256]; bool arpMacroMode; + unsigned char volMacroHeight, dutyMacroHeight, waveMacroHeight; unsigned char volMacroLen, arpMacroLen, dutyMacroLen, waveMacroLen; signed char volMacroLoop, arpMacroLoop, dutyMacroLoop, waveMacroLoop; DivInstrumentSTD(): arpMacroMode(false), + volMacroHeight(15), + dutyMacroHeight(3), + waveMacroHeight(63), volMacroLen(0), arpMacroLen(0), dutyMacroLen(0), diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 8f801b68e..249d1c80a 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -760,14 +760,14 @@ void FurnaceGUI::drawInsEdit() { ImGui::Text("Volume Macro"); ImGui::SameLine(); if (ImGui::SmallButton("15##VMH15")) { - volMacroHeight=15; + ins->std.volMacroHeight=15; } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Rest of platforms"); } ImGui::SameLine(); if (ImGui::SmallButton("31##VMH31")) { - volMacroHeight=31; + ins->std.volMacroHeight=31; } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("PC Engine only"); @@ -782,7 +782,7 @@ void FurnaceGUI::drawInsEdit() { loopIndicator[i]=(ins->std.volMacroLoop!=-1 && i>=ins->std.volMacroLoop); } ImGui::PushStyleVar(ImGuiStyleVar_FramePadding,ImVec2(0.0f,0.0f)); - int volMax=volMacroHeight; + int volMax=ins->std.volMacroHeight; int volMin=0; if (ins->type==DIV_INS_C64) { if (ins->c64.volIsCutoff) { @@ -862,7 +862,7 @@ void FurnaceGUI::drawInsEdit() { } // duty macro - int dutyMax=dutyMacroHeight; + int dutyMax=ins->std.dutyMacroHeight; if (ins->type==DIV_INS_C64) { if (ins->c64.dutyIsAbs) { dutyMax=4095; @@ -882,14 +882,14 @@ void FurnaceGUI::drawInsEdit() { ImGui::Text("Duty/Noise Mode Macro"); ImGui::SameLine(); if (ImGui::SmallButton("3##DMH3")) { - dutyMacroHeight=3; + ins->std.dutyMacroHeight=3; } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Most platforms"); } ImGui::SameLine(); if (ImGui::SmallButton("31##DMH31")) { - dutyMacroHeight=31; + ins->std.dutyMacroHeight=31; } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Neo Geo SSG/AY-3-8910/YM2149 only"); @@ -929,24 +929,26 @@ void FurnaceGUI::drawInsEdit() { } // wave macro - int waveMax=waveMacroHeight; + int waveMax=ins->std.waveMacroHeight; if (ins->type==DIV_INS_C64) waveMax=8; if (waveMax>0) { ImGui::Separator(); ImGui::Text("Waveform Macro"); - ImGui::SameLine(); - if (ImGui::SmallButton("7##WMH7")) { - waveMacroHeight=7; - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Neo Geo SSG/AY-3-8910/YM2149 only"); - } - ImGui::SameLine(); - if (ImGui::SmallButton("63##WMH63")) { - waveMacroHeight=63; - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Rest of platforms"); + if (ins->type!=DIV_INS_C64) { + ImGui::SameLine(); + if (ImGui::SmallButton("7##WMH7")) { + ins->std.waveMacroHeight=7; + } + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Neo Geo SSG/AY-3-8910/YM2149 only"); + } + ImGui::SameLine(); + if (ImGui::SmallButton("63##WMH63")) { + ins->std.waveMacroHeight=63; + } + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Rest of platforms"); + } } for (int i=0; istd.waveMacroLen; i++) { asFloat[i]=ins->std.waveMacro[i]; @@ -3235,9 +3237,6 @@ FurnaceGUI::FurnaceGUI(): noteOffOnReleaseKey(0), noteOffOnReleaseChan(0), arpMacroScroll(0), - volMacroHeight(15), - dutyMacroHeight(3), - waveMacroHeight(63), macroDragStart(0,0), macroDragAreaSize(0,0), macroDragTarget(NULL), diff --git a/src/gui/gui.h b/src/gui/gui.h index af609ab50..424383f3a 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -181,8 +181,6 @@ class FurnaceGUI { int arpMacroScroll; - int volMacroHeight, dutyMacroHeight, waveMacroHeight; - ImVec2 macroDragStart; ImVec2 macroDragAreaSize; int* macroDragTarget;