From 235a2544582a4d7de1787e8d08675d52a952b048 Mon Sep 17 00:00:00 2001 From: freq-mod Date: Mon, 12 Aug 2024 18:22:52 +0200 Subject: [PATCH] sample banks part 2 --- src/gui/gui.cpp | 340 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 308 insertions(+), 32 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 3ba5e2705..8b2ce9ef0 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3739,8 +3739,9 @@ bool FurnaceGUI::loop() { } int sampleCountBefore=e->song.sampleLen; std::vector instruments=e->instrumentFromFile(ev.drop.file,true,settings.readInsNames); + std::vector samples = e->sampleFromFile(ev.drop.file); DivWavetable* droppedWave=NULL; - DivSample* droppedSample=NULL; + //DivSample* droppedSample=NULL; if (!instruments.empty()) { if (e->song.sampleLen!=sampleCountBefore) { e->renderSamplesP(); @@ -3765,10 +3766,24 @@ bool FurnaceGUI::loop() { } nextWindow=GUI_WINDOW_WAVE_LIST; MARK_MODIFIED; - } else if ((droppedSample=e->sampleFromFile(ev.drop.file))!=NULL) { + } + else if (!samples.empty()) + { + if (e->song.sampleLen!=sampleCountBefore) { + //e->renderSamplesP(); + } + if (!e->getWarnings().empty()) + { + showWarning(e->getWarnings(),GUI_WARN_GENERIC); + } int sampleCount=-1; - sampleCount=e->addSamplePtr(droppedSample); - if (sampleCount>=0 && settings.selectAssetOnLoad) { + for (DivSample* s: samples) + { + sampleCount=e->addSamplePtr(s); + } + //sampleCount=e->addSamplePtr(droppedSample); + if (sampleCount>=0 && settings.selectAssetOnLoad) + { curSample=sampleCount; updateSampleTex=true; } @@ -5259,24 +5274,45 @@ bool FurnaceGUI::loop() { String errs=_("there were some errors while loading samples:\n"); bool warn=false; for (String i: fileDialog->getFileName()) { - DivSample* s=e->sampleFromFile(i.c_str()); - if (s==NULL) { + DivSample*=e->sampleFromFile(i.c_str()); + if () { + std::vector samples=e->sampleFromFile(i.c_str()); + if (samples.empty()) { if (fileDialog->getFileName().size()>1) { warn=true; errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError()); } else {; showError(e->getLastError()); } - } else { - if (e->addSamplePtr(s)==-1) { - if (fileDialog->getFileName().size()>1) { - warn=true; - errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError()); - } else { - showError(e->getLastError()); + } + else + { + if((int)samples.size() == 1) + { + if (e->addSamplePtr(samples[0]) == -1) + { + if (fileDialog->getFileName().size()>1) + { + warn=true; + errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError()); + } + else + { + showError(e->getLastError()); + } + } + else + { + MARK_MODIFIED; } - } else { - MARK_MODIFIED; + } + else + { + for (DivSample* s: samples) { //ask which samples to load! + pendingSamples.push_back(std::make_pair(s,false)); + } + displayPendingSamples=true; + replacePendingSample = false; } } } @@ -5285,24 +5321,44 @@ bool FurnaceGUI::loop() { } break; } - case GUI_FILE_SAMPLE_OPEN_REPLACE: { - DivSample* s=e->sampleFromFile(copyOfName.c_str()); - if (s==NULL) { + case GUI_FILE_SAMPLE_OPEN_REPLACE: + { + std::vector samples=e->sampleFromFile(copyOfName.c_str()); + if (samples.empty()) + { showError(e->getLastError()); - } else { - if (curSample>=0 && curSample<(int)e->song.sample.size()) { - e->lockEngine([this,s]() { - // if it crashes here please tell me... - DivSample* oldSample=e->song.sample[curSample]; - e->song.sample[curSample]=s; - delete oldSample; - e->renderSamples(); - MARK_MODIFIED; - }); - updateSampleTex=true; - } else { - showError(_("...but you haven't selected a sample!")); - delete s; + } + else + { + if((int)samples.size() == 1) + { + if (curSample>=0 && curSample<(int)e->song.sample.size()) + { + DivSample* s = samples[0]; + e->lockEngine([this, s]() + { + // if it crashes here please tell me... + DivSample* oldSample=e->song.sample[curSample]; + e->song.sample[curSample]= s; + delete oldSample; + e->renderSamples(); + MARK_MODIFIED; + }); + updateSampleTex=true; + } + else + { + showError(_("...but you haven't selected a sample!")); + delete samples[0]; + } + } + else + { + for (DivSample* s: samples) { //ask which samples to load! + pendingSamples.push_back(std::make_pair(s,false)); + } + displayPendingSamples=true; + replacePendingSample = true; } } break; @@ -5690,6 +5746,11 @@ bool FurnaceGUI::loop() { ImGui::OpenPopup(_("Select Instrument")); } + if (displayPendingSamples) { + displayPendingSamples=false; + ImGui::OpenPopup(_("Select Sample")); + } + if (displayPendingRawSample) { displayPendingRawSample=false; ImGui::OpenPopup(_("Import Raw Sample")); @@ -6422,6 +6483,190 @@ bool FurnaceGUI::loop() { } ImGui::EndPopup(); } +centerNextWindow(_("Select Sample"),canvasW,canvasH); + if (ImGui::BeginPopupModal(_("Select Sample"),NULL,ImGuiWindowFlags_AlwaysAutoResize)) { + bool quitPlease=false; + + ImGui::AlignTextToFramePadding(); + ImGui::Text(_("this is a sample bank! select which ones to load:")); + ImGui::SameLine(); + if (ImGui::Button(_("All"))) { + for (std::pair& i: pendingSamples) { + i.second=true; + } + } + ImGui::SameLine(); + if (ImGui::Button(_("None"))) { + for (std::pair& i: pendingSamples) { + i.second=false; + } + } + bool reissueSearch=false; + + if (ImGui::InputTextWithHint("##SysSearch",settings.language == 0 ? "Search..." : _("Search..."),&sampleBankSearchQuery)) reissueSearch=true; + + bool anySelected=false; + float sizeY=ImGui::GetFrameHeightWithSpacing()*pendingSamples.size(); + if (sizeY>(canvasH-180.0*dpiScale)) + { + sizeY=canvasH-180.0*dpiScale; + if (sizeY<60.0*dpiScale) sizeY=60.0*dpiScale; + } + if (ImGui::BeginTable("PendingSamplesList",1,ImGuiTableFlags_ScrollY,ImVec2(0.0f,sizeY))) + { + if (sampleBankSearchQuery.empty()) + { + for (size_t i=0; iname); + if (pendingInsSingle) + { + if (ImGui::Selectable(id.c_str())) + { + pendingSamples[i].second=true; + quitPlease=true; + } + } + else + { + ImGuiIO& io = ImGui::GetIO(); + if(ImGui::Checkbox(id.c_str(),&pendingSamples[i].second) && io.KeyShift) + { + for(int jj = (int)i - 1; jj >= 0; jj--) + { + if(pendingSamples[jj].second) //pressed shift and there's selected item above + { + for(int k = jj; k < (int)i; k++) + { + pendingSamples[k].second = true; + } + + break; + } + } + } + } + if (pendingSamples[i].second) anySelected=true; + } + } + else //display search results + { + if(reissueSearch) + { + String lowerCase=sampleBankSearchQuery; + + for (char& ii: lowerCase) + { + if (ii>='A' && ii<='Z') ii+='a'-'A'; + } + + sampleBankSearchResults.clear(); + for (int j=0; j < (int)pendingSamples.size(); j++) + { + String lowerCase1 = pendingSamples[j].first->name; + + for (char& ii: lowerCase1) + { + if (ii>='A' && ii<='Z') ii+='a'-'A'; + } + + if (lowerCase1.find(lowerCase)!=String::npos) + { + sampleBankSearchResults.push_back(std::make_pair(pendingSamples[j].first, pendingSamples[j].second)); + } + } + } + + for (size_t i=0; iname); + + ImGuiIO& io = ImGui::GetIO(); + if(ImGui::Checkbox(id.c_str(),&sampleBankSearchResults[i].second) && io.KeyShift) + { + for(int jj = (int)i - 1; jj >= 0; jj--) + { + if(sampleBankSearchResults[jj].second) //pressed shift and there's selected item above + { + for(int k = jj; k < (int)i; k++) + { + sampleBankSearchResults[k].second = true; + } + + break; + } + } + } + if (sampleBankSearchResults[i].second) anySelected=true; + } + + for (size_t i=0; i 0) + { + for (size_t j=0; j& i: pendingSamples) { + i.second=false; + } + quitPlease=true; + } + if (quitPlease) + { + ImGui::CloseCurrentPopup(); + int counter = 0; + for (std::pair& i: pendingSamples) + { + if (!i.second) + { + delete i.first; + } + else + { + if(counter == 0 && replacePendingSample) + { + *e->song.sample[curSample]=*i.first; + replacePendingSample = false; + } + else + { + e->addSamplePtr(i.first); + } + } + counter++; + } + + curSample = (int)e->song.sample.size() - 1; + pendingSamples.clear(); + } + + ImGui::EndPopup(); + } centerNextWindow(_("Import Raw Sample"),canvasW,canvasH); if (ImGui::BeginPopupModal(_("Import Raw Sample"),NULL,ImGuiWindowFlags_AlwaysAutoResize)) { @@ -7435,6 +7680,14 @@ bool FurnaceGUI::init() { compatFormats+="*.dmc "; compatFormats+="*.brr"; + + compatFormats+="*.ppc "; + compatFormats+="*.pps "; + compatFormats+="*.pvi "; + compatFormats+="*.pdx "; + compatFormats+="*.pzi "; + compatFormats+="*.p86 "; + compatFormats+="*.p"; audioLoadFormats[1]=compatFormats; audioLoadFormats.push_back(_("NES DPCM data")); @@ -7443,6 +7696,27 @@ bool FurnaceGUI::init() { audioLoadFormats.push_back(_("SNES Bit Rate Reduction")); audioLoadFormats.push_back("*.brr"); + audioLoadFormats.push_back(_("PMD YM2608 ADPCM-B sample bank")); + audioLoadFormats.push_back("*.ppc"); + + audioLoadFormats.push_back(_("PDR 4-bit AY-3-8910 sample bank")); + audioLoadFormats.push_back("*.pps"); + + audioLoadFormats.push_back(_("FMP YM2608 ADPCM-B sample bank")); + audioLoadFormats.push_back("*.pvi"); + + audioLoadFormats.push_back(_("MDX OKI ADPCM sample bank")); + audioLoadFormats.push_back("*.pdx"); + + audioLoadFormats.push_back(_("FMP 8-bit PCM sample bank")); + audioLoadFormats.push_back("*.pzi"); + + audioLoadFormats.push_back(_("PMD 8-bit PCM sample bank")); + audioLoadFormats.push_back("*.p86"); + + audioLoadFormats.push_back(_("PMD OKI ADPCM sample bank")); + audioLoadFormats.push_back("*.p"); + audioLoadFormats.push_back(_("all files")); audioLoadFormats.push_back("*"); @@ -7865,6 +8139,8 @@ FurnaceGUI::FurnaceGUI(): snesFilterHex(false), modTableHex(false), displayEditString(false), + displayPendingSamples(false), + replacePendingSample(false), changeCoarse(false), mobileEdit(false), killGraphics(false),