sample banks part 2
This commit is contained in:
		
							parent
							
								
									dce4c9a4b2
								
							
						
					
					
						commit
						235a254458
					
				
							
								
								
									
										314
									
								
								src/gui/gui.cpp
									
									
									
									
									
								
							
							
						
						
									
										314
									
								
								src/gui/gui.cpp
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -3739,8 +3739,9 @@ bool FurnaceGUI::loop() {
 | 
			
		|||
            }
 | 
			
		||||
            int sampleCountBefore=e->song.sampleLen;
 | 
			
		||||
            std::vector<DivInstrument*> instruments=e->instrumentFromFile(ev.drop.file,true,settings.readInsNames);
 | 
			
		||||
            std::vector<DivSample*> 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,39 +5274,69 @@ 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<DivSample*> 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) {
 | 
			
		||||
                } 
 | 
			
		||||
                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 {
 | 
			
		||||
                      } 
 | 
			
		||||
                      else 
 | 
			
		||||
                      {
 | 
			
		||||
                        showError(e->getLastError());
 | 
			
		||||
                      }
 | 
			
		||||
                  } else {
 | 
			
		||||
                    } 
 | 
			
		||||
                    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;
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
              if (warn) {
 | 
			
		||||
                showWarning(errs,GUI_WARN_GENERIC);
 | 
			
		||||
              }
 | 
			
		||||
              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<DivSample*> 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]() {
 | 
			
		||||
              } 
 | 
			
		||||
              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;
 | 
			
		||||
| 
						 | 
				
			
			@ -5300,9 +5345,20 @@ bool FurnaceGUI::loop() {
 | 
			
		|||
                      MARK_MODIFIED;
 | 
			
		||||
                    });
 | 
			
		||||
                    updateSampleTex=true;
 | 
			
		||||
                } else {
 | 
			
		||||
                  } 
 | 
			
		||||
                  else 
 | 
			
		||||
                  {
 | 
			
		||||
                    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;
 | 
			
		||||
| 
						 | 
				
			
			@ -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<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);
 | 
			
		||||
    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),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue