From 598e8ddf03b0c609c1bf810d66cb62e34fb88e6a Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Jun 2023 17:45:43 -0500 Subject: [PATCH 01/13] don't handle a buffer of size 0 --- src/engine/playback.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 0021d93b..ce94b883 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -1691,6 +1691,10 @@ void DivEngine::runMidiTime(int totalCycles) { } void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsigned int size) { + if (!size) { + logW("nextBuf called with size 0!"); + return; + } lastLoopPos=-1; if (out!=NULL) { From ecfb0c7136f79c620c32b37de07a1f771cd440fb Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Jun 2023 18:06:55 -0500 Subject: [PATCH 02/13] GUI: sample editor warnings, part 2 --- src/gui/sampleEdit.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index 0ce5b918..f68fd7a8 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -249,6 +249,15 @@ void FurnaceGUI::drawSampleEdit() { default: break; } + if (e->song.system[i]!=DIV_SYSTEM_PCM_DAC) { + if (e->song.system[i]==DIV_SYSTEM_ES5506) { + if (sample->loopMode==DIV_SAMPLE_LOOP_BACKWARD) { + SAMPLE_WARN(warnLoopMode,"ES5506: backward loop mode isn't supported"); + } + } else if (sample->loopMode!=DIV_SAMPLE_LOOP_FORWARD) { + SAMPLE_WARN(warnLoopMode,"backward/ping-pong only supported in Generic PCM DAC\nping-pong also on ES5506"); + } + } // chips grid DivDispatch* dispatch=e->getDispatch(i); @@ -514,6 +523,9 @@ void FurnaceGUI::drawSampleEdit() { } ImGui::EndCombo(); } + if (ImGui::IsItemHovered() && !warnLoopMode.empty()) { + ImGui::SetTooltip("%s",warnLoopMode.c_str()); + } popWarningColor(); pushWarningColor(!warnLoopPos.empty()); From e0de6e084779deb74286ae1c1c0e420093ed9d61 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Jun 2023 18:09:46 -0500 Subject: [PATCH 03/13] update TODO.md --- TODO.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/TODO.md b/TODO.md index 4af99b6f..3df1e22b 100644 --- a/TODO.md +++ b/TODO.md @@ -7,10 +7,7 @@ - maybe reduced set of presets for the sake of simplicity - a more preferable highlight/drag system - some speed/intuitive workflow improvements that go a long way - - Had a hard time finding the docs on github and in Furnace's folder. - make .pdf manual out of doc/ - - you're going too slow; please run - break compatibility if it relieves complexity -- ins/wave/sample organization (folders and all) - multi-key binds - bug fixes From 7beb1271ae0efcde3f8dae16aa4698bdb5fb0a4e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Jun 2023 18:55:55 -0500 Subject: [PATCH 04/13] GUI: add option to disable preset selector --- TODO.md | 1 - src/gui/gui.cpp | 19 ++++++++++++++++++- src/gui/gui.h | 2 ++ src/gui/settings.cpp | 11 +++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index 3df1e22b..20c54eb9 100644 --- a/TODO.md +++ b/TODO.md @@ -3,7 +3,6 @@ - tutorial? - ease-of-use improvements... ideas: - preset compat flags - - setting to toggle the Choose a System screen on new project - maybe reduced set of presets for the sake of simplicity - a more preferable highlight/drag system - some speed/intuitive workflow improvements that go a long way diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 4edaeab2..eb8b9943 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -5076,7 +5076,24 @@ bool FurnaceGUI::loop() { newSongQuery=""; newSongFirstFrame=true; displayNew=false; - ImGui::OpenPopup("New Song"); + if (settings.newSongBehavior==1) { + e->createNewFromDefaults(); + undoHist.clear(); + redoHist.clear(); + curFileName=""; + modified=false; + curNibble=false; + orderNibble=false; + orderCursor=-1; + samplePos=0; + updateSampleTex=true; + selStart=SelectionPoint(); + selEnd=SelectionPoint(); + cursor=SelectionPoint(); + updateWindowTitle(); + } else { + ImGui::OpenPopup("New Song"); + } } if (displayEditString) { diff --git a/src/gui/gui.h b/src/gui/gui.h index 77199a6c..8eae6a53 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1508,6 +1508,7 @@ class FurnaceGUI { int renderClearPos; int insertBehavior; int pullDeleteRow; + int newSongBehavior; unsigned int maxUndoSteps; String mainFontPath; String patFontPath; @@ -1659,6 +1660,7 @@ class FurnaceGUI { renderClearPos(0), insertBehavior(1), pullDeleteRow(1), + newSongBehavior(0), maxUndoSteps(100), mainFontPath(""), patFontPath(""), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 33a6c5c6..3da60316 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -508,6 +508,14 @@ void FurnaceGUI::drawSettings() { settings.alwaysPlayIntro=3; } + ImGui::Text("When creating new song:"); + if (ImGui::RadioButton("Display system preset selector##NSB0",settings.newSongBehavior==0)) { + settings.newSongBehavior=0; + } + if (ImGui::RadioButton("Start with initial system##NSB1",settings.newSongBehavior==1)) { + settings.newSongBehavior=1; + } + ImGui::Separator(); if (CWSliderFloat("Double-click time (seconds)",&settings.doubleClickTime,0.02,1.0,"%.2f")) { @@ -2757,6 +2765,7 @@ void FurnaceGUI::syncSettings() { settings.renderClearPos=e->getConfInt("renderClearPos",0); settings.insertBehavior=e->getConfInt("insertBehavior",1); settings.pullDeleteRow=e->getConfInt("pullDeleteRow",1); + settings.newSongBehavior=e->getConfInt("newSongBehavior",0); clampSetting(settings.mainFontSize,2,96); clampSetting(settings.patFontSize,2,96); @@ -2882,6 +2891,7 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.renderClearPos,0,1); clampSetting(settings.insertBehavior,0,1); clampSetting(settings.pullDeleteRow,0,1); + clampSetting(settings.newSongBehavior,0,1); if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; @@ -3103,6 +3113,7 @@ void FurnaceGUI::commitSettings() { e->setConf("renderClearPos",settings.renderClearPos); e->setConf("insertBehavior",settings.insertBehavior); e->setConf("pullDeleteRow",settings.pullDeleteRow); + e->setConf("newSongBehavior",settings.newSongBehavior); // colors for (int i=0; i Date: Sun, 25 Jun 2023 04:57:04 -0500 Subject: [PATCH 05/13] MIDI output: don't spam logs on error --- src/audio/rtmidi.cpp | 6 ++++++ src/audio/rtmidi.h | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/audio/rtmidi.cpp b/src/audio/rtmidi.cpp index cbf4dca4..ea1903c3 100644 --- a/src/audio/rtmidi.cpp +++ b/src/audio/rtmidi.cpp @@ -160,6 +160,7 @@ bool TAMidiInRtMidi::quit() { bool TAMidiOutRtMidi::send(const TAMidiMessage& what) { if (!isOpen) return false; + if (!isWorking) return false; if (what.type<0x80) return false; size_t len=0; switch (what.type&0xf0) { @@ -190,6 +191,7 @@ bool TAMidiOutRtMidi::send(const TAMidiMessage& what) { port->sendMessage(what.sysExData.get(),len); } catch (RtMidiError& e) { logE("MIDI output error! %s",e.what()); + isWorking=false; return false; } return true; @@ -209,6 +211,7 @@ bool TAMidiOutRtMidi::send(const TAMidiMessage& what) { port->sendMessage((const unsigned char*)&what.type,len); } catch (RtMidiError& e) { logE("MIDI output error! %s",e.what()); + isWorking=false; return false; } return true; @@ -237,17 +240,20 @@ bool TAMidiOutRtMidi::openDevice(String name) { } isOpen=portOpen; if (!portOpen) logW("could not find MIDI out device..."); + isWorking=true; return portOpen; } catch (RtMidiError& e) { logW("could not open MIDI out device! %s",e.what()); return false; } + isWorking=true; return true; } bool TAMidiOutRtMidi::closeDevice() { if (port==NULL) return false; if (!isOpen) return false; + isWorking=false; try { port->closePort(); } catch (RtMidiError& e) { diff --git a/src/audio/rtmidi.h b/src/audio/rtmidi.h index 5a8e06e0..33a71af5 100644 --- a/src/audio/rtmidi.h +++ b/src/audio/rtmidi.h @@ -38,7 +38,7 @@ class TAMidiInRtMidi: public TAMidiIn { class TAMidiOutRtMidi: public TAMidiOut { RtMidiOut* port; - bool isOpen; + bool isOpen, isWorking; public: bool send(const TAMidiMessage& what); bool isDeviceOpen(); @@ -49,5 +49,6 @@ class TAMidiOutRtMidi: public TAMidiOut { bool init(); TAMidiOutRtMidi(): port(NULL), - isOpen(false) {} + isOpen(false), + isWorking(false) {} }; \ No newline at end of file From a5b4baf1b3f24d75efef919a8d97f9371aba0a02 Mon Sep 17 00:00:00 2001 From: brickblock369 <59150779+brickblock369@users.noreply.github.com> Date: Tue, 27 Jun 2023 17:25:10 +0900 Subject: [PATCH 06/13] Adding a power snare for OPM --- instruments/FM/drums/OPM Power Snare.fui | Bin 0 -> 101 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 instruments/FM/drums/OPM Power Snare.fui diff --git a/instruments/FM/drums/OPM Power Snare.fui b/instruments/FM/drums/OPM Power Snare.fui new file mode 100644 index 0000000000000000000000000000000000000000..58846582388a31779f43be37a651b94256138787 GIT binary patch literal 101 zcmZ?s^b4NHpvd6o$ionjU!Gc|5S*7-l*-`dtHSU_jGe()T%N(<7lVYApuB*CH3Ng8 xj4*@4PX+-)26^59PX-2GM@0q>21dsJ{}~Q4Fd8s0I530Qj0}v->`=z~{{Wl-7j6Im literal 0 HcmV?d00001 From 55fc4bd695f7b862b3ccf2c1573804a5ffbadca0 Mon Sep 17 00:00:00 2001 From: brickblock369 <59150779+brickblock369@users.noreply.github.com> Date: Thu, 29 Jun 2023 15:24:46 +0900 Subject: [PATCH 07/13] Adding AY drums --- instruments/other/AY Heavy Kick and Snare.fui | Bin 0 -> 155 bytes instruments/other/AY Heavy Kick.fui | Bin 0 -> 147 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 instruments/other/AY Heavy Kick and Snare.fui create mode 100644 instruments/other/AY Heavy Kick.fui diff --git a/instruments/other/AY Heavy Kick and Snare.fui b/instruments/other/AY Heavy Kick and Snare.fui new file mode 100644 index 0000000000000000000000000000000000000000..2bcb7d954979e8821f43257a0671c21e23d1fbbb GIT binary patch literal 155 zcmZ?s^b4NHz{cR`D9qrInpjq;;GLPAt)Q(CoR?UX%HZo*z`()4Aol-110w??KM3&g z@$&F+b8&L8v$3);GXaG;dH*vUWMI^1U~td{Vl5z62VxZ=>AeI4QDIjLzfS4p8 eC?qT*Dkjd%4dF8~FflTL0ptH*Uls-+kOu&R3>ZlO literal 0 HcmV?d00001 diff --git a/instruments/other/AY Heavy Kick.fui b/instruments/other/AY Heavy Kick.fui new file mode 100644 index 0000000000000000000000000000000000000000..3f3de6fca61d6cb004eb6a3177a3874309dea96f GIT binary patch literal 147 zcmZ?s^b4NHz{cR`$j#u9npjq;;GLPA&EV@;z`()4Aol-110w??KM3&g@$&F+b8&L8 zv$3);GXaG;dH*vUWMI^1U~td{Vl5z62VxZ=>AeI4QDIjLzfS4p8C;&2wmzf*F UXJlYtU;+ci|G~a2KpulU02UY(w*UYD literal 0 HcmV?d00001 From 379b19a102c4a54f728c2c728405f4d12b7276f8 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 29 Jun 2023 02:27:11 -0500 Subject: [PATCH 08/13] GUI: sample editor warnings, part 3 --- src/gui/sampleEdit.cpp | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index f68fd7a8..c88562c4 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -200,6 +200,9 @@ void FurnaceGUI::drawSampleEdit() { SAMPLE_WARN(warnLoopPos,"QSound: loop cannot be longer than 32767 samples"); } } + if (sample->samples>65535) { + SAMPLE_WARN(warnLength,"QSound: maximum sample length is 65535"); + } break; case DIV_SYSTEM_NES: if (sample->loop) { @@ -207,11 +210,17 @@ void FurnaceGUI::drawSampleEdit() { SAMPLE_WARN(warnLoopPos,"NES: loop point ignored on DPCM (may only loop entire sample)"); } } + if (sample->samples>32648) { + SAMPLE_WARN(warnLength,"NES: maximum DPCM sample length is 32648"); + } break; case DIV_SYSTEM_X1_010: if (sample->loop) { SAMPLE_WARN(warnLoop,"X1-010: samples can't loop"); } + if (sample->samples>131072) { + SAMPLE_WARN(warnLength,"X1-010: maximum sample length is 131072"); + } break; case DIV_SYSTEM_GA20: if (sample->loop) { @@ -235,9 +244,12 @@ void FurnaceGUI::drawSampleEdit() { if (sample->loop) { SAMPLE_WARN(warnLoop,"YM2610: ADPCM-A samples can't loop"); if (sample->loopStart!=0 || sample->loopEnd!=(int)(sample->samples)) { - SAMPLE_WARN(warnLoopPos,"YM2608: loop point ignored on ADPCM-B (may only loop entire sample)"); + SAMPLE_WARN(warnLoopPos,"YM2610: loop point ignored on ADPCM-B (may only loop entire sample)"); } } + if (sample->samples>2097152) { + SAMPLE_WARN(warnLength,"YM2610: maximum ADPCM-A sample length is 2097152"); + } break; case DIV_SYSTEM_AMIGA: if (sample->loop) { @@ -245,6 +257,15 @@ void FurnaceGUI::drawSampleEdit() { SAMPLE_WARN(warnLoopPos,"Amiga: loop must be a multiple of 2"); } } + if (sample->samples>131070) { + SAMPLE_WARN(warnLength,"Amiga: maximum sample length is 131070"); + } + break; + case DIV_SYSTEM_SEGAPCM: + case DIV_SYSTEM_SEGAPCM_COMPAT: + if (sample->samples>65280) { + SAMPLE_WARN(warnLength,"SegaPCM: maximum sample length is 65280"); + } break; default: break; @@ -1714,7 +1735,16 @@ void FurnaceGUI::drawSampleEdit() { ImGui::TableNextColumn(); ImGui::TextUnformatted(statusBar2.c_str()); ImGui::TableNextColumn(); - ImGui::TextUnformatted(statusBar3.c_str()); + if (!warnLength.empty()) { + ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_WARNING]); + ImGui::TextUnformatted(statusBar3.c_str()); + ImGui::PopStyleColor(); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("%s",warnLength.c_str()); + } + } else { + ImGui::TextUnformatted(statusBar3.c_str()); + } ImGui::EndTable(); } From bbcf4c34ed8fdc28348c116629563fc964af8ae8 Mon Sep 17 00:00:00 2001 From: Electric Keet Date: Thu, 29 Jun 2023 12:42:36 -0700 Subject: [PATCH 09/13] Making requested fixes. Fixed those dashes and that pesky semicolon. --- doc/1-intro/concepts.md | 2 +- doc/2-interface/song-info.md | 2 +- doc/4-instrument/README.md | 2 +- doc/7-systems/pce.md | 2 +- doc/7-systems/pcspkr.md | 2 +- doc/7-systems/pet.md | 2 +- doc/7-systems/ricoh.md | 2 +- doc/7-systems/x1-010.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/1-intro/concepts.md b/doc/1-intro/concepts.md index cee6e9ad..130e2ae8 100644 --- a/doc/1-intro/concepts.md +++ b/doc/1-intro/concepts.md @@ -32,5 +32,5 @@ The **order list** is a smaller spreadsheet showing the overall song structure. Different chips have different capabilities. Even within the same chip, each channel may have its own ways of making sound. - Some channels use one or more waveform **generators** (sine, square, noise...) to build up a sound. - Of special note are **[FM (frequency modulation)](../4-instrument/fm.md)** channels, which use a number of generators called **operators** that can interact to make very complex sounds. -- Some channels use **[samples](../6-sample/README.md)** – recordings of sounds, often with defined loop points to allow a note to sustain. +- Some channels use **[samples](../6-sample/README.md)** - recordings of sounds, often with defined loop points to allow a note to sustain. - Some channels use **[wavetables](../5-wave/README.md)**, which are like very short samples of fixed length that automatically loop. \ No newline at end of file diff --git a/doc/2-interface/song-info.md b/doc/2-interface/song-info.md index 5ba682a2..7919e7be 100644 --- a/doc/2-interface/song-info.md +++ b/doc/2-interface/song-info.md @@ -11,7 +11,7 @@ All of this metadata will be included in a VGM export. This isn't the case for a # subsongs -This window allows one to create **subsongs** – multiple individual songs within a single file. Each song has its own order list and patterns, but all songs within a file share the same chips, samples, and so forth. +This window allows one to create **subsongs** - multiple individual songs within a single file. Each song has its own order list and patterns, but all songs within a file share the same chips, samples, and so forth. - The drop-down box selects the current subsong. - The **`+`** button adds a new subsong. diff --git a/doc/4-instrument/README.md b/doc/4-instrument/README.md index 96ae8821..564f5aff 100644 --- a/doc/4-instrument/README.md +++ b/doc/4-instrument/README.md @@ -94,6 +94,6 @@ Finally, the sequence of values can be directly edited in the text box at the bo ![LFO macro editor](macro-LFO.png) - **Bottom** and **Top** determine the range of values generated by the macro. (Bottom can be larger than Top to invert the waveform!) -- **Speed** is how quickly the values change – the frequency of the oscillator. +- **Speed** is how quickly the values change - the frequency of the oscillator. - **Phase** is which part of the waveform the macro will start at, measured in 1/1024 increments. - **Shape** is the waveform used. Triangle is the default, and Saw and Square are exactly as they say. diff --git a/doc/7-systems/pce.md b/doc/7-systems/pce.md index cfa71a53..80f4af10 100644 --- a/doc/7-systems/pce.md +++ b/doc/7-systems/pce.md @@ -19,4 +19,4 @@ furthermore, it has some PCM and LFO! - when LFO is enabled, channel 2 is muted and its output is passed to channel 1's frequency. - `13xx`: **set LFO speed.** - `17xx`: **toggle PCM mode.** - - _this effect is here for compatibility reasons;_ it is otherwise recommended to use Sample type instruments (which automatically enable PCM mode when used). + - _this effect is here for compatibility reasons_; it is otherwise recommended to use Sample type instruments (which automatically enable PCM mode when used). diff --git a/doc/7-systems/pcspkr.md b/doc/7-systems/pcspkr.md index 42330b06..a6a55ba6 100644 --- a/doc/7-systems/pcspkr.md +++ b/doc/7-systems/pcspkr.md @@ -1,6 +1,6 @@ # PC Speaker -40 years of one square beep – and still going! Single channel, no volume control... +40 years of one square beep - and still going! Single channel, no volume control... # real output diff --git a/doc/7-systems/pet.md b/doc/7-systems/pet.md index f3e51bca..9b7e3b5b 100644 --- a/doc/7-systems/pet.md +++ b/doc/7-systems/pet.md @@ -2,7 +2,7 @@ a computer from 1977 which was leader on US schools back then. subsequently the Apple II took its throne. -maybe no better than a computer terminal, but somebody discovered a way to update the screen at turbo rate – and eventually its sound "chip" (it was nothing more than an 8-bit shift register) was abused as well. +maybe no better than a computer terminal, but somebody discovered a way to update the screen at turbo rate - and eventually its sound "chip" (it was nothing more than an 8-bit shift register) was abused as well. some of these didn't even have sound... diff --git a/doc/7-systems/ricoh.md b/doc/7-systems/ricoh.md index e84a5db3..51832602 100644 --- a/doc/7-systems/ricoh.md +++ b/doc/7-systems/ricoh.md @@ -1,6 +1,6 @@ # Ricoh RF5C68 -YM2612's sidekick – poor man's SNES DSP. 8-channel PCM sample-based synthesizer used in Sega CD, Fujitsu FM Towns and some of Sega's arcade machines. supports up to 64KB of external PCM data. +YM2612's sidekick - poor man's SNES DSP. 8-channel PCM sample-based synthesizer used in Sega CD, Fujitsu FM Towns and some of Sega's arcade machines. supports up to 64KB of external PCM data. # effects diff --git a/doc/7-systems/x1-010.md b/doc/7-systems/x1-010.md index dc46f465..5f110aba 100644 --- a/doc/7-systems/x1-010.md +++ b/doc/7-systems/x1-010.md @@ -8,7 +8,7 @@ Allumer rebadged it for their own arcade hardware. it has 16 channels, which can all be switched between PCM sample or wavetable playback mode. wavetable playback needs to paired with envelope, similar to AY PSG, but shapes are stored in RAM and as such are user-definable. -in Furnace, this chip can be configured for original arcade mono output or stereo output – it simulates early 'incorrect' emulation on some mono hardware, but it is also based on the assumption that each channel is connected to each output. +in Furnace, this chip can be configured for original arcade mono output or stereo output - it simulates early 'incorrect' emulation on some mono hardware, but it is also based on the assumption that each channel is connected to each output. # waveform types From 69e351575732afe074e659f498f3ec16e11a861a Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 30 Jun 2023 06:09:42 -0500 Subject: [PATCH 10/13] SegaPCM: real limit is 2MB --- src/engine/platform/segapcm.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index 47411496..9376bb0c 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -423,7 +423,7 @@ const void* DivPlatformSegaPCM::getSampleMem(int index) { } size_t DivPlatformSegaPCM::getSampleMemCapacity(int index) { - return index == 0 ? 16777216 : 0; + return index == 0 ? 2097152 : 0; } size_t DivPlatformSegaPCM::getSampleMemUsage(int index) { @@ -465,7 +465,7 @@ void DivPlatformSegaPCM::reset() { void DivPlatformSegaPCM::renderSamples(int sysID) { size_t memPos=0; - memset(sampleMem,0,16777216); + memset(sampleMem,0,2097152); memset(sampleLoaded,0,256*sizeof(bool)); memset(sampleOffSegaPCM,0,256*sizeof(unsigned int)); memset(sampleEndSegaPCM,0,256); @@ -482,7 +482,7 @@ void DivPlatformSegaPCM::renderSamples(int sysID) { } logV("- sample %d will be at %x with length %x",i,memPos,alignedSize); sampleLoaded[i]=true; - if (memPos>=16777216) break; + if (memPos>=2097152) break; sampleOffSegaPCM[i]=memPos; for (unsigned int j=0; j=sample->samples) { @@ -491,10 +491,10 @@ void DivPlatformSegaPCM::renderSamples(int sysID) { sampleMem[memPos++]=((unsigned char)sample->data8[j]+0x80); } sampleEndSegaPCM[i]=((memPos+0xff)>>8)-1; - if (memPos>=16777216) break; + if (memPos>=2097152) break; } logV(" and it ends in %d",sampleEndSegaPCM[i]); - if (memPos>=16777216) break; + if (memPos>=2097152) break; } sampleMemLen=memPos; } @@ -522,10 +522,10 @@ int DivPlatformSegaPCM::init(DivEngine* p, int channels, int sugRate, const DivC isMuted[i]=false; oscBuf[i]=new DivDispatchOscBuffer; } - sampleMem=new unsigned char[16777216]; + sampleMem=new unsigned char[2097152]; pcm.set_bank(segapcm_device::BANK_12M|segapcm_device::BANK_MASKF8); pcm.set_read([this](unsigned int addr) -> unsigned char { - return sampleMem[addr&0xffffff]; + return sampleMem[addr&0x1fffff]; }); setFlags(flags); reset(); From 7c328cfeed2720f8324355ca8eaaabe5747e7b09 Mon Sep 17 00:00:00 2001 From: Waverider <33787286+liaminventions@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:13:56 -0400 Subject: [PATCH 11/13] add 2 songs and fix 010 editor (#1179) * add 1 song and fix 010 editor * add song * fix key 19 --- demos/gameboy/finger.fur | Bin 0 -> 2872 bytes demos/x16/Cafe - 010 Editor 2.0kg.fur | Bin 12873 -> 10728 bytes demos/x16/her11.fur | Bin 8604 -> 7287 bytes demos/x16/keygen19.fur | Bin 0 -> 23395 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 demos/gameboy/finger.fur create mode 100644 demos/x16/keygen19.fur diff --git a/demos/gameboy/finger.fur b/demos/gameboy/finger.fur new file mode 100644 index 0000000000000000000000000000000000000000..eb1917a3490fd89f27cacb9ba6620902845bb41b GIT binary patch literal 2872 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 aZ(p=MxnSgWgY^dH^aRTcU;JNWRRr>VGh2)R literal 12873 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 diff --git a/demos/x16/her11.fur b/demos/x16/her11.fur index 1cfabac199e79e68e92f72f3e175116dfc6c582e..06c4870f82590831f385a795895182da54b7742b 100644 GIT binary patch literal 7287 zcmZv8XEYo@|Mf15MX*GT)oT)+Bv`C2x~Pd7U8471qPGwt(R&aj(XHrxm1xlkR`0B` ztp4VC{vY0Q-Y@r_IdkWCXXbb2%=O7SFd_7LI8)#Dr{d8-GOubwbv1e4TT4sJ_-Y2I zC38ghHY2srwRP&XGP2Ap zK#S=r(WNSxC5|`OSBEbdN3Fk&zwB3h{(FNy;Lz>P{qWaC)-TJC2~Q2AY8;2INHW#P z92c?uVVO^Y!2khZTZLikNyCEc%TM2MLZVXn@!kMNe}5oRse<0!vqqbJea`dIs6&x3 zL?re4g`+U<>$hbhi`A=fLu#4NotA*lrB23L6Zb>ZjS!A)&Zl27WEqEx@8;_QkqsCa zQwa3O3+ajQIN8p8ZpuVidc&3aPXH7>S{%1hna?VA~SXJ`637q>E3hlX$4nSJOD8M#zVm_0TQO*jtNe{-E-m)?=65!1vKPT z4=`&FVBXD-SL8;}g+$V$=9j=7?aMeFxCkKnU;&7o%Ld$>s{&d)UI6@G09?+b08OYA z#Ri-ZXMzqa31D*{ly|oP_-3|t#m*IG*QX~+&_fYHp9xrdh0N^1- z7;=CByln;wNRV~x!*R7PC;%_oh&q~ryDnRS9f&1-REa+jJ1hmba|48Ulj5KUSODTu zAI`<`z2_bSYDNKCe~3B?ya4)MKo?swV;W%q>>7w2fB@PXWMQ*Fp9QMt^|JZlc-<~p zw}g}`@tuTO%#RIw@79$%8v3Kh@qfzKa`(Owh`$YXDC%y#sZnYGT%5W+(&mkQ2}I{= zlfN<&R8dG3=;mIY)uouQG&ud%PjTbs0o_v~e?PUmVBgS@3kUhW#R!r3 zV3T<150~FHdEcHNpr)-~02}wdr z&$zClpFi7HntDH~tJ6kCTnj?Oci+FO^5U$LP|{m{s$Z*3lc;RnvB?W-aC|1&62z90 zj%)p7ihO;Ko`&D4rLDB|ow6k@kRTVRUj&w2qs1X%T)IL>{#a;`zI(?5{}6TQStVi~ z+YjpC1~n!|VJU<#3>VHz=#Y2UUoi{MWzrP(^L~SEbu8rqO%6iKV#R9JCfv`YJG=P9 zBDc3ipOLY#h6yx;D*$l%2(FOu#OT*zoU*;Kvt9VU(eOAuof4ATvKqG&V)fe16g^#i zeh0gFZESGf^2aB}iNAd(BCin{)FRRXY~>ZK7PW5%UwH+FFM=eNy0x{pfK@oA8LIEXVO`bK3tX@KZ#_@NT+-BDAP9owt5UkIH>Z zUw3L!f#q<6d?ud7hBcaVdLQCNYH_MvBozurxXCyM26h)@l=)J*4-KlQ4vGGKCUN*D z4fY+}*{mVh6#2+WQ2npP;nh=)1RdTO9gzkOGa6(m^{x(M#6-sm4=+>Z45H8F?EBNq zwuT@}pY949a`nPCqN68IIOS5U`?K}6tTG5qDqAc}^)Ovcd$Z3B3z(&6J5xy?cx<@t zEyt6S@6e|7_+CAYE-^@WCmkVq+m>Aj%QCW2NQ-H)T1)vT_^z{z7Y#V=m&{yIg42~*a~rM%<#8wG{BDL z&|lPzFHf4DJx%4S;CnXKVY|~b>$lxQ;CvLk$5eTHP()*Tck4bXaot?veYA9ow7tXb z+E?D*Vh~cIF5fnKez|Ak-gavQN9$T|Ql}W`%8}?Vxh-VW@3oz6R4%!XUVZdlu0Kqu zM=Z5iTw**=w}u6&XoWl}>t1$PGC_BrWiG(P=jZ2PBM2|!{r$t|nZviZVXa}*uN@l5 z%c)G+yfQs~`Yoyr@qfs5hlPc8JLC=@o;BZge!@ZOi4>ZvDn=^GO^7I=l44>S;?1V=TWvR~QPp5a?M$;gZf*gL7AwwiW@wzQ2*p;e$8t!&Gpt} zn};kYxp%vk!U)I?gKRGN8g5(+zO~5Trf~-b%&Z|snlGz4+JiQ#m6&`ywh(Qni%7+x z8ASIzx-F<6Aj_8@DB1 zw^-Zu8#t+d-3?gfdbs?0$!F)%>~=rB{m%0KE)Y3t7zrZ?O<>_KHmUly(^q^ouYk#I zzArC#T0*~O-GCpyX})T(rg9l}ClOy0(L48`;QQ3QvVTzL0lhsNTL|{w<$_gTNE^@_vQ58Qf)@>JUjEb*AyKC-sW{^?)L`o%l zwLwZ|L6NEH#nT(R(jmHY7oM-WC2gDiq^=uJZw3;{(yyV5Kf?5Dr(k0;MhqH%Mkv)r zg?amPGbIs<&2>&*8(qG`xs@4j43h>5a1r;=TR}VG5&nYaQ<8{p3V4%uZ8Cc(m!X)pk&BBK&y&d{GBT)?|D?k$s@Iz| zd;3Vjyy1=U7Ae*vdvQLLcrlQu{yt2`UFjmGf$ZEPf|5z{x7C7u!s=N#J6ws$-XaaQyn4GBc==S<|9{=Ha%YarTg0)~wE z5AQKU{P!Cexa398DO3CHb;*6pb;Q5XA%9NL#SYi}a^Ol);5A&#!|uMiyIU$Vsz;eO z{fDj1ixkSQBkgU!ysE1&`|v(0c-rgp@HiSTR$2K@IQWD*XSLpZr7FThR5(5{o0=3T zbX&UF{Dp_XH`71$7}O0hB2>~3(f*)=D_-J@wYX-9vtQS}p38~b)I9gPXlMvLiGhu| z-8eW`-eX}~I3?$Xq+VH0?57E!;|)lq^ZYdA~OY&#zr zKUErG47wF zqVlX=Xx+yGRp!h3`T9s2%N+Xh3g*Mtgg39Zd335xO+*n6=LK`=m^h--J$u{f=?(j> z8H16sC*>8n`2+3dHj2u_t6i5HdhVN=nQsK`6@y%hg_L z*Jv=x@>yo?uS!xZ;(XEEpZ2P($ejeQ*3Hx1T`0DgCWYVRwXv3oSfy8S+h*~JFCK@w zf^`H{Us*;vrkMGeZGOf8!Xl0+R^`-VA}l>3{SAw=hCXKt|6@nW;^Xr_Y>sjr^V3U9 zfBww)udX$Gc5X-`^Uey~Ll0b>Gunw=n`ZL!ccp=zXQQEw|Sx0cqP%&-3T zt+hAU-w`8iD&S7-lr>D+2giED(HpLV_+TOGGC8ij%VX5R~Un~$`aSBi_u?mDQjQUAdgXeCBHq59eJJ#Un- zm~4(RKKNykt{-nKx$(w?w9dk_H_ywtz5@mUE47x5W~Cf@=+1{+9&a95e zbxRR@(jF;P29_k(KOnvel8iJ(Q6*LNzDq;HM6!%#d=C{}&^N1KE z2~;a&4}qyFl(z=4!gRJ+;@>Dz#cbKvP8s4AjtudNSfD{plcjZYbWiHV%b7ppuz$pr z=tlLBFfu5ACyB>#4|l6cd#ly?>34q!{)F#!%eUp94@4!qO-Tf;aQWO_dIZPT&`tQf z)4&%z85~hes`eMAaSCVemU~!1SFBbg6N_-o0DUFLH)q|{SPiVJlQ$}RXg2A zeB@&i#qV}1Uo>$f3$qpNxuFw#7!|n>k$-Hy3xk`qsK!d&A3SQsFBG9vu%e)Ql=;+5 zRcPsL!)QUCh#`{*3zdhtOsanmJ=&7d%!L`%fX$NGs+yoilfVLH{Jq;@0&m^PV2bk# z*9TkthJH~JOCMyM(FIdKK}1MMam}0{o&@`^mM1(%qvRgCCy=hk3IGB=j*ZT007>FEphCY*A)1Av zu?1K;>WG*#u3Omf7UdZk8-r{{?mf_~{6L;MG4Jf&jN^6sX~+rFydS1f&V+bCV9X}H zQ{x}1Vyi``{W!ZWf$&d$o~hC`Zpw(=xBdqi{WE(+Zk{PJso9m!>}nq1lUR@0CaL@w z?0~#CRQgPt_cE1&G18G5{^6RzD@tj{bN(+8>f*79%Tc$2j^DLn0Amz##nTA&hGp9o zkAT1FfHc>W)=BoFYG|caERb|Nh_s{|wyN(FMw&XafnH@vG~7E~lMaibG$g^*ESGOk z`DHUV&tE2R7xEqW8mm@j$@H16WWr@-{#O{sazb|wxK*(8xO(ApuO_w9^!?yAzm$|d z43hu3cV#|KS`4*A6rMvy@h8d~tT0HLw2d7y`6TbcO%AR05)5$7T3?S{L-yq>xb)2T zqI+GFKR-=iqK_i)B)6yOra>xe{1gpxfcCJYq>9RmpeJ3TOWT-hA0u)IJKZrv|Kl{qD23c%+ir3AwZK4_ulAn>9BO^M!cjQqW zmk3=j4J~KLBn|QI4Dqfi`)=2T!C(^$)ZXtxEPM}`Wx*VEm?m1SqI0s;w!--^Gr9JvVj z^x=R@(TMdzw=I`}X~ot=>g3qD=0-R6M*Cz3bo|R_2va)?4Q>hgnwx@3oEbgQp}0A| zN*}*;RS<juT2j2qusE^$0hV^G1t#NmH3NYa?++Q(07Eh^aC+*~RB8 z+!W4HozG2pJ^uJa6%X{JH-x!fDh&$hd&=z6uDi+*>mM&oCqn21c8yY-%GV+0*5(SA zhbpQ_J?{Khff#&@UBeUtSKQ80iNM;PhO$y$P>~yqMr(K=%G}<~b21vp>IxSHWcBzz zFlQDIe{~%@{2!RU4Cx5(tUM24E;3{F?$E^vPo1lxpaSHd6hpqNBK| zA!D$0A5i#fteZ5LARH`VuSErc*QlS1KP!XdSESO$XOi)b=Q`a!%w?iJeHlN(w4vz{ zWRMuhrx|S6)fO|@ZtU-R7qyxX1koR8iiCjo(sZR)adF7?gUSd%iWYKqoIc&PUTS!` zu+HdX9g5pWF?gwd_?lBJ6hAa4?+QSqUwGR8T?h^ioqo=$pQAPD=z1I&PqTh62 z%GY?nyq%h=XwA9+PKC=f5d3pNfJ5j;$->>v*We$Oa0&>w7<2eKNs`lbiBV9~Om1ti zZQnLcH~ob;6J)#Uw44J+wv4#!E6P9<9hsaw%6O@hq^Z(xd;E_ys%|_M;EN}f7>p85 zs0t~V#aHgze+uUwVsb^eKvL!?Dt+mnL!Q5+e0Kw+QSD?uK+oQa_Y)z&W`7&cbauCC zVB9f5kAsG14FvfTg9|oPS0*0szL@*R!jE^khBPY!*qL3H36Q|+DN;T+FdJBK9*z&O zlvPW+A4$7;MI?W0#(OfOu6$V+9uN^8;HP$HqN6SK?}#>PLANO>iJD0 zuuB9(f9sq=N75VV8+8FExf%}mjTbIyoh7E9kX>%9QtnFZa$lHgVKiYTv|pHNCh?^9 zmK)B2Qo^jQyZboMN1&=B6tR}WiI1|$keW!;Oy6sPGrH86@m#y?ub(uPw{yXF^1EEt zxiLBIpMqOv;Ch$x$tQ$BIA>>~GMWtt)D&QTYv3vUHrW`$IY3gWJia1=bNNV&*?2tU zQ(3^uo$_;L2r3pYygxHGOQr`0hnE~8U?sN^1^?Y5!u%E|su&LlH2HLcHu#BF{Wpt3 zf^Hr}GeN@f$;ImoyYk{g%oxJpOOXa)lTZy_7PBXL9HH=}E9E)cf-U}arX!4|UYo8o z#UKqnyLRZmr>um7b6>pbg9p-JZUR=(;*a$TMvr}nc-R5D(I#f4g3Jo53K4fDXxemJ z7Gk^ZUyyz z({1sBy||ySm+2boX(`V$yrZ|-blClsl|@$ysn5-DqTdlhq3Njt z_IUFNoG&R85~mV4<^M}I6Vezf`OR`V?IBmM{3|m3g4&G@A5yqQ>Xs zD}KFQsWpi%5?|MSjJrt9|LZlO>k1Ze&4a+dnvcnUu!ChVYl;5*%rYSVC61bql>UGn zc4V9wh@+Z3oRr1pg~*5HXDGGu)2hxi%Dosx2dhHcWxLPG)4dHq)IU_~n# zk+nM4F_3u-Dvz*p>^S9Rvm*PS7=~BLi(1+qWqZ+_Xcem)N^dX)-~(%tGm{bwlwlBV z)?o|G7?qEHXfMGl6x4!FXFnE9I#x@@&Wf&R)&*K!BRjSjLX#ORgm|L&A%qJA>WGj8 z&6rJw&;&PdeY70A{oDF}AB-q(9<5Xc6B~JeHi&6BED0}xhi;fz40X?Kn&TZo05A7 zr78B6Y+B~gqdqG3Ad|0#lv>r-A4+FejvmZER?%Z4Dkw_;^YBQc=b%*~WNX2bjMt@|R=8NP{_?%_z8c;34RPFkI1}g$r@S!tI z%`qx%_kSlRBwtcH57Pl8>HIa0rR@nhePTqg?`N!!>;E@JrTo7s%92#(BV+pPDAiOU zE-UUU!x3?+{EZ5o(y{HRwYN3nEpqZI>w48H9aK)tSFyD732l#}8sgL+1yVV>tyE@G zV(Y+dvLL3wXO2QBVdd4r%CGA90X;1Ly71*)dfTSm2n*I3R|BWW%CLAs;gpp8*3F$& z#GhRtbo=~RoNEw!{LU|SP53iOt~>Z{uljR`s`dW}U46a5=jLv#lE!_Bnoq56j(fMD zp_&t7ge|(o*5W22N03zSs65WuZmvhUIjdNmThbRh`=esvkI>cbCUlfxi%_} z!MM=Dr6hM)9g;OD5*;dWP`lXIdkwA0W3H{-qFzKIyA?_>(RfC>G2Mr+5Nb+vsn50 z-tF+S6^77jqMa`;U^=tD+$?OgoQoMt_WZ--yj+<*SIc;1YO8}!49Lk3JywxZabOVPqa~c{ z<9jim;-ETX;Z=8Jy=~{!nm3-+CWMHuEzQEPSQ5L+e#~r&b@#M7TwG{A=`xmRSZ-SK zSV1i?w0ij=MbKPi!$p=_Pf|1pVf<d$*+?GW|r6QIu=akUC znIo$FQ|))P^-Ga6$PVvv`@8yn)kyhO^Whv4(e5`|QSNuN z_HqQ0QkniVmmNJUw|!uCO+zm*Mli6W7~NnD)8#X9XL=YK&=h<1p0IPJ0;kcRWwhhz zY7QTIElR9&vH?SP1?zanA5Ci?eYG9ycs3Rde9GQw-A>}N1w|tWApCiU7kDIzb)094 zcE6vB*5SjjdXS2y+4f|tfsyH!HSoYVFq{PKIX#9!0RBgJiOv}Uv=(2q2UoOJC_`Y; zJsKYreK`UnbA#{utcq-pdeF3{tiKpm`Fo18(xTNAD|{!IR+lK{yW@jr6!#0l6!)Jo zu=pJFSI43$z^97%zD{{e_wVt!jW~)IG`qT6I1Kz4u|xwBgDZh5T^N2G-Wx|8*R#s( zb5~jvt=Cfc#18~mY!H>M0!AHD->4^N0XlE*FtG?AZ@SWpI2w1U@!K!e@DCrKVUcvm zbdi`8t`4lcJMJ!}Xl;VYz1Mh$oo$nDHfH*rur^FUP>FmfZG1%?FFTbp-U|1XUJnzW z+~m#*7mrjzhV7*;CFw&9G@k1n$CC#j{L6G}8@P8Yi91?r6pozSyAFATJ@pC*4A_2D z8!yc0sNMXAckOD5K_c0BHbU=b?B%f3MjIG3)oA-Csx}X+lRdBaYYsayf&1opglp0e zEyA+!H*ttVJq97I5^s=}RIf=Blg%gXiHTF(uZ*KI7C#dt@seeVMteiATLr0BCrfWS zW{+`>a6Z1jwNYc_n(UtzgvPC;q}-{~5SUeHFscAq+=sPW+;+j*+++p$eMOqH!g{HO z^KxwENNt|>3TS@+r$q-znP{|Nf^F8KttTf*j-A@XIE>HePO;uP+?j~iFSWUkR@@nr zI4q@j#h2%Y0@wQ9tXq}|8vGedu@4oFi;$U>VWj~q8;)1;4yVE?zt9x1CD+6*1{HcG zeN#8K`$UjcTcK8W-OP}XZA%_6qpE;lS#(@_?9944LZo?};CA+KMl1iK0EKrs--^Le6~clr;~SH(Ai>#{W~M#|4~(SKX2Vo9Rm5Rq+t z0%a4zy^^=u*zL$5qkb0f24I0bLZ>_JR;6r%P2oJ&7ISP#B2{J7#i({;@ic&YHMZ$q zfIz$QIIZZ-7R_O!W-cJe)pfAr2?#GO;jYRuMujzd7UWA2RA^f%3- z1iO~2X8Adl-X(OrW)?<|P<(A)@aZB|Ev!_n+#x4%#-rr9>8$*OkfV8Y?k;hj#c+aT zlM%{i*#bkbF^Q_y)Bg0AH{Pc5w$JT*Y;DQEZ#(&xr7bs4 z4L%pQHBPlV@sN5U)%(o8Jv~NvWv-cxWStOaiOM!po%iaMBmRcljk+V)*xdIHH8546 zS3jnTY}SpeL;`lxLNs{Iw&qOPa1NL;^s)j5gg1<_`wgC12hDXqkk`U#oj6Hq)j11+vbb2#X2wnX%?? zaWa8*CGtr!F(ED=j$WG!n8&(NI;ZGlFU9lo^YI+w(#fGL zwm$xN;oZ~!|+0Rwpelb3q>~B3607gQB&N;~bb*MTZS9|5< z0IQy^$1010UbcCLT>zPW4T${vwBC50RBBY~xAWb98wol7iO%KlkvM(OVIjZwBwN?W z`)8fE&c8fXq;oz!b!Wjgq>zjq5?=mZ;?BNYmJm;w$l#2x|6e7dsPT`6n1ofi?yP9N z(@=}*8k(MN=uh(>1cId=L*?H%QCyCM;yjVd&vR(GYIicjfNz-Uyy?@a*EVA99=@TM z;H^j7F4^QZcngSA^p0gPpZDRmiIF`okQbsGqfh=^h>1vhV(b8PCJ-MvQ`QjILOe?@ zZ~ieF$FBR|)#Hz$#|1L?z5Wp*!*nf9TRH&r{bYnupILcxOnZIjnV{Zob6?)SUWHR9 zMOd11KKyrKR?F4C?{WKq#MQ=9ZTRP(X;C&IH428Bu_FIp*2lNFSjNMH9KppL*GwUK zCsQ4@>cn1ISnFSkO8<5Ju)YDcaK1?{dT6nBzx53r_b3_r*G0oUo14S28cKPtkdLmK z|Fn9Xq2jf|t24CsuLt{iETDt9Y9l#EdgDiDy>IUr1e#Y&$(`F<&V49i3c1@ef-VDn z_kX9kqf((ys`3XwhQ_niAMu>K`uG;BeTEzZPNplDAa^s4rjLV;4NgtF;mAs(8n=_~ zrV4TEl8{ZfuH-%~)&9Zm?#{l0^U+SLOa0kIQ$eoqYc9;yLH(t777gaHyIuK zzHs15;*AZ(#>NhRn>|bUCCvQmi(Y=K5p#K6ZSxvex_%mJnuID9_MIzlsl%>^c9U#h z(u>RU%gZYgLLW&6QznXN)3I z?JTcLsj4G0g~xN3h-`}v`^+m8v?E}$o0h@w3f2MHF}ecVAFZHJK*^-S4#e=I`;n>i z`OCAVfak>q9Zt$;EtH~5uJWao3zj*hL`ReF>6JCTGJPLAGZ>{WHY!){2jDBH?SMxT zbP0{vQ^W%@Ow`2ZaF_A%jQsKHv@66J3`R(Ot^lqvMvYw-AZH*D$AyT}1?h%$`wXYX zGr-I9;f01p@K7DW^<}xIIH&bDu00K~#WgBu+5K>Y1Sob7HAQXs#X_tVZdg_zRPwQs zw^@w)ca@ANq*k`iTH8qWug*<_&tL2_+s;!wXr1T5ce5SdvrXkG0=7I{jMV(vp6=OYr_>G4DUuIg`uF>oCs?Z#8*J)L{q=b46l5?|wTNW^#Eo zoua@kR2E~0)1zUvLc2Ymb2z!(0`xyx3|l{Awfn{cbng%$(UIm|bbK*=n7CDRiLc=V+0ZOq2>GtAERpC+RG8*AMUK zg-Oh;d*F=HMTn1h%p-X{FW$|}8DU6e8TTVr5CPJvZKxikvWdi!y|zvT)Q#_ zP6>lI3UZc7fVby@({$9A)W~!@9$_vJ%xD$VVt2DWTUOcefS4&D=(sO}wK>g)mx?;J zLnb}!jbTl$>xI+9XU-;4HNIVa5nCw}FNctJ+lc+T$ndleeU{JE!Z2#rK&eG{=8tTQ z9qzR)+t-l+_s89LMX{}yi^`1B4>M~k?bo-Fm5c#v$6RbHk4r}qF%aLqS)36MhJco$ zZLr_A%lFc(3oiq5jKd%RV)TOgHOc$&-><39?hDcFzDAm*KUZ!N)OT;HTl;b2UXiVX z@br-X`*_p1^kxv04Rs@iuR7|=2lVdd(_Yr38c+Ug{4~DUD`ds{ZCZB$WLNxcyV`); z>hXJ8B(VY?eJt$k0(QTXceX9D3_R&O8qK`F76tlUjm@)+9z8B~kwDI%Br9Tdk7?~f ze3E{LbMZCu+onecjzDVZwn-Q?s` zfnTeiY>o0$X`L7`wfvO($MgK#`j_p24|jP|%Hmobz8lv_9AbJYl&9DBZXP487Cq|v z^eaJ|zx7fPBC%^{Ofi7lQuL*K6rA>zThzj+7!Bv};a1_`gr#jX$FjCg_sb}E8qTe% z)-9j+9-o9#TI{m=+&sHZX%a0)qLP#AYOK@deXT9d2rGgMhezDc7?_TLUX6#;;jQ(oqR^x^&am>wEKFM=!?pFTg1Y&WRMu zzM3V%?ThmhFJBuoVD>p!v8QV&V7vwH6mVC`)^w4&>cFGK?AA*W)?8=4-FWzft`<|u zLINR6me_e|0^)-X;etX2gBp6ul7^p(1^XQw3g&HUQ;OXcL&;&h7Sy<+> zDhpa}W7!g<63%lr+Au#CW<~jbu4Rkc2q5UWy-R>&6w18V?O0qVp>07x{f!x@XmE-B z@y)!dTl&ePvCTi?H({`rc8G4!ukLs=(-k>lvxE-*&J-pS(n}KW?i;LrQ}eZ?PT$}l zsn<|v>8+~7U}iFLO+%tuW;{`G}p9aQai+y=8}-tg}^s_?pTC87RwdyThFRimp8-14cZskE6M zA~PoDJOXY+Ta9qT&D!Jzo0-1qK5dJy!?a~}8Qk#-ic=a@B7RAgaw1Rj$-Bl}UNGdr z#}xu3H)62Kf^q^y8R+p9$lEK1a=bf4Uu`fR?lkVVxC|^wP{o{+D3GN}N@KizkVWiY zj8i;@uu}<~$wrFKnsgz#c?1j{lamVy-&luD>h2Yb7}0W4M^;r=6;7FZz24u{%S-Mc z=2DwiXYK3mOC(h5rN*V1@)l zv%7mU`4_81??@wQg25}>w8Nykv@zi*vw#;HTLD}zy1RNh3*tr@F9=Vv_+L?+E4Kv| z!x$kCfj~jJTxPrgezJ4rZ;#Y5I8H4ygv$gE_KiuH_&swVgX>SP5sn{JeKU z#6jt#P<{p<9*Iyxa7v)oAlok6`nDD0hX7A-%zujn=&&TM39Y`-Vd?6J{cC3EN2+zw zWBj59dG<@<9Es3BP66@q-#wslQxc(vq!BGBMPh)5pA0#s%FT^J?O$ z>g~XF)4cLuapld9OFlROA_%!e4jBhH9Y`!K05?ga(x}OmUNy-Y+HADa!QIWh-&2_o zh3iMIO(3s;tWslrPn}qW^Xe^WMdjM9P{qo6AC41Uvbi^1 zxOMk272#;$S~SDt1oUf~o8rjO>z*Vv1>*Rii?<}dD1lGhf{QZ+hM$4!8#9?Qy5%ck zniEn97)k}QweMah`}Vr3v$O3`9495od$WdlzZnEb>H)G7+)_TbeZkY`dmeURmLb#X zuu00`Ci{vT9VAx5Q{wSyvmdIc2vphi;F_=x4CnHBUBp@o4f+V1cqpp(SM{##^NuQB zs$PqR185Y81%!`1px*!szlL8m(UtxLJpH?UnVd58FQ&yaaq-Zi{J*myHTVl5lT=zI z@|MD$U*6oImrL}3J-&3yUqpqF($F6mDaRF z_x^TIeW;-}!UGy&mccDvntc0^1ONNxF^Y)V>)Z+Pz& zcq2b#AU7%MGYs!)fB1EEsCcMkab)p|GFV5fkH4Y!>;uq5P5=xkJXIDbh;*lT4fmcw zb`y>b!Zsc7CDJFX?F>n5>RJa5uekeUH-d{K6o%N@_;n^Ffoz|+(2T!n=yfGB z@mjwhTg{Y{)C4T+&RdVqNgD#P6)o;|II8(p7DQJLChtt0F2B+-mr5uQ?N3VNACeYL zw1bZVcDxKr)Ws5FRM$SyncGFbE0u#5d*D=a_S9&;!_l{6Z0?<&kWQ4li!cY;ot%{v zKL&S*FFWm;3LEf^wW{jb2RUigWs$u}%ZpR;a#-l-rj2Pkl5Ne%tyXImSa+*PENeg# zg??`Pb5$&#q37F3$CJP&rlBwQsa2;Igj6g*?|29%Sel z$`Px?bc0kI#+yS7MI#!+eUcO0O=!kqT1_Y@6uBw>A{P-qZ%jB>nOOu0N>Vwc&jrf@ zn~&sfid*TmuRwC`1`L~#n;*Wm&PmI51VX*ba7muBCG;CJX0$WNX2X9i2oSNZ;$2r0 z<$mn6oE#R(jlR|5z#3?s&(nMZRGh-1-Z^k5B(Zs+>Mp@l%L_ zuBW$A48{oSxbq}^cfNQi=tAu-))4wJRMj1~Bn=@K_Dc*iW|h?D9rOpiPnr}0FqVKm ztV$Q$C~K!I-DIUChN;P{rMAHnw**k(QV{=M9*SS5vQbWT<3PWR-$eA9OBOhg!_fs( zxl_3i8lUA$o^3|CPiwiUXrr{Dmdw90a8H?`acL!G$?~KW5fW(8C1}bi`0>Oacd^FE ze6&O2=$_mT=N8Jo^%17e)?8OROU`ETse%~hntI`qBT3z+`3`_~^iOsvBdmyJTXD*$ znCim4tS;oh?YJ)LkQ`?#e@w+SsBpc3Wyr;UFVR@ZN zxWWu?7&tx$m<|E84NTX7T7K2#fm((x$eSQ9XGu11%R#_YT2r_6cTV?%(OzPY z{5Rm;^6{NhanlqS9`3b~Qjj*6@Cf!v#Mk-2UVC3I9zNsvcWU6p!8jdTpp&Y}%S-+Q za89eY206N^hR>oE@e8or8;ny~QxFEHhwQ*HD2^?Xj{UOXq$*qDnGP4k1LM7VZ$ z8QwL7!k0Vf0A~!jEh(Xj?-~@ODy2C1n+5h?)P`c0Hz5K71R8F+V8-?8s*js3Fbw_ z^_%^);=s5n9e|7 zBEo>RQrF`~4NaA6a%xhS44BH$c6YyHc*1b@0NCc@)<-Ljv$+ z@kf5%u*sy@1#WqeiJ^1jutIh6Xah2<^)|oig2i-Mh|{$6c4~o3;-7p5ptz7E>vaLS zh^Gyy!QUw<4P5*4Y!b(J-<6UST12;kS~SpG(Gq zCA{C!EwNnEsfO0oXHf#Dj!%Pa0uY@F<6D2)@F6DU+E-?5h5-w`D@m9sUr*%OlkUVG ze0cc>K3={)(m^$S*5UA2qmx&((oUadJYKsB~8*VZyNcqxd07a7P55wQ!CmYn|>>g-%1Q2`12qnMaA45X)X5Puo< z^8esH$Q?a~c|bcmll2Gd<4LBpVYd>2)Z|RsH>aIDA-Vgd?(v&7+uJ{Y`e4*;(bYxb zrn}J+uP7J*tZB}2X_s;1ZD^+NdWe#bGg`#=hl@Yro2Hw-_FGi1gZRg0$xQ*L|Bjpg z(VIR@@Sld6&#PopeEi|nm0^d{X(L$HMZykS#-3$B;^jL7nllmW79u+tPP-XS8lnDS z?foO47e1?PkbZL&$Mm1%@t-W;Kb@Qhs5fXdC=jDR7T_zp;NBJ*{cTNi`a6F6|D%wr zlK9792|zJfXrxak*GFG$?}7pWXGe?1efj|Txz>A9&Q^HON&*pAo$K+V*|1W`M4{gN ziR#S@l;!>6J`0lVz$}se|B*+?1cS)`R*%N;x#40j0bX4E4~ zvET8UzVPwgSlhbZ9JsAn*TDp9OREB@fueW6{)$F;^x^+urV#%o8nk>6brUGUSk zY_%o9?><<1wmI?cbblG0097^~e4SsCAlw>$yiaAq5w0JzCMM9zNmz*uFYP_v6KGW; z91U9&w(zbIXld-YG)gl6-U){skFKTS=uX|d-wapB+P>(p%ysupn%tw(1!OD!EFYF>;?OYcq{?K;7J0S1qn3(r1hk4*X~ zcG0?idG$pPqub9(s=O$YIg6Uq0_dcZpae|gGUE=&P{Q83o}UB-ts9*ZnNpFaZ3dlw zOxm-Rl6t@UJCMpWREETq)h!hHcTG}EB~Lp)li-5xRu}v9q_6Lfi8OS9cHAz_V_cXG zxT5ofK&pGw7)5~5jZZz%P5Kv(K=3czy8qy-Di%=xX!eK%NvWXYfGF5ZW{yeTkSe$6 z;)ah<{=e60{KWh1z_TzFmMBiv3cT3*<-3tAGtKI+U6PV zYdc+G_PKLsyL0DumbSP1*lD$*j#^L{1z9Y}7AlL0cmfGY4B2CL&hLq~olfs}?!CX? z_mAKE@`RIf-sO3o_gOyA5sMoS9enbkhxaaf;=rCmkMAvh6Ctz={k=79Xxw-&11^}% zG=$dH)gmFn1QNKxK=;Du5%k};+GVx>ZTlal|Nq|Z+57yXd!JlZR*Ci;`t}nC4(wT$ zw`|X$C%%2?8F*-_N3`3+($c<|ke1d3>PlxKqyyRj^aRjbKo^0safA*4odA*(2>k$v z1ZrX-bO9(1RJjD9?*aW0s2|7zRLn+bKahAS+|NWvwG8fWLg?&+2(8mIyJ7u@ z5c(LX{@V!s0*LuALN5aafok_4JFF%jat3W?`0io}{h|v8nAyn})$oUFFTA+mVuZz^s9~j^=0A4 zt%0;J=6!kbW&2;b)_-X&tG{G1^@DwWnOYC}tLW9w$8B%ea@W`9KvRDqVQMlOq0)e8 zKy)Ashyla|!hr}N7SIwPHV_Ah3&aEB10i%B=3j^T*J1v3n13DSUx)eEVg7ZPe;wvu zhxylG{&kpt9p+z$`PX4S%>6c|J6Q%f4a{%zqXGa_No8>ypQ6`eg26UhW{%uivFn>Pkp%$7wrWrUG~KOJpU+0cBP+nZ9QAvfouOEx-OTWfbf#l%cy|Hkrz&(}-;ayWtZ?0w{+Lytf6dC02&ikMGBgOy6ZdLUI5%gc3l z?!O3k$=FFtr#VqZcgpamy#4b)BYK?#O9j zHhymdC8`y1DjEzQ50FP;3`6Q?VW zdyk*=o*jPbD0EBg8aLR+4l)@cLf@9*OjENcGqu|KM<*D z(5`9TsVFY|POY;!d)+qAss(XrMMd$eLp$%*6T+vz5mw_ zfA)(XAOA`Fho>zc96iz6{jYuR5B=rCpIXB6#>gl5BrBcfs=9OO#xZHrQCYYMJ$Ao!=NQh0B^fi{kZj$pd9RrTJUU&4-#FYu>-F z`C#)a&mU-hY1i{FKk!`hLwgT=yZKw+enh%6yFj%cUj)Xb;)hd#U$tCg<-hV}BW4Fo(}4j&MGm za!=8_xWoMEc`rfZgk4GQbT(Sd#;_%>Qeuh5!&!#%7)yCXVfwOVoV@GBs#3m!Ef?pr zwF0U5j-`sb2uG2Ew#9SD;?l*H3R?Y=JMeP;GOZ$?bw_;V&0<2HnZ+y=^Ac=a5mhDy zMyXZon_(muZq5X)*Za`5&&GPLy3U?-{%NZ9uLCDOIsWM%PqqH#qd&d(pJ$J@{^)4S z$3H*$>v#Y1AMgC>{r`CPKU@F!*CX$p=s0n@qvLGHrvrbRHeZ-KKR-FK_^En?@GRhq z3q>KJ94{1S7VwKD%jtJ%%5{~RP5J8@ch>Ly#{Ew|y#Mj%_Pu;?&mmCgE6|#oQ@_4S z@Nw(%<k6V6o>)Vf8ehB>spZD*7-djGW)aUK%mLLA=N56XYt>1rq z^jO#6#E@;l7F)b25G>Ucl#~}&*L~v~yVmY{aQB0cKlS8O-+Si87n`4d5x9H#h34nL zHd6NS{7Wx@-MrZR?28AR_chL1>C`@O#$KizSzcVOho)$6t! z-e^3H;ELp`oIGv$idBtk*KXc=|3eQyw*SDvL(l&g*>Cr+%l{n6|H41W|I+6(UinIY z@ulYuJ@eFo#~$6g>)ZF=_swmazj04p-CflchLRF(Zr(DPRK(}9Xp6D1$Lp|MyE;Dp zY5#?;GiQ!`{O5Px_|xzH?H51);cYFXB>lSl|EKf+y8K_L;V1w4Z@+#0&36wUJ<-l*kjxjc`|j(n|L)bF{~IKO|4IJ;x&82`|MII}{qFaFc;l_Z zA00b>s_opx?%~TEGUU})o7hZVo*#ifj_|E=EAAWfE&ilW)ee;&PK@qE~ zE0>p+6y$2MR1ztl$HEbc#Dc*Em(^yPxiT>}+BekId$zar@*9I6oPPV`cRzUN{deDg z@6UfeeE2UPeE64-K0I>d=+TcqK6b3N^~8yjC;$4_Q>RX!{^XOkw)Xb3XV0DM?EKr` z&Y!<OM& zYkZ6nrV9i-{t{T7y+nwy864&kRvJM>nRI}Zv;>MTV$paql88n^X@O+O8@vg;x`IBB z*Y8~LI9xaUa|=$7%j2}WZO%E5#p7IhU><{jeyth0{L%x{jhe_8@+im8Vg6mym{P*qA0|Srlnp@EHdZ}27^wg zF_<`)&7?_bvV`{2?eocRzqd(l*GeV6l{d%@mL;Xj`gW4{joszB`_iGecT5{_aY-VJ zE|JS(*!i2a;K{niaVN*N_C9H!b(3@(g`p(bPUaR&p!!Ny@dy1Ama9w(ak=?RMYPoEAO=+6!p1&#@ z8jalSr2p;Ok`{4CpED^vUU+QVPv~=`EB&>MlftoU&Z)8X^q)Q4QaN)q<2O~ODfdFj zoA?AHaxtuUfANT2STBpNEQX z*@EC2;m&sp;|`I?J-f`h5S5S1{5NlU=c6>=6}xE&MeqDWspkfl7mR-9x~8~}2iYM$ z$37RDa0^}5sMl|^J0h{s;KH@o!s1-eV-J~pHsQ3DxV*$V&gjz~uJ|bb0)0|G7`z!Y zGhAqvJ!@mlIixdzG+)TZw?r~8XDnP>_L(+G&4P)Tfoi3?ue^}OGOe^rUVma;$luZQ$`U= zjNo$dG#(S9G1&AaVNR5NljmI$g(yg`OdLGp&vITODcnz1|Q=A6?(lhrb3o48@Q=9nSpXRpm)cbIM0XKWUS$uTp3 z{l=7ca$(MH4qSE5EnHuivwCmLdR;f1t{aZP4Uc=ly%4tDT=2Ogu1N4^AP^4(Q9Kfk z29uPZ8C{H{XmXLBy!B#}jwQJ00XhjQRS^_3PyI+3QxA;JEHH z+pjxj=b<@l4hYgtXs`=JEcb$E!2^5y0)ap%c=P7Xa5xf;M1a3oJQ0s46TmaI2w|5- zqhS!WKq8z)5KNGg&1P{p5WpdfbNM`estNc4P>dj@Es;>nUn&%*i_({JGYJt_2wD>G zVH}s2YFrMR%jOcW48ej%Fj>r0@W&Yp41TcGYkowdQZEK!e^A?EA`wp{VzF2%o&tN} zP^t%mDb@M?UZ2P3^}yMCTh62j2!SE!q?|7{XNi6b!4znJ_bSm1(MIOxZysWk&cL6|}}u!3QQG55+hJ=CUG1?U71QJ0rcrf&}F zW--e2RQHP)whsnqQ>C*W?Jz6K0i79NmDxn9`g{cdd9hZx;BEQ#P`G#>z}F z=At3fdf&9}nrxnq3XIID)Y3Pw2}R=A?or>iK71B4>B7iV5;f_jF%$EKm05n7Kn3Ht zuR1h&SIB~y=GK2&HNmvxSb5hm@s)4(gVuo$6H^SkPTVz$QwtbKl^HkT;`wM|u4H)4 z2u?C7QQWlNY{%G(z%oKNw7@D7n@h%VL@CW6cSvH6FZ0+LA;ZXR?Rup?4~A4%aO%eO zWKoJyH=K>a%%`Y=DVSx-Txz~!I(veNLil2+Xk0f#M=6`C9>K++yc-xInKuz4bF846 zf-tZXkIfe^(9$h@_cH!uoTWb6bEHh5A(kF38?Fe2F_KK%K6VzzM=6N%B%!m^)b|CH6@l=xZB@T?r{j4Y&!u`TT zU}=(?k;h@@)b?}5VmSI`KSqBO@M51KrqGSUeeVYJnF-OXfw%XpTj=NYTOqd&Ydq!q5^2 zE6QFBrT&2diK8NGMjTO$MQ~_Ql3L z@RbF_Qft63;R2na;B5H|>ER_*j2lQrEt!|*mBtYr#g-86^f0VL6UV)*TgtvE^wStY z8Wn;J1Oo*AaEh6m=}Fj;u}Cq31Vt@z(@+S8-$KIYN)akUzb*a82&CnrTlc;mfiMh% zh2wDwEhgePgLdmxY8stIgUv$0&|>NzF=EjuC6%S~(}jFCi;cy@(Il0KQ?WS3V8A#c zjY`lkCdN^4AqpoJ6A?(CpreSN!Vw)qp@_^!q))N*JosgfEDrD8*qRpEt@BXJ&{pc~TjhmWcSG6rT%^=v+t$Y!rY9 z9H3YNp$vn~DLyOW1!3ZWC>4l#q7jeX8%l7LLZw>C!y+Ni{M?Kw;&ZxPZYD>TA>pFX zLYUyB(-?f@bPKSkDaJqw#c&SKICPWcWT&UJ+HN^@7iv+yha9GApqkM}>s2?Rf z%r`&h4$$Kmq6Pi2B%jGd4xF8~81MtDF<;C>j*<&hrn*$4BCwDW>GE;pQniYPv(>9BYI22A3G%vPzB!)@QdgW3 z>nc|+&sRmfv4|fhXg+x4a628r7|l-?%TXNXCew(BjhwZ51qzvv9S-;w-1d1I&ExXT z*<3*yLzyk)p}5x%=0u}Beoi{(_c#G2%v;9Et5<_b8c#q35lx(5d;jjnJSi8sL;i(@ zfX5B_(;sHA6zUZ@#YKgDA@Yaj-NAs*=kNs+c9OKud#p);Qe7fPwmFjG2pP;YIwLS| z9-O)Y>$?`2VzvmQFkB|*M&dM9BX5T>(u;+zabhH0FvqSERI8cVqW(rBdueoP=B#6lX`HA%YM;cyh^N@Y3e z968hH3R2<>F@f4&?J}B3^K>}jk5h@Htf*u~Ri%a-n)6u(hbOPaLe2$;!)CMkV>m%4 zq~*&S8f$CV0gHJi%*Rj?S+1JMFvXE6HHAf*;_8w-g}T}x512>Dg=p9nMjSaC(IKg0 zgx5Y|qBv@OX}+B19J)-pIRs)LFX{JKCI-8VZby=pDJv>0R_o-*Ly~?!#UUbrAbEaZ z`kEV;WwI7IqC9Ntq`1mJL_;<+X(yd?wjtxtz@=fUdie@nd3D3RTemiC z-rOkkIpzn?pC28XBqyy*97_`@G?J{`B3(&!NolnfwI4nE(OZ8wJWMkAD47U`8EmOY zsZi(SD!8E-?gOz#hQ>`+h;BuitSk{vmZ?>#Fpi8H3wkL9pYT~MBg3N;rr<&}7LC}$ zAu2PM%VFr7)-wMlOMDi zL4)H)(@ZQ4FVmK+D$Un$GgSg2fF*i9^kdpsk~`^E~L7i3^ntn>KFTx$m)>k~|rd4IC_D z?mRX?f`u|U`ihjnNa(OgX+{RuZtl2n^vv&T;!;$YAWj+wem>7O|dZFqR(b?Sk7NK`_>=c2lX!m_#AdD80LWaSMNLU zlF5b=iVFdPbjQ_Is~QZLXLj&HPiN-< zIp>atd>+zB`a?khU#2ew&7uU^-Db2#lN=_Kxk#}&nEL)F4?VlFRE33Oo_RmO=*|z` ze&e-2z4^xbZ%i(7ib~}QA(O#GabCspRU4Yt8icf%*J2XuDmFKkYPgYbs#wJW3vNG$ z$HpRH^`z4s#S%{P8tHWS+|K!Em=^K4=B=(Mr?4+P4;3&04 z`r_)^DlKN4>AP%Nlx7H6K3m_p&eL6_nT&JvjpZT_In+Bz&c_mvX<8A>`>d?0NCK53DVbaKu6^;7#+)L7bTCJO19QZ=UJt9Ve|G(mF}n z?G`uA;W5l*HEDlM;XT%j+?#vE}%snD-1NhgBAIEsKJ1>>^(Y*E0{`El34=w)L( z5l!F#P$F}~Cej~fsWllWVS^(f9gDG;PoOKS-mq)$*1C#%L&FN8&qmtJQ|6xTkKg;< zJI79*JJmbVXCwtuE(W=oOe_j=YU>R8mGx`t4Q1LaE?WsPwzABikwgMcXV?Nkl+VdX zr@6@C5fkZ1722NJYhl0!Wd8u^4%1WkDjxGPD2xqw!AuDo{L$`!g5C3#A1b-DhY)!IUZNFWrb z<=_GH5Nk*}0JT|TMqk~4bpGpI>7bqnHMPXiT)vC&sO*Q$o z^~>{hT6IyON}Z)*dM@{L4O@dOX*#kPNiQV-C@vE+65-JNka1#cczkfuod|f6>D&l| z%hy-v_1Y|@B=sje5N;cGZPa2B7>wiem}R85^FsSue|qh=ufBbZ?>OD%#+53Cv`D4b>I}N7s`8@3Qmuv|U^0E~Xk01)WKK?;Y#W%I9vLViY}L^E22&v4qQ}0g{-S zn4X!mQt9l3$LSsD7b7=%(~URjB@u)Hdtjm=yf9PBni zvKYN;nlqp89v&O-zcOW<09~~9k4>1|vZ5-($_-mr@7n#?Q%^p9aR0X&1|cl$?O zrUWh(angnUMGg_8L;#J1Xkl=;r~Nb>A0S0s2x-|JMhUh^sjDv6h=nj(S*TRXv-33= zuB#Z0=K_POy( z?H|1Mi{Jd}mv2H=$MZB&nG&|hDrwkx-=6P0x^-=1O@2YPl!t}DD_yukA6&jn^85>r?c33)P5GY>K%HMKLU!`< z$RxzPV9?`n%+8S$g9GP|z4Pvwwqr-SOjb7qdzTjGmDO%Pbm*z4pMLD&2R0gV2}}3! zqpbs^K(EcsR%h!(3@nXKOC-~9Q-&o zTB$2QevdtMXv#tfT5yH~ecdP9E?u4k=>q_c+3cvS)@}58FV(7>%`dP_-JoOTSxn;j$4T4NG^jA=%$1=_Mv}p1aztVwj@)#dBg@QFt0c%b z(|zIiyRD~AwHZxuM8y^&K|HUbVat6xcJ93Yf%V!oA(2(!iLBB|sL3H;()qA)Ds2jCK!P{J8bKci(^G<2K{?z@&q%)<|ocHg9U!w&%dX zz4vXbEZ0i0#e@gY{xInhlr*d}6qHpIOK7-&i2}Ca>6ww9_QNN-hDkr5V5Xo{L(l~> zF`uW@)z+0N6j|A7Z6?HEvVU@Xz<8BR2E%j)g7VxvZ5|pPo*+H8vF`5n(;v2tjKBd= z{LCylSEel5vhRiF=Ert!Yb?nZ(f}HOy_&#cJt-tuUA4AGt1Fj8Y=dJX#_68UljnQS z4-8x}kvxgMsc}_pr6xujEOL$!_kChxFlbkGo+6tLc zo+U>V0%+wU`z~IF=uMKahM!RC%k`Dzn%brfm0AEd8JQv)6!#-NooCwmFPt-41u}hk ziG-2xK#b_>?(XaDKHq-gd}n9xsL5hwsEevsmlpt-UDL33b;a^BZC<%XN+5a~LnH)k zlVOfJPg9&L;qyh{WKcsGXCTS@yk5WxZiu*Cae<+DMOi_CLM35|($!^!8VO(&+sMVf z_T#N>z2Ke_9uEbRQ9Lj|JJ@TSnCR~xywH9U;JV%I2bh|LToy=C4Jm>n7e%*W=lQB#mPmF9~02!P*Wz`MXilprrlw?ZcmI;{{-=H@J};G)NBb^2rTj&M{^aqq^u zeBh74BGPDa3g-(l!1p>&ojG=Cnw$q6Q7kUOCSn%SX0_SK@xF7t#*x9v8Pa6+g#$sE zuDViNQCn4)QCBqL^b`e`&a zWI~RzphT|BD^&=wkRRXylOv~baAXetoeD+==Ed?M&)AVwTKo`~TfeVoJPaZtb? za=AzoMNmQ}3xfg^^6K)2N{xc%1Xpp`Eo2fUFce#u>1-oO>#W@y!|}A3XXfJQ2pLZ# zB7l7RdQE|VBNR@ip%{bUa-_nfG+!xGW~)mJ^L2&!WtFS$X)MlV$DE*Qk|$Si1q9Ul z{v?CVl_``NIEu48?ugYvr3oZi@*)i_N%{R0&Jhra*n*v$7@KxGy}o(d$l!$zQ#_qZ z&?CWM(qp%bPE8rD3w}@3V>VAr1C$Ubbrp3QiGTpzQtFkfHq<~?&&VpSTD`JV&S%o% zp*UFljMY!Wm0Thaj^F~dOej;A=V^Fe8)-DT@q%211hA;dYKu_>!DS2SX(6v|YgkyZxaz)UHRi6Zvdq3*NiPW4YhN-dVNW1NgUouQ)X?uLfd zm0F2hAXF+d6-3-KXe5&ifrJn!vsD>NAu|*SP%M!sLzosk;NF!L_rrh4senjHx70UT)A@1Emp`y9D*n3;b<`)@sZ@^{@%%HcbpMo z2r|LKS5$A_w0+m3J2o{!AQuLpDoo*yC_H7cp`NdAs;Mv(=}Scrg614^Bmjt6KUk(( z&Lh%%Ha8WsPmGOE!jm~iG+^_4&BK%9q$if7r$NXxxkKJa&`)O&0g8vb;h@_a^te3~ zh9ywQHg9v`%Dfd7yIy>9_pS%-{no}B4J$$(KXUBUsor7I9q=>M8+NR3*mD2&dmAhA zl|r9odSbAvv%Re!umwxbjyRYQE_q@B7kOuAE#p1i=RP_8{!s|L(Ez2&kjm6~S`8Z) zvf+eAM@RbFp+dHYeNh%ik)_kBkZ+NaN@RM-aCKGsruCa^$~BTeXx=z#95RwVpVJM{ zR9#kAyRm8ex|OR8at;?#<7i*!CvELrq;2TpBm@$Uez{hgqsU-0W90Bq`v(;HSOF6O- zLzD-~+i(<+N0=d&@!33eY4y4lkk~T#Tn0}@h~*fSh(e{`amnPhn9Lmm17tWBUc@s5 zsyrb(5g@O0x1T)S+IptF%S0xVl(MX8{krX24W)7vu?@8!KmAE-NB6mo4k(pb;=)}0 zz89W8bnxK*dpE9zIujynU(ZkrLGejO!{KDa2C#m7z+{COm%{kuwZU@(Mv|7s;Ads!Wy_fio>W3mVxDbeV6?xl ze{}j%|0LC;C#)kX5kG_8@#k!AT(tSyRM5!*;FE1^TAZ92) z_Vixt?lPJdQII632Tg9aRGq6gtg5N3tZ2ArZDalF>a_;0)8Srl%$g?#0a@^*vaEut zhI{UP=)p&JH!7h1v`ibv#|Qh`TTgu0c4?IK#bw!$pEX1>nS7B5dCiymyW3Bk={JP~7LVKKa(nzyT)-8J zLN0S(f6s-^{zj>T~-kU8O;%E-W`JudHpTuhpj0LI8bC6IV#H!$)?v z8{Gkq&6?y8j1)w&04N$K-PUMe&S;#mkz>PDhFrlDiKG%SPs~jt*a8Is77Kvv%!#i4 zi#;ZqI8%|XtXk7>-=1fleHae6C|g1UaJ%64g)9@pBretD6<6=sy>4wysi81~#p9!p zci!CHcDl8#^=Ow>ppzrWIw%AwBI2=3T!C_`yQi}cATdRR=)82b2&1XXwb_{>0y!;! zHb#LU?4*pQWT+%~ZG}c4DAJYa46B+N zwJIK#i25w%!S2rUXV3O_4v?`$&#YUZ7V$9T1CJlOcGWax95y-3L)|8~H>s{zm7iTu zuF4Q{2;_mVNILB!-KUQp{@_S2Bnv@7Rb6GizTuv`*RHLrEGyO)=454Xc}xK#>2Xsi zDJ};fE6ZD6vwVe$&tfA#BVEEnsd}bspns^(XbrQuw1Cy;o11ej*lhE#zL_NFtXA?W zzd$)S6KNMsc#Tit4md$ozKuj0sYG+(QmSKp1HU(CNps3M;A%D++VvIqHgr z#`?O|n;UB?@`WrG3PVo8B5^h$P?hED4Vnyjzl<8p-pQ3?u3GwHH9Ae!~GpX(%xP_L)6vHZ$)yLUF|)IvVxC5JB$j$Z6K(tdG#a$wXFAOPs+XbkmbS%64!7Ueee zj*MR;Cniac8=TEhOeSVorK(ONx z4380E#9|5aD{2}yudb_aY^YG@$a4!<7^*4?vv5B-+SNWXa1K`R#KYvYX~u4k&F>BOJZ1?o-JzHtabBjcc1WZfwxuq-nVKc>noR?VY1D zwy+f(-5(PcsukKyaB>lcE5j%fs(h>U^Dr=Pvn{yh=6pVDfW~Eqt;W8g{(-JDXZtLO zCrM}c5u3$Vt$^T?C(~#v%f-pm-`W7wWb(KfSviH;;>dO=j3zLiO5519$^fCYNFdNu6bY!Lf5B>V1w5Ff)Ud6ox+vdJw|Y%& zV?%X8No8#TsHW}A+3w4!zv-JC1+q91AJ8NX!-BQNPFS^0_^hK-koO=0tmU|7Eimi9`S(c+%V)tpNZ} z-5OnCrXUP3!y{DX;<1=JLPHo=ySi@k_AN~SN~(2*IclYtvRX}DXV1L*{yQhzyPXLd zgU(lI0n*g1yT86jV7fFk(AD-yN88E1{_$aQZq^q{5}FlyWwtEtBS$Z_eR!g^y>D=Q z+&FFVCkRF3?nfSc=-zu8stU4XQl6hQ4NjP69Sd%UlWSO8y}G_}?L7?@0C-jz^toy& z+ie=0CdnXLG#R_PFG4g6gqTQDQo3AUtX4_{Ngtg_LH6x$JN5q2?tXAOa5+SyVLT33 zURWwil3gcGw;ny$4Um!aBoHBl!`-nL;N-q7dKK;-xYTi?vun(3CTHytiB`LACp>z3 z-~Ah^)GUlf_mh+Tm!@xl)qxQkPfQUKDUZRFXXj;Q@fm3}(g*?J8aeAhl!;uhng+&g zj#*nI84gDw-A6FWKW|S^4uEo_=lY#)tB0%5l-4wE+_wAChHCw~24yJ4dVAkcPag?^ zN>R9a; z%fyUu*yV{rF-CeQgb5Xz%7!{9Lz=3W7Z;V37}n_ol*4$b>&W{b96#LNXSU3Ti2UV^ zTN>6jHB^Jwng-hrzww7ZzSa6cJ9vDI$<9#ZXtm4r9LN=u7l&+QS9{whoqeOE2XQ%a z!>X0*wl{68tt(S!$tbte=OdxK8a2*`0uoJm&F1w@dMLlDtMxJn*o!`-((1Al99Gm9 zwv&^+?R_JoqofnDg*aQI%~Q*y87e9eC41YBzJK}?IN)*1?5r1Y1!A61B4#=wY&pwK z8bQ0AU4s+T7N1a=U(tB)_WQRqtlzOg&F}}@g^Uqg7`s^9oA~N(A8)V4xPPX-K~OQ9)nv3Fi6XZEcbkl)&CAo|mEU@4B)}u# z0Krw_G{1GmY=aaLr!o2R(v_>LinB7LDs9b%RV&q$+Z`YT5=~u&PAQ;6s-G~MJy8#2 zDC5-BsKxF{0?%}Un;tiHTo@d&&HKDg_w?8VX zIR$EbF~){K(trN^(A1a_Don52=Xbg1<^l{ho6QTFx;h8WcXxIUS`f~m0ni5&;SWI+ zE6r2NOA3^n7{OuFXnvUEQU&xn_su_-U z;%F!7iC`QK1uEupctReZCoiq4tgP3IqlnFC$4T?p&}_gl54FlDSUe$?1AiJFGdj1A#ZDA$zhODb2D*Q{Q@u4&`yl{%d6_Pg!mz^Rk%7Y6(LCnk)&gK&^|G#NxZ zoYIG-KjtD^!mb}d;modGBFXK zFUc*|X01Dqcl8EO0QbbELAn9V~@3#qBD?A)~l@}gcXkZVdR%4Ik?+SB^xZ+?69?T=2j zb@%pk+ZL=IKN3n6P_N_3nJaB4J5u#bgvivcf8hR|J9pf-rJ*7Z4@MSZ6pEXSZKqDP zzI*&a_lysXTvbdQP@Bcw9R`XPcNhkDibL@Z?(R}#pg6_d28vs8cbDR>rMSBkha$^n zH`(mlpPb}AeBZ;l4>vja&i#(O=5dD-DY8A;mSinT9Y!#(Az2&u&VXiEOdO@J&s*2o zO4GZ(#EEjIj*6`P7z88WH(`D(;<^20sPrzjDRzD4??`P#FXBKkPYAOCF4k{Tdy)?9 zIg;}($WAKcn5+yP(Y-i?1GkLeDEVk!_Pde)MGWoQPT}`KTvwMSlxXRq%CKZI85h^w zozu`)m-ZU>z1SCIBVW(ZDeU`bCg1_aPVvao~Mx0&;!cHMKYV;ypE?7wXD)4q(PhRs#b3@ z^&k7TYEVA)n9xoTRdXcJ(Lur7p>Uqi@kyM)BunDmCElvFr$f)X)#myBxxCJ=D(5q;K2@EgowUHbtYzh-@}m&#^N^_4=Ogx-$zx9Q6#1$LA9BbB zgar&|j{+?e5j%lw{Oh{ty#Mc`xm+xjC5^Q)=i5%oF6eE4)5zcR@OQPUE!6D+5##J7 zPPBu!+p?=PqZS)RmXN@6Q$THFSbhF*CGfSUay|pHy5gaz2?Pg|NUygX0extG~G_+bv>s0 z?UnMhRix(PgRRlK_V;bj6tn&f?<1kNhq;`WmB0ATdf4|52d@yrvqZ>Nn-3R6*Zait zV7hPbUSzgwZsTsaKW1N+G7o!`v6#K<@95Tr--*!Br>)4tY(0Z^_tL0h7HBIW!Ft1- z)7#yxQI^+RH#uQc=7;4vHw|l!S3uatgv6s$`r~&2omc990U???ySL=y$o)OVx0mm6 zbq8-eX1>pP5yeXFJx&C_8nwR7bQ|%t7y1?ZiM_hv{RQe#ndGkrmJS5?E^IjX3+2%o zTn@I6d+9uv<$MutdOcz{ORB(RM3w&_M~5}}biV;Frpdp~e%j%KaWb^=5rID^fr3os zW`eJ8gP~C33@8Om=oZzd+z?&!_KyvB@#L*pxFr3_kra>Thn$3*mpCul_-1_}UX6r< z{}M5f3nW1jg2Akb|A+jy0qL^sxtCf4`1n_QcdxC5pOQExo%Eoy2Livz3NH`4zzbg1 z{KzHX@o*RwL3eZFzYZsWQfZ#=#1DIYhlOp;FlXa3;Jbiv2-|O!KRMdM_96UYXB+!h z-nlORy(7_1vQdZu3W>u{i#(sjq#p{|WC*{_UZf&|H<|`te6}H|K$n^e#^}s>{KV9Z zS>-v9+K3nY>LTH7kY|o(cMax+ngvGo@Od1SG9K*KxPEHCLw5Xuz4zHi?#_~x9%c)G@Mj_K?mJd{cKw=U>uR_tN$@4yDQ$A}7G z^CB05)oU&fEM=;O=2N={!ZdGSB?Ov*0=jW};`&p4A>vCuD1!Ks*r+rZv7cgi5;4?# z=}m^=ZMRP=5~7>EJ||M+)kXe%L{K~A-tH3>U2m*Khx2~R$l?UZ-7oJ9uMR~3;K3Tg z=)$^DlkWi`*MjyDf>ooDf}H$}u)CCI4;!h*m*0Rc%v_fo{P=SbT?LU(m^Pa?q$54& zqZt)YE<`%id_0m{sr}f#nvPAksMng7F7#$;CjhA1PCXz%y=PXK?L^x~`c8?nMvon_BRs5p+2| z%O>h_U@Su(#Oh&02IEqIO#MWFL7kK%mB`n{X{Bs4Wi^p8)hkggTcL9Ek1sTdyc973 zNgfD_DrFJ##@(yP0@qPplyrD6SK>a-&gPO7pQrDEd$R+rOexQ;dLO5}$N8?KM4d88 ziDmqIy6Y#prvTW(-vA-4KTnPDH+3h|n=7?2*XJ?#Q}$4kXSL*0{waZj^n)zQ;QL=} z-#EHhFpH6L1yU3DH1`2$v-P$RzP(3?*%NuDPR) z0%yl=*)n=L_K!1PWiOS{YE;4-l^uJL*PV6}P>)vmMjEN5LXxCqcQS$+W>CS9+m@Sa z7Xg8)5uAdwr?8|%ddieo7Mv=1WdOne6B}ZHmVDA60WZRXKZoK@$zUT0c*ceqFRvVc z-jt92V*}OYV1vW`+sD|rF2BDoc9((rt@Vo5?OG3T{yq-H3zs9DSKZ96V*C&G^UU?DF46n(Vw(wc7%#-c)+trygFdV!47WX71Ol5|EASDnakTup?^8s z*Gy7*Y^UyO@I)*mSPr1opaUet2hX@GE0}O}7g!Af!}&08yjqtV*cF`=HOhF)%E|11 zx*Ddkk7VRaB0%vUFlOo^9etkzp}^k?hMAn;0u#8Pjj>FJO}cKemMV$gb044DvtMWF z{nM5<=o=QQi4iyOBtlN8hk}KGzkMAvDb(IIzB?z7pYz6)#)Wa_{x5h$UHl)lH~?4&Gtn_@NZ|W*eFxK*`g0%ZJu>)w{nqY}=uKU;&U`2H0K$)UV%U6U zi7RRkd%2leDTPm_d#EkiB{A5DqL@~yI~i;-EC}K!YpBS$OSe63*vfemG0rFwd=VL@ z;(rQnu8(sO@{;EZOM5j+Q9YjL%NZnGAC~HV_<}st6HGFd*pm7-bAy>w9@tqw6=!}o zAAqmq(M#wBu<;jp1?)*#X-&A3XyD_V(3gGsx;spgE${&}bYl02lv%JEwc21)B?F#F zpAsnU>5Pqb)Xb0K7wFL)v9-Jt-mlly6{;d>ll^z*lnnAX^Y|#_YKk(611uf&v6L2o zYRfu{Q|Qp|y8Lc(%g9z!(q3qY+KZw9npRA<2|p9hvEG%?@nPvM6PWCr zQl+b4_MRcgH>%7>Xo?hjk|>sFIxphdY#!zX43Tu5hbswkYVNO>re$I99JTA92A(K(bc{dJ+F%>ou>R=;nGEvRPvDz9T$yvLhdXxhNk%m-kDW}}n zLrqN;6{f8zL9z&~pTT-FgVaLgNUMbj9<1!$C~4S>n%siqq{Ad>49Pp(`joQsH}V#A z1!K-Va&n}CT!~tSOE;jDjc4ua!!TEJtU^|9!ZY8+5IgC?KyUsQW=xTt9`>)!*O)b5 z>@pev-eVL^NZ%?a-5mMfRa{elptWrcsYY1;{CvH$J{fadQavJ;+PrO5FfCE<3lcV< z`60*&PPoLbIAmP&6VIHpf8GzJ&dlUJBg)0X-lXbmG93o>l0WDE&s(q0_xD}a{#Zax z2pQC140@o=4e=eXdSA&`9?xDFuOixSg`|tvK@IFs=lV`{F`0b`-3DZ<3)ALe+~GS3 zxN4E;{|rl~^3#E$6sC{W<}U0z#(L2z+(=w^9s=~oCLS@(0HNeH<{UxGDoZ3*$h$*W8s(+NZvVE zMpldW2 zop&fuAlyz~(Qxtx*bHSH$?W#x*bLjSvB32=CgH9`EqJw@eyD z?*ioH9BME?0h`%=ih_ur-Ayzw)AGw2U)E=r2_}<39{h#lLDBNmcd4Cnq9* zuo#{ZT>%D?Q3EX%Szw`Q;O7P;XHkjb7gP4Xxc3+_vwNFQXuK7LOuF;HE}H zXK!VrVuV2U-4dDWsE1x=0Pl|_-lR3uNrM8WEpxc7wj!J$1Q#8f9&tL02hCwAs920r zmAJJme4KsNgJO(aQT#1D!17f%yGww2!9aJ|{CPzBoP#>a0R$cCwc~+4v2qK@{fBV% z${^Z~>VtMb`7L?AD&ay6TK=}B&hO7=QqG#X(EDS$>4iI^TY^&ei&^1fcpiOl?f(^; zh^!Uo7lE(_veFSysr!uc{2Do@hywqQrth|3sz6ix2*Kp;+JHHTkBKIAnlH)u)0l7O zAI#ilyk%`x7MdJwIR~~;^XF>AmMYbRk-T^2ukXyI|3mx_^Fb&%O)RR(5J3WI=#6{L zq^*3Yf|IQr4V^q*AC!DhKOLoCJ5fK0fVb6vjvi1Wk6Rnk1P$TQ-CvmxQ^hd?pclql z@t|MZ<62)yhYhdP%Hu-iTe47^jg}H^IbIOHkMb@{ga}ocflqA`M|dZ99R|z+|L;25 zPpIcMk;5@;rIYzegKxmNm0PCss{SQQ?rZS78Sx)t_mY=wfH;_^mC-43__S}@gRRv0 zsDuJd`8>FeXteY5d7vwZAY9c4GkM{2MxOZmtfvGR zaZiO2XN=#iYY0=&_ajl8IyYm8;}+PPX&_|t+#GSJ18+b&gg93Re)9@O8#(4Fy#~e% zXi8|>=SgD;n#ZNAg8qy*{tBYH3P)1{IX?LW%J6bgX$_S1!Oc;}+ju70Z21<4!Y`?W zrN9>m$N8^Ew??JyBh?d0y(+zh;@yPf(gTqs_LI)Dv!E8757UJSRj@|5a=Dl zN>7ZB5pRNEEvtKO0vtJnO}!9$$(SU)aBwlc;Fq&l=Md(?8_3YxFeC*)PV~9*5Kgj7 z{HFA>AV)==#?YG2_uFgcv8#%FxK5k4@%Jj&k$x@6_X?a@oR!Aj^)nej)5>8P`uhG} zKrQOW*uHYlqS#f#KhsK(2w{SQ+B}5y*&<$0Qkq>poJA1kC2*0JdEQ-h?3k55HP~j1 zf!D>lix&184pt*>8k3c5YceFXp(m~51a4b!`O}av{cQRr|Ce`J{<#smssM9Ac$FAZ2HvDtaE^<< zI?iyW9p2Xx;-ZB8KzGgAoq37NH^nn!Y1+LKxF;SMXX@>#GPy51psp#h#x?W_jWs** zsAp{$?$a>brJe0U%zK~+l5p8k`h7%iJ%TWV@Zp&JD?M*F{o)VGjukRzpCT$IRy0M{ z2PU|jj(8jk0Q!z>m7$WF@>DTn6|{2#C_q)>vU` zZzyFS=uf0~=1|2x(JQK8yo13G>vkGtm3f_%2fYXuRYyB#SYe=8|a zO2e*xn@oH{WAUr9W3nzjupLuGvc`TM7Fn2>5xN`+Vf6DxKRBe8(T<;i6N^ z&afI)?n5HeVjPU#>LK##S*PAIKzD3FF}aWaaS_dh&?B+z{h$38HW+PF<=Arg)N`Dtd{(Ub0!MFgBLSZRnlA z9{i!(%F%|kY7{&U+pvoFrzx5KGWRWRsmktz_ajcGj(ApoU#EVKIpw?gaQZq_dHlwE zfWs*K!K`0I@mTIoXw$3pWVO1kr`h$up z>UFWu;jgMd5URRPB?EjbXu!%IgH%c?J%yvbPI1cic(C-0`I|0nrD58lCX)mP8OT;s zbv?N~OhWG|A{a|ze3f90aDF;F+MKl(g;rt%;@>HE0sL`b!53vaUkPv;4?cf)V|SRk z#XJzJfjL`aFOPXtaaJ7I3#Patq!|SV(b{I#FZbb$PqbE|^w$e;{BouA=;3S662K6^ z#=%%bW<%-P=Ih;TSX`19*1A;iUS}!XYs&`?rP?LD^uMiU*cokl)O2c^!$vp3&_ro! z4%-H`fTj+#B)sey@=tEs^8GBP`tX+p9zt^+&~=A1rzt`{F!_F_Wms0D^Cw%*rglm@ z5UUK_dyKQ(rOT4JqN+P%6(0HlzZJQ`_fs*fma6W#Ataga*$Ph&~$m4HtbR~}cB8TnRimif^> zk7(cJz~G9wFw|gHl-S^r8C$N(CkvVG8Me&td;yzVot6}p_M5F^KkRX7YrTlimV^&0 zjmS?Z1SjfyEn?KnnF)?Vfy3?`0|CKvKS9du(e`0wB&X(xqI0!8_0TXA@%{NUP?Qf zffu!~;+tGC8i-v(NX~)(+Z2HKzfCm+|6Q9C2G5Eme5AIMFY=N{DUk8nBqz?)@rl8( Z7xNcdSs<4 Date: Fri, 30 Jun 2023 16:31:34 -0500 Subject: [PATCH 12/13] GUI: compact sample editor automatic button layout depending on available width --- src/gui/gui.cpp | 9 +++++++++ src/gui/gui.h | 2 ++ src/gui/sampleEdit.cpp | 44 +++++++++++++++++++++--------------------- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index eb8b9943..d6788805 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -497,6 +497,15 @@ bool FurnaceGUI::InvCheckbox(const char* label, bool* value) { return false; } +void FurnaceGUI::sameLineMaybe(float width) { + if (width<0.0f) width=ImGui::GetFrameHeight(); + + logV("sameLineMaybe: %f %f",ImGui::GetContentRegionAvail().x,width); + + ImGui::SameLine(); + if (ImGui::GetContentRegionAvail().xdepth!=DIV_SAMPLE_DEPTH_8BIT && sample->depth!=DIV_SAMPLE_DEPTH_16BIT); - ImGui::SameLine(); + sameLineMaybe(); ImGui::Dummy(ImVec2(4.0*dpiScale,dpiScale)); - ImGui::SameLine(); + sameLineMaybe(); ImGui::Button(ICON_FA_ARROWS_H "##SResize"); if (ImGui::IsItemClicked()) { resizeSize=sample->samples; @@ -762,7 +762,7 @@ void FurnaceGUI::drawSampleEdit() { } else { resizeSize=sample->samples; } - ImGui::SameLine(); + sameLineMaybe(); ImGui::Button(ICON_FA_EXPAND "##SResample"); if (ImGui::IsItemClicked()) { resampleTarget=targetRate; @@ -819,14 +819,14 @@ void FurnaceGUI::drawSampleEdit() { } ImGui::SameLine(); ImGui::Dummy(ImVec2(4.0*dpiScale,dpiScale)); - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_UNDO "##SUndo")) { doUndoSample(); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Undo"); } - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_REPEAT "##SRedo")) { doRedoSample(); } @@ -835,7 +835,7 @@ void FurnaceGUI::drawSampleEdit() { } ImGui::SameLine(); ImGui::Dummy(ImVec2(4.0*dpiScale,dpiScale)); - ImGui::SameLine(); + sameLineMaybe(); ImGui::Button(ICON_FA_VOLUME_UP "##SAmplify"); if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Amplify"); @@ -883,28 +883,28 @@ void FurnaceGUI::drawSampleEdit() { } ImGui::EndPopup(); } - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_ARROWS_V "##SNormalize")) { doAction(GUI_ACTION_SAMPLE_NORMALIZE); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Normalize"); } - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_ARROW_UP "##SFadeIn")) { doAction(GUI_ACTION_SAMPLE_FADE_IN); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Fade in"); } - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_ARROW_DOWN "##SFadeOut")) { doAction(GUI_ACTION_SAMPLE_FADE_OUT); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Fade out"); } - ImGui::SameLine(); + sameLineMaybe(); ImGui::Button(ICON_FA_ADJUST "##SInsertSilence"); if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Insert silence"); @@ -935,21 +935,21 @@ void FurnaceGUI::drawSampleEdit() { } ImGui::EndPopup(); } - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_ERASER "##SSilence")) { doAction(GUI_ACTION_SAMPLE_SILENCE); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Apply silence"); } - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_TIMES "##SDelete")) { doAction(GUI_ACTION_SAMPLE_DELETE); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Delete"); } - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_CROP "##STrim")) { doAction(GUI_ACTION_SAMPLE_TRIM); } @@ -958,28 +958,28 @@ void FurnaceGUI::drawSampleEdit() { } ImGui::SameLine(); ImGui::Dummy(ImVec2(4.0*dpiScale,dpiScale)); - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_BACKWARD "##SReverse")) { doAction(GUI_ACTION_SAMPLE_REVERSE); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Reverse"); } - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_SORT_AMOUNT_ASC "##SInvert")) { doAction(GUI_ACTION_SAMPLE_INVERT); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Invert"); } - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_LEVEL_DOWN "##SSign")) { doAction(GUI_ACTION_SAMPLE_SIGN); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Signed/unsigned exchange"); } - ImGui::SameLine(); + sameLineMaybe(); ImGui::Button(ICON_FA_INDUSTRY "##SFilter"); if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Apply filter"); @@ -1095,21 +1095,21 @@ void FurnaceGUI::drawSampleEdit() { ImGui::EndDisabled(); ImGui::SameLine(); ImGui::Dummy(ImVec2(4.0*dpiScale,dpiScale)); - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_PLAY "##PreviewSample")) { e->previewSample(curSample); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Preview sample"); } - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_STOP "##StopSample")) { e->stopSamplePreview(); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Stop sample preview"); } - ImGui::SameLine(); + sameLineMaybe(); if (ImGui::Button(ICON_FA_UPLOAD "##MakeIns")) { doAction(GUI_ACTION_SAMPLE_MAKE_INS); } @@ -1117,7 +1117,7 @@ void FurnaceGUI::drawSampleEdit() { ImGui::SetTooltip("Create instrument from sample"); } - ImGui::SameLine(); + sameLineMaybe(ImGui::CalcTextSize("Zoom").x+150.0f*dpiScale+ImGui::CalcTextSize("100%").x); double zoomPercent=100.0/sampleZoom; bool checkZoomLimit=false; ImGui::Text("Zoom"); From a69b02f525af6aa7fd1c982f08413634923fcb6d Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 30 Jun 2023 17:31:23 -0500 Subject: [PATCH 13/13] GUI: add patch number to OPLL patches --- src/gui/insEdit.cpp | 120 ++++++++++++++++++++++---------------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index ca254d2c..f0de1c61 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -59,79 +59,79 @@ const char* opllVariants[4]={ const char* opllInsNames[4][17]={ /* YM2413 */ { "User", - "Violin", - "Guitar", - "Piano", - "Flute", - "Clarinet", - "Oboe", - "Trumpet", - "Organ", - "Horn", - "Synth", - "Harpsichord", - "Vibraphone", - "Synth Bass", - "Acoustic Bass", - "Electric Guitar", + "1. Violin", + "2. Guitar", + "3. Piano", + "4. Flute", + "5. Clarinet", + "6. Oboe", + "7. Trumpet", + "8. Organ", + "9. Horn", + "10. Synth", + "11. Harpsichord", + "12. Vibraphone", + "13. Synth Bass", + "14. Acoustic Bass", + "15. Electric Guitar", "Drums" }, /* YMF281 */ { "User", - "Electric String", - "Bow wow", - "Electric Guitar", - "Organ", - "Clarinet", - "Saxophone", - "Trumpet", - "Street Organ", - "Synth Brass", - "Electric Piano", - "Bass", - "Vibraphone", - "Chime", - "Tom Tom II", - "Noise", + "1. Electric String", + "2. Bow wow", + "3. Electric Guitar", + "4. Organ", + "5. Clarinet", + "6. Saxophone", + "7. Trumpet", + "8. Street Organ", + "9. Synth Brass", + "10. Electric Piano", + "11. Bass", + "12. Vibraphone", + "13. Chime", + "14. Tom Tom II", + "15. Noise", "Drums" }, /* YM2423 */ { "User", - "Strings", - "Guitar", - "Electric Guitar", - "Electric Piano", - "Flute", - "Marimba", - "Trumpet", - "Harmonica", - "Tuba", - "Synth Brass", - "Short Saw", - "Vibraphone", - "Electric Guitar 2", - "Synth Bass", - "Sitar", + "1. Strings", + "2. Guitar", + "3. Electric Guitar", + "4. Electric Piano", + "5. Flute", + "6. Marimba", + "7. Trumpet", + "8. Harmonica", + "9. Tuba", + "10. Synth Brass", + "11. Short Saw", + "12. Vibraphone", + "13. Electric Guitar 2", + "14. Synth Bass", + "15. Sitar", "Drums" }, // stolen from FamiTracker /* VRC7 */ { "User", - "Bell", - "Guitar", - "Piano", - "Flute", - "Clarinet", - "Rattling Bell", - "Trumpet", - "Reed Organ", - "Soft Bell", - "Xylophone", - "Vibraphone", - "Brass", - "Bass Guitar", - "Synth", - "Chorus", + "1. Bell", + "2. Guitar", + "3. Piano", + "4. Flute", + "5. Clarinet", + "6. Rattling Bell", + "7. Trumpet", + "8. Reed Organ", + "9. Soft Bell", + "10. Xylophone", + "11. Vibraphone", + "12. Brass", + "13. Bass Guitar", + "14. Synth", + "15. Chorus", "Drums" } };