diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 7d34282f1..678a5bd05 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1428,6 +1428,22 @@ void DivEngine::renderSamples() { } } +void DivEngine::createNew() { + DivSystem sys=song.system; + quitDispatch(); + isBusy.lock(); + song.unload(); + song=DivSong(); + song.system=sys; + chans=getChannelCount(song.system); + renderSamples(); + isBusy.unlock(); + initDispatch(); + isBusy.lock(); + reset(); + isBusy.unlock(); +} + void DivEngine::changeSystem(DivSystem which) { quitDispatch(); isBusy.lock(); diff --git a/src/engine/engine.h b/src/engine/engine.h index 1bcc3d440..1d252a968 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -130,6 +130,8 @@ class DivEngine { void nextBuf(float** in, float** out, int inChans, int outChans, unsigned int size); DivInstrument* getIns(int index); DivWavetable* getWave(int index); + // start fresh + void createNew(); // load a .dmf. bool load(unsigned char* f, size_t length); // save as .dmf. diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 734e1ef8a..0dba56840 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2237,10 +2237,11 @@ bool FurnaceGUI::loop() { ImGui::BeginMainMenuBar(); if (ImGui::BeginMenu("file")) { - ImGui::MenuItem("new"); + if (ImGui::MenuItem("new")) { + e->createNew(); + } if (ImGui::MenuItem("open...")) { openFileDialog(GUI_FILE_OPEN); - } ImGui::Separator(); ImGui::MenuItem("save");