From 4d7c1c9e447684e5a275b8eae632cfedd85d09c9 Mon Sep 17 00:00:00 2001 From: freq-mod <32672779+freq-mod@users.noreply.github.com> Date: Mon, 6 Jun 2022 16:49:39 +0200 Subject: [PATCH 01/11] docs update (#519) * docs update mentions of fractal, new chips documentation, and other minor stuff * add a link to the Fractal repo as suggested by @breakthetargets * better wording, less typos --- papers/doc/7-systems/c64.md | 4 +++- papers/doc/7-systems/namco.md | 13 +++++++++++++ papers/doc/7-systems/oki.md | 9 +++++++++ papers/doc/7-systems/ricoh.md | 8 ++++++++ papers/doc/7-systems/ym2612.md | 4 +++- papers/doc/7-systems/ymz280b.md | 7 +++++++ papers/doc/7-systems/zxbeep.md | 10 ++++++++++ 7 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 papers/doc/7-systems/namco.md create mode 100644 papers/doc/7-systems/oki.md create mode 100644 papers/doc/7-systems/ricoh.md create mode 100644 papers/doc/7-systems/ymz280b.md create mode 100644 papers/doc/7-systems/zxbeep.md diff --git a/papers/doc/7-systems/c64.md b/papers/doc/7-systems/c64.md index 1029eda9..9b3e8701 100644 --- a/papers/doc/7-systems/c64.md +++ b/papers/doc/7-systems/c64.md @@ -1,9 +1,11 @@ # Commodore 64 -a home computer with a synthesizer-grade sound chip of which people took decades to master. +a home computer with a synthesizer-grade sound chip of which people took decades to master. Three oscillators with four selectable waveforms, ring modulation, oscillator sync, multimode filter, ADSR envelope... very popular in Europe and mostly due to the demoscene, which stretched the machine's limbs to no end. +Two revisions do exist - 6581 (original chip) and 8580 (improved version with working waveform mixing and somewhat more consistent filter curves) + # effects - `10xx`: change wave. the following values are accepted: diff --git a/papers/doc/7-systems/namco.md b/papers/doc/7-systems/namco.md new file mode 100644 index 00000000..a856d8fb --- /dev/null +++ b/papers/doc/7-systems/namco.md @@ -0,0 +1,13 @@ +# Namco WSG | Namco C15 | Namco C30 + +a family of wavetable synth sound chips used by Namco in their arcade machines (Pacman and later). Waveforms are 4-bit, with 32-byte sample length. + +Everything starts with Namco WSG, simple 3ch wavetable with no extra frills. C15 is much more advanced sound source with 8 channels. C30 adds stereo output and noise mode. + +# effects + +-`10xx`: change waveform +-`11xx`: toggle noise mode WARNING: only on C30 + + + diff --git a/papers/doc/7-systems/oki.md b/papers/doc/7-systems/oki.md new file mode 100644 index 00000000..4b46eb21 --- /dev/null +++ b/papers/doc/7-systems/oki.md @@ -0,0 +1,9 @@ +# OKI MSM6258 | OKI MSM6295 + +MSM6258 is a single-channel ADPCM sound source developed by OKI. It allows max sample rate of 15.6 kHz... with no variable pitch. Most prominent use of this chip was Sharp X68000 computer, where it was paired with Yamaha YM2151. + +MSM6295 is an upgrade from 6258 - it provides 4 ADPCM channels, at max 32 kHz (still no variable pitch though). Between late 80s and late 90s, it was one of the most common, if not THE most common soundchip used in arcade machines (Capcom, Toaplan, Kaneko, Atari, Tecmo, the list can go on and on...) + +# effects + +- `20xx`: set chip output rate diff --git a/papers/doc/7-systems/ricoh.md b/papers/doc/7-systems/ricoh.md new file mode 100644 index 00000000..6f5405f2 --- /dev/null +++ b/papers/doc/7-systems/ricoh.md @@ -0,0 +1,8 @@ +# Ricoh RF5C68 + +YM2612's sidekick - poor man's SPC-700. 8ch PCM sample-based synthesizer used in Sega Mega CD, Fujitsu FM Towns and some of Sega's arcade machines. Supports up to 64 Kbytes of external PCM data. + +# effects + +none so far. + diff --git a/papers/doc/7-systems/ym2612.md b/papers/doc/7-systems/ym2612.md index e86dde9d..6b221201 100644 --- a/papers/doc/7-systems/ym2612.md +++ b/papers/doc/7-systems/ym2612.md @@ -2,6 +2,8 @@ one of two chips that powered the Sega Genesis. It is a six-channel, four-operator FM synthesizer. Channel #6 can be turned into 8-bit PCM player. +For 0.6pre1, Furnace can now support advanced YM2612 features that [Fractal](https://gitlab.com/Natsumi/Fractal-Sound) sound driver adds: two software-mixed PCM channels (variable pitch, sample offsets, max 13.7 khz rate) and CSM - ch3 special mode feature that can be abused to produce rudimentary speech synthesis. + # effects - `10xy`: set LFO parameters. @@ -64,4 +66,4 @@ one of two chips that powered the Sega Genesis. It is a six-channel, four-operat - `5Cxx`: set D2R/SR of operator 1. - `5Dxx`: set D2R/SR of operator 2. - `5Exx`: set D2R/SR of operator 3. -- `5Fxx`: set D2R/SR of operator 4. \ No newline at end of file +- `5Fxx`: set D2R/SR of operator 4. diff --git a/papers/doc/7-systems/ymz280b.md b/papers/doc/7-systems/ymz280b.md new file mode 100644 index 00000000..097fa6a4 --- /dev/null +++ b/papers/doc/7-systems/ymz280b.md @@ -0,0 +1,7 @@ +# Yamaha YMZ280B (PCMD8) + +8ch PCM/ADPCM sample-based synthesizer designed for use with arcade machines. Lived throughout mid to late 90s. It has 16-level stereo panning, up to 16-bit PCM and up to 16Mbytes of external PCM data. + +# effects + +none so far. diff --git a/papers/doc/7-systems/zxbeep.md b/papers/doc/7-systems/zxbeep.md new file mode 100644 index 00000000..1c6cd74f --- /dev/null +++ b/papers/doc/7-systems/zxbeep.md @@ -0,0 +1,10 @@ +# ZX Spectrum Speaker + +Rather than having a dedicated sound synthesizer, early ZX Spectrum models had one piezo beeper, controlled by Z80 CPU and ULA chip. It's capabilities should be on par with an IBM PC speaker... right? + +Not really - very soon talented programmers found out ways to output much more than one square wave channel. A lot of ZX beeper routines do exist, as of 0.6pre1 Furnace supports only one - Follin-like engine with 6 channels of narrow pulse wave and click drums. + +# effects + +- `12xx`: set pulse width +- `17xx`: trigger overlay drums. From 98f31877de839aa11fd5cae82f2667dcaf58f780 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 6 Jun 2022 13:15:41 -0500 Subject: [PATCH 02/11] GUI: remove chan osc debug info --- src/gui/chanOsc.cpp | 4 ++-- src/gui/findReplace.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/chanOsc.cpp b/src/gui/chanOsc.cpp index fd9e2e10..5bd945f1 100644 --- a/src/gui/chanOsc.cpp +++ b/src/gui/chanOsc.cpp @@ -190,8 +190,8 @@ void FurnaceGUI::drawChanOsc() { needlePos-=alignment; */ - String cPhase=fmt::sprintf("%d cphase: %f",point,phase); - dl->AddText(inRect.Min,0xffffffff,cPhase.c_str()); + //String cPhase=fmt::sprintf("%d cphase: %f",point,phase); + //dl->AddText(inRect.Min,0xffffffff,cPhase.c_str()); needlePos-=displaySize; for (unsigned short i=0; i<512; i++) { diff --git a/src/gui/findReplace.cpp b/src/gui/findReplace.cpp index 3a5ec75f..addc1a02 100644 --- a/src/gui/findReplace.cpp +++ b/src/gui/findReplace.cpp @@ -12,7 +12,7 @@ void FurnaceGUI::drawFindReplace() { if (!findOpen) return; ImGui::SetNextWindowSizeConstraints(ImVec2(64.0f*dpiScale,32.0f*dpiScale),ImVec2(scrW*dpiScale,scrH*dpiScale)); if (ImGui::Begin("Find/Replace",&findOpen,globalWinFlags)) { - ImGui::Text("What am I gonna do with you?"); + } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_FIND; ImGui::End(); From 6dc408d99c327df3d39a1ef7ff84bbc2760ae8dd Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 6 Jun 2022 15:05:08 -0500 Subject: [PATCH 03/11] SAA1099: remove MAME core closes #529 the MAME core is inaccurate. it doesn't emulate envelope too well. --- src/engine/dispatchContainer.cpp | 3 -- src/engine/platform/saa.cpp | 69 ++++---------------------------- src/engine/platform/saa.h | 12 ------ src/gui/gui.h | 2 - src/gui/settings.cpp | 12 ------ 5 files changed, 7 insertions(+), 91 deletions(-) diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index a23e4e8f..227f6067 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -312,10 +312,7 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do dispatch=new DivPlatformTX81Z; break; case DIV_SYSTEM_SAA1099: { - int saaCore=eng->getConfInt("saaCore",1); - if (saaCore<0 || saaCore>2) saaCore=0; dispatch=new DivPlatformSAA1099; - ((DivPlatformSAA1099*)dispatch)->setCore((DivSAACores)saaCore); break; } case DIV_SYSTEM_PCSPKR: diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index dc9a13e8..c562838a 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -71,28 +71,6 @@ const char* DivPlatformSAA1099::getEffectName(unsigned char effect) { return NULL; } -void DivPlatformSAA1099::acquire_mame(short* bufL, short* bufR, size_t start, size_t len) { - if (saaBufLenClear(); - break; - case DIV_SAA_CORE_E: - break; - } + saa_saaSound->Clear(); for (int i=0; i<6; i++) { chan[i]=DivPlatformSAA1099::Channel(); chan[i].std.setEngine(parent); @@ -500,16 +459,8 @@ void DivPlatformSAA1099::setFlags(unsigned int flags) { oscBuf[i]->rate=rate; } - switch (core) { - case DIV_SAA_CORE_MAME: - break; - case DIV_SAA_CORE_SAASOUND: - saa_saaSound->SetClockRate(chipClock); - saa_saaSound->SetSampleRate(rate); - break; - case DIV_SAA_CORE_E: - break; - } + saa_saaSound->SetClockRate(chipClock); + saa_saaSound->SetSampleRate(rate); } void DivPlatformSAA1099::poke(unsigned int addr, unsigned short val) { @@ -520,10 +471,6 @@ void DivPlatformSAA1099::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -void DivPlatformSAA1099::setCore(DivSAACores c) { - core=c; -} - int DivPlatformSAA1099::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { parent=p; dumpWrites=false; @@ -533,11 +480,9 @@ int DivPlatformSAA1099::init(DivEngine* p, int channels, int sugRate, unsigned i isMuted[i]=false; oscBuf[i]=new DivDispatchOscBuffer; } - if (core==DIV_SAA_CORE_SAASOUND) { - saa_saaSound=CreateCSAASound(); - saa_saaSound->SetOversample(1); - saa_saaSound->SetSoundParameters(SAAP_NOFILTER|SAAP_16BIT|SAAP_STEREO); - } + saa_saaSound=CreateCSAASound(); + saa_saaSound->SetOversample(1); + saa_saaSound->SetSoundParameters(SAAP_NOFILTER|SAAP_16BIT|SAAP_STEREO); setFlags(flags); saaBufLen=65536; for (int i=0; i<2; i++) saaBuf[i]=new short[saaBufLen]; diff --git a/src/engine/platform/saa.h b/src/engine/platform/saa.h index fafb36d7..0efd498d 100644 --- a/src/engine/platform/saa.h +++ b/src/engine/platform/saa.h @@ -22,15 +22,8 @@ #include "../dispatch.h" #include "../macroInt.h" #include -#include "sound/saa1099.h" #include "../../../extern/SAASound/src/SAASound.h" -enum DivSAACores { - DIV_SAA_CORE_MAME=0, - DIV_SAA_CORE_SAASOUND, - DIV_SAA_CORE_E -}; - class DivPlatformSAA1099: public DivDispatch { protected: struct Channel { @@ -58,8 +51,6 @@ class DivPlatformSAA1099: public DivDispatch { QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} }; std::queue writes; - DivSAACores core; - saa1099_device saa; CSAASound* saa_saaSound; unsigned char regPool[32]; unsigned char lastBusy; @@ -83,9 +74,7 @@ class DivPlatformSAA1099: public DivDispatch { unsigned char saaNoise[2]; friend void putDispatchChan(void*,int,int); - void acquire_e(short* bufL, short* bufR, size_t start, size_t len); void acquire_saaSound(short* bufL, short* bufR, size_t start, size_t len); - void acquire_mame(short* bufL, short* bufR, size_t start, size_t len); public: void acquire(short* bufL, short* bufR, size_t start, size_t len); @@ -99,7 +88,6 @@ class DivPlatformSAA1099: public DivDispatch { void forceIns(); void tick(bool sysTick=true); void muteChannel(int ch, bool mute); - void setCore(DivSAACores core); void setFlags(unsigned int flags); bool isStereo(); int getPortaFloor(int ch); diff --git a/src/gui/gui.h b/src/gui/gui.h index a1ff2b3d..ab34af1e 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -873,7 +873,6 @@ class FurnaceGUI { int arcadeCore; int ym2612Core; int snCore; - int saaCore; int nesCore; int fdsCore; int pcSpeakerOutMethod; @@ -974,7 +973,6 @@ class FurnaceGUI { arcadeCore(0), ym2612Core(0), snCore(0), - saaCore(1), nesCore(0), fdsCore(0), pcSpeakerOutMethod(0), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index eef892ab..84f33db5 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -84,11 +84,6 @@ const char* snCores[]={ "Nuked-PSG Mod" }; -const char* saaCores[]={ - "MAME", - "SAASound" -}; - const char* nesCores[]={ "puNES", "NSFplay" @@ -899,10 +894,6 @@ void FurnaceGUI::drawSettings() { ImGui::SameLine(); ImGui::Combo("##SNCore",&settings.snCore,snCores,2); - ImGui::Text("SAA1099 core"); - ImGui::SameLine(); - ImGui::Combo("##SAACore",&settings.saaCore,saaCores,2); - ImGui::Text("NES core"); ImGui::SameLine(); ImGui::Combo("##NESCore",&settings.nesCore,nesCores,2); @@ -1954,7 +1945,6 @@ void FurnaceGUI::syncSettings() { settings.arcadeCore=e->getConfInt("arcadeCore",0); settings.ym2612Core=e->getConfInt("ym2612Core",0); settings.snCore=e->getConfInt("snCore",0); - settings.saaCore=e->getConfInt("saaCore",1); settings.nesCore=e->getConfInt("nesCore",0); settings.fdsCore=e->getConfInt("fdsCore",0); settings.pcSpeakerOutMethod=e->getConfInt("pcSpeakerOutMethod",0); @@ -2048,7 +2038,6 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.arcadeCore,0,1); clampSetting(settings.ym2612Core,0,1); clampSetting(settings.snCore,0,1); - clampSetting(settings.saaCore,0,1); clampSetting(settings.nesCore,0,1); clampSetting(settings.fdsCore,0,1); clampSetting(settings.pcSpeakerOutMethod,0,4); @@ -2171,7 +2160,6 @@ void FurnaceGUI::commitSettings() { e->setConf("arcadeCore",settings.arcadeCore); e->setConf("ym2612Core",settings.ym2612Core); e->setConf("snCore",settings.snCore); - e->setConf("saaCore",settings.saaCore); e->setConf("nesCore",settings.nesCore); e->setConf("fdsCore",settings.fdsCore); e->setConf("pcSpeakerOutMethod",settings.pcSpeakerOutMethod); From eac59604dfe7ae6d3d5cdfcaf24a2ac19812f450 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 6 Jun 2022 18:04:19 -0500 Subject: [PATCH 04/11] fix edit menu being too big --- src/gui/gui.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 20d3436b..8ddd5901 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1900,11 +1900,6 @@ void FurnaceGUI::editOptions(bool topMenu) { char id[4096]; editOptsVisible=true; - if (topMenu) { - ImGui::Text("..."); - ImGui::Separator(); - } - if (ImGui::MenuItem("cut",BIND_FOR(GUI_ACTION_PAT_CUT))) doCopy(true); if (ImGui::MenuItem("copy",BIND_FOR(GUI_ACTION_PAT_COPY))) doCopy(false); if (ImGui::MenuItem("paste",BIND_FOR(GUI_ACTION_PAT_PASTE))) doPaste(); @@ -2946,6 +2941,8 @@ bool FurnaceGUI::loop() { ImGui::EndMenu(); } if (ImGui::BeginMenu("edit")) { + ImGui::Text("..."); + ImGui::Separator(); if (ImGui::MenuItem("undo",BIND_FOR(GUI_ACTION_UNDO))) doUndo(); if (ImGui::MenuItem("redo",BIND_FOR(GUI_ACTION_REDO))) doRedo(); ImGui::Separator(); From 1b315266e1d4a305c565051240124b81cfde44f1 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 6 Jun 2022 18:04:27 -0500 Subject: [PATCH 05/11] update bruno_time.fur --- demos/bruno_time.fur | Bin 10311 -> 10806 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/demos/bruno_time.fur b/demos/bruno_time.fur index 6d5756d71fb618e53f13a14528e267f30dadc579..0ad2d841eae8b1a9efa9c8e1a7cd6cf684da8e8d 100644 GIT binary patch literal 10806 zcmV-6D#_J&ob7!HbX?V$=Brhu(o&La%bRSMWy`w>1egRm35JBlge^D(NWvo9a;#u1 z+Ll8zS^CbL)8|Z|>F(*7PG=_cbP@st2ur}w#;j&>3>e$s9q*eg%aUcSCCOUn`@ehN zt5=d9xTebkoIx*=N>%T>|Nh_q|L?<@d)2BH%gYy4#P6+IylPp++(njU#jWJm{2Q*i zkuSnwpJiQh#XKuwMGE|Q!)F!X=YO(3{wqH3*x1b)<3MYtl$2`vYvgwvflieWo`Rw%R2U-Evx-+EGzW4mR0T)nty;dgdPVu7dn#7MS5__mQM7bv`LbnIrSXLi z#4o??+jHVeD$1)@tpK&kv1rty;D?zOW)be^JG~ z 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 AApigX literal 10311 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 Wcqf?5?;VV*_9oF7eBq57)Bgjlz_}{` From 21042a45db9de9aefeb44a85bcb977c9f4bbb0b3 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 6 Jun 2022 18:15:35 -0500 Subject: [PATCH 06/11] add instruments section --- instruments/FM/default.fui | Bin 0 -> 1668 bytes instruments/OPL/key.fui | Bin 0 -> 1664 bytes instruments/OPLL/Weeppiko-piano_guitar_idk.fui | Bin 0 -> 1641 bytes instruments/README.md | 17 +++++++++++++++++ instruments/other/compatibility.fui | Bin 0 -> 1802 bytes 5 files changed, 17 insertions(+) create mode 100644 instruments/FM/default.fui create mode 100644 instruments/OPL/key.fui create mode 100644 instruments/OPLL/Weeppiko-piano_guitar_idk.fui create mode 100644 instruments/README.md create mode 100644 instruments/other/compatibility.fui diff --git a/instruments/FM/default.fui b/instruments/FM/default.fui new file mode 100644 index 0000000000000000000000000000000000000000..6b8360d4bdd5dcbcec5ca637f8b4a243b37f6944 GIT binary patch literal 1668 zcmdOOD=o@POioqE%quP_($h_5U|>)HVi@rB3l0IXlNlHpQc}|rOLIyX7+4q>m_UN^ z9IVXzS_}-VAPyEF&%(&aZGcCfi;;z22#ZFjkUS?NCqLLGtZMifm>hu4VqoBaVjzVC z)HVi@rB3l0IXlNtCJvQsM=7}yyYm_P#jOw8>3 zVhjwdAPxf~m_#P{nHhPwfdUYDWEluso{N!%UkFniCL+(t$jJ}32_}L<^D{6xfNkXf z3WG2zkVoa>=lv%Du<1tEf*AnVbYT}mH;WJ-VhVXS5;7ZIek9n1?&smo$DRriqLlg{ zVG@4Us6D75fCw!Iwgqer%nTrD1_fq>I1U!7F{JZw7)zuu-hzmqA6QiYF)jcAlI|^r literal 0 HcmV?d00001 diff --git a/instruments/OPLL/Weeppiko-piano_guitar_idk.fui b/instruments/OPLL/Weeppiko-piano_guitar_idk.fui new file mode 100644 index 0000000000000000000000000000000000000000..1db0556cdc045aa9dc6864d0de6cffb6fc65244e GIT binary patch literal 1641 zcmdOOD=o@POioqE%quP_($kG%U|>)HVi@rB3l0IXqZoJ@3NjP(^7Ye8GfNVS7#P?Y z8JIva{H(0Z%o+>~tPC6=E(0T&L=gOpjBMOME=(RF17XQ?F|zOrp^GB;@|=vE{9v09 zVn{501||ovogmvGEVzqAl$?V2s6bTgT4&Ys(!OXw_c*eL>>@izAL$`o zB$d!cwvaRq91)mEs-8;x1mu$6$s@%Wjo?)lq&-S_Zr|GN04{?AjN jKsguu7ua+A%z$JFXqBl^5A(dIj;>Rci-_amCO*OyAOJFF literal 0 HcmV?d00001 From 575c9708135723156774445be8d3f4e86911116b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 6 Jun 2022 18:17:11 -0500 Subject: [PATCH 07/11] update instrument submission guidelines --- instruments/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/instruments/README.md b/instruments/README.md index 191dba83..fdfae2f3 100644 --- a/instruments/README.md +++ b/instruments/README.md @@ -10,8 +10,9 @@ these are organized in the following categories: # submit instruments -you may submit your own instruments by creating a pull request or contacting me! +you may submit your own instruments by creating a pull request or contacting me! the only guidelines are: -the only guideline is that I (strongly) prefer original instruments. +- any format Furnace is able to load is accepted. +- I (strongly) prefer original instruments. thanks for your contribution! From 507ad335b168f232c06e887491fbc28ffbe815a3 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 6 Jun 2022 18:18:45 -0500 Subject: [PATCH 08/11] add instruments to make install --- .github/workflows/build.yml | 2 +- CMakeLists.txt | 1 + scripts/release-win32.sh | 3 ++- scripts/release-win64.sh | 3 ++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8fd08833..9d130246 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -243,7 +243,7 @@ jobs: cp -v ../LICENSE LICENSE.txt cp -v ../README.md README.txt - cp -vr ../{papers,demos} ../${binPath}/furnace.exe ./ + cp -vr ../{papers,demos,instruments} ../${binPath}/furnace.exe ./ popd diff --git a/CMakeLists.txt b/CMakeLists.txt index fe6a12fe..d8491b45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -633,6 +633,7 @@ if (NOT ANDROID OR TERMUX) install(DIRECTORY papers DESTINATION ${CMAKE_INSTALL_DOCDIR}) install(FILES LICENSE DESTINATION ${CMAKE_INSTALL_DATADIR}/licenses/furnace) install(DIRECTORY demos DESTINATION ${CMAKE_INSTALL_DATADIR}/furnace) + install(DIRECTORY instruments DESTINATION ${CMAKE_INSTALL_DATADIR}/furnace) foreach(num 16 32 64 128 256 512) set(res ${num}x${num}) install(FILES res/icon.iconset/icon_${res}.png RENAME furnace.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/${res}/apps) diff --git a/scripts/release-win32.sh b/scripts/release-win32.sh index 2257a595..7b3c76d7 100755 --- a/scripts/release-win32.sh +++ b/scripts/release-win32.sh @@ -29,8 +29,9 @@ cp ../../win32build/furnace.exe . || exit 1 cp ../../README.md README.txt || exit 1 cp -r ../../papers papers || exit 1 cp -r ../../demos demos || exit 1 +cp -r ../../instruments instruments || exit 1 -zip -r furnace.zip LICENSE.txt furnace.exe README.txt papers demos +zip -r furnace.zip LICENSE.txt furnace.exe README.txt papers demos instruments furName=$(git describe --tags | sed "s/v0/0/") diff --git a/scripts/release-win64.sh b/scripts/release-win64.sh index db580e09..75a07f51 100755 --- a/scripts/release-win64.sh +++ b/scripts/release-win64.sh @@ -29,8 +29,9 @@ cp ../../winbuild/furnace.exe . || exit 1 cp ../../README.md README.txt || exit 1 cp -r ../../papers papers || exit 1 cp -r ../../demos demos || exit 1 +cp -r ../../instruments instruments || exit 1 -zip -r furnace.zip LICENSE.txt furnace.exe README.txt papers demos +zip -r furnace.zip LICENSE.txt furnace.exe README.txt papers demos instruments furName=$(git describe --tags | sed "s/v0/0/") From a30091675335b7ff639817dcb3d29afbbe1a47b8 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 6 Jun 2022 23:46:15 -0500 Subject: [PATCH 09/11] GUI: fix effect val cell spacing not beinghPlease enter the commit message for your changes. Lines starting --- src/gui/settings.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 84f33db5..ea1d9274 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -2025,6 +2025,7 @@ void FurnaceGUI::syncSettings() { settings.insCellSpacing=e->getConfInt("insCellSpacing",0); settings.volCellSpacing=e->getConfInt("volCellSpacing",0); settings.effectCellSpacing=e->getConfInt("effectCellSpacing",0); + settings.effectValCellSpacing=e->getConfInt("effectValCellSpacing",0); settings.doubleClickColumn=e->getConfInt("doubleClickColumn",1); settings.blankIns=e->getConfInt("blankIns",0); From aa09ffeedda51919d732a53d3d93274024415f21 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 7 Jun 2022 13:49:12 -0500 Subject: [PATCH 10/11] GUI: find and replace, part 1 it does not work yet --- src/gui/findReplace.cpp | 65 ++++++++++++++++++++++++++++++++++++++++- src/gui/gui.cpp | 2 ++ src/gui/gui.h | 46 +++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 1 deletion(-) diff --git a/src/gui/findReplace.cpp b/src/gui/findReplace.cpp index addc1a02..1d83ab4e 100644 --- a/src/gui/findReplace.cpp +++ b/src/gui/findReplace.cpp @@ -3,6 +3,16 @@ #include "IconsFontAwesome4.h" #include "misc/cpp/imgui_stdlib.h" +const char* queryModes[GUI_QUERY_MAX]={ + "ignore", + "equals", + "not equal", + "between", + "not between", + "any", + "none" +}; + void FurnaceGUI::drawFindReplace() { if (nextWindow==GUI_WINDOW_FIND) { findOpen=true; @@ -12,7 +22,60 @@ void FurnaceGUI::drawFindReplace() { if (!findOpen) return; ImGui::SetNextWindowSizeConstraints(ImVec2(64.0f*dpiScale,32.0f*dpiScale),ImVec2(scrW*dpiScale,scrH*dpiScale)); if (ImGui::Begin("Find/Replace",&findOpen,globalWinFlags)) { - + if (curQuery.empty()) { + curQuery.push_back(FurnaceGUIFindQuery()); + } + ImGui::Text("Find"); + for (FurnaceGUIFindQuery& i: curQuery) { + if (ImGui::BeginTable("FindRep",4,ImGuiTableFlags_BordersOuter)) { + ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch,0.5); + ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthStretch,0.25); + ImGui::TableSetupColumn("c3",ImGuiTableColumnFlags_WidthStretch,0.25); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("Note"); + ImGui::TableNextColumn(); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + ImGui::Combo("##NCondition",&i.noteMode,queryModes,GUI_QUERY_MAX); + + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("Ins"); + ImGui::TableNextColumn(); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + ImGui::Combo("##ICondition",&i.noteMode,queryModes,GUI_QUERY_MAX); + + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("Volume"); + ImGui::TableNextColumn(); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + ImGui::Combo("##VCondition",&i.noteMode,queryModes,GUI_QUERY_MAX); + + for (int j=0; jgetConfBool("logOpen",false); effectListOpen=e->getConfBool("effectListOpen",false); subSongsOpen=e->getConfBool("subSongsOpen",true); + findOpen=e->getConfBool("findOpen",false); tempoView=e->getConfBool("tempoView",true); waveHex=e->getConfBool("waveHex",false); @@ -4253,6 +4254,7 @@ bool FurnaceGUI::finish() { e->setConf("logOpen",logOpen); e->setConf("effectListOpen",effectListOpen); e->setConf("subSongsOpen",subSongsOpen); + e->setConf("findOpen",findOpen); // commit last window size e->setConf("lastWindowWidth",scrW); diff --git a/src/gui/gui.h b/src/gui/gui.h index ab34af1e..23eb9e1f 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -803,6 +803,50 @@ struct FurnaceGUIMacroDesc { } }; +enum FurnaceGUIFindQueryModes { + GUI_QUERY_IGNORE=0, + GUI_QUERY_MATCH, + GUI_QUERY_MATCH_NOT, + GUI_QUERY_RANGE, + GUI_QUERY_RANGE_NOT, + GUI_QUERY_ANY, + GUI_QUERY_NONE, + + GUI_QUERY_MAX +}; + +struct FurnaceGUIFindQuery { + int noteMode, insMode, volMode, effectCount; + int effectMode[8]; + int effectValMode[8]; + int note, noteMax; + unsigned char ins, insMax; + unsigned char vol, volMax; + unsigned char effect[8]; + unsigned char effectMax[8]; + unsigned char effectVal[8]; + unsigned char effectValMax[8]; + + FurnaceGUIFindQuery(): + noteMode(GUI_QUERY_IGNORE), + insMode(GUI_QUERY_IGNORE), + volMode(GUI_QUERY_IGNORE), + effectCount(0), + note(0), + noteMax(0), + ins(0), + insMax(0), + vol(0), + volMax(0) { + memset(effectMode,0,8*sizeof(int)); + memset(effectValMode,0,8*sizeof(int)); + memset(effect,0,8); + memset(effectMax,0,8); + memset(effectVal,0,8); + memset(effectValMax,0,8); + } +}; + class FurnaceGUI { DivEngine* e; @@ -1117,6 +1161,8 @@ class FurnaceGUI { std::vector pgProgram; int pgSys, pgAddr, pgVal; + std::vector curQuery; + struct ActiveNote { int chan; int note; From 95dd07742fcea3a17a6986566a6f428f7945a0e5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 7 Jun 2022 13:55:10 -0500 Subject: [PATCH 11/11] CI: only upload artifacts for master branch --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9d130246..7e060924 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -278,6 +278,7 @@ jobs: popd - name: Upload artifact + if: ${{ github.repository == 'tildearrow/furnace' && github.ref_name == 'master' }} uses: actions/upload-artifact@v3 with: name: ${{ steps.package-identify.outputs.id }}