diff --git a/CMakeLists.txt b/CMakeLists.txt index 9af0ba741..80e2c2fde 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -265,6 +265,9 @@ if (USE_SDL2) if (MSVC) list(APPEND DEPENDENCIES_COMPILE_OPTIONS "/DHAVE_LIBC") endif() + if (WIN32) + list(APPEND DEPENDENCIES_LIBRARIES SDL2main) + endif() message(STATUS "Using vendored SDL2") endif() else() diff --git a/demos/nes/the_best-1990.fur b/demos/nes/the_best-1990.fur new file mode 100644 index 000000000..c5b62f15f Binary files /dev/null and b/demos/nes/the_best-1990.fur differ diff --git a/demos/nes/turtle_byte.fur b/demos/nes/turtle_byte.fur new file mode 100644 index 000000000..b097ebc90 Binary files /dev/null and b/demos/nes/turtle_byte.fur differ diff --git a/demos/pc98/Blue_Nebula.fur b/demos/pc98/Blue_Nebula.fur new file mode 100644 index 000000000..546331691 Binary files /dev/null and b/demos/pc98/Blue_Nebula.fur differ diff --git a/src/engine/platform/namcowsg.cpp b/src/engine/platform/namcowsg.cpp index cb4540f5c..4d49d2787 100644 --- a/src/engine/platform/namcowsg.cpp +++ b/src/engine/platform/namcowsg.cpp @@ -230,7 +230,7 @@ void DivPlatformNamcoWSG::tick(bool sysTick) { if (chan[i].std.pitch.had) { if (chan[i].std.pitch.mode) { chan[i].pitch2+=chan[i].std.pitch.val; - CLAMP_VAR(chan[i].pitch2,-32768,32767); + CLAMP_VAR(chan[i].pitch2,-1048575,1048575); } else { chan[i].pitch2=chan[i].std.pitch.val; } @@ -244,6 +244,7 @@ void DivPlatformNamcoWSG::tick(bool sysTick) { if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { //DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_PCE); chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,false,2,chan[i].pitch2,chipClock,CHIP_FREQBASE); + if (chan[i].freq<0) chan[i].freq=0; if (chan[i].freq>1048575) chan[i].freq=1048575; if (chan[i].keyOn) { } diff --git a/src/engine/platform/qsound.cpp b/src/engine/platform/qsound.cpp index 57ab138c6..0bf6bf2a7 100644 --- a/src/engine/platform/qsound.cpp +++ b/src/engine/platform/qsound.cpp @@ -707,11 +707,11 @@ const void* DivPlatformQSound::getSampleMem(int index) { } size_t DivPlatformQSound::getSampleMemCapacity(int index) { - return index == 0 ? 16777216 : index == 1 ? MAX(0,16777216 - sampleMemUsage) : 0; + return index == 0 ? 16777216 : index == 1 ? (sampleMemUsage>=16777216?1:(16777216 - sampleMemUsage)) : 0; } size_t DivPlatformQSound::getSampleMemUsage(int index) { - return index == 0 ? sampleMemLen : index == 1 ? MAX(0,sampleMemLenBS - sampleMemUsage) : 0; + return index == 0 ? sampleMemLen : index == 1 ? ((sampleMemUsage>=sampleMemLenBS)?0:(sampleMemLenBS - sampleMemUsage)) : 0; } bool DivPlatformQSound::isSampleLoaded(int index, int sample) { diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 1ec735f1d..c22a1c2b6 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -5148,7 +5148,12 @@ bool FurnaceGUI::loop() { renderTimeDelta=renderTimeEnd-renderTimeBegin; eventTimeDelta=eventTimeEnd-eventTimeBegin; - if (--soloTimeout<0) soloTimeout=0; + soloTimeout-=ImGui::GetIO().DeltaTime; + if (soloTimeout<0) { + soloTimeout=0; + } else { + WAKE_UP; + } wheelX=0; wheelY=0; @@ -5784,7 +5789,6 @@ FurnaceGUI::FurnaceGUI(): editStep(1), exportLoops(0), soloChan(-1), - soloTimeout(0), orderEditMode(0), orderCursor(-1), loopOrder(-1), @@ -5803,6 +5807,7 @@ FurnaceGUI::FurnaceGUI(): dragDestinationY(0), oldBeat(-1), oldBar(-1), + soloTimeout(0.0f), exportFadeOut(5.0), editControlsOpen(true), ordersOpen(true), diff --git a/src/gui/gui.h b/src/gui/gui.h index 15319f747..48488eac4 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1294,6 +1294,7 @@ class FurnaceGUI { int exportLoops; double exportFadeOut; int macroLayout; + float doubleClickTime; unsigned int maxUndoSteps; String mainFontPath; String patFontPath; @@ -1428,6 +1429,7 @@ class FurnaceGUI { exportLoops(0), exportFadeOut(0.0), macroLayout(0), + doubleClickTime(0.3f), maxUndoSteps(100), mainFontPath(""), patFontPath(""), @@ -1447,9 +1449,10 @@ class FurnaceGUI { DivInstrument* prevInsData; - int curIns, curWave, curSample, curOctave, curOrder, prevIns, oldRow, oldOrder, oldOrder1, editStep, exportLoops, soloChan, soloTimeout, orderEditMode, orderCursor; + int curIns, curWave, curSample, curOctave, curOrder, prevIns, oldRow, oldOrder, oldOrder1, editStep, exportLoops, soloChan,orderEditMode, orderCursor; int loopOrder, loopRow, loopEnd, isClipping, extraChannelButtons, patNameTarget, newSongCategory, latchTarget; int wheelX, wheelY, dragSourceX, dragSourceY, dragDestinationX, dragDestinationY, oldBeat, oldBar; + float soloTimeout; double exportFadeOut; diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 3502b8a52..fbaf4e655 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -755,7 +755,7 @@ void FurnaceGUI::drawPattern() { soloTimeout=0; } else { e->toggleMute(i); - soloTimeout=20; + soloTimeout=settings.doubleClickTime; soloChan=i; } } diff --git a/src/gui/plot_nolerp.cpp b/src/gui/plot_nolerp.cpp index f1120ed4a..12bfb9fca 100644 --- a/src/gui/plot_nolerp.cpp +++ b/src/gui/plot_nolerp.cpp @@ -367,7 +367,7 @@ int PlotCustomEx(ImGuiPlotType plot_type, const char* label, float (*values_gett if (plot_type == ImGuiPlotType_Lines) ImGui::SetTooltip("%d: %8.4g\n%d: %8.4g", v_idx, v0, v_idx + 1, v1); else if (plot_type == ImGuiPlotType_Histogram) - ImGui::SetTooltip("%d: %8.4g", v_idx+values_display_offset, v0); + ImGui::SetTooltip("%d: %d", v_idx+values_display_offset, (int)v0); } idx_hovered = v_idx; } diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index b998d3215..bcb90d35f 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -492,6 +492,13 @@ void FurnaceGUI::drawSettings() { ImGui::Separator(); + if (CWSliderFloat("Double-click time (seconds)",&settings.doubleClickTime,0.02,1.0,"%.2f")) { + if (settings.doubleClickTime<0.02) settings.doubleClickTime=0.02; + if (settings.doubleClickTime>1.0) settings.doubleClickTime=1.0; + + applyUISettings(false); + } + ImGui::Text("Toggle channel solo on:"); if (ImGui::RadioButton("Right-click or double-click##soloA",settings.soloAction==0)) { settings.soloAction=0; @@ -2557,6 +2564,7 @@ void FurnaceGUI::syncSettings() { settings.exportLoops=e->getConfInt("exportLoops",0); settings.exportFadeOut=e->getConfDouble("exportFadeOut",0.0); settings.macroLayout=e->getConfInt("macroLayout",0); + settings.doubleClickTime=e->getConfFloat("doubleClickTime",0.3f); clampSetting(settings.mainFontSize,2,96); clampSetting(settings.patFontSize,2,96); @@ -2667,6 +2675,7 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.ordersCursor,0,1); clampSetting(settings.persistFadeOut,0,1); clampSetting(settings.macroLayout,0,4); + clampSetting(settings.doubleClickTime,0.02,1.0); if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; @@ -2870,6 +2879,7 @@ void FurnaceGUI::commitSettings() { e->setConf("exportLoops",settings.exportLoops); e->setConf("exportFadeOut",settings.exportFadeOut); e->setConf("macroLayout",settings.macroLayout); + e->setConf("doubleClickTime",settings.doubleClickTime); // colors for (int i=0; i