sample banks part 2

This commit is contained in:
freq-mod 2024-08-12 18:22:52 +02:00
parent dce4c9a4b2
commit 235a254458

View file

@ -3739,8 +3739,9 @@ bool FurnaceGUI::loop() {
} }
int sampleCountBefore=e->song.sampleLen; int sampleCountBefore=e->song.sampleLen;
std::vector<DivInstrument*> instruments=e->instrumentFromFile(ev.drop.file,true,settings.readInsNames); std::vector<DivInstrument*> instruments=e->instrumentFromFile(ev.drop.file,true,settings.readInsNames);
std::vector<DivSample*> samples = e->sampleFromFile(ev.drop.file);
DivWavetable* droppedWave=NULL; DivWavetable* droppedWave=NULL;
DivSample* droppedSample=NULL; //DivSample* droppedSample=NULL;
if (!instruments.empty()) { if (!instruments.empty()) {
if (e->song.sampleLen!=sampleCountBefore) { if (e->song.sampleLen!=sampleCountBefore) {
e->renderSamplesP(); e->renderSamplesP();
@ -3765,10 +3766,24 @@ bool FurnaceGUI::loop() {
} }
nextWindow=GUI_WINDOW_WAVE_LIST; nextWindow=GUI_WINDOW_WAVE_LIST;
MARK_MODIFIED; 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; int sampleCount=-1;
sampleCount=e->addSamplePtr(droppedSample); for (DivSample* s: samples)
if (sampleCount>=0 && settings.selectAssetOnLoad) { {
sampleCount=e->addSamplePtr(s);
}
//sampleCount=e->addSamplePtr(droppedSample);
if (sampleCount>=0 && settings.selectAssetOnLoad)
{
curSample=sampleCount; curSample=sampleCount;
updateSampleTex=true; updateSampleTex=true;
} }
@ -5259,39 +5274,69 @@ bool FurnaceGUI::loop() {
String errs=_("there were some errors while loading samples:\n"); String errs=_("there were some errors while loading samples:\n");
bool warn=false; bool warn=false;
for (String i: fileDialog->getFileName()) { for (String i: fileDialog->getFileName()) {
DivSample* s=e->sampleFromFile(i.c_str()); DivSample*=e->sampleFromFile(i.c_str());
if (s==NULL) { if () {
std::vector<DivSample*> samples=e->sampleFromFile(i.c_str());
if (samples.empty()) {
if (fileDialog->getFileName().size()>1) { if (fileDialog->getFileName().size()>1) {
warn=true; warn=true;
errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError()); errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError());
} else {; } else {;
showError(e->getLastError()); showError(e->getLastError());
} }
} else { }
if (e->addSamplePtr(s)==-1) { else
if (fileDialog->getFileName().size()>1) { {
if((int)samples.size() == 1)
{
if (e->addSamplePtr(samples[0]) == -1)
{
if (fileDialog->getFileName().size()>1)
{
warn=true; warn=true;
errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError()); errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError());
} else { }
else
{
showError(e->getLastError()); showError(e->getLastError());
} }
} else { }
else
{
MARK_MODIFIED; MARK_MODIFIED;
} }
} }
else
{
for (DivSample* s: samples) { //ask which samples to load!
pendingSamples.push_back(std::make_pair(s,false));
}
displayPendingSamples=true;
replacePendingSample = false;
}
}
} }
if (warn) { if (warn) {
showWarning(errs,GUI_WARN_GENERIC); showWarning(errs,GUI_WARN_GENERIC);
} }
break; break;
} }
case GUI_FILE_SAMPLE_OPEN_REPLACE: { case GUI_FILE_SAMPLE_OPEN_REPLACE:
DivSample* s=e->sampleFromFile(copyOfName.c_str()); {
if (s==NULL) { std::vector<DivSample*> samples=e->sampleFromFile(copyOfName.c_str());
if (samples.empty())
{
showError(e->getLastError()); showError(e->getLastError());
} else { }
if (curSample>=0 && curSample<(int)e->song.sample.size()) { else
e->lockEngine([this,s]() { {
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... // if it crashes here please tell me...
DivSample* oldSample=e->song.sample[curSample]; DivSample* oldSample=e->song.sample[curSample];
e->song.sample[curSample]= s; e->song.sample[curSample]= s;
@ -5300,9 +5345,20 @@ bool FurnaceGUI::loop() {
MARK_MODIFIED; MARK_MODIFIED;
}); });
updateSampleTex=true; updateSampleTex=true;
} else { }
else
{
showError(_("...but you haven't selected a sample!")); showError(_("...but you haven't selected a sample!"));
delete s; 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; break;
@ -5690,6 +5746,11 @@ bool FurnaceGUI::loop() {
ImGui::OpenPopup(_("Select Instrument")); ImGui::OpenPopup(_("Select Instrument"));
} }
if (displayPendingSamples) {
displayPendingSamples=false;
ImGui::OpenPopup(_("Select Sample"));
}
if (displayPendingRawSample) { if (displayPendingRawSample) {
displayPendingRawSample=false; displayPendingRawSample=false;
ImGui::OpenPopup(_("Import Raw Sample")); ImGui::OpenPopup(_("Import Raw Sample"));
@ -6422,6 +6483,190 @@ bool FurnaceGUI::loop() {
} }
ImGui::EndPopup(); 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<DivSample*,bool>& i: pendingSamples) {
i.second=true;
}
}
ImGui::SameLine();
if (ImGui::Button(_("None"))) {
for (std::pair<DivSample*,bool>& 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; i<pendingSamples.size(); i++)
{
ImGui::TableNextRow();
ImGui::TableNextColumn();
String id=fmt::sprintf("%d: %s",(int)i,pendingSamples[i].first->name);
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; i<sampleBankSearchResults.size(); i++)
{
ImGui::TableNextRow();
ImGui::TableNextColumn();
String id=fmt::sprintf("%d: %s",(int)i,sampleBankSearchResults[i].first->name);
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<pendingSamples.size(); i++)
{
if(sampleBankSearchResults.size() > 0)
{
for (size_t j=0; j<sampleBankSearchResults.size(); j++)
{
if(sampleBankSearchResults[j].first == pendingSamples[i].first && sampleBankSearchResults[j].second && pendingSamples[i].first != NULL)
{
pendingSamples[i].second = true;
if (pendingSamples[i].second) anySelected=true;
break;
}
}
}
}
}
ImGui::EndTable();
}
ImGui::BeginDisabled(!anySelected);
if (ImGui::Button(_("OK"))) {
quitPlease=true;
}
ImGui::EndDisabled();
ImGui::SameLine();
if (ImGui::Button(_("Cancel")) || ImGui::IsKeyPressed(ImGuiKey_Escape)) {
for (std::pair<DivSample*,bool>& i: pendingSamples) {
i.second=false;
}
quitPlease=true;
}
if (quitPlease)
{
ImGui::CloseCurrentPopup();
int counter = 0;
for (std::pair<DivSample*,bool>& 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); centerNextWindow(_("Import Raw Sample"),canvasW,canvasH);
if (ImGui::BeginPopupModal(_("Import Raw Sample"),NULL,ImGuiWindowFlags_AlwaysAutoResize)) { if (ImGui::BeginPopupModal(_("Import Raw Sample"),NULL,ImGuiWindowFlags_AlwaysAutoResize)) {
@ -7435,6 +7680,14 @@ bool FurnaceGUI::init() {
compatFormats+="*.dmc "; compatFormats+="*.dmc ";
compatFormats+="*.brr"; compatFormats+="*.brr";
compatFormats+="*.ppc ";
compatFormats+="*.pps ";
compatFormats+="*.pvi ";
compatFormats+="*.pdx ";
compatFormats+="*.pzi ";
compatFormats+="*.p86 ";
compatFormats+="*.p";
audioLoadFormats[1]=compatFormats; audioLoadFormats[1]=compatFormats;
audioLoadFormats.push_back(_("NES DPCM data")); audioLoadFormats.push_back(_("NES DPCM data"));
@ -7443,6 +7696,27 @@ bool FurnaceGUI::init() {
audioLoadFormats.push_back(_("SNES Bit Rate Reduction")); audioLoadFormats.push_back(_("SNES Bit Rate Reduction"));
audioLoadFormats.push_back("*.brr"); 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(_("all files"));
audioLoadFormats.push_back("*"); audioLoadFormats.push_back("*");
@ -7865,6 +8139,8 @@ FurnaceGUI::FurnaceGUI():
snesFilterHex(false), snesFilterHex(false),
modTableHex(false), modTableHex(false),
displayEditString(false), displayEditString(false),
displayPendingSamples(false),
replacePendingSample(false),
changeCoarse(false), changeCoarse(false),
mobileEdit(false), mobileEdit(false),
killGraphics(false), killGraphics(false),