From dce4c9a4b2483ce32ea5fabc0ab8e6b5fba338a7 Mon Sep 17 00:00:00 2001 From: freq-mod Date: Mon, 12 Aug 2024 15:54:37 +0200 Subject: [PATCH 01/28] sample bank import --- CMakeLists.txt | 8 ++ src/engine/engine.h | 14 +++- src/engine/fileOpsSample.cpp | 152 ++++++++++++++++++++++++++++++----- src/gui/gui.h | 5 +- 4 files changed, 155 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b7bc35433..a4b2a922c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -681,6 +681,14 @@ src/engine/fileOps/text.cpp src/engine/fileOps/tfm.cpp src/engine/fileOps/xm.cpp +src/engine/fileOps/p.cpp +src/engine/fileOps/p86.cpp +src/engine/fileOps/pdx.cpp +src/engine/fileOps/ppc.cpp +src/engine/fileOps/pps.cpp +src/engine/fileOps/pvi.cpp +src/engine/fileOps/pzi.cpp + src/engine/blip_buf.c src/engine/brrUtils.c src/engine/safeReader.cpp diff --git a/src/engine/engine.h b/src/engine/engine.h index a2e900c81..6979f2c26 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -617,6 +617,17 @@ class DivEngine { void loadFF(SafeReader& reader, std::vector& ret, String& stripPath); void loadWOPL(SafeReader& reader, std::vector& ret, String& stripPath); void loadWOPN(SafeReader& reader, std::vector& ret, String& stripPath); + + //sample banks + void loadP(SafeReader& reader, std::vector& ret, String& stripPath); + void loadPPC(SafeReader& reader, std::vector& ret, String& stripPath); + void loadPPS(SafeReader& reader, std::vector& ret, String& stripPath); + void loadPVI(SafeReader& reader, std::vector& ret, String& stripPath); + void loadPDX(SafeReader& reader, std::vector& ret, String& stripPath); + void loadPZI(SafeReader& reader, std::vector& ret, String& stripPath); + void loadP86(SafeReader& reader, std::vector& ret, String& stripPath); + + int loadSampleROM(String path, ssize_t expectedSize, unsigned char*& ret); @@ -1027,7 +1038,8 @@ class DivEngine { int addSamplePtr(DivSample* which); // get sample from file - DivSample* sampleFromFile(const char* path); + //DivSample* sampleFromFile(const char* path); + std::vector sampleFromFile(const char* path); // get raw sample DivSample* sampleFromFileRaw(const char* path, DivSampleDepth depth, int channels, bool bigEndian, bool unsign, bool swapNibbles, int rate); diff --git a/src/engine/fileOpsSample.cpp b/src/engine/fileOpsSample.cpp index 26d921ac8..711ea74b3 100644 --- a/src/engine/fileOpsSample.cpp +++ b/src/engine/fileOpsSample.cpp @@ -24,10 +24,12 @@ #include "sfWrapper.h" #endif -DivSample* DivEngine::sampleFromFile(const char* path) { +std::vector DivEngine::sampleFromFile(const char* path) { + std::vector ret; + if (song.sample.size()>=256) { lastError="too many samples!"; - return NULL; + return ret; } BUSY_BEGIN; warnings=""; @@ -58,6 +60,110 @@ DivSample* DivEngine::sampleFromFile(const char* path) { } extS+=i; } + + if(extS == ".pps" || extS == ".ppc" || extS == ".pvi" || + extS == ".pdx" || extS == ".pzi" || extS == ".p86" || + extS == ".p") //sample banks! + { + String stripPath; + const char* pathReduxEnd=strrchr(pathRedux,'.'); + if (pathReduxEnd==NULL) { + stripPath=pathRedux; + } else { + for (const char* i=pathRedux; i!=pathReduxEnd && (*i); i++) { + stripPath+=*i; + } + } + + FILE* f=ps_fopen(path,"rb"); + if (f==NULL) { + lastError=strerror(errno); + return ret; + } + unsigned char* buf; + ssize_t len; + if (fseek(f,0,SEEK_END)!=0) { + lastError=strerror(errno); + fclose(f); + return ret; + } + len=ftell(f); + if (len<0) { + lastError=strerror(errno); + fclose(f); + return ret; + } + if (len==(SIZE_MAX>>1)) { + lastError=strerror(errno); + fclose(f); + return ret; + } + if (len==0) { + lastError=strerror(errno); + fclose(f); + return ret; + } + if (fseek(f,0,SEEK_SET)!=0) { + lastError=strerror(errno); + fclose(f); + return ret; + } + buf=new unsigned char[len]; + if (fread(buf,1,len,f)!=(size_t)len) { + logW("did not read entire sample bank file buffer!"); + lastError=_LE("did not read entire sample bank file!"); + delete[] buf; + return ret; + } + fclose(f); + + SafeReader reader = SafeReader(buf,len); + + if(extS == ".pps") + { + loadPPS(reader,ret,stripPath); + } + if(extS == ".ppc") + { + loadPPC(reader,ret,stripPath); + } + if(extS == ".pvi") + { + loadPVI(reader,ret,stripPath); + } + if(extS == ".pdx") + { + loadPDX(reader,ret,stripPath); + } + if(extS == ".pzi") + { + loadPZI(reader,ret,stripPath); + } + if(extS == ".p86") + { + loadP86(reader,ret,stripPath); + } + if(extS == ".p") + { + loadP(reader,ret,stripPath); + } + + if((int)ret.size() > 0) + { + int counter = 0; + + for(DivSample* s: ret) + { + s->name = fmt::sprintf("%s sample %d", stripPath, counter); + counter++; + } + } + + delete[] buf; //done with buffer + BUSY_END; + return ret; + } + if (extS==".dmc" || extS==".brr") { // read as .dmc or .brr size_t len=0; DivSample* sample=new DivSample; @@ -68,7 +174,7 @@ DivSample* DivEngine::sampleFromFile(const char* path) { BUSY_END; lastError=fmt::sprintf("could not open file! (%s)",strerror(errno)); delete sample; - return NULL; + return ret; } if (fseek(f,0,SEEK_END)<0) { @@ -76,7 +182,7 @@ DivSample* DivEngine::sampleFromFile(const char* path) { BUSY_END; lastError=fmt::sprintf("could not get file length! (%s)",strerror(errno)); delete sample; - return NULL; + return ret; } len=ftell(f); @@ -86,7 +192,7 @@ DivSample* DivEngine::sampleFromFile(const char* path) { BUSY_END; lastError="file is empty!"; delete sample; - return NULL; + return ret; } if (len==(SIZE_MAX>>1)) { @@ -94,7 +200,7 @@ DivSample* DivEngine::sampleFromFile(const char* path) { BUSY_END; lastError="file is invalid!"; delete sample; - return NULL; + return ret; } if (fseek(f,0,SEEK_SET)<0) { @@ -102,7 +208,7 @@ DivSample* DivEngine::sampleFromFile(const char* path) { BUSY_END; lastError=fmt::sprintf("could not seek to beginning of file! (%s)",strerror(errno)); delete sample; - return NULL; + return ret; } if (extS==".dmc") { @@ -120,7 +226,7 @@ DivSample* DivEngine::sampleFromFile(const char* path) { BUSY_END; lastError="wait... is that right? no I don't think so..."; delete sample; - return NULL; + return ret; } unsigned char* dataBuf=sample->dataDPCM; @@ -147,14 +253,14 @@ DivSample* DivEngine::sampleFromFile(const char* path) { BUSY_END; lastError="BRR sample is empty!"; delete sample; - return NULL; + return ret; } } else if ((len%9)!=0) { fclose(f); BUSY_END; lastError="possibly corrupt BRR sample!"; delete sample; - return NULL; + return ret; } } @@ -163,16 +269,17 @@ DivSample* DivEngine::sampleFromFile(const char* path) { BUSY_END; lastError=fmt::sprintf("could not read file! (%s)",strerror(errno)); delete sample; - return NULL; + return ret; } BUSY_END; - return sample; + ret.push_back(sample); + return ret; } } #ifndef HAVE_SNDFILE lastError="Furnace was not compiled with libsndfile!"; - return NULL; + return ret; #else SF_INFO si; SFWrapper sfWrap; @@ -186,13 +293,13 @@ DivSample* DivEngine::sampleFromFile(const char* path) { } else { lastError=fmt::sprintf("could not open file! (%s)\nif this is raw sample data, you may import it by right-clicking the Load Sample icon and selecting \"import raw\".",sf_error_number(err)); } - return NULL; + return ret; } if (si.frames>16777215) { lastError="this sample is too big! max sample size is 16777215."; sfWrap.doClose(); BUSY_END; - return NULL; + return ret; } void* buf=NULL; sf_count_t sampleLen=sizeof(short); @@ -298,14 +405,15 @@ DivSample* DivEngine::sampleFromFile(const char* path) { if (sample->centerRate>64000) sample->centerRate=64000; sfWrap.doClose(); BUSY_END; - return sample; + ret.push_back(sample); + return ret; #endif } DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, int channels, bool bigEndian, bool unsign, bool swapNibbles, int rate) { if (song.sample.size()>=256) { lastError="too many samples!"; - return NULL; + return ret; } if (channels<1) { channels=1; @@ -362,7 +470,7 @@ DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, BUSY_END; lastError="file is empty!"; delete sample; - return NULL; + return ret; } if (len==(SIZE_MAX>>1)) { @@ -370,7 +478,7 @@ DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, BUSY_END; lastError="file is invalid!"; delete sample; - return NULL; + return ret; } if (fseek(f,0,SEEK_SET)<0) { @@ -378,7 +486,7 @@ DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, BUSY_END; lastError=fmt::sprintf("could not seek to beginning of file! (%s)",strerror(errno)); delete sample; - return NULL; + return ret; } lenDivided=len/channels; @@ -420,7 +528,7 @@ DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, BUSY_END; lastError="this sample is too big! max sample size is 16777215."; delete sample; - return NULL; + return ret; } sample->rate=rate; @@ -435,7 +543,7 @@ DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, lastError=fmt::sprintf("could not read file! (%s)",strerror(errno)); delete[] buf; delete sample; - return NULL; + return ret; } fclose(f); diff --git a/src/gui/gui.h b/src/gui/gui.h index 515d77fc8..8eeb5b113 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1593,7 +1593,7 @@ class FurnaceGUI { int sampleTexW, sampleTexH; bool updateSampleTex; - String workingDir, fileName, clipboard, warnString, errorString, lastError, curFileName, nextFile, sysSearchQuery, newSongQuery, paletteQuery; + String workingDir, fileName, clipboard, warnString, errorString, lastError, curFileName, nextFile, sysSearchQuery, newSongQuery, paletteQuery, sampleBankSearchQuery; String workingDirSong, workingDirIns, workingDirWave, workingDirSample, workingDirAudioExport; String workingDirVGMExport, workingDirZSMExport, workingDirROMExport; String workingDirFont, workingDirColors, workingDirKeybinds; @@ -1605,6 +1605,7 @@ class FurnaceGUI { String folderString; std::vector sysSearchResults; + std::vector> sampleBankSearchResults; std::vector newSongSearchResults; std::vector paletteSearchResults; FixedQueue recentFile; @@ -1620,6 +1621,7 @@ class FurnaceGUI { bool displayNew, displayExport, displayPalette, fullScreen, preserveChanPos, sysDupCloneChannels, sysDupEnd, noteInputPoly, notifyWaveChange; bool wantScrollListIns, wantScrollListWave, wantScrollListSample; bool displayPendingIns, pendingInsSingle, displayPendingRawSample, snesFilterHex, modTableHex, displayEditString; + bool displayPendingSamples, replacePendingSample; bool changeCoarse; bool mobileEdit; bool killGraphics; @@ -2373,6 +2375,7 @@ class FurnaceGUI { std::vector cmdStream; std::vector particles; std::vector> pendingIns; + std::vector > pendingSamples; std::vector sysCategories; From 235a2544582a4d7de1787e8d08675d52a952b048 Mon Sep 17 00:00:00 2001 From: freq-mod Date: Mon, 12 Aug 2024 18:22:52 +0200 Subject: [PATCH 02/28] 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), From aa225175a877c90f9bd9e4ecc6b2b3be30e97dcd Mon Sep 17 00:00:00 2001 From: freq-mod Date: Mon, 12 Aug 2024 19:23:52 +0200 Subject: [PATCH 03/28] sample banks part 3 --- src/engine/fileOpsSample.cpp | 14 ++++++++------ src/gui/gui.cpp | 4 ---- src/gui/gui.h | 4 ++-- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/engine/fileOpsSample.cpp b/src/engine/fileOpsSample.cpp index 711ea74b3..560eb7870 100644 --- a/src/engine/fileOpsSample.cpp +++ b/src/engine/fileOpsSample.cpp @@ -24,6 +24,8 @@ #include "sfWrapper.h" #endif +#define _LE(string) (string) + std::vector DivEngine::sampleFromFile(const char* path) { std::vector ret; @@ -413,7 +415,7 @@ std::vector DivEngine::sampleFromFile(const char* path) { DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, int channels, bool bigEndian, bool unsign, bool swapNibbles, int rate) { if (song.sample.size()>=256) { lastError="too many samples!"; - return ret; + return NULL; } if (channels<1) { channels=1; @@ -470,7 +472,7 @@ DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, BUSY_END; lastError="file is empty!"; delete sample; - return ret; + return NULL; } if (len==(SIZE_MAX>>1)) { @@ -478,7 +480,7 @@ DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, BUSY_END; lastError="file is invalid!"; delete sample; - return ret; + return NULL; } if (fseek(f,0,SEEK_SET)<0) { @@ -486,7 +488,7 @@ DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, BUSY_END; lastError=fmt::sprintf("could not seek to beginning of file! (%s)",strerror(errno)); delete sample; - return ret; + return NULL; } lenDivided=len/channels; @@ -528,7 +530,7 @@ DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, BUSY_END; lastError="this sample is too big! max sample size is 16777215."; delete sample; - return ret; + return NULL; } sample->rate=rate; @@ -543,7 +545,7 @@ DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, lastError=fmt::sprintf("could not read file! (%s)",strerror(errno)); delete[] buf; delete sample; - return ret; + return NULL; } fclose(f); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 8b2ce9ef0..efe8c8883 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -5274,8 +5274,6 @@ bool FurnaceGUI::loop() { String errs=_("there were some errors while loading samples:\n"); bool warn=false; for (String i: fileDialog->getFileName()) { - DivSample*=e->sampleFromFile(i.c_str()); - if () { std::vector samples=e->sampleFromFile(i.c_str()); if (samples.empty()) { if (fileDialog->getFileName().size()>1) { @@ -6503,8 +6501,6 @@ centerNextWindow(_("Select Sample"),canvasW,canvasH); } 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)) diff --git a/src/gui/gui.h b/src/gui/gui.h index 8eeb5b113..233b7bd85 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1605,7 +1605,7 @@ class FurnaceGUI { String folderString; std::vector sysSearchResults; - std::vector> sampleBankSearchResults; + std::vector> sampleBankSearchResults; std::vector newSongSearchResults; std::vector paletteSearchResults; FixedQueue recentFile; @@ -2375,7 +2375,7 @@ class FurnaceGUI { std::vector cmdStream; std::vector particles; std::vector> pendingIns; - std::vector > pendingSamples; + std::vector> pendingSamples; std::vector sysCategories; From d1e198ddffb1088aac1889b1ee89c01b8357de14 Mon Sep 17 00:00:00 2001 From: freq-mod Date: Mon, 12 Aug 2024 19:25:53 +0200 Subject: [PATCH 04/28] part 4 --- src/engine/fileOps/p.cpp | 131 +++++++++++++++++++++++++++++ src/engine/fileOps/p86.cpp | 149 +++++++++++++++++++++++++++++++++ src/engine/fileOps/pdx.cpp | 108 ++++++++++++++++++++++++ src/engine/fileOps/ppc.cpp | 149 +++++++++++++++++++++++++++++++++ src/engine/fileOps/pps.cpp | 132 +++++++++++++++++++++++++++++ src/engine/fileOps/pvi.cpp | 165 +++++++++++++++++++++++++++++++++++++ src/engine/fileOps/pzi.cpp | 162 ++++++++++++++++++++++++++++++++++++ 7 files changed, 996 insertions(+) create mode 100644 src/engine/fileOps/p.cpp create mode 100644 src/engine/fileOps/p86.cpp create mode 100644 src/engine/fileOps/pdx.cpp create mode 100644 src/engine/fileOps/ppc.cpp create mode 100644 src/engine/fileOps/pps.cpp create mode 100644 src/engine/fileOps/pvi.cpp create mode 100644 src/engine/fileOps/pzi.cpp diff --git a/src/engine/fileOps/p.cpp b/src/engine/fileOps/p.cpp new file mode 100644 index 000000000..fd309dc85 --- /dev/null +++ b/src/engine/fileOps/p.cpp @@ -0,0 +1,131 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2024 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "shared.h" + +#ifdef HAVE_GUI +#include "../gui/gui.h" +extern FurnaceGUI g; +#endif + +#define _LE(string) (string) + +class DivEngine; + +//P VOX ADPCM sample bank + +/* ======================================= + Header +======================================= + +0x0000 - 0x03FF 256 * { + Sample start (uint32_t) + - 0x00000000 = unused +} + + +======================================= + Body +======================================= + +Stream of Sample Data { + + MSM6258 ADPCM encoding + nibble-swapped VOX / Dialogic ADPCM + Mono + Sample rate? + 16000Hz seems fine + +} */ + +#define P_BANK_SIZE 256 +#define P_SAMPLE_RATE 16000 + +typedef struct +{ + uint32_t start_pointer; +} P_HEADER; + + +void DivEngine::loadP(SafeReader& reader, std::vector& ret, String& stripPath) +{ + try + { + reader.seek(0, SEEK_SET); + + P_HEADER headers[P_BANK_SIZE]; + + for(int i = 0; i < P_BANK_SIZE; i++) + { + headers[i].start_pointer = (unsigned int)reader.readI_BE(); + } + + for(int i = 0; i < P_BANK_SIZE; i++) + { + if(headers[i].start_pointer != 0) + { + DivSample* s = new DivSample; + + s->rate = P_SAMPLE_RATE; + s->centerRate = P_SAMPLE_RATE; + s->depth = DIV_SAMPLE_DEPTH_VOX; + + reader.seek((int)headers[i].start_pointer, SEEK_SET); + + int sample_pos = 0; + int sample_len = 0; + + if(i < P_BANK_SIZE - 1) + { + sample_len = headers[i + 1].start_pointer - headers[i].start_pointer; + } + else + { + sample_len = (int)reader.size() - headers[i].start_pointer; + } + + if(sample_len > 0) + { + s->init(sample_len * 2); + + for(int j = 0; j < sample_len; j++) + { + unsigned char curr_byte = (unsigned char)reader.readC(); + curr_byte = (curr_byte << 4) | (curr_byte >> 4); + + s->dataVOX[sample_pos] = curr_byte; + sample_pos++; + } + + ret.push_back(s); + logI("p: start %d len %d", headers[i].start_pointer, sample_len); + } + else + { + delete s; + } + } + } + } + catch (EndOfFileException& e) + { + lastError=_LE("premature end of file"); + logE("premature end of file"); + } +} \ No newline at end of file diff --git a/src/engine/fileOps/p86.cpp b/src/engine/fileOps/p86.cpp new file mode 100644 index 000000000..367541600 --- /dev/null +++ b/src/engine/fileOps/p86.cpp @@ -0,0 +1,149 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2024 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "shared.h" + +#ifdef HAVE_GUI +#include "../gui/gui.h" +extern FurnaceGUI g; +#endif + +#define _LE(string) (string) + +class DivEngine; + +//P86 8-bit PCM sample bank + +/* ======================================= + Header +======================================= + +0x0000 Identifier (12b) + "PCM86 DATA(\n)(\0)" +0x000C Targeted P86DRV version (1b) + version . +0x000D File Length (3b) +0x0010 - 0x060F 256 * { + + Pointer to Sample Data Start (3b) + Length of Sample Data (3b) + + (0x000000 0x000000 -> no sample for this instrument ID) + +} + + +======================================= + Body +======================================= + +Stream of Sample Data { + + 8-Bit Signed + Mono + 16540Hz + (above sample rate according to KAJA's documentation + any sample rate possible, for different base note & octave) + +} */ + +#define P86_BANK_SIZE 256 +#define P86_SAMPLE_RATE 16540 + +#define P86_FILE_SIG "PCM86 DATA\n\0" + +typedef struct +{ + uint32_t start_pointer; + uint32_t sample_length; +} P86_HEADER; + +#define UNUSED(x) (void)(x) + +uint32_t read_3bytes(SafeReader& reader) +{ + unsigned char arr[3]; + + for (int i = 0; i < 3; i++) + { + arr[i] = (unsigned char)reader.readC(); + } + + return (arr[0] | (arr[1] << 8) | (arr[2] << 16)); +} + +void DivEngine::loadP86(SafeReader& reader, std::vector& ret, String& stripPath) +{ + try + { + reader.seek(0, SEEK_SET); + + P86_HEADER headers[P86_BANK_SIZE]; + + String file_sig = reader.readString(12); + if(file_sig != P86_FILE_SIG) return; + + uint8_t version = reader.readC(); + UNUSED(version); + + uint32_t file_size = read_3bytes(reader); + UNUSED(file_size); + + for(int i = 0; i < P86_BANK_SIZE; i++) + { + headers[i].start_pointer = read_3bytes(reader); + headers[i].sample_length = read_3bytes(reader); + } + + for(int i = 0; i < P86_BANK_SIZE; i++) + { + if(headers[i].start_pointer != 0 && headers[i].sample_length != 0) + { + DivSample* s = new DivSample; + + s->rate = P86_SAMPLE_RATE; + s->centerRate = P86_SAMPLE_RATE; + s->depth = DIV_SAMPLE_DEPTH_8BIT; + s->init(headers[i].sample_length); //byte per sample + + reader.seek((int)headers[i].start_pointer, SEEK_SET); + + int sample_pos = 0; + + for(uint32_t j = 0; j < headers[i].sample_length; j++) + { + unsigned char curr_byte = (unsigned char)reader.readC(); + //curr_byte += 0x80; + + s->data8[sample_pos] = curr_byte; + sample_pos++; + } + + ret.push_back(s); + + logI("p86: start %06X len %06X", headers[i].start_pointer, headers[i].sample_length); + } + } + } + catch (EndOfFileException& e) + { + lastError=_LE("premature end of file"); + logE("premature end of file"); + } +} \ No newline at end of file diff --git a/src/engine/fileOps/pdx.cpp b/src/engine/fileOps/pdx.cpp new file mode 100644 index 000000000..9da099a04 --- /dev/null +++ b/src/engine/fileOps/pdx.cpp @@ -0,0 +1,108 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2024 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "shared.h" + +#ifdef HAVE_GUI +#include "../gui/gui.h" +extern FurnaceGUI g; +#endif + +#define _LE(string) (string) + +class DivEngine; + +//PDX 8-bit OKI ADPCM sample bank + +/* File format +The file starts with a header with 96 8-byte pairs, with each pair containing offset and length of ADPCM data chunks for each note value, like so: + +[[byte pointer to sample in file -- 32-bit unsigned integer (4 bytes)] [empty: $0000 -- 16-bit integer] [length of sample, amount in bytes -- 16-bit unsigned integer] ×96] [ADPCM data] EOF + +The first sample (1) is mapped to 0x80 (= the lowest note within MXDRV) and the last sample (96) is mapped to 0xDF (= the highest note within MXDRV). + + +Samples are encoded in 4-bit OKI ADPCM encoded nibbles, where each byte contains 2 nibbles: [nibble 2 << 4 || nibble 1] + + +Unfortunately, sample rates for each samples are not defined within the .PDX file and have to be set manually with the appropriate command for that at play-time */ + +#define PDX_BANK_SIZE 96 +#define PDX_SAMPLE_RATE 16000 + +typedef struct +{ + unsigned int start_pointer; + unsigned short sample_length; +} PDX_HEADER; + +#define UNUSED(x) (void)(x) + +void DivEngine::loadPDX(SafeReader& reader, std::vector& ret, String& stripPath) +{ + try + { + reader.seek(0, SEEK_SET); + + PDX_HEADER headers[PDX_BANK_SIZE]; + + for(int i = 0; i < PDX_BANK_SIZE; i++) + { + headers[i].start_pointer = (unsigned int)reader.readI_BE(); + unsigned short empty = (unsigned short)reader.readS_BE(); //skip 1st 2 bytes + UNUSED(empty); + headers[i].sample_length = (unsigned short)reader.readS_BE(); + } + + for(int i = 0; i < PDX_BANK_SIZE; i++) + { + if(headers[i].start_pointer != 0 && headers[i].sample_length != 0) + { + DivSample* s = new DivSample; + + s->rate = PDX_SAMPLE_RATE; + s->centerRate = PDX_SAMPLE_RATE; + s->depth = DIV_SAMPLE_DEPTH_VOX; + s->init(headers[i].sample_length * 2); + + reader.seek((int)headers[i].start_pointer, SEEK_SET); + + int sample_pos = 0; + + for(unsigned short j = 0; j < headers[i].sample_length; j++) + { + unsigned char curr_byte = (unsigned char)reader.readC(); + curr_byte = (curr_byte << 4) | (curr_byte >> 4); + + s->dataVOX[sample_pos] = curr_byte; + sample_pos++; + } + + ret.push_back(s); + + logI("pdx: start %d len %d", headers[i].start_pointer, headers[i].sample_length); + } + } + } + catch (EndOfFileException& e) + { + lastError=_LE("premature end of file"); + logE("premature end of file"); + } +} \ No newline at end of file diff --git a/src/engine/fileOps/ppc.cpp b/src/engine/fileOps/ppc.cpp new file mode 100644 index 000000000..f5180a590 --- /dev/null +++ b/src/engine/fileOps/ppc.cpp @@ -0,0 +1,149 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2024 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "shared.h" + +#ifdef HAVE_GUI +#include "../gui/gui.h" +extern FurnaceGUI g; +#endif + +#define _LE(string) (string) + +class DivEngine; + +//PPC PMD's YM2608 ADPCM-B sample bank + +/* ======================================== + General +======================================== + +ADPCM RAM addresses: see docs/common.txt { + + address_start = 0x0026 + file_header_size = 0x0420 + +} + + +======================================== + Header +======================================== + +0x0000 Identifier (30b) + "ADPCM DATA for PMD ver.4.4- " +0x001E Address of End of Data (32B blocks) in ADPCM RAM (1h) + File Size == address -> file offset + +0x0020 - 0x041F 256 * { + + Start of Sample (32b blocks) in ADPCM RAM (1h) + End of Sample (32b blocks) in ADPCM RAM (1h) + + (0x0000 0x0000 -> no sample for this instrument ID) + +} + + +======================================== + Body +======================================== + +Stream of Sample Data { + + Yamaha ADPCM-B encoding (4-Bit Signed ADPCM) + Mono + 16kHz + (above sample rate according to KAJA's documentation + any sample rate possible, for different base note & octave) + +} */ + +#define PPC_FILE_SIG "ADPCM DATA for PMD ver.4.4- " + +#define PPC_BANK_SIZE 256 +#define PPC_SAMPLE_RATE 16000 + +typedef struct +{ + uint16_t start_pointer; + uint16_t end_pointer; +} PPC_HEADER; + +#define UNUSED(x) (void)(x) + +#define ADPCM_DATA_START 0x0420 + +void DivEngine::loadPPC(SafeReader& reader, std::vector& ret, String& stripPath) +{ + try + { + reader.seek(0, SEEK_SET); + + String file_sig = reader.readString(30); + unsigned short end_of_data = (unsigned short)reader.readS(); + UNUSED(end_of_data); + + if(file_sig != PPC_FILE_SIG) return; + + PPC_HEADER headers[PPC_BANK_SIZE]; + + for(int i = 0; i < PPC_BANK_SIZE; i++) + { + headers[i].start_pointer = (unsigned short)reader.readS(); + headers[i].end_pointer = (unsigned short)reader.readS(); + } + + for(int i = 0; i < PPC_BANK_SIZE; i++) + { + if((headers[i].start_pointer != 0 || headers[i].end_pointer != 0) && headers[i].start_pointer < headers[i].end_pointer) + { + DivSample* s = new DivSample; + + s->rate = PPC_SAMPLE_RATE; + s->centerRate = PPC_SAMPLE_RATE; + s->depth = DIV_SAMPLE_DEPTH_ADPCM_B; + s->init((headers[i].end_pointer - headers[i].start_pointer) * 32 * 2); + + int sample_pos = 0; + int sample_length = (headers[i].end_pointer - headers[i].start_pointer) * 32; + + //reader.seek(ADPCM_DATA_START + headers[i].start_pointer * 32, SEEK_SET); + + for(int j = 0; j < sample_length; j++) + { + unsigned char curr_byte = (unsigned char)reader.readC(); + //curr_byte=(curr_byte<<4)|(curr_byte>>4); + + s->dataB[sample_pos] = curr_byte; + sample_pos++; + } + + logI("ppc: start %d end %d len in bytes %d", headers[i].start_pointer, headers[i].end_pointer, (headers[i].end_pointer - headers[i].start_pointer) * 32); + + ret.push_back(s); + } + } + } + catch (EndOfFileException& e) + { + lastError=_LE("premature end of file"); + logE("premature end of file"); + } +} \ No newline at end of file diff --git a/src/engine/fileOps/pps.cpp b/src/engine/fileOps/pps.cpp new file mode 100644 index 000000000..c4156a10d --- /dev/null +++ b/src/engine/fileOps/pps.cpp @@ -0,0 +1,132 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2024 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "shared.h" + +#ifdef HAVE_GUI +#include "../gui/gui.h" +extern FurnaceGUI g; +#endif + +#define _LE(string) (string) + +class DivEngine; + +//PPS AY-3-8910 sample bank + +/* ======================================= + Header +======================================= + +0x0000 - 0x0053 14 * { + + Pointer to Sample Data Start (1h) + Length of Sample Data (1h) + "Pitch"(?) (1b) + Volume Reduction (1b) + +} + + (0x0000 0x0000 [0x00 0x00] -> no sample for this instrument ID) + +} + + +======================================= + Body +======================================= + +Stream of Sample Data { + + 4-Bit Unsigned + (afaict) + Mono + 16Hz + (based on tests, maybe alternatively 8kHz) + +} */ + +#define PPS_BANK_SIZE 14 +#define PPS_SAMPLE_RATE 16000 + +typedef struct +{ + uint16_t start_pointer; + uint16_t sample_length; + uint8_t _pitch; + uint8_t _vol; +} PPS_HEADER; + + +void DivEngine::loadPPS(SafeReader& reader, std::vector& ret, String& stripPath) +{ + try + { + reader.seek(0, SEEK_SET); + + PPS_HEADER headers[PPS_BANK_SIZE]; + + for(int i = 0; i < PPS_BANK_SIZE; i++) + { + headers[i].start_pointer = (unsigned short)reader.readS(); + headers[i].sample_length = (unsigned short)reader.readS(); + headers[i]._pitch = (unsigned char)reader.readC(); + headers[i]._vol = (unsigned char)reader.readC(); + } + + for(int i = 0; i < PPS_BANK_SIZE; i++) + { + if(headers[i].start_pointer != 0 || headers[i].sample_length != 0 + || headers[i]._pitch != 0 || headers[i]._vol != 0) + { + DivSample* s = new DivSample; + + s->rate = PPS_SAMPLE_RATE; + s->centerRate = PPS_SAMPLE_RATE; + s->depth = DIV_SAMPLE_DEPTH_8BIT; + s->init(headers[i].sample_length * 2); //byte per sample + + reader.seek((int)headers[i].start_pointer, SEEK_SET); + + int sample_pos = 0; + + for(int j = 0; j < headers[i].sample_length; j++) + { + unsigned char curr_byte = (unsigned char)reader.readC(); + + s->data8[sample_pos] = (curr_byte >> 4) | (curr_byte & 0xf0); + s->data8[sample_pos] += 0x80; + sample_pos++; + s->data8[sample_pos] = (curr_byte << 4) | (curr_byte & 0xf); + s->data8[sample_pos] += 0x80; + sample_pos++; + } + + ret.push_back(s); + + logI("pps: start %d len %d", headers[i].start_pointer, headers[i].sample_length); + } + } + } + catch (EndOfFileException& e) + { + lastError=_LE("premature end of file"); + logE("premature end of file"); + } +} diff --git a/src/engine/fileOps/pvi.cpp b/src/engine/fileOps/pvi.cpp new file mode 100644 index 000000000..c6e7956b4 --- /dev/null +++ b/src/engine/fileOps/pvi.cpp @@ -0,0 +1,165 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2024 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "shared.h" + +#ifdef HAVE_GUI +#include "../gui/gui.h" +extern FurnaceGUI g; +#endif + +#define _LE(string) (string) + +class DivEngine; + +//PVI YM2608 ADPCM-B sample bank + +/* ======================================= + General +======================================= + +ADPCM RAM addresses: see docs/common.txt { + + address_start = 0x0000 + file_header_size = 0x0210 + +} + +======================================= + Header +======================================= + +0x0000 Identifier (4b) + "PVI2" +0x0004 - 0x0007 Unknown Settings (4b) + Unknown mappings PCME switches <-> Values + "0x10 0x00 0x10 0x02" in all example files + First 1h may be Start Address in ADPCM RAM? +0x0008 - 0x0009 "Delta-N" playback frequency (1h) + Default 0x49BA "== 16kHz"?? +0x000A Unknown (1b) + RAM type? (Docs indicate values 0 or 8, all example files have value 0x02?) +0x000B Amount of defined Samples (1b) +0x000C - 0x000F Unknown (4b) + Padding? + "0x00 0x00 0x00 0x00" in all example files +0x0010 - 0x020F 128 * { + + Start of Sample (32b blocks) in ADPCM RAM (1h) + End of Sample (32b blocks) in ADPCM RAM (1h) + + (0x0000 0x0000 -> no sample for this instrument ID) + +} + + +======================================= + Body +======================================= + +Stream of Sample Data { + + Yamaha ADPCM-B encoding (4-Bit Signed ADPCM) + Mono + Sample rate as specified earlier + (examples i have seems Stereo or 32kHz despite "16kHz" playback frequency setting?) + +} */ + +#define PVIV2_FILE_SIG "PVI2" +#define PVIV1_FILE_SIG "PVI1" + +#define PVI_BANK_SIZE 128 +#define PVI_SAMPLE_RATE 16000 + +typedef struct +{ + uint16_t start_pointer; + uint16_t end_pointer; +} PVI_HEADER; + +#define UNUSED(x) (void)(x) + +#define ADPCM_DATA_START 0x0210 + +void DivEngine::loadPVI(SafeReader& reader, std::vector& ret, String& stripPath) +{ + try + { + reader.seek(0, SEEK_SET); + + String file_sig = reader.readString(4); + if(file_sig != PVIV1_FILE_SIG && file_sig != PVIV2_FILE_SIG) return; + + unsigned int unknown_settings = (unsigned int)reader.readI(); + UNUSED(unknown_settings); + unsigned short delta_n = (unsigned short)reader.readS(); + UNUSED(delta_n); + unsigned char one_byte = (unsigned char)reader.readC(); + UNUSED(one_byte); + unsigned char amount_of_samples = (unsigned char)reader.readC(); + UNUSED(amount_of_samples); + unsigned int padding = (unsigned int)reader.readI(); + UNUSED(padding); + + PVI_HEADER headers[PVI_BANK_SIZE]; + + for(int i = 0; i < PVI_BANK_SIZE; i++) + { + headers[i].start_pointer = (unsigned short)reader.readS(); + headers[i].end_pointer = (unsigned short)reader.readS(); + } + + for(int i = 0; i < PVI_BANK_SIZE; i++) + { + if((headers[i].start_pointer != 0 || headers[i].end_pointer != 0) && headers[i].start_pointer < headers[i].end_pointer) + { + DivSample* s = new DivSample; + + s->rate = PVI_SAMPLE_RATE; + s->centerRate = PVI_SAMPLE_RATE; + s->depth = DIV_SAMPLE_DEPTH_ADPCM_B; + s->init((headers[i].end_pointer - headers[i].start_pointer) * 32 * 2); + + int sample_pos = 0; + int sample_length = (headers[i].end_pointer - headers[i].start_pointer) * 32; + + reader.seek(ADPCM_DATA_START + headers[i].start_pointer * 32, SEEK_SET); + + for(int j = 0; j < sample_length; j++) + { + unsigned char curr_byte = (unsigned char)reader.readC(); + //curr_byte=(curr_byte<<4)|(curr_byte>>4); + + s->dataB[sample_pos] = curr_byte; + sample_pos++; + } + + logI("pvi: start %d end %d len in bytes %d", headers[i].start_pointer, headers[i].end_pointer, (headers[i].end_pointer - headers[i].start_pointer) * 32); + + ret.push_back(s); + } + } + } + catch (EndOfFileException& e) + { + lastError=_LE("premature end of file"); + logE("premature end of file"); + } +} \ No newline at end of file diff --git a/src/engine/fileOps/pzi.cpp b/src/engine/fileOps/pzi.cpp new file mode 100644 index 000000000..33161401d --- /dev/null +++ b/src/engine/fileOps/pzi.cpp @@ -0,0 +1,162 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2024 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "shared.h" + +#ifdef HAVE_GUI +#include "../gui/gui.h" +extern FurnaceGUI g; +#endif + +#define _LE(string) (string) + +class DivEngine; + +//PZI 8-bit PCM sample bank + +/* ======================================= + Header +======================================= + +0x0000 Identifier (4b) + "PZI1" +0x0004 - 0x001F Unknown (28b) + Part of identifier? Settings? + All (\0)s in all example files +0x0020 - 0x091F 128 * { + + Start of Sample after header (2h) + Length of Sample (2h) + Offset of loop start from sample start (2h) + Offset of loop end from sample start (2h) + Sample rate (1h) + + (0xFFFFFFFF 0xFFFFFFFF loop offsets -> no loop information) + +} + + +======================================= + Body +======================================= + +Stream of Sample Data { + + Unsigned 8-Bit + Mono + Sample rate as specified in header + +} */ + +#define PZI_BANK_SIZE 128 + +#define PZI_FILE_SIG "PZI1" + +#define NO_LOOP (0xFFFFFFFFU) + +#define SAMPLE_DATA_OFFSET 0x0920 + +#define MAX_SANITY_CAP 9999999 + +#define HEADER_JUNK_SIZE 28 + +typedef struct +{ + uint32_t start_pointer; + uint32_t sample_length; + uint32_t loop_start; + uint32_t loop_end; + uint16_t sample_rate; +} PZI_HEADER; + +#define UNUSED(x) (void)(x) + +void DivEngine::loadPZI(SafeReader& reader, std::vector& ret, String& stripPath) +{ + try + { + reader.seek(0, SEEK_SET); + + PZI_HEADER headers[PZI_BANK_SIZE]; + + String file_sig = reader.readString(4); + if(file_sig != PZI_FILE_SIG) return; + + for (int i = 0; i < HEADER_JUNK_SIZE; i++) + { + unsigned char curr_byte = (unsigned char)reader.readC(); + UNUSED(curr_byte); + } + + for(int i = 0; i < PZI_BANK_SIZE; i++) + { + headers[i].start_pointer = (unsigned int)reader.readI(); + headers[i].sample_length = (unsigned int)reader.readI(); + headers[i].loop_start = (unsigned int)reader.readI(); + headers[i].loop_end = (unsigned int)reader.readI(); + headers[i].sample_rate = (unsigned short)reader.readS(); + } + + for(int i = 0; i < PZI_BANK_SIZE; i++) + { + if (headers[i].start_pointer < MAX_SANITY_CAP && headers[i].sample_length < MAX_SANITY_CAP && + headers[i].loop_start < MAX_SANITY_CAP && headers[i].loop_end < MAX_SANITY_CAP && + headers[i].start_pointer > 0 && headers[i].sample_length > 0) + { + DivSample* s = new DivSample; + + s->rate = headers[i].sample_rate; + s->centerRate = headers[i].sample_rate; + s->depth = DIV_SAMPLE_DEPTH_8BIT; + s->init(headers[i].sample_length); //byte per sample + + reader.seek((int)headers[i].start_pointer + SAMPLE_DATA_OFFSET, SEEK_SET); + + int sample_pos = 0; + + for (uint32_t j = 0; j < headers[i].sample_length; j++) + { + unsigned char curr_byte = (unsigned char)reader.readC(); + curr_byte += 0x80; + + s->data8[sample_pos] = curr_byte; + sample_pos++; + } + + if (headers[i].loop_start != NO_LOOP && headers[i].loop_end != NO_LOOP) + { + s->loop = true; + s->loopMode = DIV_SAMPLE_LOOP_FORWARD; + s->loopStart = headers[i].loop_start; + s->loopEnd = headers[i].loop_end; + } + + ret.push_back(s); + + logI("pzi: start %d len %d sample rate %d loop start %d loop end %d", headers[i].start_pointer, headers[i].sample_length, + headers[i].sample_rate, headers[i].loop_start, headers[i].loop_end); + } + } + } + catch (EndOfFileException& e) + { + lastError=_LE("premature end of file"); + logE("premature end of file"); + } +} \ No newline at end of file From 8e39d5ff8ffb36cabbbb3fd87d6a7778ffd4ec02 Mon Sep 17 00:00:00 2001 From: freq-mod Date: Mon, 12 Aug 2024 19:26:20 +0200 Subject: [PATCH 05/28] part final please god --- src/engine/fileOps/importExport.h | 45 ++++++++++++++++++++++++++ src/engine/fileOps/shared.h | 53 +++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 src/engine/fileOps/importExport.h create mode 100644 src/engine/fileOps/shared.h diff --git a/src/engine/fileOps/importExport.h b/src/engine/fileOps/importExport.h new file mode 100644 index 000000000..5433c7445 --- /dev/null +++ b/src/engine/fileOps/importExport.h @@ -0,0 +1,45 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2024 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include "../dataErrors.h" +#include "../engine.h" +#include "../../ta-log.h" +#include "../instrument.h" +#include "../song.h" +#include +#include + +#define DIV_READ_SIZE 131072 +#define DIV_DMF_MAGIC ".DelekDefleMask." +#define DIV_FUR_MAGIC "-Furnace module-" +#define DIV_FTM_MAGIC "FamiTracker Module" +#define DIV_DN_FTM_MAGIC "Dn-FamiTracker Module" +#define DIV_FC13_MAGIC "SMOD" +#define DIV_FC14_MAGIC "FC14" +#define DIV_S3M_MAGIC "SCRM" +#define DIV_XM_MAGIC "Extended Module: " +#define DIV_IT_MAGIC "IMPM" +#define DIV_TFM_MAGIC "TFMfmtV2" + +enum DivFurVariants: int { + DIV_FUR_VARIANT_VANILLA=0, + DIV_FUR_VARIANT_B=1, +}; diff --git a/src/engine/fileOps/shared.h b/src/engine/fileOps/shared.h new file mode 100644 index 000000000..6abb5ed85 --- /dev/null +++ b/src/engine/fileOps/shared.h @@ -0,0 +1,53 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2024 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include "importExport.h" + +// MIDI-related +struct midibank_t { + String name; + uint8_t bankMsb, + bankLsb; +}; + +// Reused patch data structures + +// SBI and some other OPL containers + +struct sbi_t { + uint8_t Mcharacteristics, + Ccharacteristics, + Mscaling_output, + Cscaling_output, + Meg_AD, + Ceg_AD, + Meg_SR, + Ceg_SR, + Mwave, + Cwave, + FeedConnect; +}; + +bool stringNotBlank(String& str); +// detune needs extra translation from register to furnace format +uint8_t fmDtRegisterToFurnace(uint8_t&& dtNative); + +void readSbiOpData(sbi_t& sbi, SafeReader& reader); \ No newline at end of file From 03bc023644b888f8a5e89f88b957593a8ad193e9 Mon Sep 17 00:00:00 2001 From: freq-mod Date: Tue, 13 Aug 2024 13:55:20 +0200 Subject: [PATCH 06/28] spacing --- src/gui/gui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index efe8c8883..4803db5e5 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -7675,7 +7675,7 @@ bool FurnaceGUI::init() { #endif compatFormats+="*.dmc "; - compatFormats+="*.brr"; + compatFormats+="*.brr "; compatFormats+="*.ppc "; compatFormats+="*.pps "; @@ -7683,7 +7683,7 @@ bool FurnaceGUI::init() { compatFormats+="*.pdx "; compatFormats+="*.pzi "; compatFormats+="*.p86 "; - compatFormats+="*.p"; + compatFormats+="*.p "; audioLoadFormats[1]=compatFormats; audioLoadFormats.push_back(_("NES DPCM data")); From 33f56ba5315f8ed8fc78d202ae21306f5cf71b10 Mon Sep 17 00:00:00 2001 From: freq-mod Date: Wed, 14 Aug 2024 20:27:58 +0200 Subject: [PATCH 07/28] remove leftovers --- src/engine/fileOps/p.cpp | 4 +--- src/engine/fileOps/p86.cpp | 4 +--- src/engine/fileOps/pdx.cpp | 4 +--- src/engine/fileOps/ppc.cpp | 4 +--- src/engine/fileOps/pps.cpp | 4 +--- src/engine/fileOps/pvi.cpp | 4 +--- src/engine/fileOps/pzi.cpp | 4 +--- 7 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/engine/fileOps/p.cpp b/src/engine/fileOps/p.cpp index fd309dc85..09d8adad2 100644 --- a/src/engine/fileOps/p.cpp +++ b/src/engine/fileOps/p.cpp @@ -24,8 +24,6 @@ extern FurnaceGUI g; #endif -#define _LE(string) (string) - class DivEngine; //P VOX ADPCM sample bank @@ -125,7 +123,7 @@ void DivEngine::loadP(SafeReader& reader, std::vector& ret, String& } catch (EndOfFileException& e) { - lastError=_LE("premature end of file"); + lastError=_("premature end of file"); logE("premature end of file"); } } \ No newline at end of file diff --git a/src/engine/fileOps/p86.cpp b/src/engine/fileOps/p86.cpp index 367541600..840d65d28 100644 --- a/src/engine/fileOps/p86.cpp +++ b/src/engine/fileOps/p86.cpp @@ -24,8 +24,6 @@ extern FurnaceGUI g; #endif -#define _LE(string) (string) - class DivEngine; //P86 8-bit PCM sample bank @@ -143,7 +141,7 @@ void DivEngine::loadP86(SafeReader& reader, std::vector& ret, String } catch (EndOfFileException& e) { - lastError=_LE("premature end of file"); + lastError=_("premature end of file"); logE("premature end of file"); } } \ No newline at end of file diff --git a/src/engine/fileOps/pdx.cpp b/src/engine/fileOps/pdx.cpp index 9da099a04..fa57b2006 100644 --- a/src/engine/fileOps/pdx.cpp +++ b/src/engine/fileOps/pdx.cpp @@ -24,8 +24,6 @@ extern FurnaceGUI g; #endif -#define _LE(string) (string) - class DivEngine; //PDX 8-bit OKI ADPCM sample bank @@ -102,7 +100,7 @@ void DivEngine::loadPDX(SafeReader& reader, std::vector& ret, String } catch (EndOfFileException& e) { - lastError=_LE("premature end of file"); + lastError=_("premature end of file"); logE("premature end of file"); } } \ No newline at end of file diff --git a/src/engine/fileOps/ppc.cpp b/src/engine/fileOps/ppc.cpp index f5180a590..a5555abca 100644 --- a/src/engine/fileOps/ppc.cpp +++ b/src/engine/fileOps/ppc.cpp @@ -24,8 +24,6 @@ extern FurnaceGUI g; #endif -#define _LE(string) (string) - class DivEngine; //PPC PMD's YM2608 ADPCM-B sample bank @@ -143,7 +141,7 @@ void DivEngine::loadPPC(SafeReader& reader, std::vector& ret, String } catch (EndOfFileException& e) { - lastError=_LE("premature end of file"); + lastError=_("premature end of file"); logE("premature end of file"); } } \ No newline at end of file diff --git a/src/engine/fileOps/pps.cpp b/src/engine/fileOps/pps.cpp index c4156a10d..e491302b6 100644 --- a/src/engine/fileOps/pps.cpp +++ b/src/engine/fileOps/pps.cpp @@ -24,8 +24,6 @@ extern FurnaceGUI g; #endif -#define _LE(string) (string) - class DivEngine; //PPS AY-3-8910 sample bank @@ -126,7 +124,7 @@ void DivEngine::loadPPS(SafeReader& reader, std::vector& ret, String } catch (EndOfFileException& e) { - lastError=_LE("premature end of file"); + lastError=_("premature end of file"); logE("premature end of file"); } } diff --git a/src/engine/fileOps/pvi.cpp b/src/engine/fileOps/pvi.cpp index c6e7956b4..8352ebf9e 100644 --- a/src/engine/fileOps/pvi.cpp +++ b/src/engine/fileOps/pvi.cpp @@ -24,8 +24,6 @@ extern FurnaceGUI g; #endif -#define _LE(string) (string) - class DivEngine; //PVI YM2608 ADPCM-B sample bank @@ -159,7 +157,7 @@ void DivEngine::loadPVI(SafeReader& reader, std::vector& ret, String } catch (EndOfFileException& e) { - lastError=_LE("premature end of file"); + lastError=_("premature end of file"); logE("premature end of file"); } } \ No newline at end of file diff --git a/src/engine/fileOps/pzi.cpp b/src/engine/fileOps/pzi.cpp index 33161401d..69bf15d87 100644 --- a/src/engine/fileOps/pzi.cpp +++ b/src/engine/fileOps/pzi.cpp @@ -24,8 +24,6 @@ extern FurnaceGUI g; #endif -#define _LE(string) (string) - class DivEngine; //PZI 8-bit PCM sample bank @@ -156,7 +154,7 @@ void DivEngine::loadPZI(SafeReader& reader, std::vector& ret, String } catch (EndOfFileException& e) { - lastError=_LE("premature end of file"); + lastError=_("premature end of file"); logE("premature end of file"); } } \ No newline at end of file From 8ad9bfa2456089549724aed31b121f05a36464b5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 16 Aug 2024 23:59:20 -0500 Subject: [PATCH 08/28] fix panbrello depth --- src/engine/playback.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index c61415abd..3b3234934 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -1647,26 +1647,34 @@ bool DivEngine::nextTick(bool noAccum, bool inhibitLowLat) { chan[i].panPos+=chan[i].panRate; chan[i].panPos&=255; - // calculate... + // calculate inverted... switch (chan[i].panPos&0xc0) { case 0: // center -> right - chan[i].panL=0xff-((chan[i].panPos&0x3f)<<2); - chan[i].panR=0xff; + chan[i].panL=((chan[i].panPos&0x3f)<<2); + chan[i].panR=0; break; case 0x40: // right -> center - chan[i].panL=(chan[i].panPos&0x3f)<<2; - chan[i].panR=0xff; + chan[i].panL=0xff-((chan[i].panPos&0x3f)<<2); + chan[i].panR=0; break; case 0x80: // center -> left - chan[i].panL=0xff; - chan[i].panR=0xff-((chan[i].panPos&0x3f)<<2); + chan[i].panL=0; + chan[i].panR=((chan[i].panPos&0x3f)<<2); break; case 0xc0: // left -> center - chan[i].panL=0xff; - chan[i].panR=(chan[i].panPos&0x3f)<<2; + chan[i].panL=0; + chan[i].panR=0xff-((chan[i].panPos&0x3f)<<2); break; } + // multiply by depth + chan[i].panL=(chan[i].panL*chan[i].panDepth)/15; + chan[i].panR=(chan[i].panR*chan[i].panDepth)/15; + + // then invert it to get final panning + chan[i].panL^=0xff; + chan[i].panR^=0xff; + dispatchCmd(DivCommand(DIV_CMD_PANNING,i,chan[i].panL,chan[i].panR)); } From 3cde827c17fcb7efa5bef8f93c7745622494f909 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 17 Aug 2024 00:12:02 -0500 Subject: [PATCH 09/28] GUI: localize bitfield labels --- src/gui/plot_nolerp.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/gui/plot_nolerp.cpp b/src/gui/plot_nolerp.cpp index 170fc20d9..aa57f0da7 100644 --- a/src/gui/plot_nolerp.cpp +++ b/src/gui/plot_nolerp.cpp @@ -26,6 +26,8 @@ #include "imgui.h" #include "imgui_internal.h" +#include "../ta-utils.h" + struct FurnacePlotArrayGetterData { const float* Values; @@ -270,12 +272,13 @@ int PlotBitfieldEx(const char* label, int (*values_getter)(void* data, int idx), float lineHeight=ImGui::GetTextLineHeight()/2.0; for (int i=0; i Date: Sat, 17 Aug 2024 13:50:52 -0700 Subject: [PATCH 10/28] Add action to set curIns based on current channel instrument at cursor (#2090) * push test * remove test file * add GUI_ACTION_PAT_ABSORB_INSTRUMENT action (set current instrument to channel's current instrument column) --------- Co-authored-by: Adam Lederer --- src/gui/doAction.cpp | 11 +++++++++++ src/gui/gui.h | 1 + src/gui/guiConst.cpp | 1 + src/gui/settings.cpp | 1 + 4 files changed, 14 insertions(+) diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index fff5a85d9..bf5b89519 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -676,6 +676,17 @@ void FurnaceGUI::doAction(int what) { latchTarget=0; latchNibble=false; break; + case GUI_ACTION_PAT_ABSORB_INSTRUMENT: { + DivPattern* pat=e->curPat[cursor.xCoarse].getPattern(e->curOrders->ord[cursor.xCoarse][curOrder],false); + if (!pat) break; + for (int i=cursor.y; i>=0; i--) { + if (pat->data[i][2] >= 0) { + curIns=pat->data[i][2]; + break; + } + } + break; + } case GUI_ACTION_INS_LIST_ADD: if (settings.insTypeMenu) { diff --git a/src/gui/gui.h b/src/gui/gui.h index 0a4f434f5..ae6dde1ef 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -816,6 +816,7 @@ enum FurnaceGUIActions { GUI_ACTION_PAT_LATCH, GUI_ACTION_PAT_SCROLL_MODE, GUI_ACTION_PAT_CLEAR_LATCH, + GUI_ACTION_PAT_ABSORB_INSTRUMENT, GUI_ACTION_PAT_MAX, GUI_ACTION_INS_LIST_MIN, diff --git a/src/gui/guiConst.cpp b/src/gui/guiConst.cpp index 09d0fefbb..13e8a9478 100644 --- a/src/gui/guiConst.cpp +++ b/src/gui/guiConst.cpp @@ -687,6 +687,7 @@ const FurnaceGUIActionDef guiActions[GUI_ACTION_MAX]={ D("PAT_LATCH", _N("Set note input latch"), 0), D("PAT_SCROLL_MODE", _N("Change mobile scroll mode"), 0), D("PAT_CLEAR_LATCH", _N("Clear note input latch"), 0), + D("PAT_ABSORB_INSTRUMENT", _N("Set current instrument to channel's current instrument column"), 0), D("PAT_MAX", "", NOT_AN_ACTION), D("INS_LIST_MIN", _N("---Instrument list"), NOT_AN_ACTION), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index b6c244430..8241e9ab1 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -2415,6 +2415,7 @@ void FurnaceGUI::drawSettings() { UI_KEYBIND_CONFIG(GUI_ACTION_PAT_EXPAND_SONG); UI_KEYBIND_CONFIG(GUI_ACTION_PAT_LATCH); UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CLEAR_LATCH); + UI_KEYBIND_CONFIG(GUI_ACTION_PAT_ABSORB_INSTRUMENT); KEYBIND_CONFIG_END; ImGui::TreePop(); From 6037adab514ccc2a4f01c64b046caf0b73485956 Mon Sep 17 00:00:00 2001 From: Electric Keet Date: Thu, 25 Jul 2024 20:48:58 -0700 Subject: [PATCH 11/28] General docs updates. New menu items, new options, a whole new user systems feature... --- doc/2-interface/README.md | 21 +-- doc/2-interface/export.md | 51 +++---- doc/2-interface/keyboard.md | 194 ++++++++++++++------------ doc/2-interface/menu-bar.md | 106 +++++++------- doc/2-interface/play-edit-controls.md | 1 + doc/2-interface/settings.md | 74 +++++++--- doc/2-interface/song-info.md | 16 ++- doc/3-pattern/README.md | 4 + doc/6-sample/README.md | 1 + doc/7-systems/gba.md | 10 +- doc/8-advanced/README.md | 37 ++--- doc/8-advanced/channels.md | 5 +- doc/8-advanced/chanosc.md | 1 + doc/8-advanced/chip-manager.md | 2 + doc/8-advanced/user-systems.md | 22 +++ doc/8-advanced/user-systems.png | Bin 0 -> 35024 bytes 16 files changed, 311 insertions(+), 234 deletions(-) create mode 100644 doc/8-advanced/user-systems.md create mode 100644 doc/8-advanced/user-systems.png diff --git a/doc/2-interface/README.md b/doc/2-interface/README.md index aa16af8d4..7d4300adf 100644 --- a/doc/2-interface/README.md +++ b/doc/2-interface/README.md @@ -18,30 +18,31 @@ the default layout of Furnace is depicted below. - [play/edit controls](play-edit-controls.md) - [instrument/wavetable/sample list](asset-list.md) - [song information](song-info.md) -- [effect list window](effect-list-window.md) - [pattern view](../3-pattern/README.md) +- [effect list window](effect-list-window.md) - [instrument editor](../4-instrument/README.md) - [wavetable editor](../5-wave/README.md) - [sample editor](../6-sample/README.md) ## advanced topics -- [mixer](../8-advanced/mixer.md) -- [grooves](../8-advanced/grooves.md) -- [channels](../8-advanced/channels.md) -- [pattern manager](../8-advanced/pat-manager.md) -- [chip manager](../8-advanced/chip-manager.md) -- [compatibility flags](../8-advanced/compat-flags.md) - [song comments](../8-advanced/comments.md) -- [piano/input pad](../8-advanced/piano.md) +- [channels](../8-advanced/channels.md) +- [chip manager](../8-advanced/chip-manager.md) +- [pattern manager](../8-advanced/pat-manager.md) +- [mixer](../8-advanced/mixer.md) +- [compatibility flags](../8-advanced/compat-flags.md) - [oscilloscope](../8-advanced/osc.md) - [oscilloscope (per channel)](../8-advanced/chanosc.md) +- [oscilloscope (X-Y)](../8-advanced/xyosc.md) - [clock](../8-advanced/clock.md) -- [register view](../8-advanced/regview.md) +- [grooves](../8-advanced/grooves.md) - [log viewer](../8-advanced/log-viewer.md) +- [register view](../8-advanced/regview.md) - [statistics](../8-advanced/stats.md) +- [memory composition](../8-advanced/memory-composition.md) ## other topics -- [basic mode](basic-mode.md) +- [piano/input pad](../8-advanced/piano.md) - [settings](settings.md) diff --git a/doc/2-interface/export.md b/doc/2-interface/export.md index 8d6f32074..e924a1717 100644 --- a/doc/2-interface/export.md +++ b/doc/2-interface/export.md @@ -1,26 +1,27 @@ # export -Furnace allows you to export your song in several formats. this section deals with describing the available export options. +Furnace allows you to export your song in several formats. this section deals with describing the available export options within each tab of the export window. -## export audio +## Audio this option allows you to export your song in .wav format. I know I know, no .mp3 or .ogg export yet, but you can use a converter. -there are two parameters: - +- **Export type**: + - **one file**: exports your song to one .wav file. + - **multiple files (one per chip)**: exports the output of each chip to .wav files. + - **multiple files (one per channel)**: exports the output of each channel to .wav files. + - useful for usage with a channel visualizer such as corrscope. +- **Bit depth**: + - **16-bit integer**: the most common type of .wav file, perfect for music playback. + - **32-bit float**: used for advanced audio manipulation. don't select this unless you know what you need it for. +- **Sample rate**: the default is 44100, the most common .wav sample rate. +- **Channels in file**: default is 2 (stereo). Set to 1 for mono. - **Loops**: sets the number of times the song will loop. - does not have effect if the song ends with `FFxx` effect. - **Fade out (seconds)**: sets the fade out time when the song is over. - does not have effect if the song ends with `FFxx` effect. -and three export choices: - -- **one file**: exports your song to one .wav file. -- **multiple files (one per chip)**: exports the output of each chip to .wav files. -- **multiple files (one per channel)**: exports the output of each channel to .wav files. - - useful for usage with a channel visualizer such as corrscope. - -## export VGM +## VGM this option allows exporting to a VGM (Video Game Music) file. these can be played back with VGMPlay (for example). @@ -40,9 +41,6 @@ the following settings exist: - **custom**: allows you to specify how many ticks to add. - `0` is effectively none, disabling loop trail completely. - this option will not appear if the loop modality isn't set to None as there wouldn't be a need to. -- **chips to export**: select which chips are going to be exported. - - due to VGM format limitations, you can only select up to two of each chip type. - - some chips will not be available, either because VGM doesn't support these yet, or because you selected an old format version. - **add pattern change hints**: this option adds a "hint" when a pattern change occurs. only useful if you're a developer. - the format of the "hint" data block that gets written is: `67 66 FE ll ll ll ll 01 oo rr pp pp pp ...` - `ll`: length, a 32-bit little-endian number @@ -51,12 +49,9 @@ the following settings exist: - `pp`: pattern index (one per channel) - **direct stream mode**: this option allows DualPCM to work. don't use this for other chips. - may or may not play well with hardware VGM players. - -click on **click to export** to begin exporting. - -## export text - -this option allows you to export your song as a text file. +- **chips to export**: select which chips are going to be exported. + - due to VGM format limitations, you can only select up to two of each chip type. + - some chips will not be available, either because VGM doesn't support these yet, or because you selected an old format version. ## export ZSM @@ -72,21 +67,21 @@ the following settings are available: - **loop**: enables loop. if disabled, the song won't loop. - **optimize size**: removes unnecessary commands to reduce size. -click on **Begin Export** to... you know. +## export text + +this option allows you to export your song as a text file. ## export command stream -this option exports a binary file which contains a dump of the internal command stream produced when playing the song. +this option exports a binary file in Furnace's own command stream format (FCS) which contains a dump of the internal command stream produced when playing the song. -it's not really useful, unless you're a developer and want to use a command stream dump for some reason (e.g. writing a hardware sound driver). - -- **export**: exports in Furnace's own command stream format (FCS). see `export-tech.md` in `papers/` for details. +it's not really useful, unless you're a developer and want to use a command stream dump for some reason (e.g. writing a hardware sound driver). see `export-tech.md` in `papers/` for details. ## export DMF this option allows you to save your song as a .dmf which can be opened in DefleMask. -the following systems are supported when saving as 1.0/legacy: +the following systems are supported when saving as 1.0/legacy (0.12): - Sega Genesis/Mega Drive (YM2612 + SN76489) - Sega Genesis/Mega Drive (YM2612 + SN76489, extended channel 3) - Sega Master System @@ -97,7 +92,7 @@ the following systems are supported when saving as 1.0/legacy: - Arcade (YM2151 + SegaPCM 5-channel compatibility) - Neo Geo CD (DefleMask 1.0+) -the following systems are supported when saving as 1.1.3+: +the following systems are also supported when saving as 1.1.3+: - Sega Master System (with FM expansion) - NES + Konami VRC7 - Famicom Disk System diff --git a/doc/2-interface/keyboard.md b/doc/2-interface/keyboard.md index 317538567..675ba0b55 100644 --- a/doc/2-interface/keyboard.md +++ b/doc/2-interface/keyboard.md @@ -39,7 +39,7 @@ the keys in the "Global hotkeys" section can be used in any window, although not | Panic | `F12` | | | | | **Window activation** | | -| Find/Replace | Ctrl-F | +| Find/Replace | `Ctrl-F` | | Settings | — | | Song Information | — | | Subsongs | — | @@ -63,16 +63,23 @@ the keys in the "Global hotkeys" section can be used in any window, although not | Piano | — | | Oscilloscope (master) | — | | Oscilloscope (per-channel) | — | +| Oscilloscope (X-Y) | — | | Volume Meter | — | | Clock | — | | Register View | — | | Log Viewer | — | | Statistics | — | +| Memory Composition | — | | Effect List | — | | Debug Menu | `Ctrl-Shift-D` | +| Command Stream Player | — | | About | — | | Collapse/expand current window | — | | Close current window | `Shift-Escape` | +| Command Palette | `Ctrl-P` | +| Recent files (Palette) | — | +| Insstruments (Palette) | — | +| Samples (Palette) | — | | | | | **Note input** | | | _see "note input" section after table_ | | @@ -102,8 +109,8 @@ the keys in the "Global hotkeys" section can be used in any window, although not | Move cursor down by one (override Edit Step) | `Shift-End` | | Move cursor to previous channel | — | | Move cursor to next channel | — | -| Move cursor to next channel (overflow) | — | | Move cursor to previous channel (overflow) | — | +| Move cursor to next channel (overflow) | — | | Move cursor to beginning of pattern | `Home` | | Move cursor to end of pattern | `End` | | Move cursor up (coarse) | `PageUp` | @@ -118,6 +125,10 @@ the keys in the "Global hotkeys" section can be used in any window, although not | Expand selection to end of pattern | — | | Expand selection upwards (coarse) | `Shift-PageUp` | | Expand selection downwards (coarse) | `Shift-PageDown` | +| Move selection up by one | `Alt-Up` | +| Move selection down by one | `Alt-Down` | +| Move selection to previous channel | `Alt-Left` | +| Move selection to next channel | `Alt-Right` | | Delete | `Delete` | | Pull delete | `Backspace` | | Insert | `Insert` | @@ -143,102 +154,103 @@ the keys in the "Global hotkeys" section can be used in any window, although not | Clear note input latch | — | | | | | **Instrument list** | | -| Add | `Insert` | -| Duplicate | `Ctrl-D` | -| Open | — | -| Open (replace current) | — | -| Save | — | -| Save (.dmp) | — | -| Move up | `Shift-Up` | -| Move down | `Shift-Down` | -| Delete | — | -| Edit | `Shift-Return` | -| Cursor up | `Up` | -| Cursor down | `Down` | -| Toggle folders/standard view | `Ctrl-V` | +| Add instrument | `Insert` | +| Duplicate instrument | `Ctrl-D` | +| Open instrument | — | +| Open instrument (replace current) | — | +| Save instrument | — | +| Save instrument (.dmp) | — | +| Move instrument up in list | `Shift-Up` | +| Move instrument down in list | `Shift-Down` | +| Delete instrument | — | +| Edit instrument | `Shift-Return` | +| Instrument cursor up | `Up` | +| Instrument cursor down | `Down` | +| Instruments: toggle folders/standard view | `Ctrl-V` | | | | | **Wavetable list** | | -| Add | `Insert` | -| Duplicate | `Ctrl-D` | -| Open | — | -| Open (replace current) | — | -| Save | — | -| Save (.dmw) | — | -| Save (raw) | — | -| Move up | `Shift-Up` | -| Move down | `Shift-Down` | -| Delete | — | -| Edit | `Shift-Return` | -| Cursor up | `Up` | -| Cursor down | `Down` | -| Toggle folders/standard view | `Ctrl-V` | +| Add wavetable | `Insert` | +| Duplicate wavetable | `Ctrl-D` | +| Open wavetable | — | +| Open wavetable (replace current) | — | +| Save wavetable | — | +| Save wavetable (.dmw) | — | +| Save wavetable (raw) | — | +| Move wavetable up in list | `Shift-Up` | +| Move wavetable down in list | `Shift-Down` | +| Delete wavetable | — | +| Edit wavetable | `Shift-Return` | +| Wavetable cursor up | `Up` | +| Wavetable cursor down | `Down` | +| Wavetables: toggle folders/standard view | `Ctrl-V` | | | | | **Sample list** | | -| Add | `Insert` | -| Duplicate | `Ctrl-D` | -| Create wavetable from selection | `Ctrl-W` | -| Open | — | -| Open (replace current) | — | -| Import raw data | — | -| Import raw data (replace current) | — | -| Save | — | -| Save (raw) | — | -| Move up | `Shift-Up` | -| Move down | `Shift-Down` | -| Delete | — | -| Edit | `Shift-Return` | -| Cursor up | `Up` | -| Cursor down | `Down` | -| Preview | — | -| Stop preview | — | -| Toggle folders/standard view | `Ctrl-V` | +| Add sample | `Insert` | +| Duplicate sample | `Ctrl-D` | +| Sample Editor: Create wavetable from selection | `Ctrl-W` | +| Open sample | — | +| Open sample (replace current) | — | +| Import raw sample data | — | +| Import raw sample data (replace current) | — | +| Save sample | — | +| Save sample (raw) | — | +| Move sample up in list | `Shift-Up` | +| Move sample down in list | `Shift-Down` | +| Delete sample | — | +| Edit sample | `Shift-Return` | +| Sample cursor up | `Up` | +| Sample cursor down | `Down` | +| Sample Preview | — | +| Stop sample preview | — | +| Samples: Toggle folders/standard view | `Ctrl-V` | +| Samples: Make me a drum kit | — | | | | | **Orders** | | | Previous order | `Up` | | Next order | `Down` | -| Cursor left | `Left` | -| Cursor right | `Right` | -| Increase value | — | -| Decrease value | — | -| Switch edit mode | — | -| Toggle alter entire row | `Ctrl-L` | -| Add | `Insert` | -| Duplicate | `Ctrl-D` | -| Deep clone | `Ctrl-Shift-D` | -| Duplicate to end of song | `Ctrl-E` | -| Deep clone to end of song | `Ctrl-Shift-E` | -| Remove | `Delete` | -| Move up | `Shift-Up` | -| Move down | `Shift-Down` | -| Replay | — | +| Order cursor left | `Left` | +| Order cursor right | `Right` | +| Increase order value | — | +| Decrease order value | — | +| Switch order edit mode | — | +| Order: Toggle alter entire row | `Ctrl-L` | +| Add order | `Insert` | +| Duplicate order | `Ctrl-D` | +| Deep clone order | `Ctrl-Shift-D` | +| Copy current order to end of song | `Ctrl-E` | +| Deep clone current order to end of song | `Ctrl-Shift-E` | +| Remove order | `Delete` | +| Move order up | `Shift-Up` | +| Move order down | `Shift-Down` | +| Replay order | — | | | | | **Sample editor** | | -| Edit mode: Select | `Shift-I` | -| Edit mode: Draw | `Shift-D` | -| Cut | `Ctrl-X` | -| Copy | `Ctrl-C` | -| Paste | `Ctrl-V` | -| Paste replace | `Ctrl-Shift-V` | -| Paste mix | `Ctrl-Alt-V` | -| Select all | `Ctrl-A` | -| Resize | `Ctrl-R` | -| Resample | `Ctrl-E` | -| Amplify | `Ctrl-B` | -| Normalize | `Ctrl-N` | -| Fade in | `Ctrl-I` | -| Fade out | `Ctrl-O` | -| Insert silence | `Insert` | -| Apply silence | `Shift-Delete` | -| Delete | `Delete` | -| Trim | `Ctrl-Delete` | -| Reverse | `Ctrl-T` | -| Invert | `Ctrl-Shift-T` | -| Signed/unsigned exchange | `Ctrl-U` | -| Apply filter | `Ctrl-F` | -| Preview sample | — | -| Stop sample preview | — | -| Zoom in | `Ctrl-=` | -| Zoom out | `Ctrl--` | -| Toggle auto-zoom | `Ctrl-0` | -| Create instrument from sample | — | -| Set loop to selection | `Ctrl-L` | +| Sample editor mode: Select | `Shift-I` | +| Sample editor mode: Draw | `Shift-D` | +| Sample editor: Cut | `Ctrl-X` | +| Sample editor: Copy | `Ctrl-C` | +| Sample editor: Paste | `Ctrl-V` | +| Sample editor: Paste replace | `Ctrl-Shift-V` | +| Sample editor: Paste mix | `Ctrl-Alt-V` | +| Sample editor: Select all | `Ctrl-A` | +| Sample editor: Resize | `Ctrl-R` | +| Sample editor: Resample | `Ctrl-E` | +| Sample editor: Amplify | `Ctrl-B` | +| Sample editor: Normalize | `Ctrl-N` | +| Sample editor: Fade in | `Ctrl-I` | +| Sample editor: Fade out | `Ctrl-O` | +| Sample editor: Insert silence | `Insert` | +| Sample editor: Apply silence | `Shift-Delete` | +| Sample editor: Delete | `Delete` | +| Sample editor: Trim | `Ctrl-Delete` | +| Sample editor: Reverse | `Ctrl-T` | +| Sample editor: Invert | `Ctrl-Shift-T` | +| Sample editor: Signed/unsigned exchange | `Ctrl-U` | +| Sample editor: Apply filter | `Ctrl-F` | +| Sample editor: Preview sample | — | +| Sample editor: Stop sample preview | — | +| Sample editor: Zoom in | `Ctrl-=` | +| Sample editor: Zoom out | `Ctrl--` | +| Sample editor: Toggle auto-zoom | `Ctrl-0` | +| Sample editor: Create instrument from sample | — | +| Sample editor: Set loop to selection | `Ctrl-L` | diff --git a/doc/2-interface/menu-bar.md b/doc/2-interface/menu-bar.md index ec3c6b1bf..58d0b4729 100644 --- a/doc/2-interface/menu-bar.md +++ b/doc/2-interface/menu-bar.md @@ -2,24 +2,20 @@ the menu bar allows you to select from five menus: file, edit, settings, window and help. -items in _italic_ don't appear in basic mode and are only available in advanced mode. - ## file -- **new...**: creates a new song. +- **new...**: opens the new song dialog to choose a system. + - click a system name to create a new song with it. + - some systems have several variants and are grouped, indicated by with a triangle to the left of the name. the first click on a group opens it. clicking again on the group name will create a new song with it. - **open...**: opens the file picker, allowing you to select a song to open. - see [file formats](formats.md) for a list of formats Furnace is able to open. - **open recent**: contains a list of the songs you've opened before. - **clear history**: erases the file history. - - **save**: saves the current song. - opens the file picker if this is a new song, or a backup. - **save as...**: opens the file picker, allowing you to save the song under a different name. - -- **export**: allows you to export your song into other formats, such as audio files, VGM and more. see the [export](export.md) page for more information. - +- **export...**: allows you to export your song into other formats, such as audio files, VGM and more. see the [export](export.md) page for more information. - **manage chips**: opens the [Chip Manager](../8-advanced/chip-manager.md) dialog. - - **restore backup**: restores a previously saved backup. - Furnace keeps up to 5 backups of a song. - the backup directory is located in: @@ -28,21 +24,18 @@ items in _italic_ don't appear in basic mode and are only available in advanced - Linux/other: `~/.config/furnace/backups` - this directory grows in size as you use Furnace. remember to delete old backups periodically to save space. - **do NOT rely on the backup system as auto-save!** you should save a restored backup because Furnace will not save backups of backups. - - **exit**: closes Furnace. ## edit - **...**: does nothing except prevent accidental clicks on later menu items if the menu is too tall to fit on the program window. - - **undo**: reverts the last action. - **redo**: repeats what you undid previously. - - **cut**: moves the current selection in the pattern view to clipboard. - **copy**: copies the current selection in the pattern view to clipboard. - **paste**: inserts the clipboard's contents in the cursor position. - you may be able to paste from OpenMPT as well. -- _**paste special...**:_ variants of the paste feature. +- **paste special...**: variants of the paste feature. - **paste mix**: inserts the clipboard's contents in the cursor position, but does not erase the occupied region. - **paste mix (background)**: does the same thing as paste mix, but doesn't alter content which is already there. - **paste with ins (foreground)**: same thing as paste mix, but changes the instrument. @@ -55,81 +48,84 @@ items in _italic_ don't appear in basic mode and are only available in advanced - if the selection is tall, it will select the entire column. - if a column is already selected, it will select the entire channel. - if a channel is already selected, it will select the entire pattern. - -- _**operation mask**:_ toggles which columns will be affected by the listed operations. [more information here.](../8-advanced/opmask.md) -- _**input latch**:_ determines which data are placed along with a note. [more information here.](../8-advanced/inputlatch.md) - +- **operation mask**: toggles which columns will be affected by the listed operations. [more information here.](../8-advanced/opmask.md) +- **input latch**: determines which data are placed along with a note. [more information here.](../8-advanced/inputlatch.md) - **note/octave up/down**: transposes notes in the current selection. - - **values up/down**: changes values in the current selection by ±1 or ±16. - - **transpose**: transpose notes or change values by a specific amount. - - **interpolate**: fills in gaps in the selection by interpolation between values. -- **change instrument**: changes the instrument number in a selection. -- **gradient/fade**: replace the selection with a "gradient" that goes from the beginning of the selection to the end. +- **change instrument...**: changes the instrument number in a selection. +- **gradient/fade...**: replace the selection with a "gradient" that goes from the beginning of the selection to the end. - does not affect the note column. - **Nibble mode**: when enabled, the fade will be per-nibble (0 to F) rather than per-value (00 to FF). - use for effects like `04xy` (vibrato). -- **scale**: scales values in the selection by a specific amount. +- **scale...**: scales values in the selection by a specific amount. - use to change volume in a selection for example. - **randomize**: replaces the selection with random values. - does not affect the note column. + - **Nibble mode**: when enabled, the randomization will be per-nibble (0 to F) rather than per-value (00 to FF). - **invert values**: `00` becomes `FF`, `01` becomes `FE`, `02` becomes `FD` and so on. - - **flip selection**: flips the selection so it is backwards. - **collapse/expand amount**: allows you to specify how much to collapse/expand in the next two menu items. - **collapse**: shrinks the selected contents. - **expand**: expands the selected contents. - - **collapse pattern**: same as collapse, but affects the entire pattern. - **expand pattern**: same as expand, but affects the entire pattern. - - **collapse song**: same as collapse, but affects the entire song. - it also changes speeds and pattern length to compensate. - **expand song**: same as expand, but affects the entire song. - it also changes speeds and pattern length to compensate. - -- _**find/replace**:_ shows [the Find/Replace window](../8-advanced/find-replace.md). - -- **clear**: opens a window that allows you to mass-delete things like songs, unused instruments, and the like. +- **find/replace**: shows [the Find/Replace window](../8-advanced/find-replace.md). +- **clear...**: opens a window that allows you to mass-delete things like songs, unused instruments, and the like. ## settings - **full screen**: expands the Furnace window so it covers your screen. - **lock layout**: prevents you from dragging/resizing docked windows, or docking more. -- **basic mode**: toggles [Basic Mode](basic-mode.md). -- **visualizer**: toggles pattern view particle effects when the song plays. +- **pattern visualizer**: toggles pattern view particle effects when the song plays. - **reset layout**: resets the workspace to its defaults. -- **settings...**: shows the Settings window. these are detailed in [settings.md]. +- **user systems...**: shows the User Systems window. this is detailed in [the User Systems documentation](../8-advanced/user-systems.md). +- **settings...**: shows the Settings window. these are detailed in [the Settings documentation](settings.md). ## window all these menu items show or hide their associated windows. -- [song information](song-info.md) -- [subsongs](song-info.md) -- [speed](song-info.md) -- [instruments](../4-instrument/README.md) -- [wavetables](../5-wave/README.md) -- [samples](../6-sample/README.md) -- [orders](order-list.md) -- [pattern](../3-pattern/README.md) -- _[mixer](../8-advanced/mixer.md)_ -- _[grooves](../8-advanced/grooves.md)_ -- _[channels](../8-advanced/channels.md)_ -- _[pattern manager](../8-advanced/pat-manager.md)_ -- _[chip manager](../8-advanced/chip-manager.md)_ -- _[compatibility flags](../8-advanced/compat-flags.md)_ -- [song comments](../8-advanced/comments.md) - -- [piano](../8-advanced/piano.md) -- [oscilloscope](../8-advanced/osc.md) -- [oscilloscopes (per-channel)](../8-advanced/chanosc.md) -- [clock](../8-advanced/clock.md) -- [register view](../8-advanced/regview.md) -- [log viewer](../8-advanced/log-viewer.md) -- [stats](../8-advanced/stats.md) +- song + - **[song comments](../8-advanced/comments.md)** + - **[song information](song-info.md)** + - **[subsongs](song-info.md)** + - **[channels](../8-advanced/channels.md)** + - **[chip manager](../8-advanced/chip-manager.md)** + - **[orders](order-list.md)** + - **[pattern](../3-pattern/README.md)** + - **[pattern manager](../8-advanced/pat-manager.md)** + - **[mixer](../8-advanced/mixer.md)** + - **[compatibility flags](../8-advanced/compat-flags.md)** +- assets + - **[instruments](../4-instrument/README.md)** + - **[samples](../6-sample/README.md)** + - **[wavetables](../5-wave/README.md)** + - **[instrument editor](../4-instrument/README.md)** + - **[sample editor](../6-sample/README.md)** + - **[wavetable editor](../5-wave/README.md)** +- visualizers + - **[oscilloscope](../8-advanced/osc.md)** + - **[oscilloscope (per-channel)](../8-advanced/chanosc.md)** + - **[oscilloscope (X-Y)](../8-advanced/xyosc.md)** + - volume meter +- tempo + - **[clock](../8-advanced/clock.md)** + - **[grooves](../8-advanced/grooves.md)** + - **[speed](song-info.md)** +- debug + - **[log viewer](../8-advanced/log-viewer.md)** + - **[register view](../8-advanced/regview.md)** + - **[statistics](../8-advanced/stats.md)** + - **[memory composition](../8-advanced/memory-composition.md)** +- **[effect list](../3-pattern/effects.md)** +- **[play/edit controls](play-edit-controls.md)** +- **[piano/input pad](../8-advanced/piano.md)** ## help diff --git a/doc/2-interface/play-edit-controls.md b/doc/2-interface/play-edit-controls.md index d7814ac25..47e4f103b 100644 --- a/doc/2-interface/play-edit-controls.md +++ b/doc/2-interface/play-edit-controls.md @@ -13,6 +13,7 @@ the "Play/Edit Controls" are used to control playback and change parameters of t - **Poly**: turns on polyphony for previewing notes. toggles to **Mono** for monophony (one note at a time only). - **Octave**: sets current input octave. - **Step**: sets edit step. if this is 1, entering a note or effect will move to the next row. if this is a larger number, rows will be skipped. if this is 0, the cursor will stay in place. + - if clicked, Step becomes **Coarse**, which sets the number of rows moved with `PgUp`, `PgDn`, and related movement shortcuts. clicking again will revert it to Step. - **Follow orders**: if on, the selected order in the orders window will follow the song during playback. - **Follow pattern**: if on, the cursor will follow playback and the song will scroll by as it plays. diff --git a/doc/2-interface/settings.md b/doc/2-interface/settings.md index ec61e9371..eadbf55a9 100644 --- a/doc/2-interface/settings.md +++ b/doc/2-interface/settings.md @@ -1,6 +1,6 @@ # settings -the Settings window allows you to change Furnace setting. +the Settings window allows you to change Furnace settings. settings are saved when clicking the **OK** or **Apply** buttons at the bottom of the window. @@ -8,18 +8,23 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o ### Program +- **Language**: select the language used for the interface. some languages are incomplete, and are listed with their approximate completion percentage. - **Render backend**: changing this may help with performace or compatibility issues. the available render backends are: + - SDL Renderer: this was the only available render backend prior to the addition of dedicated OpenGL/DirectX backends in 0.6. default on macOS. + - DirectX 11: works with the majority of graphics chips/cards and is optimized specifically for Windows. + - it is slower than the other backends. + - DirectX 9: use if your hardware is incompatible with DirectX 11. - OpenGL 3.0: works with the majority of graphics chips/cards (from 2010 onwards). default on Linux. - OpenGL 2.0: use if you have a card without OpenGL 3.0 support. - OpenGL 1.1: use if your card doesn't even support OpenGL 2.0. - - DirectX 11: works with the majority of graphics chips/cards and is optimized specifically for Windows. - - SDL Renderer: this was the only available render backend prior to the addition of dedicated OpenGL/DirectX backends in 0.6. default on macOS. - - it is slower than the other backends. - Software: this is a last resort backend which renders the interface in software. very slow! -- **Render driver**: this setting appears when using the SDL Renderer backend. it allows you to select an SDL render driver. +- **Advanced render backend settings**: only applicable with some render backends. + - **Render driver**: this setting only appears when using the SDL Renderer backend. it allows you to select an SDL render driver. + - OpenGL settings: these only appear when using an OpenGL backend, and should only be adjusted if the display is incorrect. - **VSync**: synchronizes rendering to VBlank and eliminates tearing. - **Frame rate limit**: allows you to set a frame rate limit (in frames per second). - only has effect when VSync is off or not available (e.g. software rendering or force-disabled on driver settings). +- **Display render time**: displays frame rate and frame render time at the right side of the menu bar. - **Late render clear**: this option is only useful when using old versions of Mesa drivers. it force-waits for VBlank by clearing after present, reducing latency. - **Power-saving mode**: saves power by lowering the frame rate to 2fps when idle. - may cause issues under Mesa drivers! @@ -49,6 +54,7 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o - **Remember last values** - **Store instrument name in .fui**: when enabled, saving an instrument will store its name. this may increase file size. - **Load instrument name from .fui**: when enabled, loading an instrument will use the stored name (if present). otherwise, it will use the file name. +- **Auto-fill file name when saving**: pre-fill the file name field with an appropriate name when saving or exporting. ### New Song @@ -79,6 +85,11 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o - **New instruments are blank**: when enabled, adding FM instruments will make them blank (rather than loading the default one). +### Configuration +- **Import**: select an exported `.ini` config file to overwrite current settings. +- **Export**: select an `.ini` file to save current settings. +- **Factory Reset**: resets all settings to default. + ## Audio ### Output @@ -100,9 +111,7 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o - **Sample rate**: audio output rate. - a lower rate decreases quality and isn't really beneficial. - if using PortAudio backend, be careful about this value. -- **Outputs**: number of audio outputs created, up to 16. - - only appears when Backend is JACK. -- **Channels**: mono, stereo or something. +- **Outputs**: number of audio outputs created, up to 16. default is 2 (stereo). - **Buffer size**: size of buffer in both samples and milliseconds. - setting this to a low value may cause stuttering/glitches in playback (known as "underruns" or "xruns"). - setting this to a high value increases latency. @@ -135,6 +144,7 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o ### MIDI input - **MIDI input**: input device. + - **Rescan MIDI devices**: repopulates list with all currently connected MIDI devices. useful if a device is connected while Furnace is running. - **Note input**: enables note input. disable if you intend to use this device only for binding actions. - **Velocity input**: enables velocity input when entering notes in the pattern. - **Map MIDI channels to direct channels**: when enabled, notes from MIDI channels will be mapped to channels rather than the cursor position. @@ -291,6 +301,7 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Push value when overwriting instead of clearing it**: in the order list and pattern editors, typing into an already-filled value will shift digits instead of starting fresh. for example: - if off: moving the cursor onto the value `A5` and typing a "B" results in `0B`. - if on: moving the cursor onto the value `A5` and typing a "B" results in `5B`. +- **Keyboard note/value input repeat (hold key to input continuously)** - **Effect input behavior:** - **Move down**: after entering an effect (or effect value), the cursor moves down. - **Move to effect value (otherwise move down)**: after entering an effect, the cursor moves to its value. if entering a value, the cursor moves down. @@ -359,11 +370,7 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Pattern font** font for the pattern view, the order list, and related. - if "Custom...", a file path selector will appear. - **Size**: font size. -- **Display Japanese characters**, **Display Chinese (Simplified) characters**, **Display Chinese (Traditional) characters** and **Display Korean characters**: only toggle these options if you have enough graphics memory. - - these are a temporary solution until dynamic font atlas is implemented in Dear ImGui. - #### FreeType-specific settings - - **Anti-aliased fonts**: when enabled, fonts will be rendered smooth. - **Support bitmap fonts**: this option allows you to enable the loading of bitmap fonts. - be noted that this may force non-bitmap fonts to undesired sizes! @@ -376,6 +383,13 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Disable**: only rely upon font hinting data. - **Enable**: prefer font hinting data if present. - **Force**: ignore font hinting data. +#### non-specific settings +- **Oversample**: renders the font internally at higher resolution for visual quality. + - higher settings use more video memory. + - for pixel or bitmap fonts, set this to **1x**. +- **Load fallback font**: load an extra font that contains nearly all characters that can be used, in case the selected fonts lack them. uses much video memory +- **Display Japanese characters**, **Display Chinese (Simplified) characters**, **Display Chinese (Traditional) characters** and **Display Korean characters**: only toggle these options if you have enough graphics memory. + - these are a temporary solution until dynamic font atlas is implemented in Dear ImGui. ### Program @@ -386,15 +400,16 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **/path/to/file.fur - Furnace** - **Display system name on title bar** - **Display chip names instead of "multi-system" in title bar** -- **Export options layout:** - - **Sub-menus in File menu**: export options appear in the File menu as sub-menus. - - **Modal window with tabs**: a single "export..." option that opens a dialog with export options. this is the default. - - **Modal windows with options in File menu**: like Sub-menus in File menu, but instead of being sub-menus, selecting one opens a dialog with export settings. - **Status bar:** - **Cursor details** - **File path** - **Cursor details or file path** - **Nothing** +- **Display playback status when playing**: display playback time and current location in the menu bar. +- **Export options layout:** + - **Sub-menus in File menu**: export options appear in the File menu as sub-menus. + - **Modal window with tabs**: a single "export..." option that opens a dialog with export options. this is the default. + - **Modal windows with options in File menu**: like Sub-menus in File menu, but instead of being sub-menus, selecting one opens a dialog with export settings. - **Capitalize menu bar** - **Display add/configure/change/remove chip menus in File menu**: if enabled, the "manage chips" item in the file menu is split into the four listed items for quick access. @@ -532,10 +547,10 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Rounded window corners** - **Rounded buttons** - **Rounded menu corners** +- **Rounded tabs** +- **Rounded scrollbars** - **Borders around widgets**: draws borders on buttons, checkboxes, text widgets, and the like. - - ## Color ### Color scheme @@ -544,9 +559,28 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Export** - **Reset defaults** - **Guru mode**: exposes all color options (instead of accent colors). -- **General** +- **Interface** + - **Frame shading**: applies a gradient effect to buttons and input boxes. - **Color scheme type:** - **Dark** - **Light** - - **Frame shading**: applies a gradient effect to buttons and input boxes. + - **Accent colors**: select main interface colors. + - **Primary** + - **Secondary** - several more categories... + +## Backup + +### Configuration + +- **Enable backup system**: turn on automatic backups of the current open file. +- **Interval (in seconds)**: time between automatic backups. +- **Backups per file**: maximum number of backups to store for each file. + +### Backup Management + +- **Purge before**: + - **Go**: purge backups whose filenames precede the selected date. +- total space used by all backups: + - **Refresh**: recalculate space. + - **Delete All**: purge all backups. diff --git a/doc/2-interface/song-info.md b/doc/2-interface/song-info.md index 24a42f95e..1e10663a3 100644 --- a/doc/2-interface/song-info.md +++ b/doc/2-interface/song-info.md @@ -3,11 +3,11 @@ - **Name**: the track's title. - **Author**: the author(s) of this track. - **Album**: the associated album name (or the name of the game the song is from). -- **System**: the game console or computer the track is designed for. this is automatically set when creating a new tune, but in advanced mode, it can be changed to anything one wants. the **Auto** button will provide a guess based on the chips in use. +- **System**: the game console or computer the track is designed for. this is automatically set when creating a new tune, but can be changed to anything. the **Auto** button will provide a guess based on the chips in use. all of this metadata will be included in a VGM export. this isn't the case for an audio export, however. -- _**Tuning (A-4)**_: set tuning based on the note A-4, which should be 440 in most cases. opening an Amiga MOD will set it to 436 for hardware compatibility. available only in advanced mode. +- **Tuning (A-4)**: set tuning based on the note A-4, which should be 440 in most cases. opening an Amiga MOD will set it to 436 for hardware compatibility. ## subsongs @@ -23,16 +23,17 @@ this window allows one to create **subsongs** - multiple individual songs within there are multiple ways to set the tempo of a song. -items in _italic_ don't appear in basic mode and are only available in advanced mode. +**Base Tempo**: tempo in beats per minute (BPM). this is affected by the Highlight settings below. +- clicking the Base Tempo button switches to the more technical Tick Rate. **Tick Rate**: the frequency of ticks per second, thus the rate at which notes and effects are processed. - all values are allowed for all chips, though most chips have hardware limitations that mean they should stay at either 60 (approximately NTSC) or 50 (exactly PAL). -- clicking the Tick Rate button switches to a more traditional **Base Tempo** BPM setting. +- clicking the Tick Rate button switches to the more traditional Base Tempo BPM setting. **Speed**: the number of ticks per row. - clicking the "Speed" button changes to more complex modes covered in the [grooves](../8-advanced/grooves.md) page. -_**Virtual Tempo**:_ Simulates any arbitrary tempo without altering the tick rate. it does this by adding or skipping ticks to approximate the tempo. the two numbers represent a ratio applied to the actual tick rate. example: +**Virtual Tempo**: simulates any arbitrary tempo without altering the tick rate. it does this by adding or skipping ticks to approximate the tempo. the two numbers represent a ratio applied to the actual tick rate. example: - set tick rate to 150 BPM (60 Hz) and speed to 6. - set the first virtual tempo number (numerator) to 200. - set the second virtual tempo number (denominator) to 150. @@ -40,7 +41,8 @@ _**Virtual Tempo**:_ Simulates any arbitrary tempo without altering the tick rat - the ratio doesn't have to match BPM numbers. set the numerator to 4 and the denominator to 5, and the virtual BPM becomes 150 × 4/5 = 120. - another way to accomplish this with more control over the results is to use grooves. see the page on [grooves](../8-advanced/grooves.md) for details. -_**Divider**:_ Changes the effective tick rate. a tick rate of 60Hz and a divisor of 6 will result in ticks lasting a tenth of a second each! +**Divider**: changes the effective tick rate. a tick rate of 60Hz and a divisor of 6 will result in ticks lasting a tenth of a second each! +- to the right, the effective BPM is listed, taking all settings into account. **Highlight**: sets the pattern row highlights: - the first value represents the number of rows per beat. @@ -50,4 +52,4 @@ _**Divider**:_ Changes the effective tick rate. a tick rate of 60Hz and a diviso **Pattern Length**: the length of each pattern in rows. this affects all patterns in the song, and every pattern must be the same length. (Individual patterns can be cut short by `0Bxx`, `0Dxx`, and `FFxx` commands.) -_**Song Length**:_ how many orders are in the order list. decreasing it will hide the orders at the bottom. increasing it will restore those orders; increasing it further will add new orders of all `00` patterns. +**Song Length**: how many orders are in the order list. decreasing it will hide the orders at the bottom. increasing it will restore those orders; increasing it further will add new orders of all `00` patterns. diff --git a/doc/3-pattern/README.md b/doc/3-pattern/README.md index 31713ea64..77060b5f2 100644 --- a/doc/3-pattern/README.md +++ b/doc/3-pattern/README.md @@ -119,6 +119,10 @@ Shift-Up | expand selection upwards Shift-Down | expand selection downwards Shift-Left | expand selection to the left Shift-Right | expand selection to the right +Alt-Up | move selection up by one +Alt-Down | move selection down by one +Alt-Left | move selection to previous channel +Alt-Right | move selection to next channel Backspace | delete note at cursor and/or pull pattern upwards (configurable) Delete | delete selection Insert | create blank row at cursor position and push pattern diff --git a/doc/6-sample/README.md b/doc/6-sample/README.md index 2e870c95d..5ebe571c1 100644 --- a/doc/6-sample/README.md +++ b/doc/6-sample/README.md @@ -89,6 +89,7 @@ in there, you can modify certain data pertaining to your sample, such as the: - **Open**: replaces current sample. - right-clicking brings up a menu: - **import raw...**: brings up a file selector, then presents a dialog to choose the format of the selected file. + - **import raw (replace)...**: same as above, but instead of adding it to the sample list, it replaces the currently selected sample. - **Save**: saves current sample to disk. - right-clicking brings up a menu: - **save raw...**: brings up a file selector, then saves the sample as raw data. diff --git a/doc/7-systems/gba.md b/doc/7-systems/gba.md index 692d8db0d..a0653a5fe 100644 --- a/doc/7-systems/gba.md +++ b/doc/7-systems/gba.md @@ -15,11 +15,11 @@ it features echo and up to 16 voices. - `10xx`: **change wave.** - `11xy`: **configure echo.** - - this effect is kinda odd. this is how it works: - -> How do you echo on GBA -> -> Create an empty instrment and put a very high note of it in channel 1 then do 110x in effect column and set volume column to set feedback and do nothing else on it + - this effect is kinda odd. here's how to use it: + - create an empty instrument and put a very high note of it in channel 1. + - put `110x` in the effect column. + - set volume column to set feedback. + - don't use the channel for anything else. - `12xy`: **toggle invert.** - `x` left channel. diff --git a/doc/8-advanced/README.md b/doc/8-advanced/README.md index 4a9512823..759737e0e 100644 --- a/doc/8-advanced/README.md +++ b/doc/8-advanced/README.md @@ -8,22 +8,27 @@ as listed in the "Edit" menu: as listed in the "Window" menu: -- [mixer](mixer.md) -- [grooves](grooves.md) -- [channel manager](channels.md) -- [pattern manager](pat-manager.md) -- [chip manager](chip-manager.md) -- [compatibility flags](compat-flags.md) -- [song comments](comments.md) - -- [piano](piano.md) -- [oscilloscope](osc.md) -- [oscilloscope (X-Y)](xyosc.md) -- [oscilloscopes (per-channel)](chanosc.md) -- [clock](clock.md) -- [register view](regview.md) -- [log viewer](log-viewer.md) -- [stats](stats.md) +- song + - [song comments](../8-advanced/comments.md) + - [channels](../8-advanced/channels.md) + - [chip manager](../8-advanced/chip-manager.md) + - [pattern manager](../8-advanced/pat-manager.md) + - [mixer](../8-advanced/mixer.md) + - [compatibility flags](../8-advanced/compat-flags.md) +- visualizers + - [oscilloscope](../8-advanced/osc.md) + - [oscilloscope (per-channel)](../8-advanced/chanosc.md) + - [oscilloscope (X-Y)](../8-advanced/xyosc.md) + - volume meter +- tempo + - [clock](../8-advanced/clock.md) + - [grooves](../8-advanced/grooves.md) +- debug + - [log viewer](../8-advanced/log-viewer.md) + - [register view](../8-advanced/regview.md) + - [statistics](../8-advanced/stats.md) + - [memory composition](../8-advanced/memory-composition.md) +- [piano/input pad](../8-advanced/piano.md) other: diff --git a/doc/8-advanced/channels.md b/doc/8-advanced/channels.md index 5b70f00dd..53bc00065 100644 --- a/doc/8-advanced/channels.md +++ b/doc/8-advanced/channels.md @@ -5,8 +5,9 @@ the "Channels" dialog allows manipulation of the song's channels. ![channels dialog](channels.png) each channel has the following options: -- **Visible**: uncheck the box to hide the channel from the pattern view. pattern data will be kept. -- crossed-arrows button: click and drag to rearrange pattern data throughout the song. +- **Pat**: uncheck the box to hide the channel from the pattern view. pattern data will be kept. +- **Osc**: uncheck the box to hide the channel from the per-channel oscilloscope view. +- **Swap**: click and drag to rearrange pattern data throughout the song. - note: this does **not** move channels around! it only moves the channel's pattern data. - **Name**: the name displayed at the top of each channel in the pattern view. - the next setting is "short name", which is displayed in the orders view and/or when a channel is collapsed. diff --git a/doc/8-advanced/chanosc.md b/doc/8-advanced/chanosc.md index 6a2cd27ed..54163dfb3 100644 --- a/doc/8-advanced/chanosc.md +++ b/doc/8-advanced/chanosc.md @@ -14,6 +14,7 @@ right-clicking the view will display the configuration view shown above: - **Mode 2**: bias slightly toward more columns. - **Mode 3**: always more columns than rows. - **Amplitude**: scales amplitude for all oscilloscope views. +- **Line size**: controls line thickness. - **Gradient**: this allows you to use a gradient for determining the waveforms' colors instead of a single color. see the gradient section for more information. - if this option is off, a color selector will be displayed. right-click on it for some options: - select between the square selector and the color wheel selector. diff --git a/doc/8-advanced/chip-manager.md b/doc/8-advanced/chip-manager.md index 41a187fd9..09388e802 100644 --- a/doc/8-advanced/chip-manager.md +++ b/doc/8-advanced/chip-manager.md @@ -8,6 +8,8 @@ the **chip manager** window allows you to manage chips, including adding, changi **Clone channel data**: when cloning chips, also copy patterns, pattern names, channel names and other parameters to the clone. +**Clone at end**: instead of inserting the clone directly after the cloned chip, add it to the end. + to move a chip around, click and drag the ![crossed-arrows](chip-manager-move.png) button to the left. to duplicate a chip, click the **Clone** button. diff --git a/doc/8-advanced/user-systems.md b/doc/8-advanced/user-systems.md new file mode 100644 index 000000000..d60772654 --- /dev/null +++ b/doc/8-advanced/user-systems.md @@ -0,0 +1,22 @@ +# user systems + +combinations of chips and chip configurations can be stored as **user systems** – presets that are easily accessed when starting a new song. + +![user systems window](user-systems.png) + +the `+` button at the top of the **Systems** list will add a new system. + +next to the **Name** field, the **Remove** button removes the current system from the list. + +chip configuration is exactly as in the [chip manager](chip-manager.md) window. + +the **Advanced** field stores additional settings that are set when a new song is started. these are listed in "option=value" format, one per line. +- `tickRate`: sets tick rate. + +**Save and Close**: as it says. + +**Import**: opens a dialog to select a `.cfgu` file, then adds its systems to the list. + +**Import (replace)**: opens a similar dialog, then clears the existing systems list and replaces it with the imported one. + +**Export**: stores the current list of systems in a selected `.cfgu` file. \ No newline at end of file diff --git a/doc/8-advanced/user-systems.png b/doc/8-advanced/user-systems.png new file mode 100644 index 0000000000000000000000000000000000000000..c300530a3178e4d451ba5ad1b614103f3bb5e5dd GIT binary patch literal 35024 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⁢3y(mHZo$4Y@dIx6aVcNiXlh#z0s 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 Date: Fri, 26 Jul 2024 11:12:30 -0700 Subject: [PATCH 12/28] Minor docs tweaks and fixes. --- doc/2-interface/export.md | 8 ++++---- doc/2-interface/settings.md | 15 +++++++++------ doc/2-interface/song-info.md | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/doc/2-interface/export.md b/doc/2-interface/export.md index e924a1717..4009df9d8 100644 --- a/doc/2-interface/export.md +++ b/doc/2-interface/export.md @@ -53,7 +53,7 @@ the following settings exist: - due to VGM format limitations, you can only select up to two of each chip type. - some chips will not be available, either because VGM doesn't support these yet, or because you selected an old format version. -## export ZSM +## ZSM ZSM (ZSound Music) is a format designed for the Commander X16 to allow hardware playback. it may contain data for either YM2151 or VERA chips. @@ -67,17 +67,17 @@ the following settings are available: - **loop**: enables loop. if disabled, the song won't loop. - **optimize size**: removes unnecessary commands to reduce size. -## export text +## Text this option allows you to export your song as a text file. -## export command stream +## Command Stream this option exports a binary file in Furnace's own command stream format (FCS) which contains a dump of the internal command stream produced when playing the song. it's not really useful, unless you're a developer and want to use a command stream dump for some reason (e.g. writing a hardware sound driver). see `export-tech.md` in `papers/` for details. -## export DMF +## DMF this option allows you to save your song as a .dmf which can be opened in DefleMask. diff --git a/doc/2-interface/settings.md b/doc/2-interface/settings.md index eadbf55a9..cfe12c949 100644 --- a/doc/2-interface/settings.md +++ b/doc/2-interface/settings.md @@ -2,7 +2,8 @@ the Settings window allows you to change Furnace settings. -settings are saved when clicking the **OK** or **Apply** buttons at the bottom of the window. +settings are saved when clicking the **OK** or **Apply** buttons at the bottom of the window, and when closing the program. several backups are kept in the Furnace settings directory. + ## General @@ -11,8 +12,8 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o - **Language**: select the language used for the interface. some languages are incomplete, and are listed with their approximate completion percentage. - **Render backend**: changing this may help with performace or compatibility issues. the available render backends are: - SDL Renderer: this was the only available render backend prior to the addition of dedicated OpenGL/DirectX backends in 0.6. default on macOS. - - DirectX 11: works with the majority of graphics chips/cards and is optimized specifically for Windows. - it is slower than the other backends. + - DirectX 11: works with the majority of graphics chips/cards and is optimized specifically for Windows. - DirectX 9: use if your hardware is incompatible with DirectX 11. - OpenGL 3.0: works with the majority of graphics chips/cards (from 2010 onwards). default on Linux. - OpenGL 2.0: use if you have a card without OpenGL 3.0 support. @@ -54,7 +55,9 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o - **Remember last values** - **Store instrument name in .fui**: when enabled, saving an instrument will store its name. this may increase file size. - **Load instrument name from .fui**: when enabled, loading an instrument will use the stored name (if present). otherwise, it will use the file name. -- **Auto-fill file name when saving**: pre-fill the file name field with an appropriate name when saving or exporting. +- **Auto-fill file name when saving**: pre-fill the file name field when saving or exporting. + - when saving a module, the existing file name will be auto-filled. + - when saving an instrument or sample, its name will be auto-filled. ### New Song @@ -88,7 +91,7 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o ### Configuration - **Import**: select an exported `.ini` config file to overwrite current settings. - **Export**: select an `.ini` file to save current settings. -- **Factory Reset**: resets all settings to default. +- **Factory Reset**: resets all settings to default and purges settings backups. ## Audio @@ -575,12 +578,12 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Enable backup system**: turn on automatic backups of the current open file. - **Interval (in seconds)**: time between automatic backups. -- **Backups per file**: maximum number of backups to store for each file. +- **Backups per file**: maximum number of backups to store for each file. oldest backups are deleted first. ### Backup Management - **Purge before**: - - **Go**: purge backups whose filenames precede the selected date. + - **Go**: purge all backups from before the selected date. - total space used by all backups: - **Refresh**: recalculate space. - **Delete All**: purge all backups. diff --git a/doc/2-interface/song-info.md b/doc/2-interface/song-info.md index 1e10663a3..f9773807c 100644 --- a/doc/2-interface/song-info.md +++ b/doc/2-interface/song-info.md @@ -3,7 +3,7 @@ - **Name**: the track's title. - **Author**: the author(s) of this track. - **Album**: the associated album name (or the name of the game the song is from). -- **System**: the game console or computer the track is designed for. this is automatically set when creating a new tune, but can be changed to anything. the **Auto** button will provide a guess based on the chips in use. +- **System**: the name of the game console or computer the track is designed for. this is automatically set when creating a new tune, but can be changed to anything. the **Auto** button will provide a guess based on the chips in use. all of this metadata will be included in a VGM export. this isn't the case for an audio export, however. From 0d5ff1d30ef4d13fc62a1dd00a5b9f7e26a082ee Mon Sep 17 00:00:00 2001 From: Electric Keet Date: Fri, 26 Jul 2024 18:39:14 -0700 Subject: [PATCH 13/28] More tweaks to export.md. --- doc/2-interface/export.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/doc/2-interface/export.md b/doc/2-interface/export.md index 4009df9d8..2b68a0a9a 100644 --- a/doc/2-interface/export.md +++ b/doc/2-interface/export.md @@ -1,8 +1,8 @@ # export -Furnace allows you to export your song in several formats. this section deals with describing the available export options within each tab of the export window. +Furnace allows you to export your song in several formats. this section deals with describing the available export options. -## Audio +## audio this option allows you to export your song in .wav format. I know I know, no .mp3 or .ogg export yet, but you can use a converter. @@ -11,10 +11,11 @@ this option allows you to export your song in .wav format. I know I know, no .mp - **multiple files (one per chip)**: exports the output of each chip to .wav files. - **multiple files (one per channel)**: exports the output of each channel to .wav files. - useful for usage with a channel visualizer such as corrscope. -- **Bit depth**: - - **16-bit integer**: the most common type of .wav file, perfect for music playback. - - **32-bit float**: used for advanced audio manipulation. don't select this unless you know what you need it for. -- **Sample rate**: the default is 44100, the most common .wav sample rate. +- **Bit depth**: default is 16-bit integer. +- **Sample rate**: affects the quality of the output file. + - default is 44100, "CD quality". + - lower sample rates lose fidelity as upper frequencies disappear. + - higher sample rates gain frequencies that can't be heard at the cost of file size and rendering time. - **Channels in file**: default is 2 (stereo). Set to 1 for mono. - **Loops**: sets the number of times the song will loop. - does not have effect if the song ends with `FFxx` effect. @@ -67,11 +68,11 @@ the following settings are available: - **loop**: enables loop. if disabled, the song won't loop. - **optimize size**: removes unnecessary commands to reduce size. -## Text +## text this option allows you to export your song as a text file. -## Command Stream +## command stream this option exports a binary file in Furnace's own command stream format (FCS) which contains a dump of the internal command stream produced when playing the song. From db058444b9ff0f1a7a78901f6aab3d0b34ef16ab Mon Sep 17 00:00:00 2001 From: Electric Keet Date: Sat, 3 Aug 2024 12:27:09 -0700 Subject: [PATCH 14/28] Tightening up some text. --- doc/2-interface/menu-bar.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/2-interface/menu-bar.md b/doc/2-interface/menu-bar.md index 58d0b4729..fff10825b 100644 --- a/doc/2-interface/menu-bar.md +++ b/doc/2-interface/menu-bar.md @@ -6,7 +6,7 @@ the menu bar allows you to select from five menus: file, edit, settings, window - **new...**: opens the new song dialog to choose a system. - click a system name to create a new song with it. - - some systems have several variants and are grouped, indicated by with a triangle to the left of the name. the first click on a group opens it. clicking again on the group name will create a new song with it. + - some systems have several variants, which are inside a group. - **open...**: opens the file picker, allowing you to select a song to open. - see [file formats](formats.md) for a list of formats Furnace is able to open. - **open recent**: contains a list of the songs you've opened before. From ee1cfd9e837eeabf8880916907671f93219aa623 Mon Sep 17 00:00:00 2001 From: Electric Keet Date: Wed, 7 Aug 2024 21:47:37 -0700 Subject: [PATCH 15/28] SNES docs update. --- doc/7-systems/snes.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/7-systems/snes.md b/doc/7-systems/snes.md index 7b39ed87f..978af2106 100644 --- a/doc/7-systems/snes.md +++ b/doc/7-systems/snes.md @@ -59,7 +59,7 @@ Furnace also allows the SNES to use wavetables (and the wavetable synthesizer) i - `00` to `7F` for 0 to 127. - `80` to `FF` for -128 to -1. - note: be sure the sum of all coefficients is between -128 and 127. sums outside that may result in overflow and therefore clicking. - - see [SnesLab](https://sneslab.net/wiki/FIR_Filter) for a full explanation and examples. + - see SnesLab for [echo filter explanations and examples](https://sneslab.net/wiki/FIR_Filter#Uses). ## info @@ -67,6 +67,8 @@ this chip uses the [SNES](../4-instrument/snes.md) instrument editor. when two channels are joined for pitch modulation, the channel bar will show `mod` on a bracket tying them together. +when using sample offset commands, be sure to open each involved sample in the sample editor, look to the "Info" section at the top-left, and check the "no BRR filters" box. this prevents sound glitches, at the cost of lowering the sample quality to 4-bit. + ## channel status the following icons are displayed when channel status is enabled in the pattern view: @@ -93,6 +95,8 @@ the following options are available in the Chip Manager window: - **Feedback**: sets how much of the echo output will be fed back into the buffer. - **Echo volume**: sets echo volume. - **Echo filter**: adjusts echo filter. +- **Dec/Hex**: toggles decimal or hexadecimal mode for the filter settings text entry box to the right. + - SnesLab provides [echo filter explanations and examples](https://sneslab.net/wiki/FIR_Filter#Uses). their example filter strings can be pasted directly into the filter settings text entry box if set to Hex mode. ## ADSR From 41e094d79d12b30e2bb50bbe1c2789e4b93c7b23 Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:50:29 +0300 Subject: [PATCH 16/28] OPL3, hide unused channels --- src/engine/fileOps/s3m.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/engine/fileOps/s3m.cpp b/src/engine/fileOps/s3m.cpp index d13c1c7c2..ea8d2d58e 100644 --- a/src/engine/fileOps/s3m.cpp +++ b/src/engine/fileOps/s3m.cpp @@ -287,7 +287,7 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { if (hasFM && hasPCM) break; } - int pcmChan=hasFM?9:0; + int pcmChan=hasFM?18:0; int fmChan=hasPCM?32:0; int invalidChan=40; @@ -312,6 +312,20 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { ds.subsong[0]->chanShow[i]=false; ds.subsong[0]->chanShowChanOsc[i]=false; } + + if (hasFM) { + for (int i=0; i<18; i++) { + ds.subsong[0]->chanShow[i]=false; + ds.subsong[0]->chanShowChanOsc[i]=false; + } + } + } + + if (hasFM) { + for (int i=(hasPCM?32:0) + 9; i<(hasPCM?32:0) + 18; i++) { + ds.subsong[0]->chanShow[i]=false; + ds.subsong[0]->chanShowChanOsc[i]=false; + } } logV("numChans: %d",numChans); @@ -327,7 +341,7 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { ds.systemLen++; } if (hasFM) { - ds.system[ds.systemLen]=DIV_SYSTEM_OPL2; + ds.system[ds.systemLen]=DIV_SYSTEM_OPL3; ds.systemVol[ds.systemLen]=1.0f; ds.systemPan[ds.systemLen]=0; ds.systemLen++; From 5770f381ba3f0a1b79e8580235048597dd3ca14a Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Wed, 14 Aug 2024 18:40:17 +0300 Subject: [PATCH 17/28] setting to choose between OPL2 and OPL3, channel naming --- src/engine/engine.h | 4 +- src/engine/fileOps/fileOpsCommon.cpp | 4 +- src/engine/fileOps/s3m.cpp | 78 ++++++++++++++++++---------- src/gui/gui.cpp | 4 +- src/gui/gui.h | 2 + src/gui/settings.cpp | 12 +++++ 6 files changed, 72 insertions(+), 32 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index f010d7001..4364adf13 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -597,7 +597,7 @@ class DivEngine { bool loadDMF(unsigned char* file, size_t len); bool loadFur(unsigned char* file, size_t len, int variantID=0); bool loadMod(unsigned char* file, size_t len); - bool loadS3M(unsigned char* file, size_t len); + bool loadS3M(unsigned char* file, size_t len, bool opl2=false); bool loadXM(unsigned char* file, size_t len); bool loadIT(unsigned char* file, size_t len); bool loadFTM(unsigned char* file, size_t len, bool dnft, bool dnftSig, bool eft); @@ -689,7 +689,7 @@ class DivEngine { void createNew(const char* description, String sysName, bool inBase64=true); void createNewFromDefaults(); // load a file. - bool load(unsigned char* f, size_t length, const char* nameHint=NULL); + bool load(unsigned char* f, size_t length, const char* nameHint=NULL, bool s3mOPL2=false); // play a binary command stream. bool playStream(unsigned char* f, size_t length); // get the playing stream. diff --git a/src/engine/fileOps/fileOpsCommon.cpp b/src/engine/fileOps/fileOpsCommon.cpp index 1a2f36319..78bf00b41 100644 --- a/src/engine/fileOps/fileOpsCommon.cpp +++ b/src/engine/fileOps/fileOpsCommon.cpp @@ -19,7 +19,7 @@ #include "fileOpsCommon.h" -bool DivEngine::load(unsigned char* f, size_t slen, const char* nameHint) { +bool DivEngine::load(unsigned char* f, size_t slen, const char* nameHint, bool s3mOPL2) { unsigned char* file; size_t len; if (slen<21) { @@ -158,7 +158,7 @@ bool DivEngine::load(unsigned char* f, size_t slen, const char* nameHint) { return loadIT(file,len); } else if (len>=48) { if (memcmp(&file[0x2c],DIV_S3M_MAGIC,4)==0) { - return loadS3M(file,len); + return loadS3M(file,len,s3mOPL2); } else if (memcmp(file,DIV_XM_MAGIC,17)==0) { return loadXM(file,len); } diff --git a/src/engine/fileOps/s3m.cpp b/src/engine/fileOps/s3m.cpp index ea8d2d58e..5974f2f11 100644 --- a/src/engine/fileOps/s3m.cpp +++ b/src/engine/fileOps/s3m.cpp @@ -48,7 +48,7 @@ static void readSbiOpData(sbi_t& sbi, SafeReader& reader) { sbi.FeedConnect = reader.readC(); } -bool DivEngine::loadS3M(unsigned char* file, size_t len) { +bool DivEngine::loadS3M(unsigned char* file, size_t len, bool opl2) { struct InvalidHeaderException {}; bool success=false; char magic[4]={0,0,0,0}; @@ -273,11 +273,16 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { bool hasPCM=false; bool hasFM=false; int numChans=0; + int realNumChans=0; - for (int i=0; i<32; i++) { - if (chanSettings[i]==255) continue; - if ((chanSettings[i]&127)>=32) continue; - if ((chanSettings[i]&127)>=16) { + for (int ch=0; ch<32; ch++) { + if (chanSettings[ch]!=255) realNumChans++; + } + + for (int ch=0; ch<32; ch++) { + if (chanSettings[ch]==255) continue; + if ((chanSettings[ch]&127)>=32) continue; + if ((chanSettings[ch]&127)>=16) { hasFM=true; } else { hasPCM=true; @@ -287,48 +292,69 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { if (hasFM && hasPCM) break; } - int pcmChan=hasFM?18:0; + int pcmChan=hasFM?(opl2 ? 9 : 18):0; int fmChan=hasPCM?32:0; int invalidChan=40; - for (int i=0; i<32; i++) { - if (chanSettings[i]==255) { - chanMap[i]=invalidChan++; + for (int ch=0; ch<32; ch++) { + if (chanSettings[ch]==255) { + chanMap[ch]=invalidChan++; continue; } - if ((chanSettings[i]&127)>=32) { - chanMap[i]=invalidChan++; + if ((chanSettings[ch]&127)>=32) { + chanMap[ch]=invalidChan++; continue; } - if ((chanSettings[i]&127)>=16) { - chanMap[i]=fmChan++; + if ((chanSettings[ch]&127)>=16) { + chanMap[ch]=fmChan++; } else { - chanMap[i]=pcmChan++; + chanMap[ch]=pcmChan++; } } + char buffer[40]; + int chanIndex = 1; + if (hasPCM) { - for (int i=pcmChan; i<32; i++) { - ds.subsong[0]->chanShow[i]=false; - ds.subsong[0]->chanShowChanOsc[i]=false; + for(int ch = 0; ch < pcmChan - (realNumChans - (hasFM ? 9 : 0)); ch++) + { + ds.subsong[0]->chanShow[ch]=false; + ds.subsong[0]->chanShowChanOsc[ch]=false; } - if (hasFM) { - for (int i=0; i<18; i++) { - ds.subsong[0]->chanShow[i]=false; - ds.subsong[0]->chanShowChanOsc[i]=false; + for (int ch=pcmChan; ch<32; ch++) { + ds.subsong[0]->chanShow[ch]=false; + ds.subsong[0]->chanShowChanOsc[ch]=false; + } + + for(int ch = 0; ch < 32; ch++) + { + if(ds.subsong[0]->chanShow[ch]) + { + snprintf(buffer, 40, _("Channel %d"), chanIndex); + ds.subsong[0]->chanName[ch] = buffer; + chanIndex++; } } } - if (hasFM) { - for (int i=(hasPCM?32:0) + 9; i<(hasPCM?32:0) + 18; i++) { - ds.subsong[0]->chanShow[i]=false; - ds.subsong[0]->chanShowChanOsc[i]=false; + if (hasFM && !opl2) { + for (int ch=(hasPCM?32:0) + 9; ch<(hasPCM?32:0) + 18; ch++) { + ds.subsong[0]->chanShow[ch]=false; + ds.subsong[0]->chanShowChanOsc[ch]=false; + } + + chanIndex = 1; + + for (int ch=(hasPCM?32:0); ch<(hasPCM?32:0) + 9; ch++) { + snprintf(buffer, 40, _("FM %d"), chanIndex); + ds.subsong[0]->chanName[ch] = buffer; + chanIndex++; } } logV("numChans: %d",numChans); + logV("realNumChans: %d",realNumChans); ds.systemName="PC"; if (hasPCM) { @@ -341,7 +367,7 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { ds.systemLen++; } if (hasFM) { - ds.system[ds.systemLen]=DIV_SYSTEM_OPL3; + ds.system[ds.systemLen]=opl2 ? DIV_SYSTEM_OPL2 : DIV_SYSTEM_OPL3; ds.systemVol[ds.systemLen]=1.0f; ds.systemPan[ds.systemLen]=0; ds.systemLen++; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 37443c46e..0ce0a69fa 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2417,7 +2417,7 @@ int FurnaceGUI::load(String path) { return 1; } fclose(f); - if (!e->load(file,(size_t)len,path.c_str())) { + if (!e->load(file,(size_t)len,path.c_str(),settings.OPL2s3mImport)) { lastError=e->getLastError(); logE("could not open file!"); return 1; @@ -4110,7 +4110,7 @@ bool FurnaceGUI::loop() { if (!tutorial.introPlayed || settings.alwaysPlayIntro==3 || (settings.alwaysPlayIntro==2 && curFileName.empty())) { unsigned char* introTemp=new unsigned char[intro_fur_len]; memcpy(introTemp,intro_fur,intro_fur_len); - e->load(introTemp,intro_fur_len); + e->load(introTemp,intro_fur_len,NULL,settings.OPL2s3mImport); } } diff --git a/src/gui/gui.h b/src/gui/gui.h index ae6dde1ef..b4b134be9 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1958,6 +1958,7 @@ class FurnaceGUI { unsigned int maxUndoSteps; float vibrationStrength; int vibrationLength; + bool OPL2s3mImport; String mainFontPath; String headFontPath; String patFontPath; @@ -2214,6 +2215,7 @@ class FurnaceGUI { maxUndoSteps(100), vibrationStrength(0.5f), vibrationLength(20), + OPL2s3mImport(false), mainFontPath(""), headFontPath(""), patFontPath(""), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 8241e9ab1..5a125d0f8 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -1254,6 +1254,14 @@ void FurnaceGUI::drawSettings() { } popDestColor(); + // SUBSECTION CONFIGURATION + CONFIG_SUBSECTION(_("Modules import")); + bool s3mOPL2B=settings.OPL2s3mImport; + if (ImGui::Checkbox(_("Use OPL2 instead of OPL3 for .s3m modules import"),&s3mOPL2B)) { + settings.OPL2s3mImport=s3mOPL2B; + settingsChanged=true; + } + END_SECTION; } CONFIG_SECTION(_("Audio")) { @@ -4746,6 +4754,8 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { settings.vibrationStrength=conf.getFloat("vibrationStrength",0.5f); settings.vibrationLength=conf.getInt("vibrationLength",20); + settings.OPL2s3mImport=conf.getInt("OPL2s3mImport",false); + settings.backupEnable=conf.getInt("backupEnable",1); settings.backupInterval=conf.getInt("backupInterval",30); settings.backupMaxCopies=conf.getInt("backupMaxCopies",5); @@ -5331,6 +5341,8 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("vibrationStrength",settings.vibrationStrength); conf.set("vibrationLength",settings.vibrationLength); + conf.set("OPL2s3mImport",settings.OPL2s3mImport); + conf.set("backupEnable",settings.backupEnable); conf.set("backupInterval",settings.backupInterval); conf.set("backupMaxCopies",settings.backupMaxCopies); From f5743da6e8cd4f0594d8ce4d5f587225f069b2f5 Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Thu, 15 Aug 2024 15:43:37 +0300 Subject: [PATCH 18/28] Update settings.cpp --- src/gui/settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 5a125d0f8..1847a2a26 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -4754,7 +4754,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { settings.vibrationStrength=conf.getFloat("vibrationStrength",0.5f); settings.vibrationLength=conf.getInt("vibrationLength",20); - settings.OPL2s3mImport=conf.getInt("OPL2s3mImport",false); + settings.OPL2s3mImport=conf.getBool("OPL2s3mImport",false); settings.backupEnable=conf.getInt("backupEnable",1); settings.backupInterval=conf.getInt("backupInterval",30); From 636a9921a2415f89a8b198b79348084e3bfb5773 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 17 Aug 2024 16:29:13 -0500 Subject: [PATCH 19/28] changes --- src/engine/engine.h | 4 ++-- src/engine/fileOps/fileOpsCommon.cpp | 4 ++-- src/engine/fileOps/s3m.cpp | 3 ++- src/gui/gui.cpp | 4 ++-- src/gui/gui.h | 4 ++-- src/gui/settings.cpp | 15 ++++++++------- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index 4364adf13..f010d7001 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -597,7 +597,7 @@ class DivEngine { bool loadDMF(unsigned char* file, size_t len); bool loadFur(unsigned char* file, size_t len, int variantID=0); bool loadMod(unsigned char* file, size_t len); - bool loadS3M(unsigned char* file, size_t len, bool opl2=false); + bool loadS3M(unsigned char* file, size_t len); bool loadXM(unsigned char* file, size_t len); bool loadIT(unsigned char* file, size_t len); bool loadFTM(unsigned char* file, size_t len, bool dnft, bool dnftSig, bool eft); @@ -689,7 +689,7 @@ class DivEngine { void createNew(const char* description, String sysName, bool inBase64=true); void createNewFromDefaults(); // load a file. - bool load(unsigned char* f, size_t length, const char* nameHint=NULL, bool s3mOPL2=false); + bool load(unsigned char* f, size_t length, const char* nameHint=NULL); // play a binary command stream. bool playStream(unsigned char* f, size_t length); // get the playing stream. diff --git a/src/engine/fileOps/fileOpsCommon.cpp b/src/engine/fileOps/fileOpsCommon.cpp index 78bf00b41..1a2f36319 100644 --- a/src/engine/fileOps/fileOpsCommon.cpp +++ b/src/engine/fileOps/fileOpsCommon.cpp @@ -19,7 +19,7 @@ #include "fileOpsCommon.h" -bool DivEngine::load(unsigned char* f, size_t slen, const char* nameHint, bool s3mOPL2) { +bool DivEngine::load(unsigned char* f, size_t slen, const char* nameHint) { unsigned char* file; size_t len; if (slen<21) { @@ -158,7 +158,7 @@ bool DivEngine::load(unsigned char* f, size_t slen, const char* nameHint, bool s return loadIT(file,len); } else if (len>=48) { if (memcmp(&file[0x2c],DIV_S3M_MAGIC,4)==0) { - return loadS3M(file,len,s3mOPL2); + return loadS3M(file,len); } else if (memcmp(file,DIV_XM_MAGIC,17)==0) { return loadXM(file,len); } diff --git a/src/engine/fileOps/s3m.cpp b/src/engine/fileOps/s3m.cpp index 5974f2f11..9e212d8d3 100644 --- a/src/engine/fileOps/s3m.cpp +++ b/src/engine/fileOps/s3m.cpp @@ -48,9 +48,10 @@ static void readSbiOpData(sbi_t& sbi, SafeReader& reader) { sbi.FeedConnect = reader.readC(); } -bool DivEngine::loadS3M(unsigned char* file, size_t len, bool opl2) { +bool DivEngine::loadS3M(unsigned char* file, size_t len) { struct InvalidHeaderException {}; bool success=false; + bool opl2=!getConfInt("s3mOPL3",0); char magic[4]={0,0,0,0}; SafeReader reader=SafeReader(file,len); warnings=""; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 0ce0a69fa..37443c46e 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2417,7 +2417,7 @@ int FurnaceGUI::load(String path) { return 1; } fclose(f); - if (!e->load(file,(size_t)len,path.c_str(),settings.OPL2s3mImport)) { + if (!e->load(file,(size_t)len,path.c_str())) { lastError=e->getLastError(); logE("could not open file!"); return 1; @@ -4110,7 +4110,7 @@ bool FurnaceGUI::loop() { if (!tutorial.introPlayed || settings.alwaysPlayIntro==3 || (settings.alwaysPlayIntro==2 && curFileName.empty())) { unsigned char* introTemp=new unsigned char[intro_fur_len]; memcpy(introTemp,intro_fur,intro_fur_len); - e->load(introTemp,intro_fur_len,NULL,settings.OPL2s3mImport); + e->load(introTemp,intro_fur_len); } } diff --git a/src/gui/gui.h b/src/gui/gui.h index b4b134be9..1619f831a 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1958,7 +1958,7 @@ class FurnaceGUI { unsigned int maxUndoSteps; float vibrationStrength; int vibrationLength; - bool OPL2s3mImport; + int s3mOPL3; String mainFontPath; String headFontPath; String patFontPath; @@ -2215,7 +2215,7 @@ class FurnaceGUI { maxUndoSteps(100), vibrationStrength(0.5f), vibrationLength(20), - OPL2s3mImport(false), + s3mOPL3(0), mainFontPath(""), headFontPath(""), patFontPath(""), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 1847a2a26..ae085f072 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -1254,11 +1254,11 @@ void FurnaceGUI::drawSettings() { } popDestColor(); - // SUBSECTION CONFIGURATION - CONFIG_SUBSECTION(_("Modules import")); - bool s3mOPL2B=settings.OPL2s3mImport; - if (ImGui::Checkbox(_("Use OPL2 instead of OPL3 for .s3m modules import"),&s3mOPL2B)) { - settings.OPL2s3mImport=s3mOPL2B; + // SUBSECTION IMPORT + CONFIG_SUBSECTION(_("Import")); + bool s3mOPL3B=settings.s3mOPL3; + if (ImGui::Checkbox(_("Use OPL3 instead of OPL2 for S3M import"),&s3mOPL3B)) { + settings.s3mOPL3=s3mOPL3B; settingsChanged=true; } @@ -4754,7 +4754,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { settings.vibrationStrength=conf.getFloat("vibrationStrength",0.5f); settings.vibrationLength=conf.getInt("vibrationLength",20); - settings.OPL2s3mImport=conf.getBool("OPL2s3mImport",false); + settings.s3mOPL3=conf.getInt("s3mOPL3",0); settings.backupEnable=conf.getInt("backupEnable",1); settings.backupInterval=conf.getInt("backupInterval",30); @@ -5268,6 +5268,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { clampSetting(settings.backupMaxCopies,1,100); clampSetting(settings.autoFillSave,0,1); clampSetting(settings.autoMacroStepSize,0,1); + clampSetting(settings.s3mOPL3,0,1); if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; @@ -5341,7 +5342,7 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("vibrationStrength",settings.vibrationStrength); conf.set("vibrationLength",settings.vibrationLength); - conf.set("OPL2s3mImport",settings.OPL2s3mImport); + conf.set("s3mOPL3",settings.s3mOPL3); conf.set("backupEnable",settings.backupEnable); conf.set("backupInterval",settings.backupInterval); From 3fce04e77bcada61d7a9a74fac6a1f34d6f6fe56 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 17 Aug 2024 16:56:11 -0500 Subject: [PATCH 20/28] GUI: getGain debug --- src/gui/debugWindow.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gui/debugWindow.cpp b/src/gui/debugWindow.cpp index 594554c57..b08c60532 100644 --- a/src/gui/debugWindow.cpp +++ b/src/gui/debugWindow.cpp @@ -36,6 +36,8 @@ static float oscDebugMax=1.0; static float oscDebugPower=1.0; static int oscDebugRepeat=1; static int numApples=1; +static int getGainChan=0; +static int getGainVol=0; static void _drawOsc(const ImDrawList* drawList, const ImDrawCmd* cmd) { if (cmd!=NULL) { @@ -721,6 +723,13 @@ void FurnaceGUI::drawDebug() { ImGui::TreePop(); } #endif + if (ImGui::TreeNode("Get Gain Test")) { + float realVol=e->getGain(getGainChan,getGainVol); + ImGui::InputInt("Chan",&getGainChan); + ImGui::InputInt("Vol",&getGainVol); + ImGui::Text("result: %.0f%%",realVol*100.0f); + ImGui::TreePop(); + } if (ImGui::TreeNode("User Interface")) { if (ImGui::Button("Inspect")) { inspectorOpen=!inspectorOpen; From 3f47979ea771107a6cb98cd1b3cd2b2e2010c192 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 17 Aug 2024 17:18:14 -0500 Subject: [PATCH 21/28] IT import: handle end of file when reading samples --- src/engine/fileOps/it.cpp | 102 ++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 48 deletions(-) diff --git a/src/engine/fileOps/it.cpp b/src/engine/fileOps/it.cpp index a3ed09c49..a729706d7 100644 --- a/src/engine/fileOps/it.cpp +++ b/src/engine/fileOps/it.cpp @@ -639,6 +639,8 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) { logD("seek not needed..."); } + logV("reading sample data (%d)",s->samples); + if (flags&8) { // compressed sample unsigned int ret=0; logV("decompression begin... (%d)",s->samples); @@ -672,62 +674,66 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) { } logV("got: %d",ret); } else { - if (s->depth==DIV_SAMPLE_DEPTH_16BIT) { - if (flags&4) { // downmix stereo - for (unsigned int i=0; isamples; i++) { - short l; - if (convert&2) { - l=reader.readS_BE(); - } else { - l=reader.readS(); + try { + if (s->depth==DIV_SAMPLE_DEPTH_16BIT) { + if (flags&4) { // downmix stereo + for (unsigned int i=0; isamples; i++) { + short l; + if (convert&2) { + l=reader.readS_BE(); + } else { + l=reader.readS(); + } + if (!(convert&1)) { + l^=0x8000; + } + s->data16[i]=l; } - if (!(convert&1)) { - l^=0x8000; + for (unsigned int i=0; isamples; i++) { + short r; + if (convert&2) { + r=reader.readS_BE(); + } else { + r=reader.readS(); + } + if (!(convert&1)) { + r^=0x8000; + } + s->data16[i]=(s->data16[i]+r)>>1; } - s->data16[i]=l; - } - for (unsigned int i=0; isamples; i++) { - short r; - if (convert&2) { - r=reader.readS_BE(); - } else { - r=reader.readS(); + } else { + for (unsigned int i=0; isamples; i++) { + if (convert&2) { + s->data16[i]=reader.readS_BE()^((convert&1)?0:0x8000); + } else { + s->data16[i]=reader.readS()^((convert&1)?0:0x8000); + } } - if (!(convert&1)) { - r^=0x8000; - } - s->data16[i]=(s->data16[i]+r)>>1; } } else { - for (unsigned int i=0; isamples; i++) { - if (convert&2) { - s->data16[i]=reader.readS_BE()^((convert&1)?0:0x8000); - } else { - s->data16[i]=reader.readS()^((convert&1)?0:0x8000); + if (flags&4) { // downmix stereo + for (unsigned int i=0; isamples; i++) { + signed char l=reader.readC(); + if (!(convert&1)) { + l^=0x80; + } + s->data8[i]=l; + } + for (unsigned int i=0; isamples; i++) { + signed char r=reader.readC(); + if (!(convert&1)) { + r^=0x80; + } + s->data8[i]=(s->data8[i]+r)>>1; + } + } else { + for (unsigned int i=0; isamples; i++) { + s->data8[i]=reader.readC()^((convert&1)?0:0x80); } } } - } else { - if (flags&4) { // downmix stereo - for (unsigned int i=0; isamples; i++) { - signed char l=reader.readC(); - if (!(convert&1)) { - l^=0x80; - } - s->data8[i]=l; - } - for (unsigned int i=0; isamples; i++) { - signed char r=reader.readC(); - if (!(convert&1)) { - r^=0x80; - } - s->data8[i]=(s->data8[i]+r)>>1; - } - } else { - for (unsigned int i=0; isamples; i++) { - s->data8[i]=reader.readC()^((convert&1)?0:0x80); - } - } + } catch (EndOfFileException& e) { + logW("premature end of file..."); } } From 5bfd389ae64806304b4f3f730c8a72171819acd5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 17 Aug 2024 18:24:04 -0500 Subject: [PATCH 22/28] GUI: new default value for S3M OPL3 --- src/gui/gui.h | 2 +- src/gui/settings.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/gui.h b/src/gui/gui.h index 0a3b9b013..59413e3e1 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2217,7 +2217,7 @@ class FurnaceGUI { maxUndoSteps(100), vibrationStrength(0.5f), vibrationLength(20), - s3mOPL3(0), + s3mOPL3(1), mainFontPath(""), headFontPath(""), patFontPath(""), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index ae085f072..16414eab0 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -4754,7 +4754,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { settings.vibrationStrength=conf.getFloat("vibrationStrength",0.5f); settings.vibrationLength=conf.getInt("vibrationLength",20); - settings.s3mOPL3=conf.getInt("s3mOPL3",0); + settings.s3mOPL3=conf.getInt("s3mOPL3",1); settings.backupEnable=conf.getInt("backupEnable",1); settings.backupInterval=conf.getInt("backupInterval",30); From aa4ccc3c3fa1be95ed7288244cc03323281925b3 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 17 Aug 2024 18:51:05 -0500 Subject: [PATCH 23/28] importExport/shared -> fileOpsCommon --- src/engine/fileOps/fileOpsCommon.h | 31 +++++++++++++++++ src/engine/fileOps/importExport.h | 45 ------------------------- src/engine/fileOps/p.cpp | 2 +- src/engine/fileOps/p86.cpp | 2 +- src/engine/fileOps/pdx.cpp | 2 +- src/engine/fileOps/ppc.cpp | 2 +- src/engine/fileOps/pps.cpp | 2 +- src/engine/fileOps/pvi.cpp | 2 +- src/engine/fileOps/pzi.cpp | 2 +- src/engine/fileOps/s3m.cpp | 15 --------- src/engine/fileOps/shared.h | 53 ------------------------------ 11 files changed, 38 insertions(+), 120 deletions(-) delete mode 100644 src/engine/fileOps/importExport.h delete mode 100644 src/engine/fileOps/shared.h diff --git a/src/engine/fileOps/fileOpsCommon.h b/src/engine/fileOps/fileOpsCommon.h index 306166c55..d3821bf3b 100644 --- a/src/engine/fileOps/fileOpsCommon.h +++ b/src/engine/fileOps/fileOpsCommon.h @@ -63,3 +63,34 @@ enum DivFurVariants: int { DIV_FUR_VARIANT_VANILLA=0, DIV_FUR_VARIANT_B=1, }; + +// MIDI-related +struct midibank_t { + String name; + uint8_t bankMsb, + bankLsb; +}; + +// Reused patch data structures + +// SBI and some other OPL containers + +struct sbi_t { + uint8_t Mcharacteristics, + Ccharacteristics, + Mscaling_output, + Cscaling_output, + Meg_AD, + Ceg_AD, + Meg_SR, + Ceg_SR, + Mwave, + Cwave, + FeedConnect; +}; + +//bool stringNotBlank(String& str); +// detune needs extra translation from register to furnace format +//uint8_t fmDtRegisterToFurnace(uint8_t&& dtNative); + +//void readSbiOpData(sbi_t& sbi, SafeReader& reader); diff --git a/src/engine/fileOps/importExport.h b/src/engine/fileOps/importExport.h deleted file mode 100644 index 5433c7445..000000000 --- a/src/engine/fileOps/importExport.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Furnace Tracker - multi-system chiptune tracker - * Copyright (C) 2021-2024 tildearrow and contributors - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#pragma once - -#include "../dataErrors.h" -#include "../engine.h" -#include "../../ta-log.h" -#include "../instrument.h" -#include "../song.h" -#include -#include - -#define DIV_READ_SIZE 131072 -#define DIV_DMF_MAGIC ".DelekDefleMask." -#define DIV_FUR_MAGIC "-Furnace module-" -#define DIV_FTM_MAGIC "FamiTracker Module" -#define DIV_DN_FTM_MAGIC "Dn-FamiTracker Module" -#define DIV_FC13_MAGIC "SMOD" -#define DIV_FC14_MAGIC "FC14" -#define DIV_S3M_MAGIC "SCRM" -#define DIV_XM_MAGIC "Extended Module: " -#define DIV_IT_MAGIC "IMPM" -#define DIV_TFM_MAGIC "TFMfmtV2" - -enum DivFurVariants: int { - DIV_FUR_VARIANT_VANILLA=0, - DIV_FUR_VARIANT_B=1, -}; diff --git a/src/engine/fileOps/p.cpp b/src/engine/fileOps/p.cpp index 09d8adad2..205f79462 100644 --- a/src/engine/fileOps/p.cpp +++ b/src/engine/fileOps/p.cpp @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "shared.h" +#include "fileOpsCommon.h" #ifdef HAVE_GUI #include "../gui/gui.h" diff --git a/src/engine/fileOps/p86.cpp b/src/engine/fileOps/p86.cpp index 840d65d28..8a26a0ea2 100644 --- a/src/engine/fileOps/p86.cpp +++ b/src/engine/fileOps/p86.cpp @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "shared.h" +#include "fileOpsCommon.h" #ifdef HAVE_GUI #include "../gui/gui.h" diff --git a/src/engine/fileOps/pdx.cpp b/src/engine/fileOps/pdx.cpp index fa57b2006..de34a49c5 100644 --- a/src/engine/fileOps/pdx.cpp +++ b/src/engine/fileOps/pdx.cpp @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "shared.h" +#include "fileOpsCommon.h" #ifdef HAVE_GUI #include "../gui/gui.h" diff --git a/src/engine/fileOps/ppc.cpp b/src/engine/fileOps/ppc.cpp index a5555abca..35dd18467 100644 --- a/src/engine/fileOps/ppc.cpp +++ b/src/engine/fileOps/ppc.cpp @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "shared.h" +#include "fileOpsCommon.h" #ifdef HAVE_GUI #include "../gui/gui.h" diff --git a/src/engine/fileOps/pps.cpp b/src/engine/fileOps/pps.cpp index e491302b6..f9592e07b 100644 --- a/src/engine/fileOps/pps.cpp +++ b/src/engine/fileOps/pps.cpp @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "shared.h" +#include "fileOpsCommon.h" #ifdef HAVE_GUI #include "../gui/gui.h" diff --git a/src/engine/fileOps/pvi.cpp b/src/engine/fileOps/pvi.cpp index 8352ebf9e..d03d61c21 100644 --- a/src/engine/fileOps/pvi.cpp +++ b/src/engine/fileOps/pvi.cpp @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "shared.h" +#include "fileOpsCommon.h" #ifdef HAVE_GUI #include "../gui/gui.h" diff --git a/src/engine/fileOps/pzi.cpp b/src/engine/fileOps/pzi.cpp index 69bf15d87..7463cd23a 100644 --- a/src/engine/fileOps/pzi.cpp +++ b/src/engine/fileOps/pzi.cpp @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "shared.h" +#include "fileOpsCommon.h" #ifdef HAVE_GUI #include "../gui/gui.h" diff --git a/src/engine/fileOps/s3m.cpp b/src/engine/fileOps/s3m.cpp index 9e212d8d3..11d0f4fb4 100644 --- a/src/engine/fileOps/s3m.cpp +++ b/src/engine/fileOps/s3m.cpp @@ -19,21 +19,6 @@ #include "fileOpsCommon.h" -// SBI and some other OPL containers -struct sbi_t { - uint8_t Mcharacteristics, - Ccharacteristics, - Mscaling_output, - Cscaling_output, - Meg_AD, - Ceg_AD, - Meg_SR, - Ceg_SR, - Mwave, - Cwave, - FeedConnect; -}; - static void readSbiOpData(sbi_t& sbi, SafeReader& reader) { sbi.Mcharacteristics = reader.readC(); sbi.Ccharacteristics = reader.readC(); diff --git a/src/engine/fileOps/shared.h b/src/engine/fileOps/shared.h deleted file mode 100644 index 6abb5ed85..000000000 --- a/src/engine/fileOps/shared.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Furnace Tracker - multi-system chiptune tracker - * Copyright (C) 2021-2024 tildearrow and contributors - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#pragma once - -#include "importExport.h" - -// MIDI-related -struct midibank_t { - String name; - uint8_t bankMsb, - bankLsb; -}; - -// Reused patch data structures - -// SBI and some other OPL containers - -struct sbi_t { - uint8_t Mcharacteristics, - Ccharacteristics, - Mscaling_output, - Cscaling_output, - Meg_AD, - Ceg_AD, - Meg_SR, - Ceg_SR, - Mwave, - Cwave, - FeedConnect; -}; - -bool stringNotBlank(String& str); -// detune needs extra translation from register to furnace format -uint8_t fmDtRegisterToFurnace(uint8_t&& dtNative); - -void readSbiOpData(sbi_t& sbi, SafeReader& reader); \ No newline at end of file From 7974b9627514f048ebd6c25cfb8d0f796a7122a5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 18 Aug 2024 02:30:30 -0500 Subject: [PATCH 24/28] fixes --- src/engine/fileOps/p.cpp | 5 ----- src/engine/fileOps/p86.cpp | 5 ----- src/engine/fileOps/pdx.cpp | 5 ----- src/engine/fileOps/ppc.cpp | 5 ----- src/engine/fileOps/pps.cpp | 5 ----- src/engine/fileOps/pvi.cpp | 5 ----- src/engine/fileOps/pzi.cpp | 5 ----- src/engine/fileOpsSample.cpp | 4 +--- 8 files changed, 1 insertion(+), 38 deletions(-) diff --git a/src/engine/fileOps/p.cpp b/src/engine/fileOps/p.cpp index 205f79462..9ba650c0e 100644 --- a/src/engine/fileOps/p.cpp +++ b/src/engine/fileOps/p.cpp @@ -19,11 +19,6 @@ #include "fileOpsCommon.h" -#ifdef HAVE_GUI -#include "../gui/gui.h" -extern FurnaceGUI g; -#endif - class DivEngine; //P VOX ADPCM sample bank diff --git a/src/engine/fileOps/p86.cpp b/src/engine/fileOps/p86.cpp index 8a26a0ea2..560867007 100644 --- a/src/engine/fileOps/p86.cpp +++ b/src/engine/fileOps/p86.cpp @@ -19,11 +19,6 @@ #include "fileOpsCommon.h" -#ifdef HAVE_GUI -#include "../gui/gui.h" -extern FurnaceGUI g; -#endif - class DivEngine; //P86 8-bit PCM sample bank diff --git a/src/engine/fileOps/pdx.cpp b/src/engine/fileOps/pdx.cpp index de34a49c5..cd03369a7 100644 --- a/src/engine/fileOps/pdx.cpp +++ b/src/engine/fileOps/pdx.cpp @@ -19,11 +19,6 @@ #include "fileOpsCommon.h" -#ifdef HAVE_GUI -#include "../gui/gui.h" -extern FurnaceGUI g; -#endif - class DivEngine; //PDX 8-bit OKI ADPCM sample bank diff --git a/src/engine/fileOps/ppc.cpp b/src/engine/fileOps/ppc.cpp index 35dd18467..3c5144dbd 100644 --- a/src/engine/fileOps/ppc.cpp +++ b/src/engine/fileOps/ppc.cpp @@ -19,11 +19,6 @@ #include "fileOpsCommon.h" -#ifdef HAVE_GUI -#include "../gui/gui.h" -extern FurnaceGUI g; -#endif - class DivEngine; //PPC PMD's YM2608 ADPCM-B sample bank diff --git a/src/engine/fileOps/pps.cpp b/src/engine/fileOps/pps.cpp index f9592e07b..39c573342 100644 --- a/src/engine/fileOps/pps.cpp +++ b/src/engine/fileOps/pps.cpp @@ -19,11 +19,6 @@ #include "fileOpsCommon.h" -#ifdef HAVE_GUI -#include "../gui/gui.h" -extern FurnaceGUI g; -#endif - class DivEngine; //PPS AY-3-8910 sample bank diff --git a/src/engine/fileOps/pvi.cpp b/src/engine/fileOps/pvi.cpp index d03d61c21..4181ea60d 100644 --- a/src/engine/fileOps/pvi.cpp +++ b/src/engine/fileOps/pvi.cpp @@ -19,11 +19,6 @@ #include "fileOpsCommon.h" -#ifdef HAVE_GUI -#include "../gui/gui.h" -extern FurnaceGUI g; -#endif - class DivEngine; //PVI YM2608 ADPCM-B sample bank diff --git a/src/engine/fileOps/pzi.cpp b/src/engine/fileOps/pzi.cpp index 7463cd23a..906e1f43b 100644 --- a/src/engine/fileOps/pzi.cpp +++ b/src/engine/fileOps/pzi.cpp @@ -19,11 +19,6 @@ #include "fileOpsCommon.h" -#ifdef HAVE_GUI -#include "../gui/gui.h" -extern FurnaceGUI g; -#endif - class DivEngine; //PZI 8-bit PCM sample bank diff --git a/src/engine/fileOpsSample.cpp b/src/engine/fileOpsSample.cpp index 560eb7870..5008392f8 100644 --- a/src/engine/fileOpsSample.cpp +++ b/src/engine/fileOpsSample.cpp @@ -24,8 +24,6 @@ #include "sfWrapper.h" #endif -#define _LE(string) (string) - std::vector DivEngine::sampleFromFile(const char* path) { std::vector ret; @@ -113,7 +111,7 @@ std::vector DivEngine::sampleFromFile(const char* path) { buf=new unsigned char[len]; if (fread(buf,1,len,f)!=(size_t)len) { logW("did not read entire sample bank file buffer!"); - lastError=_LE("did not read entire sample bank file!"); + lastError=_("did not read entire sample bank file!"); delete[] buf; return ret; } From 77c7dd301f0e1e3bbfca1e02b829a1abd5f47db8 Mon Sep 17 00:00:00 2001 From: agajgjsa592586 Date: Sat, 17 Aug 2024 14:19:37 -0500 Subject: [PATCH 25/28] U.N. Owen Was Her? in Namco System 2 I remixed this just for fun... Credit to ZUN --- demos/arcade/U.N. Owen Was Her (NS2).fur | Bin 0 -> 220389 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 demos/arcade/U.N. Owen Was Her (NS2).fur diff --git a/demos/arcade/U.N. Owen Was Her (NS2).fur b/demos/arcade/U.N. Owen Was Her (NS2).fur new file mode 100644 index 0000000000000000000000000000000000000000..1d5d9e350144c67216a33cd5dae170e65924e8c5 GIT binary patch literal 220389 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�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

pA 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 literal 0 HcmV?d00001 From e7c39a0d6fb8513992028d9d98a70bab5bb0d904 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 18 Aug 2024 05:52:50 -0500 Subject: [PATCH 26/28] fix --- src/gui/gui.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index a70c4e008..95e8ffd36 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -6627,7 +6627,9 @@ bool FurnaceGUI::loop() { } ImGui::EndPopup(); } -centerNextWindow(_("Select Sample"),canvasW,canvasH); + + // TODO: fix style + centerNextWindow(_("Select Sample"),canvasW,canvasH); if (ImGui::BeginPopupModal(_("Select Sample"),NULL,ImGuiWindowFlags_AlwaysAutoResize)) { bool quitPlease=false; @@ -6673,6 +6675,7 @@ centerNextWindow(_("Select Sample"),canvasW,canvasH); } else { + // TODO:fixstyle from hereonwards ImGuiIO& io = ImGui::GetIO(); if(ImGui::Checkbox(id.c_str(),&pendingSamples[i].second) && io.KeyShift) { @@ -7830,7 +7833,7 @@ bool FurnaceGUI::init() { compatFormats+="*.pdx "; compatFormats+="*.pzi "; compatFormats+="*.p86 "; - compatFormats+="*.p "; + compatFormats+="*.p"; audioLoadFormats[1]=compatFormats; audioLoadFormats.push_back(_("NES DPCM data")); From ae1fa8d3b8425e5ab63d555e1d844e31c3adf36a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=B4=E3=82=A7=E3=83=AB=E3=83=A1=E3=83=B3=E3=82=B9?= =?UTF-8?q?=E3=82=A3=E3=83=B1?= <108448686+Velmyncier@users.noreply.github.com> Date: Sun, 18 Aug 2024 06:58:25 -0400 Subject: [PATCH 27/28] Add TeraDrive presets (#2086) * correct some preset errors * decapitalization * Add TeraDrive presets * Correct Sord M5 clock * Revert "Correct Sord M5 clock" This reverts commit 92d3e4a85efbbe6b61a3c47624cec7eaade8e6fe. * Correct formatting errors * Move PC speaker * I have no idea how I changed libsndfile. --- src/gui/presets.cpp | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index 87133ffc8..1ecb39204 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -1203,28 +1203,63 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") } ); + SUB_ENTRY( + "Sega TeraDrive", { + CH(DIV_SYSTEM_YM2612, 1.0f, 0, ""), + CH(DIV_SYSTEM_SMS, 0.5f, 0, ""), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_SUB_ENTRY( + "Sega TeraDrive (extended channel 3)", { + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, ""), + CH(DIV_SYSTEM_SMS, 0.5f, 0, ""), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_SUB_ENTRY( + "Sega TeraDrive (CSM)", { + CH(DIV_SYSTEM_YM2612_CSM, 1.0f, 0, ""), + CH(DIV_SYSTEM_SMS, 0.5f, 0, ""), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_SUB_ENTRY( + "Sega TeraDrive (DualPCM)", { + CH(DIV_SYSTEM_YM2612_DUALPCM, 1.0f, 0, ""), + CH(DIV_SYSTEM_SMS, 0.5f, 0, ""), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_SUB_ENTRY( + "Sega TeraDrive (DualPCM, extended channel 3)", { + CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 1.0f, 0, ""), + CH(DIV_SYSTEM_SMS, 0.5f, 0, ""), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); ENTRY( "Sharp X1", { CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3") - } + } ); SUB_ENTRY( "Sharp X1 + FM Addon", { CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3"), CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") - } + } ); ENTRY( "Sharp X68000", { CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), CH(DIV_SYSTEM_MSM6258, 1.0f, 0, "clockSel=2") - } + } ); ENTRY( "FM-7", { CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=12"), CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5") - } + } ); SUB_ENTRY( "FM-7 (extended channel 3)", { From 875ef08256eddc685744e3254d1f6213f77a8539 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 18 Aug 2024 20:22:24 +0900 Subject: [PATCH 28/28] Fix Y8950 ADPCM memory addressing Max supported size is 262144 bytes, so I fixed that. --- src/engine/platform/oplAInterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/platform/oplAInterface.cpp b/src/engine/platform/oplAInterface.cpp index 37ebda7f0..9643b80c0 100644 --- a/src/engine/platform/oplAInterface.cpp +++ b/src/engine/platform/oplAInterface.cpp @@ -27,7 +27,7 @@ uint8_t DivOPLAInterface::ymfm_external_read(ymfm::access_class type, uint32_t a if (adpcmBMem==NULL) { return 0; } - return adpcmBMem[address&0xffffff]; + return adpcmBMem[address&0x3ffff]; default: return 0; }