From 1556e0a0f9b9b0a2811fa7b392b85668ae4a2c3d Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 18:41:58 +0200 Subject: [PATCH 01/61] todo --- todo.txt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/todo.txt b/todo.txt index 170bd015d..a152b35ed 100644 --- a/todo.txt +++ b/todo.txt @@ -26,25 +26,28 @@ autobuilds: * ask paul * integrate https://github.com/surge-synthesizer/monique-monosynth/blob/main/.github/workflows/build-pr.yml -wishlist: -use fftw +small stuff: fix the bug demos +make a patch cleanup button do arp and glfo in project time samples (can do now bc all is phased!) +ditch after-mod, claim micro support ? arp new note = reset table pos yes/no? do more keyboard tracking just do it -- also trackmode mul/add do global unison subvoice index as a mod source +turn on stuff when dragging (e.g. basic sin, dist skew etc) +global unit lfo phase offset not plot good + +wishlist: +use fftw should figure out a way to do user supplied formulas? -make a patch cleanup button update the manuals routing overview image with new colors -filter microtuning +filter micro tuning DSF falloff to the left clap polyphonic modulation full-blown renoise support fix global unison for mono mode -ditch after-mod, claim micro support ? show effective modulation in the ui for clap param mod Feedback FM - but needs per-sample processing, not block -turn on stuff when dragging (e.g. basic sin, dist skew etc) wishlist sometime: mseg @@ -58,4 +61,3 @@ visual routing indicators automated regression tests better studiorack integration do async clear delay lines etc on patch select -global unit lfo phase offset not plot good \ No newline at end of file From 8a6d32cce3073f84d87a2d8c938086d205216e7b Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 19:40:53 +0200 Subject: [PATCH 02/61] glfo project time take 1 --- param_reference.html | 17 ++++++++ .../plugin_base.clap/pb_plugin.cpp | 1 + .../plugin_base.vst3/pb_component.cpp | 1 + .../plugin_base/dsp/block/host.cpp | 1 + .../plugin_base/dsp/block/shared.hpp | 1 + .../plugin_base/dsp/splice_engine.cpp | 1 + src/firefly_synth/firefly_synth/lfo.cpp | 42 ++++++++++++------- 7 files changed, 50 insertions(+), 14 deletions(-) diff --git a/param_reference.html b/param_reference.html index f2d7a1f4c..9cf821327 100644 --- a/param_reference.html +++ b/param_reference.html @@ -798,6 +798,23 @@

Global LFO

Applies a lowpass filter to smooth out rough edges. + +Host +Phase +Yes +Patch +1 +Input +Block +Automate +Off +On +On +N/A + + +In global module, snaps lfo phase to project/song time. +

GCV-A

diff --git a/plugin_base/src/plugin_base.clap/plugin_base.clap/pb_plugin.cpp b/plugin_base/src/plugin_base.clap/plugin_base.clap/pb_plugin.cpp index 20bbdda8e..5e5398afa 100644 --- a/plugin_base/src/plugin_base.clap/plugin_base.clap/pb_plugin.cpp +++ b/plugin_base/src/plugin_base.clap/plugin_base.clap/pb_plugin.cpp @@ -656,6 +656,7 @@ pb_plugin::process(clap_process const* process) noexcept block.mts_client = _mts_client; block.frame_count = process->frames_count; block.audio_out = process->audio_outputs[0].data32; + block.shared.project_time = 0; // TODO figure this out. block.shared.bpm = process->transport? process->transport->tempo: 0; block.shared.audio_in = process->audio_inputs? process->audio_inputs[0].data32: nullptr; diff --git a/plugin_base/src/plugin_base.vst3/plugin_base.vst3/pb_component.cpp b/plugin_base/src/plugin_base.vst3/plugin_base.vst3/pb_component.cpp index 144f8c8ae..daf8f3b9f 100644 --- a/plugin_base/src/plugin_base.vst3/plugin_base.vst3/pb_component.cpp +++ b/plugin_base/src/plugin_base.vst3/plugin_base.vst3/pb_component.cpp @@ -113,6 +113,7 @@ pb_component::process(ProcessData& data) block.mts_client = _mts_client; block.frame_count = data.numSamples; block.shared.bpm = data.processContext ? data.processContext->tempo : 0; + block.shared.project_time = data.processContext ? data.processContext->projectTimeSamples: 0; if(data.outputs && data.outputs[0].channelBuffers32) block.audio_out = data.outputs[0].channelBuffers32; diff --git a/plugin_base/src/plugin_base/plugin_base/dsp/block/host.cpp b/plugin_base/src/plugin_base/plugin_base/dsp/block/host.cpp index ebd327fde..13f89fa25 100644 --- a/plugin_base/src/plugin_base/plugin_base/dsp/block/host.cpp +++ b/plugin_base/src/plugin_base/plugin_base/dsp/block/host.cpp @@ -18,6 +18,7 @@ host_block::prepare() frame_count = 0; shared.bpm = 0; + shared.project_time = 0; shared.audio_in = nullptr; } diff --git a/plugin_base/src/plugin_base/plugin_base/dsp/block/shared.hpp b/plugin_base/src/plugin_base/plugin_base/dsp/block/shared.hpp index e20767de2..444f5e0e7 100644 --- a/plugin_base/src/plugin_base/plugin_base/dsp/block/shared.hpp +++ b/plugin_base/src/plugin_base/plugin_base/dsp/block/shared.hpp @@ -16,6 +16,7 @@ struct note_id final { // shared host/plug struct shared_block final { + std::int64_t project_time; // in frames float bpm; float const* const* audio_in; }; diff --git a/plugin_base/src/plugin_base/plugin_base/dsp/splice_engine.cpp b/plugin_base/src/plugin_base/plugin_base/dsp/splice_engine.cpp index f6d1b1fc7..2ba4cb69b 100644 --- a/plugin_base/src/plugin_base/plugin_base/dsp/splice_engine.cpp +++ b/plugin_base/src/plugin_base/plugin_base/dsp/splice_engine.cpp @@ -154,6 +154,7 @@ plugin_splice_engine::process() inner_block.frame_count = this_block_frames; inner_block.mts_client = _host_block.mts_client; inner_block.shared.bpm = _host_block.shared.bpm; + inner_block.shared.project_time = _host_block.shared.project_time + this_block_start; float* this_audio_out[2]; this_audio_out[0] = _host_block.audio_out[0] + this_block_start; diff --git a/src/firefly_synth/firefly_synth/lfo.cpp b/src/firefly_synth/firefly_synth/lfo.cpp index d29b54f11..b1ebb5298 100644 --- a/src/firefly_synth/firefly_synth/lfo.cpp +++ b/src/firefly_synth/firefly_synth/lfo.cpp @@ -25,11 +25,14 @@ enum { custom_tag_ref_phase, custom_tag_rand_seed, custom_tag_end_value }; enum class lfo_stage { cycle, filter, end }; enum { scratch_rate, scratch_count }; enum { type_off, type_repeat, type_one_shot, type_one_phase }; -enum { section_left, section_sync, section_skew, section_shape, section_phase }; +enum { section_left, section_sync, section_skew, section_shape, section_phase_or_host }; enum { param_type, param_rate, param_tempo, param_sync, param_skew_x, param_skew_x_amt, param_skew_y, param_skew_y_amt, - param_shape, param_steps, param_seed, param_voice_rnd_source, param_filter, param_phase }; + param_shape, param_steps, param_seed, param_voice_rnd_source, param_filter, + param_phase, // phase offset for voice lfo + param_host = param_phase // sync to host project time for global lfo +}; static bool is_noise_voice_rand(int shape) @@ -480,7 +483,7 @@ lfo_topo(int section, gui_position const& pos, bool global, bool is_fx) make_topo_tag_basic("{A5B5DC53-2E73-4C0B-9DD1-721A335EA076}", "Right"), make_param_section_gui({ 0, 3, 2, 1 }, gui_dimension({ 1, 1 }, { gui_dimension::auto_size_all, gui_dimension::auto_size, gui_dimension::auto_size_all, 1 }), gui_label_edit_cell_split::horizontal))); - if(!global) shape_section.gui.merge_with_section = section_phase; + shape_section.gui.merge_with_section = section_phase_or_host; auto& shape = result.params.emplace_back(make_param( make_topo_info_basic("{7D48C09B-AC99-4B88-B880-4633BC8DFB37}", "Shape", param_shape, 1), make_param_dsp_automate_if_voice(!global), make_domain_item(wave_shape_type_items(wave_target::lfo, global), "Sin"), @@ -522,19 +525,30 @@ lfo_topo(int section, gui_position const& pos, bool global, bool is_fx) smooth.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] != type_off; }); smooth.info.description = "Applies a lowpass filter to smooth out rough edges."; - if(global) return result; - - auto& phase_section = result.sections.emplace_back(make_param_section(section_phase, + auto& phase_or_host_section = result.sections.emplace_back(make_param_section(section_phase_or_host, make_topo_tag_basic("{8EB0A04C-5D69-4B0E-89BD-884BC2EFDFBE}", "Phase"), make_param_section_gui({ 0, 4, 2, 1 }, gui_dimension({ 1, 1 }, { 1 }), gui_label_edit_cell_split::vertical))); - if (!global) phase_section.gui.merge_with_section = section_shape; - auto& phase = result.params.emplace_back(make_param( - make_topo_info_basic("{B23E9732-ECE3-4D5D-8EC1-FF299C6926BB}", "Phs", param_phase, 1), - make_param_dsp_automate_if_voice(!global), make_domain_percentage_identity(0, 0, true), - make_param_gui_single(section_phase, gui_edit_type::knob, { 0, 0 }, - make_label(gui_label_contents::name, gui_label_align::top, gui_label_justify::center)))); - phase.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] != type_off; }); - phase.info.description = "In per-voice module, allows for phase adjustment of periodic generators."; + phase_or_host_section.gui.merge_with_section = section_shape; + if (!global) + { + auto& phase = result.params.emplace_back(make_param( + make_topo_info_basic("{B23E9732-ECE3-4D5D-8EC1-FF299C6926BB}", "Phs", param_phase, 1), + make_param_dsp(param_direction::input, param_rate::voice, param_automate::automate), make_domain_percentage_identity(0, 0, true), + make_param_gui_single(section_phase_or_host, gui_edit_type::knob, { 0, 0 }, + make_label(gui_label_contents::name, gui_label_align::top, gui_label_justify::center)))); + phase.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] != type_off; }); + phase.info.description = "In per-voice module, allows for phase adjustment of periodic generators."; + } + else + { + auto& host = result.params.emplace_back(make_param( + make_topo_info_basic("{B97DF7D3-3259-4343-9577-858C6A5B786B}", "Host", param_host, 1), + make_param_dsp(param_direction::input, param_rate::block, param_automate::automate), make_domain_toggle(true), + make_param_gui_single(section_phase_or_host, gui_edit_type::toggle, { 0, 0 }, + make_label(gui_label_contents::name, gui_label_align::top, gui_label_justify::center)))); + host.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] != type_off; }); + host.info.description = "In global module, snaps lfo phase to project/song time."; + } return result; } From 78d96cd65a17d1520e738e625836af93d1ef0158 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 19:41:18 +0200 Subject: [PATCH 03/61] take 2 --- todo.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/todo.txt b/todo.txt index a152b35ed..f4613a6fe 100644 --- a/todo.txt +++ b/todo.txt @@ -27,6 +27,7 @@ autobuilds: * integrate https://github.com/surge-synthesizer/monique-monosynth/blob/main/.github/workflows/build-pr.yml small stuff: +do the description on tooltip fix the bug demos make a patch cleanup button do arp and glfo in project time samples (can do now bc all is phased!) From 8df98c522026cdaa2ebf82712e4fa4662b452a3a Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 20:52:50 +0200 Subject: [PATCH 04/61] take 3 --- .../plugin_base/plugin_base/desc/param.cpp | 31 +++++++++++++++++++ .../plugin_base/plugin_base/desc/param.hpp | 3 ++ .../plugin_base/plugin_base/gui/controls.cpp | 12 +++---- todo.txt | 1 + 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/plugin_base/src/plugin_base/plugin_base/desc/param.cpp b/plugin_base/src/plugin_base/plugin_base/desc/param.cpp index 771d6efe5..ed90e6d01 100644 --- a/plugin_base/src/plugin_base/plugin_base/desc/param.cpp +++ b/plugin_base/src/plugin_base/plugin_base/desc/param.cpp @@ -4,6 +4,21 @@ namespace plugin_base { +// https://stackoverflow.com/questions/3418231/replace-part-of-a-string-with-another-string +static bool +string_replace(std::string& str, std::string const& from, std::string const& to) { + std::size_t start_pos = str.find(from); + if(start_pos == std::string::npos) return false; + str.replace(start_pos, from.length(), to); + return true; +} + +static void +string_replace_all(std::string &str, std::string const& from, std::string const& to) +{ + while(string_replace(str, from, to)); +} + param_desc:: param_desc( module_topo const& module_, int module_slot, @@ -30,4 +45,20 @@ param_desc::validate(module_desc const& module, int index) const info.validate(module.params.size(), param->info.slot_count); } +std::string +param_desc::tooltip(plain_value plain) const +{ + std::string value_text; + if (param->domain.type == domain_type::item) + value_text = param->domain.plain_to_item_tooltip(plain); + else + value_text = param->domain.plain_to_text(false, plain); + std::string result = info.name + std::string(": ") + value_text; + if (param->info.description.size()) + result += std::string("\n\n") + param->info.description; + // descriptions are in html format + string_replace_all(result, "
", "\n"); + return result; +} + } diff --git a/plugin_base/src/plugin_base/plugin_base/desc/param.hpp b/plugin_base/src/plugin_base/plugin_base/desc/param.hpp index 5ac74d99e..d1ae5b384 100644 --- a/plugin_base/src/plugin_base/plugin_base/desc/param.hpp +++ b/plugin_base/src/plugin_base/plugin_base/desc/param.hpp @@ -19,7 +19,10 @@ struct param_desc final { param_topo const* param = {}; PB_PREVENT_ACCIDENTAL_COPY_DEFAULT_CTOR(param_desc); + + std::string tooltip(plain_value plain) const; void validate(module_desc const& module, int index) const; + param_desc( module_topo const& module_, int module_slot, param_topo const& param_, int topo, int slot, int local_, int global); diff --git a/plugin_base/src/plugin_base/plugin_base/gui/controls.cpp b/plugin_base/src/plugin_base/plugin_base/gui/controls.cpp index c60179ad8..fb8f4fa43 100644 --- a/plugin_base/src/plugin_base/plugin_base/gui/controls.cpp +++ b/plugin_base/src/plugin_base/plugin_base/gui/controls.cpp @@ -201,7 +201,7 @@ param_value_label::own_param_changed(plain_value plain) { std::string text = _gui->automation_state()->plain_to_text_at_index(false, _param->info.global, plain); setText(text, dontSendNotification); - setTooltip(_param->info.name + ": " + text); + setTooltip(_param->tooltip(_gui->automation_state()->get_plain_at_index(_param->info.global))); } MouseCursor @@ -504,7 +504,7 @@ param_toggle_button::own_param_changed(plain_value plain) { _checked = plain.step() != 0; setToggleState(plain.step() != 0, dontSendNotification); - setTooltip(_param->info.name + ": " + _param->param->domain.plain_to_text(false, plain)); + setTooltip(_param->tooltip(plain)); } void @@ -521,7 +521,7 @@ param_toggle_button(plugin_gui* gui, module_desc const* module, param_desc const param_component(gui, module, param), autofit_togglebutton(lnf, param->param->gui.tabular) { auto value = param->param->domain.default_plain(module->info.slot, param->info.slot); - setTooltip(_param->info.name + ": " + _param->param->domain.plain_to_text(false, value)); + setTooltip(_param->tooltip(value)); _checked = value.step() != 0; addListener(this); init(); @@ -678,11 +678,7 @@ param_combobox::own_param_changed(plain_value plain) { std::string value; setSelectedId(plain.step() + 1 - _param->param->domain.min, dontSendNotification); - if(_param->param->domain.type == domain_type::item) - value = _param->param->domain.plain_to_item_tooltip(plain); - else - value = _param->param->domain.plain_to_text(false, plain); - setTooltip(_param->info.name + ": " + value); + setTooltip(_param->tooltip(plain)); } void diff --git a/todo.txt b/todo.txt index f4613a6fe..443fe3948 100644 --- a/todo.txt +++ b/todo.txt @@ -28,6 +28,7 @@ autobuilds: small stuff: do the description on tooltip +fix the descriptions they are out of date fix the bug demos make a patch cleanup button do arp and glfo in project time samples (can do now bc all is phased!) From 6dda7d3b78ccb09affe9734631f6c7e1d293f5d2 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 21:30:37 +0200 Subject: [PATCH 05/61] take 4 --- .../src/plugin_base/plugin_base/gui/controls.cpp | 13 ++++++++++++- .../src/plugin_base/plugin_base/gui/controls.hpp | 5 ++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/plugin_base/src/plugin_base/plugin_base/gui/controls.cpp b/plugin_base/src/plugin_base/plugin_base/gui/controls.cpp index fb8f4fa43..43dce559b 100644 --- a/plugin_base/src/plugin_base/plugin_base/gui/controls.cpp +++ b/plugin_base/src/plugin_base/plugin_base/gui/controls.cpp @@ -539,7 +539,8 @@ param_slider:: param_slider(plugin_gui* gui, module_desc const* module, param_desc const* param) : param_component(gui, module, param), Slider() { - setPopupDisplayEnabled(true, true, nullptr); + setPopupDisplayEnabled(true, true, nullptr); + switch (param->param->gui.edit_type) { case gui_edit_type::knob: setSliderStyle(Slider::RotaryVerticalDrag); break; @@ -553,6 +554,9 @@ param_component(gui, module, param), Slider() if (param->param->dsp.can_modulate(param->info.slot)) gui->add_modulation_output_listener(this); + auto value = param->param->domain.default_plain(module->info.slot, param->info.slot); + setTooltip(_param->tooltip(value)); + setTextBoxStyle(Slider::NoTextBox, true, 0, 0); if(param->param->domain.unit.size()) setTextValueSuffix(" " + param->param->domain.unit); @@ -590,6 +594,13 @@ param_slider::modulation_outputs_reset() repaint(); } +void +param_slider::own_param_changed(plain_value plain) +{ + setTooltip(_param->tooltip(plain)); + setValue(_param->param->domain.plain_to_raw(plain), juce::dontSendNotification); +} + void param_slider::modulation_outputs_changed(std::vector const& outputs) { diff --git a/plugin_base/src/plugin_base/plugin_base/gui/controls.hpp b/plugin_base/src/plugin_base/plugin_base/gui/controls.hpp index 624fb7f97..c7be8ba5c 100644 --- a/plugin_base/src/plugin_base/plugin_base/gui/controls.hpp +++ b/plugin_base/src/plugin_base/plugin_base/gui/controls.hpp @@ -239,8 +239,7 @@ public modulation_output_listener std::vector _this_mod_outputs = {}; protected: - void own_param_changed(plain_value plain) override final - { setValue(_param->param->domain.plain_to_raw(plain), juce::dontSendNotification); } + void own_param_changed(plain_value plain) override final; public: ~param_slider(); @@ -260,7 +259,7 @@ public modulation_output_listener void valueChanged() override; void stoppedDragging() override { _gui->param_end_changes(_param->info.global); } void startedDragging() override { _gui->param_begin_changes(_param->info.global); } - + juce::String getTextFromValue(double value) override { return juce::String(_param->info.name + ": ") + juce::Slider::getTextFromValue(value * (_param->param->domain.display == domain_display::percentage ? 100 : 1)); } }; From 4bb0dc64fe078f8bf6e3350751690175a8dfcba1 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 21:50:16 +0200 Subject: [PATCH 06/61] take 5 --- src/firefly_synth/firefly_synth/fx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/firefly_synth/firefly_synth/fx.cpp b/src/firefly_synth/firefly_synth/fx.cpp index 0562d6b00..3014f267b 100644 --- a/src/firefly_synth/firefly_synth/fx.cpp +++ b/src/firefly_synth/firefly_synth/fx.cpp @@ -872,7 +872,7 @@ fx_topo(int section, gui_position const& pos, bool global, bool is_fx) make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); dist_gain.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return type_is_dst(vs[0]); }); dist_gain.info.description = std::string("Gain amount to drive the shaper and X/Y parameters. ") + - "Use an Osc with gain envelope to have the effect of the distortion gradually fall-off."; + "For per-voice, use an Osc with gain envelope to have the effect of the distortion gradually fall-off."; auto& dist_mix = result.params.emplace_back(make_param( make_topo_info("{667D9997-5BE1-48C7-9B50-4F178E2D9FE5}", true, "Dist Mix", "Mix", "Dist Mix", param_dist_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(1, 0, true), From 2d22cb8c1dcf5f893d7a23cee38bcb6fec496671 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 21:53:27 +0200 Subject: [PATCH 07/61] take 6 --- param_reference.html | 12 ++++++------ src/firefly_synth/firefly_synth/lfo.cpp | 6 ++---- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/param_reference.html b/param_reference.html index 9cf821327..5cad90472 100644 --- a/param_reference.html +++ b/param_reference.html @@ -592,7 +592,7 @@

Global LFO

N/A -Selects time or tempo-synced and repeating or one-shot type. For regular one-shot type, the LFO stays at it's end value after exactly 1 cycle. For phase one-shot type, the end value takes the phase offset parameter into account. +Selects repeating or one-shot type. For regular one-shot type, the LFO stays at it's end value after exactly 1 cycle. For phase one-shot type, the end value takes the phase offset parameter into account. Rate @@ -728,7 +728,7 @@

Global LFO

N/A -Selects waveform plus horizontal and vertical skewing modes. Waveforms are various periodic functions plus smooth noise, static noise and free-running static noise. Skewing modes are off (cpu efficient, so use it if you dont need the extra control), linear, scale unipolar/bipolar and exponential unipolar/bipolar. +Selects waveform: various periodic functions plus smooth noise, static noise and free-running static noise. Steps @@ -1753,7 +1753,7 @@

Voice LFO

N/A -Selects time or tempo-synced and repeating or one-shot type. For regular one-shot type, the LFO stays at it's end value after exactly 1 cycle. For phase one-shot type, the end value takes the phase offset parameter into account. +Selects repeating or one-shot type. For regular one-shot type, the LFO stays at it's end value after exactly 1 cycle. For phase one-shot type, the end value takes the phase offset parameter into account. Rate @@ -1889,7 +1889,7 @@

Voice LFO

N/A -Selects waveform plus horizontal and vertical skewing modes. Waveforms are various periodic functions plus smooth noise, static noise and free-running static noise. Skewing modes are off (cpu efficient, so use it if you dont need the extra control), linear, scale unipolar/bipolar and exponential unipolar/bipolar. +Selects waveform: various periodic functions plus smooth noise, static noise and free-running static noise. Steps @@ -3646,7 +3646,7 @@

Voice FX

1.00 -Gain amount to drive the shaper and X/Y parameters. Use an Osc with gain envelope to have the effect of the distortion gradually fall-off. +Gain amount to drive the shaper and X/Y parameters. For per-voice, use an Osc with gain envelope to have the effect of the distortion gradually fall-off. Dist Mix @@ -4397,7 +4397,7 @@

Global FX

1.00 -Gain amount to drive the shaper and X/Y parameters. Use an Osc with gain envelope to have the effect of the distortion gradually fall-off. +Gain amount to drive the shaper and X/Y parameters. For per-voice, use an Osc with gain envelope to have the effect of the distortion gradually fall-off. Dist Mix diff --git a/src/firefly_synth/firefly_synth/lfo.cpp b/src/firefly_synth/firefly_synth/lfo.cpp index b1ebb5298..c94a8061a 100644 --- a/src/firefly_synth/firefly_synth/lfo.cpp +++ b/src/firefly_synth/firefly_synth/lfo.cpp @@ -412,7 +412,7 @@ lfo_topo(int section, gui_position const& pos, bool global, bool is_fx) make_param_dsp_automate_if_voice(!global), make_domain_item(type_items(), ""), make_param_gui_single(section_left, gui_edit_type::list, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - type.info.description = std::string("Selects time or tempo-synced and repeating or one-shot type. ") + + type.info.description = std::string("Selects repeating or one-shot type. ") + "For regular one-shot type, the LFO stays at it's end value after exactly 1 cycle. " + "For phase one-shot type, the end value takes the phase offset parameter into account."; auto& rate = result.params.emplace_back(make_param( @@ -490,9 +490,7 @@ lfo_topo(int section, gui_position const& pos, bool global, bool is_fx) make_param_gui_single(section_shape, gui_edit_type::autofit_list, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); shape.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] != type_off; }); - shape.info.description = std::string("Selects waveform plus horizontal and vertical skewing modes. ") + - "Waveforms are various periodic functions plus smooth noise, static noise and free-running static noise. " + - "Skewing modes are off (cpu efficient, so use it if you dont need the extra control), linear, scale unipolar/bipolar and exponential unipolar/bipolar."; + shape.info.description = std::string("Selects waveform: various periodic functions plus smooth noise, static noise and free-running static noise."); auto& steps = result.params.emplace_back(make_param( make_topo_info_basic("{445CF696-0364-4638-9BD5-3E1C9A957B6A}", "Steps", param_steps, 1), make_param_dsp_automate_if_voice(!global), make_domain_step(1, 99, 1, 0), From 9e2103b9a11e10c6917951aa57684406095246f2 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 22:10:47 +0200 Subject: [PATCH 08/61] take 7 --- changelog.md | 8 +++++++- param_reference.html | 12 ++++++------ src/firefly_synth/firefly_synth/lfo.cpp | 10 +++++----- todo.txt | 1 + 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/changelog.md b/changelog.md index ae5d8d239..21a673405 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,9 @@ +?, ? + +- Fixed a couple of outdated parameter descriptions. +- Show parameter descriptions (from reference document) in tooltips. + + ### October 9, 2024 - V1.9.5. - Added arpeggiator (see manual). @@ -11,7 +17,7 @@ - Added dark themes. ### September 21, 2024 - V1.9.3. - + - Added free-running smooth noise as a new LFO type. Note - consecutive cycles are not smooth by themselves so you still need to use the LFO filter to get a real smooth signal. - Bugfix in generating random numbers for the per-voice-random cv source (they weren't all that random). - Breaking change: lfo noise generators become phase-based sampling functions to prevent drift. diff --git a/param_reference.html b/param_reference.html index 5cad90472..b914029fe 100644 --- a/param_reference.html +++ b/param_reference.html @@ -61,7 +61,7 @@

Module Overview

Yes Before voice 10 -Optional tempo-synced LFO with repeating and one-shot types, various periodic waveforms, smooth noise, static noise and free-running static noise, smoothing control, phase andjustment, stair-stepping and horizontal and vertical skewing controls with various types. +Optional tempo-synced LFO with repeating and one-shot types, various periodic waveforms, smooth noise, static noise, smoothing control, phase andjustment, stair-stepping and horizontal and vertical skewing controls with various types.
7 @@ -117,7 +117,7 @@

Module Overview

Yes Voice 10 -Optional tempo-synced LFO with repeating and one-shot types, various periodic waveforms, smooth noise, static noise and free-running static noise, smoothing control, phase andjustment, stair-stepping and horizontal and vertical skewing controls with various types. +Optional tempo-synced LFO with repeating and one-shot types, various periodic waveforms, smooth noise, static noise, smoothing control, phase andjustment, stair-stepping and horizontal and vertical skewing controls with various types. 14 @@ -728,7 +728,7 @@

Global LFO

N/A -Selects waveform: various periodic functions plus smooth noise, static noise and free-running static noise. +Selects waveform: various periodic functions plus smooth and static noise. Steps @@ -799,7 +799,7 @@

Global LFO

Applies a lowpass filter to smooth out rough edges. -Host +Snap To Project Phase Yes Patch @@ -1889,7 +1889,7 @@

Voice LFO

N/A -Selects waveform: various periodic functions plus smooth noise, static noise and free-running static noise. +Selects waveform: various periodic functions plus smooth and static noise. Steps @@ -1960,7 +1960,7 @@

Voice LFO

Applies a lowpass filter to smooth out rough edges. -Phs +Phase Offset Phase Yes Patch diff --git a/src/firefly_synth/firefly_synth/lfo.cpp b/src/firefly_synth/firefly_synth/lfo.cpp index c94a8061a..a73e4a108 100644 --- a/src/firefly_synth/firefly_synth/lfo.cpp +++ b/src/firefly_synth/firefly_synth/lfo.cpp @@ -31,7 +31,7 @@ enum { param_skew_x, param_skew_x_amt, param_skew_y, param_skew_y_amt, param_shape, param_steps, param_seed, param_voice_rnd_source, param_filter, param_phase, // phase offset for voice lfo - param_host = param_phase // sync to host project time for global lfo + param_snap = param_phase // snap to host project time for global lfo }; static bool @@ -385,7 +385,7 @@ lfo_topo(int section, gui_position const& pos, bool global, bool is_fx) module_stage stage = global ? module_stage::input : module_stage::voice; auto info = topo_info(global ? global_info : voice_info); info.description = std::string("Optional tempo-synced LFO with repeating and one-shot types, various periodic waveforms, smooth noise, ") + - "static noise and free-running static noise, smoothing control, phase andjustment, stair-stepping " + + "static noise, smoothing control, phase andjustment, stair-stepping " + "and horizontal and vertical skewing controls with various types."; std::vector column_sizes = { 32, 13, 34, 63 }; @@ -490,7 +490,7 @@ lfo_topo(int section, gui_position const& pos, bool global, bool is_fx) make_param_gui_single(section_shape, gui_edit_type::autofit_list, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); shape.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] != type_off; }); - shape.info.description = std::string("Selects waveform: various periodic functions plus smooth noise, static noise and free-running static noise."); + shape.info.description = std::string("Selects waveform: various periodic functions plus smooth and static noise."); auto& steps = result.params.emplace_back(make_param( make_topo_info_basic("{445CF696-0364-4638-9BD5-3E1C9A957B6A}", "Steps", param_steps, 1), make_param_dsp_automate_if_voice(!global), make_domain_step(1, 99, 1, 0), @@ -530,7 +530,7 @@ lfo_topo(int section, gui_position const& pos, bool global, bool is_fx) if (!global) { auto& phase = result.params.emplace_back(make_param( - make_topo_info_basic("{B23E9732-ECE3-4D5D-8EC1-FF299C6926BB}", "Phs", param_phase, 1), + make_topo_info("{B23E9732-ECE3-4D5D-8EC1-FF299C6926BB}", true, "Phase Offset", "Phs", "Phs", param_phase, 1), make_param_dsp(param_direction::input, param_rate::voice, param_automate::automate), make_domain_percentage_identity(0, 0, true), make_param_gui_single(section_phase_or_host, gui_edit_type::knob, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::top, gui_label_justify::center)))); @@ -540,7 +540,7 @@ lfo_topo(int section, gui_position const& pos, bool global, bool is_fx) else { auto& host = result.params.emplace_back(make_param( - make_topo_info_basic("{B97DF7D3-3259-4343-9577-858C6A5B786B}", "Host", param_host, 1), + make_topo_info("{B97DF7D3-3259-4343-9577-858C6A5B786B}", true, "Snap To Project", "Snp", "Snp", param_snap, 1), make_param_dsp(param_direction::input, param_rate::block, param_automate::automate), make_domain_toggle(true), make_param_gui_single(section_phase_or_host, gui_edit_type::toggle, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::top, gui_label_justify::center)))); diff --git a/todo.txt b/todo.txt index 443fe3948..bf3a7647c 100644 --- a/todo.txt +++ b/todo.txt @@ -27,6 +27,7 @@ autobuilds: * integrate https://github.com/surge-synthesizer/monique-monosynth/blob/main/.github/workflows/build-pr.yml small stuff: +do the conversion for snapping ==> missing = off do the description on tooltip fix the descriptions they are out of date fix the bug demos From 6e7b302530268e717f3a3da89c9e56387afc1c30 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 22:16:38 +0200 Subject: [PATCH 09/61] take 8 --- param_reference.html | 2 +- src/firefly_synth/firefly_synth/voice_in.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/param_reference.html b/param_reference.html index b914029fe..2b447a999 100644 --- a/param_reference.html +++ b/param_reference.html @@ -2163,7 +2163,7 @@

Voice

N/A -Oversampling for those rare cases where it makes a positive difference. Only affects FM and hardsync, but not AM. Oversampling is per unison voice, so setting both this and unison to 8 results in an oscillator being 64 times as expensive to calculate. +Oversampling for those rare cases where it makes a positive difference. Only affects FM and hardsync, but not AM. Oversampling is per osc unison voice, so setting both this and osc unison to 4 results in an oscillator being 16 times as expensive to calculate. Then multiply that by per - voice unison. Porta Tempo Sync diff --git a/src/firefly_synth/firefly_synth/voice_in.cpp b/src/firefly_synth/firefly_synth/voice_in.cpp index f3eb5cbd9..27c62f020 100644 --- a/src/firefly_synth/firefly_synth/voice_in.cpp +++ b/src/firefly_synth/firefly_synth/voice_in.cpp @@ -217,7 +217,8 @@ voice_in_topo(int section, gui_position const& pos) make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); oversmp.info.description = std::string("Oversampling for those rare cases where it makes a positive difference. ") + "Only affects FM and hardsync, but not AM. " + - "Oversampling is per unison voice, so setting both this and unison to 8 results in an oscillator being 64 times as expensive to calculate."; + "Oversampling is per osc unison voice, so setting both this and osc unison to 4 results in an oscillator being 16 times as expensive to calculate. " + + "Then multiply that by global unison."; auto& porta_sync_section = result.sections.emplace_back(make_param_section(section_porta_sync, make_topo_tag_basic("{11E4DE4C-A824-424E-BC5E-014240518C0F}", "Sync"), From 097bd2505a1ba7bc18f11ed82d95545857dc2477 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 22:25:34 +0200 Subject: [PATCH 10/61] take 9 --- param_reference.html | 4 ++-- src/firefly_synth/firefly_synth/oscillator.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/param_reference.html b/param_reference.html index 2b447a999..f0fe96113 100644 --- a/param_reference.html +++ b/param_reference.html @@ -2163,7 +2163,7 @@

Voice

N/A -Oversampling for those rare cases where it makes a positive difference. Only affects FM and hardsync, but not AM. Oversampling is per osc unison voice, so setting both this and osc unison to 4 results in an oscillator being 16 times as expensive to calculate. Then multiply that by per - voice unison. +Oversampling for those rare cases where it makes a positive difference. Only affects FM and hardsync, but not AM. Oversampling is per osc unison voice, so setting both this and osc unison to 4 results in an oscillator being 16 times as expensive to calculate. Then multiply that by global unison. Porta Tempo Sync @@ -2897,7 +2897,7 @@

Osc

N/A -Detune unison voices. Only applicable to Basic and DSF generators. +Detune unison voices. Only applicable to Basic, DSF and KPS generators. Unison Phase diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 5b5dcd134..a17318fae 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -432,7 +432,7 @@ osc_topo(int section, gui_position const& pos) make_param_gui_single(section_sync_uni, gui_edit_type::knob, { 1, 2 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); uni_dtn.gui.bindings.enabled.bind_params({ param_type, param_uni_voices }, [](auto const& vs) { return can_do_pitch(vs[0]) && vs[1] > 1; }); - uni_dtn.info.description = "Detune unison voices. Only applicable to Basic and DSF generators."; + uni_dtn.info.description = "Detune unison voices. Only applicable to Basic, DSF and KPS generators."; auto& uni_phase = result.params.emplace_back(make_param( make_topo_info("{8F1098B6-64F9-407E-A8A3-8C3637D59A26}", true, "Unison Phase", "Phs", "Uni Phase", param_uni_phase, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.5, 0, true), From 0b3659eb285facbc126cf29d5f4df261ea440c24 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 22:43:13 +0200 Subject: [PATCH 11/61] take 10 --- param_reference.html | 6 +++--- src/firefly_synth/firefly_synth/oscillator.cpp | 9 +++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/param_reference.html b/param_reference.html index f0fe96113..32c178d7b 100644 --- a/param_reference.html +++ b/param_reference.html @@ -3152,7 +3152,7 @@

Osc

10.0 % -On-voice-init step count for static noise and initial-excite stage of Karplus-Strong. Modulation takes place only at voice start. +On-voice-init step count for static noise and initial-excite stage of Karplus-Strong. Random Filter Freq @@ -3169,7 +3169,7 @@

Osc

1000 Hz -Continuous filter frequency for static noise or initial-excite filter frequency for Karplus-Strong. Modulation takes place only at voice start. +Continuous filter frequency for static noise or voice-initial-excite filter frequency for Karplus-Strong. Random Filter Reso @@ -3186,7 +3186,7 @@

Osc

N/A -Continuous filter resonance for static noise or initial-excite filter resonance for Karplus-Strong. Modulation takes place only at voice start. +Continuous filter resonance for static noise or voice-initial-excite filter resonance for Karplus-Strong. Rnd Seed diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index a17318fae..155e61061 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -567,24 +567,21 @@ osc_topo(int section, gui_position const& pos) make_param_gui_single(section_rand, gui_edit_type::hslider, { 1, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); random_step.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return is_random(vs[0]); }); - random_step.info.description = std::string("On-voice-init step count for static noise and initial-excite stage of Karplus-Strong. ") + - "Modulation takes place only at voice start."; + random_step.info.description = std::string("On-voice-init step count for static noise and initial-excite stage of Karplus-Strong."); auto& random_freq = result.params.emplace_back(make_param( make_topo_info("{289B4EA4-4A0E-4D33-98BA-7DF475B342E9}", true, "Random Filter Freq", "Freq", "Random Freq", param_rand_freq, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_log(20, 20000, 20000, 1000, 0, "Hz"), make_param_gui_single(section_rand, gui_edit_type::knob, { 0, 2 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); random_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return is_random(vs[0]); }); - random_freq.info.description = std::string("Continuous filter frequency for static noise or initial-excite filter frequency for Karplus-Strong. ") + - "Modulation takes place only at voice start."; + random_freq.info.description = std::string("Continuous filter frequency for static noise or voice-initial-excite filter frequency for Karplus-Strong."); auto& random_res = result.params.emplace_back(make_param( make_topo_info("{3E68ACDC-9800-4A4B-9BB6-984C5A7F624B}", true, "Random Filter Reso", "Reso", "Random Reso", param_rand_res, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0, 0, true), make_param_gui_single(section_rand, gui_edit_type::knob, { 1, 2 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); random_res.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return is_random(vs[0]); }); - random_res.info.description = std::string("Continuous filter resonance for static noise or initial-excite filter resonance for Karplus-Strong. ") + - "Modulation takes place only at voice start."; + random_res.info.description = std::string("Continuous filter resonance for static noise or voice-initial-excite filter resonance for Karplus-Strong."); auto& random_seed = result.params.emplace_back(make_param( make_topo_info("{81873698-DEA9-4541-8E99-FEA21EAA2FEF}", true, "Rnd Seed", "Seed", "Rnd Seed", param_rand_seed, 1), make_param_dsp_voice(param_automate::automate), make_domain_step(1, 255, 1, 0), From 25034b4aebf11d5defede50b03571983b323446d Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 22:48:43 +0200 Subject: [PATCH 12/61] take 11 --- param_reference.html | 2 +- src/firefly_synth/firefly_synth/envelope.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/param_reference.html b/param_reference.html index 32c178d7b..7f52774d9 100644 --- a/param_reference.html +++ b/param_reference.html @@ -1429,7 +1429,7 @@

Env

N/A -Selects envelope slode mode.
Linear - linear slope, most cpu efficient.
Exponential unipolar - regular exponential slope.
Exponential bipolar - vertically splits section in 2 exponential parts.
Exponential split - horizontally and vertically splits section in 2 exponential parts to generate smooth curves. +Selects envelope slope mode.
Linear - linear slope, most cpu efficient.
Exponential unipolar - regular exponential slope.
Exponential bipolar - vertically splits section in 2 exponential parts.
Exponential split - horizontally and vertically splits section in 2 exponential parts to generate smooth curves. Tempo Sync diff --git a/src/firefly_synth/firefly_synth/envelope.cpp b/src/firefly_synth/firefly_synth/envelope.cpp index 05ed4b5f1..18549dfe1 100644 --- a/src/firefly_synth/firefly_synth/envelope.cpp +++ b/src/firefly_synth/firefly_synth/envelope.cpp @@ -363,7 +363,7 @@ env_topo(int section, gui_position const& pos) make_param_gui_single(section_type, gui_edit_type::list, { 1, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); mode.gui.bindings.enabled.bind_params({ param_on }, [](auto const& vs) { return vs[0] != 0; }); - mode.info.description = std::string("Selects envelope slode mode.
") + + mode.info.description = std::string("Selects envelope slope mode.
") + "Linear - linear slope, most cpu efficient.
" + "Exponential unipolar - regular exponential slope.
" + "Exponential bipolar - vertically splits section in 2 exponential parts.
" + From a0c60a43078fbe6b3e5fb3747812d0d21abfe9eb Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 23:00:44 +0200 Subject: [PATCH 13/61] take 12 --- changelog.md | 3 +-- todo.txt | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/changelog.md b/changelog.md index 21a673405..23f7a8ccb 100644 --- a/changelog.md +++ b/changelog.md @@ -3,7 +3,6 @@ - Fixed a couple of outdated parameter descriptions. - Show parameter descriptions (from reference document) in tooltips. - ### October 9, 2024 - V1.9.5. - Added arpeggiator (see manual). @@ -17,7 +16,7 @@ - Added dark themes. ### September 21, 2024 - V1.9.3. - + - Added free-running smooth noise as a new LFO type. Note - consecutive cycles are not smooth by themselves so you still need to use the LFO filter to get a real smooth signal. - Bugfix in generating random numbers for the per-voice-random cv source (they weren't all that random). - Breaking change: lfo noise generators become phase-based sampling functions to prevent drift. diff --git a/todo.txt b/todo.txt index bf3a7647c..d1985492b 100644 --- a/todo.txt +++ b/todo.txt @@ -27,8 +27,9 @@ autobuilds: * integrate https://github.com/surge-synthesizer/monique-monosynth/blob/main/.github/workflows/build-pr.yml small stuff: +V do the description on tooltip + do the conversion for snapping ==> missing = off -do the description on tooltip fix the descriptions they are out of date fix the bug demos make a patch cleanup button From 0e63e506f5a30e6c87d4c60d34541e8ab929d49c Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 23:09:09 +0200 Subject: [PATCH 14/61] take 13 --- todo.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/todo.txt b/todo.txt index d1985492b..0ad95a087 100644 --- a/todo.txt +++ b/todo.txt @@ -29,6 +29,7 @@ autobuilds: small stuff: V do the description on tooltip +update the routing graph for arp do the conversion for snapping ==> missing = off fix the descriptions they are out of date fix the bug demos From fd421155fcb880cf07a77c8b9222f76283f61565 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 23:13:16 +0200 Subject: [PATCH 15/61] take 14 --- todo.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/todo.txt b/todo.txt index 0ad95a087..679bf9c92 100644 --- a/todo.txt +++ b/todo.txt @@ -28,10 +28,10 @@ autobuilds: small stuff: V do the description on tooltip +V fix the descriptions they are out of date update the routing graph for arp do the conversion for snapping ==> missing = off -fix the descriptions they are out of date fix the bug demos make a patch cleanup button do arp and glfo in project time samples (can do now bc all is phased!) From 51ce508f25dc102807bc6c43efd79686a85fdaab Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sat, 12 Oct 2024 23:32:07 +0200 Subject: [PATCH 16/61] take 15 --- src/firefly_synth/firefly_synth/lfo.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/firefly_synth/firefly_synth/lfo.cpp b/src/firefly_synth/firefly_synth/lfo.cpp index a73e4a108..93cb3f7d2 100644 --- a/src/firefly_synth/firefly_synth/lfo.cpp +++ b/src/firefly_synth/firefly_synth/lfo.cpp @@ -388,8 +388,7 @@ lfo_topo(int section, gui_position const& pos, bool global, bool is_fx) "static noise, smoothing control, phase andjustment, stair-stepping " + "and horizontal and vertical skewing controls with various types."; - std::vector column_sizes = { 32, 13, 34, 63 }; - if(!global) column_sizes = { 32, 13, 34, 55, 8 }; + std::vector column_sizes = { 32, 13, 34, 55, 8 }; module_topo result(make_module(info, make_module_dsp(stage, module_output::cv, 1, { make_module_dsp_output(true, -1, make_topo_info_basic("{197CB1D4-8A48-4093-A5E7-2781C731BBFC}", "Output", 0, 1)) }), From 0ee485479e11f3d5832c001482b06860fb78e0e4 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sun, 13 Oct 2024 00:22:00 +0200 Subject: [PATCH 17/61] take 16 --- src/firefly_synth/firefly_synth/lfo.cpp | 137 ++++++++++++++---------- 1 file changed, 79 insertions(+), 58 deletions(-) diff --git a/src/firefly_synth/firefly_synth/lfo.cpp b/src/firefly_synth/firefly_synth/lfo.cpp index 93cb3f7d2..6374fa427 100644 --- a/src/firefly_synth/firefly_synth/lfo.cpp +++ b/src/firefly_synth/firefly_synth/lfo.cpp @@ -137,15 +137,17 @@ public module_engine { void process_uni_type(plugin_block& block, cv_cv_matrix_mixdown const* modulation); template void process_uni_type_sync(plugin_block& block, cv_cv_matrix_mixdown const* modulation); - template - void process_uni_type_sync_shape(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape); - template - void process_uni_type_sync_shape_x(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x); - template - void process_uni_type_sync_shape_xy(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x, SkewY skew_y); - template - void process_uni_type_sync_shape_xy_quantize(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x, SkewY skew_y, Quantize quantize); - template + template + void process_uni_type_sync_snap(plugin_block& block, cv_cv_matrix_mixdown const* modulation); + template + void process_uni_type_sync_snap_shape(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape); + template + void process_uni_type_sync_snap_shape_x(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x); + template + void process_uni_type_sync_snap_shape_xy(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x, SkewY skew_y); + template + void process_uni_type_sync_snap_shape_xy_quantize(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x, SkewY skew_y, Quantize quantize); + template void process_loop(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Calc calc, Quantize quantize); void process_internal(plugin_block& block, cv_cv_matrix_mixdown const* modulation); @@ -810,90 +812,98 @@ lfo_engine::process_uni_type(plugin_block& block, cv_cv_matrix_mixdown const* mo template void lfo_engine::process_uni_type_sync(plugin_block& block, cv_cv_matrix_mixdown const* modulation) +{ + bool snap = block.state.own_block_automation[param_snap][0].step() != 0; + if (_global && snap) process_uni_type_sync_snap(block, modulation); + else process_uni_type_sync_snap(block, modulation); +} + +template void +lfo_engine::process_uni_type_sync_snap(plugin_block& block, cv_cv_matrix_mixdown const* modulation) { int seed = _global ? _prev_global_seed : _per_voice_seed; switch (block.state.own_block_automation[param_shape][0].step()) { - case wave_shape_type_saw: process_uni_type_sync_shape(block, modulation, wave_shape_uni_saw); break; - case wave_shape_type_tri: process_uni_type_sync_shape(block, modulation, wave_shape_uni_tri); break; - case wave_shape_type_sin: process_uni_type_sync_shape(block, modulation, wave_shape_uni_sin); break; - case wave_shape_type_cos: process_uni_type_sync_shape(block, modulation, wave_shape_uni_cos); break; - case wave_shape_type_sqr_or_fold: process_uni_type_sync_shape(block, modulation, wave_shape_uni_sqr); break; - case wave_shape_type_sin_sin: process_uni_type_sync_shape(block, modulation, wave_shape_uni_sin_sin); break; - case wave_shape_type_sin_cos: process_uni_type_sync_shape(block, modulation, wave_shape_uni_sin_cos); break; - case wave_shape_type_cos_sin: process_uni_type_sync_shape(block, modulation, wave_shape_uni_cos_sin); break; - case wave_shape_type_cos_cos: process_uni_type_sync_shape(block, modulation, wave_shape_uni_cos_cos); break; - case wave_shape_type_sin_sin_sin: process_uni_type_sync_shape(block, modulation, wave_shape_uni_sin_sin_sin); break; - case wave_shape_type_sin_sin_cos: process_uni_type_sync_shape(block, modulation, wave_shape_uni_sin_sin_cos); break; - case wave_shape_type_sin_cos_sin: process_uni_type_sync_shape(block, modulation, wave_shape_uni_sin_cos_sin); break; - case wave_shape_type_sin_cos_cos: process_uni_type_sync_shape(block, modulation, wave_shape_uni_sin_cos_cos); break; - case wave_shape_type_cos_sin_sin: process_uni_type_sync_shape(block, modulation, wave_shape_uni_cos_sin_sin); break; - case wave_shape_type_cos_sin_cos: process_uni_type_sync_shape(block, modulation, wave_shape_uni_cos_sin_cos); break; - case wave_shape_type_cos_cos_sin: process_uni_type_sync_shape(block, modulation, wave_shape_uni_cos_cos_sin); break; - case wave_shape_type_cos_cos_cos: process_uni_type_sync_shape(block, modulation, wave_shape_uni_cos_cos_cos); break; - case wave_shape_type_smooth_1: + case wave_shape_type_saw: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_saw); break; + case wave_shape_type_tri: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_tri); break; + case wave_shape_type_sin: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_sin); break; + case wave_shape_type_cos: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_cos); break; + case wave_shape_type_sqr_or_fold: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_sqr); break; + case wave_shape_type_sin_sin: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_sin_sin); break; + case wave_shape_type_sin_cos: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_sin_cos); break; + case wave_shape_type_cos_sin: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_cos_sin); break; + case wave_shape_type_cos_cos: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_cos_cos); break; + case wave_shape_type_sin_sin_sin: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_sin_sin_sin); break; + case wave_shape_type_sin_sin_cos: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_sin_sin_cos); break; + case wave_shape_type_sin_cos_sin: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_sin_cos_sin); break; + case wave_shape_type_sin_cos_cos: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_sin_cos_cos); break; + case wave_shape_type_cos_sin_sin: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_cos_sin_sin); break; + case wave_shape_type_cos_sin_cos: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_cos_sin_cos); break; + case wave_shape_type_cos_cos_sin: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_cos_cos_sin); break; + case wave_shape_type_cos_cos_cos: process_uni_type_sync_snap_shape(block, modulation, wave_shape_uni_cos_cos_cos); break; + case wave_shape_type_smooth_1: case wave_shape_type_smooth_2: case wave_shape_type_smooth_free_1: case wave_shape_type_smooth_free_2: - process_uni_type_sync_shape(block, modulation, [this](float in) { + process_uni_type_sync_snap_shape(block, modulation, [this](float in) { return wave_shape_uni_custom(in, [this](float in) { - return _smooth_noise.at(in); }); }); + return _smooth_noise.at(in); }); }); break; case wave_shape_type_static_1: case wave_shape_type_static_2: case wave_shape_type_static_free_1: case wave_shape_type_static_free_2: - process_uni_type_sync_shape(block, modulation, [this, seed](float in) { + process_uni_type_sync_snap_shape(block, modulation, [this, seed](float in) { return wave_shape_uni_custom(in, [this](float in) { - return _static_noise.at(in); }); }); + return _static_noise.at(in); }); }); break; default: assert(false); break; } } -template void -lfo_engine::process_uni_type_sync_shape(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape) +template void +lfo_engine::process_uni_type_sync_snap_shape(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape) { switch (block.state.own_block_automation[param_skew_x][0].step()) { - case wave_skew_type_off: process_uni_type_sync_shape_x(block, modulation, shape, wave_skew_uni_off); break; - case wave_skew_type_lin: process_uni_type_sync_shape_x(block, modulation, shape, wave_skew_uni_lin); break; - case wave_skew_type_scu: process_uni_type_sync_shape_x(block, modulation, shape, wave_skew_uni_scu); break; - case wave_skew_type_scb: process_uni_type_sync_shape_x(block, modulation, shape, wave_skew_uni_scb); break; - case wave_skew_type_xpu: process_uni_type_sync_shape_x(block, modulation, shape, wave_skew_uni_xpu); break; - case wave_skew_type_xpb: process_uni_type_sync_shape_x(block, modulation, shape, wave_skew_uni_xpb); break; + case wave_skew_type_off: process_uni_type_sync_snap_shape_x(block, modulation, shape, wave_skew_uni_off); break; + case wave_skew_type_lin: process_uni_type_sync_snap_shape_x(block, modulation, shape, wave_skew_uni_lin); break; + case wave_skew_type_scu: process_uni_type_sync_snap_shape_x(block, modulation, shape, wave_skew_uni_scu); break; + case wave_skew_type_scb: process_uni_type_sync_snap_shape_x(block, modulation, shape, wave_skew_uni_scb); break; + case wave_skew_type_xpu: process_uni_type_sync_snap_shape_x(block, modulation, shape, wave_skew_uni_xpu); break; + case wave_skew_type_xpb: process_uni_type_sync_snap_shape_x(block, modulation, shape, wave_skew_uni_xpb); break; default: assert(false); break; } } -template void -lfo_engine::process_uni_type_sync_shape_x(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x) +template void +lfo_engine::process_uni_type_sync_snap_shape_x(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x) { switch (block.state.own_block_automation[param_skew_y][0].step()) { - case wave_skew_type_off: process_uni_type_sync_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_off); break; - case wave_skew_type_lin: process_uni_type_sync_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_lin); break; - case wave_skew_type_scu: process_uni_type_sync_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_scu); break; - case wave_skew_type_scb: process_uni_type_sync_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_scb); break; - case wave_skew_type_xpu: process_uni_type_sync_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_xpu); break; - case wave_skew_type_xpb: process_uni_type_sync_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_xpb); break; + case wave_skew_type_off: process_uni_type_sync_snap_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_off); break; + case wave_skew_type_lin: process_uni_type_sync_snap_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_lin); break; + case wave_skew_type_scu: process_uni_type_sync_snap_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_scu); break; + case wave_skew_type_scb: process_uni_type_sync_snap_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_scb); break; + case wave_skew_type_xpu: process_uni_type_sync_snap_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_xpu); break; + case wave_skew_type_xpb: process_uni_type_sync_snap_shape_xy(block, modulation, shape, skew_x, wave_skew_uni_xpb); break; default: assert(false); break; } } -template void -lfo_engine::process_uni_type_sync_shape_xy(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x, SkewY skew_y) +template void +lfo_engine::process_uni_type_sync_snap_shape_xy(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x, SkewY skew_y) { auto const& block_auto = block.state.own_block_automation; int shaper = block_auto[param_shape][0].step(); int step = block_auto[param_steps][0].step(); bool quantize = !is_noise(shaper) && step != 1; - if(quantize) process_uni_type_sync_shape_xy_quantize(block, modulation, shape, skew_x, skew_y, lfo_quantize); - else process_uni_type_sync_shape_xy_quantize(block, modulation, shape, skew_x, skew_y, [](float in, int st) { return in; }); + if(quantize) process_uni_type_sync_snap_shape_xy_quantize(block, modulation, shape, skew_x, skew_y, lfo_quantize); + else process_uni_type_sync_snap_shape_xy_quantize(block, modulation, shape, skew_x, skew_y, [](float in, int st) { return in; }); } -template void -lfo_engine::process_uni_type_sync_shape_xy_quantize(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x, SkewY skew_y, Quantize quantize) +template void +lfo_engine::process_uni_type_sync_snap_shape_xy_quantize(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Shape shape, SkewX skew_x, SkewY skew_y, Quantize quantize) { auto const& block_auto = block.state.own_block_automation; int sx = block_auto[param_skew_x][0].step(); @@ -905,21 +915,21 @@ lfo_engine::process_uni_type_sync_shape_xy_quantize(plugin_block& block, cv_cv_m { auto processor = [skew_x, skew_y, shape](float in, float x, float y) { return wave_calc_uni(in, x, y, shape, skew_x, skew_y); }; - process_loop(block, modulation, processor, quantize); + process_loop(block, modulation, processor, quantize); } else if (!x_is_exp && y_is_exp) { auto processor = [skew_x, skew_y, shape](float in, float x, float y) { float py = std::log(0.001 + (y * 0.999)) / log_half; return wave_calc_uni(in, x, py, shape, skew_x, skew_y); }; - process_loop(block, modulation, processor, quantize); + process_loop(block, modulation, processor, quantize); } else if (x_is_exp && !y_is_exp) { auto processor = [skew_x, skew_y, shape](float in, float x, float y) { float px = std::log(0.001 + (x * 0.999)) / log_half; return wave_calc_uni(in, px, y, shape, skew_x, skew_y); }; - process_loop(block, modulation, processor, quantize); + process_loop(block, modulation, processor, quantize); } else { @@ -927,11 +937,11 @@ lfo_engine::process_uni_type_sync_shape_xy_quantize(plugin_block& block, cv_cv_m float px = std::log(0.001 + (x * 0.999)) / log_half; float py = std::log(0.001 + (y * 0.999)) / log_half; return wave_calc_uni(in, px, py, shape, skew_x, skew_y); }; - process_loop(block, modulation, processor, quantize); + process_loop(block, modulation, processor, quantize); } } -template +template void lfo_engine::process_loop(plugin_block& block, cv_cv_matrix_mixdown const* modulation, Calc calc, Quantize quantize) { int this_module = _global ? module_glfo : module_vlfo; @@ -962,6 +972,17 @@ void lfo_engine::process_loop(plugin_block& block, cv_cv_matrix_mixdown const* m rate_curve[f] *= 1 + (voice_pos * glob_uni_lfo_dtn_curve[f]); } + // reset phase to project time for glfo + if constexpr (Snap) + { + // Rate can go zero by modulation. + float rate0 = std::max(rate_curve[block.start_frame], 1.0f); + std::int64_t samples0 = (std::int64_t)(block.sample_rate / rate0); + std::int64_t phase_frames = block.host.project_time % samples0; + _ref_phase = phase_frames / (float)samples0; + _phase = _ref_phase; + } + for (int f = block.start_frame; f < block.end_frame; f++) { if (_stage == lfo_stage::end) From 9639bb8412b4e1b68579eaa4132a87f4978f917d Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sun, 13 Oct 2024 00:32:53 +0200 Subject: [PATCH 18/61] take 17 --- src/firefly_synth/firefly_synth/lfo.cpp | 4 ++-- todo.txt | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/firefly_synth/firefly_synth/lfo.cpp b/src/firefly_synth/firefly_synth/lfo.cpp index 6374fa427..12af237a8 100644 --- a/src/firefly_synth/firefly_synth/lfo.cpp +++ b/src/firefly_synth/firefly_synth/lfo.cpp @@ -542,11 +542,11 @@ lfo_topo(int section, gui_position const& pos, bool global, bool is_fx) { auto& host = result.params.emplace_back(make_param( make_topo_info("{B97DF7D3-3259-4343-9577-858C6A5B786B}", true, "Snap To Project", "Snp", "Snp", param_snap, 1), - make_param_dsp(param_direction::input, param_rate::block, param_automate::automate), make_domain_toggle(true), + make_param_dsp(param_direction::input, param_rate::block, param_automate::automate), make_domain_toggle(false), make_param_gui_single(section_phase_or_host, gui_edit_type::toggle, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::top, gui_label_justify::center)))); host.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] != type_off; }); - host.info.description = "In global module, snaps lfo phase to project/song time."; + host.info.description = "In global module, snaps lfo phase to project/song time. Note this defeats rate modulation!"; } return result; diff --git a/todo.txt b/todo.txt index 679bf9c92..9d95ea170 100644 --- a/todo.txt +++ b/todo.txt @@ -29,9 +29,10 @@ autobuilds: small stuff: V do the description on tooltip V fix the descriptions they are out of date +X do the conversion for snapping ==> missing = off update the routing graph for arp -do the conversion for snapping ==> missing = off +do global snap docs fix the bug demos make a patch cleanup button do arp and glfo in project time samples (can do now bc all is phased!) From a4637574bb52a874d30746b61988f1ab6127dbc5 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sun, 13 Oct 2024 00:33:40 +0200 Subject: [PATCH 19/61] take 18 --- todo.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/todo.txt b/todo.txt index 9d95ea170..851079c32 100644 --- a/todo.txt +++ b/todo.txt @@ -30,6 +30,7 @@ small stuff: V do the description on tooltip V fix the descriptions they are out of date X do the conversion for snapping ==> missing = off +X global unit lfo phase offset not plot good update the routing graph for arp do global snap docs @@ -41,7 +42,6 @@ arp new note = reset table pos yes/no? do more keyboard tracking just do it -- also trackmode mul/add do global unison subvoice index as a mod source turn on stuff when dragging (e.g. basic sin, dist skew etc) -global unit lfo phase offset not plot good wishlist: use fftw From cdc4deb1de328ae0df41f1d4b40bc25b94a52a22 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sun, 13 Oct 2024 00:35:15 +0200 Subject: [PATCH 20/61] take 19 --- changelog.md | 1 + param_reference.html | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/changelog.md b/changelog.md index 23f7a8ccb..86e3f6615 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ - Fixed a couple of outdated parameter descriptions. - Show parameter descriptions (from reference document) in tooltips. +- Optionally allow global LFO's to sync to DAW project time (does NOT work with rate modulation, i.e. causes full phase reset). ### October 9, 2024 - V1.9.5. diff --git a/param_reference.html b/param_reference.html index 7f52774d9..bbaa81a5a 100644 --- a/param_reference.html +++ b/param_reference.html @@ -809,11 +809,11 @@

Global LFO

Automate Off On -On +Off N/A -In global module, snaps lfo phase to project/song time. +In global module, snaps lfo phase to project/song time. Note this defeats rate modulation! From c47494fae3d3ea338a3203fc8f04bde2e54e077d Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sun, 13 Oct 2024 00:50:26 +0200 Subject: [PATCH 21/61] take 20 --- src/firefly_synth/firefly_synth/lfo.cpp | 19 +++++++++++++------ todo.txt | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/firefly_synth/firefly_synth/lfo.cpp b/src/firefly_synth/firefly_synth/lfo.cpp index 12af237a8..b34b30f6d 100644 --- a/src/firefly_synth/firefly_synth/lfo.cpp +++ b/src/firefly_synth/firefly_synth/lfo.cpp @@ -975,12 +975,19 @@ void lfo_engine::process_loop(plugin_block& block, cv_cv_matrix_mixdown const* m // reset phase to project time for glfo if constexpr (Snap) { - // Rate can go zero by modulation. - float rate0 = std::max(rate_curve[block.start_frame], 1.0f); - std::int64_t samples0 = (std::int64_t)(block.sample_rate / rate0); - std::int64_t phase_frames = block.host.project_time % samples0; - _ref_phase = phase_frames / (float)samples0; - _phase = _ref_phase; + // graph block always starts at 0 + if (!block.graph) + { + // Rate can go zero by modulation. + float rate0 = rate_curve[block.start_frame]; + if (rate0 > 0.0f) + { + std::int64_t samples0 = (std::int64_t)(block.sample_rate / rate0); + std::int64_t phase_frames = block.host.project_time % samples0; + _ref_phase = phase_frames / (float)samples0; + _phase = _ref_phase; + } + } } for (int f = block.start_frame; f < block.end_frame; f++) diff --git a/todo.txt b/todo.txt index 851079c32..091b8902f 100644 --- a/todo.txt +++ b/todo.txt @@ -33,7 +33,7 @@ X do the conversion for snapping ==> missing = off X global unit lfo phase offset not plot good update the routing graph for arp -do global snap docs +do global snap docs? fix the bug demos make a patch cleanup button do arp and glfo in project time samples (can do now bc all is phased!) From c71ef6de6b7fb512c6eeb110bab43ed505d48791 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sun, 13 Oct 2024 01:11:07 +0200 Subject: [PATCH 22/61] take 21 --- todo.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/todo.txt b/todo.txt index 091b8902f..42aff8f0c 100644 --- a/todo.txt +++ b/todo.txt @@ -34,6 +34,7 @@ X global unit lfo phase offset not plot good update the routing graph for arp do global snap docs? +do snap for clap and arp fix the bug demos make a patch cleanup button do arp and glfo in project time samples (can do now bc all is phased!) From cfde39e0dabae84a56a4a0fe62a8db3470e3bb51 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sun, 13 Oct 2024 17:35:35 +0200 Subject: [PATCH 23/61] take 22 --- .../plugin_base.clap/plugin_base.clap/pb_plugin.cpp | 10 ++++++++-- plugin_base/src/plugin_base/plugin_base/dsp/engine.hpp | 1 + .../src/plugin_base/plugin_base/dsp/splice_engine.hpp | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/plugin_base/src/plugin_base.clap/plugin_base.clap/pb_plugin.cpp b/plugin_base/src/plugin_base.clap/plugin_base.clap/pb_plugin.cpp index 5e5398afa..3fd90ddc3 100644 --- a/plugin_base/src/plugin_base.clap/plugin_base.clap/pb_plugin.cpp +++ b/plugin_base/src/plugin_base.clap/plugin_base.clap/pb_plugin.cpp @@ -656,10 +656,16 @@ pb_plugin::process(clap_process const* process) noexcept block.mts_client = _mts_client; block.frame_count = process->frames_count; block.audio_out = process->audio_outputs[0].data32; - block.shared.project_time = 0; // TODO figure this out. - block.shared.bpm = process->transport? process->transport->tempo: 0; block.shared.audio_in = process->audio_inputs? process->audio_inputs[0].data32: nullptr; + block.shared.bpm = 0; + block.shared.project_time = 0; + if (process->transport != nullptr) + { + block.shared.bpm = process->transport->tempo; + block.shared.project_time = (std::int64_t)std::round((double)process->transport->song_pos_seconds / (double)CLAP_SECTIME_FACTOR * _splice_engine.get_sample_rate()); + } + process_gui_to_audio_events(process->out_events); // make sure we only push per-block events at most 1 time diff --git a/plugin_base/src/plugin_base/plugin_base/dsp/engine.hpp b/plugin_base/src/plugin_base/plugin_base/dsp/engine.hpp index 3dd7ba00c..a81ddd412 100644 --- a/plugin_base/src/plugin_base/plugin_base/dsp/engine.hpp +++ b/plugin_base/src/plugin_base/plugin_base/dsp/engine.hpp @@ -201,6 +201,7 @@ class plugin_engine final { void activate(int max_frame_count); void init_from_state(plugin_state const* state); + int get_sample_rate() const { return _sample_rate; } void set_sample_rate(int sample_rate) { _sample_rate = sample_rate; } void mark_param_as_automated(int m, int mi, int p, int pi) { _param_was_automated[m][mi][p][pi] = 1; } }; diff --git a/plugin_base/src/plugin_base/plugin_base/dsp/splice_engine.hpp b/plugin_base/src/plugin_base/plugin_base/dsp/splice_engine.hpp index 81513d7e8..a03e59751 100644 --- a/plugin_base/src/plugin_base/plugin_base/dsp/splice_engine.hpp +++ b/plugin_base/src/plugin_base/plugin_base/dsp/splice_engine.hpp @@ -34,6 +34,8 @@ class plugin_splice_engine final { void release_block() {} void activate_modules() { _engine.activate_modules(); } void automation_state_dirty() { _engine.automation_state_dirty(); } + + int get_sample_rate() const { return _engine.get_sample_rate(); } void set_sample_rate(int sample_rate) { _engine.set_sample_rate(sample_rate); } void process_voice(int v, bool threaded) { _engine.process_voice(v, threaded); } void mark_param_as_automated(int m, int mi, int p, int pi) { _engine.mark_param_as_automated(m, mi, p, pi); } From 5eb77c0dee80dfbc8be0bb21b4f758a8b2f33fe0 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Sun, 13 Oct 2024 17:44:00 +0200 Subject: [PATCH 24/61] take 23 --- todo.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/todo.txt b/todo.txt index 42aff8f0c..6433ef4d7 100644 --- a/todo.txt +++ b/todo.txt @@ -31,13 +31,14 @@ V do the description on tooltip V fix the descriptions they are out of date X do the conversion for snapping ==> missing = off X global unit lfo phase offset not plot good +V do glfo in project time samples (can do now bc all is phased!) +V do snap for clap update the routing graph for arp do global snap docs? -do snap for clap and arp fix the bug demos make a patch cleanup button -do arp and glfo in project time samples (can do now bc all is phased!) + ditch after-mod, claim micro support ? arp new note = reset table pos yes/no? do more keyboard tracking just do it -- also trackmode mul/add From 32ed465ef3788f11abfc9e94c7b2c1510d4966b5 Mon Sep 17 00:00:00 2001 From: ofsjoerdk Date: Mon, 14 Oct 2024 19:39:05 +0200 Subject: [PATCH 25/61] take 24 temp tryout basic2 take 1 --- .../firefly_synth/oscillator.cpp | 305 ++++++++++-------- 1 file changed, 163 insertions(+), 142 deletions(-) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 155e61061..7c0997fe0 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -18,20 +18,21 @@ namespace firefly_synth { static float const max_phase_mod = 0.1f; -enum { type_off, type_basic, type_dsf, type_kps1, type_kps2, type_static }; +enum { type_off, type_basic1, type_basic2, type_dsf, type_kps1, type_kps2, type_static }; enum { rand_svf_lpf, rand_svf_hpf, rand_svf_bpf, rand_svf_bsf, rand_svf_peq }; -enum { section_type, section_sync_on, section_sync_uni, section_basic, section_basic_pw, section_dsf, section_rand }; +enum { section_type, section_sync_on, section_sync_uni, section_basic1, section_basic1_pw, section_basic2, section_dsf, section_rand }; enum { scratch_pb, scratch_cent, scratch_pitch, scratch_sync_semi, - scratch_basic_sin_mix, scratch_basic_saw_mix, scratch_basic_tri_mix, scratch_basic_sqr_mix, - scratch_rand_freq, scratch_rand_rate, scratch_count }; + scratch_basic1_sin_mix, scratch_basic1_saw_mix, scratch_basic1_tri_mix, scratch_basic1_sqr_mix, + scratch_rand_freq, scratch_rand_rate, scratch_count }; // todo overlap scratch space enum { param_type, param_gain, param_note, param_cent, param_hard_sync, param_hard_sync_semis, param_hard_sync_xover, param_uni_voices, param_uni_sprd, param_uni_dtn, param_uni_phase, - param_basic_sin_on, param_basic_sin_mix, param_basic_saw_on, param_basic_saw_mix, - param_basic_tri_on, param_basic_tri_mix, param_basic_sqr_on, param_basic_sqr_mix, param_basic_sqr_pw, + param_basic1_sin_on, param_basic1_sin_mix, param_basic1_saw_on, param_basic1_saw_mix, + param_basic1_tri_on, param_basic1_tri_mix, param_basic1_sqr_on, param_basic1_sqr_mix, param_basic1_sqr_pw, + param_basic2_wave1, param_basic2_wave2, param_basic2_freq, param_basic2_amp, param_basic2_skew_x, param_basic2_skew_y, param_dsf_parts, param_dsf_dist, param_dsf_dcy, param_rand_svf, param_rand_rate, param_rand_freq, param_rand_res, param_rand_seed, // shared k+s/noise param_kps_fdbk, param_kps_mid, param_kps_stretch, @@ -46,9 +47,9 @@ static bool constexpr is_kps(int type) static bool constexpr is_random(int type) { return type == type_static || is_kps(type); } static bool can_do_phase(int type) -{ return type == type_basic || type == type_dsf; } +{ return type == type_basic1 || type == type_basic2 || type == type_dsf; } static bool can_do_pitch(int type) -{ return type == type_basic || type == type_dsf || is_kps(type); } +{ return type == type_basic1 || type == type_basic2 || type == type_dsf || is_kps(type); } // bit different for osci and lfo // lfo is bucket based but for this one we'd need up to SR/2 buckets @@ -102,12 +103,24 @@ get_oversmp_info(plugin_block const& block, int& stages, int& factor) } } +static std::vector +basic2_wave_items() +{ + std::vector result; + result.emplace_back("{B52E7D25-CADD-4075-BDC8-AB5298F53784}", "Sin"); + result.emplace_back("{B3E1E560-EBDB-4E3D-827E-DE5A83B6EA6C}", "Saw"); + result.emplace_back("{994FFDF7-98B4-46EA-B33A-48027E8611B1}", "Tri"); + result.emplace_back("{09474479-189A-4D0E-95D9-C0DD08753C44}", "Sqr"); + return result; +} + static std::vector type_items() { std::vector result; result.emplace_back("{9C9FFCAD-09A5-49E6-A083-482C8A3CF20B}", "Off", "Off"); - result.emplace_back("{9185A6F4-F9EF-4A33-8462-1B02A25FDF29}", "Basic", "Basic Analog"); + result.emplace_back("{9185A6F4-F9EF-4A33-8462-1B02A25FDF29}", "Basic 1", "Basic Analog 1"); + result.emplace_back("{0E9AD9BB-9C57-4333-84DC-A888E755C2AD}", "Basic 2", "Basic Analog 2"); result.emplace_back("{5DDB5617-85CC-4BE7-8295-63184BA56191}", "DSF", "Discrete Summation Formulae"); result.emplace_back("{E6814747-6CEE-47DA-9878-890D0A5DC5C7}", "K+S1", "Karplus-Strong"); result.emplace_back("{43DC7825-E437-4792-88D5-6E76241493A1}", "K+S2", "Karplus-Strong With Midpoint Adjustment"); @@ -185,40 +198,40 @@ public module_engine { float generate_kps(int voice, float sr, float freq, float fdbk, float stretch, float mid_freq); template void process_dsf(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template void process_basic(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template void process_basic1(plugin_block& block, cv_audio_matrix_mixdown const* modulation); template void process_static(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template void - process_basic_sin(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template - void process_basic_sin_saw(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template - void process_basic_sin_saw_tri(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template - void process_basic_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template + template void + process_basic1_sin(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template + void process_basic1_sin_saw(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template + void process_basic1_sin_saw_tri(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template + void process_basic1_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template void process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template + template void process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixdown const* modulation); }; static void init_minimal(plugin_state& state) { - state.set_text_at(module_osc, 0, param_type, 0, "Basic"); + state.set_text_at(module_osc, 0, param_type, 0, "Basic 1"); } static void init_default(plugin_state& state) { state.set_text_at(module_osc, 0, param_cent, 0, "-10"); - state.set_text_at(module_osc, 0, param_type, 0, "Basic"); - state.set_text_at(module_osc, 0, param_basic_sin_on, 0, "Off"); - state.set_text_at(module_osc, 0, param_basic_saw_on, 0, "On"); + state.set_text_at(module_osc, 0, param_type, 0, "Basic 1"); + state.set_text_at(module_osc, 0, param_basic1_sin_on, 0, "Off"); + state.set_text_at(module_osc, 0, param_basic1_saw_on, 0, "On"); state.set_text_at(module_osc, 1, param_cent, 0, "+10"); - state.set_text_at(module_osc, 1, param_type, 0, "Basic"); - state.set_text_at(module_osc, 1, param_basic_sin_on, 0, "Off"); - state.set_text_at(module_osc, 1, param_basic_saw_on, 0, "On"); + state.set_text_at(module_osc, 1, param_type, 0, "Basic 1"); + state.set_text_at(module_osc, 1, param_basic1_sin_on, 0, "Off"); + state.set_text_at(module_osc, 1, param_basic1_saw_on, 0, "On"); } static std::unique_ptr @@ -349,7 +362,8 @@ osc_topo(int section, gui_position const& pos) make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); type.gui.submenu = std::make_shared(); type.gui.submenu->indices.push_back(type_off); - type.gui.submenu->indices.push_back(type_basic); + type.gui.submenu->indices.push_back(type_basic1); + type.gui.submenu->indices.push_back(type_basic2); type.gui.submenu->indices.push_back(type_dsf); type.gui.submenu->indices.push_back(type_static); type.gui.submenu->add_submenu("Karplus-Strong", { type_kps1, type_kps2 }); @@ -441,84 +455,84 @@ osc_topo(int section, gui_position const& pos) uni_phase.gui.bindings.enabled.bind_params({ param_type, param_uni_voices }, [](auto const& vs) { return can_do_phase(vs[0]) && vs[1] > 1; }); uni_phase.info.description = "Phase offset for subsequent voices, to get that unison effect 'right from the start'. Only applicable to Basic and DSF generators."; - auto& basic = result.sections.emplace_back(make_param_section(section_basic, - make_topo_tag_basic("{8E776EAB-DAC7-48D6-8C41-29214E338693}", "Basic"), + auto& basic1 = result.sections.emplace_back(make_param_section(section_basic1, + make_topo_tag_basic("{8E776EAB-DAC7-48D6-8C41-29214E338693}", "Basic 1"), make_param_section_gui({ 0, 4, 2, 1 }, gui_dimension({ 1, 1 }, { gui_dimension::auto_size_all, gui_dimension::auto_size_all, 1, gui_dimension::auto_size_all, gui_dimension::auto_size_all, 1 }), gui_label_edit_cell_split::horizontal))); - basic.gui.merge_with_section = section_basic_pw; - basic.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); - basic.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_off || vs[0] == type_basic; }); - auto& basic_sin_on = result.params.emplace_back(make_param( - make_topo_info("{BD753E3C-B84E-4185-95D1-66EA3B27C76B}", true, "Basic Sin On", "Sin", "Basic Sin", param_basic_sin_on, 1), + basic1.gui.merge_with_section = section_basic1_pw; + basic1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); + basic1.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_off || vs[0] == type_basic1; }); + auto& basic1_sin_on = result.params.emplace_back(make_param( + make_topo_info("{BD753E3C-B84E-4185-95D1-66EA3B27C76B}", true, "Basic Sin On", "Sin", "Basic Sin", param_basic1_sin_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(true), - make_param_gui_single(section_basic, gui_edit_type::toggle, { 0, 0 }, + make_param_gui_single(section_basic1, gui_edit_type::toggle, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic_sin_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); - basic_sin_on.info.description = "Toggle sine generator on/off."; - auto& basic_sin_mix = result.params.emplace_back(make_param( - make_topo_info("{60FAAC91-7F69-4804-AC8B-2C7E6F3E4238}", true, "Basic Sin Mix", "Sin", "Basic Sin Mix", param_basic_sin_mix, 1), + basic1_sin_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); + basic1_sin_on.info.description = "Toggle sine generator on/off."; + auto& basic1_sin_mix = result.params.emplace_back(make_param( + make_topo_info("{60FAAC91-7F69-4804-AC8B-2C7E6F3E4238}", true, "Basic Sin Mix", "Sin", "Basic Sin Mix", param_basic1_sin_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), - make_param_gui_single(section_basic, gui_edit_type::hslider, { 0, 2 }, make_label_none()))); - basic_sin_mix.gui.bindings.enabled.bind_params({ param_type, param_basic_sin_on }, [](auto const& vs) { return vs[0] == type_basic && vs[1] != 0; }); - basic_sin_mix.info.description = "Sine generator mix amount."; - basic_sin_on.gui.alternate_drag_param_id = basic_sin_mix.info.tag.id; - auto& basic_saw_on = result.params.emplace_back(make_param( - make_topo_info("{A31C1E92-E7FF-410F-8466-7AC235A95BDB}", true, "Basic Saw On", "Saw", "Basic Saw", param_basic_saw_on, 1), + make_param_gui_single(section_basic1, gui_edit_type::hslider, { 0, 2 }, make_label_none()))); + basic1_sin_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_sin_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); + basic1_sin_mix.info.description = "Sine generator mix amount."; + basic1_sin_on.gui.alternate_drag_param_id = basic1_sin_mix.info.tag.id; + auto& basic1_saw_on = result.params.emplace_back(make_param( + make_topo_info("{A31C1E92-E7FF-410F-8466-7AC235A95BDB}", true, "Basic Saw On", "Saw", "Basic Saw", param_basic1_saw_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(false), - make_param_gui_single(section_basic, gui_edit_type::toggle, { 0, 3 }, + make_param_gui_single(section_basic1, gui_edit_type::toggle, { 0, 3 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic_saw_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); - basic_saw_on.info.description = "Toggle saw generator on/off."; - auto& basic_saw_mix = result.params.emplace_back(make_param( - make_topo_info("{A459839C-F78E-4871-8494-6D524F00D0CE}", true, "Basic Saw Mix", "Saw", "Basic Saw Mix", param_basic_saw_mix, 1), + basic1_saw_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); + basic1_saw_on.info.description = "Toggle saw generator on/off."; + auto& basic1_saw_mix = result.params.emplace_back(make_param( + make_topo_info("{A459839C-F78E-4871-8494-6D524F00D0CE}", true, "Basic Saw Mix", "Saw", "Basic Saw Mix", param_basic1_saw_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), - make_param_gui_single(section_basic, gui_edit_type::hslider, { 0, 5 }, make_label_none()))); - basic_saw_mix.gui.bindings.enabled.bind_params({ param_type, param_basic_saw_on }, [](auto const& vs) { return vs[0] == type_basic && vs[1] != 0; }); - basic_saw_mix.info.description = "Saw generator mix amount."; - basic_saw_on.gui.alternate_drag_param_id = basic_saw_mix.info.tag.id; - auto& basic_tri_on = result.params.emplace_back(make_param( - make_topo_info("{F2B92036-ED14-4D88-AFE3-B83C1AAE5E76}", true, "Basic Tri On", "Tri", "Basic Tri", param_basic_tri_on, 1), + make_param_gui_single(section_basic1, gui_edit_type::hslider, { 0, 5 }, make_label_none()))); + basic1_saw_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_saw_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); + basic1_saw_mix.info.description = "Saw generator mix amount."; + basic1_saw_on.gui.alternate_drag_param_id = basic1_saw_mix.info.tag.id; + auto& basic1_tri_on = result.params.emplace_back(make_param( + make_topo_info("{F2B92036-ED14-4D88-AFE3-B83C1AAE5E76}", true, "Basic Tri On", "Tri", "Basic Tri", param_basic1_tri_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(false), - make_param_gui_single(section_basic, gui_edit_type::toggle, { 1, 0 }, + make_param_gui_single(section_basic1, gui_edit_type::toggle, { 1, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic_tri_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); - basic_tri_on.info.description = "Toggle triangle generator on/off."; - auto& basic_tri_mix = result.params.emplace_back(make_param( - make_topo_info("{88F88506-5916-4668-BD8B-5C35D01D1147}", true, "Basic Tri Mix", "Tri", "Basic Tri Mix", param_basic_tri_mix, 1), + basic1_tri_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); + basic1_tri_on.info.description = "Toggle triangle generator on/off."; + auto& basic1_tri_mix = result.params.emplace_back(make_param( + make_topo_info("{88F88506-5916-4668-BD8B-5C35D01D1147}", true, "Basic Tri Mix", "Tri", "Basic Tri Mix", param_basic1_tri_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), - make_param_gui_single(section_basic, gui_edit_type::hslider, { 1, 2 }, make_label_none()))); - basic_tri_mix.gui.bindings.enabled.bind_params({ param_type, param_basic_tri_on }, [](auto const& vs) { return vs[0] == type_basic && vs[1] != 0; }); - basic_tri_mix.info.description = "Triangle generator mix amount."; - basic_tri_on.gui.alternate_drag_param_id = basic_tri_mix.info.tag.id; - auto& basic_sqr_on = result.params.emplace_back(make_param( - make_topo_info("{C3AF1917-64FD-481B-9C21-3FE6F8D039C4}", true, "Basic Sqr On", "Sqr", "Basic Sqr", param_basic_sqr_on, 1), + make_param_gui_single(section_basic1, gui_edit_type::hslider, { 1, 2 }, make_label_none()))); + basic1_tri_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_tri_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); + basic1_tri_mix.info.description = "Triangle generator mix amount."; + basic1_tri_on.gui.alternate_drag_param_id = basic1_tri_mix.info.tag.id; + auto& basic1_sqr_on = result.params.emplace_back(make_param( + make_topo_info("{C3AF1917-64FD-481B-9C21-3FE6F8D039C4}", true, "Basic Sqr On", "Sqr", "Basic Sqr", param_basic1_sqr_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(false), - make_param_gui_single(section_basic, gui_edit_type::toggle, { 1, 3 }, + make_param_gui_single(section_basic1, gui_edit_type::toggle, { 1, 3 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic_sqr_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); - basic_sqr_on.info.description = "Toggle square generator on/off."; - auto& basic_sqr_mix = result.params.emplace_back(make_param( - make_topo_info("{B133B0E6-23DC-4B44-AA3B-6D04649271A4}", true, "Basic Sqr Mix", "Sqr", "Basic Sqr Mix", param_basic_sqr_mix, 1), + basic1_sqr_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); + basic1_sqr_on.info.description = "Toggle square generator on/off."; + auto& basic1_sqr_mix = result.params.emplace_back(make_param( + make_topo_info("{B133B0E6-23DC-4B44-AA3B-6D04649271A4}", true, "Basic Sqr Mix", "Sqr", "Basic Sqr Mix", param_basic1_sqr_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), - make_param_gui_single(section_basic, gui_edit_type::hslider, { 1, 5 }, make_label_none()))); - basic_sqr_mix.gui.bindings.enabled.bind_params({ param_type, param_basic_sqr_on }, [](auto const& vs) { return vs[0] == type_basic && vs[1] != 0; }); - basic_sqr_mix.info.description = "Square generator mix amount."; - basic_sqr_on.gui.alternate_drag_param_id = basic_sqr_mix.info.tag.id; + make_param_gui_single(section_basic1, gui_edit_type::hslider, { 1, 5 }, make_label_none()))); + basic1_sqr_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_sqr_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); + basic1_sqr_mix.info.description = "Square generator mix amount."; + basic1_sqr_on.gui.alternate_drag_param_id = basic1_sqr_mix.info.tag.id; - auto& basic_pw = result.sections.emplace_back(make_param_section(section_basic_pw, + auto& basic1_pw = result.sections.emplace_back(make_param_section(section_basic1_pw, make_topo_tag_basic("{93984655-A05F-424D-B3E5-A0C94AF8D0B3}", "Basic PW"), make_param_section_gui({ 0, 5, 2, 1 }, gui_dimension({ 1, 1 }, { 1 }), gui_label_edit_cell_split::vertical))); - basic_pw.gui.merge_with_section = section_basic; - basic_pw.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); - basic_pw.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_off || vs[0] == type_basic; }); - auto& basic_sqr_pw = result.params.emplace_back(make_param( - make_topo_info("{57A231B9-CCC7-4881-885E-3244AE61107C}", true, "Basic Sqr PW", "PW", "Basic PW", param_basic_sqr_pw, 1), + basic1_pw.gui.merge_with_section = section_basic1; + basic1_pw.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); + basic1_pw.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_off || vs[0] == type_basic1; }); + auto& basic1_sqr_pw = result.params.emplace_back(make_param( + make_topo_info("{57A231B9-CCC7-4881-885E-3244AE61107C}", true, "Basic Sqr PW", "PW", "Basic PW", param_basic1_sqr_pw, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(1, 0, true), - make_param_gui_single(section_basic_pw, gui_edit_type::knob, { 0, 0 }, + make_param_gui_single(section_basic1_pw, gui_edit_type::knob, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::top, gui_label_justify::center)))); - basic_sqr_pw.gui.bindings.enabled.bind_params({ param_type, param_basic_sqr_on }, [](auto const& vs) { return vs[0] == type_basic && vs[1] != 0; }); - basic_sqr_pw.info.description = "Square generator pulse width."; + basic1_sqr_pw.gui.bindings.enabled.bind_params({ param_type, param_basic1_sqr_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); + basic1_sqr_pw.info.description = "Square generator pulse width."; auto& dsf = result.sections.emplace_back(make_param_section(section_dsf, make_topo_tag_basic("{F6B06CEA-AF28-4AE2-943E-6225510109A3}", "DSF"), @@ -900,7 +914,8 @@ osc_engine::process(plugin_block& block, cv_audio_matrix_mixdown const* modulati switch (type) { case type_dsf: process_dsf(block, modulation); break; - case type_basic: process_basic(block, modulation); break; + case type_basic1: process_basic1(block, modulation); break; + case type_basic2: break; // TODO case type_static: process_static(block, modulation); break; case type_kps1: process_tuning_mode(block, modulation); break; case type_kps2: process_tuning_mode(block, modulation); break; @@ -934,70 +949,73 @@ osc_engine::process_static(plugin_block& block, cv_audio_matrix_mixdown const* m } template void -osc_engine::process_basic(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +osc_engine::process_basic1(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; - bool sin = block_auto[param_basic_sin_on][0].step(); - if(sin) process_basic_sin(block, modulation); - else process_basic_sin(block, modulation); + bool sin = block_auto[param_basic1_sin_on][0].step(); + if(sin) process_basic1_sin(block, modulation); + else process_basic1_sin(block, modulation); } -template void -osc_engine::process_basic_sin(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +template void +osc_engine::process_basic1_sin(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; - bool saw = block_auto[param_basic_saw_on][0].step(); - if (saw) process_basic_sin_saw(block, modulation); - else process_basic_sin_saw(block, modulation); + bool saw = block_auto[param_basic1_saw_on][0].step(); + if (saw) process_basic1_sin_saw(block, modulation); + else process_basic1_sin_saw(block, modulation); } -template void -osc_engine::process_basic_sin_saw(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +template void +osc_engine::process_basic1_sin_saw(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; - bool tri = block_auto[param_basic_tri_on][0].step(); - if (tri) process_basic_sin_saw_tri(block, modulation); - else process_basic_sin_saw_tri(block, modulation); + bool tri = block_auto[param_basic1_tri_on][0].step(); + if (tri) process_basic1_sin_saw_tri(block, modulation); + else process_basic1_sin_saw_tri(block, modulation); } -template void -osc_engine::process_basic_sin_saw_tri(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +template void +osc_engine::process_basic1_sin_saw_tri(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; - bool sqr = block_auto[param_basic_sqr_on][0].step(); - if (sqr) process_basic_sin_saw_tri_sqr(block, modulation); - else process_basic_sin_saw_tri_sqr(block, modulation); + bool sqr = block_auto[param_basic1_sqr_on][0].step(); + if (sqr) process_basic1_sin_saw_tri_sqr(block, modulation); + else process_basic1_sin_saw_tri_sqr(block, modulation); } -template void -osc_engine::process_basic_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +template void +osc_engine::process_basic1_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; bool sync = block_auto[param_hard_sync][0].step() != 0; - if (sync) process_tuning_mode(block, modulation); - else process_tuning_mode(block, modulation); + if (sync) process_tuning_mode(block, modulation); + else process_tuning_mode(block, modulation); } -template +template < + bool Graph, + bool Basic1Sin, bool Basic1Saw, bool Basic1Tri, bool Basic1Sqr, + bool DSF, bool Sync, bool KPS, bool KPSAutoFdbk, bool Static, int StaticSVFType> void osc_engine::process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { switch (block.current_tuning_mode) { case engine_tuning_mode_no_tuning: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_on_note_before_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_on_note_after_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_continuous_before_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_continuous_after_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; default: assert(false); @@ -1005,15 +1023,18 @@ osc_engine::process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown con } } -template +template < + bool Graph, + bool Basic1Sin, bool Basic1Saw, bool Basic1Tri, bool Basic1Sqr, + bool DSF, bool Sync, bool KPS, bool KPSAutoFdbk, bool Static, int StaticSVFType, engine_tuning_mode TuningMode> void osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { int generator_count = 0; - if constexpr (Sin) generator_count++; - if constexpr (Saw) generator_count++; - if constexpr (Tri) generator_count++; - if constexpr (Sqr) generator_count++; + if constexpr (Basic1Sin) generator_count++; + if constexpr (Basic1Saw) generator_count++; + if constexpr (Basic1Tri) generator_count++; + if constexpr (Basic1Sqr) generator_count++; if constexpr (DSF) generator_count++; if constexpr (KPS) generator_count++; if constexpr (Static) generator_count++; @@ -1062,9 +1083,9 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd auto const& kps_stretch_curve = *(*modulation)[module_osc][block.module_slot][param_kps_stretch][0]; auto const& stc_res_curve = *(*modulation)[module_osc][block.module_slot][param_rand_res][0]; - auto const& pw_curve = *(*modulation)[module_osc][block.module_slot][param_basic_sqr_pw][0]; auto const& uni_dtn_curve = *(*modulation)[module_osc][block.module_slot][param_uni_dtn][0]; auto const& uni_sprd_curve = *(*modulation)[module_osc][block.module_slot][param_uni_sprd][0]; + auto const& basic1_pw_curve = *(*modulation)[module_osc][block.module_slot][param_basic1_sqr_pw][0]; auto const& voice_pitch_offset_curve = block.voice->all_cv[module_voice_in][0][voice_in_output_pitch_offset][0]; auto& pb_curve = block.state.own_scratch[scratch_pb]; @@ -1081,18 +1102,18 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd block.normalized_to_raw_block(module_osc, param_pitch, pitch_curve_norm, pitch_curve); if constexpr(Sync) block.normalized_to_raw_block(module_osc, param_hard_sync_semis, sync_semis_curve_norm, sync_semis_curve); - auto& sin_mix_curve = block.state.own_scratch[scratch_basic_sin_mix]; - auto& saw_mix_curve = block.state.own_scratch[scratch_basic_saw_mix]; - auto& tri_mix_curve = block.state.own_scratch[scratch_basic_tri_mix]; - auto& sqr_mix_curve = block.state.own_scratch[scratch_basic_sqr_mix]; - auto const& sin_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_sin_mix][0]; - auto const& saw_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_saw_mix][0]; - auto const& tri_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_tri_mix][0]; - auto const& sqr_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_sqr_mix][0]; - if constexpr (Sin) block.normalized_to_raw_block(module_osc, param_basic_sin_mix, sin_mix_curve_norm, sin_mix_curve); - if constexpr (Saw) block.normalized_to_raw_block(module_osc, param_basic_saw_mix, saw_mix_curve_norm, saw_mix_curve); - if constexpr (Tri) block.normalized_to_raw_block(module_osc, param_basic_tri_mix, tri_mix_curve_norm, tri_mix_curve); - if constexpr (Sqr) block.normalized_to_raw_block(module_osc, param_basic_sqr_mix, sqr_mix_curve_norm, sqr_mix_curve); + auto& basic1_sin_mix_curve = block.state.own_scratch[scratch_basic1_sin_mix]; + auto& basic1_saw_mix_curve = block.state.own_scratch[scratch_basic1_saw_mix]; + auto& basic1_tri_mix_curve = block.state.own_scratch[scratch_basic1_tri_mix]; + auto& basic1_sqr_mix_curve = block.state.own_scratch[scratch_basic1_sqr_mix]; + auto const& basic1_sin_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic1_sin_mix][0]; + auto const& basic1_saw_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic1_saw_mix][0]; + auto const& basic1_tri_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic1_tri_mix][0]; + auto const& basic1_sqr_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic1_sqr_mix][0]; + if constexpr (Basic1Sin) block.normalized_to_raw_block(module_osc, param_basic1_sin_mix, basic1_sin_mix_curve_norm, basic1_sin_mix_curve); + if constexpr (Basic1Saw) block.normalized_to_raw_block(module_osc, param_basic1_saw_mix, basic1_saw_mix_curve_norm, basic1_saw_mix_curve); + if constexpr (Basic1Tri) block.normalized_to_raw_block(module_osc, param_basic1_tri_mix, basic1_tri_mix_curve_norm, basic1_tri_mix_curve); + if constexpr (Basic1Sqr) block.normalized_to_raw_block(module_osc, param_basic1_sqr_mix, basic1_sqr_mix_curve_norm, basic1_sqr_mix_curve); auto& rand_rate_curve = block.state.own_scratch[scratch_rand_rate]; auto& rand_freq_curve = block.state.own_scratch[scratch_rand_freq]; @@ -1203,10 +1224,10 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd assert(0 <= _sync_phases[v] && _sync_phases[v] < 1); } - if constexpr (Saw) synced_sample += generate_saw(_sync_phases[v], inc_sync) * saw_mix_curve[mod_index]; - if constexpr (Sin) synced_sample += std::sin(2.0f * pi32 * _sync_phases[v]) * sin_mix_curve[mod_index]; - if constexpr (Tri) synced_sample += generate_triangle(_sync_phases[v], inc_sync) * tri_mix_curve[mod_index]; - if constexpr (Sqr) synced_sample += generate_sqr(_sync_phases[v], inc_sync, pw_curve[mod_index]) * sqr_mix_curve[mod_index]; + if constexpr (Basic1Saw) synced_sample += generate_saw(_sync_phases[v], inc_sync) * basic1_saw_mix_curve[mod_index]; + if constexpr (Basic1Sin) synced_sample += std::sin(2.0f * pi32 * _sync_phases[v]) * basic1_sin_mix_curve[mod_index]; + if constexpr (Basic1Tri) synced_sample += generate_triangle(_sync_phases[v], inc_sync) * basic1_tri_mix_curve[mod_index]; + if constexpr (Basic1Sqr) synced_sample += generate_sqr(_sync_phases[v], inc_sync, basic1_pw_curve[mod_index]) * basic1_sqr_mix_curve[mod_index]; if constexpr (DSF) synced_sample = generate_dsf(_sync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); // generate the unsynced sample and crossover @@ -1223,10 +1244,10 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if (_unsync_phases[v] == 1) _unsync_phases[v] = 0; // this could be more efficient? assert(0 <= _unsync_phases[v] && _unsync_phases[v] < 1); - if constexpr (Saw) unsynced_sample += generate_saw(_unsync_phases[v], inc_sync) * saw_mix_curve[mod_index]; - if constexpr (Sin) unsynced_sample += std::sin(2.0f * pi32 * _unsync_phases[v]) * sin_mix_curve[mod_index]; - if constexpr (Tri) unsynced_sample += generate_triangle(_unsync_phases[v], inc_sync) * tri_mix_curve[mod_index]; - if constexpr (Sqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, pw_curve[mod_index]) * sqr_mix_curve[mod_index]; + if constexpr (Basic1Saw) unsynced_sample += generate_saw(_unsync_phases[v], inc_sync) * basic1_saw_mix_curve[mod_index]; + if constexpr (Basic1Sin) unsynced_sample += std::sin(2.0f * pi32 * _unsync_phases[v]) * basic1_sin_mix_curve[mod_index]; + if constexpr (Basic1Tri) unsynced_sample += generate_triangle(_unsync_phases[v], inc_sync) * basic1_tri_mix_curve[mod_index]; + if constexpr (Basic1Sqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, basic1_pw_curve[mod_index]) * basic1_sqr_mix_curve[mod_index]; if constexpr (DSF) unsynced_sample = generate_dsf(_unsync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); increment_and_wrap_phase(_unsync_phases[v], inc_sync); From e219768331c0c8a9b731ebe4d28fec34942ff8b3 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Mon, 14 Oct 2024 20:03:24 +0200 Subject: [PATCH 26/61] take 2 --- param_reference.html | 104 +++++++++++++++--- .../firefly_synth/oscillator.cpp | 56 ++++++++-- 2 files changed, 131 insertions(+), 29 deletions(-) diff --git a/param_reference.html b/param_reference.html index bbaa81a5a..649f2ed86 100644 --- a/param_reference.html +++ b/param_reference.html @@ -2917,8 +2917,8 @@

Osc

Phase offset for subsequent voices, to get that unison effect 'right from the start'. Only applicable to Basic and DSF generators. -Basic Sin On -Basic +Basic 1 Sin On +Basic 1 Yes Patch 1 @@ -2934,8 +2934,8 @@

Osc

Toggle sine generator on/off. -Basic Sin Mix -Basic +Basic 1 Sin Mix +Basic 1 Yes Patch 1 @@ -2951,8 +2951,8 @@

Osc

Sine generator mix amount. -Basic Saw On -Basic +Basic 1 Saw On +Basic 1 Yes Patch 1 @@ -2968,8 +2968,8 @@

Osc

Toggle saw generator on/off. -Basic Saw Mix -Basic +Basic 1 Saw Mix +Basic 1 Yes Patch 1 @@ -2985,8 +2985,8 @@

Osc

Saw generator mix amount. -Basic Tri On -Basic +Basic 1 Tri On +Basic 1 Yes Patch 1 @@ -3002,8 +3002,8 @@

Osc

Toggle triangle generator on/off. -Basic Tri Mix -Basic +Basic 1 Tri Mix +Basic 1 Yes Patch 1 @@ -3019,8 +3019,8 @@

Osc

Triangle generator mix amount. -Basic Sqr On -Basic +Basic 1 Sqr On +Basic 1 Yes Patch 1 @@ -3036,8 +3036,8 @@

Osc

Toggle square generator on/off. -Basic Sqr Mix -Basic +Basic 1 Sqr Mix +Basic 1 Yes Patch 1 @@ -3053,8 +3053,8 @@

Osc

Square generator mix amount. -Basic Sqr PW -Basic PW +Basic 1 Sqr PW +Basic 1 PW Yes Patch 1 @@ -3070,6 +3070,74 @@

Osc

Square generator pulse width. +Basic 2 Wave 1 +Basic 2 +Yes +Patch +1 +Input +Voice +Automate +Sin +Sqr +Sin +N/A + + +Selects the base waveform. + + +Basic 2 Wave 2 +Basic 2 +Yes +Patch +1 +Input +Voice +Automate +Sin +Sqr +Sin +N/A + + +Selects the overlay waveform. + + +Basic 2 Freq +Basic 2 +Yes +Patch +1 +Input +Accurate +Modulate +0.00 % +100.00 % +0.00 % +N/A + + +Selects the overlay frequency. + + +Basic 2 Mix +Basic 2 +Yes +Patch +1 +Input +Accurate +Modulate +0.00 % +100.00 % +0.00 % +N/A + + +Controls the overlay mix amount. + + DSF Partials DSF Yes diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 7c0997fe0..557b7aa93 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -32,7 +32,7 @@ enum { param_uni_voices, param_uni_sprd, param_uni_dtn, param_uni_phase, param_basic1_sin_on, param_basic1_sin_mix, param_basic1_saw_on, param_basic1_saw_mix, param_basic1_tri_on, param_basic1_tri_mix, param_basic1_sqr_on, param_basic1_sqr_mix, param_basic1_sqr_pw, - param_basic2_wave1, param_basic2_wave2, param_basic2_freq, param_basic2_amp, param_basic2_skew_x, param_basic2_skew_y, + param_basic2_wave1, param_basic2_wave2, param_basic2_freq, param_basic2_mix, param_dsf_parts, param_dsf_dist, param_dsf_dcy, param_rand_svf, param_rand_rate, param_rand_freq, param_rand_res, param_rand_seed, // shared k+s/noise param_kps_fdbk, param_kps_mid, param_kps_stretch, @@ -464,56 +464,56 @@ osc_topo(int section, gui_position const& pos) basic1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); basic1.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_off || vs[0] == type_basic1; }); auto& basic1_sin_on = result.params.emplace_back(make_param( - make_topo_info("{BD753E3C-B84E-4185-95D1-66EA3B27C76B}", true, "Basic Sin On", "Sin", "Basic Sin", param_basic1_sin_on, 1), + make_topo_info("{BD753E3C-B84E-4185-95D1-66EA3B27C76B}", true, "Basic 1 Sin On", "Sin", "Basic Sin", param_basic1_sin_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(true), make_param_gui_single(section_basic1, gui_edit_type::toggle, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); basic1_sin_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); basic1_sin_on.info.description = "Toggle sine generator on/off."; auto& basic1_sin_mix = result.params.emplace_back(make_param( - make_topo_info("{60FAAC91-7F69-4804-AC8B-2C7E6F3E4238}", true, "Basic Sin Mix", "Sin", "Basic Sin Mix", param_basic1_sin_mix, 1), + make_topo_info("{60FAAC91-7F69-4804-AC8B-2C7E6F3E4238}", true, "Basic 1 Sin Mix", "Sin", "Basic Sin Mix", param_basic1_sin_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), make_param_gui_single(section_basic1, gui_edit_type::hslider, { 0, 2 }, make_label_none()))); basic1_sin_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_sin_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); basic1_sin_mix.info.description = "Sine generator mix amount."; basic1_sin_on.gui.alternate_drag_param_id = basic1_sin_mix.info.tag.id; auto& basic1_saw_on = result.params.emplace_back(make_param( - make_topo_info("{A31C1E92-E7FF-410F-8466-7AC235A95BDB}", true, "Basic Saw On", "Saw", "Basic Saw", param_basic1_saw_on, 1), + make_topo_info("{A31C1E92-E7FF-410F-8466-7AC235A95BDB}", true, "Basic 1 Saw On", "Saw", "Basic Saw", param_basic1_saw_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(false), make_param_gui_single(section_basic1, gui_edit_type::toggle, { 0, 3 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); basic1_saw_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); basic1_saw_on.info.description = "Toggle saw generator on/off."; auto& basic1_saw_mix = result.params.emplace_back(make_param( - make_topo_info("{A459839C-F78E-4871-8494-6D524F00D0CE}", true, "Basic Saw Mix", "Saw", "Basic Saw Mix", param_basic1_saw_mix, 1), + make_topo_info("{A459839C-F78E-4871-8494-6D524F00D0CE}", true, "Basic 1 Saw Mix", "Saw", "Basic Saw Mix", param_basic1_saw_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), make_param_gui_single(section_basic1, gui_edit_type::hslider, { 0, 5 }, make_label_none()))); basic1_saw_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_saw_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); basic1_saw_mix.info.description = "Saw generator mix amount."; basic1_saw_on.gui.alternate_drag_param_id = basic1_saw_mix.info.tag.id; auto& basic1_tri_on = result.params.emplace_back(make_param( - make_topo_info("{F2B92036-ED14-4D88-AFE3-B83C1AAE5E76}", true, "Basic Tri On", "Tri", "Basic Tri", param_basic1_tri_on, 1), + make_topo_info("{F2B92036-ED14-4D88-AFE3-B83C1AAE5E76}", true, "Basic 1 Tri On", "Tri", "Basic Tri", param_basic1_tri_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(false), make_param_gui_single(section_basic1, gui_edit_type::toggle, { 1, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); basic1_tri_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); basic1_tri_on.info.description = "Toggle triangle generator on/off."; auto& basic1_tri_mix = result.params.emplace_back(make_param( - make_topo_info("{88F88506-5916-4668-BD8B-5C35D01D1147}", true, "Basic Tri Mix", "Tri", "Basic Tri Mix", param_basic1_tri_mix, 1), + make_topo_info("{88F88506-5916-4668-BD8B-5C35D01D1147}", true, "Basic 1 Tri Mix", "Tri", "Basic Tri Mix", param_basic1_tri_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), make_param_gui_single(section_basic1, gui_edit_type::hslider, { 1, 2 }, make_label_none()))); basic1_tri_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_tri_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); basic1_tri_mix.info.description = "Triangle generator mix amount."; basic1_tri_on.gui.alternate_drag_param_id = basic1_tri_mix.info.tag.id; auto& basic1_sqr_on = result.params.emplace_back(make_param( - make_topo_info("{C3AF1917-64FD-481B-9C21-3FE6F8D039C4}", true, "Basic Sqr On", "Sqr", "Basic Sqr", param_basic1_sqr_on, 1), + make_topo_info("{C3AF1917-64FD-481B-9C21-3FE6F8D039C4}", true, "Basic 1 Sqr On", "Sqr", "Basic Sqr", param_basic1_sqr_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(false), make_param_gui_single(section_basic1, gui_edit_type::toggle, { 1, 3 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); basic1_sqr_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); basic1_sqr_on.info.description = "Toggle square generator on/off."; auto& basic1_sqr_mix = result.params.emplace_back(make_param( - make_topo_info("{B133B0E6-23DC-4B44-AA3B-6D04649271A4}", true, "Basic Sqr Mix", "Sqr", "Basic Sqr Mix", param_basic1_sqr_mix, 1), + make_topo_info("{B133B0E6-23DC-4B44-AA3B-6D04649271A4}", true, "Basic 1 Sqr Mix", "Sqr", "Basic Sqr Mix", param_basic1_sqr_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), make_param_gui_single(section_basic1, gui_edit_type::hslider, { 1, 5 }, make_label_none()))); basic1_sqr_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_sqr_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); @@ -521,19 +521,53 @@ osc_topo(int section, gui_position const& pos) basic1_sqr_on.gui.alternate_drag_param_id = basic1_sqr_mix.info.tag.id; auto& basic1_pw = result.sections.emplace_back(make_param_section(section_basic1_pw, - make_topo_tag_basic("{93984655-A05F-424D-B3E5-A0C94AF8D0B3}", "Basic PW"), + make_topo_tag_basic("{93984655-A05F-424D-B3E5-A0C94AF8D0B3}", "Basic 1 PW"), make_param_section_gui({ 0, 5, 2, 1 }, gui_dimension({ 1, 1 }, { 1 }), gui_label_edit_cell_split::vertical))); basic1_pw.gui.merge_with_section = section_basic1; basic1_pw.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); basic1_pw.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_off || vs[0] == type_basic1; }); auto& basic1_sqr_pw = result.params.emplace_back(make_param( - make_topo_info("{57A231B9-CCC7-4881-885E-3244AE61107C}", true, "Basic Sqr PW", "PW", "Basic PW", param_basic1_sqr_pw, 1), + make_topo_info("{57A231B9-CCC7-4881-885E-3244AE61107C}", true, "Basic 1 Sqr PW", "PW", "Basic PW", param_basic1_sqr_pw, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(1, 0, true), make_param_gui_single(section_basic1_pw, gui_edit_type::knob, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::top, gui_label_justify::center)))); basic1_sqr_pw.gui.bindings.enabled.bind_params({ param_type, param_basic1_sqr_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); basic1_sqr_pw.info.description = "Square generator pulse width."; + auto& basic2 = result.sections.emplace_back(make_param_section(section_basic2, + make_topo_tag_basic("{7BB6F0D9-4A04-4932-B7CD-C3AF5C13C067}", "Basic 2"), + make_param_section_gui({ 0, 4, 2, 2 }, gui_dimension({ 1, 1 }, { 1, 1 })))); // todo autosize + basic2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); + basic2.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); + auto& basic2_wave_1 = result.params.emplace_back(make_param( + make_topo_info("{D6B0CF43-5136-4D92-8EEA-2AE5EDD30C0E}", true, "Basic 2 Wave 1", "Wave 1", "Wave 1", param_basic2_wave1, 1), + make_param_dsp_voice(param_automate::automate), make_domain_item(basic2_wave_items(), "Sin"), + make_param_gui_single(section_basic2, gui_edit_type::autofit_list, { 0, 0, 1, 1 }, + make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); + basic2_wave_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); + basic2_wave_1.info.description = "Selects the base waveform."; + auto& basic2_wave_2 = result.params.emplace_back(make_param( + make_topo_info("{A8BAE205-AA10-4C48-8C40-5C5B4B1118FE}", true, "Basic 2 Wave 2", "Wave 2", "Wave 2", param_basic2_wave2, 1), + make_param_dsp_voice(param_automate::automate), make_domain_item(basic2_wave_items(), "Sin"), + make_param_gui_single(section_basic2, gui_edit_type::autofit_list, { 1, 0, 1, 1 }, + make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); + basic2_wave_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); + basic2_wave_2.info.description = "Selects the overlay waveform."; + auto& basic2_freq = result.params.emplace_back(make_param( + make_topo_info("{428C5833-3BBE-40AF-9A9C-5EACA40F4CA4}", true, "Basic 2 Freq", "Freq", "Basic 2 Freq", param_basic2_freq, 1), + make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), // TODO how much + make_param_gui_single(section_basic2, gui_edit_type::hslider, { 0, 1, 1, 1 }, + make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); + basic2_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); + basic2_freq.info.description = "Selects the overlay frequency."; + auto& basic2_mix = result.params.emplace_back(make_param( + make_topo_info("{3590AA81-DDF3-4785-8944-D18B9869C609}", true, "Basic 2 Mix", "Mix", "Basic 2 Mix", param_basic2_mix, 1), + make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), // TODO how much + make_param_gui_single(section_basic2, gui_edit_type::hslider, { 1, 1, 1, 1 }, + make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); + basic2_mix.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); + basic2_mix.info.description = "Controls the overlay mix amount."; + auto& dsf = result.sections.emplace_back(make_param_section(section_dsf, make_topo_tag_basic("{F6B06CEA-AF28-4AE2-943E-6225510109A3}", "DSF"), make_param_section_gui({ 0, 4, 2, 2 }, gui_dimension({ 1, 1 }, { 1, 1 })))); From b5c08b2722f5c2dc61a450ea7360219b4a950130 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Mon, 14 Oct 2024 20:20:25 +0200 Subject: [PATCH 27/61] take 3 --- .../firefly_synth/oscillator.cpp | 346 +++++++++--------- 1 file changed, 173 insertions(+), 173 deletions(-) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 557b7aa93..9d3cc6e82 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -18,21 +18,21 @@ namespace firefly_synth { static float const max_phase_mod = 0.1f; -enum { type_off, type_basic1, type_basic2, type_dsf, type_kps1, type_kps2, type_static }; +enum { type_off, type_basic, type_combi, type_dsf, type_kps1, type_kps2, type_static }; enum { rand_svf_lpf, rand_svf_hpf, rand_svf_bpf, rand_svf_bsf, rand_svf_peq }; -enum { section_type, section_sync_on, section_sync_uni, section_basic1, section_basic1_pw, section_basic2, section_dsf, section_rand }; +enum { section_type, section_sync_on, section_sync_uni, section_basic, section_basic_pw, section_combi, section_dsf, section_rand }; enum { scratch_pb, scratch_cent, scratch_pitch, scratch_sync_semi, - scratch_basic1_sin_mix, scratch_basic1_saw_mix, scratch_basic1_tri_mix, scratch_basic1_sqr_mix, + scratch_basic_sin_mix, scratch_basic_saw_mix, scratch_basic_tri_mix, scratch_basic_sqr_mix, scratch_rand_freq, scratch_rand_rate, scratch_count }; // todo overlap scratch space enum { param_type, param_gain, param_note, param_cent, param_hard_sync, param_hard_sync_semis, param_hard_sync_xover, param_uni_voices, param_uni_sprd, param_uni_dtn, param_uni_phase, - param_basic1_sin_on, param_basic1_sin_mix, param_basic1_saw_on, param_basic1_saw_mix, - param_basic1_tri_on, param_basic1_tri_mix, param_basic1_sqr_on, param_basic1_sqr_mix, param_basic1_sqr_pw, - param_basic2_wave1, param_basic2_wave2, param_basic2_freq, param_basic2_mix, + param_basic_sin_on, param_basic_sin_mix, param_basic_saw_on, param_basic_saw_mix, + param_basic_tri_on, param_basic_tri_mix, param_basic_sqr_on, param_basic_sqr_mix, param_basic_sqr_pw, + param_combi_wave1, param_combi_wave2, param_combi_freq, param_combi_mix, param_dsf_parts, param_dsf_dist, param_dsf_dcy, param_rand_svf, param_rand_rate, param_rand_freq, param_rand_res, param_rand_seed, // shared k+s/noise param_kps_fdbk, param_kps_mid, param_kps_stretch, @@ -47,9 +47,9 @@ static bool constexpr is_kps(int type) static bool constexpr is_random(int type) { return type == type_static || is_kps(type); } static bool can_do_phase(int type) -{ return type == type_basic1 || type == type_basic2 || type == type_dsf; } +{ return type == type_basic || type == type_combi || type == type_dsf; } static bool can_do_pitch(int type) -{ return type == type_basic1 || type == type_basic2 || type == type_dsf || is_kps(type); } +{ return type == type_basic || type == type_combi || type == type_dsf || is_kps(type); } // bit different for osci and lfo // lfo is bucket based but for this one we'd need up to SR/2 buckets @@ -104,7 +104,7 @@ get_oversmp_info(plugin_block const& block, int& stages, int& factor) } static std::vector -basic2_wave_items() +combi_wave_items() { std::vector result; result.emplace_back("{B52E7D25-CADD-4075-BDC8-AB5298F53784}", "Sin"); @@ -119,8 +119,8 @@ type_items() { std::vector result; result.emplace_back("{9C9FFCAD-09A5-49E6-A083-482C8A3CF20B}", "Off", "Off"); - result.emplace_back("{9185A6F4-F9EF-4A33-8462-1B02A25FDF29}", "Basic 1", "Basic Analog 1"); - result.emplace_back("{0E9AD9BB-9C57-4333-84DC-A888E755C2AD}", "Basic 2", "Basic Analog 2"); + result.emplace_back("{9185A6F4-F9EF-4A33-8462-1B02A25FDF29}", "Basic", "Basic Analog"); + result.emplace_back("{0E9AD9BB-9C57-4333-84DC-A888E755C2AD}", "Combi", "Combi Analog"); result.emplace_back("{5DDB5617-85CC-4BE7-8295-63184BA56191}", "DSF", "Discrete Summation Formulae"); result.emplace_back("{E6814747-6CEE-47DA-9878-890D0A5DC5C7}", "K+S1", "Karplus-Strong"); result.emplace_back("{43DC7825-E437-4792-88D5-6E76241493A1}", "K+S2", "Karplus-Strong With Midpoint Adjustment"); @@ -198,40 +198,40 @@ public module_engine { float generate_kps(int voice, float sr, float freq, float fdbk, float stretch, float mid_freq); template void process_dsf(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template void process_basic1(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template void process_basic(plugin_block& block, cv_audio_matrix_mixdown const* modulation); template void process_static(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template void - process_basic1_sin(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template - void process_basic1_sin_saw(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template - void process_basic1_sin_saw_tri(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template - void process_basic1_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template + template void + process_basic_sin(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template + void process_basic_sin_saw(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template + void process_basic_sin_saw_tri(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template + void process_basic_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template void process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template + template void process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixdown const* modulation); }; static void init_minimal(plugin_state& state) { - state.set_text_at(module_osc, 0, param_type, 0, "Basic 1"); + state.set_text_at(module_osc, 0, param_type, 0, "Basic"); } static void init_default(plugin_state& state) { state.set_text_at(module_osc, 0, param_cent, 0, "-10"); - state.set_text_at(module_osc, 0, param_type, 0, "Basic 1"); - state.set_text_at(module_osc, 0, param_basic1_sin_on, 0, "Off"); - state.set_text_at(module_osc, 0, param_basic1_saw_on, 0, "On"); + state.set_text_at(module_osc, 0, param_type, 0, "Basic"); + state.set_text_at(module_osc, 0, param_basic_sin_on, 0, "Off"); + state.set_text_at(module_osc, 0, param_basic_saw_on, 0, "On"); state.set_text_at(module_osc, 1, param_cent, 0, "+10"); - state.set_text_at(module_osc, 1, param_type, 0, "Basic 1"); - state.set_text_at(module_osc, 1, param_basic1_sin_on, 0, "Off"); - state.set_text_at(module_osc, 1, param_basic1_saw_on, 0, "On"); + state.set_text_at(module_osc, 1, param_type, 0, "Basic"); + state.set_text_at(module_osc, 1, param_basic_sin_on, 0, "Off"); + state.set_text_at(module_osc, 1, param_basic_saw_on, 0, "On"); } static std::unique_ptr @@ -362,8 +362,8 @@ osc_topo(int section, gui_position const& pos) make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); type.gui.submenu = std::make_shared(); type.gui.submenu->indices.push_back(type_off); - type.gui.submenu->indices.push_back(type_basic1); - type.gui.submenu->indices.push_back(type_basic2); + type.gui.submenu->indices.push_back(type_basic); + type.gui.submenu->indices.push_back(type_combi); type.gui.submenu->indices.push_back(type_dsf); type.gui.submenu->indices.push_back(type_static); type.gui.submenu->add_submenu("Karplus-Strong", { type_kps1, type_kps2 }); @@ -455,118 +455,118 @@ osc_topo(int section, gui_position const& pos) uni_phase.gui.bindings.enabled.bind_params({ param_type, param_uni_voices }, [](auto const& vs) { return can_do_phase(vs[0]) && vs[1] > 1; }); uni_phase.info.description = "Phase offset for subsequent voices, to get that unison effect 'right from the start'. Only applicable to Basic and DSF generators."; - auto& basic1 = result.sections.emplace_back(make_param_section(section_basic1, - make_topo_tag_basic("{8E776EAB-DAC7-48D6-8C41-29214E338693}", "Basic 1"), + auto& basic = result.sections.emplace_back(make_param_section(section_basic, + make_topo_tag_basic("{8E776EAB-DAC7-48D6-8C41-29214E338693}", "Basic"), make_param_section_gui({ 0, 4, 2, 1 }, gui_dimension({ 1, 1 }, { gui_dimension::auto_size_all, gui_dimension::auto_size_all, 1, gui_dimension::auto_size_all, gui_dimension::auto_size_all, 1 }), gui_label_edit_cell_split::horizontal))); - basic1.gui.merge_with_section = section_basic1_pw; - basic1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); - basic1.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_off || vs[0] == type_basic1; }); - auto& basic1_sin_on = result.params.emplace_back(make_param( - make_topo_info("{BD753E3C-B84E-4185-95D1-66EA3B27C76B}", true, "Basic 1 Sin On", "Sin", "Basic Sin", param_basic1_sin_on, 1), + basic.gui.merge_with_section = section_basic_pw; + basic.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); + basic.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_off || vs[0] == type_basic; }); + auto& basic_sin_on = result.params.emplace_back(make_param( + make_topo_info("{BD753E3C-B84E-4185-95D1-66EA3B27C76B}", true, "Basic Sin On", "Sin", "Basic Sin", param_basic_sin_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(true), - make_param_gui_single(section_basic1, gui_edit_type::toggle, { 0, 0 }, + make_param_gui_single(section_basic, gui_edit_type::toggle, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic1_sin_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); - basic1_sin_on.info.description = "Toggle sine generator on/off."; - auto& basic1_sin_mix = result.params.emplace_back(make_param( - make_topo_info("{60FAAC91-7F69-4804-AC8B-2C7E6F3E4238}", true, "Basic 1 Sin Mix", "Sin", "Basic Sin Mix", param_basic1_sin_mix, 1), + basic_sin_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); + basic_sin_on.info.description = "Toggle sine generator on/off."; + auto& basic_sin_mix = result.params.emplace_back(make_param( + make_topo_info("{60FAAC91-7F69-4804-AC8B-2C7E6F3E4238}", true, "Basic Sin Mix", "Sin", "Basic Sin Mix", param_basic_sin_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), - make_param_gui_single(section_basic1, gui_edit_type::hslider, { 0, 2 }, make_label_none()))); - basic1_sin_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_sin_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); - basic1_sin_mix.info.description = "Sine generator mix amount."; - basic1_sin_on.gui.alternate_drag_param_id = basic1_sin_mix.info.tag.id; - auto& basic1_saw_on = result.params.emplace_back(make_param( - make_topo_info("{A31C1E92-E7FF-410F-8466-7AC235A95BDB}", true, "Basic 1 Saw On", "Saw", "Basic Saw", param_basic1_saw_on, 1), + make_param_gui_single(section_basic, gui_edit_type::hslider, { 0, 2 }, make_label_none()))); + basic_sin_mix.gui.bindings.enabled.bind_params({ param_type, param_basic_sin_on }, [](auto const& vs) { return vs[0] == type_basic && vs[1] != 0; }); + basic_sin_mix.info.description = "Sine generator mix amount."; + basic_sin_on.gui.alternate_drag_param_id = basic_sin_mix.info.tag.id; + auto& basic_saw_on = result.params.emplace_back(make_param( + make_topo_info("{A31C1E92-E7FF-410F-8466-7AC235A95BDB}", true, "Basic Saw On", "Saw", "Basic Saw", param_basic_saw_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(false), - make_param_gui_single(section_basic1, gui_edit_type::toggle, { 0, 3 }, + make_param_gui_single(section_basic, gui_edit_type::toggle, { 0, 3 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic1_saw_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); - basic1_saw_on.info.description = "Toggle saw generator on/off."; - auto& basic1_saw_mix = result.params.emplace_back(make_param( - make_topo_info("{A459839C-F78E-4871-8494-6D524F00D0CE}", true, "Basic 1 Saw Mix", "Saw", "Basic Saw Mix", param_basic1_saw_mix, 1), + basic_saw_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); + basic_saw_on.info.description = "Toggle saw generator on/off."; + auto& basic_saw_mix = result.params.emplace_back(make_param( + make_topo_info("{A459839C-F78E-4871-8494-6D524F00D0CE}", true, "Basic Saw Mix", "Saw", "Basic Saw Mix", param_basic_saw_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), - make_param_gui_single(section_basic1, gui_edit_type::hslider, { 0, 5 }, make_label_none()))); - basic1_saw_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_saw_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); - basic1_saw_mix.info.description = "Saw generator mix amount."; - basic1_saw_on.gui.alternate_drag_param_id = basic1_saw_mix.info.tag.id; - auto& basic1_tri_on = result.params.emplace_back(make_param( - make_topo_info("{F2B92036-ED14-4D88-AFE3-B83C1AAE5E76}", true, "Basic 1 Tri On", "Tri", "Basic Tri", param_basic1_tri_on, 1), + make_param_gui_single(section_basic, gui_edit_type::hslider, { 0, 5 }, make_label_none()))); + basic_saw_mix.gui.bindings.enabled.bind_params({ param_type, param_basic_saw_on }, [](auto const& vs) { return vs[0] == type_basic && vs[1] != 0; }); + basic_saw_mix.info.description = "Saw generator mix amount."; + basic_saw_on.gui.alternate_drag_param_id = basic_saw_mix.info.tag.id; + auto& basic_tri_on = result.params.emplace_back(make_param( + make_topo_info("{F2B92036-ED14-4D88-AFE3-B83C1AAE5E76}", true, "Basic Tri On", "Tri", "Basic Tri", param_basic_tri_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(false), - make_param_gui_single(section_basic1, gui_edit_type::toggle, { 1, 0 }, + make_param_gui_single(section_basic, gui_edit_type::toggle, { 1, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic1_tri_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); - basic1_tri_on.info.description = "Toggle triangle generator on/off."; - auto& basic1_tri_mix = result.params.emplace_back(make_param( - make_topo_info("{88F88506-5916-4668-BD8B-5C35D01D1147}", true, "Basic 1 Tri Mix", "Tri", "Basic Tri Mix", param_basic1_tri_mix, 1), + basic_tri_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); + basic_tri_on.info.description = "Toggle triangle generator on/off."; + auto& basic_tri_mix = result.params.emplace_back(make_param( + make_topo_info("{88F88506-5916-4668-BD8B-5C35D01D1147}", true, "Basic Tri Mix", "Tri", "Basic Tri Mix", param_basic_tri_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), - make_param_gui_single(section_basic1, gui_edit_type::hslider, { 1, 2 }, make_label_none()))); - basic1_tri_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_tri_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); - basic1_tri_mix.info.description = "Triangle generator mix amount."; - basic1_tri_on.gui.alternate_drag_param_id = basic1_tri_mix.info.tag.id; - auto& basic1_sqr_on = result.params.emplace_back(make_param( - make_topo_info("{C3AF1917-64FD-481B-9C21-3FE6F8D039C4}", true, "Basic 1 Sqr On", "Sqr", "Basic Sqr", param_basic1_sqr_on, 1), + make_param_gui_single(section_basic, gui_edit_type::hslider, { 1, 2 }, make_label_none()))); + basic_tri_mix.gui.bindings.enabled.bind_params({ param_type, param_basic_tri_on }, [](auto const& vs) { return vs[0] == type_basic && vs[1] != 0; }); + basic_tri_mix.info.description = "Triangle generator mix amount."; + basic_tri_on.gui.alternate_drag_param_id = basic_tri_mix.info.tag.id; + auto& basic_sqr_on = result.params.emplace_back(make_param( + make_topo_info("{C3AF1917-64FD-481B-9C21-3FE6F8D039C4}", true, "Basic Sqr On", "Sqr", "Basic Sqr", param_basic_sqr_on, 1), make_param_dsp_voice(param_automate::automate), make_domain_toggle(false), - make_param_gui_single(section_basic1, gui_edit_type::toggle, { 1, 3 }, + make_param_gui_single(section_basic, gui_edit_type::toggle, { 1, 3 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic1_sqr_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); - basic1_sqr_on.info.description = "Toggle square generator on/off."; - auto& basic1_sqr_mix = result.params.emplace_back(make_param( - make_topo_info("{B133B0E6-23DC-4B44-AA3B-6D04649271A4}", true, "Basic 1 Sqr Mix", "Sqr", "Basic Sqr Mix", param_basic1_sqr_mix, 1), + basic_sqr_on.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); + basic_sqr_on.info.description = "Toggle square generator on/off."; + auto& basic_sqr_mix = result.params.emplace_back(make_param( + make_topo_info("{B133B0E6-23DC-4B44-AA3B-6D04649271A4}", true, "Basic Sqr Mix", "Sqr", "Basic Sqr Mix", param_basic_sqr_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(-1, 1, 1, 0, true), - make_param_gui_single(section_basic1, gui_edit_type::hslider, { 1, 5 }, make_label_none()))); - basic1_sqr_mix.gui.bindings.enabled.bind_params({ param_type, param_basic1_sqr_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); - basic1_sqr_mix.info.description = "Square generator mix amount."; - basic1_sqr_on.gui.alternate_drag_param_id = basic1_sqr_mix.info.tag.id; + make_param_gui_single(section_basic, gui_edit_type::hslider, { 1, 5 }, make_label_none()))); + basic_sqr_mix.gui.bindings.enabled.bind_params({ param_type, param_basic_sqr_on }, [](auto const& vs) { return vs[0] == type_basic && vs[1] != 0; }); + basic_sqr_mix.info.description = "Square generator mix amount."; + basic_sqr_on.gui.alternate_drag_param_id = basic_sqr_mix.info.tag.id; - auto& basic1_pw = result.sections.emplace_back(make_param_section(section_basic1_pw, - make_topo_tag_basic("{93984655-A05F-424D-B3E5-A0C94AF8D0B3}", "Basic 1 PW"), + auto& basic_pw = result.sections.emplace_back(make_param_section(section_basic_pw, + make_topo_tag_basic("{93984655-A05F-424D-B3E5-A0C94AF8D0B3}", "Basic PW"), make_param_section_gui({ 0, 5, 2, 1 }, gui_dimension({ 1, 1 }, { 1 }), gui_label_edit_cell_split::vertical))); - basic1_pw.gui.merge_with_section = section_basic1; - basic1_pw.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic1; }); - basic1_pw.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_off || vs[0] == type_basic1; }); - auto& basic1_sqr_pw = result.params.emplace_back(make_param( - make_topo_info("{57A231B9-CCC7-4881-885E-3244AE61107C}", true, "Basic 1 Sqr PW", "PW", "Basic PW", param_basic1_sqr_pw, 1), + basic_pw.gui.merge_with_section = section_basic; + basic_pw.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic; }); + basic_pw.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_off || vs[0] == type_basic; }); + auto& basic_sqr_pw = result.params.emplace_back(make_param( + make_topo_info("{57A231B9-CCC7-4881-885E-3244AE61107C}", true, "Basic Sqr PW", "PW", "Basic PW", param_basic_sqr_pw, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(1, 0, true), - make_param_gui_single(section_basic1_pw, gui_edit_type::knob, { 0, 0 }, + make_param_gui_single(section_basic_pw, gui_edit_type::knob, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::top, gui_label_justify::center)))); - basic1_sqr_pw.gui.bindings.enabled.bind_params({ param_type, param_basic1_sqr_on }, [](auto const& vs) { return vs[0] == type_basic1 && vs[1] != 0; }); - basic1_sqr_pw.info.description = "Square generator pulse width."; + basic_sqr_pw.gui.bindings.enabled.bind_params({ param_type, param_basic_sqr_on }, [](auto const& vs) { return vs[0] == type_basic && vs[1] != 0; }); + basic_sqr_pw.info.description = "Square generator pulse width."; - auto& basic2 = result.sections.emplace_back(make_param_section(section_basic2, - make_topo_tag_basic("{7BB6F0D9-4A04-4932-B7CD-C3AF5C13C067}", "Basic 2"), + auto& combi = result.sections.emplace_back(make_param_section(section_combi, + make_topo_tag_basic("{7BB6F0D9-4A04-4932-B7CD-C3AF5C13C067}", "Combi"), make_param_section_gui({ 0, 4, 2, 2 }, gui_dimension({ 1, 1 }, { 1, 1 })))); // todo autosize - basic2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); - basic2.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); - auto& basic2_wave_1 = result.params.emplace_back(make_param( - make_topo_info("{D6B0CF43-5136-4D92-8EEA-2AE5EDD30C0E}", true, "Basic 2 Wave 1", "Wave 1", "Wave 1", param_basic2_wave1, 1), - make_param_dsp_voice(param_automate::automate), make_domain_item(basic2_wave_items(), "Sin"), - make_param_gui_single(section_basic2, gui_edit_type::autofit_list, { 0, 0, 1, 1 }, + combi.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); + combi.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); + auto& combi_wave_1 = result.params.emplace_back(make_param( + make_topo_info("{D6B0CF43-5136-4D92-8EEA-2AE5EDD30C0E}", true, "Combi Wave 1", "Wave 1", "Wave 1", param_combi_wave1, 1), + make_param_dsp_voice(param_automate::automate), make_domain_item(combi_wave_items(), "Sin"), + make_param_gui_single(section_combi, gui_edit_type::autofit_list, { 0, 0, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic2_wave_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); - basic2_wave_1.info.description = "Selects the base waveform."; - auto& basic2_wave_2 = result.params.emplace_back(make_param( - make_topo_info("{A8BAE205-AA10-4C48-8C40-5C5B4B1118FE}", true, "Basic 2 Wave 2", "Wave 2", "Wave 2", param_basic2_wave2, 1), - make_param_dsp_voice(param_automate::automate), make_domain_item(basic2_wave_items(), "Sin"), - make_param_gui_single(section_basic2, gui_edit_type::autofit_list, { 1, 0, 1, 1 }, + combi_wave_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); + combi_wave_1.info.description = "Selects the base waveform."; + auto& combi_wave_2 = result.params.emplace_back(make_param( + make_topo_info("{A8BAE205-AA10-4C48-8C40-5C5B4B1118FE}", true, "Combi Wave 2", "Wave 2", "Wave 2", param_combi_wave2, 1), + make_param_dsp_voice(param_automate::automate), make_domain_item(combi_wave_items(), "Sin"), + make_param_gui_single(section_combi, gui_edit_type::autofit_list, { 1, 0, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic2_wave_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); - basic2_wave_2.info.description = "Selects the overlay waveform."; - auto& basic2_freq = result.params.emplace_back(make_param( - make_topo_info("{428C5833-3BBE-40AF-9A9C-5EACA40F4CA4}", true, "Basic 2 Freq", "Freq", "Basic 2 Freq", param_basic2_freq, 1), + combi_wave_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); + combi_wave_2.info.description = "Selects the overlay waveform."; + auto& combi_freq = result.params.emplace_back(make_param( + make_topo_info("{428C5833-3BBE-40AF-9A9C-5EACA40F4CA4}", true, "Combi Freq", "Freq", "Combi Freq", param_combi_freq, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), // TODO how much - make_param_gui_single(section_basic2, gui_edit_type::hslider, { 0, 1, 1, 1 }, + make_param_gui_single(section_combi, gui_edit_type::hslider, { 0, 1, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic2_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); - basic2_freq.info.description = "Selects the overlay frequency."; - auto& basic2_mix = result.params.emplace_back(make_param( - make_topo_info("{3590AA81-DDF3-4785-8944-D18B9869C609}", true, "Basic 2 Mix", "Mix", "Basic 2 Mix", param_basic2_mix, 1), + combi_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); + combi_freq.info.description = "Selects the overlay frequency."; + auto& combi_mix = result.params.emplace_back(make_param( + make_topo_info("{3590AA81-DDF3-4785-8944-D18B9869C609}", true, "Combi Mix", "Mix", "Combi Mix", param_combi_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), // TODO how much - make_param_gui_single(section_basic2, gui_edit_type::hslider, { 1, 1, 1, 1 }, + make_param_gui_single(section_combi, gui_edit_type::hslider, { 1, 1, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - basic2_mix.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_basic2; }); - basic2_mix.info.description = "Controls the overlay mix amount."; + combi_mix.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); + combi_mix.info.description = "Controls the overlay mix amount."; auto& dsf = result.sections.emplace_back(make_param_section(section_dsf, make_topo_tag_basic("{F6B06CEA-AF28-4AE2-943E-6225510109A3}", "DSF"), @@ -948,8 +948,8 @@ osc_engine::process(plugin_block& block, cv_audio_matrix_mixdown const* modulati switch (type) { case type_dsf: process_dsf(block, modulation); break; - case type_basic1: process_basic1(block, modulation); break; - case type_basic2: break; // TODO + case type_basic: process_basic(block, modulation); break; + case type_combi: break; // TODO case type_static: process_static(block, modulation); break; case type_kps1: process_tuning_mode(block, modulation); break; case type_kps2: process_tuning_mode(block, modulation); break; @@ -983,53 +983,53 @@ osc_engine::process_static(plugin_block& block, cv_audio_matrix_mixdown const* m } template void -osc_engine::process_basic1(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +osc_engine::process_basic(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; - bool sin = block_auto[param_basic1_sin_on][0].step(); - if(sin) process_basic1_sin(block, modulation); - else process_basic1_sin(block, modulation); + bool sin = block_auto[param_basic_sin_on][0].step(); + if(sin) process_basic_sin(block, modulation); + else process_basic_sin(block, modulation); } -template void -osc_engine::process_basic1_sin(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +template void +osc_engine::process_basic_sin(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; - bool saw = block_auto[param_basic1_saw_on][0].step(); - if (saw) process_basic1_sin_saw(block, modulation); - else process_basic1_sin_saw(block, modulation); + bool saw = block_auto[param_basic_saw_on][0].step(); + if (saw) process_basic_sin_saw(block, modulation); + else process_basic_sin_saw(block, modulation); } -template void -osc_engine::process_basic1_sin_saw(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +template void +osc_engine::process_basic_sin_saw(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; - bool tri = block_auto[param_basic1_tri_on][0].step(); - if (tri) process_basic1_sin_saw_tri(block, modulation); - else process_basic1_sin_saw_tri(block, modulation); + bool tri = block_auto[param_basic_tri_on][0].step(); + if (tri) process_basic_sin_saw_tri(block, modulation); + else process_basic_sin_saw_tri(block, modulation); } -template void -osc_engine::process_basic1_sin_saw_tri(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +template void +osc_engine::process_basic_sin_saw_tri(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; - bool sqr = block_auto[param_basic1_sqr_on][0].step(); - if (sqr) process_basic1_sin_saw_tri_sqr(block, modulation); - else process_basic1_sin_saw_tri_sqr(block, modulation); + bool sqr = block_auto[param_basic_sqr_on][0].step(); + if (sqr) process_basic_sin_saw_tri_sqr(block, modulation); + else process_basic_sin_saw_tri_sqr(block, modulation); } -template void -osc_engine::process_basic1_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +template void +osc_engine::process_basic_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; bool sync = block_auto[param_hard_sync][0].step() != 0; - if (sync) process_tuning_mode(block, modulation); - else process_tuning_mode(block, modulation); + if (sync) process_tuning_mode(block, modulation); + else process_tuning_mode(block, modulation); } template < bool Graph, - bool Basic1Sin, bool Basic1Saw, bool Basic1Tri, bool Basic1Sqr, + bool BasicSin, bool BasicSaw, bool BasicTri, bool BasicSqr, bool DSF, bool Sync, bool KPS, bool KPSAutoFdbk, bool Static, int StaticSVFType> void osc_engine::process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown const* modulation) @@ -1037,19 +1037,19 @@ osc_engine::process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown con switch (block.current_tuning_mode) { case engine_tuning_mode_no_tuning: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_on_note_before_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_on_note_after_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_continuous_before_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_continuous_after_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; default: assert(false); @@ -1059,16 +1059,16 @@ osc_engine::process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown con template < bool Graph, - bool Basic1Sin, bool Basic1Saw, bool Basic1Tri, bool Basic1Sqr, + bool BasicSin, bool BasicSaw, bool BasicTri, bool BasicSqr, bool DSF, bool Sync, bool KPS, bool KPSAutoFdbk, bool Static, int StaticSVFType, engine_tuning_mode TuningMode> void osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { int generator_count = 0; - if constexpr (Basic1Sin) generator_count++; - if constexpr (Basic1Saw) generator_count++; - if constexpr (Basic1Tri) generator_count++; - if constexpr (Basic1Sqr) generator_count++; + if constexpr (BasicSin) generator_count++; + if constexpr (BasicSaw) generator_count++; + if constexpr (BasicTri) generator_count++; + if constexpr (BasicSqr) generator_count++; if constexpr (DSF) generator_count++; if constexpr (KPS) generator_count++; if constexpr (Static) generator_count++; @@ -1119,7 +1119,7 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd auto const& uni_dtn_curve = *(*modulation)[module_osc][block.module_slot][param_uni_dtn][0]; auto const& uni_sprd_curve = *(*modulation)[module_osc][block.module_slot][param_uni_sprd][0]; - auto const& basic1_pw_curve = *(*modulation)[module_osc][block.module_slot][param_basic1_sqr_pw][0]; + auto const& basic_pw_curve = *(*modulation)[module_osc][block.module_slot][param_basic_sqr_pw][0]; auto const& voice_pitch_offset_curve = block.voice->all_cv[module_voice_in][0][voice_in_output_pitch_offset][0]; auto& pb_curve = block.state.own_scratch[scratch_pb]; @@ -1136,18 +1136,18 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd block.normalized_to_raw_block(module_osc, param_pitch, pitch_curve_norm, pitch_curve); if constexpr(Sync) block.normalized_to_raw_block(module_osc, param_hard_sync_semis, sync_semis_curve_norm, sync_semis_curve); - auto& basic1_sin_mix_curve = block.state.own_scratch[scratch_basic1_sin_mix]; - auto& basic1_saw_mix_curve = block.state.own_scratch[scratch_basic1_saw_mix]; - auto& basic1_tri_mix_curve = block.state.own_scratch[scratch_basic1_tri_mix]; - auto& basic1_sqr_mix_curve = block.state.own_scratch[scratch_basic1_sqr_mix]; - auto const& basic1_sin_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic1_sin_mix][0]; - auto const& basic1_saw_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic1_saw_mix][0]; - auto const& basic1_tri_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic1_tri_mix][0]; - auto const& basic1_sqr_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic1_sqr_mix][0]; - if constexpr (Basic1Sin) block.normalized_to_raw_block(module_osc, param_basic1_sin_mix, basic1_sin_mix_curve_norm, basic1_sin_mix_curve); - if constexpr (Basic1Saw) block.normalized_to_raw_block(module_osc, param_basic1_saw_mix, basic1_saw_mix_curve_norm, basic1_saw_mix_curve); - if constexpr (Basic1Tri) block.normalized_to_raw_block(module_osc, param_basic1_tri_mix, basic1_tri_mix_curve_norm, basic1_tri_mix_curve); - if constexpr (Basic1Sqr) block.normalized_to_raw_block(module_osc, param_basic1_sqr_mix, basic1_sqr_mix_curve_norm, basic1_sqr_mix_curve); + auto& basic_sin_mix_curve = block.state.own_scratch[scratch_basic_sin_mix]; + auto& basic_saw_mix_curve = block.state.own_scratch[scratch_basic_saw_mix]; + auto& basic_tri_mix_curve = block.state.own_scratch[scratch_basic_tri_mix]; + auto& basic_sqr_mix_curve = block.state.own_scratch[scratch_basic_sqr_mix]; + auto const& basic_sin_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_sin_mix][0]; + auto const& basic_saw_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_saw_mix][0]; + auto const& basic_tri_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_tri_mix][0]; + auto const& basic_sqr_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_sqr_mix][0]; + if constexpr (BasicSin) block.normalized_to_raw_block(module_osc, param_basic_sin_mix, basic_sin_mix_curve_norm, basic_sin_mix_curve); + if constexpr (BasicSaw) block.normalized_to_raw_block(module_osc, param_basic_saw_mix, basic_saw_mix_curve_norm, basic_saw_mix_curve); + if constexpr (BasicTri) block.normalized_to_raw_block(module_osc, param_basic_tri_mix, basic_tri_mix_curve_norm, basic_tri_mix_curve); + if constexpr (BasicSqr) block.normalized_to_raw_block(module_osc, param_basic_sqr_mix, basic_sqr_mix_curve_norm, basic_sqr_mix_curve); auto& rand_rate_curve = block.state.own_scratch[scratch_rand_rate]; auto& rand_freq_curve = block.state.own_scratch[scratch_rand_freq]; @@ -1258,10 +1258,10 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd assert(0 <= _sync_phases[v] && _sync_phases[v] < 1); } - if constexpr (Basic1Saw) synced_sample += generate_saw(_sync_phases[v], inc_sync) * basic1_saw_mix_curve[mod_index]; - if constexpr (Basic1Sin) synced_sample += std::sin(2.0f * pi32 * _sync_phases[v]) * basic1_sin_mix_curve[mod_index]; - if constexpr (Basic1Tri) synced_sample += generate_triangle(_sync_phases[v], inc_sync) * basic1_tri_mix_curve[mod_index]; - if constexpr (Basic1Sqr) synced_sample += generate_sqr(_sync_phases[v], inc_sync, basic1_pw_curve[mod_index]) * basic1_sqr_mix_curve[mod_index]; + if constexpr (BasicSaw) synced_sample += generate_saw(_sync_phases[v], inc_sync) * basic_saw_mix_curve[mod_index]; + if constexpr (BasicSin) synced_sample += std::sin(2.0f * pi32 * _sync_phases[v]) * basic_sin_mix_curve[mod_index]; + if constexpr (BasicTri) synced_sample += generate_triangle(_sync_phases[v], inc_sync) * basic_tri_mix_curve[mod_index]; + if constexpr (BasicSqr) synced_sample += generate_sqr(_sync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; if constexpr (DSF) synced_sample = generate_dsf(_sync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); // generate the unsynced sample and crossover @@ -1278,10 +1278,10 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if (_unsync_phases[v] == 1) _unsync_phases[v] = 0; // this could be more efficient? assert(0 <= _unsync_phases[v] && _unsync_phases[v] < 1); - if constexpr (Basic1Saw) unsynced_sample += generate_saw(_unsync_phases[v], inc_sync) * basic1_saw_mix_curve[mod_index]; - if constexpr (Basic1Sin) unsynced_sample += std::sin(2.0f * pi32 * _unsync_phases[v]) * basic1_sin_mix_curve[mod_index]; - if constexpr (Basic1Tri) unsynced_sample += generate_triangle(_unsync_phases[v], inc_sync) * basic1_tri_mix_curve[mod_index]; - if constexpr (Basic1Sqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, basic1_pw_curve[mod_index]) * basic1_sqr_mix_curve[mod_index]; + if constexpr (BasicSaw) unsynced_sample += generate_saw(_unsync_phases[v], inc_sync) * basic_saw_mix_curve[mod_index]; + if constexpr (BasicSin) unsynced_sample += std::sin(2.0f * pi32 * _unsync_phases[v]) * basic_sin_mix_curve[mod_index]; + if constexpr (BasicTri) unsynced_sample += generate_triangle(_unsync_phases[v], inc_sync) * basic_tri_mix_curve[mod_index]; + if constexpr (BasicSqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; if constexpr (DSF) unsynced_sample = generate_dsf(_unsync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); increment_and_wrap_phase(_unsync_phases[v], inc_sync); From 9c528e3526c993eb2fbe9f3fc4a9182db81092fa Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Mon, 14 Oct 2024 20:52:14 +0200 Subject: [PATCH 28/61] take 4 --- param_reference.html | 122 ++++++++++++++---- .../firefly_synth/oscillator.cpp | 47 +++++-- 2 files changed, 133 insertions(+), 36 deletions(-) diff --git a/param_reference.html b/param_reference.html index 649f2ed86..2fffdefa7 100644 --- a/param_reference.html +++ b/param_reference.html @@ -2917,8 +2917,8 @@

Osc

Phase offset for subsequent voices, to get that unison effect 'right from the start'. Only applicable to Basic and DSF generators. -Basic 1 Sin On -Basic 1 +Basic Sin On +Basic Yes Patch 1 @@ -2934,8 +2934,8 @@

Osc

Toggle sine generator on/off. -Basic 1 Sin Mix -Basic 1 +Basic Sin Mix +Basic Yes Patch 1 @@ -2951,8 +2951,8 @@

Osc

Sine generator mix amount. -Basic 1 Saw On -Basic 1 +Basic Saw On +Basic Yes Patch 1 @@ -2968,8 +2968,8 @@

Osc

Toggle saw generator on/off. -Basic 1 Saw Mix -Basic 1 +Basic Saw Mix +Basic Yes Patch 1 @@ -2985,8 +2985,8 @@

Osc

Saw generator mix amount. -Basic 1 Tri On -Basic 1 +Basic Tri On +Basic Yes Patch 1 @@ -3002,8 +3002,8 @@

Osc

Toggle triangle generator on/off. -Basic 1 Tri Mix -Basic 1 +Basic Tri Mix +Basic Yes Patch 1 @@ -3019,8 +3019,8 @@

Osc

Triangle generator mix amount. -Basic 1 Sqr On -Basic 1 +Basic Sqr On +Basic Yes Patch 1 @@ -3036,8 +3036,8 @@

Osc

Toggle square generator on/off. -Basic 1 Sqr Mix -Basic 1 +Basic Sqr Mix +Basic Yes Patch 1 @@ -3053,8 +3053,8 @@

Osc

Square generator mix amount. -Basic 1 Sqr PW -Basic 1 PW +Basic Sqr PW +Basic PW Yes Patch 1 @@ -3070,8 +3070,8 @@

Osc

Square generator pulse width. -Basic 2 Wave 1 -Basic 2 +Combi Wave 1 +Combi Yes Patch 1 @@ -3087,8 +3087,59 @@

Osc

Selects the base waveform. -Basic 2 Wave 2 -Basic 2 +Combi Skew X 1 +Combi +Yes +Patch +1 +Input +Accurate +Modulate +0.00 % +100.00 % +0.00 % +N/A + + +Wave 1 skew X amount. + + +Combi Skew Y 1 +Combi +Yes +Patch +1 +Input +Accurate +Modulate +0.00 % +100.00 % +0.00 % +N/A + + +Wave 1 skew Y amount. + + +Combi Freq +Combi +Yes +Patch +1 +Input +Accurate +Modulate +0.00 % +100.00 % +0.00 % +N/A + + +Controls wave 2 frequency. + + +Combi Wave 2 +Combi Yes Patch 1 @@ -3104,8 +3155,25 @@

Osc

Selects the overlay waveform. -Basic 2 Freq -Basic 2 +Combi Skew X 2 +Combi +Yes +Patch +1 +Input +Accurate +Modulate +0.00 % +100.00 % +0.00 % +N/A + + +Wave 2 skew X amount. + + +Combi Skew Y 2 +Combi Yes Patch 1 @@ -3118,11 +3186,11 @@

Osc

N/A -Selects the overlay frequency. +Wave 2 skew Y amount. -Basic 2 Mix -Basic 2 +Combi Mix +Combi Yes Patch 1 diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 9d3cc6e82..d12eafdfa 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -32,7 +32,8 @@ enum { param_uni_voices, param_uni_sprd, param_uni_dtn, param_uni_phase, param_basic_sin_on, param_basic_sin_mix, param_basic_saw_on, param_basic_saw_mix, param_basic_tri_on, param_basic_tri_mix, param_basic_sqr_on, param_basic_sqr_mix, param_basic_sqr_pw, - param_combi_wave1, param_combi_wave2, param_combi_freq, param_combi_mix, + param_combi_wave1, param_combi_skew_x_1, param_combi_skew_y_1, param_combi_freq, + param_combi_wave2, param_combi_skew_x_2, param_combi_skew_y_2, param_combi_mix, param_dsf_parts, param_dsf_dist, param_dsf_dcy, param_rand_svf, param_rand_rate, param_rand_freq, param_rand_res, param_rand_seed, // shared k+s/noise param_kps_fdbk, param_kps_mid, param_kps_stretch, @@ -536,7 +537,7 @@ osc_topo(int section, gui_position const& pos) auto& combi = result.sections.emplace_back(make_param_section(section_combi, make_topo_tag_basic("{7BB6F0D9-4A04-4932-B7CD-C3AF5C13C067}", "Combi"), - make_param_section_gui({ 0, 4, 2, 2 }, gui_dimension({ 1, 1 }, { 1, 1 })))); // todo autosize + make_param_section_gui({ 0, 4, 2, 2 }, gui_dimension({ 1, 1 }, { 1, 1, 1, 1 })))); // todo autosize combi.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); auto& combi_wave_1 = result.params.emplace_back(make_param( @@ -546,6 +547,27 @@ osc_topo(int section, gui_position const& pos) make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_wave_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_wave_1.info.description = "Selects the base waveform."; + auto& combi_skew_x_1 = result.params.emplace_back(make_param( + make_topo_info("{961FA897-E195-48D0-A43B-B2DDAF796F2B}", true, "Combi Skew X 1", "Skew X", "Skew X 1", param_combi_skew_x_1, 1), + make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), + make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 1, 1, 1 }, + make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); + combi_skew_x_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); + combi_skew_x_1.info.description = "Wave 1 skew X amount."; + auto& combi_skew_y_1 = result.params.emplace_back(make_param( + make_topo_info("{CF5A5AA9-7AC0-43D4-862F-17FA98A09655}", true, "Combi Skew Y 1", "Skew Y", "Skew Y 1", param_combi_skew_y_1, 1), + make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), + make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 2, 1, 1 }, + make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); + combi_skew_y_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); + combi_skew_y_1.info.description = "Wave 1 skew Y amount."; + auto& combi_freq = result.params.emplace_back(make_param( + make_topo_info("{428C5833-3BBE-40AF-9A9C-5EACA40F4CA4}", true, "Combi Freq", "Freq", "Combi Freq", param_combi_freq, 1), + make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), // TODO how much + make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 3, 1, 1 }, + make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); + combi_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); + combi_freq.info.description = "Controls wave 2 frequency."; auto& combi_wave_2 = result.params.emplace_back(make_param( make_topo_info("{A8BAE205-AA10-4C48-8C40-5C5B4B1118FE}", true, "Combi Wave 2", "Wave 2", "Wave 2", param_combi_wave2, 1), make_param_dsp_voice(param_automate::automate), make_domain_item(combi_wave_items(), "Sin"), @@ -553,17 +575,24 @@ osc_topo(int section, gui_position const& pos) make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_wave_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_wave_2.info.description = "Selects the overlay waveform."; - auto& combi_freq = result.params.emplace_back(make_param( - make_topo_info("{428C5833-3BBE-40AF-9A9C-5EACA40F4CA4}", true, "Combi Freq", "Freq", "Combi Freq", param_combi_freq, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), // TODO how much - make_param_gui_single(section_combi, gui_edit_type::hslider, { 0, 1, 1, 1 }, + auto& combi_skew_x_2 = result.params.emplace_back(make_param( + make_topo_info("{420B67B9-5062-4004-B2E9-8F0DC3B7CACE}", true, "Combi Skew X 2", "Skew X", "Skew X 2", param_combi_skew_x_2, 1), + make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), + make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 1, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - combi_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); - combi_freq.info.description = "Selects the overlay frequency."; + combi_skew_x_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); + combi_skew_x_2.info.description = "Wave 2 skew X amount."; + auto& combi_skew_y_2 = result.params.emplace_back(make_param( + make_topo_info("{AC7EA48C-533E-45E7-B12F-044887495F3C}", true, "Combi Skew Y 2", "Skew Y", "Skew Y 2", param_combi_skew_y_2, 1), + make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), + make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 2, 1, 1 }, + make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); + combi_skew_y_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); + combi_skew_y_2.info.description = "Wave 2 skew Y amount."; auto& combi_mix = result.params.emplace_back(make_param( make_topo_info("{3590AA81-DDF3-4785-8944-D18B9869C609}", true, "Combi Mix", "Mix", "Combi Mix", param_combi_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), // TODO how much - make_param_gui_single(section_combi, gui_edit_type::hslider, { 1, 1, 1, 1 }, + make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 3, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_mix.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_mix.info.description = "Controls the overlay mix amount."; From 153e6e455be46c5cbc754472e135ee4f37073f4b Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Mon, 14 Oct 2024 20:59:53 +0200 Subject: [PATCH 29/61] take 5 --- .../firefly_synth/oscillator.cpp | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index d12eafdfa..7001517ba 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -537,62 +537,66 @@ osc_topo(int section, gui_position const& pos) auto& combi = result.sections.emplace_back(make_param_section(section_combi, make_topo_tag_basic("{7BB6F0D9-4A04-4932-B7CD-C3AF5C13C067}", "Combi"), - make_param_section_gui({ 0, 4, 2, 2 }, gui_dimension({ 1, 1 }, { 1, 1, 1, 1 })))); // todo autosize + make_param_section_gui({ 0, 4, 2, 2 }, gui_dimension({ 1, 1 }, { + gui_dimension::auto_size_all, gui_dimension::auto_size_all, + gui_dimension::auto_size_all, 1, + gui_dimension::auto_size_all, 1, + gui_dimension::auto_size_all, 1 }), gui_label_edit_cell_split::horizontal))); combi.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); auto& combi_wave_1 = result.params.emplace_back(make_param( - make_topo_info("{D6B0CF43-5136-4D92-8EEA-2AE5EDD30C0E}", true, "Combi Wave 1", "Wave 1", "Wave 1", param_combi_wave1, 1), + make_topo_info("{D6B0CF43-5136-4D92-8EEA-2AE5EDD30C0E}", true, "Combi Wave 1", "Wave 1", "Combi Wave 1", param_combi_wave1, 1), make_param_dsp_voice(param_automate::automate), make_domain_item(combi_wave_items(), "Sin"), make_param_gui_single(section_combi, gui_edit_type::autofit_list, { 0, 0, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_wave_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_wave_1.info.description = "Selects the base waveform."; auto& combi_skew_x_1 = result.params.emplace_back(make_param( - make_topo_info("{961FA897-E195-48D0-A43B-B2DDAF796F2B}", true, "Combi Skew X 1", "Skew X", "Skew X 1", param_combi_skew_x_1, 1), + make_topo_info("{961FA897-E195-48D0-A43B-B2DDAF796F2B}", true, "Combi Skew X 1", "Skw X", "Combi Skew X 1", param_combi_skew_x_1, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), - make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 1, 1, 1 }, + make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 2, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_skew_x_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_skew_x_1.info.description = "Wave 1 skew X amount."; auto& combi_skew_y_1 = result.params.emplace_back(make_param( - make_topo_info("{CF5A5AA9-7AC0-43D4-862F-17FA98A09655}", true, "Combi Skew Y 1", "Skew Y", "Skew Y 1", param_combi_skew_y_1, 1), + make_topo_info("{CF5A5AA9-7AC0-43D4-862F-17FA98A09655}", true, "Combi Skew Y 1", "Skw Y", "Combi Skew Y 1", param_combi_skew_y_1, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), - make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 2, 1, 1 }, + make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 4, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_skew_y_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_skew_y_1.info.description = "Wave 1 skew Y amount."; auto& combi_freq = result.params.emplace_back(make_param( make_topo_info("{428C5833-3BBE-40AF-9A9C-5EACA40F4CA4}", true, "Combi Freq", "Freq", "Combi Freq", param_combi_freq, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), // TODO how much - make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 3, 1, 1 }, + make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 6, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_freq.info.description = "Controls wave 2 frequency."; auto& combi_wave_2 = result.params.emplace_back(make_param( - make_topo_info("{A8BAE205-AA10-4C48-8C40-5C5B4B1118FE}", true, "Combi Wave 2", "Wave 2", "Wave 2", param_combi_wave2, 1), + make_topo_info("{A8BAE205-AA10-4C48-8C40-5C5B4B1118FE}", true, "Combi Wave 2", "Wave 2", "Combi Wave 2", param_combi_wave2, 1), make_param_dsp_voice(param_automate::automate), make_domain_item(combi_wave_items(), "Sin"), make_param_gui_single(section_combi, gui_edit_type::autofit_list, { 1, 0, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_wave_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_wave_2.info.description = "Selects the overlay waveform."; auto& combi_skew_x_2 = result.params.emplace_back(make_param( - make_topo_info("{420B67B9-5062-4004-B2E9-8F0DC3B7CACE}", true, "Combi Skew X 2", "Skew X", "Skew X 2", param_combi_skew_x_2, 1), + make_topo_info("{420B67B9-5062-4004-B2E9-8F0DC3B7CACE}", true, "Combi Skew X 2", "Skw X", "Combi Skew X 2", param_combi_skew_x_2, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), - make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 1, 1, 1 }, + make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 2, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_skew_x_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_skew_x_2.info.description = "Wave 2 skew X amount."; auto& combi_skew_y_2 = result.params.emplace_back(make_param( - make_topo_info("{AC7EA48C-533E-45E7-B12F-044887495F3C}", true, "Combi Skew Y 2", "Skew Y", "Skew Y 2", param_combi_skew_y_2, 1), + make_topo_info("{AC7EA48C-533E-45E7-B12F-044887495F3C}", true, "Combi Skew Y 2", "Skw Y", "Combi Skew Y 2", param_combi_skew_y_2, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), - make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 2, 1, 1 }, + make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 4, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_skew_y_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_skew_y_2.info.description = "Wave 2 skew Y amount."; auto& combi_mix = result.params.emplace_back(make_param( make_topo_info("{3590AA81-DDF3-4785-8944-D18B9869C609}", true, "Combi Mix", "Mix", "Combi Mix", param_combi_mix, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), // TODO how much - make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 3, 1, 1 }, + make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 6, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_mix.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_mix.info.description = "Controls the overlay mix amount."; From 57fb9432dbdbf464c461d821151a933c6275b36a Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Mon, 14 Oct 2024 21:50:19 +0200 Subject: [PATCH 30/61] take 6 --- .../firefly_synth/oscillator.cpp | 143 ++++++++++++++---- 1 file changed, 115 insertions(+), 28 deletions(-) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 7001517ba..88ee5bd50 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -18,8 +18,9 @@ namespace firefly_synth { static float const max_phase_mod = 0.1f; -enum { type_off, type_basic, type_combi, type_dsf, type_kps1, type_kps2, type_static }; +enum { combi_wave_sin, combi_wave_saw, combi_wave_tri, combi_wave_sqr }; enum { rand_svf_lpf, rand_svf_hpf, rand_svf_bpf, rand_svf_bsf, rand_svf_peq }; +enum { type_off, type_basic, type_combi, type_dsf, type_kps1, type_kps2, type_static }; enum { section_type, section_sync_on, section_sync_uni, section_basic, section_basic_pw, section_combi, section_dsf, section_rand }; enum { scratch_pb, scratch_cent, scratch_pitch, scratch_sync_semi, @@ -200,8 +201,15 @@ public module_engine { template void process_dsf(plugin_block& block, cv_audio_matrix_mixdown const* modulation); template void process_basic(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template void process_static(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - + template void process_static(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + + template void + process_combi(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template void + process_combi_wave1(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template + void process_combi_wave1_wave2(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + template void process_basic_sin(plugin_block& block, cv_audio_matrix_mixdown const* modulation); template @@ -210,9 +218,11 @@ public module_engine { void process_basic_sin_saw_tri(plugin_block& block, cv_audio_matrix_mixdown const* modulation); template void process_basic_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template + template void process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template + template void process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixdown const* modulation); }; @@ -716,6 +726,12 @@ osc_topo(int section, gui_position const& pos) return result; } +static inline float +generate_sin(float phase) +{ + return std::sin(2.0f * pi32 * phase); +} + // https://www.kvraudio.com/forum/viewtopic.php?t=375517 static inline float generate_blep(float phase, float inc) @@ -734,7 +750,7 @@ generate_saw(float phase, float inc) } // https://dsp.stackexchange.com/questions/54790/polyblamp-anti-aliasing-in-c -static float +static inline float generate_blamp(float phase, float increment) { float y = 0.0f; @@ -752,7 +768,7 @@ generate_blamp(float phase, float increment) return y * increment / 15; } -static float +static inline float generate_triangle(float phase, float increment) { float const triangle_scale = 0.9f; @@ -768,7 +784,7 @@ generate_triangle(float phase, float increment) return result * triangle_scale; } -static float +static inline float generate_sqr(float phase, float increment, float pwm) { float const min_pw = 0.05f; @@ -778,6 +794,33 @@ generate_sqr(float phase, float increment, float pwm) return (saw1 - saw2) * 0.5f; } +static inline float +generate_combi(int wave1, int wave2, float phase, float increment) +{ + float r1 = 0.0f; + float r2 = 0.0f; + + switch (wave1) + { + case combi_wave_sin: r1 = generate_sin(phase); break; + case combi_wave_saw: r1 = generate_saw(phase, increment); break; + case combi_wave_tri: r1 = generate_triangle(phase, increment); break; + case combi_wave_sqr: r1 = generate_sqr(phase, increment, 0.0f); break; + default: assert(false); break; + } + + switch (wave2) + { + case combi_wave_sin: r2 = generate_sin(phase); break; + case combi_wave_saw: r2 = generate_saw(phase, increment); break; + case combi_wave_tri: r2 = generate_triangle(phase, increment); break; + case combi_wave_sqr: r2 = generate_sqr(phase, increment, 0.0f); break; + default: assert(false); break; + } + + return (r1 + r2) * 0.5f; +} + osc_engine:: osc_engine(int max_frame_count, float sample_rate): _oversampler(max_frame_count) @@ -974,7 +1017,7 @@ osc_engine::process(plugin_block& block, cv_audio_matrix_mixdown const* modulati if (type == type_off) { // still need to process to clear out the buffer in case we are mod source - process_tuning_mode(block, modulation); + process_tuning_mode(block, modulation); return; } @@ -982,10 +1025,10 @@ osc_engine::process(plugin_block& block, cv_audio_matrix_mixdown const* modulati { case type_dsf: process_dsf(block, modulation); break; case type_basic: process_basic(block, modulation); break; - case type_combi: break; // TODO + case type_combi: process_combi(block, modulation); break; case type_static: process_static(block, modulation); break; - case type_kps1: process_tuning_mode(block, modulation); break; - case type_kps2: process_tuning_mode(block, modulation); break; + case type_kps1: process_tuning_mode(block, modulation); break; + case type_kps2: process_tuning_mode(block, modulation); break; default: assert(false); break; } } @@ -994,9 +1037,44 @@ template void osc_engine::process_dsf(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { if(block.state.own_block_automation[param_hard_sync][0].step()) - process_tuning_mode(block, modulation); + process_tuning_mode(block, modulation); else - process_tuning_mode(block, modulation); + process_tuning_mode(block, modulation); +} + +template void +osc_engine::process_combi(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +{ + if (block.state.own_block_automation[param_hard_sync][0].step()) + process_combi_wave1(block, modulation); + else + process_combi_wave1(block, modulation); +} + +template void +osc_engine::process_combi_wave1(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +{ + switch (block.state.own_block_automation[param_combi_wave1][0].step()) + { + case combi_wave_sin: process_combi_wave1_wave2(block, modulation); break; + case combi_wave_saw: process_combi_wave1_wave2(block, modulation); break; + case combi_wave_tri: process_combi_wave1_wave2(block, modulation); break; + case combi_wave_sqr: process_combi_wave1_wave2(block, modulation); break; + default: assert(false); break; + } +} + +template void +osc_engine::process_combi_wave1_wave2(plugin_block& block, cv_audio_matrix_mixdown const* modulation) +{ + switch (block.state.own_block_automation[param_combi_wave2][0].step()) + { + case combi_wave_sin: process_tuning_mode(block, modulation); break; + case combi_wave_saw: process_tuning_mode(block, modulation); break; + case combi_wave_tri: process_tuning_mode(block, modulation); break; + case combi_wave_sqr: process_tuning_mode(block, modulation); break; + default: assert(false); break; + } } template void @@ -1006,11 +1084,11 @@ osc_engine::process_static(plugin_block& block, cv_audio_matrix_mixdown const* m int svf_mode = block_auto[param_rand_svf][0].step(); switch (svf_mode) { - case rand_svf_lpf: process_tuning_mode(block, modulation); break; - case rand_svf_hpf: process_tuning_mode(block, modulation); break; - case rand_svf_bpf: process_tuning_mode(block, modulation); break; - case rand_svf_bsf: process_tuning_mode(block, modulation); break; - case rand_svf_peq: process_tuning_mode(block, modulation); break; + case rand_svf_lpf: process_tuning_mode(block, modulation); break; + case rand_svf_hpf: process_tuning_mode(block, modulation); break; + case rand_svf_bpf: process_tuning_mode(block, modulation); break; + case rand_svf_bsf: process_tuning_mode(block, modulation); break; + case rand_svf_peq: process_tuning_mode(block, modulation); break; default: assert(false); break; } } @@ -1056,13 +1134,14 @@ osc_engine::process_basic_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_m { auto const& block_auto = block.state.own_block_automation; bool sync = block_auto[param_hard_sync][0].step() != 0; - if (sync) process_tuning_mode(block, modulation); - else process_tuning_mode(block, modulation); + if (sync) process_tuning_mode(block, modulation); + else process_tuning_mode(block, modulation); } template < bool Graph, bool BasicSin, bool BasicSaw, bool BasicTri, bool BasicSqr, + bool Combi, int CombiWave1, int CombiWave2, bool DSF, bool Sync, bool KPS, bool KPSAutoFdbk, bool Static, int StaticSVFType> void osc_engine::process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown const* modulation) @@ -1070,19 +1149,19 @@ osc_engine::process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown con switch (block.current_tuning_mode) { case engine_tuning_mode_no_tuning: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_on_note_before_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_on_note_after_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_continuous_before_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_continuous_after_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; default: assert(false); @@ -1093,6 +1172,7 @@ osc_engine::process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown con template < bool Graph, bool BasicSin, bool BasicSaw, bool BasicTri, bool BasicSqr, + bool Combi, int CombiWave1, int CombiWave2, bool DSF, bool Sync, bool KPS, bool KPSAutoFdbk, bool Static, int StaticSVFType, engine_tuning_mode TuningMode> void osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixdown const* modulation) @@ -1102,12 +1182,15 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicSaw) generator_count++; if constexpr (BasicTri) generator_count++; if constexpr (BasicSqr) generator_count++; + if constexpr (Combi) generator_count++; if constexpr (DSF) generator_count++; if constexpr (KPS) generator_count++; if constexpr (Static) generator_count++; static_assert(!KPSAutoFdbk || KPS); static_assert(StaticSVFType == -1 || Static); + static_assert(Combi || (CombiWave1 == -1 && CombiWave2 == -1)); + static_assert(!Combi || (CombiWave1 != -1 && CombiWave2 != -1)); // need to clear all active outputs because we // don't know if we are a modulation source @@ -1135,6 +1218,8 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd int dsf_parts = (int)std::round(block_auto[param_dsf_parts][0].real()); int global_pb_range = block.state.all_block_automation[module_global_in][0][global_in_param_pb_range][0].step(); + int combi_wave_1 = block_auto[param_combi_wave1][0].step(); + int combi_wave_2 = block_auto[param_combi_wave2][0].step(); int rand_seed = block_auto[param_rand_seed][0].step(); int kps_mid_note = block_auto[param_kps_mid][0].step(); float kps_mid_freq = block.pitch_to_freq_with_tuning(kps_mid_note); @@ -1291,10 +1376,11 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd assert(0 <= _sync_phases[v] && _sync_phases[v] < 1); } + if constexpr (BasicSin) synced_sample += generate_sin(_sync_phases[v]) * basic_sin_mix_curve[mod_index]; if constexpr (BasicSaw) synced_sample += generate_saw(_sync_phases[v], inc_sync) * basic_saw_mix_curve[mod_index]; - if constexpr (BasicSin) synced_sample += std::sin(2.0f * pi32 * _sync_phases[v]) * basic_sin_mix_curve[mod_index]; if constexpr (BasicTri) synced_sample += generate_triangle(_sync_phases[v], inc_sync) * basic_tri_mix_curve[mod_index]; if constexpr (BasicSqr) synced_sample += generate_sqr(_sync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; + if constexpr (Combi) synced_sample = generate_combi(combi_wave_1, combi_wave_2, _sync_phases[v], inc_sync); if constexpr (DSF) synced_sample = generate_dsf(_sync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); // generate the unsynced sample and crossover @@ -1311,10 +1397,11 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if (_unsync_phases[v] == 1) _unsync_phases[v] = 0; // this could be more efficient? assert(0 <= _unsync_phases[v] && _unsync_phases[v] < 1); + if constexpr (BasicSin) unsynced_sample += generate_sin(_unsync_phases[v]) * basic_sin_mix_curve[mod_index]; if constexpr (BasicSaw) unsynced_sample += generate_saw(_unsync_phases[v], inc_sync) * basic_saw_mix_curve[mod_index]; - if constexpr (BasicSin) unsynced_sample += std::sin(2.0f * pi32 * _unsync_phases[v]) * basic_sin_mix_curve[mod_index]; if constexpr (BasicTri) unsynced_sample += generate_triangle(_unsync_phases[v], inc_sync) * basic_tri_mix_curve[mod_index]; if constexpr (BasicSqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; + if constexpr (Combi) unsynced_sample = generate_combi(combi_wave_1, combi_wave_2, _unsync_phases[v], inc_sync); if constexpr (DSF) unsynced_sample = generate_dsf(_unsync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); increment_and_wrap_phase(_unsync_phases[v], inc_sync); From 9893205ee2e9549d12d083c90276db9f7dac91f3 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Mon, 14 Oct 2024 21:55:34 +0200 Subject: [PATCH 31/61] take 7 --- src/firefly_synth/firefly_synth/oscillator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 88ee5bd50..5dd531707 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -805,7 +805,7 @@ generate_combi(int wave1, int wave2, float phase, float increment) case combi_wave_sin: r1 = generate_sin(phase); break; case combi_wave_saw: r1 = generate_saw(phase, increment); break; case combi_wave_tri: r1 = generate_triangle(phase, increment); break; - case combi_wave_sqr: r1 = generate_sqr(phase, increment, 0.0f); break; + case combi_wave_sqr: r1 = generate_sqr(phase, increment, 1.0f); break; default: assert(false); break; } @@ -814,7 +814,7 @@ generate_combi(int wave1, int wave2, float phase, float increment) case combi_wave_sin: r2 = generate_sin(phase); break; case combi_wave_saw: r2 = generate_saw(phase, increment); break; case combi_wave_tri: r2 = generate_triangle(phase, increment); break; - case combi_wave_sqr: r2 = generate_sqr(phase, increment, 0.0f); break; + case combi_wave_sqr: r2 = generate_sqr(phase, increment, 1.0f); break; default: assert(false); break; } From c7e788912ec4f27afad9dec47f2f021fca3eae42 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Mon, 14 Oct 2024 22:41:28 +0200 Subject: [PATCH 32/61] take 8 --- param_reference.html | 4 +- .../firefly_synth/oscillator.cpp | 37 ++++++++++++------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/param_reference.html b/param_reference.html index 2fffdefa7..d62a494ae 100644 --- a/param_reference.html +++ b/param_reference.html @@ -3130,8 +3130,8 @@

Osc

Accurate Modulate 0.00 % +3200.00 % 100.00 % -0.00 % N/A @@ -3199,7 +3199,7 @@

Osc

Modulate 0.00 % 100.00 % -0.00 % +50.00 % N/A diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 5dd531707..3700953c5 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -25,6 +25,7 @@ enum { section_type, section_sync_on, section_sync_uni, section_basic, section_b enum { scratch_pb, scratch_cent, scratch_pitch, scratch_sync_semi, scratch_basic_sin_mix, scratch_basic_saw_mix, scratch_basic_tri_mix, scratch_basic_sqr_mix, + scratch_combi_freq, scratch_combi_mix, scratch_rand_freq, scratch_rand_rate, scratch_count }; // todo overlap scratch space enum { @@ -577,7 +578,7 @@ osc_topo(int section, gui_position const& pos) combi_skew_y_1.info.description = "Wave 1 skew Y amount."; auto& combi_freq = result.params.emplace_back(make_param( make_topo_info("{428C5833-3BBE-40AF-9A9C-5EACA40F4CA4}", true, "Combi Freq", "Freq", "Combi Freq", param_combi_freq, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), // TODO how much + make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(0.0f, 32.0f, 1.0f, 2, true), make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 6, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); @@ -605,7 +606,7 @@ osc_topo(int section, gui_position const& pos) combi_skew_y_2.info.description = "Wave 2 skew Y amount."; auto& combi_mix = result.params.emplace_back(make_param( make_topo_info("{3590AA81-DDF3-4785-8944-D18B9869C609}", true, "Combi Mix", "Mix", "Combi Mix", param_combi_mix, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), // TODO how much + make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.5f, 2, true), make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 6, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_mix.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); @@ -795,30 +796,33 @@ generate_sqr(float phase, float increment, float pwm) } static inline float -generate_combi(int wave1, int wave2, float phase, float increment) +generate_combi(int wave1, int wave2, float phase1, float increment, float freq, float mix) { float r1 = 0.0f; float r2 = 0.0f; + float phase2 = phase1 * (1.0 + freq); + phase2 -= std::floor(phase2); switch (wave1) { - case combi_wave_sin: r1 = generate_sin(phase); break; - case combi_wave_saw: r1 = generate_saw(phase, increment); break; - case combi_wave_tri: r1 = generate_triangle(phase, increment); break; - case combi_wave_sqr: r1 = generate_sqr(phase, increment, 1.0f); break; + case combi_wave_sin: r1 = generate_sin(phase1); break; + case combi_wave_saw: r1 = generate_saw(phase1, increment); break; + case combi_wave_tri: r1 = generate_triangle(phase1, increment); break; + case combi_wave_sqr: r1 = generate_sqr(phase1, increment, 1.0f); break; default: assert(false); break; } switch (wave2) { - case combi_wave_sin: r2 = generate_sin(phase); break; - case combi_wave_saw: r2 = generate_saw(phase, increment); break; - case combi_wave_tri: r2 = generate_triangle(phase, increment); break; - case combi_wave_sqr: r2 = generate_sqr(phase, increment, 1.0f); break; + case combi_wave_sin: r2 = generate_sin(phase2); break; + case combi_wave_saw: r2 = generate_saw(phase2, increment * freq); break; + case combi_wave_tri: r2 = generate_triangle(phase2, increment * freq); break; + case combi_wave_sqr: r2 = generate_sqr(phase2, increment * freq, 1.0f); break; default: assert(false); break; } - return (r1 + r2) * 0.5f; + // TODO deal with non-integer by lerp + return (1.0f - mix) * r1 + mix * r2; } osc_engine:: @@ -1267,6 +1271,11 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicTri) block.normalized_to_raw_block(module_osc, param_basic_tri_mix, basic_tri_mix_curve_norm, basic_tri_mix_curve); if constexpr (BasicSqr) block.normalized_to_raw_block(module_osc, param_basic_sqr_mix, basic_sqr_mix_curve_norm, basic_sqr_mix_curve); + auto const& combi_mix_curve = *(*modulation)[module_osc][block.module_slot][param_combi_mix][0]; + auto& combi_freq_curve = block.state.own_scratch[scratch_combi_freq]; + auto const& combi_freq_curve_norm = *(*modulation)[module_osc][block.module_slot][param_combi_freq][0]; + if constexpr (Combi) block.normalized_to_raw_block(module_osc, param_combi_freq, combi_freq_curve_norm, combi_freq_curve); + auto& rand_rate_curve = block.state.own_scratch[scratch_rand_rate]; auto& rand_freq_curve = block.state.own_scratch[scratch_rand_freq]; auto const& rand_rate_curve_norm = *(*modulation)[module_osc][block.module_slot][param_rand_rate][0]; @@ -1380,8 +1389,8 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicSaw) synced_sample += generate_saw(_sync_phases[v], inc_sync) * basic_saw_mix_curve[mod_index]; if constexpr (BasicTri) synced_sample += generate_triangle(_sync_phases[v], inc_sync) * basic_tri_mix_curve[mod_index]; if constexpr (BasicSqr) synced_sample += generate_sqr(_sync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; - if constexpr (Combi) synced_sample = generate_combi(combi_wave_1, combi_wave_2, _sync_phases[v], inc_sync); if constexpr (DSF) synced_sample = generate_dsf(_sync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); + if constexpr (Combi) synced_sample = generate_combi(combi_wave_1, combi_wave_2, _sync_phases[v], inc_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index]); // generate the unsynced sample and crossover float unsynced_sample = 0; @@ -1401,8 +1410,8 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicSaw) unsynced_sample += generate_saw(_unsync_phases[v], inc_sync) * basic_saw_mix_curve[mod_index]; if constexpr (BasicTri) unsynced_sample += generate_triangle(_unsync_phases[v], inc_sync) * basic_tri_mix_curve[mod_index]; if constexpr (BasicSqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; - if constexpr (Combi) unsynced_sample = generate_combi(combi_wave_1, combi_wave_2, _unsync_phases[v], inc_sync); if constexpr (DSF) unsynced_sample = generate_dsf(_unsync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); + if constexpr (Combi) unsynced_sample = generate_combi(combi_wave_1, combi_wave_2, _unsync_phases[v], inc_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index]); increment_and_wrap_phase(_unsync_phases[v], inc_sync); float unsynced_weight = _unsync_samples[v]-- / (sync_over_samples + 1.0f); From 52799004c81071489346f9f42cca9aca7b68ccc9 Mon Sep 17 00:00:00 2001 From: ofsjoerdk Date: Tue, 15 Oct 2024 18:23:15 +0200 Subject: [PATCH 33/61] take 9 --- param_reference.html | 6 ++-- .../firefly_synth/oscillator.cpp | 31 ++++++++++++++++--- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/param_reference.html b/param_reference.html index d62a494ae..df290ece5 100644 --- a/param_reference.html +++ b/param_reference.html @@ -3129,9 +3129,9 @@

Osc

Input Accurate Modulate -0.00 % -3200.00 % -100.00 % +0.00 +32.00 +1.00 N/A diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 3700953c5..b2f8fdd8c 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -578,7 +578,7 @@ osc_topo(int section, gui_position const& pos) combi_skew_y_1.info.description = "Wave 1 skew Y amount."; auto& combi_freq = result.params.emplace_back(make_param( make_topo_info("{428C5833-3BBE-40AF-9A9C-5EACA40F4CA4}", true, "Combi Freq", "Freq", "Combi Freq", param_combi_freq, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_percentage(0.0f, 32.0f, 1.0f, 2, true), + make_param_dsp_accurate(param_automate::modulate), make_domain_linear(0.0f, 32.0f, 1.0f, 2, ""), make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 6, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); @@ -796,10 +796,19 @@ generate_sqr(float phase, float increment, float pwm) } static inline float -generate_combi(int wave1, int wave2, float phase1, float increment, float freq, float mix) +generate_combi(int wave1, int wave2, float phase1, float increment, float freq, float mix, float skx1, float sky1, float skx2, float sxy2) { float r1 = 0.0f; float r2 = 0.0f; + + // todo dont do this it causes pitch drift (shouldv seen that coming) + phase1 = std::pow(phase1, 1.0f + skx1 * 9.0f); + + // todo skewx/skewy = affect wave2 volume relative to phase + // freq/mix as-intended + + + // todo limit to nyquist float phase2 = phase1 * (1.0 + freq); phase2 -= std::floor(phase2); @@ -821,8 +830,11 @@ generate_combi(int wave1, int wave2, float phase1, float increment, float freq, default: assert(false); break; } + // tryout: skew x1 as % of phase 1 + float final_mix = 1 - phase1; + // TODO deal with non-integer by lerp - return (1.0f - mix) * r1 + mix * r2; + return (1.0f - final_mix) * r1 + final_mix * r2; } osc_engine:: @@ -1272,6 +1284,10 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicSqr) block.normalized_to_raw_block(module_osc, param_basic_sqr_mix, basic_sqr_mix_curve_norm, basic_sqr_mix_curve); auto const& combi_mix_curve = *(*modulation)[module_osc][block.module_slot][param_combi_mix][0]; + auto const& combi_skx1_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_x_1][0]; + auto const& combi_sky1_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_y_1][0]; + auto const& combi_skx2_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_x_2][0]; + auto const& combi_sky2_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_y_2][0]; auto& combi_freq_curve = block.state.own_scratch[scratch_combi_freq]; auto const& combi_freq_curve_norm = *(*modulation)[module_osc][block.module_slot][param_combi_freq][0]; if constexpr (Combi) block.normalized_to_raw_block(module_osc, param_combi_freq, combi_freq_curve_norm, combi_freq_curve); @@ -1390,7 +1406,9 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicTri) synced_sample += generate_triangle(_sync_phases[v], inc_sync) * basic_tri_mix_curve[mod_index]; if constexpr (BasicSqr) synced_sample += generate_sqr(_sync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; if constexpr (DSF) synced_sample = generate_dsf(_sync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); - if constexpr (Combi) synced_sample = generate_combi(combi_wave_1, combi_wave_2, _sync_phases[v], inc_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index]); + if constexpr (Combi) synced_sample = generate_combi( + combi_wave_1, combi_wave_2, _sync_phases[v], inc_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index], + combi_skx1_curve[mod_index], combi_sky1_curve[mod_index], combi_skx2_curve[mod_index], combi_sky2_curve[mod_index]); // generate the unsynced sample and crossover float unsynced_sample = 0; @@ -1411,7 +1429,10 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicTri) unsynced_sample += generate_triangle(_unsync_phases[v], inc_sync) * basic_tri_mix_curve[mod_index]; if constexpr (BasicSqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; if constexpr (DSF) unsynced_sample = generate_dsf(_unsync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); - if constexpr (Combi) unsynced_sample = generate_combi(combi_wave_1, combi_wave_2, _unsync_phases[v], inc_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index]); + if constexpr (Combi) unsynced_sample = generate_combi( + combi_wave_1, combi_wave_2, _unsync_phases[v], inc_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index], + combi_skx1_curve[mod_index], combi_sky1_curve[mod_index], combi_skx2_curve[mod_index], combi_sky2_curve[mod_index]); + increment_and_wrap_phase(_unsync_phases[v], inc_sync); float unsynced_weight = _unsync_samples[v]-- / (sync_over_samples + 1.0f); From a06e33fd673e6d8841bbf1b4691f9f19fad8f680 Mon Sep 17 00:00:00 2001 From: ofsjoerdk Date: Tue, 15 Oct 2024 18:33:19 +0200 Subject: [PATCH 34/61] take 9take 10 --- src/firefly_synth/firefly_synth/oscillator.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index b2f8fdd8c..98538efc4 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -804,6 +804,8 @@ generate_combi(int wave1, int wave2, float phase1, float increment, float freq, // todo dont do this it causes pitch drift (shouldv seen that coming) phase1 = std::pow(phase1, 1.0f + skx1 * 9.0f); + // rename osci to hi/low + // morph hi/low / lo-hi // todo skewx/skewy = affect wave2 volume relative to phase // freq/mix as-intended From 2b73a9cfeffdc48600fede226e0056f4be968517 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 15 Oct 2024 19:21:20 +0200 Subject: [PATCH 35/61] take 11 --- .../firefly_synth/oscillator.cpp | 60 ++++++++++++++----- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 98538efc4..2a5500337 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -798,11 +798,13 @@ generate_sqr(float phase, float increment, float pwm) static inline float generate_combi(int wave1, int wave2, float phase1, float increment, float freq, float mix, float skx1, float sky1, float skx2, float sxy2) { - float r1 = 0.0f; - float r2 = 0.0f; + float lo_1 = 0.0f; + float lo_2 = 0.0f; + float hi_1 = 0.0f; + float hi_2 = 0.0f; // todo dont do this it causes pitch drift (shouldv seen that coming) - phase1 = std::pow(phase1, 1.0f + skx1 * 9.0f); + // phase1 = std::pow(phase1, 1.0f + skx1 * 9.0f); // rename osci to hi/low // morph hi/low / lo-hi @@ -816,27 +818,57 @@ generate_combi(int wave1, int wave2, float phase1, float increment, float freq, switch (wave1) { - case combi_wave_sin: r1 = generate_sin(phase1); break; - case combi_wave_saw: r1 = generate_saw(phase1, increment); break; - case combi_wave_tri: r1 = generate_triangle(phase1, increment); break; - case combi_wave_sqr: r1 = generate_sqr(phase1, increment, 1.0f); break; + case combi_wave_sin: + lo_1 = generate_sin(phase1); + hi_1 = generate_sin(phase2); + break; + case combi_wave_saw: + lo_1 = generate_saw(phase1, increment); + hi_1 = generate_saw(phase2, increment); + break; + case combi_wave_tri: + lo_1 = generate_triangle(phase1, increment); + hi_1 = generate_triangle(phase2, increment); + break; + case combi_wave_sqr: + lo_1 = generate_sqr(phase1, increment, 1.0f); + hi_1 = generate_sqr(phase2, increment, 1.0f); + break; default: assert(false); break; } switch (wave2) { - case combi_wave_sin: r2 = generate_sin(phase2); break; - case combi_wave_saw: r2 = generate_saw(phase2, increment * freq); break; - case combi_wave_tri: r2 = generate_triangle(phase2, increment * freq); break; - case combi_wave_sqr: r2 = generate_sqr(phase2, increment * freq, 1.0f); break; + case combi_wave_sin: + lo_2 = generate_sin(phase1); + hi_2 = generate_sin(phase2); + break; + case combi_wave_saw: + lo_2 = generate_saw(phase1, increment); + hi_2 = generate_saw(phase2, increment); + break; + case combi_wave_tri: + lo_2 = generate_triangle(phase1, increment); + hi_2 = generate_triangle(phase2, increment); + break; + case combi_wave_sqr: + lo_2 = generate_sqr(phase1, increment, 1.0f); + hi_2 = generate_sqr(phase2, increment, 1.0f); + break; default: assert(false); break; } - // tryout: skew x1 as % of phase 1 - float final_mix = 1 - phase1; + // todo tryout: skew x1 as % of phase 1 + //float final_mix = 0.5f; // TODO deal with non-integer by lerp - return (1.0f - final_mix) * r1 + final_mix * r2; + //return (1.0f - final_mix) * r1 + final_mix * r2; + + float morhp_lo = phase1 * skx1; + float low = (1.0f - morhp_lo) * lo_1 + morhp_lo * lo_2; + float morhp_hi = phase1 * skx2; + float hi = (1.0f - morhp_hi) * hi_1 + morhp_hi * hi_2; + return (low + hi) * 0.5f; } osc_engine:: From a2252e46465caabedafc628434e5b2ceed66089b Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 15 Oct 2024 20:09:22 +0200 Subject: [PATCH 36/61] take 12 --- src/firefly_synth/firefly_synth/oscillator.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 2a5500337..7d073e364 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -811,11 +811,17 @@ generate_combi(int wave1, int wave2, float phase1, float increment, float freq, // todo skewx/skewy = affect wave2 volume relative to phase // freq/mix as-intended + // PM test + // ALSO fix to nyquist + lerp to bandlimited somehow? + float pm_amt = sky1 * 4; // todo limit to nyquist - float phase2 = phase1 * (1.0 + freq); + //float phase2 = (phase1 + (pm_amt * phase1)) * (1.0 + freq); + float phase2 = phase1 + (phase1 * pm_amt * (1 + freq)); phase2 -= std::floor(phase2); + // TODO incr 2 + switch (wave1) { case combi_wave_sin: From f38ec5a452cb493b8840e53c52c31634dd7bcf2c Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 15 Oct 2024 21:19:29 +0200 Subject: [PATCH 37/61] take 13 --- param_reference.html | 4 +- .../firefly_synth/oscillator.cpp | 122 +++++++++--------- 2 files changed, 65 insertions(+), 61 deletions(-) diff --git a/param_reference.html b/param_reference.html index df290ece5..523ab6cc1 100644 --- a/param_reference.html +++ b/param_reference.html @@ -3129,9 +3129,9 @@

Osc

Input Accurate Modulate -0.00 -32.00 1.00 +32.00 +2.00 N/A diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 7d073e364..9c0d60e2e 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -16,6 +16,8 @@ using namespace plugin_base; namespace firefly_synth { +// todo rename the combi params eg freq->dist + static float const max_phase_mod = 0.1f; enum { combi_wave_sin, combi_wave_saw, combi_wave_tri, combi_wave_sqr }; @@ -578,7 +580,7 @@ osc_topo(int section, gui_position const& pos) combi_skew_y_1.info.description = "Wave 1 skew Y amount."; auto& combi_freq = result.params.emplace_back(make_param( make_topo_info("{428C5833-3BBE-40AF-9A9C-5EACA40F4CA4}", true, "Combi Freq", "Freq", "Combi Freq", param_combi_freq, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_linear(0.0f, 32.0f, 1.0f, 2, ""), + make_param_dsp_accurate(param_automate::modulate), make_domain_linear(1.0f, 32.0f, 2.0f, 2, ""), make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 6, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); @@ -796,85 +798,85 @@ generate_sqr(float phase, float increment, float pwm) } static inline float -generate_combi(int wave1, int wave2, float phase1, float increment, float freq, float mix, float skx1, float sky1, float skx2, float sxy2) +generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, float freq_lo, float dist, float mix, float skx1, float sky1, float skx2, float sxy2) { - float lo_1 = 0.0f; - float lo_2 = 0.0f; - float hi_1 = 0.0f; - float hi_2 = 0.0f; - - // todo dont do this it causes pitch drift (shouldv seen that coming) - // phase1 = std::pow(phase1, 1.0f + skx1 * 9.0f); - - // rename osci to hi/low - // morph hi/low / lo-hi - // todo skewx/skewy = affect wave2 volume relative to phase - // freq/mix as-intended - - // PM test - // ALSO fix to nyquist + lerp to bandlimited somehow? - float pm_amt = sky1 * 4; - - // todo limit to nyquist - //float phase2 = (phase1 + (pm_amt * phase1)) * (1.0 + freq); - float phase2 = phase1 + (phase1 * pm_amt * (1 + freq)); - phase2 -= std::floor(phase2); - - // TODO incr 2 - - switch (wave1) + float a_lo = 0.0f; + float b_lo = 0.0f; + float a_hi_1 = 0.0f; + float a_hi_2 = 0.0f; + float b_hi_1 = 0.0f; + float b_hi_2 = 0.0f; + + float max_dist = std::floor(sr * 0.5f / freq_lo); + float dist_1 = std::min(max_dist, std::floor(dist)); + float dist_2 = std::min(max_dist, std::floor(dist) + 1.0f); + float dist_lerp = dist - std::floor(dist); + float inc_hi_1 = inc_lo * dist_1; + float inc_hi_2 = inc_lo * dist_2; + float phase_hi_1 = phase_lo * dist_1; + float phase_hi_2 = phase_lo * dist_2; + phase_hi_1 -= std::floor(phase_hi_1); + phase_hi_2 -= std::floor(phase_hi_2); + + switch (wave_a) { case combi_wave_sin: - lo_1 = generate_sin(phase1); - hi_1 = generate_sin(phase2); + a_lo = generate_sin(phase_lo); + a_hi_1 = generate_sin(phase_hi_1); + a_hi_2 = generate_sin(phase_hi_2); break; case combi_wave_saw: - lo_1 = generate_saw(phase1, increment); - hi_1 = generate_saw(phase2, increment); + a_lo = generate_saw(phase_lo, inc_lo); + a_hi_1 = generate_saw(phase_hi_1, inc_hi_1); + a_hi_2 = generate_saw(phase_hi_2, inc_hi_2); break; case combi_wave_tri: - lo_1 = generate_triangle(phase1, increment); - hi_1 = generate_triangle(phase2, increment); + a_lo = generate_triangle(phase_lo, inc_lo); + a_hi_1 = generate_triangle(phase_hi_1, inc_hi_1); + a_hi_2 = generate_triangle(phase_hi_2, inc_hi_2); break; case combi_wave_sqr: - lo_1 = generate_sqr(phase1, increment, 1.0f); - hi_1 = generate_sqr(phase2, increment, 1.0f); + a_lo = generate_sqr(phase_lo, inc_lo, 1.0f); + a_hi_1 = generate_sqr(phase_hi_1, inc_hi_1, 1.0f); + a_hi_2 = generate_sqr(phase_hi_2, inc_hi_2, 1.0f); + break; + default: + assert(false); break; - default: assert(false); break; } - switch (wave2) + switch (wave_b) { case combi_wave_sin: - lo_2 = generate_sin(phase1); - hi_2 = generate_sin(phase2); + b_lo = generate_sin(phase_lo); + b_hi_1 = generate_sin(phase_hi_1); + b_hi_2 = generate_sin(phase_hi_2); break; case combi_wave_saw: - lo_2 = generate_saw(phase1, increment); - hi_2 = generate_saw(phase2, increment); + b_lo = generate_saw(phase_lo, inc_lo); + b_hi_1 = generate_saw(phase_hi_1, inc_hi_1); + b_hi_2 = generate_saw(phase_hi_2, inc_hi_2); break; case combi_wave_tri: - lo_2 = generate_triangle(phase1, increment); - hi_2 = generate_triangle(phase2, increment); + b_lo = generate_triangle(phase_lo, inc_lo); + b_hi_1 = generate_triangle(phase_hi_1, inc_hi_1); + b_hi_2 = generate_triangle(phase_hi_2, inc_hi_2); break; case combi_wave_sqr: - lo_2 = generate_sqr(phase1, increment, 1.0f); - hi_2 = generate_sqr(phase2, increment, 1.0f); + b_lo = generate_sqr(phase_lo, inc_lo, 1.0f); + b_hi_1 = generate_sqr(phase_hi_1, inc_hi_1, 1.0f); + b_hi_2 = generate_sqr(phase_hi_2, inc_hi_2, 1.0f); + break; + default: + assert(false); break; - default: assert(false); break; } - // todo tryout: skew x1 as % of phase 1 - //float final_mix = 0.5f; - - // TODO deal with non-integer by lerp - //return (1.0f - final_mix) * r1 + final_mix * r2; + float a_hi = (1.0f - dist_lerp) * a_hi_1 + dist_lerp * a_hi_2; + float b_hi = (1.0f - dist_lerp) * b_hi_1 + dist_lerp * b_hi_2; + (void)b_hi; - float morhp_lo = phase1 * skx1; - float low = (1.0f - morhp_lo) * lo_1 + morhp_lo * lo_2; - float morhp_hi = phase1 * skx2; - float hi = (1.0f - morhp_hi) * hi_1 + morhp_hi * hi_2; - return (low + hi) * 0.5f; + return (1.0f - phase_lo) * a_lo + phase_lo * a_hi; } osc_engine:: @@ -1447,8 +1449,10 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicSqr) synced_sample += generate_sqr(_sync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; if constexpr (DSF) synced_sample = generate_dsf(_sync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); if constexpr (Combi) synced_sample = generate_combi( - combi_wave_1, combi_wave_2, _sync_phases[v], inc_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index], - combi_skx1_curve[mod_index], combi_sky1_curve[mod_index], combi_skx2_curve[mod_index], combi_sky2_curve[mod_index]); + combi_wave_1, combi_wave_2, oversampled_rate, _sync_phases[v], inc_sync, freq_sync, + combi_freq_curve[mod_index], combi_mix_curve[mod_index], + combi_skx1_curve[mod_index], combi_sky1_curve[mod_index], + combi_skx2_curve[mod_index], combi_sky2_curve[mod_index]); // generate the unsynced sample and crossover float unsynced_sample = 0; @@ -1470,7 +1474,7 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicSqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; if constexpr (DSF) unsynced_sample = generate_dsf(_unsync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); if constexpr (Combi) unsynced_sample = generate_combi( - combi_wave_1, combi_wave_2, _unsync_phases[v], inc_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index], + combi_wave_1, combi_wave_2, oversampled_rate, _unsync_phases[v], inc_sync, freq_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index], combi_skx1_curve[mod_index], combi_sky1_curve[mod_index], combi_skx2_curve[mod_index], combi_sky2_curve[mod_index]); From a4257f704db4c6826ae9ebb82fe780b0be16d92e Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 15 Oct 2024 21:30:09 +0200 Subject: [PATCH 38/61] take 14 --- src/firefly_synth/firefly_synth/oscillator.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 9c0d60e2e..e71d2f7c5 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -807,6 +807,8 @@ generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, f float b_hi_1 = 0.0f; float b_hi_2 = 0.0f; + // dist needs to be integer multiples to go full cycle on the hi generator + // so need to lerp them and also take nyquist into account float max_dist = std::floor(sr * 0.5f / freq_lo); float dist_1 = std::min(max_dist, std::floor(dist)); float dist_2 = std::min(max_dist, std::floor(dist) + 1.0f); From 6acddabe3e7c3e4244e4fb3ff47cbf4aab731d2f Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 15 Oct 2024 21:49:42 +0200 Subject: [PATCH 39/61] take 15 --- src/firefly_synth/firefly_synth/oscillator.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index e71d2f7c5..77bad1170 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -878,7 +878,9 @@ generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, f float b_hi = (1.0f - dist_lerp) * b_hi_1 + dist_lerp * b_hi_2; (void)b_hi; - return (1.0f - phase_lo) * a_lo + phase_lo * a_hi; + float a_up = (1.0f - phase_lo) * a_lo + phase_lo * a_hi; + float a_down = phase_lo * a_lo + (1.0f - phase_lo) * a_hi; + return (1.0f - mix) * a_up + mix * a_down; } osc_engine:: From 482e81a7f3d5fd202a09fcd5c97e191828b02a56 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 15 Oct 2024 22:10:17 +0200 Subject: [PATCH 40/61] take 16 --- src/firefly_synth/firefly_synth/oscillator.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 77bad1170..0000bc539 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -813,6 +813,17 @@ generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, f float dist_1 = std::min(max_dist, std::floor(dist)); float dist_2 = std::min(max_dist, std::floor(dist) + 1.0f); float dist_lerp = dist - std::floor(dist); + + // ok so this gets a continuous distance but now stuff aliases + // so lerp freq gives me f.e. 50% 400hz and 50% 800hz + // and theres nowhere a 600hz signal to be found so no good either + // this looks like same problem as hardsync - how to bandlimit + // a pitched up signal by non-integer multiples of the base freq + // maybe employ the same subsample cross-over thingy ? + + //dist_lerp = 0; + //dist_1 = dist_2 = dist; + float inc_hi_1 = inc_lo * dist_1; float inc_hi_2 = inc_lo * dist_2; float phase_hi_1 = phase_lo * dist_1; From 4594a7d0c8bc9e2d27c9e926a08cee3b87e28aa1 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Wed, 16 Oct 2024 19:03:50 +0200 Subject: [PATCH 41/61] take 17 --- param_reference.html | 4 +- .../firefly_synth/oscillator.cpp | 92 ++++++++----------- todo.txt | 1 + 3 files changed, 40 insertions(+), 57 deletions(-) diff --git a/param_reference.html b/param_reference.html index 523ab6cc1..b304452f1 100644 --- a/param_reference.html +++ b/param_reference.html @@ -3189,7 +3189,7 @@

Osc

Wave 2 skew Y amount. -Combi Mix +Combi Decay Combi Yes Patch @@ -3199,7 +3199,7 @@

Osc

Modulate 0.00 % 100.00 % -50.00 % +0.00 % N/A diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 0000bc539..6bb6b8ac9 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -37,7 +37,7 @@ enum { param_basic_sin_on, param_basic_sin_mix, param_basic_saw_on, param_basic_saw_mix, param_basic_tri_on, param_basic_tri_mix, param_basic_sqr_on, param_basic_sqr_mix, param_basic_sqr_pw, param_combi_wave1, param_combi_skew_x_1, param_combi_skew_y_1, param_combi_freq, - param_combi_wave2, param_combi_skew_x_2, param_combi_skew_y_2, param_combi_mix, + param_combi_wave2, param_combi_skew_x_2, param_combi_skew_y_2, param_combi_dcy, param_dsf_parts, param_dsf_dist, param_dsf_dcy, param_rand_svf, param_rand_rate, param_rand_freq, param_rand_res, param_rand_seed, // shared k+s/noise param_kps_fdbk, param_kps_mid, param_kps_stretch, @@ -607,8 +607,8 @@ osc_topo(int section, gui_position const& pos) combi_skew_y_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_skew_y_2.info.description = "Wave 2 skew Y amount."; auto& combi_mix = result.params.emplace_back(make_param( - make_topo_info("{3590AA81-DDF3-4785-8944-D18B9869C609}", true, "Combi Mix", "Mix", "Combi Mix", param_combi_mix, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.5f, 2, true), + make_topo_info("{3590AA81-DDF3-4785-8944-D18B9869C609}", true, "Combi Decay", "Dcy", "Combi Dcy", param_combi_dcy, 1), + make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 6, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_mix.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); @@ -798,60 +798,38 @@ generate_sqr(float phase, float increment, float pwm) } static inline float -generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, float freq_lo, float dist, float mix, float skx1, float sky1, float skx2, float sxy2) +generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, float freq_lo, float dist, float dcy, float skx1, float sky1, float skx2, float sxy2) { float a_lo = 0.0f; float b_lo = 0.0f; - float a_hi_1 = 0.0f; - float a_hi_2 = 0.0f; - float b_hi_1 = 0.0f; - float b_hi_2 = 0.0f; - - // dist needs to be integer multiples to go full cycle on the hi generator - // so need to lerp them and also take nyquist into account - float max_dist = std::floor(sr * 0.5f / freq_lo); - float dist_1 = std::min(max_dist, std::floor(dist)); - float dist_2 = std::min(max_dist, std::floor(dist) + 1.0f); - float dist_lerp = dist - std::floor(dist); - - // ok so this gets a continuous distance but now stuff aliases - // so lerp freq gives me f.e. 50% 400hz and 50% 800hz - // and theres nowhere a 600hz signal to be found so no good either - // this looks like same problem as hardsync - how to bandlimit - // a pitched up signal by non-integer multiples of the base freq - // maybe employ the same subsample cross-over thingy ? - - //dist_lerp = 0; - //dist_1 = dist_2 = dist; + float a_hi = 0.0f; + float b_hi = 0.0f; + + // clamp to nyquist + float max_dist = sr * 0.5f / freq_lo; + dist = std::min(dist, max_dist); - float inc_hi_1 = inc_lo * dist_1; - float inc_hi_2 = inc_lo * dist_2; - float phase_hi_1 = phase_lo * dist_1; - float phase_hi_2 = phase_lo * dist_2; - phase_hi_1 -= std::floor(phase_hi_1); - phase_hi_2 -= std::floor(phase_hi_2); + float inc_hi = inc_lo * dist; + float phase_hi = phase_lo * dist; + phase_hi -= std::floor(phase_hi); switch (wave_a) { case combi_wave_sin: a_lo = generate_sin(phase_lo); - a_hi_1 = generate_sin(phase_hi_1); - a_hi_2 = generate_sin(phase_hi_2); + a_hi = generate_sin(phase_hi); break; case combi_wave_saw: a_lo = generate_saw(phase_lo, inc_lo); - a_hi_1 = generate_saw(phase_hi_1, inc_hi_1); - a_hi_2 = generate_saw(phase_hi_2, inc_hi_2); + a_hi = generate_saw(phase_hi, inc_hi); break; case combi_wave_tri: a_lo = generate_triangle(phase_lo, inc_lo); - a_hi_1 = generate_triangle(phase_hi_1, inc_hi_1); - a_hi_2 = generate_triangle(phase_hi_2, inc_hi_2); + a_hi = generate_triangle(phase_hi, inc_hi); break; case combi_wave_sqr: a_lo = generate_sqr(phase_lo, inc_lo, 1.0f); - a_hi_1 = generate_sqr(phase_hi_1, inc_hi_1, 1.0f); - a_hi_2 = generate_sqr(phase_hi_2, inc_hi_2, 1.0f); + a_hi = generate_sqr(phase_hi, inc_hi, 1.0f); break; default: assert(false); @@ -862,36 +840,40 @@ generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, f { case combi_wave_sin: b_lo = generate_sin(phase_lo); - b_hi_1 = generate_sin(phase_hi_1); - b_hi_2 = generate_sin(phase_hi_2); + b_hi = generate_sin(phase_hi); break; case combi_wave_saw: b_lo = generate_saw(phase_lo, inc_lo); - b_hi_1 = generate_saw(phase_hi_1, inc_hi_1); - b_hi_2 = generate_saw(phase_hi_2, inc_hi_2); + b_hi = generate_saw(phase_hi, inc_hi); break; case combi_wave_tri: b_lo = generate_triangle(phase_lo, inc_lo); - b_hi_1 = generate_triangle(phase_hi_1, inc_hi_1); - b_hi_2 = generate_triangle(phase_hi_2, inc_hi_2); + b_hi = generate_triangle(phase_hi, inc_hi); break; case combi_wave_sqr: b_lo = generate_sqr(phase_lo, inc_lo, 1.0f); - b_hi_1 = generate_sqr(phase_hi_1, inc_hi_1, 1.0f); - b_hi_2 = generate_sqr(phase_hi_2, inc_hi_2, 1.0f); + b_hi = generate_sqr(phase_hi, inc_hi, 1.0f); break; default: assert(false); break; } - float a_hi = (1.0f - dist_lerp) * a_hi_1 + dist_lerp * a_hi_2; - float b_hi = (1.0f - dist_lerp) * b_hi_1 + dist_lerp * b_hi_2; + // hi can go non-integer-multiple of the base frequency + // so ends as an incomplete cycle. therefore we make + // sure it's amplitude approaches zero as the low phase + // proceeds from 0 to 1. The mix amount is controlled by decay curve. + + // other options are: + // 1 do nothing - produces aliasing + // 2 snap to integer multiples of the base freq and lerp - produces audible "stepping" eg 200 hz, 400 hz, 600 hz etc (not continuous) + // 3 do subsample interpolation like hardsync - heavy on the bookkeeping + (void)b_hi; - float a_up = (1.0f - phase_lo) * a_lo + phase_lo * a_hi; - float a_down = phase_lo * a_lo + (1.0f - phase_lo) * a_hi; - return (1.0f - mix) * a_up + mix * a_down; + float const dcy_range = 0.99f; + float mix_hi = (1.0f - std::pow(phase_lo, (1.0f - dcy_range) + dcy_range * dcy)); + return (1.0f - mix_hi) * a_lo + mix_hi * a_hi; } osc_engine:: @@ -1340,7 +1322,7 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicTri) block.normalized_to_raw_block(module_osc, param_basic_tri_mix, basic_tri_mix_curve_norm, basic_tri_mix_curve); if constexpr (BasicSqr) block.normalized_to_raw_block(module_osc, param_basic_sqr_mix, basic_sqr_mix_curve_norm, basic_sqr_mix_curve); - auto const& combi_mix_curve = *(*modulation)[module_osc][block.module_slot][param_combi_mix][0]; + auto const& combi_dcy_curve = *(*modulation)[module_osc][block.module_slot][param_combi_dcy][0]; auto const& combi_skx1_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_x_1][0]; auto const& combi_sky1_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_y_1][0]; auto const& combi_skx2_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_x_2][0]; @@ -1465,7 +1447,7 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (DSF) synced_sample = generate_dsf(_sync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); if constexpr (Combi) synced_sample = generate_combi( combi_wave_1, combi_wave_2, oversampled_rate, _sync_phases[v], inc_sync, freq_sync, - combi_freq_curve[mod_index], combi_mix_curve[mod_index], + combi_freq_curve[mod_index], combi_dcy_curve[mod_index], combi_skx1_curve[mod_index], combi_sky1_curve[mod_index], combi_skx2_curve[mod_index], combi_sky2_curve[mod_index]); @@ -1489,7 +1471,7 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicSqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; if constexpr (DSF) unsynced_sample = generate_dsf(_unsync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); if constexpr (Combi) unsynced_sample = generate_combi( - combi_wave_1, combi_wave_2, oversampled_rate, _unsync_phases[v], inc_sync, freq_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index], + combi_wave_1, combi_wave_2, oversampled_rate, _unsync_phases[v], inc_sync, freq_sync, combi_freq_curve[mod_index], combi_dcy_curve[mod_index], combi_skx1_curve[mod_index], combi_sky1_curve[mod_index], combi_skx2_curve[mod_index], combi_sky2_curve[mod_index]); diff --git a/todo.txt b/todo.txt index 6433ef4d7..52919a9ee 100644 --- a/todo.txt +++ b/todo.txt @@ -47,6 +47,7 @@ turn on stuff when dragging (e.g. basic sin, dist skew etc) wishlist: use fftw +take Nyquist into account for hardsync? should figure out a way to do user supplied formulas? update the manuals routing overview image with new colors filter micro tuning From 711151787a535ddff27a30b376f6e9d78398b60e Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Wed, 16 Oct 2024 21:17:44 +0200 Subject: [PATCH 42/61] Revert "take 17" This reverts commit 4594a7d0c8bc9e2d27c9e926a08cee3b87e28aa1. --- param_reference.html | 4 +- .../firefly_synth/oscillator.cpp | 92 +++++++++++-------- todo.txt | 1 - 3 files changed, 57 insertions(+), 40 deletions(-) diff --git a/param_reference.html b/param_reference.html index b304452f1..523ab6cc1 100644 --- a/param_reference.html +++ b/param_reference.html @@ -3189,7 +3189,7 @@

Osc

Wave 2 skew Y amount. -Combi Decay +Combi Mix Combi Yes Patch @@ -3199,7 +3199,7 @@

Osc

Modulate 0.00 % 100.00 % -0.00 % +50.00 % N/A diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 6bb6b8ac9..0000bc539 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -37,7 +37,7 @@ enum { param_basic_sin_on, param_basic_sin_mix, param_basic_saw_on, param_basic_saw_mix, param_basic_tri_on, param_basic_tri_mix, param_basic_sqr_on, param_basic_sqr_mix, param_basic_sqr_pw, param_combi_wave1, param_combi_skew_x_1, param_combi_skew_y_1, param_combi_freq, - param_combi_wave2, param_combi_skew_x_2, param_combi_skew_y_2, param_combi_dcy, + param_combi_wave2, param_combi_skew_x_2, param_combi_skew_y_2, param_combi_mix, param_dsf_parts, param_dsf_dist, param_dsf_dcy, param_rand_svf, param_rand_rate, param_rand_freq, param_rand_res, param_rand_seed, // shared k+s/noise param_kps_fdbk, param_kps_mid, param_kps_stretch, @@ -607,8 +607,8 @@ osc_topo(int section, gui_position const& pos) combi_skew_y_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); combi_skew_y_2.info.description = "Wave 2 skew Y amount."; auto& combi_mix = result.params.emplace_back(make_param( - make_topo_info("{3590AA81-DDF3-4785-8944-D18B9869C609}", true, "Combi Decay", "Dcy", "Combi Dcy", param_combi_dcy, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0f, 2, true), + make_topo_info("{3590AA81-DDF3-4785-8944-D18B9869C609}", true, "Combi Mix", "Mix", "Combi Mix", param_combi_mix, 1), + make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.5f, 2, true), make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 6, 1, 1 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); combi_mix.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); @@ -798,38 +798,60 @@ generate_sqr(float phase, float increment, float pwm) } static inline float -generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, float freq_lo, float dist, float dcy, float skx1, float sky1, float skx2, float sxy2) +generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, float freq_lo, float dist, float mix, float skx1, float sky1, float skx2, float sxy2) { float a_lo = 0.0f; float b_lo = 0.0f; - float a_hi = 0.0f; - float b_hi = 0.0f; - - // clamp to nyquist - float max_dist = sr * 0.5f / freq_lo; - dist = std::min(dist, max_dist); + float a_hi_1 = 0.0f; + float a_hi_2 = 0.0f; + float b_hi_1 = 0.0f; + float b_hi_2 = 0.0f; + + // dist needs to be integer multiples to go full cycle on the hi generator + // so need to lerp them and also take nyquist into account + float max_dist = std::floor(sr * 0.5f / freq_lo); + float dist_1 = std::min(max_dist, std::floor(dist)); + float dist_2 = std::min(max_dist, std::floor(dist) + 1.0f); + float dist_lerp = dist - std::floor(dist); + + // ok so this gets a continuous distance but now stuff aliases + // so lerp freq gives me f.e. 50% 400hz and 50% 800hz + // and theres nowhere a 600hz signal to be found so no good either + // this looks like same problem as hardsync - how to bandlimit + // a pitched up signal by non-integer multiples of the base freq + // maybe employ the same subsample cross-over thingy ? + + //dist_lerp = 0; + //dist_1 = dist_2 = dist; - float inc_hi = inc_lo * dist; - float phase_hi = phase_lo * dist; - phase_hi -= std::floor(phase_hi); + float inc_hi_1 = inc_lo * dist_1; + float inc_hi_2 = inc_lo * dist_2; + float phase_hi_1 = phase_lo * dist_1; + float phase_hi_2 = phase_lo * dist_2; + phase_hi_1 -= std::floor(phase_hi_1); + phase_hi_2 -= std::floor(phase_hi_2); switch (wave_a) { case combi_wave_sin: a_lo = generate_sin(phase_lo); - a_hi = generate_sin(phase_hi); + a_hi_1 = generate_sin(phase_hi_1); + a_hi_2 = generate_sin(phase_hi_2); break; case combi_wave_saw: a_lo = generate_saw(phase_lo, inc_lo); - a_hi = generate_saw(phase_hi, inc_hi); + a_hi_1 = generate_saw(phase_hi_1, inc_hi_1); + a_hi_2 = generate_saw(phase_hi_2, inc_hi_2); break; case combi_wave_tri: a_lo = generate_triangle(phase_lo, inc_lo); - a_hi = generate_triangle(phase_hi, inc_hi); + a_hi_1 = generate_triangle(phase_hi_1, inc_hi_1); + a_hi_2 = generate_triangle(phase_hi_2, inc_hi_2); break; case combi_wave_sqr: a_lo = generate_sqr(phase_lo, inc_lo, 1.0f); - a_hi = generate_sqr(phase_hi, inc_hi, 1.0f); + a_hi_1 = generate_sqr(phase_hi_1, inc_hi_1, 1.0f); + a_hi_2 = generate_sqr(phase_hi_2, inc_hi_2, 1.0f); break; default: assert(false); @@ -840,40 +862,36 @@ generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, f { case combi_wave_sin: b_lo = generate_sin(phase_lo); - b_hi = generate_sin(phase_hi); + b_hi_1 = generate_sin(phase_hi_1); + b_hi_2 = generate_sin(phase_hi_2); break; case combi_wave_saw: b_lo = generate_saw(phase_lo, inc_lo); - b_hi = generate_saw(phase_hi, inc_hi); + b_hi_1 = generate_saw(phase_hi_1, inc_hi_1); + b_hi_2 = generate_saw(phase_hi_2, inc_hi_2); break; case combi_wave_tri: b_lo = generate_triangle(phase_lo, inc_lo); - b_hi = generate_triangle(phase_hi, inc_hi); + b_hi_1 = generate_triangle(phase_hi_1, inc_hi_1); + b_hi_2 = generate_triangle(phase_hi_2, inc_hi_2); break; case combi_wave_sqr: b_lo = generate_sqr(phase_lo, inc_lo, 1.0f); - b_hi = generate_sqr(phase_hi, inc_hi, 1.0f); + b_hi_1 = generate_sqr(phase_hi_1, inc_hi_1, 1.0f); + b_hi_2 = generate_sqr(phase_hi_2, inc_hi_2, 1.0f); break; default: assert(false); break; } - // hi can go non-integer-multiple of the base frequency - // so ends as an incomplete cycle. therefore we make - // sure it's amplitude approaches zero as the low phase - // proceeds from 0 to 1. The mix amount is controlled by decay curve. - - // other options are: - // 1 do nothing - produces aliasing - // 2 snap to integer multiples of the base freq and lerp - produces audible "stepping" eg 200 hz, 400 hz, 600 hz etc (not continuous) - // 3 do subsample interpolation like hardsync - heavy on the bookkeeping - + float a_hi = (1.0f - dist_lerp) * a_hi_1 + dist_lerp * a_hi_2; + float b_hi = (1.0f - dist_lerp) * b_hi_1 + dist_lerp * b_hi_2; (void)b_hi; - float const dcy_range = 0.99f; - float mix_hi = (1.0f - std::pow(phase_lo, (1.0f - dcy_range) + dcy_range * dcy)); - return (1.0f - mix_hi) * a_lo + mix_hi * a_hi; + float a_up = (1.0f - phase_lo) * a_lo + phase_lo * a_hi; + float a_down = phase_lo * a_lo + (1.0f - phase_lo) * a_hi; + return (1.0f - mix) * a_up + mix * a_down; } osc_engine:: @@ -1322,7 +1340,7 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicTri) block.normalized_to_raw_block(module_osc, param_basic_tri_mix, basic_tri_mix_curve_norm, basic_tri_mix_curve); if constexpr (BasicSqr) block.normalized_to_raw_block(module_osc, param_basic_sqr_mix, basic_sqr_mix_curve_norm, basic_sqr_mix_curve); - auto const& combi_dcy_curve = *(*modulation)[module_osc][block.module_slot][param_combi_dcy][0]; + auto const& combi_mix_curve = *(*modulation)[module_osc][block.module_slot][param_combi_mix][0]; auto const& combi_skx1_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_x_1][0]; auto const& combi_sky1_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_y_1][0]; auto const& combi_skx2_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_x_2][0]; @@ -1447,7 +1465,7 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (DSF) synced_sample = generate_dsf(_sync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); if constexpr (Combi) synced_sample = generate_combi( combi_wave_1, combi_wave_2, oversampled_rate, _sync_phases[v], inc_sync, freq_sync, - combi_freq_curve[mod_index], combi_dcy_curve[mod_index], + combi_freq_curve[mod_index], combi_mix_curve[mod_index], combi_skx1_curve[mod_index], combi_sky1_curve[mod_index], combi_skx2_curve[mod_index], combi_sky2_curve[mod_index]); @@ -1471,7 +1489,7 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if constexpr (BasicSqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; if constexpr (DSF) unsynced_sample = generate_dsf(_unsync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); if constexpr (Combi) unsynced_sample = generate_combi( - combi_wave_1, combi_wave_2, oversampled_rate, _unsync_phases[v], inc_sync, freq_sync, combi_freq_curve[mod_index], combi_dcy_curve[mod_index], + combi_wave_1, combi_wave_2, oversampled_rate, _unsync_phases[v], inc_sync, freq_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index], combi_skx1_curve[mod_index], combi_sky1_curve[mod_index], combi_skx2_curve[mod_index], combi_sky2_curve[mod_index]); diff --git a/todo.txt b/todo.txt index 52919a9ee..6433ef4d7 100644 --- a/todo.txt +++ b/todo.txt @@ -47,7 +47,6 @@ turn on stuff when dragging (e.g. basic sin, dist skew etc) wishlist: use fftw -take Nyquist into account for hardsync? should figure out a way to do user supplied formulas? update the manuals routing overview image with new colors filter micro tuning From e7e65e4d0addf95abe5b6a067411ea12ca0231a4 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Wed, 16 Oct 2024 21:19:29 +0200 Subject: [PATCH 43/61] Revert "take 16" This reverts commit 482e81a7f3d5fd202a09fcd5c97e191828b02a56. --- src/firefly_synth/firefly_synth/oscillator.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 0000bc539..77bad1170 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -813,17 +813,6 @@ generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, f float dist_1 = std::min(max_dist, std::floor(dist)); float dist_2 = std::min(max_dist, std::floor(dist) + 1.0f); float dist_lerp = dist - std::floor(dist); - - // ok so this gets a continuous distance but now stuff aliases - // so lerp freq gives me f.e. 50% 400hz and 50% 800hz - // and theres nowhere a 600hz signal to be found so no good either - // this looks like same problem as hardsync - how to bandlimit - // a pitched up signal by non-integer multiples of the base freq - // maybe employ the same subsample cross-over thingy ? - - //dist_lerp = 0; - //dist_1 = dist_2 = dist; - float inc_hi_1 = inc_lo * dist_1; float inc_hi_2 = inc_lo * dist_2; float phase_hi_1 = phase_lo * dist_1; From 72084da773d45b2c265296659f4b346587b25ad6 Mon Sep 17 00:00:00 2001 From: ofsjoerdk Date: Thu, 17 Oct 2024 18:12:10 +0200 Subject: [PATCH 44/61] revert osci --- .../firefly_synth/oscillator.cpp | 406 ++++-------------- 1 file changed, 78 insertions(+), 328 deletions(-) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index 77bad1170..b8b9b3669 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -16,19 +16,15 @@ using namespace plugin_base; namespace firefly_synth { -// todo rename the combi params eg freq->dist - static float const max_phase_mod = 0.1f; -enum { combi_wave_sin, combi_wave_saw, combi_wave_tri, combi_wave_sqr }; +enum { type_off, type_basic, type_dsf, type_kps1, type_kps2, type_static }; enum { rand_svf_lpf, rand_svf_hpf, rand_svf_bpf, rand_svf_bsf, rand_svf_peq }; -enum { type_off, type_basic, type_combi, type_dsf, type_kps1, type_kps2, type_static }; -enum { section_type, section_sync_on, section_sync_uni, section_basic, section_basic_pw, section_combi, section_dsf, section_rand }; +enum { section_type, section_sync_on, section_sync_uni, section_basic, section_basic_pw, section_dsf, section_rand }; enum { scratch_pb, scratch_cent, scratch_pitch, scratch_sync_semi, scratch_basic_sin_mix, scratch_basic_saw_mix, scratch_basic_tri_mix, scratch_basic_sqr_mix, - scratch_combi_freq, scratch_combi_mix, - scratch_rand_freq, scratch_rand_rate, scratch_count }; // todo overlap scratch space + scratch_rand_freq, scratch_rand_rate, scratch_count }; enum { param_type, param_gain, param_note, param_cent, @@ -36,8 +32,6 @@ enum { param_uni_voices, param_uni_sprd, param_uni_dtn, param_uni_phase, param_basic_sin_on, param_basic_sin_mix, param_basic_saw_on, param_basic_saw_mix, param_basic_tri_on, param_basic_tri_mix, param_basic_sqr_on, param_basic_sqr_mix, param_basic_sqr_pw, - param_combi_wave1, param_combi_skew_x_1, param_combi_skew_y_1, param_combi_freq, - param_combi_wave2, param_combi_skew_x_2, param_combi_skew_y_2, param_combi_mix, param_dsf_parts, param_dsf_dist, param_dsf_dcy, param_rand_svf, param_rand_rate, param_rand_freq, param_rand_res, param_rand_seed, // shared k+s/noise param_kps_fdbk, param_kps_mid, param_kps_stretch, @@ -52,9 +46,9 @@ static bool constexpr is_kps(int type) static bool constexpr is_random(int type) { return type == type_static || is_kps(type); } static bool can_do_phase(int type) -{ return type == type_basic || type == type_combi || type == type_dsf; } +{ return type == type_basic || type == type_dsf; } static bool can_do_pitch(int type) -{ return type == type_basic || type == type_combi || type == type_dsf || is_kps(type); } +{ return type == type_basic || type == type_dsf || is_kps(type); } // bit different for osci and lfo // lfo is bucket based but for this one we'd need up to SR/2 buckets @@ -108,24 +102,12 @@ get_oversmp_info(plugin_block const& block, int& stages, int& factor) } } -static std::vector -combi_wave_items() -{ - std::vector result; - result.emplace_back("{B52E7D25-CADD-4075-BDC8-AB5298F53784}", "Sin"); - result.emplace_back("{B3E1E560-EBDB-4E3D-827E-DE5A83B6EA6C}", "Saw"); - result.emplace_back("{994FFDF7-98B4-46EA-B33A-48027E8611B1}", "Tri"); - result.emplace_back("{09474479-189A-4D0E-95D9-C0DD08753C44}", "Sqr"); - return result; -} - static std::vector type_items() { std::vector result; result.emplace_back("{9C9FFCAD-09A5-49E6-A083-482C8A3CF20B}", "Off", "Off"); result.emplace_back("{9185A6F4-F9EF-4A33-8462-1B02A25FDF29}", "Basic", "Basic Analog"); - result.emplace_back("{0E9AD9BB-9C57-4333-84DC-A888E755C2AD}", "Combi", "Combi Analog"); result.emplace_back("{5DDB5617-85CC-4BE7-8295-63184BA56191}", "DSF", "Discrete Summation Formulae"); result.emplace_back("{E6814747-6CEE-47DA-9878-890D0A5DC5C7}", "K+S1", "Karplus-Strong"); result.emplace_back("{43DC7825-E437-4792-88D5-6E76241493A1}", "K+S2", "Karplus-Strong With Midpoint Adjustment"); @@ -204,28 +186,19 @@ public module_engine { template void process_dsf(plugin_block& block, cv_audio_matrix_mixdown const* modulation); template void process_basic(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template void process_static(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - - template void - process_combi(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template void - process_combi_wave1(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template - void process_combi_wave1_wave2(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - - template void + template void process_static(plugin_block& block, cv_audio_matrix_mixdown const* modulation); + + template void process_basic_sin(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template + template void process_basic_sin_saw(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template + template void process_basic_sin_saw_tri(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template + template void process_basic_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template + template void process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown const* modulation); - template + template void process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixdown const* modulation); }; @@ -377,7 +350,6 @@ osc_topo(int section, gui_position const& pos) type.gui.submenu = std::make_shared(); type.gui.submenu->indices.push_back(type_off); type.gui.submenu->indices.push_back(type_basic); - type.gui.submenu->indices.push_back(type_combi); type.gui.submenu->indices.push_back(type_dsf); type.gui.submenu->indices.push_back(type_static); type.gui.submenu->add_submenu("Karplus-Strong", { type_kps1, type_kps2 }); @@ -460,7 +432,7 @@ osc_topo(int section, gui_position const& pos) make_param_gui_single(section_sync_uni, gui_edit_type::knob, { 1, 2 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); uni_dtn.gui.bindings.enabled.bind_params({ param_type, param_uni_voices }, [](auto const& vs) { return can_do_pitch(vs[0]) && vs[1] > 1; }); - uni_dtn.info.description = "Detune unison voices. Only applicable to Basic, DSF and KPS generators."; + uni_dtn.info.description = "Detune unison voices. Only applicable to Basic and DSF generators."; auto& uni_phase = result.params.emplace_back(make_param( make_topo_info("{8F1098B6-64F9-407E-A8A3-8C3637D59A26}", true, "Unison Phase", "Phs", "Uni Phase", param_uni_phase, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.5, 0, true), @@ -548,72 +520,6 @@ osc_topo(int section, gui_position const& pos) basic_sqr_pw.gui.bindings.enabled.bind_params({ param_type, param_basic_sqr_on }, [](auto const& vs) { return vs[0] == type_basic && vs[1] != 0; }); basic_sqr_pw.info.description = "Square generator pulse width."; - auto& combi = result.sections.emplace_back(make_param_section(section_combi, - make_topo_tag_basic("{7BB6F0D9-4A04-4932-B7CD-C3AF5C13C067}", "Combi"), - make_param_section_gui({ 0, 4, 2, 2 }, gui_dimension({ 1, 1 }, { - gui_dimension::auto_size_all, gui_dimension::auto_size_all, - gui_dimension::auto_size_all, 1, - gui_dimension::auto_size_all, 1, - gui_dimension::auto_size_all, 1 }), gui_label_edit_cell_split::horizontal))); - combi.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); - combi.gui.bindings.visible.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); - auto& combi_wave_1 = result.params.emplace_back(make_param( - make_topo_info("{D6B0CF43-5136-4D92-8EEA-2AE5EDD30C0E}", true, "Combi Wave 1", "Wave 1", "Combi Wave 1", param_combi_wave1, 1), - make_param_dsp_voice(param_automate::automate), make_domain_item(combi_wave_items(), "Sin"), - make_param_gui_single(section_combi, gui_edit_type::autofit_list, { 0, 0, 1, 1 }, - make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - combi_wave_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); - combi_wave_1.info.description = "Selects the base waveform."; - auto& combi_skew_x_1 = result.params.emplace_back(make_param( - make_topo_info("{961FA897-E195-48D0-A43B-B2DDAF796F2B}", true, "Combi Skew X 1", "Skw X", "Combi Skew X 1", param_combi_skew_x_1, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), - make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 2, 1, 1 }, - make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - combi_skew_x_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); - combi_skew_x_1.info.description = "Wave 1 skew X amount."; - auto& combi_skew_y_1 = result.params.emplace_back(make_param( - make_topo_info("{CF5A5AA9-7AC0-43D4-862F-17FA98A09655}", true, "Combi Skew Y 1", "Skw Y", "Combi Skew Y 1", param_combi_skew_y_1, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), - make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 4, 1, 1 }, - make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - combi_skew_y_1.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); - combi_skew_y_1.info.description = "Wave 1 skew Y amount."; - auto& combi_freq = result.params.emplace_back(make_param( - make_topo_info("{428C5833-3BBE-40AF-9A9C-5EACA40F4CA4}", true, "Combi Freq", "Freq", "Combi Freq", param_combi_freq, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_linear(1.0f, 32.0f, 2.0f, 2, ""), - make_param_gui_single(section_combi, gui_edit_type::knob, { 0, 6, 1, 1 }, - make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - combi_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); - combi_freq.info.description = "Controls wave 2 frequency."; - auto& combi_wave_2 = result.params.emplace_back(make_param( - make_topo_info("{A8BAE205-AA10-4C48-8C40-5C5B4B1118FE}", true, "Combi Wave 2", "Wave 2", "Combi Wave 2", param_combi_wave2, 1), - make_param_dsp_voice(param_automate::automate), make_domain_item(combi_wave_items(), "Sin"), - make_param_gui_single(section_combi, gui_edit_type::autofit_list, { 1, 0, 1, 1 }, - make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - combi_wave_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); - combi_wave_2.info.description = "Selects the overlay waveform."; - auto& combi_skew_x_2 = result.params.emplace_back(make_param( - make_topo_info("{420B67B9-5062-4004-B2E9-8F0DC3B7CACE}", true, "Combi Skew X 2", "Skw X", "Combi Skew X 2", param_combi_skew_x_2, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), - make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 2, 1, 1 }, - make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - combi_skew_x_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); - combi_skew_x_2.info.description = "Wave 2 skew X amount."; - auto& combi_skew_y_2 = result.params.emplace_back(make_param( - make_topo_info("{AC7EA48C-533E-45E7-B12F-044887495F3C}", true, "Combi Skew Y 2", "Skw Y", "Combi Skew Y 2", param_combi_skew_y_2, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.0, 2, true), - make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 4, 1, 1 }, - make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - combi_skew_y_2.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); - combi_skew_y_2.info.description = "Wave 2 skew Y amount."; - auto& combi_mix = result.params.emplace_back(make_param( - make_topo_info("{3590AA81-DDF3-4785-8944-D18B9869C609}", true, "Combi Mix", "Mix", "Combi Mix", param_combi_mix, 1), - make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.5f, 2, true), - make_param_gui_single(section_combi, gui_edit_type::knob, { 1, 6, 1, 1 }, - make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); - combi_mix.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return vs[0] == type_combi; }); - combi_mix.info.description = "Controls the overlay mix amount."; - auto& dsf = result.sections.emplace_back(make_param_section(section_dsf, make_topo_tag_basic("{F6B06CEA-AF28-4AE2-943E-6225510109A3}", "DSF"), make_param_section_gui({ 0, 4, 2, 2 }, gui_dimension({ 1, 1 }, { 1, 1 })))); @@ -661,21 +567,24 @@ osc_topo(int section, gui_position const& pos) make_param_gui_single(section_rand, gui_edit_type::hslider, { 1, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); random_step.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return is_random(vs[0]); }); - random_step.info.description = std::string("On-voice-init step count for static noise and initial-excite stage of Karplus-Strong."); + random_step.info.description = std::string("On-voice-init step count for static noise and initial-excite stage of Karplus-Strong. ") + + "Modulation takes place only at voice start."; auto& random_freq = result.params.emplace_back(make_param( make_topo_info("{289B4EA4-4A0E-4D33-98BA-7DF475B342E9}", true, "Random Filter Freq", "Freq", "Random Freq", param_rand_freq, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_log(20, 20000, 20000, 1000, 0, "Hz"), make_param_gui_single(section_rand, gui_edit_type::knob, { 0, 2 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); random_freq.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return is_random(vs[0]); }); - random_freq.info.description = std::string("Continuous filter frequency for static noise or voice-initial-excite filter frequency for Karplus-Strong."); + random_freq.info.description = std::string("Continuous filter frequency for static noise or initial-excite filter frequency for Karplus-Strong. ") + + "Modulation takes place only at voice start."; auto& random_res = result.params.emplace_back(make_param( make_topo_info("{3E68ACDC-9800-4A4B-9BB6-984C5A7F624B}", true, "Random Filter Reso", "Reso", "Random Reso", param_rand_res, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0, 0, true), make_param_gui_single(section_rand, gui_edit_type::knob, { 1, 2 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); random_res.gui.bindings.enabled.bind_params({ param_type }, [](auto const& vs) { return is_random(vs[0]); }); - random_res.info.description = std::string("Continuous filter resonance for static noise or voice-initial-excite filter resonance for Karplus-Strong."); + random_res.info.description = std::string("Continuous filter resonance for static noise or initial-excite filter resonance for Karplus-Strong. ") + + "Modulation takes place only at voice start."; auto& random_seed = result.params.emplace_back(make_param( make_topo_info("{81873698-DEA9-4541-8E99-FEA21EAA2FEF}", true, "Rnd Seed", "Seed", "Rnd Seed", param_rand_seed, 1), make_param_dsp_voice(param_automate::automate), make_domain_step(1, 255, 1, 0), @@ -729,12 +638,6 @@ osc_topo(int section, gui_position const& pos) return result; } -static inline float -generate_sin(float phase) -{ - return std::sin(2.0f * pi32 * phase); -} - // https://www.kvraudio.com/forum/viewtopic.php?t=375517 static inline float generate_blep(float phase, float inc) @@ -753,7 +656,7 @@ generate_saw(float phase, float inc) } // https://dsp.stackexchange.com/questions/54790/polyblamp-anti-aliasing-in-c -static inline float +static float generate_blamp(float phase, float increment) { float y = 0.0f; @@ -771,7 +674,7 @@ generate_blamp(float phase, float increment) return y * increment / 15; } -static inline float +static float generate_triangle(float phase, float increment) { float const triangle_scale = 0.9f; @@ -787,7 +690,7 @@ generate_triangle(float phase, float increment) return result * triangle_scale; } -static inline float +static float generate_sqr(float phase, float increment, float pwm) { float const min_pw = 0.05f; @@ -797,92 +700,6 @@ generate_sqr(float phase, float increment, float pwm) return (saw1 - saw2) * 0.5f; } -static inline float -generate_combi(int wave_a, int wave_b, float sr, float phase_lo, float inc_lo, float freq_lo, float dist, float mix, float skx1, float sky1, float skx2, float sxy2) -{ - float a_lo = 0.0f; - float b_lo = 0.0f; - float a_hi_1 = 0.0f; - float a_hi_2 = 0.0f; - float b_hi_1 = 0.0f; - float b_hi_2 = 0.0f; - - // dist needs to be integer multiples to go full cycle on the hi generator - // so need to lerp them and also take nyquist into account - float max_dist = std::floor(sr * 0.5f / freq_lo); - float dist_1 = std::min(max_dist, std::floor(dist)); - float dist_2 = std::min(max_dist, std::floor(dist) + 1.0f); - float dist_lerp = dist - std::floor(dist); - float inc_hi_1 = inc_lo * dist_1; - float inc_hi_2 = inc_lo * dist_2; - float phase_hi_1 = phase_lo * dist_1; - float phase_hi_2 = phase_lo * dist_2; - phase_hi_1 -= std::floor(phase_hi_1); - phase_hi_2 -= std::floor(phase_hi_2); - - switch (wave_a) - { - case combi_wave_sin: - a_lo = generate_sin(phase_lo); - a_hi_1 = generate_sin(phase_hi_1); - a_hi_2 = generate_sin(phase_hi_2); - break; - case combi_wave_saw: - a_lo = generate_saw(phase_lo, inc_lo); - a_hi_1 = generate_saw(phase_hi_1, inc_hi_1); - a_hi_2 = generate_saw(phase_hi_2, inc_hi_2); - break; - case combi_wave_tri: - a_lo = generate_triangle(phase_lo, inc_lo); - a_hi_1 = generate_triangle(phase_hi_1, inc_hi_1); - a_hi_2 = generate_triangle(phase_hi_2, inc_hi_2); - break; - case combi_wave_sqr: - a_lo = generate_sqr(phase_lo, inc_lo, 1.0f); - a_hi_1 = generate_sqr(phase_hi_1, inc_hi_1, 1.0f); - a_hi_2 = generate_sqr(phase_hi_2, inc_hi_2, 1.0f); - break; - default: - assert(false); - break; - } - - switch (wave_b) - { - case combi_wave_sin: - b_lo = generate_sin(phase_lo); - b_hi_1 = generate_sin(phase_hi_1); - b_hi_2 = generate_sin(phase_hi_2); - break; - case combi_wave_saw: - b_lo = generate_saw(phase_lo, inc_lo); - b_hi_1 = generate_saw(phase_hi_1, inc_hi_1); - b_hi_2 = generate_saw(phase_hi_2, inc_hi_2); - break; - case combi_wave_tri: - b_lo = generate_triangle(phase_lo, inc_lo); - b_hi_1 = generate_triangle(phase_hi_1, inc_hi_1); - b_hi_2 = generate_triangle(phase_hi_2, inc_hi_2); - break; - case combi_wave_sqr: - b_lo = generate_sqr(phase_lo, inc_lo, 1.0f); - b_hi_1 = generate_sqr(phase_hi_1, inc_hi_1, 1.0f); - b_hi_2 = generate_sqr(phase_hi_2, inc_hi_2, 1.0f); - break; - default: - assert(false); - break; - } - - float a_hi = (1.0f - dist_lerp) * a_hi_1 + dist_lerp * a_hi_2; - float b_hi = (1.0f - dist_lerp) * b_hi_1 + dist_lerp * b_hi_2; - (void)b_hi; - - float a_up = (1.0f - phase_lo) * a_lo + phase_lo * a_hi; - float a_down = phase_lo * a_lo + (1.0f - phase_lo) * a_hi; - return (1.0f - mix) * a_up + mix * a_down; -} - osc_engine:: osc_engine(int max_frame_count, float sample_rate): _oversampler(max_frame_count) @@ -1079,7 +896,7 @@ osc_engine::process(plugin_block& block, cv_audio_matrix_mixdown const* modulati if (type == type_off) { // still need to process to clear out the buffer in case we are mod source - process_tuning_mode(block, modulation); + process_tuning_mode(block, modulation); return; } @@ -1087,10 +904,9 @@ osc_engine::process(plugin_block& block, cv_audio_matrix_mixdown const* modulati { case type_dsf: process_dsf(block, modulation); break; case type_basic: process_basic(block, modulation); break; - case type_combi: process_combi(block, modulation); break; case type_static: process_static(block, modulation); break; - case type_kps1: process_tuning_mode(block, modulation); break; - case type_kps2: process_tuning_mode(block, modulation); break; + case type_kps1: process_tuning_mode(block, modulation); break; + case type_kps2: process_tuning_mode(block, modulation); break; default: assert(false); break; } } @@ -1099,44 +915,9 @@ template void osc_engine::process_dsf(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { if(block.state.own_block_automation[param_hard_sync][0].step()) - process_tuning_mode(block, modulation); - else - process_tuning_mode(block, modulation); -} - -template void -osc_engine::process_combi(plugin_block& block, cv_audio_matrix_mixdown const* modulation) -{ - if (block.state.own_block_automation[param_hard_sync][0].step()) - process_combi_wave1(block, modulation); + process_tuning_mode(block, modulation); else - process_combi_wave1(block, modulation); -} - -template void -osc_engine::process_combi_wave1(plugin_block& block, cv_audio_matrix_mixdown const* modulation) -{ - switch (block.state.own_block_automation[param_combi_wave1][0].step()) - { - case combi_wave_sin: process_combi_wave1_wave2(block, modulation); break; - case combi_wave_saw: process_combi_wave1_wave2(block, modulation); break; - case combi_wave_tri: process_combi_wave1_wave2(block, modulation); break; - case combi_wave_sqr: process_combi_wave1_wave2(block, modulation); break; - default: assert(false); break; - } -} - -template void -osc_engine::process_combi_wave1_wave2(plugin_block& block, cv_audio_matrix_mixdown const* modulation) -{ - switch (block.state.own_block_automation[param_combi_wave2][0].step()) - { - case combi_wave_sin: process_tuning_mode(block, modulation); break; - case combi_wave_saw: process_tuning_mode(block, modulation); break; - case combi_wave_tri: process_tuning_mode(block, modulation); break; - case combi_wave_sqr: process_tuning_mode(block, modulation); break; - default: assert(false); break; - } + process_tuning_mode(block, modulation); } template void @@ -1146,11 +927,11 @@ osc_engine::process_static(plugin_block& block, cv_audio_matrix_mixdown const* m int svf_mode = block_auto[param_rand_svf][0].step(); switch (svf_mode) { - case rand_svf_lpf: process_tuning_mode(block, modulation); break; - case rand_svf_hpf: process_tuning_mode(block, modulation); break; - case rand_svf_bpf: process_tuning_mode(block, modulation); break; - case rand_svf_bsf: process_tuning_mode(block, modulation); break; - case rand_svf_peq: process_tuning_mode(block, modulation); break; + case rand_svf_lpf: process_tuning_mode(block, modulation); break; + case rand_svf_hpf: process_tuning_mode(block, modulation); break; + case rand_svf_bpf: process_tuning_mode(block, modulation); break; + case rand_svf_bsf: process_tuning_mode(block, modulation); break; + case rand_svf_peq: process_tuning_mode(block, modulation); break; default: assert(false); break; } } @@ -1164,66 +945,62 @@ osc_engine::process_basic(plugin_block& block, cv_audio_matrix_mixdown const* mo else process_basic_sin(block, modulation); } -template void +template void osc_engine::process_basic_sin(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; bool saw = block_auto[param_basic_saw_on][0].step(); - if (saw) process_basic_sin_saw(block, modulation); - else process_basic_sin_saw(block, modulation); + if (saw) process_basic_sin_saw(block, modulation); + else process_basic_sin_saw(block, modulation); } -template void +template void osc_engine::process_basic_sin_saw(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; bool tri = block_auto[param_basic_tri_on][0].step(); - if (tri) process_basic_sin_saw_tri(block, modulation); - else process_basic_sin_saw_tri(block, modulation); + if (tri) process_basic_sin_saw_tri(block, modulation); + else process_basic_sin_saw_tri(block, modulation); } -template void +template void osc_engine::process_basic_sin_saw_tri(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; bool sqr = block_auto[param_basic_sqr_on][0].step(); - if (sqr) process_basic_sin_saw_tri_sqr(block, modulation); - else process_basic_sin_saw_tri_sqr(block, modulation); + if (sqr) process_basic_sin_saw_tri_sqr(block, modulation); + else process_basic_sin_saw_tri_sqr(block, modulation); } -template void +template void osc_engine::process_basic_sin_saw_tri_sqr(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { auto const& block_auto = block.state.own_block_automation; bool sync = block_auto[param_hard_sync][0].step() != 0; - if (sync) process_tuning_mode(block, modulation); - else process_tuning_mode(block, modulation); + if (sync) process_tuning_mode(block, modulation); + else process_tuning_mode(block, modulation); } -template < - bool Graph, - bool BasicSin, bool BasicSaw, bool BasicTri, bool BasicSqr, - bool Combi, int CombiWave1, int CombiWave2, - bool DSF, bool Sync, bool KPS, bool KPSAutoFdbk, bool Static, int StaticSVFType> +template void osc_engine::process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { switch (block.current_tuning_mode) { case engine_tuning_mode_no_tuning: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_on_note_before_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_on_note_after_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_continuous_before_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; case engine_tuning_mode_continuous_after_mod: - process_tuning_mode_unison(block, modulation); + process_tuning_mode_unison(block, modulation); break; default: assert(false); @@ -1231,28 +1008,21 @@ osc_engine::process_tuning_mode(plugin_block& block, cv_audio_matrix_mixdown con } } -template < - bool Graph, - bool BasicSin, bool BasicSaw, bool BasicTri, bool BasicSqr, - bool Combi, int CombiWave1, int CombiWave2, - bool DSF, bool Sync, bool KPS, bool KPSAutoFdbk, bool Static, int StaticSVFType, engine_tuning_mode TuningMode> +template void osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixdown const* modulation) { int generator_count = 0; - if constexpr (BasicSin) generator_count++; - if constexpr (BasicSaw) generator_count++; - if constexpr (BasicTri) generator_count++; - if constexpr (BasicSqr) generator_count++; - if constexpr (Combi) generator_count++; + if constexpr (Sin) generator_count++; + if constexpr (Saw) generator_count++; + if constexpr (Tri) generator_count++; + if constexpr (Sqr) generator_count++; if constexpr (DSF) generator_count++; if constexpr (KPS) generator_count++; if constexpr (Static) generator_count++; static_assert(!KPSAutoFdbk || KPS); static_assert(StaticSVFType == -1 || Static); - static_assert(Combi || (CombiWave1 == -1 && CombiWave2 == -1)); - static_assert(!Combi || (CombiWave1 != -1 && CombiWave2 != -1)); // need to clear all active outputs because we // don't know if we are a modulation source @@ -1280,8 +1050,6 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd int dsf_parts = (int)std::round(block_auto[param_dsf_parts][0].real()); int global_pb_range = block.state.all_block_automation[module_global_in][0][global_in_param_pb_range][0].step(); - int combi_wave_1 = block_auto[param_combi_wave1][0].step(); - int combi_wave_2 = block_auto[param_combi_wave2][0].step(); int rand_seed = block_auto[param_rand_seed][0].step(); int kps_mid_note = block_auto[param_kps_mid][0].step(); float kps_mid_freq = block.pitch_to_freq_with_tuning(kps_mid_note); @@ -1297,9 +1065,9 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd auto const& kps_stretch_curve = *(*modulation)[module_osc][block.module_slot][param_kps_stretch][0]; auto const& stc_res_curve = *(*modulation)[module_osc][block.module_slot][param_rand_res][0]; + auto const& pw_curve = *(*modulation)[module_osc][block.module_slot][param_basic_sqr_pw][0]; auto const& uni_dtn_curve = *(*modulation)[module_osc][block.module_slot][param_uni_dtn][0]; auto const& uni_sprd_curve = *(*modulation)[module_osc][block.module_slot][param_uni_sprd][0]; - auto const& basic_pw_curve = *(*modulation)[module_osc][block.module_slot][param_basic_sqr_pw][0]; auto const& voice_pitch_offset_curve = block.voice->all_cv[module_voice_in][0][voice_in_output_pitch_offset][0]; auto& pb_curve = block.state.own_scratch[scratch_pb]; @@ -1316,27 +1084,18 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd block.normalized_to_raw_block(module_osc, param_pitch, pitch_curve_norm, pitch_curve); if constexpr(Sync) block.normalized_to_raw_block(module_osc, param_hard_sync_semis, sync_semis_curve_norm, sync_semis_curve); - auto& basic_sin_mix_curve = block.state.own_scratch[scratch_basic_sin_mix]; - auto& basic_saw_mix_curve = block.state.own_scratch[scratch_basic_saw_mix]; - auto& basic_tri_mix_curve = block.state.own_scratch[scratch_basic_tri_mix]; - auto& basic_sqr_mix_curve = block.state.own_scratch[scratch_basic_sqr_mix]; - auto const& basic_sin_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_sin_mix][0]; - auto const& basic_saw_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_saw_mix][0]; - auto const& basic_tri_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_tri_mix][0]; - auto const& basic_sqr_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_sqr_mix][0]; - if constexpr (BasicSin) block.normalized_to_raw_block(module_osc, param_basic_sin_mix, basic_sin_mix_curve_norm, basic_sin_mix_curve); - if constexpr (BasicSaw) block.normalized_to_raw_block(module_osc, param_basic_saw_mix, basic_saw_mix_curve_norm, basic_saw_mix_curve); - if constexpr (BasicTri) block.normalized_to_raw_block(module_osc, param_basic_tri_mix, basic_tri_mix_curve_norm, basic_tri_mix_curve); - if constexpr (BasicSqr) block.normalized_to_raw_block(module_osc, param_basic_sqr_mix, basic_sqr_mix_curve_norm, basic_sqr_mix_curve); - - auto const& combi_mix_curve = *(*modulation)[module_osc][block.module_slot][param_combi_mix][0]; - auto const& combi_skx1_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_x_1][0]; - auto const& combi_sky1_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_y_1][0]; - auto const& combi_skx2_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_x_2][0]; - auto const& combi_sky2_curve = *(*modulation)[module_osc][block.module_slot][param_combi_skew_y_2][0]; - auto& combi_freq_curve = block.state.own_scratch[scratch_combi_freq]; - auto const& combi_freq_curve_norm = *(*modulation)[module_osc][block.module_slot][param_combi_freq][0]; - if constexpr (Combi) block.normalized_to_raw_block(module_osc, param_combi_freq, combi_freq_curve_norm, combi_freq_curve); + auto& sin_mix_curve = block.state.own_scratch[scratch_basic_sin_mix]; + auto& saw_mix_curve = block.state.own_scratch[scratch_basic_saw_mix]; + auto& tri_mix_curve = block.state.own_scratch[scratch_basic_tri_mix]; + auto& sqr_mix_curve = block.state.own_scratch[scratch_basic_sqr_mix]; + auto const& sin_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_sin_mix][0]; + auto const& saw_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_saw_mix][0]; + auto const& tri_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_tri_mix][0]; + auto const& sqr_mix_curve_norm = *(*modulation)[module_osc][block.module_slot][param_basic_sqr_mix][0]; + if constexpr (Sin) block.normalized_to_raw_block(module_osc, param_basic_sin_mix, sin_mix_curve_norm, sin_mix_curve); + if constexpr (Saw) block.normalized_to_raw_block(module_osc, param_basic_saw_mix, saw_mix_curve_norm, saw_mix_curve); + if constexpr (Tri) block.normalized_to_raw_block(module_osc, param_basic_tri_mix, tri_mix_curve_norm, tri_mix_curve); + if constexpr (Sqr) block.normalized_to_raw_block(module_osc, param_basic_sqr_mix, sqr_mix_curve_norm, sqr_mix_curve); auto& rand_rate_curve = block.state.own_scratch[scratch_rand_rate]; auto& rand_freq_curve = block.state.own_scratch[scratch_rand_freq]; @@ -1447,16 +1206,11 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd assert(0 <= _sync_phases[v] && _sync_phases[v] < 1); } - if constexpr (BasicSin) synced_sample += generate_sin(_sync_phases[v]) * basic_sin_mix_curve[mod_index]; - if constexpr (BasicSaw) synced_sample += generate_saw(_sync_phases[v], inc_sync) * basic_saw_mix_curve[mod_index]; - if constexpr (BasicTri) synced_sample += generate_triangle(_sync_phases[v], inc_sync) * basic_tri_mix_curve[mod_index]; - if constexpr (BasicSqr) synced_sample += generate_sqr(_sync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; + if constexpr (Saw) synced_sample += generate_saw(_sync_phases[v], inc_sync) * saw_mix_curve[mod_index]; + if constexpr (Sin) synced_sample += std::sin(2.0f * pi32 * _sync_phases[v]) * sin_mix_curve[mod_index]; + if constexpr (Tri) synced_sample += generate_triangle(_sync_phases[v], inc_sync) * tri_mix_curve[mod_index]; + if constexpr (Sqr) synced_sample += generate_sqr(_sync_phases[v], inc_sync, pw_curve[mod_index]) * sqr_mix_curve[mod_index]; if constexpr (DSF) synced_sample = generate_dsf(_sync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); - if constexpr (Combi) synced_sample = generate_combi( - combi_wave_1, combi_wave_2, oversampled_rate, _sync_phases[v], inc_sync, freq_sync, - combi_freq_curve[mod_index], combi_mix_curve[mod_index], - combi_skx1_curve[mod_index], combi_sky1_curve[mod_index], - combi_skx2_curve[mod_index], combi_sky2_curve[mod_index]); // generate the unsynced sample and crossover float unsynced_sample = 0; @@ -1472,15 +1226,11 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd if (_unsync_phases[v] == 1) _unsync_phases[v] = 0; // this could be more efficient? assert(0 <= _unsync_phases[v] && _unsync_phases[v] < 1); - if constexpr (BasicSin) unsynced_sample += generate_sin(_unsync_phases[v]) * basic_sin_mix_curve[mod_index]; - if constexpr (BasicSaw) unsynced_sample += generate_saw(_unsync_phases[v], inc_sync) * basic_saw_mix_curve[mod_index]; - if constexpr (BasicTri) unsynced_sample += generate_triangle(_unsync_phases[v], inc_sync) * basic_tri_mix_curve[mod_index]; - if constexpr (BasicSqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, basic_pw_curve[mod_index]) * basic_sqr_mix_curve[mod_index]; + if constexpr (Saw) unsynced_sample += generate_saw(_unsync_phases[v], inc_sync) * saw_mix_curve[mod_index]; + if constexpr (Sin) unsynced_sample += std::sin(2.0f * pi32 * _unsync_phases[v]) * sin_mix_curve[mod_index]; + if constexpr (Tri) unsynced_sample += generate_triangle(_unsync_phases[v], inc_sync) * tri_mix_curve[mod_index]; + if constexpr (Sqr) unsynced_sample += generate_sqr(_unsync_phases[v], inc_sync, pw_curve[mod_index]) * sqr_mix_curve[mod_index]; if constexpr (DSF) unsynced_sample = generate_dsf(_unsync_phases[v], oversampled_rate, freq_sync, dsf_parts, dsf_dist, dsf_dcy_curve[mod_index]); - if constexpr (Combi) unsynced_sample = generate_combi( - combi_wave_1, combi_wave_2, oversampled_rate, _unsync_phases[v], inc_sync, freq_sync, combi_freq_curve[mod_index], combi_mix_curve[mod_index], - combi_skx1_curve[mod_index], combi_sky1_curve[mod_index], combi_skx2_curve[mod_index], combi_sky2_curve[mod_index]); - increment_and_wrap_phase(_unsync_phases[v], inc_sync); float unsynced_weight = _unsync_samples[v]-- / (sync_over_samples + 1.0f); @@ -1537,4 +1287,4 @@ osc_engine::process_tuning_mode_unison(plugin_block& block, cv_audio_matrix_mixd } } -} +} \ No newline at end of file From 9da1608af1fc0672d8310da3d0f115e0a58511c7 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Thu, 17 Oct 2024 18:15:51 +0200 Subject: [PATCH 45/61] take 18 --- param_reference.html | 144 ++----------------------------------------- todo.txt | 3 +- 2 files changed, 6 insertions(+), 141 deletions(-) diff --git a/param_reference.html b/param_reference.html index 523ab6cc1..96b355f0b 100644 --- a/param_reference.html +++ b/param_reference.html @@ -2897,7 +2897,7 @@

Osc

N/A -Detune unison voices. Only applicable to Basic, DSF and KPS generators. +Detune unison voices. Only applicable to Basic and DSF generators. Unison Phase @@ -3070,142 +3070,6 @@

Osc

Square generator pulse width. -Combi Wave 1 -Combi -Yes -Patch -1 -Input -Voice -Automate -Sin -Sqr -Sin -N/A - - -Selects the base waveform. - - -Combi Skew X 1 -Combi -Yes -Patch -1 -Input -Accurate -Modulate -0.00 % -100.00 % -0.00 % -N/A - - -Wave 1 skew X amount. - - -Combi Skew Y 1 -Combi -Yes -Patch -1 -Input -Accurate -Modulate -0.00 % -100.00 % -0.00 % -N/A - - -Wave 1 skew Y amount. - - -Combi Freq -Combi -Yes -Patch -1 -Input -Accurate -Modulate -1.00 -32.00 -2.00 -N/A - - -Controls wave 2 frequency. - - -Combi Wave 2 -Combi -Yes -Patch -1 -Input -Voice -Automate -Sin -Sqr -Sin -N/A - - -Selects the overlay waveform. - - -Combi Skew X 2 -Combi -Yes -Patch -1 -Input -Accurate -Modulate -0.00 % -100.00 % -0.00 % -N/A - - -Wave 2 skew X amount. - - -Combi Skew Y 2 -Combi -Yes -Patch -1 -Input -Accurate -Modulate -0.00 % -100.00 % -0.00 % -N/A - - -Wave 2 skew Y amount. - - -Combi Mix -Combi -Yes -Patch -1 -Input -Accurate -Modulate -0.00 % -100.00 % -50.00 % -N/A - - -Controls the overlay mix amount. - - DSF Partials DSF Yes @@ -3288,7 +3152,7 @@

Osc

10.0 % -On-voice-init step count for static noise and initial-excite stage of Karplus-Strong. +On-voice-init step count for static noise and initial-excite stage of Karplus-Strong. Modulation takes place only at voice start. Random Filter Freq @@ -3305,7 +3169,7 @@

Osc

1000 Hz -Continuous filter frequency for static noise or voice-initial-excite filter frequency for Karplus-Strong. +Continuous filter frequency for static noise or initial-excite filter frequency for Karplus-Strong. Modulation takes place only at voice start. Random Filter Reso @@ -3322,7 +3186,7 @@

Osc

N/A -Continuous filter resonance for static noise or voice-initial-excite filter resonance for Karplus-Strong. +Continuous filter resonance for static noise or initial-excite filter resonance for Karplus-Strong. Modulation takes place only at voice start. Rnd Seed diff --git a/todo.txt b/todo.txt index 6433ef4d7..e4d754603 100644 --- a/todo.txt +++ b/todo.txt @@ -33,14 +33,15 @@ X do the conversion for snapping ==> missing = off X global unit lfo phase offset not plot good V do glfo in project time samples (can do now bc all is phased!) V do snap for clap +X arp new note = reset table pos yes/no? update the routing graph for arp do global snap docs? fix the bug demos make a patch cleanup button +do labels for the auxes ditch after-mod, claim micro support ? -arp new note = reset table pos yes/no? do more keyboard tracking just do it -- also trackmode mul/add do global unison subvoice index as a mod source turn on stuff when dragging (e.g. basic sin, dist skew etc) From 4f02328d9dd827dc1fce88897940de6d6d65913f Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Thu, 17 Oct 2024 21:27:01 +0200 Subject: [PATCH 46/61] take 19 --- .../src/plugin_base/plugin_base/gui/gui.cpp | 3 ++ .../plugin_base/plugin_base/topo/param.hpp | 3 ++ src/firefly_synth/firefly_synth/global_in.cpp | 31 +++++++++++-------- .../firefly_synth/oscillator.cpp | 2 +- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/plugin_base/src/plugin_base/plugin_base/gui/gui.cpp b/plugin_base/src/plugin_base/plugin_base/gui/gui.cpp index a42d6771c..88caba42b 100644 --- a/plugin_base/src/plugin_base/plugin_base/gui/gui.cpp +++ b/plugin_base/src/plugin_base/plugin_base/gui/gui.cpp @@ -1162,15 +1162,18 @@ plugin_gui::make_param_label(module_desc const& module, param_desc const& param, } assert(alternate_drag_param == nullptr || alternate_drag_output == nullptr); + assert(!param.param->gui.editable_label || contents == gui_label_contents::name); Component* result = {}; Label* label_result = {}; + switch (contents) { case gui_label_contents::name: label_result = &make_component(this, &module, ¶m, alternate_drag_param, alternate_drag_output, _module_lnfs[module.module->info.index].get()); label_result->setJustificationType(justification_type(param.param->gui.label)); + if (param.param->gui.editable_label) label_result->setEditable(true); result = label_result; break; case gui_label_contents::value: diff --git a/plugin_base/src/plugin_base/plugin_base/topo/param.hpp b/plugin_base/src/plugin_base/plugin_base/topo/param.hpp index 843da1169..d670936b7 100644 --- a/plugin_base/src/plugin_base/plugin_base/topo/param.hpp +++ b/plugin_base/src/plugin_base/plugin_base/topo/param.hpp @@ -94,6 +94,9 @@ struct param_topo_gui final { // allow to drop on this combobox? bool enable_dropdown_drop_target = false; + // allows user to attach a custom tag to param ui + bool editable_label = false; + // if dragging this label, mod source is "self" or below std::string alternate_drag_param_id = {}; std::string alternate_drag_output_id = {}; diff --git a/src/firefly_synth/firefly_synth/global_in.cpp b/src/firefly_synth/firefly_synth/global_in.cpp index 37464984c..939582f34 100644 --- a/src/firefly_synth/firefly_synth/global_in.cpp +++ b/src/firefly_synth/firefly_synth/global_in.cpp @@ -9,6 +9,7 @@ #include #include +#include using namespace plugin_base; @@ -52,7 +53,7 @@ module_topo global_in_topo(int section, bool is_fx, gui_position const& pos) { std::vector row_distribution = { 1 }; - std::vector column_distribution = { 37, 27, 26, 44, 24, 22, 28, 76 }; + std::vector column_distribution = { 37, 27, 26, 44, 24, 22, 32, 80 }; module_topo result(make_module( make_topo_info_basic("{E22B3B9D-2337-4DE5-AA34-EB3351948D6A}", "Global", module_global_in, 1), make_module_dsp(module_stage::input, module_output::cv, 0, { @@ -69,13 +70,13 @@ global_in_topo(int section, bool is_fx, gui_position const& pos) result.gui.menu_handler_factory = make_cv_routing_menu_handler; result.engine_factory = [](auto const&, int, int) { return std::make_unique(); }; - auto section_aux_gui = make_param_section_gui({ 0, 0, 1, 5 }, gui_dimension({ 1 }, { - gui_dimension::auto_size_all, 1, - gui_dimension::auto_size_all, 1, - gui_dimension::auto_size_all, 1, - gui_dimension::auto_size_all, 1, - gui_dimension::auto_size_all, 1, - gui_dimension::auto_size_all, 1 }), + auto section_aux_gui = make_param_section_gui({ 0, 0, 1, 7 }, gui_dimension({ 1 }, { + 1, gui_dimension::auto_size_all, + 1, gui_dimension::auto_size_all, + 1, gui_dimension::auto_size_all, + 1, gui_dimension::auto_size_all, + 1, gui_dimension::auto_size_all, + 1, gui_dimension::auto_size_all}), gui_label_edit_cell_split::horizontal); result.sections.emplace_back(make_param_section(section_aux, make_topo_tag_basic("{BB12B605-4EEF-4FEA-9F2C-FACEEA39644A}", "Aux"), section_aux_gui)); @@ -85,32 +86,36 @@ global_in_topo(int section, bool is_fx, gui_position const& pos) make_param_gui(section_aux, gui_edit_type::knob, param_layout::parent_grid, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); aux.info.description = "Auxilliary controls to be used through automation and the CV matrices."; + aux.gui.editable_label = true; aux.gui.alternate_drag_output_id = result.dsp.outputs[output_aux].info.tag.id; aux.gui.display_formatter = [](auto const& desc) { - return desc.info.slot == 0 ? desc.info.name : std::to_string(desc.info.slot + 1); }; + std::string result = desc.param->info.tag.display_name + " " + std::to_string(desc.info.slot + 1); + std::transform(result.begin(), result.end(), result.begin(), ::toupper); + return result; + }; auto linked_gui = make_param_section_gui( - { 0, 5, 1, 3 }, gui_dimension({ 1 }, { + { 0, 7, 1, 1 }, gui_dimension({ 1 }, { gui_dimension::auto_size_all, gui_dimension::auto_size_all, gui_dimension::auto_size_all, gui_dimension::auto_size_all, gui_dimension::auto_size_all, 1 }), gui_label_edit_cell_split::horizontal); result.sections.emplace_back(make_param_section(section_linked, make_topo_tag_basic("{56FD2FEB-3084-4E28-B56C-06D31406EB42}", "Linked"), linked_gui)); auto& mod_wheel = result.params.emplace_back(make_param( - make_topo_info("{7696305C-28F3-4C54-A6CA-7C9DB5635153}", true, "Mod Wheel", "Mod Wheel", "Mod", param_mod, 1), + make_topo_info("{7696305C-28F3-4C54-A6CA-7C9DB5635153}", true, "Mod Wheel", "Mod", "Mod", param_mod, 1), make_param_dsp_midi({ module_midi, 0, 1 }), make_domain_percentage_identity(0, 0, true), make_param_gui_single(section_linked, gui_edit_type::knob, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); mod_wheel.info.description = "Linked to MIDI mod wheel, updates on incoming MIDI events."; mod_wheel.gui.alternate_drag_output_id = result.dsp.outputs[output_mod].info.tag.id; auto& pitch_bend = result.params.emplace_back(make_param( - make_topo_info("{D1B334A6-FA2F-4AE4-97A0-A28DD0C1B48D}", true, "Pitch Bend", "Pitch Bend", "PB", param_pb, 1), + make_topo_info("{D1B334A6-FA2F-4AE4-97A0-A28DD0C1B48D}", true, "Pitch Bend", "PB", "PB", param_pb, 1), make_param_dsp_midi({ module_midi, 0, midi_source_pb }), make_domain_percentage(-1, 1, 0, 0, true), make_param_gui_single(section_linked, gui_edit_type::knob, { 0, 2 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); pitch_bend.info.description = "Linked to MIDI pitch bend, updates on incoming MIDI events."; pitch_bend.gui.alternate_drag_output_id = result.dsp.outputs[output_pb].info.tag.id; auto& pb_range = result.params.emplace_back(make_param( - make_topo_info("{79B7592A-4911-4B04-8F71-5DD4B2733F4F}", true, "Pitch Bend Range", "Range", "PB Range", param_pb_range, 1), + make_topo_info("{79B7592A-4911-4B04-8F71-5DD4B2733F4F}", true, "Pitch Bend Range", "Rng", "PB Range", param_pb_range, 1), make_param_dsp_block(param_automate::automate), make_domain_step(1, 24, 12, 0), make_param_gui_single(section_linked, gui_edit_type::list, { 0, 4 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index b8b9b3669..bcd5b48d0 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -432,7 +432,7 @@ osc_topo(int section, gui_position const& pos) make_param_gui_single(section_sync_uni, gui_edit_type::knob, { 1, 2 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); uni_dtn.gui.bindings.enabled.bind_params({ param_type, param_uni_voices }, [](auto const& vs) { return can_do_pitch(vs[0]) && vs[1] > 1; }); - uni_dtn.info.description = "Detune unison voices. Only applicable to Basic and DSF generators."; + uni_dtn.info.description = "Detune unison voices. Only applicable to Basic, DSF and KPS generators."; auto& uni_phase = result.params.emplace_back(make_param( make_topo_info("{8F1098B6-64F9-407E-A8A3-8C3637D59A26}", true, "Unison Phase", "Phs", "Uni Phase", param_uni_phase, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.5, 0, true), From 80982b0e6de77506834112090462142b07d983ee Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 22 Oct 2024 18:29:49 +0200 Subject: [PATCH 47/61] take 20 --- demos/working/demo_track_psytrance.xrns | Bin 0 -> 53878 bytes param_reference.html | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 demos/working/demo_track_psytrance.xrns diff --git a/demos/working/demo_track_psytrance.xrns b/demos/working/demo_track_psytrance.xrns new file mode 100644 index 0000000000000000000000000000000000000000..5ed20b7fcfeb9350393c656ad81db961453252d2 GIT binary patch literal 53878 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 literal 0 HcmV?d00001 diff --git a/param_reference.html b/param_reference.html index 96b355f0b..6c78ac136 100644 --- a/param_reference.html +++ b/param_reference.html @@ -2897,7 +2897,7 @@

Osc

N/A -Detune unison voices. Only applicable to Basic and DSF generators. +Detune unison voices. Only applicable to Basic, DSF and KPS generators. Unison Phase From f0aff8abc8cafab575a8a9346eb8c28a243d3ec2 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 22 Oct 2024 19:06:46 +0200 Subject: [PATCH 48/61] cv to envelope modulation bugfix --- changelog.md | 4 ++++ demos/demo/demo_track_psytrance.xrns | Bin 0 -> 144339 bytes src/firefly_synth/firefly_synth/envelope.cpp | 18 +++++++++--------- 3 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 demos/demo/demo_track_psytrance.xrns diff --git a/changelog.md b/changelog.md index ae5d8d239..80066ac2b 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,7 @@ +?, ? - V1.9.6. + +- Bugfix: CV-to-envelope modulation did not take the voice start sample position within the block into account. + ### October 9, 2024 - V1.9.5. - Added arpeggiator (see manual). diff --git a/demos/demo/demo_track_psytrance.xrns b/demos/demo/demo_track_psytrance.xrns new file mode 100644 index 0000000000000000000000000000000000000000..d234ad6832f78d3a934d27bae7f96e449d8c0fc3 GIT binary patch literal 144339 zcmc$^XH?VAw=b+zl_nt4iAWRay$4jv4{0hQASHC9_ZmV#lwPGvQ&CU}5PBzIfY1>^ z5_+!*H4sV&T>j^r|GDR`b)Oga)w5=;`ObIGo;`c5nc4fZ_slara*8|G$gbVEHkk9u z94}yix0NBgMr)&aMY(p(*vr#dJlMk>*XH3j-BT}qLOPEhER>K5*qv;-{y|qZGu?us z`B7Bf>^}|7!jZ?w49$N2>rW5N;JSyEMRgjJSq^<4xPMdoOjJDGrg(Sla5@w+Q4>xC zwG0dy?Mlqe!73{+uz*hWN%ipN#*ZM03DbegvzVGb=*3yeIvVZ%n zjnpvR<^v%Kwzmh9IMz?cpfmK`^&gd6T2E%JOt7wgRT0k6##)5^N&V~jmk0n-wFo4! zHGdHRUPO*tdF?YSVFw0iPBIp;w*tqH*mus2(l6eFfoeUomZH(SKd}Qfw}!h60_%S4 z0vD@_j-mOMUh?Q^6$Ht;4MGh)Iz5`sF0g8!v~;Kh&0D_QGw@nK;g6iG{vL$xyOf6Q zmyn_^%uMl_!K5=g>si&)PZIOB(BBuB=>})~!Qbx5rR}4m)!loV;Y75(`b<06?^O}f z(Wma+tokg?hk0o9vDz8(B1PjuRD6yHN2qrS84Zma=m%m-pp9)9cM zbU-~N{1+(v3~}LQ7S#gc0U>^jm2I8Esrl_ury#tayp>|LA;3VynUJ#I8p)weX%zS6b@TTe;ZSDC%nOEOKo3w5oxpqxoWEK>$b%djbC~e z$p$Z_pE0PrT=8zM3jtmB_R_;IJc|won2QeaNTajW7RaAUqp&{(5|}*7^-ubFpmt;_ zBy4dVa6H~{PIb04TM{zYx3y%4A1|$j)~h7}=83)f;rn^v38v1brmURf!3qnOVGTy@ zkX<8y_4#QG^mKp#KBStf2F{1o((HoH{qcvP43<(;sv_hC$fy&nb)cc$L z_6UA=J|al5mftw{B63_#rX()o+&Cut-#b?lFzO9FLoIanJ1{%K8SW$3{w_{k<>vzP~Z zbde79=+IVG82zIIJvrZ94*Gi(voKX`f7Wz7()pR{XnX)F!>WM3T3md>WeEfE7ZJMb zg$PSzXuQb-Ig0r`U;JewvXO``KJfICd;94!4surpLoJHtlyng7RjXy&IY-+!XgQm% z#yqgzMa~9E%>9+Q41GMRda}62Xce>@-R5c^G`_u#2)~FWxkqHywx3x#hZB}d5!5Q< zQA4?Hh~SpVvZJ1A4VmTAMJN0;qOfssn6-5hR#xgBTlo@J{^Rf6jE6IL8wWuB`uf@+ zATMa(=&$|SAazTon$s^J_C?qzZ{M7WO~glR5Q}I(ByWArh@rl|QJK7Q{fQ_Z303or z{}QC2PAU>T*;I!rM|(hhNX)87qcW7Jx=H5rOWWVlbF=gJz(|g+<++Tjja@*)uoISh zvmKNo)N{HJ1CG>_oY^IvY}TsoUm0c2uKkugg@r#*jCPR3Y?Dt7u;uiQ1?eze2O7K= z)JHF_@L^j$>hg3y1!&cVljhAm^t3sVef|w6qLMJaQI`-+ytHzkM2rPD z4kP~xGKe4)ZL#iZmLoXWv&Gt%*)??>Kk5#a2NJQ8>S>=3${t%iEivr6r;>*4+nbY- zuTdl^K>~`Gj=ba0BSs~n>g_>v7wn+I0-SuQE&SvAy!&DmkId%Aa|^ngW#cSsp7~Ve znK3)gm^9~WIdN;|GOJl-sP$z^YWZhWG!&`VC`=Dlj_2XwDfW}I;qw=TWgAXD)xm!4 zN}*$6&iU9^nNI;-G)EE>w}L;MerSS*Rv2VY$~jpB6J|48`wr zQdf=`eYo6h%?{tRKu&IAiVC8Ab2TP3#2VF0HN-so^(9sLo}G7DG+IaDo47Df_W zzL8RM?R)%xAmglVDl(h&3_N2=&{Ssp{)^5UFmHjcIj`brB8ias{>pxU7ZLb(kz$8xZ=bE+2bhq}y2(Ck|wfIQk0I`s!boaA`{Mpm> zr?dITgIHD7Tf>!y>)@09qd)k8A4LUQM|@bHL(KgAbY99%OLeIp#`qT{b2cH-FLUXk zH0qH9PQOD=aX|3H0Je!oQXJ;(gQf0Pv8lGDm z6(%+{Uy?U;;Vp?QkDN;57D1&9<7bqi;v(zD0_mH1 zmvUKbnDZu34#>&X)>*0d{cHL%)X+g2wHNU9M}Kb4fSVM2QXc?!JE2ixKfr$s8Q{m` zTVX4&YdP0d;0!wVI5iaFuJ=-on?l(1VDUbxJ~jWSz@xO9WxmA$vV)AKk``%jw*vzI zczLM~c73?{yK~CunMBo{mE)%omTVC*cRK6Z$tEkfPTE9wH_Hg9^dfNp_XyIh^lYbw zC;6DMDO`u@sTpUV1|mEoQk#v&c_7j-8uFb6UhA!9i(8miuV(-`trv8UBUrU`30lxPoq*C!N4?mA^2~!Ir-kd&qb1jH#OYok4XBpfANA z7QSdrv$_+m_wJVae)3EBd*fWcM6Fjt=5nGASnftb z#*OP?oGKIYJ`H9E+7-wA8=%xpeO4C+!@vK;P1>R|Bie$Rf@j))GgJuR@;ri#1^M=L zZDy+fgl9z<+S`l~ggixUps)JHbA6PIts`3}6Rlm511AIZ;<)vI@M^2qQp9D+YJNJ0 zAK;&Z*f^{1KgFVbLASyrQ-y6TlF|ovl1ILxSaij?A$Az`TxY}%LVG}dp6;Xy z51fk3-yhR#cZERY*Gor<@~bhzGaAGjtE#=RbUn-sKh55j=OzBm`mmw!*5fs4BRev`+{kSnV@;Z}! z;CjADYNRn-DXWoH%9AnDYX&{%oyz`sQQ*8L&Ofb&;20gMqEaAXlw7>g`nQqvI3j6S zV7`kjrO!R?^h-FEG~cpbBKbQTzpkk$E0YrII`Qeh0pT2V>;u;Tfb$D7+`QcM+Z{)u zlxP|4cD(&s(t97}LpjzeSJ2(5?l;Yl`@=*7=ciK!Z;7{t^(lSB6Xd_xDO0H2#0gnAPNbMu#|WB@{2EDR*A{mdG63sKSZzyeC>*I-7t+~fEsi3R$ih-N z&^kQSpAeeA6Ki@qcd3c?LxGy zmXv`@|FpDbQQ`*v98IGhdDMHHb=<;r(AtODP`{m7OR}y5TRmpZUNd>DeujirJI_`lp7s|p?NgX{Kd3NTVO22ZH$yHbhwn`f83_yFM zCYKN9aXycHKKaDe82?Tciuy7n@qREps<$<#m zVcGI={-ZWD%TyMGssoubZ$-QxB&_W#sFyit#HFa7iP|NFqg}9ybH_D`%ELxOf(EZg(hrloZM-t*czAlc8H36T zzWWOYhH`fl>Obi&t37%U#~TZ7dr+E3xSj+{!Tw7byDeM;Xiu(=ldw*F!_D1&&=q ziH-KGi{y~!+$45=gox1x$t;frT)R|_k}~vc7lvM2r#wg1GRS{2b>!pgfO5T>`XN~K zZB|yko6B8`(J3Z&=rCIB>^vvCU#+)hyX$@+)$m=TCwoc6sY)Anwq;C&xF0z@?;Wmg z2XE1c7)Hu3OWTxAe>S}*B1jKeqDr}KCq~yxj{%Fn)S@7i&k47{hFq}rz6%4OIt%q0 zS~^^1TgrFx!RyGJ9A)|?+LgJkWWLo=LOQuiXZ;)Xi9;05cf!};8NEDrKY}+eLUjC1 zO;lYBc;wC-k;s%K)_c6ndu?kfe=n3LRrNhzCz+p6_#4gX=%>^=MkwF%D`w7)uGXAa zjH3;+h-$eF+Jv?~0Nrj?@)`vy+&`K!e7{uPkIN`7%8?78a%4D1{)`*BBmVn6_VZ9s z#6GOBL#^JFd6`j0npWELLtKH+c4sz|;M*D&VUbQ&Ml}zGv|4=OL38QUkGMV!f>$9j zy8vY1H5@aajHDz!aCNoqSQ`^%j74@^Hq=-ANbj<2cNk-wYHrS{XTsLnLYt1G7%Y~_ z>(4YMeP(b^+T%Z}`bg1!tf6WzrU2--gk1~w17#c8IJENsa`Hjk-|4AvRNdK;KKG{e z7#GaP>SsF5rz4GM4=8ZAu3xBw1Qwpud(B6aUTxp%Gft&3r~pSO+QUTxsj!KQqPF6o ztS_&^q{ujhT>uJye_p_%7|N0r@fPk^pbm#L|U)!S^cc!!Cg82(3<`@{~?{}W7FuAW1k}?cg{p-JJF9` zc8>T0g3Y||;`GR7N5i{>p;m*uUxu9%dbygdfT@4j^jOWn*W?*7>^3N>H$ndh{Z94* zkYn=Bx*xcp4Ik6KsyZ|`Ho86!PzWBnpy;uIX|x!9zd!2~Mo#E%4FJt021d!cxW-wi z>e(fj8T7sAa(-KwX~JCDaW0QpS+IDYJFp1*Cb{D<9u6D1XQYFzGB+92{(0>Z?w|Qc z|8Z2gR#Q7}@wIMh(mkSGm&51$H{kMQotEmOx&udsQ;@8T)Ctbor_1Hz*Uq9WCyKK; z_Us#dR-jCmg1RJiF;j(_lWRVQWF+CHs2XG4_E@QQG6L6x0sl~w@5Ym1H~4iQ%X0Jv z))+Yj5@|{Yl0of|kJhx9Mp*1Z_ADm_PL6|1nD&mG;}%6KUN;CZ)hl+q78Z2dbFqhs zqY<{*i_(KIZj>Ra}^1a z>?ybN9@YqqSe5$FdXyj03tshAo_e`$C$d&o9WSCnJuB-8XW_v4k9V?zc1Xf(A~Wc0 z!{aHmsjGLyIUPBK^5VI%$lZUUxmY>S4ES$#s!l3a@r9aDa`zxBclzpA^urDIL;|9|f6ykx3ESZz#sE~e zICI}W^~m?Zf4q5lE?41>7pPxZeSq5*f=~_j-1F;Ijt3}Y)+vD2Vy)$^m|xvhdd4O_ z3eSX}UT}^;+;Dce6-bpYn;nso&p;b=vCp-I#(u|p8xPWdDSim&bb8Dp;5%l&ZGl*% zM1_K3q*%szzR+k1ayUuT$zojv!ENz%_{mraUE|*k)-2`T7iKmP^$#gTMlfa zs=BzOCY%m>&~|2HNz0>ebXW}LW7r&ToJefj*8%tL2#p0fmu`_xm8Y<^WAbj7J$%A5 z;x(M`c~+mX^~fkIN_jOHZ*r!d)bcF{h;hTbGS3?yKc3{OdF0`_@A3#E^PI8P!$GHg z*Ru+%o$IwSv?!^kAUo?w;loQtaLm!RO+v&a?Q&Oe%;LPQ8mHBccG+Jpe8#rlCQieP z&&UwqA0j~xx)zczy@IY6x!yeN#-`Gn%kBHTi~z0)Tj?z*q@5c?76<*nB)N0PP5!t! zEHQo9pv7=3x#T5i2JqCXDa5$xOC>7NM-6JjFYwoVxVMk#LLC71b4qa)c;hZ>3%y^*HD=|jHcV@^NUd@ zuAAqDuMceLtjT-2&HUPP-uh&;D}i3^(}K-2e<5?g<>&{V3m0QPEtV49k`Y12Rd+}4 zh>T*s_fAH%rVE_a=8Wmu=J&44B~Jm;&4(md^8&X$BXjbf8z1lb+Xv~Tux&`8@1Dwy z&QV#gxO-y2)ZYcHV6RsP@B+OG>`wJnPdervTNv-qF1>r?Wt2~mD|uM*!|nR)Y`8&S zei81~y3y)mixr>Vg|N<(+ubp$Pv{ta5@Llc1la6Hc|2-)eKU{XXj>K1c=CcSo6%^@ zCa0?jEZ*VkN9C`rag4f=A>64DGY03FI*JxPW@QR>5_TmT(ig6O2a~cpbx1?&`}M^C zlU;QEdoTD_Z&h5?s+{jcYHf)U&PHE-W&%eqGOjs63Gji$= zPJ|fH=5I-G81ot{QMk{r(9#X8Xn^GfJB|^BQ6KTzmD@f(vAjxyIWvweVM!m592hAK zBeFk&E{At6#Y^K=>?30uOOA2dg;Img=*y>&^ZVvfZWgcJ^&Y`UVF{#0jX(uO5tDnY zjJQta+aCm;uQ@%=jIDFM)XzP*UH#>8`{PJRAtC(k(q0;p6CW3X*tD>2mSp}yWqzZ+ zXX)Ou@--p<^7H$h=M|56s=uT~^7f?5EoDta{swLf3xZ4jc_Q#3DzVIiOKgeukVoQq zpY$x+?n@ZzwG_>Ie~E=EI9|w7iI3i|LVh)9f$e53wMzET2f>lZqg>Ua>P}c`TO1|n zeTcToYHsGDo|5)>Hok)`Mm2Vu!r6u9#amv9cBUU*jhbd-C~yogA@E^Oq2(XLNA+A0 zyLFBgws3)tls~Zw-C^3xPwq3^BXFd@LEC%g40Y81YH#klZr8g#Q5?lRXNoC>@0Wcj zX{f7uvclSz|}mD8R!O_~>C>Nxm0o$^NMi9GfEPpjui z{x_?KbIrIFPEtAinBm6{R~FKw2s!^Cqw(J;RI1$7D)ZjDi+F`-b+qTaa>nRf_-;*i zzn~>w?W#`$zh{#T5W8RQP1h+;0h)}gq~wuij$|5(O5WGxdS5eEd&FV8xz6h=%1(Xo zOE{UtdMtIuf;vm3^>fwYC#VTcua}(~B-VrkAfL zUkQ~-+vS%a##+3f#2h67>NV71DNC8_6o>On<^F0-C^=yqQQW>0AX2DY-_ zruQA)w2D5FQDHe?BV`HuR*k<|E~^d*dquk(l8#POQ`wZTSS7>Th-BTIc!m=UlzI#> z-WND4@b;i2`VO+#b<<>iGME7>^aaZ?C{X6h!K>~E1Wq}L({9r>$<)JyhL7~)q-=iE zxJA#L@g9iVGtj?3dTOIrKSD$BaWB*2uKQ?ueVV@)S2%XVfwJd&#~dnulnHF|GBz`V z($_kI{`ODE%!uRCh~cvsp|+P4UQ;+Iov+&P?*J@~^LDDT8!1gReb}FJPi_(|||5uIt;5J*^oZ;x1rEQs{HL^u<1lZ`Y8- zK$d+1OK|?prC@l2!FP(2yx4tzn;@mQa~__sNO)hiPn=m%R9~+W#$x+GphN{WmO-YZ z*HLsg2{gpP?!waB%bs|1A}zb_E#wEi5ML0!-tlXY+RBZn01o|*Mp4)H^8#M$?Hjthz9@6Di82>rSz4cKyn!X`H<56Aba~cW(A_u<$83 zV11%AlREC24^@%AND%q`z^MjwXMvN<;7VSEI6u9dnVh__7rO?lP-M?!sx7 zi%%t{NuuuP!OsZH0CAnk$Qhn5zviSq<~~Q_7g?z{7-Sw8OM(3^`rV&J*IE{J@?%Wd z5AIg76Tlq-WO>k=gen*#!*}zofX|ZJ4S(wc+O8Y`Z9o3DpPp`6m6*9`6~O9G*V`^& zNrW08Rqt{3mltrSTf@2H{OR8~xjs=3w@hw)Z>|ZvO2Gz|uTgl+p$%u(C}O6yvus+s zk{B6cW}3O0mO6GTiZ+_i{ZqLELqm2H9QWA0)@<`yjr8{Zt}TGGY@RH={*toHwxzg7 zr?ES<@VZ%sZhjsH$=`B1r(X`KNq3nnp}%I~M&sM95MX63OR{5h{=1i0PQJJL=hLG2 z?N7*Qb-#2dHPeK9b8b>knQE)c=-jW98%sz=V*&CcHpSm#96sF-Wb%No%~~30I}3N} zD#<lW%?SEU| ztr1gVFCF}en|r3=Bphq7n>WLT{M52EU;hQ_hGet*B0d8={k zJWPO?Rz-_Ylf=kXLF{WcXjbTRyPF~Os*pg}_!`A{=X-$Z3{Ep>qS986QBCai>oiPC zmYQSh-%Eps{iSF*4LK&lho&YU?8mGl#^`w1&OdV7^?ZEIjH8J@Q5UpTUyGvBdoHSo z8MSP4&AuFV&x#q?wkv=0{7d=#p}VUhvET-$^#etVoU)jsBaBf!9^yb^0;j!2kP)cn zWq}+MdiM>j#=>t@KOZS*#|!$e{@Lep32)pcoc2pWs-4f;6)49$%>7%H8Zx2 zH_zxqG)UlglST@YN)&1W4j-yd*0R?`;lE1p#3;rWim#EV8g3FzkV;QLoFjQvxA4jf z#r5J6+jrbAYSOups$ZJOrW>v1;%`*V8mPexsH^*O#o|sBrpkjO;0?Xs*L(_PP`?rJn~a>kJP1;jdqLoXz)k($v3#XG?6La!2P<#tg&+ zFv5I?%lyWS8)x;aH0lgdN8CzNy(9AI+f@arO&5M(M&jYE8i}9w<>}UfI2rN(UvfIoJf|~=*g*M*3 z&aUp^pfq1IQz3VDk0r?JSjrvnInc2JHq?sfr`A8upJ*jYp0@_H#mGhdq(D&b%V5-h zZZSffUWcFT;z5Ui1SFp*j&&e>* zD)XA(caYN@8PUeHj!rk48GMS#e}|Ae4t++UrPnLTW|O2U?wnKLP{}#WiV1ELI)fZN z-25Qvy~_@e8PC0pNdj%HmwKi6l$$39G6jq30Sr)XgF7_ z&K&y+HNiT?Z4GvlOC~}EB|J+wIF<5s|1f3=X>p}NCFZR)oPVQiX_-fvbamHE&ux5CT-r&|MNi>d*Jm`3%%JfeHmQK8*A==P`vHh3y8c@EDlk% zPVM_O!e^&b0u!k=iFv>jq7|IHOly)$xO1Z2Jb0DUpbw#+Mt%7N!39J>?tZjc$h-z+A>M5s2lztkx6!&PD8D*mxR5|^ddYDNs+~z7zpnOiG7aofgZ6%p z@$1TR<$^g;?bSc}TEvUSJgr=EcJs#m45kp*{V-duZ^IlgI-KtH;)CbNX_B11F-WOC zs#`X9<|9+pnqK0*k1)r%DTwb?lv{?F%HB=MqK2V-V!w6njzBB2^Hc;c$YPuxpQWU0 z7EdY&<=Eet*iJ---QI|>Us<)<5o}aQsJcdqfW2&~Tqc}ORSj)T{&@3Ti2tV9Z}@R) zUeMeCy!3iew*f$;v>_Hj4dtFNq_Amue~@ZVe9ZG%ZRf|+i1~xjg-uv^@Xdvo! zv-iBj9VJDRd>_T^l;r|MA$aQvv~Dhg`#XXI#)z>VeoqHwLs_eCYD_$G;7Vk~hxEoI zK`y(3GwODj>xRf{J01p3tUQ?2j~IzM_^J&Q>tiIoucH$DgMnuEJ;JJ?2KKkkY1k(3 zHvJC0Cqll$=dy%VUFzjcIx)A>U#8tZ<_dds-MQAiu^K@PS4DiB%V$79!q`FHd(5c} z-~_cv4pl>BSzKF8l%`CROb$u}zP{F&xzDa`>D6`gAJqh1g~CdL}dwxfZ>yrSL0C!aCCu&7f9Ko)~mQd`FnTkTKEXgfm;5R!+K>; z-uc&|;NQRbO275Y;R5A;%~{w$Wt~Nt$ySzR(_+h4;++GL)7jjBm8BT9rcfyGPx-O= zZ~8C}GbNAXnV*<4EuR%dX8o+@w@Tj^3;CBtY~wSy2X~rhi%`YIdFEVA>}Nq9XMw$A z=ATB$os&d(k0IsVb5wfAq@vb%|HzyO0+=dSuLg+ZStXLThP?~A>$^#}Ubnuy$I1uv zsdlCy`1G|UM%{o=cKNf>hd#L{=*QA9La8o-AIM9=Dso@l6>gxvdDJO1(R?%L6hbw| z3p<0%k^CM$bW$MI-8?cdF_Lc9o7RwWDOqE!L-F~p zJ%Vg+l7?>z4Na;1Y|+rCprS*2tg)2K`~`vP%w$VR?kN1BaT(eE54ATH^XfpbQ3{spvF^P*Ny z`vbki)nAHwxXIthefBiZ>2<9_yL`Xdz}=gebd^n8T1t$J7IUR%Z~6}+*E2FZT5o1{+?dT6Prgdp%{^iI2)dJ6r#N}6 zya%h9jC=w|*e#=m*l%P|uCSO@9?lp@tX`EIJzs+hq(ctu=QCLXpplRBi>$6rxv;Jg z(%O+3TxKcz8dqnwm+8*#w1BNosp0mzn?0rs(jmj&bQX##i&~zZlpTFfBjxP!lw}v3 zOM_G5;MgO#6@Q!|6wOC<5O-k)njHxHS0d4L-RBUsbf`fZq*3(xrn`{$Nd8vz={-82 z1V$=$ow`lI@MYC?;>(-3ZuBWn)&eE_;3e2nXx7VaJB&8aJieJus*7CUwjTxYj~D$Y zbVE>`{SNgyqf;z1((=aHj&LHSy}0ho_?yfhI>1xfFin_>vAix1O0D%x;_=~eh+=RJ z8~5M&7skgf?xRa{4VIC$>T-D_*uOmHyCn9rt*QET*QNG1>a)3JA$0iEu+4VcsHRai zqt4b54qR_E+I-h0kLLXXp%YT4hbIRnk!JiDalpF zv{ZxxFd=&2Gc!?qoD3nKj-;jJr{mlf`gCoMB-GuE6o<~!<6h4Ht!vxEH1tO>s3i%# zN|GfsvbZo*Sv{B*lwV?}<}6FSo?m=@tqtK)2;g3}KW=!&I{Wtg%(A}TX*bNgM@;}w z`QnhoibwMp5&}|p;Z(Kft7~&+oxzyo-;9(iQgi7XX0;#PaE#2!c#|=y z<$jCttrv3`?_JH2ug-sDHgna-Wm;UQZDE4toq{Pcr6O>lFyrNjx@%^~YjSqAt%sh} zf!gzX=7(oF9zvxGZ$aD?f z!-C%=gQ&!{Nxat`mm(ZdfPNX+!xS{d6ZAKp6;(g&>6F;pw$7xVxQ-WnKDMsx_p|ev zgXPOV;&4-G8OLPEXJ#&B`u=Q6bLCS9sbm2?Mg|KcxXRivM{xH+YkZXEa+tZ)n-h(G z3Y3}ENm6Qf)&q$!=3Q4;0R>AyP2?k75{p_Cn;k~zXO2J#`;*WoSk3=Y4p#%VU}7eA zYVK3U@L`Vi#vd^S$DFOyNXtGZtWNI1tqD(=sgXySvLx$-&t9(LdR-Wo5?pJ)d((go z_cs86WeM_>MYq(t(bSm{=25P?B;u1?1*+KLW%#m41FWj3?79P94K-_tY?|6NSz#a4 zZ0-)9`N@{TzqZqel{*!0fhA^6)9%;z^4T+A{AyGFBM!Ki^?2fXOihP(uc)XzL^rtL3X4*L8$-hLk*g;slS;+Mq-(p_htW5r3?rWW62(}}-cHH*0F8aWTqSz#e?&WPrPQPQb(`=sAD zrIqE|bPQ4xf^I@*)ipV%vK!S@q8+pzq9Z@WU|;NUscD5To+n^Ppzcop25mxLh(}GKivYiuA`hb}H}AyjEM3(q z&WZvgu#t!O>tS;KF4Jjqb0Vb~52E?%(qb*ZvGl@zcz_~<#+8O^>|jojN=07=$NSp~YQt;?FJUKzMVw#@ zohny5?|6h@o1y$vC;Gr>ZzN2sV%sfv<$=2PsZ@W;^SS7?+ynaz03T=4zdpt1Y^$gT zUQh7)|LRRk`cJ0t#H+rB&mkq}Y?}eqqyHXzMV6Nxxf**Vo#SfQ{~_`#x=;H*rTqta z`nRfac;cb*(PD4(vR7?qGxtzGR8TFwaI(NTu-;Vu zC;%$Ga}czRHT)mP{$D2G@CnS=c|XS2*>Z9 za!w|#TA-DW@l0_6ZVd;?_MnK~+emAJL~>B6|8$%f@q-c@GNVj6_73QiI=}u8Fx=Bt zu*VYA=3e=Q0YxgkI`uJ)_!8cM@-B5|-Hr2^uqxuWlhxZCfR251r!@C+{sk zjFjT%AY}EhU3~QD)M36goc-`smD6(e_Wv{h|7i+JE3HaBmu^oeOqaacZ)*BN+-L{v zw;S4P6{T-C1oVs~1%RUPF!z$6KPm{Uib{eEr{~qtr$U6_-MQ_rtbj}?plw(3>g*E& zh}BZRA^!6W!SkQ7QvhqQ_XJ?+ClH-ClE0cf-YcR$qiZegvYuI6@hXR!`F?&Qf106b zyg=0*@n=AWudLI<6K;Xc^_wNH#GQLq)j|dz=NQRXIem?{{g%+$7xQrN{Tcs6Aja5E zzwX{knga!EJ%cdT`3sN4;IRu@uh)ncuDkldzquiOf1YO92|YLU+Y}095#ITkDD=tr z;F$%Ba2j=Giv{PVfy+{&QL(6#ipvJV_0A_MUT8P&6w;xn6K(v z$i#@|FR7phN(XG~7LBjmNN^!>!KGy5R2jXReqBxT)N ziQFw$^J#2(C@(z^K|s}wE02l54$|T{c9nY9_A&ZJN26Zmn`{PJ+#{>CD3WzK)9MGa zyHf+vZsWE_@5J(16uo3{I-}{~4;KcvYvs~bYW`10@$Y?NDfF|nn79GFsza4Sh1$}$ zHa8%L|N8w8B5{9fQ#)!Qtakfh``PT0LlE8!)D(l>8QFa@dD7cbSS6!8T3n$Tinau^J}qgxfo>GW2MLx_prj znOy|_&~kQrLp|9r-8H}LZZqW2Fw(PMX&v}V9ZQem-NR)?RTNpd;42De+byBgP(qcD zf7IA&3Vw$WOjUFr@Xz2TfckM{<-4%Pp5dz??R|y$y);(zTAjFnj8+ga6?DSn)9%wl zSA+?<=3M{6GRA4>jOn~2PLI0hZIW322u|=tX~EIW%N(n<**YVwg_ag-%LgG{G75Tv z^7DQ7->bo61$^09T_P~fecU*5Ru1cGSPj?)uq>n=fBxX07>F;fU(tc!n{GHXkiM56 zJ~=3E57`xC-%L^;;1m2+v7_dQplKL2Fg=ZJ9;9?SanG3K?|b(h4x;YaOL~H^=i=lQ zajYt(#+0t+h@{o*_(qzT88xOqcCWF&>sm%_kdkq~Qo4e;z`UcMwp+_$VJ_O)Q^*~V zt>PItX=TOwBV^Vb*r*W+n+TVY?oDwW<2YUL=N0krTlq=}aAk8Cru;ch-mRdc{$-FK zTz{%vEfoGzy_Q%X_+1&B(435V(*^37$dcPk@*3yVI$plVJ*-PPPia57nEx`!k9I{b zO+u^v&Zg$Ux8Cggp!hK1|Nk0okJ|5?zW6VVPG5Xw?)!h!D6~rAXm2X&C|GfLPQ=3XnCPu+*$8c=&2x;N-n~X%3q{tfG$mbn&G_@+AF=wwPXL2i3u! zyyBgmOW;}k=2b)kscPY9c#tCQjHO@a!DWaDKJnw~`g4;C>~GTulLi_Le%y8_9$D#V zQ{@@ZJJ8AJM1~;T$^&7Z?gEkJ+1*k<>hlv_b$doCT7i8dcJpW zt<$e(v)Qt?JEoMVtU4GG&82-d=?V97qe<5w6Q);gTkW;N*`OEGwkC*xNy(x9^e-?u z$qDyaw+5RV;T{ev_Rnb9*}*5nHanf{OZ+XY20voH?d+%;4{o8V0FQ#G+FRsT<~b6c zDjD^MyckaR^|?Yd_^&xEtE$55y8lhQBIOIMs`iEd$LHTY;>l~dzJ+&c?i15|3;&Bn zm{mu~=nC6}d?5Yv@8SRIv*a3*xe~B;@Bha8Vle)H3s~1}Qv8>ID{XK({UPDU`Rhox z4 zPiybAK#XR#ps(eA)%>7=3cPnFjQ&OgLaM5%SDM^U@DVjvmXs>{maUd!YAZTe#%$gF z=nKteCJTAD>Eq14QHr^MMTN&_=49B2D*Alzppnn)VWicLB-8^|k(rb9Qc90Dnb**( zFr~btPW)xQl9g_l*AN@bN76@^zpWxsukFw?+k93b?Cv7lRfro4x|LM0E2%E1m28$5 z>GY*PABzm16kf{_wJEw2@@D1^3LgGP{X8S3(lIyG%Dt;=3A_$B6pRdrug!E{D#5TS zU4uqAK8|T-x8I}bfxg@f{d2$MA%`uD%qNSvMOS(bX7wewUq3enZp!@M5!?Tc-TvJw zm7n-gqXYr2R==FdsQ9Ji<^A&gjDd}sgH+{LR&u@%no3HkKnAb%Yds*(Zz=a{qUG=j zH>5uH4?Jas2TIW--mY7D{>2QK`uGZ9hMJ0qhY8Z!xwWmt3O{&~GZtBE92~PWB~Vqb z1dGH22tOa6XLA$ekaA-d7*@DMW=^BeSIgwn&exrx!sb z(lhFx5dro0BZ7j5KKzq?{~d|>AA)VAGK?MLL^iL^^5Vu7?(kf?*3Kz~bQGgeHN|U8 zCk1a>o5(wQ-z93_E7bC=3KYJ2PDAo7mAu>i@~cm)_i&~OfZ!StQ1YR2j}*7ahL+~b z7dqLw)+3jy#nI8U)hT0BP+DvF|6M#_#tKp^*gOwok;@s&QHVd_Dput_Yd6HVtChNW zh3FJ=V%v9){ugE60oK&AwXGszLqt@RE>)#T?*RoVQY>_&_ufM_cO^YJ`ndVezT8MU(6BBRq&0(^@zWf`owPm7B+L7l2tQwz&nN*bb`jYq6Luih- zy)%5xX#;t%Th2soDTOa4KPZA6$itE*8*>Sdx>sN7uHPA`qrFtlAAMkMdQ`f_RRi7D zV^X|T)s5UbV2i45@P1GcriJm$3pHbT-Xo>|M7__5`?E<~?_>Bx&5w^UY{A4g^x^tz zj`l&qam{Z2FXr{=%3T%bW#?sQy0K0t)9!-$#|I6LqkzT(DSH470ENbrC%`81H;PR>WLY)mnx5?{4{3f+^ zwf;LIu~C}uIFph|jwF7dt5!pTmnV&kq1nOr-1$}-nNF2xX+bqjev&^9vX!qD^?Vg= zX=Mu6=jl`41X0*{bn3-9eMBRkw28cTvXTs|65=j;3p+2aYRY(Dd81t8d0_NbzCdGU z7Z2C{t~VExvwgMZ=M;gt3#x;VdN4V6|A=EG5hy4R#50$DP17dPUGKXXF14w&MDHQO z?Gu>svtlpfyh)y~{u(b?g>dj4=RvVMZDQV`EAM_ketP#mJ?qa23qh-ZdK5_`xPfOs z;V032vt?1Dzt8#8k8=vBlM+-`qmoS`T`0Z=+e{zA9=>RM=2VT#;N2yk*y$X7tS5dSb-Lv+MG@(TGCA~*pZ5LAMtAH2LgicReODDVZR~#u zA-qJ(jf_0->2yv&TV?g6D(l`rklHv)Ny3W29{MkDLi!-l963x(JECHnk3lk_*rJBU zH=0639XDY?T9Vac4D;XZuf!Q>)YD|zUEGzpM9n_`Vk5;YT1;&IP1!oHXHVBfP_J&uFIi^@B-_awd$nb3#e9 z-yzk$_2nh3-@Z#O`q7fN4|R26;ejs?b4iuM;&tScNYfw;;jXxT8hQ_{><+J|POqDk zuaHsNaQw=-Vki`%LlV8DSR}F4`{tlZede9Ypyq8@b}d&2@KK3k^_^cIJdB~>p_!qX z*SZOd^?#N+>4hTS{5z4snM;J@ccinrF{r11tFn{!utbqi^2^5mV Kb?9&#hV$Mt zG^x{6+ThKVq7Qo&_w9`jRf+(0qA{J4?Rs27)uI(=+TQGDtKcaMg%ugL{W0qC=9ql( zeZG&omKO5otAlPzm?7SF@0`Q8RJe5>=S-vRqsTliSuk!oH^1BX>JWdWKKDZiDScRo zD*3^4^+p;)gU&wt#gJb2oO^OPUm8B!CIDN*YPe9LF<2dP@0^`N5Ia&Dsk<|84A^$oyBmk*+AM`Hq$$Mc3M ztG|71ZWVkKb9p@7OeN5+{CX*>xDqbU)5a$hUa5Bs`$CfGxm8KFav{{o-$mTDFf9=G z@UeD1VC(go1=F_bvqv<#Bfi^pjgJ^7GV8Y-#rO0qOzvskfoa&2raCp5S5+Isex@}R z@jgf-40vlhukKXH^PcxJb_b$}U6ewZ&tn;qC!8(_3QfRyW$5+pkRNTDM5F6STJ9di z8SWG`0P5W;WH3Al#2YRRR0?}T DB-{Am7Srk82IckO@W%$itg= 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%0DBaqNbWLt_`>)in;t*6L%14 z`v)t8Br9YoNn&#_Xh$u(TsvqXS*uhEv@TS(6MGbX>?_ze#WCKT^_pKmH6PS@6B@YU ztyzpy5ly#InDMX7nv=w`Xq5!aeR)*5e;@Jzii*9cu=#2G)y@)mZ&?8_-@6&mQ^laRg<{Wlot)oT^z*Eg zFk6RA6y$qkvu*joc!MS@8N9qW9U?S*Y&4~)#)gd!`w&lN+Qvwy#LEBu$>qh%F`$Q}0h* z1l|?tcnQgAjt*g z!cTEceGa%#Su>_j2aj{1n=SA6M_hGP0B17Tb=!$MZWWA05rJ)#8`p3)K6CIqNrd(7 zUif|f`DG7&_<4H3Rx6`fINKIyZU>mKIXzFmM(53%(n^@DE80FE$(o^#^Db5lH@0cW ze}51-6-C_@Xh#$V!IJNb3&{v76~ z2mhNd(J9es->_B^@+8=c=OR;*E8-nOygO5mCHG)FB8RG(K=%Gjt)@?^z-Zf1lZ~h7wbVUCcGCje$5hHD$ONEZ!u)JFwg5DA6 zZ>q0AFVJXGi}UugaN_>Z#tsTM6Pq-js&&z=B#y^4zh_Hj+WD z!Ex|6#{S%dcw1%J)|qjHcu|NAAJQu7Ju>i@4VvLH36!wg9Y2?KE7cx%0bJk2)3iG6>;N`#CK^7ztJR1hI0hc!d_t#oauV$eCy}5Ydx5JfSV#A1H2`DzVBnFa@Vs;+` zgOU|IO`4F#Rr)fq?x+Vu;iC7`;VVbw*aH<_n=Nb_=Q&?RPYg}pwM96Da)}BVk2Wqj zoxS3_UDsq?S{Vo_)M(;TxJtb@Y?}fYXv_7N*;vgc=CTEvj|6`i;buO= zat>VTXpIzy(H*P0usu&`w6Q3=MFr0e%kMdSo|0U#wQroHNAnae75LxkA0H+Dd#mxY ziCp4Bmli6&h_HYG%D2Z+pTQxk7SO73+u>?FeNSP&x;`-CI0;mLh47lX+eE-y=UOeG zX8HOFyPis9nmBG703|rA!@L(!ZhOVZBdoYp4nLaI;h=U_yc1+N++y=1ijjhxj+a`; z@dzvk4)mK-TPp|8MZC?Z>RCtn`GEMVoo#DtGRWUQn~9uGcwD~}Hu&r&O3ceEW+~|H z;uzem(v`QQJ0ZXbrw*%%6p=fVk{(Jt1yp-{aRIKBs`%_sWsw@vXC9fUqtQJhe@_;k zR3eUr%?`Tw_k|(L#uQUVM$z^bP0B-^H%)Ulyd(jh)bNrM=7M$O&UgWcag*C)pWSn4h}JXD%D;@hYjJxc;s7LXA5CujlApmzwrf+a#T(L%M8B*2|9 zmEnJn=4C)Y?=C~t!7?Kn58!N(foo3~W2M~eBUw$J2tW7eFD8Mr6&o4+RR#G?JRFu= z=~J!(afQjOsQRB+*BX|MXQ8k_4=}lMIia=c9LU-i z<=10y8d(W$+06OfQ4g$CCqU4WtgJ)S5$7JVycolUPou2`!EF3CBg*Gv-k^If!ZORX z-`zyEj7i2BVn(>7U1wXa6kE2)8%LI!Rvw{R##C4JT$OX=`NG0tq*FaXcez9)A@B7W zEeR%k|GfCI&e^D{WA@`*cFZ@0?BWiHB2)-wvCGT4pFqzgO3b~fy>vpbD5pF zN*gooTP#gGZPtMR2bZF1EdWco$Y4Y=CC~=5^Vi6$1IyLmER5X)JEBTw6WrNh*$L%5 zbF+_o)Bo1MAdQnO z5+PHKuLn0HNqLsx*5V7{kLg{p{yDN43MAHrorD_=6UuJ&3ksEW0{;Ya z1bao0Cc7t5vI}8m0uyp5U%~`3oFIP~WlbfE8XgVkSEsl~7U@DZs@m3~PI?*nc-Q}~ zRRIw_7q9BnM&mcJj#iycrFM^Z-npB?Q@6#t{*5N>oa;L>o&+NMbl5%;6MSwYOBkEdgc}T( zgI=@+p3iVA!c8jt;FqP5wh>vWOa#}LyjSW6cg5a+{)pR0A#3y_K`qsGrPx)BcHb5o zQa@oT_e7#v7-)`xDPgmZ0IIO2XJsbMV0Us;o#Lcp=1qHL2#KFi#er2){vEF{*-Nq1 z;m1!!qVDxggKB1v!I9GoniEBw%yb~8AL8+<}@HRP%;_QB~B=_&fl&U5RkaY z&`EPX;_@VJVLr=K=7aPJ)6^BsjHUE@mHMgF09X-{YNEVI9@(g~;Gx9U9ep_27yDoDcNbj<}P;V;G$ z=g;b1PrY|L((=?_D_#};@&DV3�&WUah0y{r{KaFpMueyzD9;UUr+9Df>QJw)APY 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, param_hold_time, (*(*modulation)[param_hold_time][0])[0]); - _dcy = block.normalized_to_raw_fast(module_env, param_decay_time, (*(*modulation)[param_decay_time][0])[0]); - _dly = block.normalized_to_raw_fast(module_env, param_delay_time, (*(*modulation)[param_delay_time][0])[0]); - _att = block.normalized_to_raw_fast(module_env, param_attack_time, (*(*modulation)[param_attack_time][0])[0]); - _rls = block.normalized_to_raw_fast(module_env, param_release_time, (*(*modulation)[param_release_time][0])[0]); + _stn = (*(*modulation)[param_sustain][0])[block.start_frame]; + _hld = block.normalized_to_raw_fast(module_env, param_hold_time, (*(*modulation)[param_hold_time][0])[block.start_frame]); + _dcy = block.normalized_to_raw_fast(module_env, param_decay_time, (*(*modulation)[param_decay_time][0])[block.start_frame]); + _dly = block.normalized_to_raw_fast(module_env, param_delay_time, (*(*modulation)[param_delay_time][0])[block.start_frame]); + _att = block.normalized_to_raw_fast(module_env, param_attack_time, (*(*modulation)[param_attack_time][0])[block.start_frame]); + _rls = block.normalized_to_raw_fast(module_env, param_release_time, (*(*modulation)[param_release_time][0])[block.start_frame]); if constexpr (Sync) { @@ -815,9 +815,9 @@ void env_engine::process_mono_type_sync_trigger_mode(plugin_block& block, cv_cv_ { // These are also not really continuous (we only pick them up at voice start) // but we fake it this way so they can participate in modulation. - float ds = (*(*modulation)[param_decay_slope][0])[0]; - float as = (*(*modulation)[param_attack_slope][0])[0]; - float rs = (*(*modulation)[param_release_slope][0])[0]; + float ds = (*(*modulation)[param_decay_slope][0])[block.start_frame]; + float as = (*(*modulation)[param_attack_slope][0])[block.start_frame]; + float rs = (*(*modulation)[param_release_slope][0])[block.start_frame]; if constexpr(Mode == mode_exp_uni || Mode == mode_exp_bi) { From 8f4171dd53661da08abff31c2adc7cc3cfb3577a Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 22 Oct 2024 19:10:02 +0200 Subject: [PATCH 49/61] update vno --- macos/Info.plist | 4 ++-- scripts/build_linux.sh | 8 ++++---- scripts/build_mac.sh | 8 ++++---- scripts/build_windows.bat | 8 ++++---- site/index.html | 24 +++++++++++----------- src/firefly_synth/firefly_synth/plugin.hpp | 2 +- studiorack/plugins.json | 6 +++--- 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/macos/Info.plist b/macos/Info.plist index 78210e69d..a4d343e0f 100644 --- a/macos/Info.plist +++ b/macos/Info.plist @@ -20,9 +20,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 1.9.5 + 1.9.6 CFBundleVersion - 1.9.5 + 1.9.6 NSHumanReadableCopyright NSHighResolutionCapable diff --git a/scripts/build_linux.sh b/scripts/build_linux.sh index cf65dcae2..92aaa8060 100644 --- a/scripts/build_linux.sh +++ b/scripts/build_linux.sh @@ -10,9 +10,9 @@ make cd ../../../dist/"$1"/linux ./plugin_base.ref_gen firefly_synth_1.vst3/Contents/x86_64-linux/firefly_synth_1.so ../../../param_reference.html -zip -r firefly_synth_1.9.5_linux_vst3_fx.zip firefly_synth_fx_1.vst3 -zip -r firefly_synth_1.9.5_linux_vst3_instrument.zip firefly_synth_1.vst3 -zip -r firefly_synth_1.9.5_linux_clap_fx.zip firefly_synth_fx_1.clap -zip -r firefly_synth_1.9.5_linux_clap_instrument.zip firefly_synth_1.clap +zip -r firefly_synth_1.9.6_linux_vst3_fx.zip firefly_synth_fx_1.vst3 +zip -r firefly_synth_1.9.6_linux_vst3_instrument.zip firefly_synth_1.vst3 +zip -r firefly_synth_1.9.6_linux_clap_fx.zip firefly_synth_fx_1.clap +zip -r firefly_synth_1.9.6_linux_clap_instrument.zip firefly_synth_1.clap cd ../../../scripts diff --git a/scripts/build_mac.sh b/scripts/build_mac.sh index a27775456..083762ef6 100755 --- a/scripts/build_mac.sh +++ b/scripts/build_mac.sh @@ -11,9 +11,9 @@ make cd ../../../dist/"$1"/mac ./plugin_base.ref_gen firefly_synth_1.vst3/Contents/MacOS/firefly_synth_1 ../../../param_reference.html -zip -r firefly_synth_1.9.5_mac_vst3_fx.zip firefly_synth_fx_1.vst3 -zip -r firefly_synth_1.9.5_mac_vst3_instrument.zip firefly_synth_1.vst3 -zip -r firefly_synth_1.9.5_mac_clap_fx.zip firefly_synth_fx_1.clap -zip -r firefly_synth_1.9.5_mac_clap_instrument.zip firefly_synth_1.clap +zip -r firefly_synth_1.9.6_mac_vst3_fx.zip firefly_synth_fx_1.vst3 +zip -r firefly_synth_1.9.6_mac_vst3_instrument.zip firefly_synth_1.vst3 +zip -r firefly_synth_1.9.6_mac_clap_fx.zip firefly_synth_fx_1.clap +zip -r firefly_synth_1.9.6_mac_clap_instrument.zip firefly_synth_1.clap cd ../../../scripts diff --git a/scripts/build_windows.bat b/scripts/build_windows.bat index 0d319ddde..8482eafb2 100644 --- a/scripts/build_windows.bat +++ b/scripts/build_windows.bat @@ -13,10 +13,10 @@ cd ..\..\dist\"%1"\win plugin_base.ref_gen.exe firefly_synth_1.vst3\Contents\x86_64-win\firefly_synth_1.vst3 ..\..\..\param_reference.html if %errorlevel% neq 0 exit /b !errorlevel! -7z a -tzip firefly_synth_1.9.5_windows_vst3_fx.zip firefly_synth_fx_1.vst3\* -7z a -tzip firefly_synth_1.9.5_windows_vst3_instrument.zip firefly_synth_1.vst3\* -7z a -tzip firefly_synth_1.9.5_windows_clap_fx.zip firefly_synth_fx_1.clap\* -7z a -tzip firefly_synth_1.9.5_windows_clap_instrument.zip firefly_synth_1.clap\* +7z a -tzip firefly_synth_1.9.6_windows_vst3_fx.zip firefly_synth_fx_1.vst3\* +7z a -tzip firefly_synth_1.9.6_windows_vst3_instrument.zip firefly_synth_1.vst3\* +7z a -tzip firefly_synth_1.9.6_windows_clap_fx.zip firefly_synth_fx_1.clap\* +7z a -tzip firefly_synth_1.9.6_windows_clap_instrument.zip firefly_synth_1.clap\* if %errorlevel% neq 0 exit /b !errorlevel! cd ..\..\..\..\scripts \ No newline at end of file diff --git a/site/index.html b/site/index.html index 20b6d0b1b..eb76d8cfd 100644 --- a/site/index.html +++ b/site/index.html @@ -72,27 +72,27 @@

Support

VST3 -
Windows / -Linux / -Mac |  +Windows / +Linux / +Mac |  -Windows / -Linux / -Mac +Windows / +Linux / +Mac CLAP -Windows / -Linux / -Mac |  +Windows / +Linux / +Mac |  -Windows / -Linux / -Mac +Windows / +Linux / +Mac diff --git a/src/firefly_synth/firefly_synth/plugin.hpp b/src/firefly_synth/firefly_synth/plugin.hpp index f6e84193f..2eed06289 100644 --- a/src/firefly_synth/firefly_synth/plugin.hpp +++ b/src/firefly_synth/firefly_synth/plugin.hpp @@ -13,7 +13,7 @@ #define FF_SYNTH_VERSION_MAJOR 1 #define FF_SYNTH_VERSION_MINOR 9 -#define FF_SYNTH_VERSION_PATCH 5 +#define FF_SYNTH_VERSION_PATCH 6 #define FF_SYNTH_REVERSE_URI "io.github.sjoerdvankreel.firefly_synth" #define FF_SYNTH_VERSION_TEXT PB_VERSION_TEXT(FF_SYNTH_VERSION_MAJOR, FF_SYNTH_VERSION_MINOR, FF_SYNTH_VERSION_PATCH) diff --git a/studiorack/plugins.json b/studiorack/plugins.json index 6289908de..c9151c6fd 100644 --- a/studiorack/plugins.json +++ b/studiorack/plugins.json @@ -17,13 +17,13 @@ "name": "studiorack.jpg" }, "linux": { - "name": "firefly_synth_1.9.5_linux_vst3_instrument.zip" + "name": "firefly_synth_1.9.6_linux_vst3_instrument.zip" }, "mac": { - "name": "firefly_synth_1.9.5_mac_vst3_instrument.zip" + "name": "firefly_synth_1.9.6_mac_vst3_instrument.zip" }, "win": { - "name": "firefly_synth_1.9.5_windows_vst3_instrument.zip" + "name": "firefly_synth_1.9.6_windows_vst3_instrument.zip" } } } From 7b55991228c3b84aebfd607164faa4cfa498801b Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 22 Oct 2024 19:29:38 +0200 Subject: [PATCH 50/61] demo --- demos/demo/demo_track_psytrance.xrns | Bin 144339 -> 144397 bytes param_reference.html | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/demo/demo_track_psytrance.xrns b/demos/demo/demo_track_psytrance.xrns index d234ad6832f78d3a934d27bae7f96e449d8c0fc3..44e2fe3265fc3d746a41a9a9c65fb7cd618c4d68 100644 GIT binary patch delta 115209 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

dZQqwHIx*{JGzTVq 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 K5VH~zD}LE{$2ly}*` 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

qqjr>k(28;IUgDI3rroL;2ZDPC8L z{lMA`Y{KO|{-%RX-gYNSDpeJ)hU=cAyIYZ^Gi%)MvP0S0b94MbZEKS?p;YzSHt3y< zuT|&a-rI+Zn;T8^3A|1Ud9%BFeLEixx1X&F45c!`BaxoSCSKAsP8}e>MxaHUbn3nd zeXBs>26Jj^QuaRV#$?k<@IdI`OT-cUPSViN0bV7!l{!<^zf_W=N{s}LsK8Op{oQ&h zjiaW)m=je3>X2M|E+NEV(|ogaR_FDOQJJb~b2jVJ!<6!hdaY7MtmFosW({rwgbaZ+ z#z<41$_muGCS4$fQq*5qQ_*dIqqo9jR{`==%2c{$G_kNiQYZz|_;Ag&ahw6hwTEwW zkb9Tl)c4JeTY~IMJvwsSSb+zs7tr3MI0?;6xO|rq{9JxN0_iAT6X+uUPS?c&w)>~V za=?4kbyg4eel6z|XsR+w`X0*gwvN>+%|0IjNkt`bVi(ZvRAOnFP2Obcpvagn>}@y_ zF`@pu#XXk=4De0D&1{&x!N9$gvCor28+iSf^NUAa6O^Y?=B<5w%ZH1K1Csi|^C*W- z!Z`>01WD_NmKB&F^_WSpvza(Kr#z!wT>SfXmj;v2$zsXn3p0iz*utz7ux&+BTG zc|i~i=)T-!{4vAnYk>h;T6~qk$b9i9Sk=2a<7%c}gez0=D9gQ=+ z(TQ%P9!=coq>&D0+k8#uE9;}rM@}iiOjT+sy2N>&Javm)Qy$bUO0g}fb3r6OEx8Lc zo6aB1E4S{UlRDJ#Q|1t_-1op?*r6bmU=H!%dnBqQ9;7 z$aJox2-HxQ+4>1Eplr8%u3ayZTmy=4;M23%r*3P?nsH|&$(p%p${V`IdzvQUWvj$Y zSBv4IKBFo(TPO1*1dUjWYWQnzyx#awW!})^tVVje#?m{4Z+MVYy;H@SSUkfzq`w(b z*UmFDacvSu_#VEw$KbwQ-3j-2Xc#$X0{qCF)lsL-(E;cdolKi? zb!jW!eACJ$HDoufu!|=h_}mK#300d@o9YP3d0pR1q}q}@9ck@dO?)-Z+zDX~HfO{Ll}frvUpczoDq?5 z3jyMt4Z~6(bZ!qxwsE`zV4gWI;mjqIUeh2{$cG-D8s#u?tCM38=*0}D>vr!h)P{|= zQ3iTK-D5)(R8Y3S{()(^QJdYjSzc)(SU+GKJk~2Tg5V$56vI?aUQ@&o)X+>ZwncgCy&K^YG#U6-(wjHtzv+BXj-HsgSQD#kX3u zsHLY&V1JA51jt%CDh$S`TO}g;L+)zEqo4Ev2KCq z6S~7tJ!(OrzoV)iE_~ADEtrvHO6pOZmb!s7UHP~zAI-S!aXza3#LW1_N-BnZ^H`gv z(@@1sSFLVsxC9WL)mPl0@QQEn8mX&sTmH%CWuIwq#-CX$+1p%{I?bi{IFLcI{?6<- zF-}q~+ZZz?BUEe55Owf}uYuGMWA&|0?-l`?*UiS~L_rjP>nE~l%Jlg)`%BTY*JNXk z9;JcZT?*cA&J{o%e*6Wxo0H|2;TG$}zoIq$QcrF%tWO8%g-TsRz2>=h|7zIegyRgX z;3M*z3Z|SyTrMFn&iK;mjeW^B`!nQcHl0rxSfitNoB@h6Lsi4&DhbVy8-sU@<4U@h zwA@P$sCkeBSrBb{%QOhR{=B8^3gI`NF3~ParT)d8YNbClk#y;&E+5K!$7h&SakaadnQ$4RF z*ld(b{JnvEyX*A+pngpMwe0rn%%~d9*^nojWE1&ut{lg&$Kc}f{N$9u+uiC$wO6D> zF79TgXwL-AhMHl0zc~Ahig7mJxOZZemBj*Kyg<>FU6Xo1KnhYR1>NElufr zXx_S;>r&@eHXhTy%#y{49W!s6o~Y)gzM8I@r2lo@Py$&V3()isc7ay=%kNiyQ?qfY zQ>gfC92UeHhC&vR+6D~d3A*}J)hG$AP}B4nNy414)!lM?s{~KE?njQsy-gfFF7ic< zWx%te_$*gt_PV-um&A|;g&6-^n}1uz)P*`ls>83T&uFAq$l6vL+4H2n02c@~6_5Fa zyot0ZP-jGWODB&rPd6ztW7LArr#aN|Ud$Qa%&V1&+0d1XnfTTNck+jFba;+Jr@rjz zvesn@an>$|E^4s*?)WbqBO665Y3wk;3V;LL0_8w+<84OfK?Z?NNt8+-Ff=^Nnl><; zPW;nGPic}bM@^`8wIx$X&xJ*1{<=x_8Y+J~;EB^`I**;8gm>Dta3K4N`h%6;-rBw| z+RuavGKfdmlHa!FoKm~qEnX*yO4xK(E!ljr=h}FNaJL6%kqCXe^zmgV5!@ng3vi8H z8iDpSM|FQPNmvB#gjnd}w1XQo85v!X*W#&Utpa(6`2zoY@?N^?@JuWpR^oOv)|-gzD>*r&;^UCB2DFSO{}%lFWh=V$dDV)$#> z_iiy?XSuHE+(&n04Popdg3>wuZDbRilC7TiaSxx8A$izo7_m7>CCnrK-s%f%Kix19@&Ju51v!)@X=O%R@O z*D=Slm3=I_N^ni+6_mRn8TPvPp=g`TovC7a6eu71fJ9f>>Ieft1$PrOYUd313ve)%9)jq4OPW7t;5ot5Zs& zNNj{>z_dok<3-d9;?*7OPa=CPoyZQO6WMVOxny>Nl4i3_2cU0QBZrfHoU|jlo$;=r zR2v>h;t~d~_09Xfx(1SsAXmjdR2H&~9aR+%0WXO>-EdZj8PoN)eZW&{v$OF&pqKsv zh-Hp?f1WVi#>_=~7tuz%i~M^>8RyJd%U0kgll=zEeJ3%Ls+|O;QGos138d*&m4>G+ zWx_}iGOMg@qcHuK?$Yju6%px3b|XwHd*td(_m(~b1vj)Q+uP#O=GTUU61%d|rs6Pu zP{(Np;yF1aPP<7-Hw;!CIS^~t;W3Qe96QXTC`6{YHOl!{y|Rvd40hw8^3T4+&g zF7=oVGYjf2QCpO@+wUNMh)}2MK)nGk?8(m%Plr2Z`8&(tn`RqJk;nIr?cF8zriO{J z1j?OTDl(vjy>{TT1I#JUCeL)oYNdpJ(oTUz=N{B{%IhQd#Fu*FC5o2;vHmM+cRh;7 zJg;N0Ehe_{YBNzcFhj%B=e2IudLvEFxN>3@%^Fggc}RLj{v5F+nP6xNqaNl-uL0sP zNzh8#hwB0|^wl%OXxwIQGxkrLSIg-1sv(R@$aGK!SND$jV0KO#V=@M*t|6zcDY&`KHAlZLkNJXms2oG#7(}QWD=F{#scctEJ#V`0HN32@BXE25q5Ugb73# zmS48$O|`FCGgAQRTkv!tqcP&;sl@EIZ<#zvN$Pk*YfkRwYYznAJ>JfztOi@-(3b$! zGTZN+N}j`@rW^E4_Q{r|{^`-j;lGIN8xKN1Rug1i6Z968feiw8u3DsK5FN?>t}In% zbl>>#lA-*$;{1o&({Yn#r84(w!#7gFtmWY8k)*ZNr$b$Zj%0JYCHlM7qig8zJwtpI zpb1wZzQiG%+8*9uNpYJK^xad^s$LQERDEQJytt&{lVvfSg_bS&}5|iaX7_PT5WfTj0TIZwV z=B^_xjk>TScCDLcf6n+Ustw@u0(72bk$9>9r2pdpAwu7rj9GXK_r zAr@BHJNt^~)f7-utt88a%Tj2O2FXVi>*w-1`Kf!iSB|+%a|Oqkey zInteWnrIm^_X^7h^@*r@F}~6;dEPZp)ma@0I9ZewY|mCo3NqL{2z}TBd!m1Pu#wl>ITSROeOQ!<`BIb`|HqKm}3gFTqNYh5D-mtOYMRKL67vjLTrP}PT387pRhZlLnmZ71XDj5l&kU*d9xLcByV;OVA~GUW1%!+S(b-0JBcNe9alQ_t!a z$!nkOvn}m6$rR$}JWpEAF>r0aEaCV8p(B;wv)Sz$q&D|@D~dM9#qR$|00z861atY? zPWtUTB@9fzuPz9bHFMzq4Ad2I_-sR2dG-;?#ogw7knvrZ0O=MlbsQRXm)VONu zhYZteH*-mA-PW9&Wf7t1F?wIC;kF|!Y4#E#<7zju-&gaf+M$b1V~4ic9>$BV)q@31 zrTH`N6GrP}$C-IXH&y{@p!5GC>^^{+*c!Ou%k`?)f?N~?rKt!A2#6F3C5Q+}m)=2o z2}KCSKw#}CRY0T@k=~_*PEe6vLQM!QN(&GmLTDkBZ_)ca&z*O^citIh=VWvCq%FJ2 z*>iq>NsN48+=>5(#tyY9&)oj6#$IbNjUPXiTQyV4WT+R5Rr0>CgfWN6S+qCTzA|=u*AzCRcZBVF_?ODv2wstOWbF&;;Ru8 z{y|f4v@DZx%gp7Vq2%3HZ-!JlM%R&>#TNgu*u|UF{EHIlGxQEgm?dR5$0GyE=i; zq5rbj!+h$iMWXC(%qBg9gBJTJ{%3<_o8a>8PHzm*o%=X|bFhYSTT7(H+Nz4Tdr;p& zPT#iuL=va_cyjT9WgPI%_uU{f`SgRJ8soOIj?s5HQ;D}&e|)|GS;iN>ZHPIFZ95J* z%}uMZyD;nrTI?Zm%Z?4DdYoqX`|sF8Er|jt0}9<2hmP+>xvQGet;(5TWUaKOPki(T z%{y9vSu&rTHm0E@PkU&xmAs?W>|9%Dn^mLQ?JS|f1w$ZnQpW5@qJY%e zQ<)^|p-iukzbtm6Gzo!*%Jd;lg{|Ryrl?1^t(_q-QE9-Aty1AI~IGVM(a@nfK@- z5mKlSi5zR!=yMhLiky>Rg3GZ7t*7$`KM7kF#pk#-YY!cr>P^aAaJ`CK{qez?(3gDVCzXhYIn8usLJ<5GKW&3WLy3JWdSQP& zOw(=Ob(w>u;!t7-jfRbhGb-1AOYFCz?|EZ&-t0$xJl-3Q*w|T4Fh`e+Me_?M^SZ@Oc&{lyzo zi<39%`2e`j@r_!**{#XKsQW4Rskkx>KYeVbFczx~ryOxscMezGSSyHKN;x%9w5i-q zw6ihr5TU+sC2~Vlq%&*?JC>)HCwfpFQEPF_Q@ds6F3&-Ty;#hRr()aGIS;2K#Y*kC zAWkyXYJr-g(4DeKysgAmK39K=49e~-+{*>X;kEj9)C#5CN#=}+wZvZ;Ya{(A-`9yD z#%P>>kh<^T&l}W{6ct0SI zlWY?|(YP`Let|lj3@>_#9@MnC4lOn1vw&J8hfD`s>3W#>moG{$3|b`7Us$YA1Hqr^ zrA3sGPFgpjv2+>X-F*e3l``&F5g4h_$L^rK#=8U4gg)#G7hb;jibu_a=0PHxFrNi6+5@cazI!uei4) zZ=B*IQY)h?5<{_%nlz?9=*!0S>1-@QGYmRww#iOfI-xfCrmYoHf%M`}~C3 z@d}}-X_G9p;G*m29`mPp>j_trL3#7Ji-`(0cEz0zz=gPFITUM`ixt?d_6nbVp{x&7 z*oz8{Xy+wWkp?j+vi4Nnp~9}BpPyWj?yGun*~ZejyY*_1;ZMUz=Dk_jo1`mDQ*!<0 zqi^GXnzGq+Wfh?BHSBOxMA~k&F1)79=o1p%yBOB3IdGTwZJteCZ$=uFI1hJe;6pz-A^T7nloQbi$T9H zoEbL@#b(FZu)yZb+L6?rvbMP14}<$G6GPv@Z>_ka2C>C(X<(pD3Pjk^CzFFUrQL74T3DX5;Ai|CZ5%zkM_Fo7)j9Yn)QP9|* z1*Z36N!_MvRcY+;)#zs(t^?Z_ZH=^#;!MkWJT1v>$vA4&_j6F9wvwa%u2hXuq&S~q!Dtu6}wvXx!~isoJ8Jp z(YNc|Q&FsXL6bA}H|69OdO3#wC~P;mVGmU<<8rKEXiGHjhOA^^FGz}o-jy(E=o6=Z z>w(3cVHz!=d$oQo4ENhyKQubfhPu!o7r;u)y^y)lj zik5q`PLxC(ND(%!&yK|I26qKs+nD%D^(Xht0 z^J4Vg^!3iP97H~oGjH`^j)%jnY!S2S^bki3kLx1*4t%a;K;97)*j>LsPcJV6puk?U z|9PS+$vY15<7$+ainrDmq+ei|lox)`s2l2*o zueCUj;d!g4$kqx@Rq3_tRTh$-at|7s;4ag81$c=p%f|*Gl3zx`7G$C!YQnh1ApFwB zk}Jj8W~StzN7^5uas3omoEh*4X&kvJ<#iXMXd;7lndB);vU=s?^O22Bd+xqG$yMx7 zU|)Z9Z0sy<^DPV`*ZSE10U2pnadaFM*v~@{@cn_3kyoI=-fS>qlU-!du)d8s!7Z>x zBhBy>a#0x~6AW|uQZvUAi&le|WfT|UNeuY+Q>t)_f<$VtuXh@7I+mXL2a)#K{9MjE zn6`b6Yg*D>M1gPP(ebBL&s#F)#7p%IEm>o#uxDnIQaZ$;Kj|r>?;l~lF(xs!jn+Lw zPhDS`RPZ5L^V&O$ncyoJmO+ADiZOX8IN6{`I(wwz8c%FntUV`bm0PWhVL9mh&JDt- zImK&0Ue`|w*+v5zIy!3HeV8uWz?A*73$T7hYxj5`*oJhmY+Ai?gHcvOvEX=^P$*1f|G6708`+ChT7>4asIpWIr7 z&eEK`sZ@%EzkNmptyOle*#NfbjFRsiTi7Y7+kZuQ59qNH(TmAg5en`i&77O?)(Me2 z{GzqUCPq=}q4rTLSYeX+SULj8bicva<{OI*f1ff366}w28F2-O(y7%vkYL9I#A6?U ziE_dyyh*3j*Jo&D{uo#5quA86(Wx7!GEWlP_?M5P6z4AaapgL8GhAVcm9lgQ#_Fks zk4pe5ig{A54RhF{G{&jLpF06Lb4Lvj=nfV@w7V3k{=T5~6+pRYksTD+ zZ|PbM?>?-RGD5j$EY5dIm0Vfc1&7)6*8nBMLRFT7B3!Vqc#;)uDQ z*N8{~a)Swkhe!ppS7OvSqd171x$Y~fcX#G|qTOgQB1O`Mu~;Gsjc6oj!L338yP?)) zN6>ybSaKkHbM;%tc#Ri%sB7^)@ zx%@B%uQ$^&MuO%5;zN5?p8I`(T)Ljzq`VeFUs^=|y|q8_@GLfLhugsuYo6fk4)g4& zG=Wu6gU@Ei=l^AfPu*mcb4j=GsqFPCRRlXMTx&gV?K?4Auc3DvgMY~Mp563L&ByA; zqHcYc(Lu;&HDX-pS9^~Fh^{EyW<`g%gQo!OA>N$$acO7++15~pXaStjMeLz7g}xBb zU#FemX->w@O4Tq8ToRs%+FZ42#5$voZ|C5ymF!fWMbFd*W%3zF0nSejhl#h+P?Z8p zTKWD+Ri$_cDlJ0_=M0$NEKS~E9xxA&-fR?FkSbMfDsW;R{7G%yQh-Y2X@&(QDmHJa z4Q~~jVUEg<69oaSvZpC;52W7=F|1syosbTIlq3(;d}4W?i(X->Rt}}_2ogbmy(7VT z?CQI^Q!n}C4*m59V`pzEtC4MnJxWpXW94jt%7D4rwO zNE^moF;_qOaw!{~9^AXtv0V_6?boaf5Z>ne_SbLaK3Z7Tl8)O*R99I}-gE=~^`&LF zUA9*;$(a~oW_6T}rK>mvb?C3>e_rF}ra5fEKz|+XrhoDDWLNxm%jOpk)?HC@Lk$kr zo1Z$(Y~1^n5ch<4if)s=yOW)QJRZ(!AK&2eS3x0NFA=}`x@zkqKd}Rx?Z!Ax#@nw0 zD!#aR@0Y9Z6~yiqIAoUZS7Cr8@^^Q&TI24GKXG0n+HH?pr-Rs*yN)hvDxs-l8r1ZMzNUWk6{d$<6%Dvv@Grmc_k}aw^-2p5IoIYIASQXoYnp;p}#RGi# zBK>9(Z%Uu+Ob|V`7m&oi*CTkM3-yAN*H_8)r$+hnpe{; zMsu3VJWh1E2D;g6&Lv|ZZ36F#Xf{^OmW;L|RqlfP-vcN40gzv(bo%P{b8TY5YyZFa z^&<5tK4gy)KhA*gJ^k;t8KuE- zdyh$1fmu1mZ`TSahy40(P#E5IDN7e)@!>3?N^FQZc`)5vGmOJ@kavdqXF>bczF$1m z45)hu*j$G_TD;C$Datb^2h?v4h0=#*?J0M*3j5h(D6^Ii$e|}O;Q|Z!X*}j?9y5X5 zWLs(@;3IRNBl=A;jv;wf(7&`qukKA&V(4;5)JEmIhbwF-sZSX{=m84Du-)EOpBkBi zKh&y}L@Lh`G*BD&7kBIaItIHh0pM7sf$NU@jUP-O3|ta{6)&NnJlN7!JZX>OWh3PD zZ0b*3^W@JocPXA+-0)0&=-$X+~ zm(t`}qtiM@F1+_!YTY4Nwhid}n^_#>n|m?2bj#zBSo7% zs0BRQ%Ipi$JeNvVL4qBE*pm&lJJ#Z_-KHq)hIifGS3Qc+6Xhr_?qm@zvEMjDe9q6` zt-hc?&NXbluTm@Jpe9MAPe6u%$1UU(B5dvK8x6!sc!mol9ly0Glu(hbKzrw=O-Fg9 z&LrmPw-h0YdxQ5f7wA=0MdZSfUVOk2MwQ}Xwf#34rmty&Lo3!oE;b+btavW3B&E7{ zw4JJ0==vd~=z5E1sMK_D;OE2=!R~W_SImK4X_=u$dHA%cc(uMujFT|X->|&>kWI0> zqlHd=>bjeLZ2EdmMvMf(+9ICf*8fbZH!D}8A_qFsFX1h8Vc^1>fSXNZrx0$Ys1gCa zd45i!)Wxwf9p^9NOvO?e*`q|5$QIPJyy+l+AVVp5>4)i2iZDO>BMIH`S;q3JvvFv69x@)S-{c?;t?MyQ+dr9S9#DM z60`2Y*jgvVk*|g`H9s4|@D_Q>xL% zMT}JcQNASR0bt3NY|fTMQAvV}CXAY`r7?1OqT)Mp5LPqdBuIibQ9%jrQz+!7thBGC zM=FF_k<2MckneWlpLFz!+RW>F@Xw)DDxBl=s`-s&XlY2!| zwsOTmNH9m{$nEcgi7l<7DeG1)-3{udRD*lvwxX;pz%+|o_tv-!CbZ@q2U!N5vUFC) z$xBo;CBnW#z`GZpwCK}df>lp45yY>CsaTTCZ-vE|-?}e|^GJ7=v+NOVt4ChcC=p0a zTQ51=>$TNdCTRItO4DM|1xTo!kyAUW>3w-a<@4sZQ*(EqK8m>8L`UdhZ)7<2`Yzl* z@Br7*S0zP63en;+x;Hh%UgVM*TTGhSi z@GCUOlN68cD=V%Ysl3Sv!;61!F&3%cv^BUO`g*txPZ%MScc zvbzTj$f=MCN!VBfJk zU)BkPuF~QdvCZbVouB?qt7!&B*Vu>6Pu`x99xOO4X4-)MtK*B9KWWzUk)NBkTxp}PM}oLasFY)znG zC*mmT*mt;Byls>*c;mW*e727qkng$tSzmE?uV>jqi{;8M~<{0)x%7U zKfL8UY4LMSL!0F(H1$~Vv1n33$sDYiblX22b&6x`t1nA&*^u@oe3+xH&h%b4aLEw@ zPo|yKY?|9~Dx%E_@oi(AIQmlw$-U=ELg34L;r;d3t3CMX?dBT1QXB?=5iMJ+>CJHB z#`yH+_|KQ}Wj!Z!Oe6&bdaOM$@{voPZnAS~MLUA6FD* z^Vp;1{js<%oKJ0|Lt)zDBkpLw(laDTi(4u4)HY{9(Z<%cR+M*np?Mdp=58SNuHr!j zJqgSA+SO4A6K>C({mf$}Vq>j7N2t)eI>VR4Kb)V18gLm%y%WiRfN6yId_?x|}dtR)>(41qiG$CBR3;ZlH zWOvOEoY2}?8UK78v?RPl6gyeK8Tk?9LYTp~jbMiENDfChac%D}q@wWh#e9xX{uGnt zG$6C2WtDFS9DXZ7T*ws`+3pS&it`Mv4s9bzu-TPrb_B@2iV<~e(-5(?wF!;hJiq2c z3|`sc0Dswqhje0xFPpaIOLB@eq<@$STJPW+4maA)v{Q(gd;M=8Mf5_zV=d^sCOV)zb6M zLv0Uuo=5+#b6B~K@o>wbw(pt$+48Wx5Y^x_|Cjdu|C-y>9Bx|y{Jn0hR8y(6pYa$^ z^ z+ryZz@W(4A$dX~p{!+r`9%Q<-$`3eBf>m84zM<^a5((z%W;2*co^Il1AHa=r$@#yg=i8VYI-wc0Gw=t!mxc40J zE~%tr4ejj-<1MwfEH6tU&wn)%IvxF}Y9Xli*)@!ayLiKf15gKO8LDmzajC$xk^0e`tp%}| z_ikfT6)|4GWz}zpI(ndAd=?}_nm?ud;37Np{111n{eEMUZj(5LxcH~}=b~!?Yh8$Q zMtMW7isGlMW`mqatAYkgonSb_0kc5|@4VP=n zZ;L$sDO397pM(1EPXz@}*Qsxab9&!e*@Tm1IrnQkSHIr2qj$AJ>? z7x2Ub2J4tWW;T5dE}l*7lT8_AV)}ssv^Qd|~e^46>FD>b~blaBe8;H(JzITJ&;t&!?eAK4ZM;q|`b1DRW zo%sh9ZBrkmpT+)wq~2%Tc#&wph zreI=PCQHh|n9dm@8$;t3R;}+z?lNv0n%vu zC`NiF$cS&`HpYuMf({|dgn+({LJB1$4BD-{?D8^46R}>>xEgxWUC+~_>Myk-gz&j2 zMY~2SuYq}(;`nSUIW9iFtTT}{E6LCOx#l;PB`i|@`9!F z`6Q93KjZf?=rZk>u=-M~eB26Fy=#jRtsOm< zej-LG2sTB-<}q3W&I;i4uH@JW+)ny?yGY6KX~RxHiWu_+lj~O^;nVyYo4OD|>3{T8 zDD-aEIIL{)7z#ZuBnWwR>I|)8qw$&wM(5>1a#}T71tXO-o@a+KYWee077>kq88~Xp zGq*U3pP5c^llmli!tni)YSKdD-D2(c6yM++G{r!EmOQXtY07maAfoQnR9}-Br#Tv0 z%2g?Df=4eyF4ejMJ$lQZypSY}-Y%nCl-a)UoKkwpdHMr6^RE<`n9b=j7CXUj`XlF= z6Ntwc*b|-{V~|Z)KE`nBu*7}tE9R-`sozyzXaB8ft9vg2b&P@Izco$(x>4DO=RoL1r)uOo&4eDUURln&z2kNP<*^j8P zajbb~NlE1cqjDWbV4#?CWUJNZoyfi9eDnqXhZQ#mvX@NrRl+?yVICeq(^ton_N~gc zw@OGS+IBKXJS)>`t--%#oP)K*+X?tcFt*3M`vBOS^r-c47`p(TJ@kTivgHCPjpr_3 z(c~ItRr>qnCCl!6j;GY$$a`~N(^on7!GR}S`Xn+KdlKkm>xdPpzausR%lr8C++Tn2 zdQoM4_-QZga$lZNO%jacrTy@A(QS#EQO!Rk*nS+u@pVV#4(gZ2_)Q8gpu#6`H7edd z3LuWZ^&7|6ZN&KK_i-}1XGyzCMlEYB85Uy=A6jwd#Hfy61eK)_46DN-j$ir<$NvO$ zgF1e@lfhG=4yU+5(~fVq36_^KbRWV$hwN7OD$F$kWH_<(1$i`2U?8uW%dy(B`5mZ@>#Yi-nZ1RCkBwzQQF>jodf`;fKgM5Dk}^AVuyL{dw1bHshzlj2xTAO=v}b8n?(H0(ZwTppzb9#zBp2<0a<3}L zYj-+d^~fSlmpqc~>ZQo*v_T$;&XQ{^Xq295l44_p=+4N;Q16MJ-HS*SurqE)TqV6p z74S(13v8jk3tvO-^`8HyUhnx@nRN-D^w(xz{<9YNwK+uhaP=o1@Wy{D|8CU%>`3(g znr*p4dK04BdtO}l*W>|vnN9oD|kAeICL-`~5?p!$lK~ld~&?s9sc6bv;dz#jJI^$!$p|F@v=E4(r zdEHfoue8MYpZA^br(wYft;n=CEW+tGoqtWs!m5Mo$C8AO!CR!|8&G$S66BY&ilED; zOdkgR{FD3h#(Ccy>+a#%*6KQ^VepBocK(vueqpNnMm`>oxQ_>3#enC`r6!s9W~D$; z>BXU-j8h_@W1XYpGhU|aabbqOlUeka7H%xD0USvCy!w(_&ZB*sAzd2^KC;s6N4_1% zNPbM|l=&FKmG^r3Vw{MTa3p)Ev`w3|#pVJrPVc>YiO|>kAvIw*+q6Pa{+Z`&@z!si z{Pa*0J^9X8j#UuAzP2s$%46J{*(8?@XGzwsb&VM8S>0s>o=&%M6)ODG)%Tcwe^-0ujC$0)3pzZO89Y#;UeIdYMwF}9aik) z>FiT0-eR~I|96i0;~{K(2DA^sY?`kzS?F+TPH#B)lhI28;lA;vp|2K{yoR~N%C{bI zug~%aM8G{qIi)3dHV2zh7=O}`rLB{%9#pd2B{OOZ>UQ4knDtrq@GC9mZNcXP&+zW~ z@Wfqd;IkEu&+@*(F9&p4e#&dZzIKmsXHj_G+E>ABn;-if0pGwG)DrUD1j&1*M$w48 zr#T@S5)1v~g%PinL3n=-g!k#Si;uCNrQ^*9Mq@QJ+?plJgG;?`&7EP(?nGGqmiI}A z@;(fd_o-$>@3%y=2`}bC$_6>Z&&f)9vb&j+l6Ur8JX7T-oeMtlH7Qmxx1pCl|D`;A zO~K9N18DF2f%bl%jG{q~Vabr>W`1S&(-OmP*}nUW{|)kEAtSPZZwkcZ*x!F`(Wb_;^`qd^MwCZ#-aM!?KKTqYM~u zf%L_%CN*cLF6CkV=1+MY6DK#@t?GQ*HdCcd)vd6?56s6LcR!wQkpBKnDgEO>?V4&5 z!Bw1))&GthLd(~DQE*DvAjK#gCR1IP<1*`?qmQxMw>RE4Z;yp`Q`UhLBIcy z?=SQ`CRdM1LETaE`N|sWqRv2%&DSZ=og5&yBgFq)MERhBi+ zZLPabwEAk#h-wslaflp8oQb~0kt^=W-<>5jMDkEe?j~Ar1}54@`Y0fLx}KY=v*3{b_4A>);y^jWhj;>8^FJ z5F>h16xyr=ikLxdX`LyNl-$z7T=$bYk1al(n{VS$d1g86=WLw9?fT>gin_?CHrEml ziZ5!C(2qs)yjab%aTJ?|B)!ctAyVL zNR!|Has2llVt<_2uLv}@Aj*dyJOevA6*tpDq0_W4=o5jPw$@8jG@VspG>ZC>`9SeA z$bg0`r7{LTfo^jI_vuG1Y^}%0Yw@IUJESk2mCywx&ga2Amod-iuSB2#FH6wh9Dt2n z+a(O{%H-B*g2yLHKUiZEuJMqV3BDD?i4(;N0TQbbH;1;OwwRCSEP7P>%FWrhV&?LQ zU`*0rSQ zG}Qs#`W6GnaEMZ#@Y*u`-K?!ucyrK%c|>7}8v91ky|mYWSLKNYWBi-zW8vDRqhRdT z+6-!#Sa5#x=uXMlr1_cUDmL>5Mb6+Y@}|`o9KT%5JUmx%$`>~!-bnZ+8~gN}=uJ*o zNucH6+u#iC5YgK4MyN-_44yx;(Zy}9b@ zxrbd_R_JP=)jWmf;RW1JL$~3yEf%@tSV!zGU38WfG7n9r*7eeO1*%s&i$gF|aXr|Mplua<<@h$5N3`7z^FEZMxRzWK5LxAa5q%Hh3Juz9(|O%jwQ7%n7W znHf$p*;@R%$L`+i(hN#pKtc>N14}~41Oqd0*x>f1!}c-CzuWt7bBBfMS?`HZJa;AS zN8Juc*$(93zPcscroIS)x-6SST8quGDt*c93-XuLkZ|<&^bdZoM zZfdB&m~-cWcZ8?CEQE`VA_Q)WxE^_{4WSgdo!jzXYGnbU2#*WntCy}GH>&d1g|te{ z!@Y2e6@Pe0o;N<5E!5rmT4qinYOpA8yJ2XEk0Yh+sL{8h1|20)5iZ`7c~KqJkVz|g zJQ(#*kF!egz}{Z&J)NxYXpmoEcC*tdJ9{H5TgZdRn`ZGE{F36z=vO(tOYW{96)V7M zvi!a|t5pG}IaRX92TTYu19xegLu6qA*Cp+Tyik(=A)}vv$ml=y^G;OV`Lm3Fo%(4a zkX3wz5*7L?qo=hD!kXQ4L0(PRN~>Kr$z22tbmKCL(Ru5gmuVX`osm0%YrR?W;;a#C zYh^1P^pXp-ZV~hKv*(k$A3JodxI^=F*@))ioBbBzM?aDw`;H#jdwdp{p@ z9$6NN7GJWrwSmFwwk9yR$q%@fHp}EGGs>>q{#2$6PyIoE?an(Lc25CP^Xx1wVM7UC zS5`gza^X6JQ4Nf`41;VtX+nXAKJTA<+mMbC+QWDhgL=6hy{e1N)sUrmBeQ5q@HZ#GZ7@aVN5|}dmd%;tiTv801fFX1mTg1C8HapsL zQ&sC&?y`!0uhA9)Cio-Y$L_M}8fBSK?Q%~qq!hGp_9FGG%+hm`U{v|b!IF$dV1TTc zP#l{)(^UhJMZ^dC*XoUQ{n|l0&U}sP$J{LK_E(~Z=j4sEJEg~rb*^7*8;xw%laA;J zxjGg$Crq=DWwQSr$PisFB?$~`7kU(KwyM7@dgp7!2gEWK)6xp2v%-*H9P@Z_O{;fE zV0fDBkk5c!$XsdMR>Qf~&rT8p@He+R9q@Aidur6yb|+`dCY&C8(!g|6qq%aN;NlsoDA_vT64!lc+9o8 zijQ6B0wjCe{IsP`w~MW*8^!keOvy%}!nQkj(VgcIi1&#zUrW zxin~7H1Y@&3dU`1WH;??6)*g=xYG1&&vf2-sqL=yAM~}GTlC>u2#Q#(hYZzJbolj6KhDl&(_TtrW^&Rb|V-e?!&qj?fQ5AocB2#YAPE#NyeA3-aKqp9i+x6tUy)*g*_{BiZk zRGWNlq3rJ?r9S6vNP`bfs)tN%{~5F$@&q}z9V8WDs6&;vIQv-lBpz`QqE2nB*3*gA zEgLCtlj&=zY;m68FYX0qpQBc-)`}*)hf*w1R7F{zbfHFug_u~#->D~bcu8YWd;mL> zJ|xOdIzjrB#f`zoUW8i%M*SBZ4Pu8?f_u^Ch&@R%EmKRA+%D!b!{&XaoELMctFhp2 zet1@4<}a}MR)A7+><-_jD5Mz4zo1WFE$7eNq;{`k#iLYgwP<$;OxIXWZ^CxU%aM#IRJVYLFLbsg zbf6Q4?6n;pz4#Qo+Jh{CW}G*!P_oqNZ4e_rpIh2{S}>QOJp1UXALN*hy zIh9&LpP*kJ?NQnWk&R6zWWCngy7B=QcMC*}w@7dIPV)iBL9nRNXRj7vpo7D*yK?`KXw^c=n0b+O&*;EHIPJSLa?9F!=)ye@rGGDW5pJhPQ+M~Zfa9t+)xwqn%eT-RvDhZ=pOgHP z_(GxNXhgY0{3&xwi%+mML^t@UhVzz(?=j;ezHiGF%Nc|fcQ~b&1jhGp?Qwjp`o2YZ z?gBZXWOs1npGW`wJm$E-nlOpQLzGYAdwv=TzUZhaaV)FQ_tcVFiVNUHJM?;%(aDDH zC_Q+F^0vGcpWIv?p{}(k5)rN1b5fo)KGL@+i@EMHDuW#rQ9dcL`>J{UY0207&K3HQ zl3M%6JY}CaLj#t!SULE#93|GCe{{`)S#yC=0Kb22t!ya40KeQ(v)lQ;hVP_up(JQ5 z_XgraDx;cCJb(3osVJUA6#%tNk zqcOan2#z*!PMLhO`;b>YRp(N1hpx#|^NATcPU^e}{%VY+n%+`-8>PT)LN{$e$kjWF z(1g&I7z(+!toCcsuKv4x?H-7n^8#*)A2)g36z!t<{we*s`M*U~)8;f2q@w)P35RKQ zgHy4z-ojvR!45H0sO8v$n4)T0;GMe5(!-T#f19}gTZ=un)rj~!-<0Knkm~om<1y(9zsRe+rQ zRn(8`uj4(9ws~EFo2+YDj=EU=otxq79{|}0$8BA&$jvlHYfs+M0IHuI;MNe^*hM<& zN9G83{lRQAjA^d9**|1*%O)mCw`1&wzYo;XIvr08I^6q1u=2axG_`R$q8HT&t>p+G z{$^7mu%DBRIvL1AD2iF@Fd@dOk;v^H@sxR+M%-{91d`&Lqo=36`#5{I0|+{x?@8bW zp*_XXd!Op$Il?;@8e!uYa(KnW&iK}Q10aq1Sm1WGW3o0q=Tn*a$w1V2+eLT zKx_V}l^(~$y{wpX`G$9m0MSqVGPsvh>^}FaI&Lza|3N52BDV zX`S|pFl=^NG<~P{M8p@H1n1QQ%+fWRuZz0a(BT%s$;PgrU_`LK50Jg(yZtDL=7WTL zU)Ysu;!cnN_M$Lq@b)>j@!s}{33|T!rMdMGalX{uh9L6VT$MiHDgPk;3q>hmf4M-e75|n%*K~&%T*Fe(jsN3S9bk&kwJ-? zoNmR(WzcU~xKs_uk7;H)6oTOnLjwFL_XR>(6hB8C(?at6$n}Mh22yU+oO4#wECJJ* zpkMEL4@+1?8tbEcwOVOSS>?ei=aUORMumh*ALQ(x)e>JB3}~#xmQiZ3HA&5hsx48I zCJT8#jU>kw3P|}bv}|XSEmUKSw6HulId#quyq2rB4lF&LlG5C3Mj&}xUj%TCxf61M zCWbAihvU~C?k5N}-e=Q!q+@7uI`+iS?d%V$pUQf))lQn^taMRl#AykPxZ#F`^}xoP zb?c4Ai;V{-gZm}uHrXKo2zcP$53k|yN#aJ+KAxxPU>X~Kn+F{^9!JrA6@U zPL9PqqGZy&cH7RE{s~ImSK03{yaUDgBmYvovu7VXY+;D|@s&+TH_`<)m@J_K4D!%u&wp+^P8;)G> z=J^+8|IXrVW7O_%;L>&H+1Ym-A)Jdtq7;sfQO zKI?aXMsNKgbr;0k|NZy<1qh5karyJQA}-qQ^?ydEGh?;kDqCH#o-DjV&%+Qw&^+NY?DTStx=i-Vr?zERG6cyEV# z-$sJC07HhQm^@`W?;k5(WVK!~kzc0uK1iY8`FzL7zW0O4hk~+q;A{9$ApRgxVjk=U z1z+f2?0Ih87xUcm+-@Aw_`h$ipE8s>e0vW!yJM6IZpe@@FTlVp{LdO?BYVOBv)x(J zi>Zmd$~=GjPX~}q@rU61$I9vvI-nrC$n94*87{3Pds3b#r}QUxf;T?{3tRTagIzXI z>W_LcUpb$M`9P*kurcJ>A8vNEIP_ecxE1>!moW)3VGL}iLPyN|n0KfB`sCuS*s=Yk zb)EYehoTwfM*~ z$#!qhqyGuQ?qFI;=?=^O3w@gBj{jw^(KE-6U;l7t=(idFo1o{Mxs$+VjaP)a>Aeg4 zelzc^rKFbqzjl##Ho|_xUw!|)+YLTn4uykPoSL8Bfr$0L_K;MKf7J(fsdw*L8~!>3 z>JR_S?)|#+olRugk+?E5HsIM~=}$*ae>$RRQFiA)di~pS;)G}4^6R+scmB9`__y=s za)#Ry8#el^n=2*gdYmV_yXC+n5sPS=Ucpka%X$r~b+Q z^4jHK=G4277KvLj)m8BtUPhFL&%42fGilrV9eUr<_vg4K;uE2*@*#hQ1&l)i`xh`j zkDM&za^hL?(Xuf8V%p6U->+<1ztTJ6jH4cR(PJ1F3{E{@PP%&eT8*O z=J6HtcPWZz+jmdCIB~GuKS>C!wBckJz#hxjhPzPssypVD0-40`-Xp~HHZQjNKjl^Y zxf=&a)BYBiz^(pO7m%@XVIvlB_WM%w*$&vW^CC`O&f0ssNzV=>C06FoZ;LE)5zjvb zhFs4Z_0=2XS*QGel-+k!6I&ZF`q$%8k9v?}1L-PFdI#w$A{~_80tzS{q=cFP4W9Fs`>pT(ao2)b$z&!odzd}5XY=ge(~Jzu ze>1c8tm~!Z<;z!2|G}cwB`-HT8T{?)^XIR58lLnNVE&BWeF53-3y6)f$IF};5S?2e z3E-6DEIO9Lal3@CV=o!_cB}UC8jUA}eq}B;c%kR7Qz7&RnF5=U`XxusZAP-PFbtBf z^u+G*Z$>_Oarx4l%U_ei;}!Ww!)(p`@d}TihGPAzxnO|t{V90aCb+;Ub4B&Uxmd^zz$dat?0+a zqK)K!9d33{jl&ncH*Q{mozQ3P^y#|Gheh~z0bZJ4{kx!-AAkj6CvHCXJZ%N*OZa<% zoBV=@%N~~Nitg{3-{?m!00gPSw+{?hCHa?F1PitQ_eL)N&MGW7dvbFBQI^#I_l9Nf z4`#C#{JUUJSckz{Wi;$B#jNK4*}Y))UkC88T>s}GxpbPffxkvrc~4l`FaG}FIr6%P zFQ98^B>V^8f9D>4CdhSo)#XmR;q<%Zh5P^S&kiq6@Qh2az=Uf9FZl|S!?T*NRb%Gk ze9It5S*LnS{TuUh;=)Xje%b364YzwP3mFqLbe4Chd8+GgLccj_+Ms6FS}w>Od3^*3 zq;KQE?d?$=wsWfj`}@0$%IB4=b_r*$jR5~vhdt5;4k{)wm->*%iCy-UNm@_To@`s& zTxWPB6x@jTg0TS{*OU*KxrXmpyuQW`9%u8elB$a^n>pCrc&@$BX@6H?e@7 zW9;W*Ntt#9&<1Ei6-xQaL;I`=1ve;JGS`|x4=~`z2Mj>cJRl-{4mCbvann0rwnYx#F~WxGdOkw zzllovO6|nN9{a5@>dzrKWN)9L^lrm*k`4gzHvTpH_L)8T87jF;{_{Z34moXM=ij#e ztj;_@Z8!E)uHBm0-dfzH?#5}a^+ZJW{<8J80Q?mJ^{wR-no(#*EZbzQw9KU9NoVIS zY*mdG0J35+|Ah3`mc4BwjWFYN2`K1;5Y*KEtU3H>Ot>i zaKRJ2_KR`)gXDIz8!H+w#+eV2pNU=u3*0&tb*ZRO^zt$GD|}2@eVKwM!CQZg#tR%@ z-Z`l+qcu@biS!8%2P@QS(~o@B>iik>*z5s4AK2=f0W&)rmnJ55#mbV1UHhggQDJ03 zO}efz87VLs*5be5$dnxnB{SEU|B>~L{Ov$Bwfj3H7ic6{#aGL5FO0G?k@Na{{zm5k zlgGGp40}w|q^JGC`M3MbkM0MZ;s-w#p#43--c)B-E4HeFwy^(`SQmMvBK9!w}z9?Z-;7t!@`p~9J||EyCQ~P?W7qqjUvu) zJr{`Cm~TS+7lXs81M}a6jCOHrRH|9bW|x6I%hk_zUh~>X0v+ImsaD{P-T6S8*g3{Gi>I`o0c08Iy27f|)WGf!rqMPFF5fh()fO=~18S99XgNXT!V?Af(6CFa z=x}F>^1MuMZ7Yv}h9O5~3tSb;V)ZNeq`t6&0z{vy;9u_p2e{Lrdr7fLu4Zc?P;HN`m&cU5J zIin!AMl^Q5ZJz~&l4H8O&cn-Q(AvzsvjAiMvVE4^{tYaAB};Uk*A6Jz$NU-K10AO{{sFpMe)$H>KFv_!D}%I)GOC8r;98X3|Vl zQ%eY^72Z$uzYgk-Xrymt)M~CbvLtn5Rp%5(Er+>bXWs(|xT7MrSg`Y8OHCk$`9t$y z!?vWc2NG#9&Sa%3Fd%H;M9qK=RzkI;18h=+9T`Z(OqW-$jwF@Fhux1~zF~vH_+1^< ze`P8DR-ALngO>!{0)v&=sF#Bt_#Xr{T|6+}?fOrb%`2<+m1@g*QjxoPnYWE;jc9sB ze;X=dUx;VST_nqG%sV~FW=x@xo4T&)s<|erhZu60bEa}Yn43P5BBivNk%Qj<>9`T4 zOPtI2Z_kahUZBbspDf^xpKF|_hmF&rs2@IZFC{~n{V=4C;vP~$!os4U%b{&j9qJH9 zq~HH^-Za8BdKPvOzHUx)U6n04Y$5y)fXMX|LqiHSwA?PI%(2GhwF%EGQ2w#S#d0#_ z!=*iNIL85b$aGVc`B?t z;#0w?2d8jJ4aLTSjRu9EFmw%T(+IWDkItpEU!FeZK!AAY=}W;#CJkXz&GU=31Ko$7 zzGe_;wz{!8E~6d@@G3PNu^Q1}f%@(gtOyI#w|Qrdm8^>vv$9-$eM#Ha9li$?`pc+q z*S-Q4LGxKGPalVS_y~jZitw{eN*F-6F7&9V2;_(A4qQ+yEu!3!UbZDFtBt&`513KKuf8>pA}%zzCQMe$KFmdkK9$b zAI8FHkChv>m*)kWh(U5mS}?1DN5^34;szpyd?q0kIj?gj)4zbnTqi=!dEbC?zY;9U zH$RO*?`1oN*iK5=yS^{bXxuz5L^R?nH?&F1hn1MLNaVq1LWLra4Y54^T%&^*OH@JM zvn>mNpo)*>A8W?CyKaS_lfm4}7x+^CT&>7+d!^s3Y(JpJk_%xT_I|CTjm^zss0kp` zkMSN|+gPiDyoa*aL{k`>`!^XqLI=8wSP%0NH6gmkLvdjQFj`vrEcoUv%;HP@0m_o3 zg>)cqfOn9a+T9VJ7zMvb?LUd`c@NXe{>FgWV&nR4Zw%;l3b0} zNOh7UXJM{)DCxnsxJ{ZBo8KRwh;c*S&=m^uFew>X-Kd97b~26oAtnP|`S3Nrp2)qy zQH!eDrO!MpPXA`$`08l4Uc=bvEVwxEJ7t#_ldhZhZTB>_}HvgP^+~9lHFICeEVkIRw!6^*mK$uvJ zHnCx=ssz>IR;6I|Yx-^{ zuvTf+0Y!(Je%~)mKLAjr4!rxQ31&#$vM~Kz%Vu()S`PS!e}k}z-b38cVa={i-qz!5 z{n*6S-Xn&wy&`I7c^kfw?^~R zc6xFVOVfAh5;~W$kBx_R#)GDZNhNV8PQNw2PN@PBOf*6V-0jG6N0VMqsBBKiHUJtmB)RZ z8?Z-H7aZ2~iG-me^z2WTLPztrV3%|6mVGeHdEU0EUt(i2(~ZR%qj5TifK5w^~ zY&LtSgWNYz=B-1!D5L^d4ND)vC8LJaPcPTcm%j&K3?wI5Lv+;){p{V%w)rcJvckr9 zRcljKi5*lc%OPswRi=?VC`)7cYX!H5s-{neO9LyUK52%NmDko5(!%B+A9h3QWRruh zu@cOn^kjo)hoH)9MQs%|hd)Rnw`_9o$cUegJWkXeAJQnq$pqCLZ)|#?ksxWHVU?9A zEdnfEbJ(`(YjA5A!#__kzB1!=sgxzQmp~fy3@3sm-F%7X5)={XsWDl|(A*i}teYv%2}3<$yEq!3|m2Orh0=}fw(@Ml5hTcoims~#F9Yrq~d z!YL;0c7JYoT1c#G&vTz`pJutMiJl4i@Bm3yRoQf*gN0=2cu$bQO|@z5yB#I3w&qQE z(z)WFOkPBMki+txE{NxC`2(S{p7Z67kOG9~;?{whBK@|ajKWs#GTkR2ggYh^*1twf z_1V(bC20+~j#hnx+*1+GPPubB@hGt47PMue8)B7W*&cwcaW+Bqinwy&acK+iG-k&+ zhtV#Vg_u5(haHQSmdb@8YTHUg=v=4dFyZ;e_N(jU&}y;tYS#jr_m7l?h%G*XUJoD* zX@gPk!fm7L5tfHfns5+)1aLcX?oP~- zeo=Ed4||Tk8E%91-^rPlV{};QGoNsysP6BV{T#M-bZo|eX}Kc_zGkb)?|7nW_FJRr?5qu!zi{h4%^v2e0Y zoJnTVj+J(#&#s;CF2ZFDKzoguapXo3W*ONoV~A}`oQZa=W^9tlLWs%aX=Br%TC=qZ z5zyqlipf6G(}&?_vl9`Kw`@));UfgqzT~mDj5X4ceRh&rMj?NI9-iKmXn0sQcpyCY zsowKJMbTAt+0nL{A$ zR-U#Gr3c;!Oz{z2qG)K`-s?ito2N@yDNAGve0DS$a?F8zdmryuIC-+S^LiVnN#( z#x_Cx@z6W`wa;c66S1he5&8Ggk|wMqjmtIt#0BcBtO8|iQ~N}n2Dx@+XCDu~0Ao;c zz7eJF58M7U^wfwSZ)x^o>l=-`9r!*~&%wsa{(&&8S|Xq&VrLpvuXu5YrpRNM%B5)P zS2%aK#1x!;qNuUSr=XT2XePDN>N!a~lh0mZPElN0Y=-6NE6WV-+x8oNf&Fsy2T|1P z1CQS*&-In&rjy0vbS9-$w+V~T_hXwoOo1PaKZTWInGegO z%Sv1vqC4E7Z0cuxCG^qKNS-l-4|ZZz#`{5T(wJlA@d3kd@P3`&fW~;D8}veKh0uXe zsvE8UsC}e^gs2w1-vOFj?={Nrc*cWmq#ejkIV0j6P5G#b?tM3oue4Roh;wbFw0NVuS*Y3HlXp)IW$OA+7~3-<+kDouZcx#$Hdn!nS1s0Te;{$~X2yB^ z45L%!`BvbK5Q`6M);>5rqm`p8uU22lF|7I5Be-EU{LF)ki2)D>h>DL zcWEFeIQ#UVUuwlzD;hq+T>9)UFRc?2FOUs?HeV3oV0EljZ16jro32c@3`w7L>Ug%Unh^)1-qU zEUm+;3a_iE1-`01wGG34J=dHQdZlONAk4b^LnIXY2I}|FJljVS%o=G0C?`&t8Iz#L zbz}E>P59u5eD^@igIw~z*6g%CM*8@f8TaL-6lC5}=6^UgXo)v6;2E7h1uhxnOyNtb z)=5XIwafF(4Hsm+c01Vh-fI}j-B^1_W`wu82}Dz!E;Y~-UJ6qlt73fRZOCbO$L@2u zBQxzH0xIW7!+Yy4=zxo#ofva=}&x$TEpk{$9VNFCPRJzl@R?YQP7Z_eJW>8 zu$4Xed1m*yN0kP8X?s6%a*ytq!w5A##=B+aZFt+$h?tz`+{v&DWw*fBLyJB0%n8J_ zo&^ne3Mw=S{Iv`%ae>Z4$*#w^h538UNn1p`eW#q_uk^KvNo<}pfke(`l8^>c6Y+|;|n&)j!+M4kv}3^^B6x2c;x$zVbHJp}I%z47C@2F;8j zRGKd<0;D@jX?p(c7z_n2oW??sNoP#|>Vd%d|3kHI!IJFPG9-EzGe-)da{K!v!P7`^q* zloow8Ju$1)6PE+nPaRnneE^cQ!ne2Ue|hh@?^)lOzs>%a9vTZbSGQN^xrk)&I$w!Q z1ZXCosqKNQIw-@2BW)lUc|?V1t*CA7Ra%j}_X>PlUdFPsCTpmdB<_$5puNRKoB{3` z53c2Y-&eN7?6TJOWvP&9EwaSj_cgZ1y#~O7aW^m<^+J~yvV4RZU2FCq^vA8yW9Xky zDSS7*V4SaX|ewbs0m_kW(?fWg%N+p7geoj{RHGe?^PP3v^^b`jM%_{TFHqjkqOJliW`1iiDuCF^%*Z77l- zdvO@NsvvVSjjz_m$@wA>ER}1Njy4b(?Yyx4YWAb6l6r)5f()$I%*hNA%gmmFzxuyS z=tk@4J*`|BF~k8|aPgNET$dYfhmsSr`mvYZ_U?_PV_05%EZ$9B$*(u2_Ked|12?-O zCJt$fLRLT%@3BTtrMVIaHq`xAePG?3i``P8=`Zw({mWAAe+1$Nqx!wKj$7QY!h;Z=*UA+qW?Et;=d&Iw8H5E1ln_w>oLn4wz#^=5{Bo z5WUBbtsnU$IAc~~hob^0@-)Ya(Sow)Q9m|Dbo9okh0Nrw0GK8s^7|A&UTt0Iz>DEn z4;z7W?B~(FQr6JHVy@T;o+wCS3*`76+d9(eOkB>Jn^`LwvaL-Kup{bQDxOj8 zF_SNj%+f3a*rxfgd3D?ELITQ@*=kV_PB*`ep%yeK8X1~2|0C&BcB6VDS(3hUKw=i{ z(VeDR;V?6mmVr9HbPQ2z%PuDQU{u3~1kGOz+uL4r?CEffj?534$IthCzhTf~)To3d zQ=*_Ko!cQ7v0I8Uvy=J=&mx0K3}c&zcoabT%P_CNX|mm&PBxjtC&@oFQbIHV)uSiRZ?OmN>wIK?QHK|M?p~q;>ONaX`x_^h{OTN0*UhjHseHa=-8L7dCl)jLAh-19H3ZOg`%iV@+{6-zt4$mE&yDXujs@Vd}FM-qc z|842hep&ij-o~dBRku48PkZjU^HbDvv{injgb#-kuS1knF{IlCj%NN_?IXM_O23Om z=}(n){>=WH(ogiZb4X;jLX91xNAy|lKcNpt@^gg9a%|;^_&$kSk|vfIETr|^#jH5Lm=uK=2qP1IOX2z{D6?tgs zM;Z`^?vR$Ojv-W*O6`1Ole_wwOQ!7zC)4IxmcIO38*GI0>E(3-&5b7N-m$b~(f0K? z>3Y%o?lS1`B2G;Q%x7sK2lwF$N&xySeF~|q)-2v!&4-}TbUxzTfW`0w6dN+wnYeKS z!$=kZC+HiXNXe@>=3~2BOSjOX(H(p#kUKkApdjFCvW=S&Vg5FxWL_ck75cGR*D7eD ztzTpy!^V+?>5si6VY!{-{o|i%iUJ4O`o+*Y?;li3i7KYS&zPsAw9cS?v; zT;q{XPXj}0348D5us;{dlHkG;B_>0s;NF_KUd>CCR{ao+hD3gl)YY8l#iHpiS(<*a zbk;9Tzwe4$UkvG@p%&4T>@LR+_YMov3K*?MOUdNH4ee4Tg&bU?l0*33hy<5ch7Z$0 zNbumM{qbF1Gv#3i`|wdq1HID|_2G-&TmnE5$b{mN?S6k7@(L!N%5*Z$Aa~kG7J}1- z9h@T7;sn>KG=|&lIkn&PzjPOG2x!ux%Ai?cW34z9NW zRrcY4!RJ$^?=zZ(gn!5MVdTqK?61Dl8i*XwiVtWYbJJyie1$aiqp--$~r=r%tnk z$(&QhDan9~n&*4|_gW{?gV&`Sq-aO4?HS}&hzQP(!wVBgGbGn9lVgjkiJLvPo;uU+f+{^ zyO^rV%^?3?r7%l4I!k}AonUk`#APJRN#zRGdUoRC6^2V^+qWQm?SNIIV_ZRL{_JF+ zOyC?5CnTw^;*l1H<>}*r=&`f#p4Oxh z8Nqph)Id`y_NDz{1c77`m4Gl?0Oc)%)AAts<%x*af@@7uEA$dn{RPFuVchu{L4AJR=Bbp#nPlk1651CbK2Xnudsrw+}mv zs$!{40?O{%K-G}k=hyD8rpk|RcbiP^?H48CLNX7$O-r_X6>*xRbg^*q8O%F{j@NW| ztZjwGwnM*Te6bskGbfDFxI12eNs}LzMzzP^@qTLMCcz;`emezgpg(~c^GQvSi@c3; zGJEwEY&0-(GoO(d5iV)>eYMi2JIdB&GN|0)==v_;ZHThOmqSwj@t;{+p9~-SLg6e@ zpNlt#CXphAg@EeVeH~Ckbt9dpup&-5Yu?-`Ro^aM#4_>}?0?!_vg9N%KQeKOrxrYr?1Nv)ceeF&&>Hj5iyauH|S- z7*<3KiZ#9JmlHQMp_mJp-dTTS0t^j)0k__{1hbI6sy;f-c)~FZDh~gm@rTvQOJ9!B zHM`oeFy>Q+uL4d4_bGf<cv!JiepHZNAD}YyNJdYHF$bj-T*bH*yhF1-ZN%{bt8HwkIRqcbS zyIYX!-?>Nab7H|zc9g+*qAfUtd~lc+0kfkO+1Ex8b3ut zzOhLCWS+lCeaDklt>6CT{;f0rjHxm_VeScJ6jZ4C(PxxJ>M#8sIb)ykxbqjO-vkz{ zxu_QvO8=Z42}{WDa#}#0C_1wEJ%XTONAtYdJ)HnS1J8W)`HfiA_<@{FaZSV)@a*$>~(b@)am3y$T)wu)qrB?z5C4lNknPk@{+#bS0JD z(o&D%!;F)yc{?p^(+<4K-P_zMuE6hRba+@l|Nml^-5g zjpr$(9L0BZO>fTUt!faax&`Gaq82OXUN!IiiTF(J!0cL1Qra7WIiB)z^@o0sPxF30 zNajrD%u?68@Q=+=&_@=a#s!0(n$x=8@j+C@?u&5IncX0_%42X{!~IiOfM=wAdnBw! zh%#=4WY18ypz3o}B-S|MlwRbk&^8*g0ELs&r0tUAGSy!<%jS=B zjk@-h(bZ&jSI>6@C~7))V8Lk-5r)e8Nv;ebogE*m3_2Bi$t_7T>!@IuSv0crfnkq| z429ez({U-mzqIn_5+3lGa~n>aO#2?jOSz^d0tb7~iy&=uNC{A1Cx7L!Jj@k=rhxEl z7=qAqedZ)eaGIw9mRs#`R=%ZUo;_FiX+=;;ke1mju}d(9;I|^;pmpN4E9e9WfXy(E z(Ulv;)5knM^G>`Z5`ElP6j-Q!QY|Z;e9cq)WZ%&+AETZQK*Q+FHRp(@9JrV0fAOc} zS<(wyK1bzMT&V7ORjYrf>XT~!Lc*`m>!2Y})tAo!FwTigrduQw~TxN(d( zVd)yNpS~!bYO7IQ{u|YA$cD7<>-QU@;!V=_RWRR#9foFxIJa@D_sIj<5i-J9v7_6# z*I%zJ1G^%eUKG#h;XIc zT@g=^L~x}e)}Ky?wC;9~H@`+-dIXm?yS{L3rz&N)s>;}J&}rGDCTR$qgHX{9W&i~m zm9)q0t$8v3%q-X`Xt*BtY_wJLE?li7Y2s}EZo z*(1%Q|MZ>jn0aoFx!{_;oVLzl^>3)je9hJjW^mWgD-A+}5+tr@KSjH`qfS=$rT>t3 zhvCkM+yAk7Fz9T{dl}x2IR*;?GAITEcXaP!J`1aUin=8}(cQ0(vBR@meR&aQmaDJM za`ms%x~9tY)7>&(?ye?A)Kbj@JI!nqHnF039!a%M_c+`IEvTEl8-yW5MMEp@~pz_(Do;oIz;Bnqsc z;*nC49mQ@f<J+J@y>BT`Ik>J<|VW?rn+btvys`ZW{f%)eRvV_+7m|Hrmm z{U-$^rIFlUg?g%oAM(wCXSUp2dF^i(OVdncfTddb4q1J@sv)b-^)X^^f20)r!|LZe zhSuK%8X0GO$8iyj&!CfvGnnJnE^1}yx}iunqp=-AiII2e-t(nzHyRoU9<4VWQ71@C zOG6?gR=#-~VTW{T2$epRcfwuuOPdQy^f7btQ*eUpGc@SE40{nS%UO^f%GlCkkTodJ zy^E3qoKl?Y1S1=o?_I!Ld?hk#>deXNWb_Bz;tUM-(N{1JD2^AJlO%8(s;9xym0Ij+ zstqTrb+lS!mc0!2#o-P=Qdg2Gjh;QG4;7qj)J=lSQ#8ua`(-^yj` z`jXeo6XHKX-wDyW#t|Z!OBi z9n)?LLAw8T_0>t&1#YW-drjJu4q>_a^t-81-zqFS{43We)xNnIV?o$ArY~I^-gvGD z_|DsjE-A3R^X$wI}Ap;2K()u)htY5d9+e~+|o=460_?^^+4@#Q1=FQ%0BIdhm zL^?B33vkXaO4q^KFb|LxDs+E)+JcO>Atm%ZMcEX}U7Z@=U-q39^=d!!H7~S2UQKVgBo)G+Au5a+Gd~;D6IT0_4Pb-!NLYT|$;S1u zLQRe(`aEy?swO0%S)*q@fGLz+iq6cVpJ^+t5fu8-mL}}$dYjdO z>^LU;8M=R+`+LPbB!V;{cY!CxAM^g8u_Povmb~uuLFLQC!X~S12r|6t!%tO@k=LqX zpv?|e9XjZo;z||FK{J7MUa!tYH(KDG6z- z=dHxyD$bQb@B@$C&T2jk)k=~`Qg{+`59E-vdS0jdFN#Ik+)eHjr_0P5_HQ&}bcma4 zGVpN88CJLb$nA)7HEzH|?a<7P(pBTAzH%*bUo7O$&?PhhIJOD0B{q9{Y$`doR!~ z#t1dp4RI`0aEHfE+7}g1!&$<MZd~==@(CnX zN?w8I;lwM3X-d$en0+4cZ>_btJQW59+aY$$b=Ex|8>AHW|&&-w8D#ot6?|F*d+A z-jj6j+j7!XO53&5iA(0{r?nd2_O3O`W0jpbS%aEUR%7mFU-M?mYU`grVMA_{aSN0PqXNq682h+cdKv8Rxnih^1#0^ZQjVZec4o}z8q-Rpve;euYCZfi;uY%vJ`AjgUZpDPkD zQhpUwfU?YFc14(eF-Q;OmvQa~R|yL`i%IOghRhMdn|rBy5ss$TZ}E^%eRhw79!GUt z8W0K9B1-zcWiT3lX^72jzIihodr?uk=zJLkC1TzQq2kX4D>GJCPl^NMXFnV_9?bBY zV{gXmUwtTgUP9_sPtO-e z*+;|CblU|;27Ps9SU?i>?k5?GIG^wC^c5oEdn?O8#qcBjvW}JvR&JPB3ieO_;i9`; zo&n)-CZX$uWCjEGdlrEx`FyoWe)d6Wqi|o>GXXY61m2O>Dr>WV{jU={tqvODd=EZq z$f2U^$OYyO*9ob&sr=RQ)vX1PJ6c!C>SN)lt3*wW3Rue|S)qp!GO0ZaMHjT2`JQ%f zsdG$i)~>IVp;fLelS!&u$jBM~>GL!z#0f#26};~i zIop*T`_*|u0bXrayFS(iKQIbkc#yl{i!iO8o^BytggZP$#PaL*I?~wS0TN?R+CWt^ zG2xfo<*;g>dSJIRTEOxl(hLCmLx$O6J~_Op}Suz zkLW>aMCs@JE^I{U)I3Zvz~!E=w@#s@*4eZNkF)2wpCkpGs9v`mbKo>(nD;$eC%)DD^LfdQL93PHn4`)Ei%3u+nAJTAN#? z-L`3{z=5bv2rHk&+ZcJ8Naj-(*bifY{pTE7u5{hfehdF<_Cs{*{O(ES7B$MNTFPoO zYD)3zI6CH`BRMud#H%~@n%V&Jm8D7b}Sr8+@QT{-$%lx^&3ReDW8fcW$LgKg6L%FimtraKLM!H6XL?f)}w*5#ani$%@rI z8bkA6eUaIxTpxY%05DbS`*dteO?D&lg$Q9H?$pu+QO$EG6dDrWxnJ5{Yi=K?VAO>mCCP%j+$V z+6v5TLMmQ68a113em~tMoUNdmz)S zmp&f`21y_TG|$*!t`NEq{fI;_DR(XE^s4hMl(u(LiLiR0eRdpL$lWu zSCZQ%D~#Vg=#GO0LC*N~5kIYDd3Q_HU?v_(f7tsmk-I(ZmF_9Q$si;8TAMTiEcDTq z3WV%xlaz6y$Oiw@2U;{q`1wBK_*hO#+dcjLkcoM@75lssPx63_Ji3o7XgSMUg8iZV z+PHh($r_9Lm$jrI3U=~A5$RH1qO&U~7PgIt(vMQzyRTrjrNH=1%ZEo4f!_8rJZyA1 z{6MmRPSl^_JcC?xxhhiK$gj7*=C?e}OA+}0vDg~tU=ovq`U6hkqOq=2zqr&#kpS3a4)sk}0eE!OlN zFcS7EyYxD_B1!&|un2rh3YIPjx5;q3&j*tdjpo2LrH*rMyx#Sll`BrN4XS z3Ct^=M(6ML(6f0z6E*`}t*i`OP760^fW{i3i5+kDrBcB08fbrCS6B zDtMyX^Mu6D%}Gw4Y`P++*!<_f&rBB`t()bn;O@@I8mMcrXYfmF?(p@&@PjCd^I zis#SZnrA&eA{oC|?a2EDtcj2Wq6H9whiuKdQ_dx7%YNl$;a(^n+y z%eDcL9ql!tJR(AkUo#xN!|XlX%Vp9Iz4|14!B}gNJKI%<(d+S?Z@<^u zZ+TRebf=D^i%k=FLZx6gH~rf&uHbx+%-a>R=@q0%H7y|az7F&T^ZIv%%fDH{gs4lC zcxB5Ce2VLY$W~Rpn5ZI(z=z9<)SCZl3kyCw+H}(gH0oXxE^>mo`lxCeav|sH#frrM zgN9<|Ys(%!qR<-6GEazuf$M_7gUy12!TPvgXWM`7o-d+y`=h+XVwdvc_?u4rM*9vN zo_4wDx1Y46Iw`6>jZN-T_x(BNX}t3oYb_0U{mx6}Lrs&H%-}=)9!)c9l(YMSrS1bQRqHiP!R{ui>ma9S z$7g!syRJ(PmB9R%#(eQBCs^opQ7V1;A~vL}fzO)K>_Ulp6E%qb3PiHP;k!7<3;QVw z4|+akc6pJqU$<$udDN00Kpb8>Wj%VG1gzOtfmhp>LpkGa75$-V7PsirSe5 z`k%`Rs(Py$#7I|L7SuF48nwHZZhAh%z3prQnp)-7eIokFKWP6>Fca9qT<$8k*?!CFY-mEy-S-^lT!VfES{FHH2E00 zru6?XtjPc2p|Ub|sdz&*t;AlKb+^qZTuMP3lccSE>qsoSSFQPOB<(HP4bnrcL`Gzt`(pMq(=*e>2a`n9O|1;yPqjp%RbLj`_}lXq`gsFUo`1yutqRCpeyt8Q;Ua{16yNBWf_%hKW)}o~`C!P`6N5a$*k~cV zEMCxt)3&MI4BF66L6oy81K|f*g?6EHS8|8IsRoTB8<4`Q^%J*35ScSvdb_>LU-@52 zEyMD~i!bw(nWt;|kax(kK;~sl=jN;v7oNKA^0_LS)2~gkV9mk!*J;oCJuv-V`F(|- zrTeTWNZBj)nJ?_B*x|0L{DD!@f!*iaaK{akF&!89EQalf$0xZOu$DG!H9>C-OQQHX zF6{oLd}4K=G|7h5=JKv(`!@l9XtLw~2Zjg!k>O9M{)cP-FZdq+JdgEe_|&%GFFyX4 zBOfprehW1i{(lnkgIua+Q@sDH#mDQQ&IkVE!oz)06cttU4POKJfZ><>KT=;nJ~m~% z5^|^o3OAQSvW9#KZZ?@-rMUNtd5A71<2AbKQT>wR^VeHUr#FF7gd3aFZc9bl!@W@% z=&KI;3+>}$|8AcA-AX~PX0K@)fx9g>u6@sXD`nxVduwWTM<;VK;I`DTY5c|=&dMo6 zi!QBmx!(~J8PlA(S5tCSh1!;r0rt-CywM1{}#ctKJ-WS7VR5^={^q3#&&!jTX5=(=x z58D`U7@?d+-C9mLBtk)n=lpcqXEiQ4SoK{tzq&T9zxt!=qioA4!Ou6Z3JAsvLpbVD z2vb}NO5Jocit4$nb9MN&{EI5A1fvMtda|6C8oxXhc5Z&_`~UzkQr2K)zvd09dguKDuMnud z^3t{6wCvNiuUtvJ8mlz}{GY9xf9^NsucEwsO`X-76mHR^hAeY(^oqsXO7^ElY|AaX zQ~OnuXhU}+{oG`e#S5a_dC4(;l3CtwaZZ_T9Ac%)TYs9pdiDMoHFrE z?@BzY(J~yTg`j^L#_A5VZI67%UOwH^V zvhNJyHKAZymL@nfptwC$9ik`@eTJ(KwthnG~@jD?J^L^ zs>lf%(}0WO|Ibq~aFY3VtMZ@YzHGBrnh`j7P`R?d&qe#p$o!}a4ls4g0V{*W$qJ7{QR%&Ua&yCumzc)-OcN& z3xBsWS$IC8YwgaNbG| zOm})zDa^PsKf;qVF3|A(#n4rn6jAAo-x z3RX~*UV`)@Akw?2NE1+c2dP3R(pz9vM37#jm#8!;AyPswDqWhi(1{Qr^cEn50C|IV z&)xmr_x;0lcV~8XHe|Cqvpb)!jaEyI0di}SS?{@PQ=!Jjq}fDQ`lDIYCWW< zL=rRllvpY{RgSg3U0fH`r5)U5)lk+HxSu9_`9;3Cv>0A%_T<=4gbVG{x@PB%}>-8XS!G z4r*s7@A~8J%PS#I8LNCZdOc&wxf6hS*%$dc;dL>UWvolWCh8!v1mZquT{ zApsHv`vL1-(~q$x%G#=X{r8j%DZcx28KrmU>3|8^^b%5XKQ$A@I+x5>i*$j&M|pew zPTR%=GE&V*75pWYNLDL#)+(Vc>l}zQvr@=1f;=>nQ6yeqyG4p=bvokr+HrJT=34|& ziqMQiMyqCBC2iSkMFCrE2o8^q&3X7p=Y3(4j+pjYX{Hnr@L$coUYE-$%O`M%fVlGz zm;(xzwJtf1izl=D2?T0iTn{3BEQcYCRT6KVBcHmUm0hr&+3h8VN7Gu}(~B?R6aER~ z-!%-9E!J4Nm!H*A&)J-^nF=&1sPxkS6%c^)0k{pP8!PN%C18_ zxL}VJEYwUfn4Ig817DUZGv$i;oU~(|6tXXu6+OmzkE(;$0G4fO@K*CkPe~bF@0x8H zbev(x-LB@aJ_D{LV?Fgb7fm){Y&+XC@>FK5#Mgl2s=FeJP8Gpx&Gk0DJ|Ij#2&QA! zP*BHY8!|L$dW-g89iXh1+?o*4jYF^hi{k5S4Sw6Wj15#vxQ>U+@5aj1sxd} z2vrjreZ6w!Hbz@v)tIS95!#B-b@m1;VG85C4MhxX^~F?=88SA;zd&@-@Ka^qzqR!< zcKti{Me?y)Cy%r=rgAjp?>L~q+Tw6}lEGcI~fah39{+=lW z`3YRPfiGJO_!c8%GCA{nYTh$#=27oE3IF>4V$6-ro z%cA-9xi^Uy@%*_j(x?+}FNqdI8g5!xyt!zRWFimi0w#Vk(5~uMP53&&u7cl?tZG*7 zA%wu9Vfj^N!HQ?}A7f`^qmr71JE}HUfhRrXxcbo@?42q+pQ!3B%BCHgdF|E~(jR zYnu@u9V2;EQa9(;U6o@ z`Xv2mkD~0{_US!1n)SurW^?wcIZ$GAaW{d7QFqG*P0J~)`}|DkSN&KNxS%6sqX&=S zl*#jXB-6R3aS!U_EivOz?m~J4kXsF-+L7+&%LU1-9I%m;#UMNq;{m8KzoWFH>ITzr z79)Gy{sV9f7_r&Ei?8mJeVTA=+N+S1aa&z4gLT57+#`0Q*R4Zlu68{mf2>fZO3aNW z3B~X2GS#CXH=kzqxoD;f5$ss@c~o9~i5wx#TZ;D9RCLHM@r0F-;rZ{UIe%RfT;Z!U zR8jMKzRD;%yW;%53XtN>s-EqC7<*oZt_$y2R?=mED>clV&eNpDUKkv1j>IiHgr6<` zv;J&mbow;v_3^2>Z_EpDa*~D4L9;LUY|?0ai-muD#PQuVYDpuilddR9dVh-ig}3wMx9#ALrg*_XxQ@c7UB)$uIrhZORrJ7zU$B)FH(<=NqSLEVv>ymSb|VBV z!q*BuJKt9fToF`P40MvM*IgKUdkf(@Hh<{zT$BE@?#5oixPxaSnxTw;dU8R0ma|-< zZr#oUuDdv1V;|KS(tyi<4c%!%44AU0D!_TNh}UKPMt^EOXH{1(T!~oHRZW6^lVGc2 z_Pf1uNsFy9aMUu}A@b>aby~mRud8@c~cP42IUdte%;&v6_F1=U-x!R|GJ7pB+~Z2W8-{ z1lucR-P3xx_%hHAJ#K#5k2qT%h|0J#9<4(WRha~bQ}#^|&>ENP`kwbOERlG1Q)boc zBwihMt2JxwQo@WnING!LhpEe!d5Nk;b#^%goGPd$h&q8#J$llA&P~hVpqDPrhN@|ojr40 zv=F>81v6sCQrSpT9N!$%Z6!zZN?>9vuSHtPytXX1Ef$#%D|=KfG<2`wV0Yn3&8g~% z?@GEe-C829j`vn4hnQm;^DmQKM+3zR5&@Oz%wYfz)Cm5q=xvr+uZ8=5$Qxg1%pPQy zCTk$tG*j%IR+(hVQmsj3cK2fS(y@_qwmQG`LCN&^7%8mi{Y0p=Y#UoM^aE7p)bgs0 z!5w$sL5u>oVZrQAb*8N*geU3QGX9Z4XtOY{km8o4tB)|~IC^WQXKG%0buoDW4`P+m z*#H_9VVrVH_g=6`M`gQn&J{V23@q>s;vY{+yOe9Ao9v^EjqLCA^5&KF9F>9*d!KG^ z;akoB0o(6hqweq=D0#AacVk(4g*uxw#MZngSk-gIRJA$P%gn&J$hI>tC_^7s;~_1S|Xnz$c23V~b5 zgB?O?Z?2c+z9QVWlcACLw#hKA*YD(IORXR4xF7MfJa8c6OV&Zs%;7lUDDY=i6Uu1x zwmx2R-A&DACZnYI&6azn`Z1F! z|DAA~z3r52gsv?|^naW6$&Jvx$@*JEZ(~zTjb|of0KPTJz^A}nGv$q{o7AP(VW0Jk zt3p7716?Mwb-s@B)2^7*3c%V@L4b%4@oj86a_xK;aCrJH05z>ZpG3KT`iu00=uo*S zg^+Z)k$Q`;O}c}w`TX4&Go0;dPT#R@Y4l9SaD7~ge@r9o$C6!1XOi*Qv`BftL)SMN zbx*AffCA0tEBNPV=d`IONkG!#JMqTO>c?TpkKz?(KZ3(s8*vv1maZ^nBUxcTiSY6# zZ%hL1P=3jkb3co+`ETPPlD+c*M%fXFz$?TJC%bEWMe-K;W=q2p^=xHY{z~e7R`N8- zF+QKvDC)V01uP1>6vHud8TBeOqY}5ddaSv+0eXiJ$JF3Q+|wN$9a5ud!C8pN|Fvqg z7^{3X^bHcn@4vgPQz!WzuJ(urGugL@)TomjWgi;SFwK=UF?WNyZM=_T;FT>O@vG1C znCB_y56JoqQ~cziyDMj&ugRRS-XLxXVU>5w;uF<)JO^nFB51PiNQ)-#JQpPam zc*6qmQw=5&^sn-}U)*jw#f~LhiDqb%aOA>34)Sz75A-Dx3NF~EfGfxy;<5xu&5S=7 z?@_eGT`_GQI68Y=gW7I3gl=rVIB8c!?9b$SO8WE8;=NFKxrOMQkO6avsK-xzlf6&x zScNtE8GE^A<XHSt6=(zx1(>l~4@_?bOH%jWX=QYfZoT4|rmQo6MQmNU zW5P6E?BBH?4f+0En7bmD_3W)!?~AvL{dWlGN&gr_0zPn!6@1CkSzVnjAK<*Qg`pkd zwLoxNpaxhb&^9;M4v>&Tg3HCJ)w*^uQwu);w%i2YxA|m*MlOj4!pb%tf(;a9++1Vx znGA>AeM;kwIWTdN$g&<)O0yZ$CYL)>IV;o8{Z602TMNq@})3RE(=9dgc% zzbB#Sh`-bS&G~z71HN-AR*M|kxDA6N>ku)Hh?&CtEB?d_TV~dT>6D@;GT&}LIzdhb zn~OBSLfrFBUCfG#XCxR%fv4^`D>;5{C(r|A&Cny&MceI+5NiuJ3HU`XbokOEAZU>? z_7EFANW8|o-ff@Su9R;%WdH`3zVpZrn|9FVZ8blte-CDj$HEF7kScLJ?ptc<#@5w9S|97>dRYXR05V%XHxt# zH})K|f6#blrYwmU$gd{kj#mR|e$VE=&ia;=P|tbun%EzXSFA>VbQBx)I~22AD$bz+(cEi5-`IuB-iH&<#X7lL)H zgbGjWq!bTUx3Vo_%lZ$xuu;C#D{%u##0Y}J`mQ5f$ITA%5%oBBzrpE_DVEShq^ma; z>a4q7U(o}oTb&nRqpeS)T>b7Mexjhr7PJ6Rf`ajxj*nxn#`WoV)@~bCHa7;xOiI-m zTWCEBU)$MP-$*0KF*WL|tdO2|x#pDlJX>vi-;J65dG)9xW{iYJnC4lKnu>y*EUitG z*vEk9-Ot)_)F>~r5usq|@vJ5$iySsTD=1QW0taNgsm|I5n2~VxYhw#pw!QUV?p5T1*Oy_G(PWdSnN$raV z`-5|f>;C(Jt8rz|St7d2gB8|zdlWVTi_lL?HCTte#<;-gPnAmUyM}8U7N?aNa5q%< zlb4hgcbpnQS!aTM>z?+zYAG}HytB(G0g9HgC_g{8e{P<<=Ykl%KWMBspZNlVW$g=X zlTJ}zEm6CW$qXzHv04p(|LN7qoFP}9TyVrQtuk4@^VwaRmpP8S-|G1-r}ds}nz!~9 z!}#b0m~F=8Dfa;1C5m_a%cOT37ZfgE^#ZW3xYE68=M0lqRzJ~yhSU!Rz_CJiN#P`Y zd=w*G_{U5dFZ9I*v@3kq+WqKp|K#y5lON2BRWG&y^?E8r9ok{_Rfcs5_B_Q;ej{En zegptJ$9-{oEUUp=Y`oucv_8v5q7>Wkw5Ppln)RQ=;jsCE#0fMVM1mn3^9$MW3F z=Cfav>|qC*l1dK>y>P z|EB`?UbRzW$XU<5zW(8u?aAwV{^25_^g;ruw;|Ufv~lgP!Y7(2HA*7Y{n{>jET0#F zc#k%Bb5p%pW;+T`GdGqcRoI#`H}sGEm?w>?-{zjx40FhJ+z_b`rwpg0Oq+78c};EQ zEh}PqX;9hdgu`$fc!dd~JkjXZ3yTaPJlE6+wo-@)}G3{-8)(Tc2;e^!Bd=I_3y{3;v(2r~KM;8N=l@Fl^1A#5>5u*O(j!W;OMg}8tOPeFlDX>rru9DG#g|rOINJAz*m7{&Ee5oG(^0|{EieOI$WoVpg z4#@exN`E6tUUZyB?XyA7?MZA@4%Pc`s>MIHr1!1 zGtd6&)hDlGMe0L-vHo%65p~i>^PA^?h%_~jdi!|D=+2u`pWmS+eHZB{@Z28{FMK&e z@6T1SL{k3c#vfk#Ab%d5=f%L%2=O@lq%stM|HK?YZ~606sIKKvcC56^@UsqU!g?sp zx!1s?xbFwQKNjh;Mqd6IdZSw8-)}sLy+3A=Y9U_pH;mGABb@-fhotf3(uK(zEW#=h2)S`&RVF&?}{=#p}AS^g}8a`sT2Z|PQ;QT zJC%+7nJ@9jP8;c1JosMIDa&4Ih?>89mp! zMtn`5Wckt)nO7vDeo4LiTs6YIx!Eo&TXQ8j?umka;)t%p85Z6he(3p>m)wYIoF z@R3rjg^p`$sWV*Z5(xxH7uVf5%t1K~ey8=OK5h*SeQ@UrPC3AXuT2@3|NLq3=?Bdv z9V7pUu#M#YIiFuE=h;sH)A;%qspTI+F`Pm#CT~k zYU*?$we#H&uA}(n2cNcDZfN`>%#iQ=8Ctl{CQSoT+a{x-ft=ay+qb@jp99HWnGokX zyq5p)0|-q=lGa<-A2Cr!Qnb?P{_U&BcZB-?2H0i9#PW82z4-J0=9@%qL%H%d z7T=Zr4_NR@``_ir(^A|WzGU|hW+w;HK_?y>B=ht5q z2`6=G-nu{{;%!11{u1)}e>3<0tLWdN{l{FAKF^i6LyAE0k4yi@MJM@({MY|i(_Xi{ zoe$J!Rn@n>%lQ|D|1;GJPe#Xjrt;g|jwk(ao#r`Sgq(=(GToy z(Y2z66m2nN=UeGKY};bQUY$3-CiQ5V;cS8IqU{CJZ;~7Bd>cc@%h%GP^KHhA*LW#z zw!OQ~OWGeP2#1FaA9E@ynM@!hnd}P?eU>HS206`Rd(y?F)*#}BEd!|{A8!BuZTNQ~ z@zw(5qz?pkKdY91Sg`i(&11J#d}WUjv}|~Elz`veJ(>fR0kxA#E%Jb0eF%0(87N+K z!M7XKvk7U7hzuA3gOJ1RwLs*vTn-93(ttF} z&g=}A0rNQwxRwr};Mc&0DlLMMhE09v!L+J(0V1}KBvv`;jBX9u|NU!5;ff4XbY816z`JSIzhKawVXTku^Y49 ziv(sXja5<_PD0Cp)&Fa8LYXDN*aq5l#+zGKSxT zFE5Fmo(y*`ovbVdngkynbSf!<#8Ta7g=fu$3qi~~D?gg2j!G6w-v;7_96!*xOAcmU zwmgLg!krdD%`(|SA{fx@i!BUvA{$c(td+D3po$h3tt`W55Ab1ezUbh$4_#dgQ{7Q; z91|nxifgrBi+KHh=6;<*Qx=r;5Ecci%l9i=uQRahKizF?9Uvk2P`7mp3n5G@Mr?I< z1(6+0_#vcu$o303ZSwaE^l2V=cbNJ3MC`YL->`#3h`8qm1e}f`zNx1GdxcYLYfzs> z%A~3gzd#u|6mlD9L0msW@Q)6VZG>$Sf}avd=n0=W`sEeohw}gl2d{{c!Y>l+_U5?9 z{2=(<0r-|)5h)&9iCJIW{vfN)uAF={#YuE{V+{51HkltfSGC)DfAumi!PMHhE?*u0 z^rn=ozn1n2@fc(U)S-dtV3r_fqcOLcRFDFP+a7rcF$V3wHAQSJsQ`FN39}~{R9=nS zO0WB`y5l>=K~^EId?!+`CW)(HH7JEOEQdJ%b8?ot`8Z@R?Co^L{4ARJ*0KCSyhJc?#+EysI3s^*%Z zrFn~sso*7gP{@(u#7EkRtO+H|mf=`WpsUH3^c_`q#1YmCH@(gHx~63DNRfG-nI72z zq>NI~8PsF6dlat>i1eiged?xej{$k}H?PLqZH?KzoRr!c8{w~U%^@|N7$$TR-&jAtar53 z1huI3!k`~-ubtKwX8S4D(w-UkNFW^Q(4zo4nSwoHX=(}76g~-mwujFja5ERufh)Ef zDm9USLBHlymlaRg#Az!57iV?kz3&B@({n&~ykBdA3ZWn&Cn;pA1(~ul!XjOWBJz1p30%B2rpD_Ohw_BP54V7rclKf;Rv)mQ~V8+qY7E z{Ae5MM6wfD>e{zXSDTl)_plX&Pnq6SultopF4l*87&S*wEm!u3^9COzi$Li`;Il*X z+a{6d&;DMgZlrUtFcml+YrtYhPt@b$x@!k=b{3gq>D*^wN-c{YJA-$^M4{}l|e-iHF9S? z*F_9%0gJxa_Pb^WDYCxGDY$BMV<`{)k4%=#jYDIDqwx)3&tr11`Le#KppT*@RZvY% zdB($)sJ+qT*pwz2D9h~(PIP$MkSut>#oo+0t$vUVZ8Ti1wAH8E|SxRP;@di(4QVBNqj*`-52($2&;DQw~P_iiEDs6(&x^MSe-mT zO-1Xtc>LIip6P3vn=ACYaw)JS?V5JTY@cy$$ZQyZ8(0`!cJ};q!N~u>gn6lkuv2eQ z*jeC443Jn`tF0LfyZHc9Z=z@kPIvpP)KHM-`xXze#dY$uTSw=wd;vO9 zL?Hk!_I54K`J#G1ZRoHSa;tK@w6b>3M^y8DQjV}WZhsJ_NJRS1bPS>?2TAiqGePD8c09Brx@ z_anch2}h#v{-}wyRouygt@R;@%v&5T6-c*?F7AG3vbhr18jNa@ki^9{+`Ypc!@tt_ zQImXanxw~9kzU5czRLrPr@DU5D}8KmDX7kUdZza&Kp40!bG!fbAi+ezZz1>u9|Bp2 zIj5)0e*NLO3E2WAc4kr#iZkn~lDa)Q*Wb8bW_@aPUQ(n8J`(HwX=KO0qHebO^Fn(Dc*72w3S7;L4TpBgJH>*vV z2CHUY(C4;K2oh3GbK-;ztEzd8fZ>_hgPA(Iez!G(+y*h@l)lIj?V*B=-^)!-f1gKm zQc$3&qRaCZdZ$iw*Fr=-pAIBN5tUjaE*vLYXw_{zW$2GB>T6J_XuLwNcSP0wOJ#B^ z(D7typiwTiWkd#gM0y4Gi}0Z6zO6Po8TsZmoBL;XC#qtJm5k;{bXQK(qr#Tq?UbXPlhY>$5%iXE@~~b2eSX)^LL8 zn6bSrb)F?$zu`s5@zhZR_yV7uru#S@k-g$>32n`~ zr=zzE_RkP}ED6EKMl9*ys}Ef--szAw74aNpr@R zDrE(kA~^})+C(s)sE*${+N&Kl4|)^xKE8?~)46LcQB55X;aUk34p6&gvG#muV=@6H z*zu~)rC9-;gr5Ztrki|i6anPS!RFu^bmg8(aPB!69OUyMS+cNhkrboAL@ zjRn*eb9h`OR*5+%WfNq@WfTNeISSn)A^5RUC^0IdizEZT54L#+`jBMcON*OX;F!A= zq?mVG^FEn80vjX;4@*OOnUei6S0|h8D*e;}_o`e8pvHKwd*EgP2kUa4`?-lX_kCb_ zqQ-o2-hrc48<`+biqqX7F&Q=siQ0o7lLtjEpC^>MDT5D8T(plwpka}&c{a+1x(vg? z97)w4E%>Tf%$vc5S~JPdW8@Wae`cpPOvd)D)tcqao5Cq0kyb-1-)}nIt1N~uE;vmk z$2a+j0#oi*X>wyUJ2R4vLP?5vt`Rqcm`FHIC-nD77d*{dovl&p-a1#xMP?^{YW;GdlUWM6T z>=WdF9&-TwY>}iNNCX};jWS||`viwxaaPDI$IoRrYtH80ai2C0zY&`Yo&y-M$9Ub7~J zPWsYqOo2aKz|q?gh1=gEEj?!5;$>|c=GF8i3(pjM#{@UPl76Z3^tqQ#7Or9G{STvy zae^6Q;2|t?^>xG@#R+vgr9tV^?`;dk4_tQ*WG-bw^*Hh`sUy%-ypA`ea@>p z#|Boxji<$P=r0h5CVxBlRU`)=8D^H0Juc-c z8w+lz{<)x;pDa+MP=3Q?9bypO6pftgm>Ske$rD*pP0ih}Y6(#+n z%1T65M4VVxPb@x472k?ff$nikX#c=?9Nyf)@eni&+zNMBV)4qoqgB26{7b#xqALCC z4fAkfPW5&J!_%f+g{y)=<-u|>-wz!uB`2)x%-;73nqy@<@HEL{D4R{asV>RKVM5PY zIf5*^m4^aBJu(@Z1-UYD?TVZ@BcOZ3gxke&-2eKd?&f3lW(Jr=Ok7LU15p|0W@r^l zn4PV+i>TGG{CrwHyIg9=vk7}v9Yxy@Gko2i?H9WR_r|L`hoGX52qC> z>Ia=1Pj$~dphmew1H6&}Tz(h#Ennv73NbdMxzo;+VIdFZU_3!&v9#c1ds zOLoJG<40vh?kWZD7bs`esA9vBDEVh)6UdP|w%w@IthKq?j@yPTC5fv*r@xu4;9wclzXlxxi=2#3>j%nhDIs&-O7;CGY#!FnuEOf zhW;|`v};hxqTVh#ZKK~QGwCK~AHd)|G%8_~g(N}vMW8bXKiD21N%%YL<)Sd_a;Ira zsm>h#RTf1&$gG;uL?_;T3p;zoG_}D_%BOB7()HM1`7XQq0&Z`jX7`0rl7H3SGK!o9 zy|CJ_ODS&E1w59sBR8xs^*M)+YeIO`_d7C5MY@P`lOX&Fy*7u}e?j;iv@4Z;cN{mb z^ueU}yQP55G-u^A2|p5fcZ|D1z4(I%RH=~QXWPcCRym4?IO;IDCvjSxR!p3Td7*|5>kqESbjnyeC;e2le4jAOycGJx$c0c; z_M^M{xgv6pH27<1JLiMwgm)=1&_=EP=a)WhB)}G@VD<&}P*FpI^J;qhmc-2J5`iB? z=r+g|jS~2XaGZXo9rr^sZj7%#hRR~KBrzDxRrLn8WYOimr^J>lvOSw4@f>QFZpZ^t zXD#tbiL*JlQ5gtTW{d}F%g|zB*vE5!R^xL%C`1MM$MtQzD@qd^!d8s)v_fbyBO&}w zz=I64kNu<*{q7ySfIeRQXYxgFu^^kfLnkHShxU%Cxh0jeIP8mV#Y<~VckHl?32IAo zo@G-DWwX59br9}H!PP!mqRw2%bV4>B0XnVftwOGiqVHI~@yV%O4%j#6L_JNQ zc9^c!4DsrGk9%R)oDE9LvQQjUWT;>UyybDFoHLdhahQzm9-%&j5WX!>r>iV}f!G=K z2GX^(Vb(JI+2Z5;`@Q?wYnyim($*tki@_b@snV%%jk@8TQXNU%A$j*ar`X)p#E=Mm zQTBCo>>`8E%4IFEf#F{gey&pt&&i-@s?IM>iHrskNu`=Bz}0E0CN;tWj0jJtSr`<* z^fJmg;27A8=pMQ?5bH^n>_VmUh8O9 zaLR&@@L9!nW(m8N=9^6UzhE^I>HdqtM;qi}caZvasE!I}#li>1#}m$zd0Gi^T}aI^ zn`Y3I8jEIXBkrXOz)>OA6}vya`9!;d6(vu3hrysSWT-T|jiuDa(tbbW(s$4(q_01I z(%P%r7doO+-#t$|K|kCP9599Q9nPE8oc?8=$h_n%kZ@Ni32A~TL(^uVcrvpff=XVt z8DM^d+=>)vtzAB|8d7OKp)$1PxaM+C-&t(k*{jB!<>2z~6Gw zYj-O^n;TeI)1hG&v6-nAN{E=av6oEetg7hRM!0mdPZ0TP(qkr~qGavRc#`|Kg>PSW zI=n|ag}sUm%jT4Oy>z9I+W>ZCj(U&~_uLbaFX>kGA>dJc=*RRZm9i zNff?!p%?2KL<2nhVabr8VmRPx|2!U{q~e+n5M+O(f57i+_(9nL&gV@W#Lu&WOZ?v? zgsBskvz6Q9Jq2-xz-QL$(P_QvGanY(Bu6 zYWXl`Eo$_abN%HR{xb_7;m(a9S@UVw4B!rrOg2<^c)%8D3soeaq!%x#6<7=Q&z15wxXQ1u1t0-(3 z>LKQAHHhshvo5o3Ydojr+h`e>Ah2Spm{gpWpq=NzzphXh8hmEq$B4uTQ=wvm|GySK z@VAYRzm0PYf%c_tb`dvLH8$SH;u1a9k^T}j-;0DM)`AV*+j+%`+j zZq+E7&2Y4nodfne$fMvhT0{1TW5!s+{Dy$53mCXOG6RsS2CQ0Z-D})5#=QZ zm?tg4F|t^r_62q1XNifcH;SSX!Nb_u8f^>uEZh`!HZB6MaQDm3Gzr6Z2te=myOS(@ zvELT{6+&44P6eq=^?7+sF#!zE>PO(-)Kdnb9pDQ&=gCD+(+1pSk=~0Q!fmoOqdu&-c-KR!t-juQ&mfo? z3*J~G?X@jqw;lpM=TWD9*VO$z+CN?Obd&F6$Qm}sbhk;iR5h(IU(L_1{1(7$w`+HT zbUDRDuIGwB(N;CLdO6uzCwriUED)z9yfre`e#gHWzQG7a@nPwMF2E_LWdEbK$K606@DowS?CltMQave% zND<6EBiUnQ*D~M0Zz^kMT2rU39gf^(=d^mc zCT(wSC1<5(x+d_zl~|$m0LusG1;)FzvbbkU zs4D@0zwp}WLS;wQuQc0%p56E(U{w^Ji}wmWh_>yQ;|1n2civg%?{3?878%7XS?`i< z1v`d(HKolT$g=7=e#l#6-ZSY5`Rth^+&w19yUQExIE%egbCU1@Bkn}5U+O0#rM0Gj zzwEP776U_DIG1pWAirz0`mkt}u}TCUd1Nj3?b%d4ziX+j2))xkc*q5M2Wc`@8uguq zbnZ*Jhyv=h_4Hdsg#;!{X8ox~^a+n`PgV8JTlmu9mz`W*Vm{Nh%njhn2=vMLTN$q% zb3SKx>~X~QMkySX=lMmp;f~JV96n?eL*nqY$4_Ic#70t0J)7^*N{Wkv4BE{T91fnu z{AkPEGa|}gZBa2CTkG5lL`7Pb!&6m@}U_i&Rec$ zA4Qp*Nrg_2O!oW9?)^rJXIR&YsFik?(b5^A^rT@pj)dP%%@o^E?XgSBjE&g=L76TF z6?IPQ3g0Y;CO!=Y1{kOxY2i&Qr*7G~m&1yxQv$wMxlw0xWdAI2X@Z9#&pdopGyVQ`Ro*bh1^{y$nJ29mis~+W86C)!cK5f$g4#reuK%; z1na3!#dWLZwn?@lGjVf7UWUS#{4=-_b@HWsLY{g z%|eRwi!J3!_aqa?nK+Nu0<2>nD8Acx=;idl^!^JAh|q9x88^qOS7Xh3B|{;nVv^<} z=a7)jlP$!YX{()PJjg!H{RcjJGJHYyB?Osf(~#rUYIDDu7Fv=iuY9F$;$+z_+)o^; zXABSw)Pt)LeL?0{X}EWT=6V)-1q;wL_9&whB<91VvR8LeJB*3Nvw~*WAwM5hnS<~; zD)+%P&;OD5i)SQ$=YL52^Nk|e>z^Kq4csU7imeC9J5$TTbOyDknx8h<%t&#s$U1Tc z>ti4IW@UaTuUTROTIw~)Qa&nOq?V`-o&_I8>U&K6gmL1P zLd*)<)y$4@3`^i{O}t$Yl-osgJ)j#J_T0;Jl}`yjUEp#(Bk>D9 zwnil`be8G$A8TT~nQ$FEKaUa~vu6y?SXfvyKhFbT0zZvZ*J3hdJ9TxH?h?biZrcuY ze5_)j?8_XB(@A&#!aa4}Twt_5rbw^(N5a7|n=P3*41KdAfLLvpKfOvMEk=7~aBXmhL?6-qhe8 z!|`>|f9Zjku$!#uO|S&qKR^P$Yuvu6jXHX7%`4v=uYB1nQIS#QiCpRuZMuOV4HCP# zuW2yDQYSxgz+#d|HFhD_clXFnb=4E}^9`b8M8|~kmXUyUW*G7yZ_%ac^y`M-aI0%a zSmkHfb&S_MVxz z?3dn~MW^E?J*F-p;#pMpX)#Abo3H<3_T|d`g+N@VNbpMDYYA1cvQb=cLr`s?c#8H( zMKdLa>xTlPkd8-o*n3>@U_DQV9l`6Z-ubB-)p@R*qq)OSS*0n5=!bdt-$nSLPK(2t zx2L}$6u!$qS#wpU0sb|}%|hBNYV_jFi{t&n0sjuKt`wZ(1@(i`muqx7=b^Z-8xJLk zZ`N(=Y!p7w&D?j4wDrE6?GkJu#}d4~Yn$n%IcR8Wb~kf7!22oVVdTz=8BiKU4IETJRwxptee1yZQ44jO(eBZRS zMrrAYSk8r*0A5IL?)9r4EYfWV#m0S6%#tt|8Y+F2>tkA3mWJuwWf7WfkSg!a@vUy5 zFb~l*vU3cMpzl0zX((UxX83GZ5ut}{9iB4Z2&Q4F(OWd}ft`m6ab8vgOU#701W4#~ zA!)?JU5xxpql@}X&rj&FmN|X+G3i`i>N-&05_0#71VHe;2($+U=ylU$RKJrYA_HGRyU3x3{3e0brW6x8P$k%PJ{65IU5fn1phg zJwCjxyKB@nd%+<;u7kjBQYfq${GxV5C2HyZ%4d$5z^ij3OeYm`)g*GCu03nGPp|Bv z)u!KKla6!y8UwiQ;^$n27=0uOUudwFoinYy2Y z?Wq*)VoU!*@n}0IQkt1SendFH9Gh*WviQ7BMHdk<%dIY%qH;_+8EB8v+!x-y^C|UO ztMH5tM#7~0?EFIy%W%jDY#_Be-sLoxTJu{#+u>^$^ac{PZ8BxC8Lm~IbK9$+5P;;= z_64bm@6Ra9nr_Q{U|B2nK6ahi9O$l*;is6BUaov3@#{38Vq}pqDj(Ttc;A$~>{UjR zYsLO}%F)(NxLX)jvq#T{VVm)5a0aivZ@!t0k~Upp2dXPYyrwHp6)i$PrSxETlh9s? z)?PSqj1p~><{MC6!ljqUN6zb-0iN^8zv+E>D#}*_K7CFz5pq*wDdL#iOmy5*+F&Q7 zS&Ntn-cE$sTl9&nceZB>Dru(%@po&ld;#%>?K;6w2gfulQ^>szdDDLAl*VHddpWxNI`c(~8vvLn?OWO~;zt%gK#ogfp?+n%( zc{gp0eT32$x~9y_4*b=tMWOjW%0dgRt@ zb`)UjQrV&MSn&|}P)cas`gmM&%nt?qjOt3s=}ZR|f2X#|aI~YTr)@Ix*$-Zsp@4MU zA$XglVq;zpF!2xk(D*JhAs9PIhp?;Ir2f%@K1o zB^XPs4rXAAxXO-Bs?D)RgOh!tWy1K25H>lm_Ve4?VLcfVv2tD399=|C;F+$n;=Z%c zc)f!Rvy4Z4kiC|9hU&Nu!<*gWzX|^Kfd7ZH_YP~~+5dP&1XP+x6_BC`3IZY`9h4#n zQk34MN$Ag!A=^X?TI#NTA5E39Ea2NHQ?>Xo9$9?X7o@Jid-OtQ? zW|+*(&L;1dT=Ui1RIQN@)2=&y74Kgg#u?q{trYKVf+5(uaDb+Zj1=yje{fivUyg`s zc>wOHpt!2(*!RbruLE~F3_&z-8n=uRa~;&%)r%?0P@}g9t|Qc^wvOUol6PU$5*(EA z@YydH3X@LbuMtyNO_{cKX&#C1c$#mn?XT^3#W%Pj4gYQ^q1=Myt;6EL75;_VZ<2f?`Q(oVm~VMcQl>i zE!aw*1~8izuHTnz^Yhe{lGS=Er7uhA+{i75rMg9t&YiY0%0=he2RMy)Ev(pZrMI^^ z<4(NAFeG;d;`GE~+m@nS0NWNqUux%6C)?g3h|WWaBc?C@Fe z%Nf3*awT*S`e3b(gHGI2OtFTJ~pwx2?LJ zemAx%^GLUz_6St

MeD_I_Q2BRv$6Knov@C$IxG`5$lDNdY>FPMcQIh$hsM!h;Hf zqPMHVhBhve@%Niq4hi6~ukb~KA=?1KCX#TENR~0nM~}x3f!{qe^Y)qXJ;IR(jRqcH zC<$%)DLAPlsj8=wFvL=GgLnDAcEr?PqxTP%&h zYtDFzE!5rP4-hU%AMm+L8^Q;N0k*}pLPD=#FtfKMbZ4u#I z>R+C6Au7v_czhN{v^O<;_hfoGS3wj=21_Q}4D#38K9!6_oupdj4_NV^*3{ ze4x)|TCHnq-eI(MNh}q(hLd;zJ5SqN=vLgu!&KzwaiWpopIXlO5@$u+k-oG}mHr$u zZZdk)5#e0kaiUb{U1Dv#9}MA660!yvqklbNr=ZY7-tt)*IN% z4$`N8b?LOi#gQAq7??wf#4|-h=Mvz5Wc=?^)V7=yJGHsj5BOGc6)j*mV(RX>gA`fO zuB?CxtJSKL5#JHCHQAGbZk}|fkW}jt@>0M&!sFKx+nzG7ufeeIpp}|+Nz{;4-ya=+ z8c@d{Sg`;cB?t3WrSEo(ETlHq4;LWQtiwUzQxS))XSQbIJPg|*} zryKSL&9UF~ap~EVNhkL#l4$Mw>*Se46f)G zNYKZc2MS8Bx-rI=$S(0QzggDM{7im0{wgjyce=_bZ=ijGAARSsSF1kvURRIT2Sb~s zL*_*Z!}dE0jtzyEr?)mI5f0dLi-a%v*;m&qT68cy&YEN*G0;>6%c5KCCU<(a36AQg z0r({5Rc?A{;m8=JXu9)$YeSylJYPuM;EPXgNiHQ*I#wS;{a5p@C$K6SPDrG;6WFn_ zim+}@T7676W|; zm4~)K$St480*F&mN3QLpa?EE1Pdz9ccnG`V$89k{h3+%c?l_W#W>FezpXu+5{np=~ z%l2CMpghKRV7)RMwAn-1t*{(m#T}N3t`FsES}I24CNRxup2>yKt$ZBX@noI%F8zaP zAkymKps?5mStzi-)#UIA(=KT%J^ORRLS8~HW){vZB%Hi-C*|N{{B=DT-~m(iRW|NB zl(1>FQXM{?XZiJU-;fa4JD20<$1fZer{Lp#HB{I~nHlhuKsRK?Bx9c(EF46)6Q&oN znAh|QPhPNaqV-sbg?0HZiSLh3x!vC!uAzron54v(`mn6uNgtPY6OCdT2@D9l}4= zbbIZg_;@CD96OJZ)~zS~b^MeaGPDcvxVv2#cNVWj*L3flSjlS5qcZ&3wcCd($D9!A zmZKyH$Rrv5sOaN#2T?AI$>&HHz1A5gwv2kv6QUOCFo)<8;vfbxYS0P-P=`VRHj@`C z`8SX5u7Beng0g%m7~>-ga^_3Wkjm0+KYBN0&Y7-p_aRCw#sX%iJYso$BRs7SH}?H& z|H0e0wgz#79Fr0mI}QoQPZ{xy)L~U?t}5!O z^@3DeJLRYV+v!AZU3fP$O0;@v0UPY%%($O0rnL||l*gL~Y&RY*hJ!e3;foEVQX~eJ zP0`CKda+`bX?H&MFUj!{7rCuqd7siql$UzCi!F-8-_p^3#7w$VSa5r&)@xr$H<&GY z@tJu1lw)jkDYk&&3AeaYB`8xFsjJ*?rJ$eP`EWtsz=oYric8c{BVErH5f&hXz<)PV zcrI?oLb?J07N~2-+Aa>>Qt<|g)!$|cJlr%ykNaq*g?_3IcU7|;WR&C8biL2YaTMo$?2jD( z)NqXuKAkthh&naf?DT)5oKWDn~O3K|=)33E+qEjnb7R0YTfRJqzh38=FwNdLU=Q z7l@LM*$6Mrs2u*$ai>cdAr{dqR+oa>0=Xco_22yYKE4ZnEVl1)|BlqSPfM$^!_{BM zue?_)?ZF?~&e=V@*x;x)s!!Giab+iQ{zai z#+U)=l{DnI*W3hsb@9T>7-_f;*PKy-rdW~SlJ8nF+NgD_z|+1L-Sd6Vkho+#b98t` ztW#(^OFI>H?x&A}1iipyoCeohkkSJ~Vc33(9=zYw{94}~QITeq#^?T!&)m7bS>h&U z&(prDMFUt}ud6|feUXEZ{Sn+J80wB;mnQx%UH)H@#|(Ss(BM9TJHTJDe$d$Ao8X@L zSvA?EL(cAl>6{4D{;ypBS!$Tagf;PU7bL=W-{~mQ@ApU+Hs9_9LkQb38FbX`P<9zX zM%`vd{(QtQZNK^biJyBSKCT7mcDqkxKz{b*kB21yR81ONg&gUW@wdl9wI6NER6w!b z4eRg;9V7NMAGy*eLWZbctIltE!_3Nh;b_mwL?yJjw=2$`)agpzyE*nBW3>#`BpG_KJJWNv&XEgBl=K}xN5vQ^lo z$Ys7*A7Lt#{?^>Y`Gy-3hIuy}&G|24f{r^K?x-UdoyL@GvmB@9^FCpkn#Jr^`o6~yzqUO{ zNaLs0R}OmGI>nM|U6}qXsc7lBkM0`BPF_rA^JWG^sMsf6v5)=hlG;U9FFNjR z3G$1&%`=BlP8d(Ax%0MFc2VQr)Rly?~CW4)|b&ZdJR^N)6RyC zLX=|mbAwm)u`3_>@4)Ab)S1-9qw99cZ$_9ZI@FCl-RgUJ+}_Nnuy4SV8k3){VwhS% z0jc`jJf;0n4et9m<;ite6D9Z*=sc^lWU;nc#ADHlkN=wO6>F*#AinX-hbA1rdNIG4 zSCh?1NW!-_hyUlic-DD*Ux}MaUk69_vj%cMlb8lWmNYO9_99d1S*97a1N?s5UPTFZ zV<}=`WjDF*FirKCqQwi*i5r@FX*ISKS>FVD&cT$Yv^cp64VL%MIr`Yve`Wmk#Y(-FiI({?I(kKE=cwaG}^@}I-vYGm{ zl)9atYio19J+9|4xQHL9mTXA#cd1Z*;Rk#er#E*nCt^nGy5AIHDz7Lq=PV+_^3)g#?2q)ohRM|D0N=}AJ`{}`x`NFngUh`gQQ`|4-ZSF&l zy16}SpEg^N2U?Inx+-Sz$pZmIOR6vJlzVn2(#zMhQi8Ze03YKyF2{79$Z+JXjr_i{* zIA3ml_~KV~|6cax!xv8D(9H6RZxk7^aNlJy3r!;-fqo&qt%8OC`p zD`FkWHE%4VtaZe;K^e}yCE0Rj4%b^Kb@lXH^O?=fF%s@a{T(}#Rh?FF_&7^pEijkV zb5C7nYBys%$>w%mjIRqDfCzrc08ZCmPS)Eq_7@-Qk-WD3zH@E}y>j$o&0{SaNOtWK!y4i61s3VpLHRdjd`clY=qtzi^e(_3GT$_NE?vl^_+@msKwqI2_{ z4B2kZKa`j+EJtcgf0Z`_XK;~&GR=H z)|5zGtbQ4qr$v0QpGlCRcO6$7oF*L1Cdz$2!}+PWo3vt5E+v;VH7elN;v+Z|aciqf z*jySWc5o=%iP8t=V6!brOQBQv@6yso%mbji#VbWjF0L%Sj~eb<4_LZxP*S{&^%>jY zs(h4t$Ec6=Bidiyli3GY)Cj;yBM_XS03_c9@>I6rSCCY}*^f+l#KEUiDZiKWxs_aPi?y$L8LL<^ zxu}|Q=%Cffr}gX7nU??c_QLp>ispyQ$Rc_9L26O8Wr?^5!l7=T8?WA`{E_khmqP!I zv&fbLXn>OYZ%ZN^)$fF7*Xu-b7&dDkZ0u5W6Ga!Jg+MZ8{73$2a6|$Q1HqmO>o7@s7IbVSOYPmzhp6z3gFdzo&zZgXtja!)PUAO2i8vrEO69fAJ(1 zrO}IUdr9)R`)E^<$cPGY(_p3T-JI!2D&NCSZOgOgL-b;e?uc6|ss{TmSo9@sS~5JzWRsm ztgQO`du0ob=Xj+mL-=YnKD-c@Z@#;qg1xqz7%%;KR)hg}96hGWd|JM=Y|)d1N!JUv8PXX8G&2FnzE%X<1<>zj3wAqcl(5G=1O3flqC|2no6D% zqWH0>V4~G%#b#4?d@M3fx1!d#5zKb383^JmC5f)bKCFHtWL!ra=Y&@#~Y| z3KVB7T%35ez_2=bHBfYi%G|U zmeJ_OPW7}K(n#Dj3fXAtSga6Gr0jJinwd6IudRBlrzbPLy}5VakZa+-BdOh$_60T( za?6nlVw(WF>Xfj!+z8Dzdk$<^m1W$Z))lc`&9B^udXs&?Cnw@@{AFK6X0uSrrjdr` zt>CRP zH$QJJ7qde9`%qJzVSjc_Pnm!WcyzG8)WxqbW7|G9Gkh_6U45b&J)H|B9n0`_Jbf=8 zu-V~B{|z9v7g<`g8q6zc44CfGJA+1j6h<~90_KGKBhVtypQTIdPmFqCJEr0u2`$=b z=2dq>JhjqkhuTmZ0Xte5yhi)yc{`uC%#d{X)q`pcRsI!knD@k?!4EJ?7TxGI2ajF3 zRGnCUi)20zx*n1elzFk05c{L+j9-8K}D3KT}!f>^8YP=|yq8^i| zdffghP4r=IrF(Whay>FlFGXSm0y=jNU=9qPe@AHT1ol)vCjA(rj$+|~PoVJs_lA>P z@A&8|Ad1Ti`)sYK#`A=E@pL-C*ugHFeUO;qTWg`3i+N_cFe*^4-voe-MPAC2Zc`phXYvtu$@)zWL;p^j-tm z_uMf`gZ)a_-qY$<$bpqP>#QfHCe%nLr;3luztioj8D5te+y=S7>kdoqyG!AbIi+OH zrRw`QV3XNdx)4m-1k5SKnV6gk=MV6tjuyY5x>?mOhip8NN@Sv|SULjK@ONE=Vf z!Oi^3i$x8?^ydN0S|6s>Tj`gS^BfZ&omfPelM1HSq6Ec)_+do5e=Ks%1y7;F=})m> z{TdtQ)SGMYz6SX6s*826-pmkP={`bUe7mawj5_B5qUHm|6~o(ft{J)pDGJY}d+1%hA&~w4 ziC>Z~Yp{0=msU3C&AH6(1RYycAcqd1S7r%P0Z>@dt698c$E{@{b>r&I9WkZ-?;;Gf zxO~ITNsAI0{cN4@38v5BPj0BnWPEqw2re(RWxB~Xl;C!_rKR=7%_uKA`7)K2O{-@J zSr6u-timlW(mPM+PHSsCJNGN*b{&&hy~(2698*z5Wx>W`To<=*GvZu^Npaxf`puB& zAeCe?^~~e@OQNq=!_rt0uA&#Al5+$%fz}LX3n>cRB|HyTy0Eh3I315ZG^v2W^<@0{ zdReno->}G{P=2RX?U)#G=AR{^YlTWhcWw=Rux5h8{qjZk2hgWOIyWf(tPv02NHBPp z?20;gNI4a)A_!e2+%rbsV{fMWrPj|VSPJaKrknNM%eI@+dV6=VKUWGU&=HCbg_Jsw zEt#>b$?=&nF8Ok6*Gs@v8kQ#qN!X7nL%%1kcWX~hKyPqJmp9uXKPtW@%X+s(*aH5z zucEGp1?nk5o7Q{$uHvyLo6^BwEDxw@JMSFH zgU8ca_2>^$-N+%`9M*!y%>uTKeU0&J91DhTedQayU6h)2k^w%;5*gYx+Tzk0e~p%> zCl++^{G$4pQBw{S->%P8^N+L|x^{u-h8k5f2!{LQwypmYfq`NNY53?)w&?*34*jXS z=3Z{2Qdxp%>Er6s5kAQ|xh6a@7CPxz>Jz!ZO;@vS4zNMGU1wnHWORn_i5d$q(()H^c zYpH9gyaGPCz(qvZPb=t?1iYx^Ehxht$Gb@kGkux$Nde@qe^j`x;&y)0AQM(jw?WdQ z5N0?X;U;f0fPN%2c!}QkR)Wjz2x|QVRc(PNE?T8MJ!=&u*AcaPQbyV68^DuST-s6i z2-@kAY7A<#NTBIM?JYa|H&v54@ivMMrA;ESsK@sr7xUTXh1?g_q!{zR9V}Tetjm^%CtNxhky*()V!Os`*8Joo>8`cP#hWHXO|MctM9@)* z+$MAoIr9|%sWg63V}@tCS?e2e1{QtstRfX!EOcUF;u~3yb}F&W$S$9aZo`tX3|)%v zBL(U0>|KiH%#9M5H_Vi3Q@v`GfCW$)^U1+vuQ@k7@fo%<2z_4;iaxi%Y%!L7cHLWL@+$f62W zv!5jR_5-arvHR-4^~7P|v^}i|iVV)HCC*5pE(d;QyUFB*i-7Z~w)W@IF>@mvo2ilC z&U*fM+`6^Alnq-#nEK-xxwN%`oohI4yZK6(N30(?tvi$(PIP4FrnPU~Nh3p_!n&g$ zEH`AiI?5ncUd0eMbU#um!x7IkPOL7in4JZ_Q*&q;y99LIuwu6()a=D|v?Z#l${O|G zNDbk`l?-bJTcuR*VFt~-#eKr=r|Zq9gk2=PmQzAATi4%~eOKtTVvP&Yd|3p;CYJ?^Y;hWOsq>gAx$d~y9@s`@0)vdHN)MYzXbM?|P_(s@K zNy`#{3HVy!q&fhdA++#!Q^bU_CXcee8>uFvMha7mJ7a(-`7NV{#2RbE4$!?XgRtf> zqYW8fv=I}(QEKWF<}S7d5w?bj9k+pt(JiB2M|sMJd&08AwW+M`;Neb-MYHr^PpKnj z|1G^Q_m9&5ne_ez@IBFIExc`H-Z6BK_4w zzk~8n$}*ubYM9k&mt zwr^PZ987JWI3GyDom)%|C2yVj_zN^jIO0q2We4!x&LgzVL8Nrd!$CoCqqEUvu=i7X z7r3K*(1;kz$f8$(dO+xv ze81m=7nn<^I-2@-)Y6)*BI=d{MCIN=^XgP2T%-f~5qE8&%_`l@WU_S?6G)V9?rnJ` zNNkOVfSJ+tvqzS5;5vSqdCX(`u7%hZ&@JQV+MA4h{usIZ_x+I}wInk9gUFAb_G~+~ zWkq>`>eSw_EO+L$6w!EP4@Kscfs9%pt_ zh!FkujL^A^iDIKz%|}Us8C3MI^)zX+TQrnfCwn*G!I=Jjx>azuKUIqQsC9eIIXp}O z;@c{99Oyq^@ycwlT5+&XEc|}hRPZBTu}^PnV6fl zSA(p^AadIZV-Nrgx5|G<|4-0`g+pe-Odu8S+$wf;x%8LmCg+z??G{6-%&C#qCE?a3 ztUfLeb54~SYCKKmjwz-$#GO@f#b%lU>cbmMmf}xBtBJP5u@9&8>89)3(?SjZv@k z;{w0LX?x>6KdE%4z}ya(RyDJiGqqeJSARj$xNy0fKx=as*Kl_s>>f^wnR!@=F?%=6w-EYlLC*DU8&kivwrmF zH%dP;i&z=T_?}kl0fkrRC==+ouh)T$$Z&~6Y-g=*+dX?qnRT-Ggu32DlTL=9oq}{v z$!n3TFWR4{6euQ`a0ssZi}}mU#;Z?@eY*HDdR0FXkdT6B&3Hl2CVn%iB?arpjU!kw z?ztaM+{UC=_ij}>t8TX}Vl9-Mx63ZUCpn`h=dR-l{5?yX5n(F)P>I?kD@DgS5|dIt zyDepjr-B#@2ZKY4>&chX3@IUcr)LwtepT-J{KgKn@H;X#ihd*Uv#4~nQaTq|55F|J zj_XO#mpZAzSJ(APZx}_|*&QTSM}Z^)JHKC_^@3lK*E3tgKI^qj1VVvrg6kLbxqp#C z7q&rp*TwGPqQ_9e0mcV*3{3B=9#s;bMTd)8Lqedn+XTYUohmc1w*TC3lfKul$diR4$*o~8DIY<1w+XJ% zz5ugK%Q#E>?@R=Yp(C3FOqbSNf9GjV2z?C}MhxE1|0W0>0X@F*?xt)du@S|YOQ!Z9 zDgi2RX2DDQzz!UW&#a;0+XPqt2`)gcc!&J1_SrQG;9rik3!W9R?PLSnF>aV;@tSuV z_%QX&i+A5i2pM{M$9RqsZf4+hnhx$Yty6lVu0N_y7Em{xbO z`gM$ia!U4LeUIzv%$kX7VZY`U4~G^yMo5sO>xhMo_B1@SSs~!|VDzCR5WJ6_`{bs< zpM{7JSXiEK5aQ$KBmGDrUNM}OqMs^qjdq5Py9W`>aT%RK+ug{ss7{*t%&;D|HJu9^ zDbtJ0Cx4UzJPSg*R;jD~B`PO%n zCPt;Br^j@lE?28pGRC6;HwWsSK-@6f&&a?slH+N4_y`fY`UYgH7FpGmEp)M-G?5}e zC1uUN>hpZG=Dp<2A_e#xY7!%^L46Ec_Q|z8#LpT_PnH6A=3(SrP0xxO;2`dNQfkod zu=)mDa64-rk|G)5q=smF7yxIi62)Avz9wwPK=Qcx3xbxr+u<6Jau=ky-xmRhxls31 zU6ogxqNQkd*dotkx1*N@l#iWROd{A9QsrG-=Wc^-;0g?M_7738CGQ2GAfhb;w>HuL9mz4O6~4>8-4<@1l4ul?4N zCuE~10m%S25?(fw($YM7{etkHL}2RAwZFLmcWI#iCGZRyc2I%^?;h{ym2ZVuZX@en zc3to+<1}^7dVPi<~9}m&Z@aKR33{ zh2O$7u0q@ZR=XdJw=r|ZZJtKYZ+gnP4S5_e%8cbn{5pXooNghFEVR`eUW5m_G&TJD+_0B8{+^(_H(s4Zx@+v84%JudaOnL z;L7K*AN%$q138GPdm-ePsQk);RKl{^Isd=|wC^!q{6Clh-BxS1{{tj=NtE^aADRJ( zE-)qrn~64(`22qo3Fv==5B}zAZvPiwpnL(^iXxx^sKEavNJ4n@pJW14Rn69LOX0hA zz>vIb#!z5lixA%Uy4=!sR`wa&pcT|7Pbc8fEf9DQo|b85Wei(=yPRZuMoqY0u+TuM)0au6gee5WPv6})lT&u=GfNuRuoFhM|% zj!Z4YOqeMO-xRVEcpXZBBA_R{PeXau@fgnkCKxa#1h!BUJ@S#iO$Smp7=T5dz!&m~ zsRZ{_knQ?Rz1)O|@=vzcX}YM6N#v~vI^=Fo6zkdDz9(Xe z`%hNKIVD=hMtGT_A5i+_`JJG)&&+akU^V_ZR-7J}w~w=u?i&7gCrvPECQFEIz95#D z@DI=cOt?a6pZh-_fP8~Gc1ln&{OpL8|4pfQUUS{ zRqYLEC_#v2PF~>n!#FT!drVl-3~pB5-eP+&%w(P&($yzpK_FCO+>_@Jj` zx-?FfZKgAAoMuNV+~%c^KQ|998u1{t6B0EDM|J0}NPmd5+kx+FPmlR9T5~<~cg9c^ z$^Zu)nk3p+3WEfq4+(!~_fCsln@F5kgXNV8$STMYST}nHat3xHh|lwYoPzX@y^Gr4 z{+n4)MIEHUFnUon17}u1cxJTx7EKNs5exoB8@vylq;I_wY4fc9k6GsHD=8qg;N)(S z0#J5d`}c__nYOL>d5~-Hj8F;BXkF?)@n$qii`ia1fly!lULA+e zxq>s69lK56f{Z&_xV=dnt(`7`7ALJ&S{Od%lX9VB|J%3--L7c*H5LvuzE8 z2NbbAx~%G8csk3X~G|0w-`xpLGc7wj03 z&G?5sAj?RJ5;)WLKjR80QW5-1=l=nV>np{j)+7Z+%JRqi1|TD#endGYu2VLUrsy|| zAcW>G5#RyKRn5RR4_N+T1Uz72V~+~Ged|1a4P*omTzvx43_e&7gWqKNtMjk8WC}G* zAYcdf4VL>soIr%y}D$mjrZQcK=rM%v$#S)z^?SkHCay z%|K0F&kGJOul^eSsSUdo$S7b|{U_}u?lVw=jRe?!dcQN1y=)@^Tu?k4sQ#V(v!Jum zNx&9lm%niL-=6%2Ae>bvFbD#|8U9tB*1vFuzsv*B?K3z+6v^Fh|E>s$;=A%d+DDJ& znEqpwAX2Yka%mbI(R)cn@?V!fD-wfq=5^rp1&05+em1~#=$bz0706`1=^1G@C|fIU z(}dNwmtA3cNs!bMMU)t?erFviBa_YX{+4fW>~JcakKr?sI@x|9rnD9}9r(sE@{z## zj*B$rmXAI&s9(ALFVMYw{0FH(^`401LoYbfoRJj%vK7v9`GETWXZsg? z;9_>clHgL#eQ>y2Y;U>4v3U^j5t#Yvf3zuPlp2u!jK2hO+=XV<5x1hZnvY&Jft(Ec ziAtuQkYEHYJ!izXXg>Dhg9w2x8_cnQ2 zC%3FST0GHE6V_w&cHbN0rJwV3uNzNrrE2)Bh{of*MaiI7<&I^8e_;gC&71T{y9X(CMH>NRPXEiLx zoy;c3oVcJhTHY=22%j1~oWr$MPEPh5Z|%d;J00tjdx1|TWLfb`8+g^d&DGrb!}RL-(Tz2o<2{~jqsaXpZQUO*m7h# ze=q;+)~J`1*w@UDf%A3IPCuE{PCA7UfakkO^d$)O6x&jd6WdgcDx^!)5|Ix<|plfL$ONVUj|H0-4FJ#FxJX3EamC$ zD8tvUAB>-|9PSXNpDe8=AAZw;LojYElGtN3rf&v!VqSZ^1Yh)y?=oo~y0nDG9&XM{ zJ8t;n_V7TVSi^DzzVg)gkLcKmnivO&k3Y9iK@O|Fmca-jR zw-a;FcLW{MNlz>_m{Wc>-vq(gUD&i1#Y^x)zBl`<>@-OmuPX@7eRajb=&SqareBF~ zyWwFvg}pm7v1qkpf!(biBzmZCoB3{D_CrD#xW}7XCsD1>`t!Q!E&dr#flcu8J{1Kxd`P2vZ$*nMZQI+0}g zs?Yvak z&IXsD=8Jv?q5D7E`dHk(WlX+gw@5dMh+{p+ze|_Qg6h;lSWgVVnq0TtS>sX)fK4OK zO8C50vu?)+*+6g7GGy~sTzu`cMWD+JI7U&JnlvvLqbjpD6%nPtT%CjO(>~|D?BkED zgTvbqwPYVWLb?aeom`jxg>Mi#;X4TbKhF=CF@{`;Fl79N-i+{O8a@K z)i3Da0`k%vbt9Lzni?kUu7PgUWlz0tVN)g4<5!|`HtWnNxf%1U=iY;3 z_gbn$tB+hn|sFnF`5t!hqz%+7Z zenUr}H;8HqnYP!TV+uQeS|B`%Ri!q*v<{v*fgR-TPp!-EUu|5$;Qk+!dY_ zpJ+JX^owcknX_x^nOk!DA!0q_m(ZEz^uxPY*hb=n6GwtO0Ol-CM}#MVV({-+C7EQv z&*_K%zDhEf=K#6g&Emtwlc~eQaHlZ1FO%Kqiy=Ea9zIzHGbqJ~F=_ktN$HwL>&5UN z!U~HIVIjBXT`6GK%wkHhutHuOEW~5pm9hxO(}F(y;nXxW<>a7y%!~Y1-*RjaQ+f(3 zymk&o43K`C5-;1CJ_lQR5{S0d4yv4&)olh5FOAlY8ZJ)fZZsjiPcpWg$UB+5_c}u7A@)o)FYlrI-2gT=c zE`{G9LWSSvXb8(Fw}hStlA8v?BM9xwF54r%H9G;c6EOxvm_j`w3~}K%Ps%Nv_G|oC zt(PsyS}&bI8zgA+UnX#vati2f3h1u+brH~A1n900=ja2zdI@Y3vFzSW zG_9bwE|e*tx2UgLKO2*^oGEny-?({+_&1~K2POC=zN^}7c#n1)>&@I7>l^d6KYmbh zC7Gxo#G6F$s-JTdDywbha}M|=omkCG{0YrW-USTM;`G61^)1qJ{`Tf8xaJo~~Vx0;2ukvN%oG^>=# z4zBA|_WJTEF1Xp>?0MH3r%^w_g`%3Z->X zcqUwSW2e`pHT)}2PWg?Uck7(m?M6OJ=am56INw$w)bTGncx&YUMJ`T}+>`a`FE8BY!siMP!I+RE0F4sc^nj{-M|E2FG+khQG9tE$nokFYkO zu4pP|;cqT0%t)qza=Qy%D$a&Y!d#J@lY+q(q#QbG_YF4@54X~;k(16(#fAjA;b%e| zK8%#5jch{MIX-POB0oKLB?Rp%CI?+c$>Kk;)nV;ZC+A%H$l`fp4JCVOMmPZ6t5`BM z4|?)yJrB&?r`;34it!So+UGY6%{GOlq5KXyfbm#Z|I=>D6_ zlZLXSd%+eYXV#?o-vyaqu}0@wn#d;KhfD=)E_@`n3u&Gam=b^Z)*`FPypQZ{-ROm$ zaVHY$7JQI{UWn?f&{P|EuTs)p(0!wXFuss$axJC6GGuNV{m2!~!IY{|-9K#H@W%ze zs8`mdvz&@0%@c1%M78?JwyUjPFK;}3IK3n&>$fe+R_7Z(fH~~H@)bHnasC?7rT9XA z1L!uzc_s;~PwZNAsIx4Qk10?3Lxf~sHNp>PS1fZLj7jbP9J1Gy-G~wfa8%Y$WQ8Iz zWe&33Z3bugMPbUIg*4{{fGOeWwuiEe%}#$x{2fOI{x1Db{P%VJYWq*@|5Bo^a`;O3Law2CZ!9)kLb6ijm9e)|{nyI1S7Qzp*5_iwv~P(kN0Ly^6uyk6He*m{UABZf~4mLajE zV|?!``WiAVZ$4ZgRIAi9cy_(k!2p6?v(8gzYCCtE8V`<83Tqm*;weiqb?22c($j^4 zl~b)U>VbeiJQyZV)P1Jl=EcRP;tZB7Ge2&Bir@GF%#ZHwEYG}BnfONeJQ{OeNrf^$ zJ~};mTQEdTWzPEAENQBE<5RikT5j7^TthM2HtAUI3IeEVyxrMzW|7hzKQ6SDzxZnV zo-##2%wT4!A#;NA7$&^?bu#Qtuy6ADXIFC4#pmS(8CFs}zXk6<;dqM_N*=u;WYrH0 zb()`31J1h5)Xoqe-!x6<|IRqws0Qqo)cvgVq10{7K2+J=QHo$uvs%3pjhCBfSeYLh zSC8{UHY=a{Q9htE=)#9G)eC3hsE55QRy_-ThTwke8VT*v#yEhp8*BM%kEAZ_QeWbd zC!3?*oOlg0;|!R7W2^O%djM?x<9k#J_)=2m9WLf=ddt%6XnmUJ#`j8p0Et1IeuZEec=u$;Q66M~rX-13wLH zB#D~B6Wma%L!kc#?#k6Bm5|duk1ms8!5Msid$rMhAUq{r68s5L=kopC@!3=QE_teX3>l+kPP(;%AQo@x zBF0qKIywAQz}YEm(!a)KN1Sw|x2T7~col zM`DNXqHm45gQ%HT;Z47}+L<7UqWWK{swSV)kwHZ(G9DT*`-hnYM8!WiGG0psL&Ozt zCseSL?lZD975cQc0N4f~IH9037oan!-U#(dyRHO2l458;V9IIMYIfCii2g^Wx~4++ zr}kZE%~mCkS8>R|nYpgSHOZ2`1>oUBXfZ$V>_&WG>qn5Bk_lhN7Lk8x#vb zw95QhN^=?;bQN_=KGQ;6pO8&6i_85==q(T^{3Fbn>cEU=W|~4ymb9n{`+X<;7`mzm z=-VlWOT!jK&i%h27lr~6x*t!dMDnFuyDPBRjnY$jy6Zi~kt7IVHrAjVk@_z9ZBSevCre zY)Cs-2Lw=ZzK!?kh0Z@s6W)f~gs5&!0h4vUxoLIk7l1TQapznhL9#<_phP-x&QS-6c=E;@d6~zXTaXl_ebARttIyvEfg_|#rD>@rK z|MX)}O81<^?&`)?!1Tk+^!eEdb=i*_yy)){wRii2Do{ ze}NPfT70M{>T(2IBg3GCLLOKnQxUq_2F3BxZ55Q}5NxYt;wXSF7WsG-N}R z3CSG(Ak)3xxe>~=WJ3~Mk=acitb-mQGr{}gq-NioTC8$6@H56g^7jiRKP_T)$-N?T zh9ncGKK{smHFWEjv$hIfNPkmN8B>pDvqXJx{Px}M2_10LF3OG-a zJ_QTE8R|h|Y?Wqz?kfRCAioUis5_k=fs%18Ru2Zml zCsBKng5y9tHslDy?Dq)P-MKP6DOj(tjm*L+9Zh8ZA~`5IKaKrEx#cT>hxWA^U!@l z{`drYA{DM6w71$?%aBzOL=_N5VW5g5 z?yMDJ-E^<=EjYuPD@Nn6&dhjL8nH??{}XGgFmxG`ru%l^crxSJsB$ycjPhDk8nq`4 zt62cMw{%GX?;>XPf#WW$S9Y2N4%n;n1+%D7ZDO+;sEN>@K9+7=CTXwoGks-OX_3!W4F#xtgM@aYWEJ)x|fZa0{vIWT23e z6Yr3NuW4kw)Go}H?&a)RM|>4}_Z9K{=b9Qfz&WtA!V_N?%=>(*M|{=BC#XExv?Z8y zUKUp$kcXcp*vr+Y4P7f(Y8X-dr*-CO{ZadkMHhQ5nf^6f;Pt~_&T+V3TnCsdjZ5c! z#*7<^c2N#a<0D~;jm61==bIEy>%!V?YRD)O8af@|@MeR_!hs$>D>z8}6Pxq2!v9EpxW6N<}B#A?}Oi!?E;iHTyWp zCo{+wTB*ZyYC($6D#LkP3I^i&x016ha=-_pU5Rr)U5w=-eAoE^{JK)bG&krOER z>1l>!mw;-r0^z%}>S(N9(0SJ%13f_{?3F9FgXlx6l^HBe(y9WA;`?O=;j&CGWV7M7 zwVMh2#n#15oWU^l7{73n;7qA z&$%gH-k5UX({`e~On@AZGYdtc>2PG$#_>xg_a#p$II=HEh+UcYXG|JXZer$Y@w>`! z)i2$C{~=532#waEVLFC;B94LWBZpL)=hn3zNVD@<+GW~l#2qvjs(6SFj-wmpthnIF z&bmR*aPLz4QbIZR6vy6>D9;C<55zE=3&~->z#O0G(gSY0Ea{=+hrKHH1;`Osd9crf_*Q40MPC?LaD_|1LYjP)(1N0c# z5@~0=7M?II>L8`YQh4tOv#&0v9NBCd=NqY-U#s9myPrR}5>X>x zWG*35u?&lnz4Tm~=tEJ}6s5UiPBNC0xwWQ2Fu$La%7Jr%evqhiH zFH^T!7_E3A8hjPN&2272JIC#<#O;0(by&-})-o68@Wn8HM(lF^2RK@P{4yu_l~0*i z=_)m$HjzY!8zwJUiWAy+9#qT+6SN<5RdoxgaC96zEp@%sWK8J6J&`*HI(jDvaP+Uy zo}BHzUr_qi>PZJE{9#iYeGG7`6Xr1Tivz{kVPY+**EiaFBmryE46>O|$jg1qR@j5#ZHa}#s z>a~=TO^0LCcQdBCqdt5(lPMD&>gh&|onY$gS#2bQrm3u;3Jo{wI~yr)tMB+UyR81K zUti7b%1T%G4*slRsvi99ndm!4l%!o_mNT;h1yd-8W&lOnmaCUpUb6EFRnHs*A7|fU zZ_T}2|Fw>|Hkow>V;cQo#lu2Azhldu%mGU?Tr+qyjmv$^U9CGFK}q3h&E$J&a6yai zJ(4iL`P~1R?ELOz@+bmf+vO?c#AM*5f2f~vX?TG$Iq**T?GUPz$=|xvIiWP5$K2)1 zPr0XcEI|EYZHSi%PWTosk8eKw8zD+(W znb&#U?^BXy@7l&mt}-aW?mn4u-OyeuO37Bne*vkOq*Opy$VIs482+VHP{~y}q4eX# z43KwZkA5$noROH3AWg5Gdy`7zBgL);JPMbCgZM(f8z$Gb)~q7_OR6#7l^0))4I zI(Xb5=hIuPimNX2T^~Ddyn?k>UAW3Bt5cXY^Weop<(cU)r;?#L-=urhjHYf1pWu%A zfibY}6reMuEBTc}awJNXhYJXcM2)g-d%0*nzYK_NATj{><=Y{%J?b&%FRI@q|4K>T z7jqM2q`(V473NkxK78R@X8ww{FeJ12=U+>SLpqFzCT8hsMco$?CGo7tC{D8iw*(D4 z{CpUlk{E;H*2pNm{{4CMc%aG05Tvq^O;u)%=R8Y!YN@{Fm@HHgZnmwx* z{ewywDuEzUl790=ax3vSDJy!I&36pEsZ@Q=`!6aXv%OKWt!0wp8Q`_zD-ptcW-Mvm zfBR2ZqmSfisINZ>2M)Y#2^iXt=Qwfwbk+N~iyo~WP|)V!yC{3 zBu<}(&8-#aUzC7>y)nhY3;^?;s~|tKEQ=5fSwuZ5KvfvBp8ri_CEF#X6L$hT;Mg_X zzAPk-udu(aV`)^4)sR3@?NC}p60@o^-SV2(0+G(cJEO={+0x|#$&QWb6T3~atH;KL zCqhjr<mWsSk{H`P;X4!>6sxSXs9}t={nH0Ej_IzWe;g80d6?=GT z)W)Q@wLgk<9fL1yaSS?FoN{YAq#X4qwo4o({?F3Hz&}wIISWlY*A9a<<`2u4I7N`R z>Pvb|OgAcaNU=(84h%z`)%O0M1_?PL?jpd%BuSOE=&4&hImmW)HHdK|i2VH7%rES< zam`YkhwyVhA`?bel-`n#4U;2EZ%>zrVLDEq4gOVloc<~+Y-In5vcVyd@Rx7Y5EvN= zdJ%3k-6$9hzwz=fDKR=iZxca`%fEz$XJ5&OJVo_W-=nFhM8i z^El&Kq|sgH^>7}tng?&a5Z-Rb$e*N_Wkr!g<8T@y#8{#k$^~O^dONl7>7PoPoh-ImV;Cyg6mP;SB^$v zQoh}p^BZ1>s2rob7}M%9W9L%LA6dN&craY-Reqs=sb4wAK?gjzUjq+bbR(M-v(p!q z&z^o#)&G$6DCe0j)88hp@RKKteg6ctp@*I(mu31v3o?u*mx1ELQ(*I0gE=PwjEE-- zvYhm9&BMzi3aq*vj2+{{RndmlExi@btZ=RseD2qpr-eIvd*)o>THxbAsxIg-_}t1D zZihmXDgIoAbC&?YoM(7Zpt{qj*h9VA5ux;}{B<6ZOnVtp^d zbpmB;8k?L5{|FF{>-&xA&In>KYn0ytNoa368Z2q2e2hh{;!EKEqqLOTiO2d)^1%&Ww$g#v9zNTxP^=jT|yjfkH);aVHvSM>dWTHyVtzo zuWA_&a$)P(coS|yXqPFIXKCjX#RqJcaj)?)I%6OFNci_A$etBJK^GRU zqxXgsuWR!r$X`k#(*yQW4RG3+EN&aL-NBk9kg_VZ3~?;dkA5|PWKGl%^JNkM!^G8^ zhbCQi5;-7jG2aP{U7pOqo;a37(E@}pc=4XIP;NjCH`Lq!^tSP)0HmWO#eYYK!h816 zbX8wepx*y&MEjotni|7fJ{%NBdk<}~G#3EREvQ=qE~6tK3i=>7z~C*Ee!~vj@IzZ8 z@9alvZ%QI#G!7uaEP<7sHaC*R?S2_`O;C~$0S)XenU)88b*Ub?ZLs`DNc%rTGyn=| z4L;z&Bv5^P(+GI?B)p}}&pDl>|JVMG%bW{zI@$=v$6!8y&SH^C=#imCC#%^)ECZAd zptE9Rs#KY$6G8E>dCs)wC`Sk1Y5Yw@?*d_&>p_JmBB5BZ4oNhcLw=9Yx5Sheu4t#*&Q7P9a zSf(v`nHY7SkFmKD8p*{$R+$4OOLr(!F!}LT#-a`P7UDbLV2R$vF^!$t`Y9B@nfP!J zY4u(A{3^@R>Y|dAzJRsU-w`J=!$;q;?!P!6hB&A8O!05^{IkxgY=4K~`{3pn!%Ha?=NO(KXNSgI%2;!=2z_5x-d?f{&t`ZL7N0?asb$Dl^5yZ3&EcE9)0dj3NiDAP0&e%gV5Au zF|1*Q=CcrFhu@w^fAcm(ivB=xStRce;C1XMm~}vG8Ssbd1DfPpk-YxS7;624@W{^C zpIZMY)MhEHh^Ki1!fq>>>M~dqsR*DhbO!VvK5yZiD*g@Inl;Su~e|V z7Xl}`sk0~Mjg?-#hqks1Eklq9AwRRM@F&1t zfEnr@tG@6aRQ-FK3YJx*e;0-LGn9TW<+C|;9QPD&^Xv2jwG3l?Bi-avZM+Egqgqu= zRSFfooA(7GuE#-=9sId?OOB3`Wn-8aDEv{x-vtmC6h}umgvtQZHr`fehvNWE_21;^ zfKw3{PxqkW1hp0-3u=B^0VII&k`k>IX=j7*z6@1Ys;3SxPbWha7q>=H<~usHKIRAa zE>T-Hn(m!F4l1~{9;boez;sh%qi$K@4ffFd#*v-5HQbMQtHkWUP!*|DKm;xrE4^7? zTz<}9__F%&uF01BVlSy!?K@d+cWrhksf#t2&`ka^oQa6^@6Q2lcDkNw`Bp2Pq_t|f zV+w!s+^{f|6w6AgU&gOsJMocC8H2Ig+I4 z2~8wYZB#`xiIj25WbnA5JNufm1ux+ANcq21!~Jhp!tJsy?&IJ)QZpsoHo6^w=Ka93 z+SzMbN+-{SGQYNUbI^;2BB5jeR*#k9Ls!KA{(7O{a;nm%(Y=GSMz4S=O5M(?k*3r8 zz*~=fI|L{qZ{IS)ee9MK#|?5U@?6?; zCSIobA6D}+URV+x?ose@r+=DQ;;EL4>G^&j$bhstJ-{|^Ivm|Xbg^CCe7#N%f$w6Y zbauZqNW1k9M^9G)sb|1X2TH5ueJfsWZ#VSSN#>UFH7GW4rmV_GWY@PHR5y5mPg6d* z+T>YKS7iNWAtnQPdEI6GbnFhwTEDPOz?@aBmFzdq-<4)FA89ir5;DsB9dD5%JD<={ zq_bIZupgrjTfS4nG(14sl)Zn(d;Y^_pta4JjvzLmz`nE;u*UA1s_kaqAFT^5U$#?; zTma0a8yd+*eYi}n1)vwk6r8o&{tbBj^oI?M`l=`Hj#t?8R^RZi;&UH6 zc?jV1M1^+?7}r+kVA&{?y6{PVOBGL{4dK--r-6bu`B9{J`Q@Sc1*?Y12|}Z$&~8!s zli7(KbFL|)VLG!!g2hy0xm{(iC(qgrW|Qe3eaiC7 -Firefly Synth 1.9.5 +Firefly Synth 1.9.6 -

Firefly Synth 1.9.5

+

Firefly Synth 1.9.6

Module Overview

From 01624d4e5e3dd1776e06ef2f941f445f307ea4a8 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 22 Oct 2024 19:40:09 +0200 Subject: [PATCH 51/61] Revert "take 20" This reverts commit 80982b0e6de77506834112090462142b07d983ee. --- demos/working/demo_track_psytrance.xrns | Bin 53878 -> 0 bytes param_reference.html | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 demos/working/demo_track_psytrance.xrns diff --git a/demos/working/demo_track_psytrance.xrns b/demos/working/demo_track_psytrance.xrns deleted file mode 100644 index 5ed20b7fcfeb9350393c656ad81db961453252d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53878 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 diff --git a/param_reference.html b/param_reference.html index 6c78ac136..96b355f0b 100644 --- a/param_reference.html +++ b/param_reference.html @@ -2897,7 +2897,7 @@

Osc

- + From 4af626a93134eea6ba47f2a56ac60bb22d9ef06f Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 22 Oct 2024 19:40:09 +0200 Subject: [PATCH 52/61] Revert "take 19" This reverts commit 4f02328d9dd827dc1fce88897940de6d6d65913f. --- .../src/plugin_base/plugin_base/gui/gui.cpp | 3 -- .../plugin_base/plugin_base/topo/param.hpp | 3 -- src/firefly_synth/firefly_synth/global_in.cpp | 31 ++++++++----------- .../firefly_synth/oscillator.cpp | 2 +- 4 files changed, 14 insertions(+), 25 deletions(-) diff --git a/plugin_base/src/plugin_base/plugin_base/gui/gui.cpp b/plugin_base/src/plugin_base/plugin_base/gui/gui.cpp index 88caba42b..a42d6771c 100644 --- a/plugin_base/src/plugin_base/plugin_base/gui/gui.cpp +++ b/plugin_base/src/plugin_base/plugin_base/gui/gui.cpp @@ -1162,18 +1162,15 @@ plugin_gui::make_param_label(module_desc const& module, param_desc const& param, } assert(alternate_drag_param == nullptr || alternate_drag_output == nullptr); - assert(!param.param->gui.editable_label || contents == gui_label_contents::name); Component* result = {}; Label* label_result = {}; - switch (contents) { case gui_label_contents::name: label_result = &make_component(this, &module, ¶m, alternate_drag_param, alternate_drag_output, _module_lnfs[module.module->info.index].get()); label_result->setJustificationType(justification_type(param.param->gui.label)); - if (param.param->gui.editable_label) label_result->setEditable(true); result = label_result; break; case gui_label_contents::value: diff --git a/plugin_base/src/plugin_base/plugin_base/topo/param.hpp b/plugin_base/src/plugin_base/plugin_base/topo/param.hpp index d670936b7..843da1169 100644 --- a/plugin_base/src/plugin_base/plugin_base/topo/param.hpp +++ b/plugin_base/src/plugin_base/plugin_base/topo/param.hpp @@ -94,9 +94,6 @@ struct param_topo_gui final { // allow to drop on this combobox? bool enable_dropdown_drop_target = false; - // allows user to attach a custom tag to param ui - bool editable_label = false; - // if dragging this label, mod source is "self" or below std::string alternate_drag_param_id = {}; std::string alternate_drag_output_id = {}; diff --git a/src/firefly_synth/firefly_synth/global_in.cpp b/src/firefly_synth/firefly_synth/global_in.cpp index 939582f34..37464984c 100644 --- a/src/firefly_synth/firefly_synth/global_in.cpp +++ b/src/firefly_synth/firefly_synth/global_in.cpp @@ -9,7 +9,6 @@ #include #include -#include using namespace plugin_base; @@ -53,7 +52,7 @@ module_topo global_in_topo(int section, bool is_fx, gui_position const& pos) { std::vector row_distribution = { 1 }; - std::vector column_distribution = { 37, 27, 26, 44, 24, 22, 32, 80 }; + std::vector column_distribution = { 37, 27, 26, 44, 24, 22, 28, 76 }; module_topo result(make_module( make_topo_info_basic("{E22B3B9D-2337-4DE5-AA34-EB3351948D6A}", "Global", module_global_in, 1), make_module_dsp(module_stage::input, module_output::cv, 0, { @@ -70,13 +69,13 @@ global_in_topo(int section, bool is_fx, gui_position const& pos) result.gui.menu_handler_factory = make_cv_routing_menu_handler; result.engine_factory = [](auto const&, int, int) { return std::make_unique(); }; - auto section_aux_gui = make_param_section_gui({ 0, 0, 1, 7 }, gui_dimension({ 1 }, { - 1, gui_dimension::auto_size_all, - 1, gui_dimension::auto_size_all, - 1, gui_dimension::auto_size_all, - 1, gui_dimension::auto_size_all, - 1, gui_dimension::auto_size_all, - 1, gui_dimension::auto_size_all}), + auto section_aux_gui = make_param_section_gui({ 0, 0, 1, 5 }, gui_dimension({ 1 }, { + gui_dimension::auto_size_all, 1, + gui_dimension::auto_size_all, 1, + gui_dimension::auto_size_all, 1, + gui_dimension::auto_size_all, 1, + gui_dimension::auto_size_all, 1, + gui_dimension::auto_size_all, 1 }), gui_label_edit_cell_split::horizontal); result.sections.emplace_back(make_param_section(section_aux, make_topo_tag_basic("{BB12B605-4EEF-4FEA-9F2C-FACEEA39644A}", "Aux"), section_aux_gui)); @@ -86,36 +85,32 @@ global_in_topo(int section, bool is_fx, gui_position const& pos) make_param_gui(section_aux, gui_edit_type::knob, param_layout::parent_grid, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); aux.info.description = "Auxilliary controls to be used through automation and the CV matrices."; - aux.gui.editable_label = true; aux.gui.alternate_drag_output_id = result.dsp.outputs[output_aux].info.tag.id; aux.gui.display_formatter = [](auto const& desc) { - std::string result = desc.param->info.tag.display_name + " " + std::to_string(desc.info.slot + 1); - std::transform(result.begin(), result.end(), result.begin(), ::toupper); - return result; - }; + return desc.info.slot == 0 ? desc.info.name : std::to_string(desc.info.slot + 1); }; auto linked_gui = make_param_section_gui( - { 0, 7, 1, 1 }, gui_dimension({ 1 }, { + { 0, 5, 1, 3 }, gui_dimension({ 1 }, { gui_dimension::auto_size_all, gui_dimension::auto_size_all, gui_dimension::auto_size_all, gui_dimension::auto_size_all, gui_dimension::auto_size_all, 1 }), gui_label_edit_cell_split::horizontal); result.sections.emplace_back(make_param_section(section_linked, make_topo_tag_basic("{56FD2FEB-3084-4E28-B56C-06D31406EB42}", "Linked"), linked_gui)); auto& mod_wheel = result.params.emplace_back(make_param( - make_topo_info("{7696305C-28F3-4C54-A6CA-7C9DB5635153}", true, "Mod Wheel", "Mod", "Mod", param_mod, 1), + make_topo_info("{7696305C-28F3-4C54-A6CA-7C9DB5635153}", true, "Mod Wheel", "Mod Wheel", "Mod", param_mod, 1), make_param_dsp_midi({ module_midi, 0, 1 }), make_domain_percentage_identity(0, 0, true), make_param_gui_single(section_linked, gui_edit_type::knob, { 0, 0 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); mod_wheel.info.description = "Linked to MIDI mod wheel, updates on incoming MIDI events."; mod_wheel.gui.alternate_drag_output_id = result.dsp.outputs[output_mod].info.tag.id; auto& pitch_bend = result.params.emplace_back(make_param( - make_topo_info("{D1B334A6-FA2F-4AE4-97A0-A28DD0C1B48D}", true, "Pitch Bend", "PB", "PB", param_pb, 1), + make_topo_info("{D1B334A6-FA2F-4AE4-97A0-A28DD0C1B48D}", true, "Pitch Bend", "Pitch Bend", "PB", param_pb, 1), make_param_dsp_midi({ module_midi, 0, midi_source_pb }), make_domain_percentage(-1, 1, 0, 0, true), make_param_gui_single(section_linked, gui_edit_type::knob, { 0, 2 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); pitch_bend.info.description = "Linked to MIDI pitch bend, updates on incoming MIDI events."; pitch_bend.gui.alternate_drag_output_id = result.dsp.outputs[output_pb].info.tag.id; auto& pb_range = result.params.emplace_back(make_param( - make_topo_info("{79B7592A-4911-4B04-8F71-5DD4B2733F4F}", true, "Pitch Bend Range", "Rng", "PB Range", param_pb_range, 1), + make_topo_info("{79B7592A-4911-4B04-8F71-5DD4B2733F4F}", true, "Pitch Bend Range", "Range", "PB Range", param_pb_range, 1), make_param_dsp_block(param_automate::automate), make_domain_step(1, 24, 12, 0), make_param_gui_single(section_linked, gui_edit_type::list, { 0, 4 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index bcd5b48d0..b8b9b3669 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -432,7 +432,7 @@ osc_topo(int section, gui_position const& pos) make_param_gui_single(section_sync_uni, gui_edit_type::knob, { 1, 2 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); uni_dtn.gui.bindings.enabled.bind_params({ param_type, param_uni_voices }, [](auto const& vs) { return can_do_pitch(vs[0]) && vs[1] > 1; }); - uni_dtn.info.description = "Detune unison voices. Only applicable to Basic, DSF and KPS generators."; + uni_dtn.info.description = "Detune unison voices. Only applicable to Basic and DSF generators."; auto& uni_phase = result.params.emplace_back(make_param( make_topo_info("{8F1098B6-64F9-407E-A8A3-8C3637D59A26}", true, "Unison Phase", "Phs", "Uni Phase", param_uni_phase, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.5, 0, true), From 421ccbdbd50ead7085b63be949fa42e534448a72 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 22 Oct 2024 19:40:09 +0200 Subject: [PATCH 53/61] Revert "take 18" This reverts commit 9da1608af1fc0672d8310da3d0f115e0a58511c7. --- param_reference.html | 144 +++++++++++++++++++++++++++++++++++++++++-- todo.txt | 3 +- 2 files changed, 141 insertions(+), 6 deletions(-) diff --git a/param_reference.html b/param_reference.html index 96b355f0b..523ab6cc1 100644 --- a/param_reference.html +++ b/param_reference.html @@ -2897,7 +2897,7 @@

Osc

- + @@ -3070,6 +3070,142 @@

Osc

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3152,7 +3288,7 @@

Osc

- + @@ -3169,7 +3305,7 @@

Osc

- + @@ -3186,7 +3322,7 @@

Osc

- + diff --git a/todo.txt b/todo.txt index e4d754603..6433ef4d7 100644 --- a/todo.txt +++ b/todo.txt @@ -33,15 +33,14 @@ X do the conversion for snapping ==> missing = off X global unit lfo phase offset not plot good V do glfo in project time samples (can do now bc all is phased!) V do snap for clap -X arp new note = reset table pos yes/no? update the routing graph for arp do global snap docs? fix the bug demos make a patch cleanup button -do labels for the auxes ditch after-mod, claim micro support ? +arp new note = reset table pos yes/no? do more keyboard tracking just do it -- also trackmode mul/add do global unison subvoice index as a mod source turn on stuff when dragging (e.g. basic sin, dist skew etc) From cfb7bbd5d694cdf8b0caee9c49a194916ffacb13 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 22 Oct 2024 19:42:08 +0200 Subject: [PATCH 54/61] docs --- src/firefly_synth/firefly_synth/oscillator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/firefly_synth/firefly_synth/oscillator.cpp b/src/firefly_synth/firefly_synth/oscillator.cpp index b8b9b3669..6d865f5bf 100644 --- a/src/firefly_synth/firefly_synth/oscillator.cpp +++ b/src/firefly_synth/firefly_synth/oscillator.cpp @@ -432,7 +432,7 @@ osc_topo(int section, gui_position const& pos) make_param_gui_single(section_sync_uni, gui_edit_type::knob, { 1, 2 }, make_label(gui_label_contents::name, gui_label_align::left, gui_label_justify::near)))); uni_dtn.gui.bindings.enabled.bind_params({ param_type, param_uni_voices }, [](auto const& vs) { return can_do_pitch(vs[0]) && vs[1] > 1; }); - uni_dtn.info.description = "Detune unison voices. Only applicable to Basic and DSF generators."; + uni_dtn.info.description = "Detune unison voices. Only applicable to Basic, KPS and DSF generators."; auto& uni_phase = result.params.emplace_back(make_param( make_topo_info("{8F1098B6-64F9-407E-A8A3-8C3637D59A26}", true, "Unison Phase", "Phs", "Uni Phase", param_uni_phase, 1), make_param_dsp_accurate(param_automate::modulate), make_domain_percentage_identity(0.5, 0, true), From 987d7fdc72ac42cd7a62ed19d36d2883939f93cf Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 22 Oct 2024 19:44:29 +0200 Subject: [PATCH 55/61] add another test --- .../arp_test_with_envelope_cv_mod.rpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename demos/{bugs/this_produces_clicks.rpp => demo/arp_test_with_envelope_cv_mod.rpp} (100%) diff --git a/demos/bugs/this_produces_clicks.rpp b/demos/demo/arp_test_with_envelope_cv_mod.rpp similarity index 100% rename from demos/bugs/this_produces_clicks.rpp rename to demos/demo/arp_test_with_envelope_cv_mod.rpp From d7b4ac746b60dec4cdd16bf7058b2fa9ef663547 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 22 Oct 2024 20:25:56 +0200 Subject: [PATCH 56/61] add more test --- .../glfo_snap_test_flstudio_vst3.flp | Bin 0 -> 458790 bytes .../host_test/glfo_snap_test_reaper_clap.rpp | 4196 +++++++++++++++++ .../host_test/glfo_snap_test_reaper_vst3.rpp | 3487 ++++++++++++++ .../glfo_snap_test_renoise_vst3.rpp.xrns | Bin 0 -> 29272 bytes param_reference.html | 144 +- 5 files changed, 7687 insertions(+), 140 deletions(-) create mode 100644 demos/host_test/glfo_snap_test_flstudio_vst3/glfo_snap_test_flstudio_vst3.flp create mode 100644 demos/host_test/glfo_snap_test_reaper_clap.rpp create mode 100644 demos/host_test/glfo_snap_test_reaper_vst3.rpp create mode 100644 demos/host_test/glfo_snap_test_renoise_vst3.rpp.xrns diff --git a/demos/host_test/glfo_snap_test_flstudio_vst3/glfo_snap_test_flstudio_vst3.flp b/demos/host_test/glfo_snap_test_flstudio_vst3/glfo_snap_test_flstudio_vst3.flp new file mode 100644 index 0000000000000000000000000000000000000000..1424769325952a6be01718436ea6d622984f30b6 GIT binary patch literal 458790 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 CmNW1G literal 0 HcmV?d00001 diff --git a/demos/host_test/glfo_snap_test_reaper_clap.rpp b/demos/host_test/glfo_snap_test_reaper_clap.rpp new file mode 100644 index 000000000..4788eb2f8 --- /dev/null +++ b/demos/host_test/glfo_snap_test_reaper_clap.rpp @@ -0,0 +1,4196 @@ + + RIPPLE 0 + GROUPOVERRIDE 0 0 0 + AUTOXFADE 129 + ENVATTACH 3 + POOLEDENVATTACH 0 + MIXERUIFLAGS 11 48 + ENVFADESZ10 40 + PEAKGAIN 1 + FEEDBACK 0 + PANLAW 1 + PROJOFFS 0 0 0 + MAXPROJLEN 0 0 + GRID 3199 8 1 8 1 0 0 0 + TIMEMODE 1 5 -1 30 0 0 -1 + VIDEO_CONFIG 0 0 256 + PANMODE 3 + PANLAWFLAGS 3 + CURSOR 6 + ZOOM 100 0 0 + VZOOMEX 6 0 + USE_REC_CFG 0 + RECMODE 1 + SMPTESYNC 0 30 100 40 1000 300 0 0 1 0 0 + LOOP 1 + LOOPGRAN 0 4 + RECORD_PATH "Media" "" + + + RENDER_FILE "" + RENDER_PATTERN "" + RENDER_FMT 0 2 0 + RENDER_1X 0 + RENDER_RANGE 1 0 0 18 1000 + RENDER_RESAMPLE 3 0 1 + RENDER_ADDTOPROJ 0 + RENDER_STEMS 0 + RENDER_DITHER 0 + TIMELOCKMODE 1 + TEMPOENVLOCKMODE 1 + ITEMMIX 1 + DEFPITCHMODE 589824 0 + TAKELANE 1 + SAMPLERATE 44100 0 0 + + LOCK 1 + + GLOBAL_AUTO -1 + TEMPO 120 4 4 + PLAYRATE 1 0 0.25 4 + SELECTION 0 0 + SELECTION2 0 0 + MASTERAUTOMODE 0 + MASTERTRACKHEIGHT 0 0 + MASTERPEAKCOL 16576 + MASTERMUTESOLO 0 + MASTERTRACKVIEW 0 0.6667 0.5 0.5 0 0 0 0 0 0 0 0 0 0 + MASTERHWOUT 0 0 1 0 0 0 0 -1 + MASTER_NCH 2 2 + MASTER_VOLUME 1 0 -1 -1 1 + MASTER_PANMODE 3 + MASTER_PANLAWFLAGS 3 + MASTER_FX 1 + MASTER_SEL 0 + + + + + > + FLOATPOS 0 0 0 0 + FXID {602FA75C-F5BE-4F3D-AA01-848FD0384D2F} + WAK 0 0 + > + + > + > +> diff --git a/demos/host_test/glfo_snap_test_reaper_vst3.rpp b/demos/host_test/glfo_snap_test_reaper_vst3.rpp new file mode 100644 index 000000000..fc5c5f155 --- /dev/null +++ b/demos/host_test/glfo_snap_test_reaper_vst3.rpp @@ -0,0 +1,3487 @@ + + RIPPLE 0 + GROUPOVERRIDE 0 0 0 + AUTOXFADE 1 + ENVATTACH 3 + POOLEDENVATTACH 0 + MIXERUIFLAGS 11 48 + ENVFADESZ10 40 + PEAKGAIN 1 + FEEDBACK 0 + PANLAW 1 + PROJOFFS 0 0 0 + MAXPROJLEN 0 0 + GRID 3199 8 1 8 1 0 0 0 + TIMEMODE 1 5 -1 30 0 0 -1 + VIDEO_CONFIG 0 0 256 + PANMODE 3 + PANLAWFLAGS 3 + CURSOR 7 + ZOOM 100 0 0 + VZOOMEX 6 0 + USE_REC_CFG 0 + RECMODE 1 + SMPTESYNC 0 30 100 40 1000 300 0 0 1 0 0 + LOOP 1 + LOOPGRAN 0 4 + RECORD_PATH "Media" "" + + + RENDER_FILE "" + RENDER_PATTERN "" + RENDER_FMT 0 2 0 + RENDER_1X 0 + RENDER_RANGE 1 0 0 18 1000 + RENDER_RESAMPLE 3 0 1 + RENDER_ADDTOPROJ 0 + RENDER_STEMS 0 + RENDER_DITHER 0 + TIMELOCKMODE 1 + TEMPOENVLOCKMODE 1 + ITEMMIX 1 + DEFPITCHMODE 589824 0 + TAKELANE 1 + SAMPLERATE 44100 0 0 + + LOCK 1 + + GLOBAL_AUTO -1 + TEMPO 120 4 4 + PLAYRATE 1 0 0.25 4 + SELECTION 0 0 + SELECTION2 0 0 + MASTERAUTOMODE 0 + MASTERTRACKHEIGHT 0 0 + MASTERPEAKCOL 16576 + MASTERMUTESOLO 0 + MASTERTRACKVIEW 0 0.6667 0.5 0.5 0 0 0 0 0 0 0 0 0 0 + MASTERHWOUT 0 0 1 0 0 0 0 -1 + MASTER_NCH 2 2 + MASTER_VOLUME 1 0 -1 -1 1 + MASTER_PANMODE 3 + MASTER_PANLAWFLAGS 3 + MASTER_FX 1 + MASTER_SEL 0 + + + + + FLOATPOS 0 0 0 0 + FXID {6BE7C2AD-4D04-45B5-99F2-E7FFF1D6A508} + WAK 0 0 + > + + > + > +> diff --git a/demos/host_test/glfo_snap_test_renoise_vst3.rpp.xrns b/demos/host_test/glfo_snap_test_renoise_vst3.rpp.xrns new file mode 100644 index 0000000000000000000000000000000000000000..5401993094dc3a28e9a03dde116228f8a14e6e07 GIT binary patch literal 29272 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 z

%gVtLC~4YUiy(s3-`0B!gq^w9xQ|-xduW{4TRL5 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

- + @@ -3070,142 +3070,6 @@

Osc

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3288,7 +3152,7 @@

Osc

- + @@ -3305,7 +3169,7 @@

Osc

- + @@ -3322,7 +3186,7 @@

Osc

- + From dd965ea9c8f41b434997f755dafc207105c49211 Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Tue, 22 Oct 2024 20:47:02 +0200 Subject: [PATCH 57/61] add more test --- .../glfo_snap_test_bitwig_clap/.bitwig-project | 0 .../glfo_snap_test_bitwig_clap.bwproject | Bin 0 -> 46271 bytes .../glfo_snap_test_bitwig_vst3/.bitwig-project | 0 .../glfo_snap_test_bitwig_vst3.bwproject | Bin 0 -> 45821 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 demos/host_test/glfo_snap_test_bitwig_clap/.bitwig-project create mode 100644 demos/host_test/glfo_snap_test_bitwig_clap/glfo_snap_test_bitwig_clap.bwproject create mode 100644 demos/host_test/glfo_snap_test_bitwig_vst3/.bitwig-project create mode 100644 demos/host_test/glfo_snap_test_bitwig_vst3/glfo_snap_test_bitwig_vst3.bwproject diff --git a/demos/host_test/glfo_snap_test_bitwig_clap/.bitwig-project b/demos/host_test/glfo_snap_test_bitwig_clap/.bitwig-project new file mode 100644 index 000000000..e69de29bb diff --git a/demos/host_test/glfo_snap_test_bitwig_clap/glfo_snap_test_bitwig_clap.bwproject b/demos/host_test/glfo_snap_test_bitwig_clap/glfo_snap_test_bitwig_clap.bwproject new file mode 100644 index 0000000000000000000000000000000000000000..e1188069301625c8c7dd9d4419e34b619b074d0e GIT binary patch literal 46271 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 U*#jO10))UFeGFE>(_a`E0MkhStpET3 literal 0 HcmV?d00001 diff --git a/demos/host_test/glfo_snap_test_bitwig_vst3/.bitwig-project b/demos/host_test/glfo_snap_test_bitwig_vst3/.bitwig-project new file mode 100644 index 000000000..e69de29bb diff --git a/demos/host_test/glfo_snap_test_bitwig_vst3/glfo_snap_test_bitwig_vst3.bwproject b/demos/host_test/glfo_snap_test_bitwig_vst3/glfo_snap_test_bitwig_vst3.bwproject new file mode 100644 index 0000000000000000000000000000000000000000..138d91516bbda93dbfa0d7668fbfa966cc79fe16 GIT binary patch literal 45821 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 Date: Tue, 22 Oct 2024 20:54:32 +0200 Subject: [PATCH 58/61] todo fix this some day --- .../automation_test_flstudio_vst3.flp | Bin 388972 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 demos/host_test/automation_test_flstudio_vst3/automation_test_flstudio_vst3.flp diff --git a/demos/host_test/automation_test_flstudio_vst3/automation_test_flstudio_vst3.flp b/demos/host_test/automation_test_flstudio_vst3/automation_test_flstudio_vst3.flp deleted file mode 100644 index 802db6886f5ac42d91ffbc0963650a138ec0f8b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388972 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 From dd6155c546ea848cff038e8d7092779ffb13617d Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Wed, 23 Oct 2024 00:02:49 +0200 Subject: [PATCH 59/61] changelog --- changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index b75712bc0..0cb2631ef 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,4 @@ -?, ? - V1.9.6. +### October 23, 2024 - V1.9.6. - Fixed a couple of outdated parameter descriptions. - Show parameter descriptions (from reference document) in tooltips. From 21b945f5e7625d0cfdaf83b72162a5563ad4214e Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Wed, 23 Oct 2024 00:08:06 +0200 Subject: [PATCH 60/61] stuff --- todo.txt | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/todo.txt b/todo.txt index 6433ef4d7..902935047 100644 --- a/todo.txt +++ b/todo.txt @@ -26,18 +26,8 @@ autobuilds: * ask paul * integrate https://github.com/surge-synthesizer/monique-monosynth/blob/main/.github/workflows/build-pr.yml -small stuff: -V do the description on tooltip -V fix the descriptions they are out of date -X do the conversion for snapping ==> missing = off -X global unit lfo phase offset not plot good -V do glfo in project time samples (can do now bc all is phased!) -V do snap for clap - -update the routing graph for arp -do global snap docs? -fix the bug demos make a patch cleanup button +update the routing graph for arp ditch after-mod, claim micro support ? arp new note = reset table pos yes/no? From 67920ad9695b15cf54a81a7871dbb5dc8a2e445c Mon Sep 17 00:00:00 2001 From: sjoerdvankreel Date: Wed, 23 Oct 2024 00:09:44 +0200 Subject: [PATCH 61/61] stuffstuff --- todo.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/todo.txt b/todo.txt index 902935047..925e00589 100644 --- a/todo.txt +++ b/todo.txt @@ -14,10 +14,11 @@ on release: 8 update the history 9 check if need update github social preview 10 mail to self -11 dont forget to tag -12 make a github release -13 update kvr -14 update the website (vimexx) +11 merge back +12 dont forget to tag +13 make a github release +14 update kvr +15 update the website (vimexx) microtuning: * check up on andreyas comments
N/A
Detune unison voices. Only applicable to Basic, DSF and KPS generators.Detune unison voices. Only applicable to Basic and DSF generators.
Unison PhaseN/A
Detune unison voices. Only applicable to Basic and DSF generators.Detune unison voices. Only applicable to Basic, DSF and KPS generators.
Unison PhaseSquare generator pulse width.
Combi Wave 1CombiYesPatch1InputVoiceAutomateSinSqrSinN/A
Selects the base waveform.
Combi Skew X 1CombiYesPatch1InputAccurateModulate0.00 %100.00 %0.00 %N/A
Wave 1 skew X amount.
Combi Skew Y 1CombiYesPatch1InputAccurateModulate0.00 %100.00 %0.00 %N/A
Wave 1 skew Y amount.
Combi FreqCombiYesPatch1InputAccurateModulate1.0032.002.00N/A
Controls wave 2 frequency.
Combi Wave 2CombiYesPatch1InputVoiceAutomateSinSqrSinN/A
Selects the overlay waveform.
Combi Skew X 2CombiYesPatch1InputAccurateModulate0.00 %100.00 %0.00 %N/A
Wave 2 skew X amount.
Combi Skew Y 2CombiYesPatch1InputAccurateModulate0.00 %100.00 %0.00 %N/A
Wave 2 skew Y amount.
Combi MixCombiYesPatch1InputAccurateModulate0.00 %100.00 %50.00 %N/A
Controls the overlay mix amount.
DSF Partials DSF Yes10.0 %
On-voice-init step count for static noise and initial-excite stage of Karplus-Strong. Modulation takes place only at voice start.On-voice-init step count for static noise and initial-excite stage of Karplus-Strong.
Random Filter Freq1000 Hz
Continuous filter frequency for static noise or initial-excite filter frequency for Karplus-Strong. Modulation takes place only at voice start.Continuous filter frequency for static noise or voice-initial-excite filter frequency for Karplus-Strong.
Random Filter ResoN/A
Continuous filter resonance for static noise or initial-excite filter resonance for Karplus-Strong. Modulation takes place only at voice start.Continuous filter resonance for static noise or voice-initial-excite filter resonance for Karplus-Strong.
Rnd SeedN/A
Detune unison voices. Only applicable to Basic, DSF and KPS generators.Detune unison voices. Only applicable to Basic, KPS and DSF generators.
Unison PhaseSquare generator pulse width.
Combi Wave 1CombiYesPatch1InputVoiceAutomateSinSqrSinN/A
Selects the base waveform.
Combi Skew X 1CombiYesPatch1InputAccurateModulate0.00 %100.00 %0.00 %N/A
Wave 1 skew X amount.
Combi Skew Y 1CombiYesPatch1InputAccurateModulate0.00 %100.00 %0.00 %N/A
Wave 1 skew Y amount.
Combi FreqCombiYesPatch1InputAccurateModulate1.0032.002.00N/A
Controls wave 2 frequency.
Combi Wave 2CombiYesPatch1InputVoiceAutomateSinSqrSinN/A
Selects the overlay waveform.
Combi Skew X 2CombiYesPatch1InputAccurateModulate0.00 %100.00 %0.00 %N/A
Wave 2 skew X amount.
Combi Skew Y 2CombiYesPatch1InputAccurateModulate0.00 %100.00 %0.00 %N/A
Wave 2 skew Y amount.
Combi MixCombiYesPatch1InputAccurateModulate0.00 %100.00 %50.00 %N/A
Controls the overlay mix amount.
DSF Partials DSF Yes10.0 %
On-voice-init step count for static noise and initial-excite stage of Karplus-Strong.On-voice-init step count for static noise and initial-excite stage of Karplus-Strong. Modulation takes place only at voice start.
Random Filter Freq1000 Hz
Continuous filter frequency for static noise or voice-initial-excite filter frequency for Karplus-Strong.Continuous filter frequency for static noise or initial-excite filter frequency for Karplus-Strong. Modulation takes place only at voice start.
Random Filter ResoN/A
Continuous filter resonance for static noise or voice-initial-excite filter resonance for Karplus-Strong.Continuous filter resonance for static noise or initial-excite filter resonance for Karplus-Strong. Modulation takes place only at voice start.
Rnd Seed