Skip to content

Commit

Permalink
Merge branch 'v1.8.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
sjoerdvankreel committed Jul 6, 2024
2 parents a74e507 + 5f21a0c commit a9b54b3
Show file tree
Hide file tree
Showing 27 changed files with 46,911 additions and 138 deletions.
26 changes: 13 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,18 @@ See below for some built-in themes.
MacOS: if you get a warning like "archive damaged" or "failed to open" etc, it's probably this:
[https://syntheway.com/fix-au-vst-vst3-macos.htm](https://syntheway.com/fix-au-vst-vst3-macos.htm)

- Mac VST3: [firefly_synth_1.8.0_mac_vst3_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_mac_vst3_instrument.zip)
- Mac VST3 Fx: [firefly_synth_1.8.0_mac_vst3_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_mac_vst3_fx.zip)
- Mac CLAP: [firefly_synth_1.8.0_mac_clap_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_mac_clap_instrument.zip)
- Mac CLAP Fx: [firefly_synth_1.8.0_mac_clap_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_mac_clap_fx.zip)
- Linux VST3: [firefly_synth_1.8.0_linux_vst3_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_linux_vst3_instrument.zip)
- Linux VST3 Fx: [release/firefly_synth_1.8.0_linux_vst3_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_linux_vst3_fx.zip)
- Linux CLAP: [firefly_synth_1.8.0_linux_clap_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_linux_clap_instrument.zip)
- Linux CLAP Fx: [firefly_synth_1.8.0_linux_clap_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_linux_clap_fx.zip)
- Windows VST3: [firefly_synth_1.8.0_windows_vst3_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_windows_vst3_instrument.zip)
- Windows VST3 Fx: [firefly_synth_1.8.0_windows_vst3_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_windows_vst3_fx.zip)
- Windows CLAP: [firefly_synth_1.8.0_windows_clap_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_windows_clap_instrument.zip)
- Windows CLAP Fx: [firefly_synth_1.8.0_windows_clap_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.0_windows_clap_fx.zip)
- Mac VST3: [firefly_synth_1.8.1_mac_vst3_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_mac_vst3_instrument.zip)
- Mac VST3 Fx: [firefly_synth_1.8.1_mac_vst3_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_mac_vst3_fx.zip)
- Mac CLAP: [firefly_synth_1.8.1_mac_clap_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_mac_clap_instrument.zip)
- Mac CLAP Fx: [firefly_synth_1.8.1_mac_clap_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_mac_clap_fx.zip)
- Linux VST3: [firefly_synth_1.8.1_linux_vst3_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_linux_vst3_instrument.zip)
- Linux VST3 Fx: [release/firefly_synth_1.8.1_linux_vst3_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_linux_vst3_fx.zip)
- Linux CLAP: [firefly_synth_1.8.1_linux_clap_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_linux_clap_instrument.zip)
- Linux CLAP Fx: [firefly_synth_1.8.1_linux_clap_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_linux_clap_fx.zip)
- Windows VST3: [firefly_synth_1.8.1_windows_vst3_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_windows_vst3_instrument.zip)
- Windows VST3 Fx: [firefly_synth_1.8.1_windows_vst3_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_windows_vst3_fx.zip)
- Windows CLAP: [firefly_synth_1.8.1_windows_clap_instrument.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_windows_clap_instrument.zip)
- Windows CLAP Fx: [firefly_synth_1.8.1_windows_clap_fx.zip](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/release/firefly_synth_1.8.1_windows_clap_fx.zip)

# Install
Extract the zipped folder and copy/replace it (the entire folder, not just the .dll/.so/.dylib!) to your VST3/CLAP folder:
Expand Down Expand Up @@ -88,7 +88,7 @@ Demo tunes:
- Demo track 2: [demo_track_2.mp3](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/render/demo_track_2.mp3)
- Demo track 3: [demo_track_3.mp3](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/render/demo_track_3.mp3)
- Fun with rave synth (Rave Synth Preset + Big Pad 2 Preset): [fun_with_rave_synth.mp3](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/render/fun_with_rave_synth.mp3)
- Look ma, all FM and no filters (TODO make these presets): [look_ma_all_fm_and_no_filters.mp3](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/render/look_ma_all_fm_and_no_filters.mp3)
- Look ma, all FM and no filters (FM Bass Preset + FM Clap + FM FX + FM Bells 2/3): [look_ma_all_fm_and_no_filters.mp3](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/render/look_ma_all_fm_and_no_filters.mp3)
- Renoise test (sort of trance melody hard edit) (Rave Synth Preset): [renoise_test_sort_of_trance_melody_hard_edit.mp3](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/render/renoise_test_sort_of_trance_melody_hard_edit.mp3)
- Renoise test (sort of goa trance) (Trance Pad 2 Preset + Goa Bass Preset + Some more): [renoise_test_sort_of_goa_trance.mp3](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/render/renoise_test_sort_of_goa_trance.mp3)
- Downtempo ambient psy (Bass 3 Preset + Closed Hat 3 + Distorted Bells 2 + FM Bells + Kick 6 + Open Hat 3): [downtempo_ambient_psy.mp3](https://github.com/sjoerdvankreel/firefly-synth-storage/raw/main/render/downtempo_ambient_psy.mp3)
Expand Down
6 changes: 6 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
### July 6, 2024 - V1.8.1.

- Add some presets.
- Add another demo tune to go with it.
- Split oscillator AM/FM gui to separate tabs.

### July 1, 2024 - V1.8.0.

- Added logging.
Expand Down
4 changes: 2 additions & 2 deletions macos/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.8.0</string>
<string>1.8.1</string>
<key>CFBundleVersion</key>
<string>1.8.0</string>
<string>1.8.1</string>
<key>NSHumanReadableCopyright</key>
<string></string>
<key>NSHighResolutionCapable</key>
Expand Down
48 changes: 24 additions & 24 deletions param_reference.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<html>
<head>
<title>Firefly Synth 1.8.0</title>
<title>Firefly Synth 1.8.1</title>
<style>th, td { padding: 3px; }a, a:visited { color: #666666; }.description { background:#EEEEEE; }h1 { font-size: 19px; color: black; }h2 { font-size: 17px; color: black; }h3 { font-size: 15px; color: black; }body { font-family: Verdana; color: black; }html { position: relative; max-width: 1024px; margin: auto; }tr td { width: auto; white-space: nowrap; } tr th { width: auto; white-space: nowrap; }table, th, td { font-size: 13px; border: 1px solid gray; border-collapse: collapse; text-align: left; }tr td:last-child { width: 100%; white-space: wrap; } tr th:last-child { width: 100%; white-space: wrap; }</style>
</head>
<body>
<h1>Firefly Synth 1.8.0</h1>
<h1>Firefly Synth 1.8.1</h1>
<h2>Module Overview</h2>
<table>
<tr>
Expand Down Expand Up @@ -2020,7 +2020,7 @@ <h3>Osc Mod</h3>
<th>Log Midpoint</th>
</tr>
<tr>
<td rowspan='2'>AM</td>
<td rowspan='2'>AM On</td>
<td>AM</td>
<td>Yes</td>
<td>8</td>
Expand All @@ -2036,39 +2036,39 @@ <h3>Osc Mod</h3>
<td colspan='11' class='description'>Toggles AM routing on/off.</td>
</tr>
<tr>
<td rowspan='2'>Source</td>
<td rowspan='2'>AM Src</td>
<td>AM</td>
<td>Yes</td>
<td>8</td>
<td>Input</td>
<td>Voice</td>
<td>Automate</td>
<td>Osc 1</td>
<td>Osc 5</td>
<td>Osc 1</td>
<td>1</td>
<td>5</td>
<td>1</td>
<td>N/A</td>
</tr>
<tr>
<td colspan='11' class='description'>Selects AM routing source. Note that you can only route 'upwards', so not Osc2->Osc1. However self-modulation is possible.</td>
</tr>
<tr>
<td rowspan='2'>Target</td>
<td rowspan='2'>AM Tgt</td>
<td>AM</td>
<td>Yes</td>
<td>8</td>
<td>Input</td>
<td>Voice</td>
<td>Automate</td>
<td>Osc 1</td>
<td>Osc 5</td>
<td>Osc 2</td>
<td>1</td>
<td>5</td>
<td>2</td>
<td>N/A</td>
</tr>
<tr>
<td colspan='11' class='description'>Selects AM routing target.</td>
</tr>
<tr>
<td rowspan='2'>Mix</td>
<td rowspan='2'>AM Mix</td>
<td>AM</td>
<td>Yes</td>
<td>8</td>
Expand All @@ -2084,7 +2084,7 @@ <h3>Osc Mod</h3>
<td colspan='11' class='description'>Dry/wet control between unmodulated and modulated signal.</td>
</tr>
<tr>
<td rowspan='2'>Ring</td>
<td rowspan='2'>AM Ring</td>
<td>AM</td>
<td>Yes</td>
<td>8</td>
Expand All @@ -2100,7 +2100,7 @@ <h3>Osc Mod</h3>
<td colspan='11' class='description'>Dry/wet control between amplitude-modulated and ring-modulated signal.</td>
</tr>
<tr>
<td rowspan='2'>FM</td>
<td rowspan='2'>FM On</td>
<td>FM</td>
<td>Yes</td>
<td>8</td>
Expand All @@ -2116,39 +2116,39 @@ <h3>Osc Mod</h3>
<td colspan='11' class='description'>Toggles FM routing on/off.</td>
</tr>
<tr>
<td rowspan='2'>Source</td>
<td rowspan='2'>FM Src</td>
<td>FM</td>
<td>Yes</td>
<td>8</td>
<td>Input</td>
<td>Voice</td>
<td>Automate</td>
<td>Osc 1</td>
<td>Osc 5</td>
<td>Osc 1</td>
<td>1</td>
<td>5</td>
<td>1</td>
<td>N/A</td>
</tr>
<tr>
<td colspan='11' class='description'>Selects FM routing source. Note that you can only route 'upwards', so not Osc2->Osc1. Self-modulation is not possible (AKA, feedback-FM not implemented).</td>
</tr>
<tr>
<td rowspan='2'>Target</td>
<td rowspan='2'>FM Tgt</td>
<td>FM</td>
<td>Yes</td>
<td>8</td>
<td>Input</td>
<td>Voice</td>
<td>Automate</td>
<td>Osc 1</td>
<td>Osc 5</td>
<td>Osc 2</td>
<td>1</td>
<td>5</td>
<td>2</td>
<td>N/A</td>
</tr>
<tr>
<td colspan='11' class='description'>Selects FM routing target.</td>
</tr>
<tr>
<td rowspan='2'>Mode</td>
<td rowspan='2'>FM Mode</td>
<td>FM</td>
<td>Yes</td>
<td>8</td>
Expand All @@ -2164,7 +2164,7 @@ <h3>Osc Mod</h3>
<td colspan='11' class='description'>Selects unipolar/bipolar mode. Bipolar causes the target Osc's phase to travel both forward and backward and is apparently referred to as through-zero FM.</td>
</tr>
<tr>
<td rowspan='2'>Index</td>
<td rowspan='2'>FM Index</td>
<td>FM</td>
<td>Yes</td>
<td>8</td>
Expand Down
67 changes: 50 additions & 17 deletions plugin_base/src/plugin_base/plugin_base/gui/gui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -563,19 +563,26 @@ plugin_gui::get_module_graph_engine(module_topo const& module)
return _module_graph_engines[module.info.index].get();
}

// NOTE! This only applies to
// 1) Multi-slot modules or
// 2) Tabbed module sections.
// It is NOT used for modules with multiple parameter sections on different tabs.
// I.e., stuff only "happens" (repaint graphs, store tab index etc)
// when either an active module or an active module slot changes.
// So far there's just no need to track "what-happens-within-a-single-module-instance" other than parameter changes.
void
plugin_gui::init_multi_tab_component(tab_component& tab, std::string const& id, int module_index, int section_index)
{
assert((module_index == -1) != (section_index == -1));
tab.tab_changed = [this, id, module_index, section_index](int tab_index) {
tab.tab_changed = [this, id, module_index, section_index](int tab_index) {
set_extra_state_num(id, extra_state_tab_index, tab_index);
if(module_index != -1)
for(int i = 0; i < _tab_selection_listeners.size(); i++)
if (module_index != -1)
for (int i = 0; i < _tab_selection_listeners.size(); i++)
_tab_selection_listeners[i]->module_tab_changed(module_index, tab_index);
if (section_index != -1)
for (int i = 0; i < _tab_selection_listeners.size(); i++)
_tab_selection_listeners[i]->section_tab_changed(section_index, tab_index);
};
};
tab.setCurrentTabIndex(std::clamp((int)get_extra_state_num(id, extra_state_tab_index, 0), 0, tab.getNumTabs() - 1));
set_extra_state_num(id, extra_state_tab_index, tab.getCurrentTabIndex());
}
Expand Down Expand Up @@ -660,25 +667,50 @@ plugin_gui::add_component_tab(TabbedComponent& tc, Component& child, int module,
Component&
plugin_gui::make_modules(module_desc const* slots)
{
int index = slots[0].module->info.index;
auto const& tag = slots[0].module->info.tag;
auto& result = make_tab_component(tag.id, tag.display_name, index);
for (int i = 0; i < slots[0].module->info.slot_count; i++)
add_component_tab(result, make_param_sections(slots[i]), slots[i].info.global, std::to_string(i + 1));
if(slots[0].module->info.slot_count > 1)
init_multi_tab_component(result, tag.id, index, -1);
return result;
auto const& topo = *slots[0].module;
if (!topo.gui.tabbed)
{
int index = topo.info.index;
auto const& tag = topo.info.tag;
auto& result = make_tab_component(tag.id, tag.display_name, index);
for (int i = 0; i < topo.info.slot_count; i++)
add_component_tab(result, make_param_sections(slots[i]), slots[i].info.global, std::to_string(i + 1));
if (topo.info.slot_count > 1)
init_multi_tab_component(result, tag.id, index, -1);
return result;
}
else
{
// tabbed param sections in multi-slot modules not supported
assert(topo.info.slot_count == 1);
return make_param_sections(slots[0]);
}
}

Component&
plugin_gui::make_param_sections(module_desc const& module)
{
auto const& topo = *module.module;
auto& result = make_component<grid_component>(topo.gui.dimension, margin_vsection, 0, topo.gui.autofit_row, topo.gui.autofit_column);
for (int s = 0; s < topo.sections.size(); s++)
result.add(make_param_section(module, topo.sections[s], topo.sections[s].gui.position.column == 0), topo.sections[s].gui.position);
add_hover_listener(result, gui_hover_type::module, module.info.global);
return result;
if (!topo.gui.tabbed)
{
auto& result = make_component<grid_component>(topo.gui.dimension, margin_vsection, 0, topo.gui.autofit_row, topo.gui.autofit_column);
for (int s = 0; s < topo.sections.size(); s++)
result.add(make_param_section(module, topo.sections[s], topo.sections[s].gui.position.column == 0), topo.sections[s].gui.position);
add_hover_listener(result, gui_hover_type::module, module.info.global);
return result;
}
else
{
// need this to be 1 because we dont support multi-slot components with inner tabs
assert(topo.info.slot_count == 1);
auto& tabs = make_tab_component(topo.info.tag.id, topo.info.tag.display_name, topo.info.index);
for (int o = 0; o < topo.gui.tab_order.size(); o++)
{
auto const& section = topo.sections[topo.gui.tab_order[o]];
add_component_tab(tabs, make_param_section(module, section, false), module.info.global, section.tag.display_name);
}
return tabs;
}
}

Component&
Expand Down Expand Up @@ -714,6 +746,7 @@ plugin_gui::make_multi_param(module_desc const& module, param_desc const* slots)
if (param->gui.tabular)
{
std::string display_name = param->info.tag.display_name;
if (!param->info.tag.tabular_display_name.empty()) display_name = param->info.tag.tabular_display_name;
auto colors = _lnf->module_gui_colors(module.module->info.tag.full_name);
auto& header = make_component<autofit_label>(module_lnf(module.module->info.index), display_name, false, -1, true);
header.setText(display_name, dontSendNotification);
Expand Down
18 changes: 10 additions & 8 deletions plugin_base/src/plugin_base/plugin_base/helpers/matrix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@ make_id(std::string const& id, int slot)
}

static std::string
make_name(topo_tag const& tag, int slot, int slots)
make_name(topo_tag const& tag, int slot, int slots, bool prefix_with_display_name)
{
std::string display_index = std::to_string(slot + (tag.name_one_based ? 1 : 0));
if (!prefix_with_display_name) return display_index;
std::string result = tag.menu_display_name;
if(slots > 1) result += " " + std::to_string(slot + (tag.name_one_based? 1: 0));
if(slots > 1) result += " " + display_index;
return result;
}

Expand Down Expand Up @@ -121,7 +123,7 @@ matrix_param_menu_handler::execute(
}

routing_matrix<module_topo_mapping>
make_audio_matrix(std::vector<module_topo const*> const& modules, int start_slot)
make_audio_matrix(std::vector<module_topo const*> const& modules, int start_slot, bool prefix_with_display_name)
{
int index = 0;
routing_matrix<module_topo_mapping> result;
Expand All @@ -135,15 +137,15 @@ make_audio_matrix(std::vector<module_topo const*> const& modules, int start_slot
{
result.submenu->indices.push_back(index++);
result.mappings.push_back({ modules[m]->info.index, 0 });
result.items.push_back({ make_id(tag.id, 0), make_name(tag, 0, slots) });
result.items.push_back({ make_id(tag.id, 0), make_name(tag, 0, slots, prefix_with_display_name) });
} else
{
auto module_submenu = result.submenu->add_submenu(tag.display_name);
for (int mi = start_slot; mi < slots; mi++)
{
module_submenu->indices.push_back(index++);
result.mappings.push_back({ modules[m]->info.index, mi });
result.items.push_back({ make_id(tag.id, mi), make_name(tag, mi, slots) });
result.items.push_back({ make_id(tag.id, mi), make_name(tag, mi, slots, prefix_with_display_name) });
}
}
}
Expand Down Expand Up @@ -181,7 +183,7 @@ make_cv_source_matrix(std::vector<cv_source_entry> const& entries)
result.mappings.push_back({ module->info.index, mi, 0, 0 });
result.items.push_back({
make_id(module_tag.id, mi, output.info.tag.id, 0),
make_name(module_tag, mi, module_slots) });
make_name(module_tag, mi, module_slots, true) });
}
} else if (module->dsp.outputs.size() == 1 && module->dsp.outputs[0].info.slot_count == 1)
{
Expand All @@ -191,7 +193,7 @@ make_cv_source_matrix(std::vector<cv_source_entry> const& entries)
result.mappings.push_back({ module->info.index, 0, 0, 0 });
result.items.push_back({
make_id(module_tag.id, 0, output.info.tag.id, 0),
make_name(module_tag, 0, 1) });
make_name(module_tag, 0, 1, true) });
}
else
{
Expand Down Expand Up @@ -247,7 +249,7 @@ make_cv_target_matrix(std::vector<module_topo const*> const& modules)
for (int mi = 0; mi < module_info.slot_count; mi++)
{
auto module_slot_submenu = module_submenu->add_submenu(
make_name(module_info.tag, mi, module_info.slot_count));
make_name(module_info.tag, mi, module_info.slot_count, true));
for (int p = 0; p < modules[m]->params.size(); p++)
if (modules[m]->params[p].dsp.can_modulate(mi))
{
Expand Down
2 changes: 1 addition & 1 deletion plugin_base/src/plugin_base/plugin_base/helpers/matrix.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ routing_matrix<param_topo_mapping>
make_cv_target_matrix(std::vector<module_topo const*> const& modules);
// any audio module as a source or target
routing_matrix<module_topo_mapping>
make_audio_matrix(std::vector<module_topo const*> const& modules, int start_slot);
make_audio_matrix(std::vector<module_topo const*> const& modules, int start_slot, bool prefix_with_display_name);

// allows to manage matrix routes
class matrix_param_menu_handler:
Expand Down
Loading

0 comments on commit a9b54b3

Please sign in to comment.