diff --git a/papers/format.md b/papers/format.md index 5d227f13e..c4d9d8a6a 100644 --- a/papers/format.md +++ b/papers/format.md @@ -165,6 +165,7 @@ size | description 1 | target resets slides (>=45) or reserved 1 | arpeggio inhibits portamento (>=47) or reserved 1 | wack algorithm macro (>=47) or reserved + 1 | broken shortcut slides (>=49) or reserved 8 | reserved 4?? | pointers to instruments 4?? | pointers to wavetables diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index bbedb6ef8..86a5be350 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1564,6 +1564,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { ds.targetResetsSlides=true; ds.arpNonPorta=false; ds.algMacroBehavior=false; + ds.brokenShortcutSlides=false; // Neo Geo detune if (ds.system[0]==DIV_SYSTEM_YM2610 || ds.system[0]==DIV_SYSTEM_YM2610_EXT) { @@ -2113,6 +2114,9 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { ds.arpNonPorta=false; ds.algMacroBehavior=false; } + if (ds.version<49) { + ds.brokenShortcutSlides=true; + } reader.readS(); // reserved int infoSeek=reader.readI(); @@ -2230,7 +2234,12 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { } else { reader.readC(); } - for (int i=0; i<8; i++) reader.readC(); + if (ds.version>=49) { + ds.brokenShortcutSlides=reader.readC(); + } else { + reader.readC(); + } + for (int i=0; i<7; i++) reader.readC(); } else { for (int i=0; i<20; i++) reader.readC(); } @@ -2613,7 +2622,8 @@ SafeWriter* DivEngine::saveFur() { w->writeC(song.targetResetsSlides); w->writeC(song.arpNonPorta); w->writeC(song.algMacroBehavior); - for (int i=0; i<8; i++) { + w->writeC(song.brokenShortcutSlides); + for (int i=0; i<7; i++) { w->writeC(0); } diff --git a/src/engine/engine.h b/src/engine/engine.h index 637156b01..a1d4b0d37 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -30,8 +30,8 @@ #include #include -#define DIV_VERSION "0.5.6" -#define DIV_ENGINE_VERSION 48 +#define DIV_VERSION "0.5.7pre1" +#define DIV_ENGINE_VERSION 49 enum DivStatusView { DIV_STATUS_NOTHING=0, diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 3539800e5..663219141 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -685,8 +685,10 @@ void DivEngine::processRow(int i, bool afterDelay) { if ((effectVal&15)!=0) { chan[i].inPorta=true; chan[i].shorthandPorta=true; + if (!song.brokenShortcutSlides) dispatchCmd(DivCommand(DIV_CMD_PRE_PORTA,i,true,0)); } else { chan[i].inPorta=false; + if (!song.brokenShortcutSlides) dispatchCmd(DivCommand(DIV_CMD_PRE_PORTA,i,false,0)); } break; case 0xe2: // portamento down @@ -699,8 +701,10 @@ void DivEngine::processRow(int i, bool afterDelay) { if ((effectVal&15)!=0) { chan[i].inPorta=true; chan[i].shorthandPorta=true; + if (!song.brokenShortcutSlides) dispatchCmd(DivCommand(DIV_CMD_PRE_PORTA,i,true,0)); } else { chan[i].inPorta=false; + if (!song.brokenShortcutSlides) dispatchCmd(DivCommand(DIV_CMD_PRE_PORTA,i,false,0)); } break; case 0xe3: // vibrato direction diff --git a/src/engine/song.h b/src/engine/song.h index 06ce12ec6..de57a78ff 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -245,6 +245,7 @@ struct DivSong { bool targetResetsSlides; bool arpNonPorta; bool algMacroBehavior; + bool brokenShortcutSlides; DivOrders orders; std::vector ins; @@ -302,7 +303,8 @@ struct DivSong { noteOffResetsSlides(true), targetResetsSlides(true), arpNonPorta(false), - algMacroBehavior(false) { + algMacroBehavior(false), + brokenShortcutSlides(false) { for (int i=0; i<32; i++) { system[i]=DIV_SYSTEM_NULL; systemVol[i]=64; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 93bf3f44b..715f32379 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1843,6 +1843,10 @@ void FurnaceGUI::drawCompatFlags() { if (ImGui::IsItemHovered()) { ImGui::SetTooltip("behavior changed in 0.5.5"); } + ImGui::Checkbox("Broken shortcut slides (E1xy/E2xy)",&e->song.brokenShortcutSlides); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("behavior changed in 0.5.7"); + } } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_COMPAT_FLAGS; ImGui::End();