diff --git a/src/engine/macroInt.h b/src/engine/macroInt.h index d7b2912d..599f0ca0 100644 --- a/src/engine/macroInt.h +++ b/src/engine/macroInt.h @@ -7,9 +7,9 @@ class DivMacroInt { DivInstrument* ins; int volPos, arpPos, dutyPos, wavePos; public: - unsigned char vol; - signed char arp; - unsigned char duty, wave; + int vol; + int arp; + int duty, wave; bool hasVol, hasArp, hasDuty, hasWave; bool hadVol, hadArp, hadDuty, hadWave; bool finishedVol, finishedArp, finishedDuty, finishedWave; diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index e26aca80..619ee92c 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -51,7 +51,12 @@ void DivPlatformC64::tick() { } } if (chan[i].std.hadDuty) { - chan[i].duty-=((signed char)chan[i].std.duty-12)*4; + DivInstrument* ins=parent->getIns(chan[i].ins); + if (ins->c64.dutyIsAbs) { + chan[i].duty=chan[i].std.duty; + } else { + chan[i].duty-=((signed char)chan[i].std.duty-12)*4; + } rWrite(i*7+2,chan[i].duty&0xff); rWrite(i*7+3,chan[i].duty>>8); } diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index c63c421c..f3da2868 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -737,6 +737,8 @@ void FurnaceGUI::drawInsEdit() { ImGui::PopStyleColor(); ImGui::Checkbox("Volume Macro is Cutoff Macro",&ins->c64.volIsCutoff); + ImGui::Checkbox("Absolute Cutoff Macro",&ins->c64.filterIsAbs); + ImGui::Checkbox("Absolute Duty Macro",&ins->c64.dutyIsAbs); ImGui::EndTabItem(); } if (ins->type==DIV_INS_AMIGA) if (ImGui::BeginTabItem("Amiga")) { @@ -854,12 +856,20 @@ void FurnaceGUI::drawInsEdit() { // duty macro int dutyMax=dutyMacroHeight; if (ins->type==DIV_INS_C64) { - dutyMax=24; + if (ins->c64.dutyIsAbs) { + dutyMax=4095; + } else { + dutyMax=24; + } } if (dutyMax>0) { ImGui::Separator(); if (ins->type==DIV_INS_C64) { - ImGui::Text("Relative Duty Macro"); + if (ins->c64.dutyIsAbs) { + ImGui::Text("Absolute Duty Macro"); + } else { + ImGui::Text("Relative Duty Macro"); + } } else { ImGui::Text("Duty/Noise Mode Macro"); ImGui::SameLine(); @@ -877,13 +887,14 @@ void FurnaceGUI::drawInsEdit() { ImGui::SetTooltip("Neo Geo SSG/AY-3-8910/YM2149 only"); } } + bool dutyIsRel=(ins->type==DIV_INS_C64 && !ins->c64.dutyIsAbs); for (int i=0; istd.dutyMacroLen; i++) { - asFloat[i]=ins->std.dutyMacro[i]-(ins->type==DIV_INS_C64?12:0); + asFloat[i]=ins->std.dutyMacro[i]-(dutyIsRel?12:0); loopIndicator[i]=(ins->std.dutyMacroLoop!=-1 && i>=ins->std.dutyMacroLoop); } ImGui::PushStyleVar(ImGuiStyleVar_FramePadding,ImVec2(0.0f,0.0f)); - ImGui::PlotHistogram("##IDutyMacro",asFloat,ins->std.dutyMacroLen,0,NULL,ins->type==DIV_INS_C64?-12:0,dutyMax-(ins->type==DIV_INS_C64?12:0),ImVec2(400.0f*dpiScale,200.0f*dpiScale)); + ImGui::PlotHistogram("##IDutyMacro",asFloat,ins->std.dutyMacroLen,0,NULL,dutyIsRel?-12:0,dutyMax-(dutyIsRel?12:0),ImVec2(400.0f*dpiScale,200.0f*dpiScale)); if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) { macroDragStart=ImGui::GetItemRectMin(); macroDragAreaSize=ImVec2(400.0f*dpiScale,200.0f*dpiScale);