From 5f299996df57e715efae86ca46b0b2395b191731 Mon Sep 17 00:00:00 2001 From: Eknous-P Date: Sun, 8 Dec 2024 23:36:03 +0400 Subject: [PATCH] create sample from wavetable action --- src/gui/doAction.cpp | 32 ++++++++++++++++++++++++++++++++ src/gui/gui.h | 1 + src/gui/guiConst.cpp | 1 + src/gui/waveEdit.cpp | 7 +++++++ 4 files changed, 41 insertions(+) diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 7849d4ee3..1229bb856 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -883,6 +883,38 @@ void FurnaceGUI::doAction(int what) { case GUI_ACTION_WAVE_LIST_SAVE_RAW: if (curWave>=0 && curWave<(int)e->song.wave.size()) openFileDialog(GUI_FILE_WAVE_SAVE_RAW); break; + case GUI_ACTION_WAVE_LIST_CREATE_SAMPLE: + if (curWave>=0 && curWave<(int)e->song.wave.size()) { + DivSample* prevSample=e->getSample(curSample); + curSample=e->addSample(); + if (curSample==-1) { + showError(_("too many samples!")); + } else { + e->lockEngine([this,prevSample]() { + DivSample* sample=e->getSample(curSample); + if (sample!=NULL) { + unsigned int waveLen=e->song.wave[curWave]->len; + sample->rate=(int)round(261.343f*waveLen); // c3 + sample->centerRate=(int)round(261.343f*waveLen); // c3 + sample->loopStart=0; + sample->loopEnd=waveLen; + sample->loop=true; + sample->loopMode=(DivSampleLoopMode)0; + sample->depth=(DivSampleDepth)8; + if (sample->init(waveLen)) { + for (unsigned short i=0; idata8[i]=e->song.wave[curWave]->data[i]-waveLen/2; + } + } + } + e->renderSamples(); + }); + wantScrollListSample=true; + MARK_MODIFIED; + } + updateSampleTex=true; + } + break; case GUI_ACTION_WAVE_LIST_MOVE_UP: if (e->moveWaveUp(curWave)) { curWave--; diff --git a/src/gui/gui.h b/src/gui/gui.h index e3f7dee22..0757db41a 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -854,6 +854,7 @@ enum FurnaceGUIActions { GUI_ACTION_WAVE_LIST_SAVE, GUI_ACTION_WAVE_LIST_SAVE_DMW, GUI_ACTION_WAVE_LIST_SAVE_RAW, + GUI_ACTION_WAVE_LIST_CREATE_SAMPLE, GUI_ACTION_WAVE_LIST_MOVE_UP, GUI_ACTION_WAVE_LIST_MOVE_DOWN, GUI_ACTION_WAVE_LIST_DELETE, diff --git a/src/gui/guiConst.cpp b/src/gui/guiConst.cpp index 8635b6929..06147c3fa 100644 --- a/src/gui/guiConst.cpp +++ b/src/gui/guiConst.cpp @@ -758,6 +758,7 @@ const FurnaceGUIActionDef guiActions[GUI_ACTION_MAX]={ D("WAVE_LIST_SAVE", _N("Save wavetable"), 0), D("WAVE_LIST_SAVE_DMW", _N("Save wavetable (.dmw)"), 0), D("WAVE_LIST_SAVE_RAW", _N("Save wavetable (raw)"), 0), + D("WAVE_LIST_CREATE_SAMPLE", _N("Create sample from wavetable"),0), D("WAVE_LIST_MOVE_UP", _N("Move wavetable up in list"), FURKMOD_SHIFT|SDLK_UP), D("WAVE_LIST_MOVE_DOWN", _N("Move wavetable down in list"), FURKMOD_SHIFT|SDLK_DOWN), D("WAVE_LIST_DELETE", _N("Delete wavetable"), 0), diff --git a/src/gui/waveEdit.cpp b/src/gui/waveEdit.cpp index 1cda66865..ba2a3446b 100644 --- a/src/gui/waveEdit.cpp +++ b/src/gui/waveEdit.cpp @@ -379,6 +379,13 @@ void FurnaceGUI::drawWaveEdit() { ImGui::EndPopup(); } ImGui::SameLine(); + if (ImGui::Button(ICON_FA_UPLOAD)) { + doAction(GUI_ACTION_WAVE_LIST_CREATE_SAMPLE); + } + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip(_("create sample from wavetable")); + } + ImGui::SameLine(); if (ImGui::RadioButton(_("Steps"),waveEditStyle==0)) { waveEditStyle=0;