From 78e8ee80ad654d4702906ce44491103a8428a176 Mon Sep 17 00:00:00 2001 From: Armin Date: Sun, 13 Sep 2026 21:19:49 +0200 Subject: [PATCH] Expand preset bank to 128 categorized presets, shorten sync delays, add menu UI polish and hold-to-repeat nav --- Source/LcdDisplay.cpp | 45 +++- Source/LcdDisplay.h | 4 +- Source/MenuSystem.cpp | 12 + Source/PluginEditor.cpp | 543 ++++++++++++++------------------------- Source/Presets.cpp | 547 +++++++++++++++++++++++++++++++++++++--- Source/SynthEngine.cpp | 12 +- Source/SynthEngine.h | 1 + Source/SynthParams.cpp | 2 +- Source/SynthParams.h | 2 +- tools/gen_buildinfo.sh | 2 +- 10 files changed, 759 insertions(+), 411 deletions(-) diff --git a/Source/LcdDisplay.cpp b/Source/LcdDisplay.cpp index d770522..4fc2f0e 100644 --- a/Source/LcdDisplay.cpp +++ b/Source/LcdDisplay.cpp @@ -11,7 +11,7 @@ constexpr uint8_t kFont[95][8] = {10,10,10,0,0,0,0,0}, // " {0,10,31,10,31,10,0,0}, // # {4,15,20,14,5,30,4,0}, // $ - {2,4,8,16,14,17,14,0}, // % + {3,3,8,4,2,1,24,24}, // % {8,20,20,8,21,18,13,0}, // & {4,4,4,0,0,0,0,0}, // ' {2,4,8,8,8,4,2,0}, // ( @@ -82,7 +82,7 @@ constexpr uint8_t kFont[95][8] = {0,6,0,4,4,4,4,0}, // i {0,6,0,4,4,4,8,0}, // j {0,0,16,18,20,24,20,0}, // k - {0,0,12,4,4,4,4,0}, // l + {0,4,4,4,4,4,4,14}, // l {0,0,26,21,21,21,21,0}, // m {0,0,18,29,17,17,17,0}, // n {0,0,14,17,17,17,14,0}, // o @@ -117,12 +117,21 @@ void LcdDisplay::setLine (int row, const juce::String& s) lines[row] = s; } +void LcdDisplay::setInverted (int row, bool inverted) +{ + if (row >= 0 && row < kRows) + rowInverted[row] = inverted; +} + void LcdDisplay::showCursor (bool show) { cursorVisible = show; } void LcdDisplay::clear() { for (int r = 0; r < kRows; ++r) + { lines[r] = ""; + rowInverted[r] = false; + } cursorCol = 0; cursorRow = 0; cursorVisible = false; @@ -140,10 +149,11 @@ void LcdDisplay::paint (juce::Graphics& g) const float w = (float) getWidth(); const float h = (float) getHeight(); - const juce::Colour bgCol (0xFF0D1A05); - const juce::Colour pixOn (0xFF4AE038); - const juce::Colour pixOnDim (0xFF1E3A12); - const juce::Colour pixOff (0xFF0F1C07); + const juce::Colour bgCol (0xFF000000); + const juce::Colour pixOn (0xFFE2E2E2); + const juce::Colour pixOnDim (0xFF303030); + const juce::Colour pixOff (0xFF0A0A0A); + const juce::Colour pixInvert (0xFF8A8A8A); g.fillAll (bgCol); @@ -173,6 +183,7 @@ void LcdDisplay::paint (juce::Graphics& g) for (int row = 0; row < kRows; ++row) { + const bool inverted = rowInverted[row]; const juce::String& line = lines[row]; for (int col = 0; col < kCols; ++col) { @@ -182,7 +193,7 @@ void LcdDisplay::paint (juce::Graphics& g) float cx = ox + (float) col * cw; float cy = oy + (float) row * ch; - g.setColour (pixOff); + g.setColour (inverted ? pixInvert : pixOff); g.fillRect (cx + 0.5f, cy + 0.5f, cw - 1.0f, ch - 1.0f); float gridX = cx + padX + (gw - cellW * gridW) * 0.5f; @@ -199,16 +210,24 @@ void LcdDisplay::paint (juce::Graphics& g) float px = gridX + (float) gCol * stepX; float py = gridY + (float) gRow * stepY; - g.setColour (pixOnDim); - g.fillRect (px - cellW * 0.10f, py - cellH * 0.05f, - cellW * 1.20f, cellH * 1.10f); - g.setColour (pixOn); - g.fillRect (px, py, cellW, cellH); + if (inverted) + { + g.setColour (pixOff); + g.fillRect (px, py, cellW, cellH); + } + else + { + g.setColour (pixOnDim); + g.fillRect (px - cellW * 0.10f, py - cellH * 0.05f, + cellW * 1.20f, cellH * 1.10f); + g.setColour (pixOn); + g.fillRect (px, py, cellW, cellH); + } } } } - if (blinkOn && col == cursorCol && row == cursorRow) + if (blinkOn && ! inverted && col == cursorCol && row == cursorRow) { g.setColour (pixOn); g.fillRect (cx + padX, cy + ch - padY - ch * 0.22f, cw - padX * 2.0f, ch * 0.18f); diff --git a/Source/LcdDisplay.h b/Source/LcdDisplay.h index 7192352..94a0a6d 100644 --- a/Source/LcdDisplay.h +++ b/Source/LcdDisplay.h @@ -7,11 +7,12 @@ class LcdDisplay : public juce::Component, { public: static constexpr int kCols = 80; - static constexpr int kRows = 4; + static constexpr int kRows = 8; LcdDisplay(); void setLine (int row, const juce::String& s); + void setInverted (int row, bool inverted); void showCursor (bool show); void clear(); void paint (juce::Graphics&) override; @@ -20,6 +21,7 @@ private: void timerCallback() override; juce::String lines[kRows]; + bool rowInverted[kRows]; int cursorCol = 0; int cursorRow = 0; bool cursorVisible = false; diff --git a/Source/MenuSystem.cpp b/Source/MenuSystem.cpp index e4b0e77..cd72d8d 100644 --- a/Source/MenuSystem.cpp +++ b/Source/MenuSystem.cpp @@ -68,6 +68,12 @@ void MenuSystem::up() int newSel = s.selected - 1; while (newSel >= 0 && s.items[(size_t) newSel].kind == MenuItem::Separator) --newSel; + if (newSel < 0) + { + newSel = (int) s.items.size() - 1; + while (newSel >= 0 && s.items[(size_t) newSel].kind == MenuItem::Separator) + --newSel; + } if (newSel >= 0) s.selected = newSel; } @@ -81,6 +87,12 @@ void MenuSystem::down() int newSel = s.selected + 1; while (newSel < (int) s.items.size() && s.items[(size_t) newSel].kind == MenuItem::Separator) ++newSel; + if (newSel >= (int) s.items.size()) + { + newSel = 0; + while (newSel < (int) s.items.size() && s.items[(size_t) newSel].kind == MenuItem::Separator) + ++newSel; + } if (newSel < (int) s.items.size()) s.selected = newSel; } diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index 7dd8495..e2b07cf 100644 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -10,9 +10,9 @@ static juce::String padRight (const juce::String& s, int width) SM26AudioProcessorEditor::SM26AudioProcessorEditor (SM26AudioProcessor& p) : AudioProcessorEditor (p), proc (p) { - setSize (920, 540); + setSize (920, 680); setResizable (true, false); - setResizeLimits (720, 400, 1400, 900); + setResizeLimits (760, 620, 1500, 1300); addAndMakeVisible (lcd); setupKnobs(); @@ -20,7 +20,7 @@ SM26AudioProcessorEditor::SM26AudioProcessorEditor (SM26AudioProcessor& p) footer.setText (buildGitFooter(), juce::dontSendNotification); footer.setJustificationType (juce::Justification::centredLeft); - footer.setColour (juce::Label::textColourId, juce::Colour (0xFF90B080)); + footer.setColour (juce::Label::textColourId, juce::Colour (0xFFA0A0A0)); footer.setFont (juce::Font (juce::FontOptions { juce::Font::getDefaultMonospacedFontName(), 11.0f, juce::Font::plain })); addAndMakeVisible (footer); @@ -48,20 +48,20 @@ void SM26AudioProcessorEditor::setupKnobs() knobSliders[i].setSliderStyle (juce::Slider::RotaryVerticalDrag); knobSliders[i].setTextBoxStyle (juce::Slider::NoTextBox, false, 0, 0); knobSliders[i].setRange (0.0, 1.0, 0.001); - knobSliders[i].setColour (juce::Slider::rotarySliderFillColourId, juce::Colour (0xFF3A8A28)); - knobSliders[i].setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colour (0xFF1A2E0A)); + knobSliders[i].setColour (juce::Slider::rotarySliderFillColourId, juce::Colour (0xFFC8C8C8)); + knobSliders[i].setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colour (0xFF2A2A2A)); knobSliders[i].setColour (juce::Slider::thumbColourId, juce::Colours::transparentBlack); knobSliders[i].addListener (this); addAndMakeVisible (knobSliders[i]); knobLabels[i].setJustificationType (juce::Justification::centred); - knobLabels[i].setColour (juce::Label::textColourId, juce::Colour (0xFF90B080)); - knobLabels[i].setFont (juce::Font (juce::FontOptions { juce::Font::getDefaultMonospacedFontName(), 11.0f, juce::Font::plain })); + knobLabels[i].setColour (juce::Label::textColourId, juce::Colour (0xFFA0A0A0)); + knobLabels[i].setFont (juce::Font (juce::FontOptions { juce::Font::getDefaultMonospacedFontName(), 13.0f, juce::Font::plain })); addAndMakeVisible (knobLabels[i]); knobValueLabels[i].setJustificationType (juce::Justification::centred); - knobValueLabels[i].setColour (juce::Label::textColourId, juce::Colour (0xFFC0E0A0)); - knobValueLabels[i].setFont (juce::Font (juce::FontOptions { juce::Font::getDefaultMonospacedFontName(), 12.0f, juce::Font::bold })); + knobValueLabels[i].setColour (juce::Label::textColourId, juce::Colour (0xFFD0D0D0)); + knobValueLabels[i].setFont (juce::Font (juce::FontOptions { juce::Font::getDefaultMonospacedFontName(), 14.0f, juce::Font::bold })); addAndMakeVisible (knobValueLabels[i]); knobSliders[i].setValue (0.5, juce::dontSendNotification); @@ -80,23 +80,27 @@ void SM26AudioProcessorEditor::setupNavButtons() { btn.setLookAndFeel (&navLookAndFeel); btn.setColour (juce::TextButton::buttonColourId, bg); - btn.setColour (juce::TextButton::textColourOffId, juce::Colour (0xFFE0E0C0)); - btn.setColour (juce::ComboBox::outlineColourId, juce::Colour (0xFF2A4A18)); + btn.setColour (juce::TextButton::textColourOffId, juce::Colour (0xFFE0E0E0)); + btn.setColour (juce::ComboBox::outlineColourId, juce::Colour (0xFF444444)); addAndMakeVisible (btn); }; - setup (navUp, juce::Colour (0xFF2A4A18)); - setup (navDown, juce::Colour (0xFF2A4A18)); - setup (navLeft, juce::Colour (0xFF2A4A18)); - setup (navRight, juce::Colour (0xFF2A4A18)); - setup (navEnter, juce::Colour (0xFF3A6A28)); - setup (navEsc, juce::Colour (0xFF3A2A18)); + setup (navUp, juce::Colour (0xFF2A2A2A)); + setup (navDown, juce::Colour (0xFF2A2A2A)); + setup (navLeft, juce::Colour (0xFF2A2A2A)); + setup (navRight, juce::Colour (0xFF2A2A2A)); + setup (navEnter, juce::Colour (0xFF3F3F3F)); + setup (navEsc, juce::Colour (0xFF333333)); + navUp.setTriggeredOnMouseDown (true); + navUp.setRepeatSpeed (250, 50); + navDown.setTriggeredOnMouseDown (true); + navDown.setRepeatSpeed (250, 50); navUp.onClick = [this] { if (menu.isOpen()) menu.up(); else cyclePreset (-1); }; navDown.onClick = [this] { if (menu.isOpen()) menu.down(); else cyclePreset (+1); }; navLeft.onClick = [this] { menu.left(); }; navRight.onClick = [this] { menu.right(); }; - navEnter.onClick = [this] { menu.open(); }; + navEnter.onClick = [this] { if (menu.isOpen()) menu.enter(); else menu.open(); }; navEsc.onClick = [this] { if (menu.isOpen()) menu.escape(); else menu.close(); }; } @@ -127,6 +131,38 @@ void SM26AudioProcessorEditor::buildRootMenu() return item; }; + auto addValue = [&](const char* n, int pid) -> MenuItem + { + MenuItem mi; + mi.label = n; + mi.kind = MenuItem::Value; + mi.paramId = pid; + mi.valueText = [this, pid]() { + if (pid == sm26::PDTIME && proc.engine.getParam (sm26::PDSYNC) > 0.5f) + return sm26::formatTimeMs ((float) proc.engine.delayTimeMs()); + return sm26::formatParamReal (pid, proc.engine.getParam (pid)); + }; + mi.onAdjust = [this, pid](float d) { + float delta = (pid == sm26::PDSTEPS) ? d / 0.02f * (1.0f / 15.0f) : d; + float cur = proc.engine.getParam (pid); + proc.engine.setParam (pid, sm26::clamp01 (cur + delta)); + for (int k = 0; k < 4; ++k) + { + auto kv = proc.engine.knobView (k); + if (kv.param == pid) + proc.setKnob (k, sm26::clamp01 ((proc.engine.getParam (pid) - kv.lo) / (kv.hi - kv.lo + 1e-9f))); + } + }; + return mi; + }; + + auto addHeader = [&](const char* n) { + MenuItem h; + h.label = "-- " + juce::String (n) + " --"; + h.kind = MenuItem::Separator; + s.items.push_back (h); + }; + { MenuItem m; m.label = "PRESETS (" + juce::String (sm26::PresetStore::count()) + ")"; @@ -135,254 +171,104 @@ void SM26AudioProcessorEditor::buildRootMenu() MenuScreen ps; ps.title = "SELECT PRESET"; ps.selected = proc.engine.presetIndex(); - for (int i = 0; i < sm26::PresetStore::count(); ++i) - ps.items.push_back (addPreset ( - sm26::PresetStore::get(i)->name, i)); + juce::String lastCat; + const int count = sm26::PresetStore::count(); + for (int i = 0; i < count; ++i) + { + const auto* p = sm26::PresetStore::get (i); + if (lastCat != p->category) + { + MenuItem h; + h.label = "---- " + juce::String (p->category) + " ----"; + h.kind = MenuItem::Separator; + ps.items.push_back (h); + lastCat = p->category; + } + ps.items.push_back (addPreset (p->name, i)); + } menu.pushScreen (ps); }; s.items.push_back (m); } - s.items.push_back (MenuItem().sep()); + addHeader ("OSCILLATORS"); + s.items.push_back (addValue ("OSC1 WAVE", sm26::PO1WAVE)); + s.items.push_back (addValue ("OSC2 WAVE", sm26::PO2WAVE)); + s.items.push_back (addValue ("O1 OCTAVE", sm26::PO1OCT)); + s.items.push_back (addValue ("O1 DETUNE", sm26::PO1CT)); + s.items.push_back (addValue ("O2 OCTAVE", sm26::PO2OCT)); + s.items.push_back (addValue ("O2 DETUNE", sm26::PO2CT)); + s.items.push_back (addValue ("MIX", sm26::PMIX)); + s.items.push_back (addValue ("NOISE", sm26::PNOISE)); + addHeader ("FILTER"); + s.items.push_back (addValue ("CUTOFF", sm26::PCUTOFF)); + s.items.push_back (addValue ("RES", sm26::PRES)); + s.items.push_back (addValue ("F-ENV", sm26::PFENV)); + s.items.push_back (addValue ("F-TYPE", sm26::PFTYPE)); + + addHeader ("ENVELOPE"); + s.items.push_back (addValue ("ATTACK", sm26::PATK)); + s.items.push_back (addValue ("DECAY", sm26::PDEC)); + s.items.push_back (addValue ("SUSTAIN", sm26::PSUS)); + s.items.push_back (addValue ("RELEASE", sm26::PREL)); + + addHeader ("DELAY"); + s.items.push_back (addValue ("TIME/STEPS", sm26::PDTIME)); + s.items.push_back (addValue ("STEPS", sm26::PDSTEPS)); + s.items.push_back (addValue ("SYNC", sm26::PDSYNC)); + s.items.push_back (addValue ("FEEDBACK", sm26::PDFB)); + s.items.push_back (addValue ("MIX", sm26::PDMIX)); + + addHeader ("SYSTEM"); + s.items.push_back (addValue ("DRIVE", sm26::PDRIVE)); + s.items.push_back (addValue ("GLIDE", sm26::PGLIDE)); + s.items.push_back (addValue ("MASTER", sm26::PMASTER)); + + addHeader ("INFO"); { - MenuItem m; - m.label = "OSCILLATORS"; - m.kind = MenuItem::Submenu; - m.onEnter = [this]() { - MenuScreen os; - os.title = "OSCILLATORS"; - os.selected = 0; - - auto addItem = [&](const char* n, int pid) { - MenuItem mi; - mi.label = n; - mi.kind = MenuItem::Value; - mi.paramId = pid; - mi.valueText = [this, pid]() { return sm26::formatParamReal (pid, proc.engine.getParam (pid)); }; - mi.onAdjust = [this, pid](float d) { - float cur = proc.engine.getParam (pid); - proc.engine.setParam (pid, sm26::clamp01 (cur + d)); - for (int k = 0; k < 4; ++k) - { - auto kv = proc.engine.knobView (k); - if (kv.param == pid) - proc.setKnob (k, sm26::clamp01 ((proc.engine.getParam (pid) - kv.lo) / (kv.hi - kv.lo + 1e-9f))); - } - }; - os.items.push_back (mi); - }; - - addItem ("OSC1 WAVE", sm26::PO1WAVE); - addItem ("OSC2 WAVE", sm26::PO2WAVE); - addItem ("O1 OCTAVE", sm26::PO1OCT); - addItem ("O1 DETUNE", sm26::PO1CT); - addItem ("O2 OCTAVE", sm26::PO2OCT); - addItem ("O2 DETUNE", sm26::PO2CT); - addItem ("MIX", sm26::PMIX); - addItem ("NOISE", sm26::PNOISE); - menu.pushScreen (os); - }; - s.items.push_back (m); - } - - { - MenuItem m; - m.label = "FILTER"; - m.kind = MenuItem::Submenu; - m.onEnter = [this]() { - MenuScreen fs; - fs.title = "FILTER"; - fs.selected = 0; - - auto addItem = [&](const char* n, int pid) { - MenuItem mi; - mi.label = n; - mi.kind = MenuItem::Value; - mi.paramId = pid; - mi.valueText = [this, pid]() { return sm26::formatParamReal (pid, proc.engine.getParam (pid)); }; - mi.onAdjust = [this, pid](float d) { - float cur = proc.engine.getParam (pid); - proc.engine.setParam (pid, sm26::clamp01 (cur + d)); - for (int k = 0; k < 4; ++k) - { - auto kv = proc.engine.knobView (k); - if (kv.param == pid) - proc.setKnob (k, sm26::clamp01 ((proc.engine.getParam (pid) - kv.lo) / (kv.hi - kv.lo + 1e-9f))); - } - }; - fs.items.push_back (mi); - }; - - addItem ("CUTOFF", sm26::PCUTOFF); - addItem ("RES", sm26::PRES); - addItem ("F-ENV", sm26::PFENV); - addItem ("F-TYPE", sm26::PFTYPE); - menu.pushScreen (fs); - }; - s.items.push_back (m); - } - - { - MenuItem m; - m.label = "ENVELOPE"; - m.kind = MenuItem::Submenu; - m.onEnter = [this]() { - MenuScreen es; - es.title = "ENVELOPE"; - es.selected = 0; - - auto addItem = [&](const char* n, int pid) { - MenuItem mi; - mi.label = n; - mi.kind = MenuItem::Value; - mi.paramId = pid; - mi.valueText = [this, pid]() { return sm26::formatParamReal (pid, proc.engine.getParam (pid)); }; - mi.onAdjust = [this, pid](float d) { - float cur = proc.engine.getParam (pid); - proc.engine.setParam (pid, sm26::clamp01 (cur + d)); - for (int k = 0; k < 4; ++k) - { - auto kv = proc.engine.knobView (k); - if (kv.param == pid) - proc.setKnob (k, sm26::clamp01 ((proc.engine.getParam (pid) - kv.lo) / (kv.hi - kv.lo + 1e-9f))); - } - }; - es.items.push_back (mi); - }; - - addItem ("ATTACK", sm26::PATK); - addItem ("DECAY", sm26::PDEC); - addItem ("SUSTAIN", sm26::PSUS); - addItem ("RELEASE", sm26::PREL); - menu.pushScreen (es); - }; - s.items.push_back (m); - } - - { - MenuItem m; - m.label = "DELAY"; - m.kind = MenuItem::Submenu; - m.onEnter = [this]() { - MenuScreen ds; - ds.title = "DELAY"; - ds.selected = 0; - - auto addItem = [&](const char* n, int pid) { - MenuItem mi; - mi.label = n; - mi.kind = MenuItem::Value; - mi.paramId = pid; - mi.valueText = [this, pid]() { return sm26::formatParamReal (pid, proc.engine.getParam (pid)); }; - mi.onAdjust = [this, pid](float d) { - float cur = proc.engine.getParam (pid); - proc.engine.setParam (pid, sm26::clamp01 (cur + d)); - for (int k = 0; k < 4; ++k) - { - auto kv = proc.engine.knobView (k); - if (kv.param == pid) - proc.setKnob (k, sm26::clamp01 ((proc.engine.getParam (pid) - kv.lo) / (kv.hi - kv.lo + 1e-9f))); - } - }; - ds.items.push_back (mi); - }; - - addItem ("TIME/STEPS", sm26::PDTIME); - addItem ("STEPS", sm26::PDSTEPS); - addItem ("SYNC", sm26::PDSYNC); - addItem ("FEEDBACK", sm26::PDFB); - addItem ("MIX", sm26::PDMIX); - menu.pushScreen (ds); - }; - s.items.push_back (m); - } - - { - MenuItem m; - m.label = "SYSTEM"; - m.kind = MenuItem::Submenu; - m.onEnter = [this]() { - MenuScreen ss; - ss.title = "SYSTEM"; - ss.selected = 0; - - auto addItem = [&](const char* n, int pid) { - MenuItem mi; - mi.label = n; - mi.kind = MenuItem::Value; - mi.paramId = pid; - mi.valueText = [this, pid]() { return sm26::formatParamReal (pid, proc.engine.getParam (pid)); }; - mi.onAdjust = [this, pid](float d) { - float cur = proc.engine.getParam (pid); - proc.engine.setParam (pid, sm26::clamp01 (cur + d)); - for (int k = 0; k < 4; ++k) - { - auto kv = proc.engine.knobView (k); - if (kv.param == pid) - proc.setKnob (k, sm26::clamp01 ((proc.engine.getParam (pid) - kv.lo) / (kv.hi - kv.lo + 1e-9f))); - } - }; - ss.items.push_back (mi); - }; - - addItem ("DRIVE", sm26::PDRIVE); - addItem ("GLIDE", sm26::PGLIDE); - addItem ("MASTER", sm26::PMASTER); - + MenuItem mi; + mi.label = "ABOUT"; + mi.kind = MenuItem::Action; + mi.onEnter = [this]() { + MenuScreen as; + as.title = "ABOUT"; + as.selected = 0; { - MenuItem mi; mi.label = "---"; mi.kind = MenuItem::Separator; - ss.items.push_back (mi); + MenuItem m2; m2.label = "SM-26 Sound Module by A. Jenewein"; m2.kind = MenuItem::Action; + as.items.push_back (m2); } - { - MenuItem mi; - mi.label = "ABOUT"; - mi.kind = MenuItem::Action; - mi.onEnter = [this]() { - MenuScreen as; - as.title = "ABOUT"; - as.selected = 0; - { - MenuItem m2; m2.label = "SM-26 Synthesizer"; m2.kind = MenuItem::Action; - as.items.push_back (m2); - } - { - MenuItem m2; - m2.label = "Version: " + juce::String (SM26_GIT_VERSION); - m2.kind = MenuItem::Action; - as.items.push_back (m2); - } - { - MenuItem m2; - m2.label = "Built: " + juce::String (SM26_BUILD_TIME); - m2.kind = MenuItem::Action; - as.items.push_back (m2); - } - { - MenuItem m2; - m2.label = "Branch: " + juce::String (SM26_GIT_BRANCH); - m2.kind = MenuItem::Action; - as.items.push_back (m2); - } - { - MenuItem m2; m2.label = ""; m2.kind = MenuItem::Separator; - as.items.push_back (m2); - } - { - MenuItem m2; - m2.label = "52 presets | VST3 + AU"; - m2.kind = MenuItem::Action; - as.items.push_back (m2); - } - menu.pushScreen (as); - }; - ss.items.push_back (mi); + MenuItem m2; + m2.label = "Version: " + juce::String (SM26_GIT_VERSION); + m2.kind = MenuItem::Action; + as.items.push_back (m2); } - - menu.pushScreen (ss); + { + MenuItem m2; + m2.label = "Built: " + juce::String (SM26_BUILD_TIME); + m2.kind = MenuItem::Action; + as.items.push_back (m2); + } + { + MenuItem m2; + m2.label = "Branch: " + juce::String (SM26_GIT_BRANCH); + m2.kind = MenuItem::Action; + as.items.push_back (m2); + } + { + MenuItem m2; m2.label = "---"; m2.kind = MenuItem::Separator; + as.items.push_back (m2); + } + { + MenuItem m2; + m2.label = juce::String (sm26::PresetStore::count()) + " presets | VST3 + AU"; + m2.kind = MenuItem::Action; + as.items.push_back (m2); + } + menu.pushScreen (as); }; - s.items.push_back (m); + s.items.push_back (mi); } return s; @@ -393,80 +279,20 @@ void SM26AudioProcessorEditor::buildRootMenu() void SM26AudioProcessorEditor::paint (juce::Graphics& g) { - g.fillAll (juce::Colour (0xFF0A0F06)); + g.fillAll (juce::Colour (0xFF000000)); const float totalW = (float) getWidth(); const float totalH = (float) getHeight(); - g.setColour (juce::Colour (0xFF1A2E0A)); + g.setColour (juce::Colour (0xFF1A1A1A)); g.fillRoundedRectangle (8.0f, 8.0f, totalW - 16.0f, totalH - 16.0f, 6.0f); - g.setColour (juce::Colour (0xFF2A4A18)); + g.setColour (juce::Colour (0xFF333333)); g.drawRoundedRectangle (8.0f, 8.0f, totalW - 16.0f, totalH - 16.0f, 6.0f, 1.5f); - if (! menu.isOpen()) - { - g.setColour (juce::Colour (0xFF6AE050)); - g.setFont (juce::Font (juce::FontOptions { juce::Font::getDefaultMonospacedFontName(), 14.0f, juce::Font::bold })); - g.drawText ("SM-26", 20.0f, 16.0f, 100.0f, 22.0f, juce::Justification::centredLeft); - } - else - { - g.setColour (juce::Colour (0xFFE0E0C0)); - g.setFont (juce::Font (juce::FontOptions { juce::Font::getDefaultMonospacedFontName(), 14.0f, juce::Font::bold })); - g.drawText (menu.current().title, 20.0f, 16.0f, getWidth() - 40.0f, 22.0f, - juce::Justification::centred); - } - - if (menu.isOpen()) - { - const auto& ms = menu.current(); - float y = 44.0f; - float itemH = 18.0f; - float menuLeft = 20.0f; - float menuW = getWidth() - 40.0f; - - for (int i = 0; i < (int) ms.items.size() && y < (float) getHeight() - 60.0f; ++i) - { - const auto& item = ms.items[i]; - - if (item.kind == MenuItem::Separator) - { - g.setColour (juce::Colour (0xFF2A4A18)); - g.drawHorizontalLine ((int) y, menuLeft, menuLeft + menuW); - y += 4.0f; - continue; - } - - bool selected = (i == ms.selected); - - if (selected) - { - g.setColour (juce::Colour (0xFF3A6A28)); - g.fillRoundedRectangle (menuLeft, y, menuW, itemH, 3.0f); - } - - g.setColour (selected ? juce::Colour (0xFFE0E0C0) : juce::Colour (0xFF709060)); - g.setFont (juce::Font (juce::FontOptions { juce::Font::getDefaultMonospacedFontName(), 12.0f, juce::Font::plain })); - g.drawText (item.label, menuLeft + 8.0f, y, menuW * 0.6f, itemH, - juce::Justification::centredLeft); - - if (item.kind == MenuItem::Value && item.valueText) - { - g.setColour (juce::Colour (0xFFA0E080)); - g.drawText (item.valueText(), menuLeft + menuW * 0.55f, y, - menuW * 0.4f, itemH, juce::Justification::centredRight); - } - else if (item.kind == MenuItem::Submenu) - { - g.setColour (juce::Colour (0xFF90B080)); - g.drawText (">", menuLeft + menuW - 16.0f, y, 16.0f, itemH, - juce::Justification::centredRight); - } - - y += itemH + 1.0f; - } - } + g.setColour (juce::Colour (0xFFC8C8C8)); + g.setFont (juce::Font (juce::FontOptions { juce::Font::getDefaultMonospacedFontName(), 14.0f, juce::Font::bold })); + g.drawText ("SM-26", 20.0f, 16.0f, 100.0f, 22.0f, juce::Justification::centredLeft); } void SM26AudioProcessorEditor::resized() @@ -474,24 +300,26 @@ void SM26AudioProcessorEditor::resized() const float totalW = (float) getWidth(); const float totalH = (float) getHeight(); - float knobSize = 62.0f; - float knobGap = 18.0f; + float knobSize = 78.0f; + float knobGap = 20.0f; float knobsW = 4.0f * knobSize + 3.0f * knobGap; float knobsX = (totalW - knobsW) / 2.0f; - float knobsY = juce::jmax (190.0f, totalH - 265.0f); + float knobsY = juce::jmax (360.0f, totalH - 300.0f); for (int i = 0; i < 4; ++i) { float x = knobsX + (float) i * (knobSize + knobGap); knobSliders[i].setBounds ((int) x, (int) knobsY, (int) knobSize, (int) knobSize); - knobLabels[i].setBounds ((int) x, (int) (knobsY + knobSize + 2), (int) knobSize, 16); - knobValueLabels[i].setBounds ((int) x, (int) (knobsY + knobSize + 18), (int) knobSize, 14); + knobLabels[i].setBounds ((int) x, (int) (knobsY + knobSize + 2), (int) knobSize, 18); + knobValueLabels[i].setBounds ((int) x, (int) (knobsY + knobSize + 20), (int) knobSize, 16); } float navSize = 30.0f; float navGap = 3.0f; float navCenterX = totalW / 2.0f; - float navCenterY = totalH - 90.0f; + float legendBottom = knobsY + knobSize + 20.0f + 16.0f; + float footerTop = totalH - 22.0f; + float navCenterY = (legendBottom + footerTop) * 0.5f; navUp.setBounds ((int) (navCenterX - navSize / 2), (int) (navCenterY - navSize - navGap), (int) navSize, (int) navSize); @@ -507,7 +335,7 @@ void SM26AudioProcessorEditor::resized() navEsc.setBounds ((int) (navCenterX + navGap), (int) (navCenterY + navSize + navGap), (int) navSize, (int) navSize); - lcd.setBounds (14, 42, (int) totalW - 28, 150); + lcd.setBounds (14, 16, (int) totalW - 28, 302); footer.setBounds (8, (int) totalH - 22, (int) totalW - 16, 16); } @@ -576,30 +404,22 @@ void SM26AudioProcessorEditor::updateLCD() lcd.setLine (0, juce::String (presetIdx + 1) + "/" + juce::String (sm26::PresetStore::count()) + " " + sm26::PresetStore::fullLabel (*p)); - lcd.setLine (1, padRight (proc.engine.knobView (0).name, 12) - + padRight (sm26::formatParamReal (proc.engine.knobView(0).param, - proc.engine.getParam(proc.engine.knobView(0).param)), 12) - + " " - + padRight (proc.engine.knobView (2).name, 12) - + sm26::formatParamReal (proc.engine.knobView(2).param, - proc.engine.getParam(proc.engine.knobView(2).param))); - - lcd.setLine (2, padRight (proc.engine.knobView (1).name, 12) - + padRight (sm26::formatParamReal (proc.engine.knobView(1).param, - proc.engine.getParam(proc.engine.knobView(1).param)), 12) - + " " - + padRight (proc.engine.knobView (3).name, 12) - + sm26::formatParamReal (proc.engine.knobView(3).param, - proc.engine.getParam(proc.engine.knobView(3).param))); + for (int k = 0; k < 4; ++k) + { + auto kv = proc.engine.knobView (k); + lcd.setLine (1 + k, padRight (kv.name, 20) + + sm26::formatParamReal (kv.param, proc.engine.getParam (kv.param))); + } double bpm = proc.engine.lastBpm(); - bool playing = proc.engine.transport(); - juce::String bpmStr = playing ? juce::String (bpm, 1) + " BPM" : "--- BPM"; + juce::String bpmStr = juce::String (bpm, 1) + " BPM"; int notes = proc.engine.notesPlaying(); juce::String notesStr = notes > 0 ? "NOTES:" + juce::String (notes) : ""; - lcd.setLine (3, juce::String ("SM-26") + " " + bpmStr + " " + notesStr - + " UP/DN=PATCH OK=MENU"); + lcd.setLine (6, bpmStr + (notesStr.isNotEmpty() ? " " + notesStr : "")); + lcd.setLine (7, juce::String ("SM-26") + " UP/DN=PATCH OK=MENU"); + for (int r = 0; r < LcdDisplay::kRows; ++r) + lcd.setInverted (r, false); lcd.showCursor (false); } else @@ -607,18 +427,39 @@ void SM26AudioProcessorEditor::updateLCD() const auto& cs = menu.current(); lcd.setLine (0, "== " + cs.title + " =="); - for (int row = 0; row < 3 && row < (int) cs.items.size(); ++row) + + for (int r = 0; r < LcdDisplay::kRows; ++r) + lcd.setInverted (r, false); + + std::vector shown; + for (int i = 0; i < (int) cs.items.size(); ++i) { - int idx = juce::jlimit (0, (int) cs.items.size() - 1, cs.selected + row); + const auto& it = cs.items[i]; + if (it.kind == MenuItem::Separator && it.label.isEmpty()) + continue; + shown.push_back (i); + } + + int pos = 0; + for (int i = 0; i < (int) shown.size(); ++i) + if (shown[i] == cs.selected) { pos = i; break; } + + int top = juce::jlimit (0, juce::jmax (0, (int) shown.size() - 6), pos - 2); + for (int row = 0; row < 6 && top + row < (int) shown.size(); ++row) + { + int idx = shown[top + row]; const auto& item = cs.items[idx]; - juce::String line = (idx == cs.selected ? "> " : " ") + item.label; + juce::String line = " " + item.label; if (item.kind == MenuItem::Value && item.valueText) line = padRight (line, 50) + item.valueText(); else if (item.kind == MenuItem::Submenu) line = line + " [ENTER]"; + else if (item.kind == MenuItem::Separator) + line = " " + item.label; lcd.setLine (1 + row, line); + lcd.setInverted (1 + row, idx == cs.selected); } - lcd.setLine (3, "UP/DN=SEL L/R=VAL OK=OK ESC=BACK"); + lcd.setLine (7, "UP/DN=SEL L/R=VAL OK=OK ESC=BACK"); lcd.showCursor (false); } -} \ No newline at end of file +} diff --git a/Source/Presets.cpp b/Source/Presets.cpp index 9ad0e86..3c3c2d9 100644 --- a/Source/Presets.cpp +++ b/Source/Presets.cpp @@ -5,7 +5,7 @@ namespace sm26 { namespace { struct Catalog { - Preset data[52]; + Preset data[256]; int n = 0; }; @@ -46,18 +46,22 @@ Catalog& catalog() const C cShp[4] = { K("CUTOFF",PCUTOFF,0.05f,1.0f), K("RES",PRES,0.0f,1.0f), K("F-TYPE",PFTYPE,0.0f,1.0f),K("DELAY",PDMIX,0.0f,1.0f) }; const C cKeys[4] = { K("CUTOFF",PCUTOFF,0.05f,0.95f), K("DECAY",PDEC,0.1f,0.9f), K("DRIVE",PDRIVE,0.0f,1.0f),K("D-MIX",PDMIX,0.0f,1.0f) }; const C cStab[4] = { K("CUTOFF",PCUTOFF,0.05f,0.95f), K("RES",PRES,0.0f,1.0f), K("F-ENV",PFENV,0.0f,1.0f), K("DRIVE",PDRIVE,0.0f,1.0f) }; + const C cBell[4] = { K("RATIO",PO2OCT,0.0f,1.0f), K("DECAY",PDEC,0.1f,0.95f), K("RES",PRES,0.0f,1.0f), K("DELAY",PDMIX,0.0f,1.0f) }; + const C cOrgan[4] = { K("CUTOFF",PCUTOFF,0.05f,1.0f),K("DRIVE",PDRIVE,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.9f), K("D-MIX",PDMIX,0.0f,0.6f) }; + const C cStr[4] = { K("CUTOFF",PCUTOFF,0.05f,0.95f),K("F-ENV",PFENV,0.0f,1.0f), K("DECAY",PDEC,0.2f,0.95f), K("D-MIX",PDMIX,0.0f,1.0f) }; + const C cTone[4] = { K("CUTOFF",PCUTOFF,0.05f,1.0f),K("DRIVE",PDRIVE,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.9f), K("DELAY",PDMIX,0.0f,1.0f) }; // BASS ------------------------------------------------------------ add("Sub Square", "BASS", { {PO1WAVE,0.75f},{PO2WAVE,0.0f},{PO1OCT,0.25f},{PO2OCT,0.28f},{PMIX,0.9f}, {PCUTOFF,0.4f},{PRES,0.35f},{PATK,0.015f},{PDEC,0.4f},{PSUS,0.7f},{PREL,0.25f}, - {PDSYNC,1.0f},{PDSTEPS,6.0f},{PDFB,0.5f},{PDMIX,0.4f},{PMASTER,0.8f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.4f},{PMASTER,0.8f} }, { K("CUTOFF",PCUTOFF,0.15f,0.8f),K("RES",PRES,0.0f,1.0f),K("DECAY",PDEC,0.15f,0.95f),K("D-MIX",PDMIX,0.0f,1.0f) }); add("Deep Saw", "BASS", { {PO1WAVE,0.5f},{PO2WAVE,0.75f},{PO1OCT,0.317f},{PO2OCT,0.36f},{PMIX,0.5f}, {PCUTOFF,0.42f},{PRES,0.25f},{PFENV,0.3f},{PATK,0.03f},{PDEC,0.45f},{PSUS,0.65f},{PREL,0.2f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDFB,0.45f},{PDMIX,0.35f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.45f},{PDMIX,0.35f},{PMASTER,0.75f} }, { K("CUTOFF",PCUTOFF,0.1f,0.7f),K("RES",PRES,0.0f,1.0f),K("F-ENV",PFENV,0.0f,1.0f),K("DELAY",PDMIX,0.0f,1.0f) }); add("Acid Bass", "BASS", @@ -75,7 +79,7 @@ Catalog& catalog() add("DnB Reeses", "BASS", { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.525f},{PO2CT,0.475f},{PMIX,0.5f}, {PCUTOFF,0.28f},{PRES,0.5f},{PFENV,0.6f},{PATK,0.01f},{PDEC,0.5f},{PSUS,0.6f},{PREL,0.15f}, - {PDRIVE,0.5f},{PDSYNC,1.0f},{PDSTEPS,10.0f},{PDFB,0.4f},{PDMIX,0.25f},{PMASTER,0.75f} }, + {PDRIVE,0.5f},{PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.4f},{PDMIX,0.25f},{PMASTER,0.75f} }, { K("CUTOFF",PCUTOFF,0.05f,0.7f),K("RES",PRES,0.0f,1.0f),K("DETUNE",PO1CT,0.0f,1.0f),K("DRIVE",PDRIVE,0.0f,1.0f) }); add("Round Sub", "BASS", @@ -87,87 +91,183 @@ Catalog& catalog() add("Filter Zam", "BASS", { {PO1WAVE,0.5f},{PO2WAVE,0.75f},{PO1OCT,0.28f},{PO2OCT,0.35f},{PMIX,0.6f}, {PCUTOFF,0.18f},{PRES,0.7f},{PFENV,0.8f},{PATK,0.01f},{PDEC,0.35f},{PSUS,0.4f},{PREL,0.3f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDFB,0.55f},{PDMIX,0.3f},{PMASTER,0.8f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.55f},{PDMIX,0.3f},{PMASTER,0.8f} }, { K("CUTOFF",PCUTOFF,0.04f,0.5f),K("RES",PRES,0.0f,1.0f),K("F-ENV",PFENV,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.9f) }); add("Dirty Tron", "BASS", { {PO1WAVE,0.75f},{PO2WAVE,0.5f},{PO1OCT,0.25f},{PO2OCT,0.28f},{PMIX,0.5f}, {PCUTOFF,0.35f},{PRES,0.4f},{PFENV,0.4f},{PATK,0.02f},{PDEC,0.5f},{PSUS,0.6f},{PREL,0.15f}, - {PDRIVE,0.6f},{PDSYNC,1.0f},{PDSTEPS,6.0f},{PDFB,0.5f},{PDMIX,0.35f},{PMASTER,0.8f} }, + {PDRIVE,0.6f},{PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.35f},{PMASTER,0.8f} }, { K("CUTOFF",PCUTOFF,0.05f,0.85f),K("RES",PRES,0.0f,1.0f),K("DRIVE",PDRIVE,0.0f,1.0f),K("DELAY",PDMIX,0.0f,1.0f) }); + add("Tech Bass", "BASS", + { {PO1WAVE,0.75f},{PO2WAVE,0.0f},{PO1OCT,0.25f},{PO2OCT,0.24f},{PMIX,0.85f}, + {PCUTOFF,0.25f},{PRES,0.55f},{PFENV,0.6f},{PATK,0.004f},{PDEC,0.55f},{PSUS,0.2f},{PREL,0.12f}, + {PDSYNC,0.0f},{PMASTER,0.85f} }, + { K("CUTOFF",PCUTOFF,0.04f,0.6f),K("RES",PRES,0.0f,1.0f),K("F-ENV",PFENV,0.0f,1.0f),K("DRIVE",PDRIVE,0.0f,1.0f) }); + + add("Anime Bass", "BASS", + { {PO1WAVE,0.5f},{PO2WAVE,0.25f},{PO1OCT,0.28f},{PO2OCT,0.3f},{PMIX,0.6f}, + {PCUTOFF,0.16f},{PRES,0.65f},{PFENV,0.35f},{PATK,0.02f},{PDEC,0.4f},{PSUS,0.6f},{PREL,0.2f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.35f},{PMASTER,0.8f} }, + { K("CUTOFF",PCUTOFF,0.04f,0.5f),K("RES",PRES,0.0f,1.0f),K("F-ENV",PFENV,0.0f,1.0f),K("DELAY",PDMIX,0.0f,1.0f) }); + + add("Clipped Bass", "BASS", + { {PO1WAVE,0.75f},{PO2WAVE,0.25f},{PO1OCT,0.25f},{PO2OCT,0.3f},{PMIX,0.8f}, + {PCUTOFF,0.55f},{PRES,0.25f},{PFENV,0.2f},{PATK,0.005f},{PDEC,0.35f},{PSUS,0.6f},{PREL,0.15f}, + {PDRIVE,0.9f},{PDSYNC,0.0f},{PMASTER,0.8f} }, + { K("CUTOFF",PCUTOFF,0.05f,0.85f),K("DRIVE",PDRIVE,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.9f),K("D-MIX",PDMIX,0.0f,1.0f) }); + + add("House Bass", "BASS", + { {PO1WAVE,0.25f},{PO2WAVE,0.0f},{PO1OCT,0.25f},{PO2OCT,0.28f},{PMIX,1.0f}, + {PCUTOFF,0.45f},{PRES,0.3f},{PFENV,0.3f},{PATK,0.004f},{PDEC,0.3f},{PSUS,0.5f},{PREL,0.12f}, + {PDSYNC,0.0f},{PMASTER,0.8f} }, + { K("CUTOFF",PCUTOFF,0.05f,0.8f),K("RES",PRES,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.95f),K("D-MIX",PDMIX,0.0f,1.0f) }); + + add("Purple Bass", "BASS", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.45f},{PO2CT,0.55f},{PMIX,0.5f}, + {PCUTOFF,0.3f},{PRES,0.45f},{PFENV,0.6f},{PATK,0.008f},{PDEC,0.45f},{PSUS,0.5f},{PREL,0.18f}, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.6f},{PDMIX,0.4f},{PMASTER,0.8f} }, + { K("CUTOFF",PCUTOFF,0.05f,0.8f),K("RES",PRES,0.0f,1.0f),K("F-ENV",PFENV,0.0f,1.0f),K("DELAY",PDMIX,0.0f,1.0f) }); + + add("Goa Bass", "BASS", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1OCT,0.25f},{PO2OCT,0.5f},{PMIX,0.5f},{PNOISE,0.08f}, + {PCUTOFF,0.4f},{PRES,0.35f},{PFENV,0.3f},{PATK,0.03f},{PDEC,0.4f},{PSUS,0.8f},{PREL,0.2f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.35f},{PMASTER,0.75f} }, + { K("CUTOFF",PCUTOFF,0.05f,0.8f),K("RES",PRES,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.95f),K("DELAY",PDMIX,0.0f,1.0f) }); + + add("Jungle Bass", "BASS", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.40f},{PO2CT,0.60f},{PMIX,0.5f}, + {PCUTOFF,0.3f},{PRES,0.5f},{PFENV,0.55f},{PATK,0.008f},{PDEC,0.45f},{PSUS,0.55f},{PREL,0.12f}, + {PDRIVE,0.55f},{PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.8f} }, + { K("CUTOFF",PCUTOFF,0.05f,0.7f),K("RES",PRES,0.0f,1.0f),K("DETUNE",PO1CT,0.0f,1.0f),K("DRIVE",PDRIVE,0.0f,1.0f) }); + + add("Future Bass", "BASS", + { {PO1WAVE,0.75f},{PO2WAVE,0.5f},{PO1CT,0.45f},{PO2CT,0.55f},{PMIX,0.5f}, + {PCUTOFF,0.28f},{PRES,0.4f},{PFENV,0.7f},{PATK,0.01f},{PDEC,0.5f},{PSUS,0.4f},{PREL,0.2f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.4f},{PMASTER,0.8f} }, + { K("CUTOFF",PCUTOFF,0.04f,0.7f),K("RES",PRES,0.0f,1.0f),K("F-ENV",PFENV,0.0f,1.0f),K("DELAY",PDMIX,0.0f,1.0f) }); + // LEAD ------------------------------------------------------------ add("Plain Sine", "LEAD", { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PMIX,1.0f},{PCUTOFF,0.7f},{PRES,0.15f},{PFENV,0.3f}, {PATK,0.02f},{PDEC,0.3f},{PSUS,0.65f},{PREL,0.2f},{PGLIDE,0.2f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, cCff); add("Square Lead", "LEAD", { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1CT,0.505f},{PMIX,0.5f},{PCUTOFF,0.55f},{PRES,0.3f}, {PFENV,0.35f},{PATK,0.01f},{PDEC,0.3f},{PSUS,0.7f},{PREL,0.15f},{PGLIDE,0.25f}, - {PDSYNC,1.0f},{PDSTEPS,6.0f},{PDFB,0.5f},{PDMIX,0.3f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.3f},{PMASTER,0.75f} }, cStab); add("Saw Lead", "LEAD", { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.51f},{PO2CT,0.49f},{PMIX,0.5f},{PCUTOFF,0.5f},{PRES,0.25f}, {PFENV,0.4f},{PATK,0.01f},{PDEC,0.35f},{PSUS,0.7f},{PREL,0.12f},{PGLIDE,0.3f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.35f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.35f},{PMASTER,0.75f} }, cCff); add("Distant Lead", "LEAD", { {PO1WAVE,0.5f},{PO2WAVE,0.25f},{PO1CT,0.53f},{PO2CT,0.5f},{PMIX,0.5f},{PCUTOFF,0.3f},{PRES,0.4f}, {PFENV,0.55f},{PATK,0.005f},{PDEC,0.5f},{PSUS,0.5f},{PREL,0.35f}, - {PDSYNC,1.0f},{PDSTEPS,6.0f},{PDFB,0.6f},{PDMIX,0.55f},{PMASTER,0.8f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.6f},{PDMIX,0.55f},{PMASTER,0.8f} }, { K("CUTOFF",PCUTOFF,0.05f,0.8f),K("RES",PRES,0.0f,1.0f),K("F-ENV",PFENV,0.0f,1.0f),K("DELAY",PDMIX,0.0f,1.0f) }); add("Glass Lead", "LEAD", { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1OCT,0.62f},{PO2OCT,0.56f},{PO1CT,0.51f},{PO2CT,0.49f}, {PMIX,0.5f},{PCUTOFF,0.45f},{PRES,0.45f},{PFENV,0.5f},{PATK,0.01f},{PDEC,0.4f},{PSUS,0.6f},{PREL,0.25f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.3f},{PMASTER,0.72f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.72f} }, cCff); add("Supersaw Growl", "LEAD", { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.45f},{PO2CT,0.55f},{PMIX,0.5f},{PCUTOFF,0.4f},{PRES,0.3f}, {PFENV,0.45f},{PATK,0.02f},{PDEC,0.35f},{PSUS,0.7f},{PREL,0.15f},{PDRIVE,0.35f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.25f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.25f},{PMASTER,0.75f} }, cDrift); add("Night Rider", "LEAD", { {PO1WAVE,0.5f},{PO2WAVE,0.0f},{PO1OCT,0.4f},{PO2OCT,0.5f},{PMIX,0.6f},{PCUTOFF,0.32f},{PRES,0.5f}, {PFENV,0.6f},{PATK,0.015f},{PDEC,0.3f},{PSUS,0.7f},{PREL,0.2f},{PDRIVE,0.4f}, - {PDSYNC,1.0f},{PDSTEPS,6.0f},{PDMIX,0.4f},{PMASTER,0.78f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.4f},{PMASTER,0.78f} }, cShp); add("Sine FM Bell", "LEAD", { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO2OCT,0.83f},{PMIX,0.45f},{PCUTOFF,0.3f},{PRES,0.35f},{PFENV,0.7f}, {PATK,0.002f},{PDEC,0.4f},{PSUS,0.1f},{PREL,0.4f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDFB,0.6f},{PDMIX,0.5f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.6f},{PDMIX,0.5f},{PMASTER,0.75f} }, { K("RATIO",PO2OCT,0.0f,1.0f),K("LEVEL",PMIX,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.95f),K("DELAY",PDMIX,0.0f,1.0f) }); + add("Screamy Lead", "LEAD", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.52f},{PO2CT,0.48f},{PMIX,0.5f}, + {PCUTOFF,0.6f},{PRES,0.55f},{PFENV,0.55f},{PATK,0.008f},{PDEC,0.35f},{PSUS,0.6f},{PREL,0.15f}, + {PDRIVE,0.5f},{PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.35f},{PMASTER,0.78f} }, + cStab); + + add("Watery Lead", "LEAD", + { {PO1WAVE,0.25f},{PO2WAVE,0.5f},{PO1OCT,0.5f},{PO2OCT,0.55f},{PO1CT,0.55f},{PO2CT,0.45f},{PMIX,0.5f}, + {PCUTOFF,0.5f},{PRES,0.3f},{PFENV,0.4f},{PATK,0.01f},{PDEC,0.3f},{PSUS,0.6f},{PREL,0.2f},{PGLIDE,0.3f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.4f},{PMASTER,0.72f} }, + cCff); + + add("FM Sync Lead", "LEAD", + { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO2OCT,0.83f},{PMIX,0.4f},{PCUTOFF,0.45f},{PRES,0.3f},{PFENV,0.5f}, + {PATK,0.002f},{PDEC,0.4f},{PSUS,0.3f},{PREL,0.5f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.6f},{PDMIX,0.5f},{PMASTER,0.75f} }, + cCff); + + add("Calliope Lead", "LEAD", + { {PO1WAVE,0.75f},{PO2WAVE,0.5f},{PO1OCT,0.62f},{PO2OCT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.4f},{PRES,0.35f},{PFENV,0.4f},{PATK,0.004f},{PDEC,0.3f},{PSUS,0.5f},{PREL,0.12f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.72f} }, + cCff); + + add("Ethereal Lead", "LEAD", + { {PO1WAVE,0.25f},{PO2WAVE,0.25f},{PO1OCT,0.55f},{PO2OCT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.4f},{PRES,0.25f},{PFENV,0.5f},{PATK,0.01f},{PDEC,0.5f},{PSUS,0.6f},{PREL,0.7f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.65f},{PDMIX,0.65f},{PMASTER,0.72f} }, + cCff); + + add("Hard Lead", "LEAD", + { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1CT,0.48f},{PO2CT,0.52f},{PMIX,0.5f}, + {PCUTOFF,0.5f},{PRES,0.5f},{PFENV,0.6f},{PATK,0.002f},{PDEC,0.3f},{PSUS,0.6f},{PREL,0.12f}, + {PDRIVE,0.6f},{PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.25f},{PMASTER,0.78f} }, + cStab); + + add("Anime Lead", "LEAD", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.5f},{PO2CT,0.53f},{PMIX,0.5f}, + {PCUTOFF,0.45f},{PRES,0.35f},{PFENV,0.5f},{PATK,0.006f},{PDEC,0.45f},{PSUS,0.5f},{PREL,0.5f},{PGLIDE,0.2f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.55f},{PMASTER,0.75f} }, + cCff); + + add("Reso Lead", "LEAD", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.5f},{PO2CT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.35f},{PRES,0.75f},{PFENV,0.65f},{PATK,0.004f},{PDEC,0.4f},{PSUS,0.4f},{PREL,0.3f}, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.4f},{PDMIX,0.3f},{PMASTER,0.78f} }, + cShp); + // PAD ------------------------------------------------------------- add("Analog Pad", "PAD", { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.49f},{PO2CT,0.51f},{PMIX,0.45f},{PCUTOFF,0.35f},{PRES,0.3f}, {PFENV,0.45f},{PATK,0.45f},{PDEC,0.5f},{PSUS,0.7f},{PREL,0.6f}, - {PDSYNC,1.0f},{PDSTEPS,10.0f},{PDFB,0.45f},{PDMIX,0.4f},{PMASTER,0.7f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.45f},{PDMIX,0.4f},{PMASTER,0.7f} }, cPads); add("Dream Pad", "PAD", { {PO1WAVE,0.25f},{PO2WAVE,0.25f},{PO1OCT,0.5f},{PO2OCT,0.5f},{PO1CT,0.52f},{PO2CT,0.48f}, {PMIX,0.5f},{PCUTOFF,0.38f},{PRES,0.42f},{PFENV,0.5f},{PATK,0.5f},{PDEC,0.45f},{PSUS,0.7f},{PREL,0.7f}, - {PDSYNC,1.0f},{PDSTEPS,12.0f},{PDFB,0.55f},{PDMIX,0.5f},{PMASTER,0.7f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.55f},{PDMIX,0.5f},{PMASTER,0.7f} }, cPads); add("Dark Pad", "PAD", { {PO1WAVE,0.5f},{PO2WAVE,0.75f},{PO1OCT,0.28f},{PO2OCT,0.35f},{PMIX,0.5f},{PCUTOFF,0.22f},{PRES,0.5f}, {PFENV,0.35f},{PATK,0.6f},{PDEC,0.45f},{PSUS,0.75f},{PREL,0.8f}, - {PDSYNC,1.0f},{PDSTEPS,12.0f},{PDFB,0.5f},{PDMIX,0.45f},{PMASTER,0.72f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.45f},{PMASTER,0.72f} }, cPads); add("Brass Pad", "PAD", { {PO1WAVE,0.75f},{PO2WAVE,0.5f},{PO1OCT,0.4f},{PO2OCT,0.5f},{PMIX,0.5f},{PCUTOFF,0.45f},{PRES,0.4f}, {PFENV,0.6f},{PATK,0.15f},{PDEC,0.4f},{PSUS,0.7f},{PREL,0.5f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.2f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.2f},{PMASTER,0.75f} }, { K("CUTOFF",PCUTOFF,0.05f,1.0f),K("F-ENV",PFENV,0.0f,1.0f),K("RES",PRES,0.0f,1.0f),K("D-MIX",PDMIX,0.0f,1.0f) }); add("String Swell", "PAD", @@ -179,26 +279,74 @@ Catalog& catalog() add("Shimmer Pad", "PAD", { {PO1WAVE,0.25f},{PO2WAVE,0.5f},{PO1OCT,0.62f},{PO2OCT,0.5f},{PO1CT,0.53f},{PO2CT,0.47f}, {PMIX,0.45f},{PCUTOFF,0.35f},{PRES,0.4f},{PFENV,0.5f},{PATK,0.4f},{PDEC,0.5f},{PSUS,0.6f},{PREL,0.8f}, - {PDSYNC,1.0f},{PDSTEPS,12.0f},{PDFB,0.65f},{PDMIX,0.6f},{PMASTER,0.7f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.65f},{PDMIX,0.6f},{PMASTER,0.7f} }, cPads); add("Airy Pad", "PAD", { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.47f},{PO2CT,0.52f},{PMIX,0.5f},{PNOISE,0.1f},{PCUTOFF,0.4f}, {PRES,0.25f},{PFENV,0.4f},{PATK,0.35f},{PDEC,0.5f},{PSUS,0.6f},{PREL,0.6f}, - {PDSYNC,1.0f},{PDSTEPS,10.0f},{PDMIX,0.4f},{PMASTER,0.68f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.4f},{PMASTER,0.68f} }, { K("CUTOFF",PCUTOFF,0.05f,0.9f),K("NOISE",PNOISE,0.0f,1.0f),K("DECAY",PDEC,0.2f,0.95f),K("DELAY",PDMIX,0.0f,1.0f) }); add("Vapor Pad", "PAD", { {PO1WAVE,0.75f},{PO2WAVE,0.25f},{PO1CT,0.55f},{PO2CT,0.48f},{PMIX,0.5f},{PCUTOFF,0.28f},{PRES,0.55f}, {PFENV,0.6f},{PATK,0.5f},{PDEC,0.5f},{PSUS,0.55f},{PREL,0.85f}, - {PDSYNC,1.0f},{PDSTEPS,12.0f},{PDFB,0.6f},{PDMIX,0.55f},{PMASTER,0.7f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.6f},{PDMIX,0.55f},{PMASTER,0.7f} }, + cPads); + + add("Glass Choir", "PAD", + { {PO1WAVE,0.25f},{PO2WAVE,0.0f},{PO1OCT,0.62f},{PO2OCT,0.5f},{PMIX,0.6f}, + {PCUTOFF,0.5f},{PRES,0.25f},{PFENV,0.6f},{PATK,0.4f},{PDEC,0.4f},{PSUS,0.7f},{PREL,0.6f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.4f},{PMASTER,0.7f} }, + cPads); + + add("Silky Pad", "PAD", + { {PO1WAVE,0.5f},{PO2WAVE,0.25f},{PO1CT,0.48f},{PO2CT,0.52f},{PMIX,0.45f}, + {PCUTOFF,0.3f},{PRES,0.35f},{PFENV,0.4f},{PATK,0.6f},{PDEC,0.4f},{PSUS,0.7f},{PREL,0.8f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.55f},{PDMIX,0.6f},{PMASTER,0.68f} }, + cPads); + + add("Warm Strings", "PAD", + { {PO1WAVE,0.25f},{PO2WAVE,0.5f},{PO1CT,0.52f},{PO2CT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.35f},{PRES,0.3f},{PFENV,0.5f},{PATK,0.5f},{PDEC,0.45f},{PSUS,0.7f},{PREL,0.7f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.45f},{PMASTER,0.7f} }, + cPads); + + add("Orbiter", "PAD", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.5f},{PO2CT,0.55f},{PMIX,0.5f},{PNOISE,0.1f}, + {PCUTOFF,0.55f},{PRES,0.7f},{PFTYPE,0.5f},{PFENV,0.5f},{PATK,0.35f},{PDEC,0.5f},{PSUS,0.6f},{PREL,0.6f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.7f},{PDMIX,0.6f},{PMASTER,0.68f} }, + { K("CUTOFF",PCUTOFF,0.05f,0.9f),K("RES",PRES,0.0f,1.0f),K("F-ENV",PFENV,0.0f,1.0f),K("DELAY",PDMIX,0.0f,1.0f) }); + + add("Midnight Pad", "PAD", + { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1OCT,0.28f},{PO2OCT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.2f},{PRES,0.5f},{PFENV,0.4f},{PATK,0.7f},{PDEC,0.4f},{PSUS,0.8f},{PREL,0.8f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.6f},{PDMIX,0.55f},{PMASTER,0.72f} }, + cPads); + + add("Cinematic Pad", "PAD", + { {PO1WAVE,0.0f},{PO2WAVE,0.5f},{PO1OCT,0.25f},{PO2OCT,0.3f},{PO1CT,0.5f},{PO2CT,0.53f},{PMIX,0.5f}, + {PCUTOFF,0.3f},{PRES,0.4f},{PFENV,0.5f},{PATK,0.8f},{PDEC,0.4f},{PSUS,0.8f},{PREL,0.9f}, + {PDSYNC,0.0f},{PMASTER,0.7f} }, + cPads); + + add("Neon Pad", "PAD", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.4f},{PO2CT,0.6f},{PMIX,0.5f}, + {PCUTOFF,0.4f},{PRES,0.4f},{PFENV,0.5f},{PATK,0.3f},{PDEC,0.5f},{PSUS,0.7f},{PREL,0.6f}, + {PDRIVE,0.3f},{PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.45f},{PMASTER,0.7f} }, + { K("CUTOFF",PCUTOFF,0.05f,0.9f),K("RES",PRES,0.0f,1.0f),K("DECAY",PDEC,0.2f,0.95f),K("DELAY",PDMIX,0.0f,1.0f) }); + + add("Pad Drift", "PAD", + { {PO1WAVE,0.25f},{PO2WAVE,0.25f},{PO1CT,0.45f},{PO2CT,0.55f},{PMIX,0.5f}, + {PCUTOFF,0.33f},{PRES,0.3f},{PFENV,0.35f},{PATK,0.9f},{PDEC,0.3f},{PSUS,0.8f},{PREL,0.7f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.5f},{PMASTER,0.7f} }, cPads); // KEYS ------------------------------------------------------------ add("DX Bell", "KEYS", { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO2OCT,0.83f},{PMIX,0.4f},{PCUTOFF,0.5f},{PRES,0.3f},{PFENV,0.3f}, {PATK,0.002f},{PDEC,0.35f},{PSUS,0.1f},{PREL,0.5f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, cKeys); add("Wurly", "KEYS", @@ -210,13 +358,13 @@ Catalog& catalog() add("Rhodes EP", "KEYS", { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO2OCT,0.5f},{PO1CT,0.51f},{PO2CT,0.49f},{PMIX,0.45f}, {PCUTOFF,0.42f},{PRES,0.35f},{PFENV,0.35f},{PATK,0.003f},{PDEC,0.45f},{PSUS,0.15f},{PREL,0.35f}, - {PDRIVE,0.3f},{PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, + {PDRIVE,0.3f},{PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, { K("CUTOFF",PCUTOFF,0.05f,0.85f),K("DRIVE",PDRIVE,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.9f),K("D-MIX",PDMIX,0.0f,0.8f) }); add("Clay EP", "KEYS", { {PO1WAVE,0.25f},{PO2WAVE,0.0f},{PO1OCT,0.5f},{PO2OCT,0.62f},{PMIX,0.6f},{PCUTOFF,0.38f},{PRES,0.4f}, {PFENV,0.45f},{PATK,0.006f},{PDEC,0.4f},{PSUS,0.15f},{PREL,0.3f},{PDRIVE,0.35f}, - {PDSYNC,1.0f},{PDSTEPS,6.0f},{PDMIX,0.25f},{PMASTER,0.72f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.25f},{PMASTER,0.72f} }, cKeys); add("Harpsi", "KEYS", @@ -228,26 +376,62 @@ Catalog& catalog() add("Toy Piano", "KEYS", { {PO1WAVE,0.75f},{PO2WAVE,0.0f},{PO1OCT,0.5f},{PO2OCT,0.75f},{PMIX,0.5f},{PCUTOFF,0.3f},{PRES,0.5f}, {PFENV,0.5f},{PATK,0.001f},{PDEC,0.4f},{PSUS,0.2f},{PREL,0.15f}, - {PDSYNC,1.0f},{PDSTEPS,6.0f},{PDMIX,0.25f},{PMASTER,0.72f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.25f},{PMASTER,0.72f} }, cKeys); add("Warm EP", "KEYS", { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO1CT,0.52f},{PO2CT,0.48f},{PMIX,0.5f},{PCUTOFF,0.45f},{PRES,0.3f}, {PFENV,0.4f},{PATK,0.004f},{PDEC,0.45f},{PSUS,0.3f},{PREL,0.3f},{PDRIVE,0.2f}, - {PDSYNC,1.0f},{PDSTEPS,10.0f},{PDMIX,0.35f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.35f},{PMASTER,0.75f} }, { K("CUTOFF",PCUTOFF,0.05f,0.9f),K("DRIVE",PDRIVE,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.9f),K("DELAY",PDMIX,0.0f,1.0f) }); + add("Sunset EP", "KEYS", + { {PO1WAVE,0.25f},{PO2WAVE,0.0f},{PO1OCT,0.5f},{PO2OCT,0.5f},{PO1CT,0.5f},{PO2CT,0.52f},{PMIX,0.6f}, + {PCUTOFF,0.36f},{PRES,0.4f},{PFENV,0.45f},{PATK,0.005f},{PDEC,0.5f},{PSUS,0.2f},{PREL,0.35f},{PDRIVE,0.3f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.35f},{PMASTER,0.75f} }, + cKeys); + + add("Tine Piano", "KEYS", + { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1OCT,0.5f},{PO2OCT,0.62f},{PO1CT,0.51f},{PO2CT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.36f},{PRES,0.45f},{PFENV,0.6f},{PATK,0.002f},{PDEC,0.45f},{PSUS,0.1f},{PREL,0.3f},{PDRIVE,0.4f}, + {PDSYNC,0.0f},{PMASTER,0.78f} }, + cKeys); + + add("E-Piano 2", "KEYS", + { {PO1WAVE,0.5f},{PO2WAVE,0.0f},{PO1OCT,0.5f},{PO2OCT,0.75f},{PMIX,0.5f}, + {PCUTOFF,0.4f},{PRES,0.4f},{PFENV,0.5f},{PATK,0.002f},{PDEC,0.5f},{PSUS,0.15f},{PREL,0.35f},{PDRIVE,0.35f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.25f},{PMASTER,0.75f} }, + cKeys); + + add("Mono Keys", "KEYS", + { {PO1WAVE,0.5f},{PO2WAVE,0.25f},{PO1CT,0.51f},{PO2CT,0.49f},{PMIX,0.5f}, + {PCUTOFF,0.42f},{PRES,0.35f},{PFENV,0.4f},{PATK,0.006f},{PDEC,0.45f},{PSUS,0.3f},{PREL,0.25f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, + { K("CUTOFF",PCUTOFF,0.05f,0.85f),K("DRIVE",PDRIVE,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.9f),K("D-MIX",PDMIX,0.0f,0.8f) }); + + add("Tron Keys", "KEYS", + { {PO1WAVE,0.25f},{PO2WAVE,0.25f},{PO1OCT,0.5f},{PO2OCT,0.62f},{PMIX,0.6f}, + {PCUTOFF,0.35f},{PRES,0.4f},{PFENV,0.6f},{PATK,0.01f},{PDEC,0.4f},{PSUS,0.6f},{PREL,0.5f}, + {PDSYNC,0.0f},{PMASTER,0.72f} }, + cKeys); + + add("Glassy Keys", "KEYS", + { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO1OCT,0.62f},{PO2OCT,0.83f},{PMIX,0.4f}, + {PCUTOFF,0.5f},{PRES,0.3f},{PFENV,0.4f},{PATK,0.002f},{PDEC,0.5f},{PSUS,0.15f},{PREL,0.5f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.35f},{PMASTER,0.72f} }, + cKeys); + // PLUCK ----------------------------------------------------------- add("Wood Pluck", "PLUCK", { {PO1WAVE,0.25f},{PO2WAVE,0.0f},{PO1OCT,0.5f},{PO2OCT,0.8f},{PMIX,0.6f},{PCUTOFF,0.32f},{PRES,0.55f}, {PFENV,0.7f},{PATK,0.001f},{PDEC,0.25f},{PSUS,0.0f},{PREL,0.2f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.25f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.25f},{PMASTER,0.75f} }, cPluck); add("Perc Pluck", "PLUCK", { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1OCT,0.5f},{PO2OCT,0.5f},{PO1CT,0.5f},{PO2CT,0.58f},{PMIX,0.5f}, {PCUTOFF,0.25f},{PRES,0.6f},{PFENV,0.6f},{PATK,0.001f},{PDEC,0.2f},{PSUS,0.0f},{PREL,0.2f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.3f},{PMASTER,0.78f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.78f} }, cPluck); add("Guitar Pluck", "PLUCK", @@ -259,26 +443,62 @@ Catalog& catalog() add("Bubble", "PLUCK", { {PO1WAVE,0.0f},{PO2WAVE,0.25f},{PO2OCT,0.83f},{PMIX,0.4f},{PCUTOFF,0.3f},{PRES,0.6f},{PFENV,0.7f}, {PATK,0.003f},{PDEC,0.45f},{PSUS,0.0f},{PREL,0.4f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDFB,0.5f},{PDMIX,0.4f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.4f},{PMASTER,0.75f} }, { K("CUTOFF",PCUTOFF,0.05f,0.9f),K("DECAY",PDEC,0.1f,0.95f),K("RES",PRES,0.0f,1.0f),K("DELAY",PDMIX,0.0f,1.0f) }); add("Kalimba", "PLUCK", { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO2OCT,0.83f},{PMIX,0.35f},{PCUTOFF,0.5f},{PRES,0.35f},{PFENV,0.4f}, {PATK,0.001f},{PDEC,0.4f},{PSUS,0.0f},{PREL,0.35f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, { K("RATIO",PO2OCT,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.95f),K("RES",PRES,0.0f,1.0f),K("DELAY",PDMIX,0.0f,1.0f) }); add("Karpling", "PLUCK", { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1OCT,0.5f},{PO2OCT,0.5f},{PO1CT,0.49f},{PO2CT,0.51f},{PMIX,0.5f}, {PCUTOFF,0.35f},{PRES,0.5f},{PFENV,0.5f},{PATK,0.001f},{PDEC,0.3f},{PSUS,0.0f},{PREL,0.2f}, - {PDRIVE,0.2f},{PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.25f},{PMASTER,0.75f} }, + {PDRIVE,0.2f},{PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.25f},{PMASTER,0.75f} }, + cPluck); + + add("Banjo Pluck", "PLUCK", + { {PO1WAVE,0.75f},{PO2WAVE,0.5f},{PO1OCT,0.5f},{PO2OCT,0.62f},{PO1CT,0.49f},{PO2CT,0.51f},{PMIX,0.5f}, + {PCUTOFF,0.4f},{PRES,0.4f},{PFENV,0.6f},{PATK,0.001f},{PDEC,0.35f},{PSUS,0.0f},{PREL,0.15f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, + cPluck); + + add("Electric Pluck", "PLUCK", + { {PO1WAVE,0.5f},{PO2WAVE,0.0f},{PO1OCT,0.5f},{PO2OCT,0.62f},{PMIX,0.6f}, + {PCUTOFF,0.28f},{PRES,0.6f},{PFENV,0.7f},{PATK,0.001f},{PDEC,0.25f},{PSUS,0.0f},{PREL,0.2f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.35f},{PMASTER,0.78f} }, + cPluck); + + add("Zither", "PLUCK", + { {PO1WAVE,0.25f},{PO2WAVE,0.0f},{PO1OCT,0.5f},{PO2OCT,0.5f},{PMIX,0.6f}, + {PCUTOFF,0.45f},{PRES,0.35f},{PFENV,0.45f},{PATK,0.002f},{PDEC,0.4f},{PSUS,0.0f},{PREL,0.25f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, + cPluck); + + add("Tweedy Pluck", "PLUCK", + { {PO1WAVE,0.5f},{PO2WAVE,0.75f},{PO1OCT,0.5f},{PO2OCT,0.5f},{PO1CT,0.53f},{PO2CT,0.47f},{PMIX,0.5f}, + {PCUTOFF,0.45f},{PRES,0.5f},{PFENV,0.55f},{PATK,0.003f},{PDEC,0.4f},{PSUS,0.05f},{PREL,0.2f}, + {PDSYNC,0.0f},{PMASTER,0.75f} }, + cPluck); + + add("Mono Strum", "PLUCK", + { {PO1WAVE,0.5f},{PO2WAVE,0.25f},{PO2OCT,0.83f},{PO1CT,0.5f},{PO2CT,0.54f},{PMIX,0.5f}, + {PCUTOFF,0.3f},{PRES,0.55f},{PFENV,0.7f},{PATK,0.002f},{PDEC,0.55f},{PSUS,0.0f},{PREL,0.4f}, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.45f},{PDMIX,0.4f},{PMASTER,0.78f} }, + cPluck); + + add("Sitarish", "PLUCK", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.6f},{PO2CT,0.4f},{PMIX,0.5f}, + {PCUTOFF,0.38f},{PRES,0.65f},{PFENV,0.6f},{PATK,0.002f},{PDEC,0.45f},{PSUS,0.0f},{PREL,0.35f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, cPluck); // FX -------------------------------------------------------------- add("Wobble FX", "FX", { {PO1WAVE,0.5f},{PO2WAVE,0.0f},{PO1CT,0.58f},{PMIX,0.5f},{PCUTOFF,0.12f},{PRES,0.7f},{PFENV,0.9f}, {PATK,0.01f},{PDEC,0.5f},{PSUS,0.3f},{PREL,0.4f}, - {PDSYNC,1.0f},{PDSTEPS,6.0f},{PDFB,0.7f},{PDMIX,0.5f},{PMASTER,0.8f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.7f},{PDMIX,0.5f},{PMASTER,0.8f} }, cShp); add("Riser", "FX", @@ -290,19 +510,19 @@ Catalog& catalog() add("Laser", "FX", { {PO1WAVE,0.75f},{PO2WAVE,0.0f},{PMIX,1.0f},{PCUTOFF,0.08f},{PRES,0.8f},{PFENV,0.8f}, {PATK,0.002f},{PDEC,0.4f},{PSUS,0.0f},{PREL,0.3f}, - {PDSYNC,1.0f},{PDSTEPS,4.0f},{PDFB,0.4f},{PDMIX,0.4f},{PMASTER,0.8f} }, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.4f},{PDMIX,0.4f},{PMASTER,0.8f} }, cShp); add("Sweep", "FX", { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1OCT,0.5f},{PO2OCT,0.75f},{PMIX,0.5f},{PNOISE,0.2f},{PCUTOFF,0.35f}, {PRES,0.45f},{PFENV,0.6f},{PATK,0.2f},{PDEC,0.5f},{PSUS,0.5f},{PREL,0.6f}, - {PDSYNC,1.0f},{PDSTEPS,12.0f},{PDFB,0.6f},{PDMIX,0.5f},{PMASTER,0.72f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.6f},{PDMIX,0.5f},{PMASTER,0.72f} }, { K("CUTOFF",PCUTOFF,0.05f,1.0f),K("F-ENV",PFENV,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.95f),K("DELAY",PDMIX,0.0f,1.0f) }); add("Drone FX", "FX", { {PO1WAVE,0.75f},{PO2WAVE,0.5f},{PO1OCT,0.25f},{PO2OCT,0.28f},{PO1CT,0.54f},{PO2CT,0.55f},{PMIX,0.5f}, {PNOISE,0.12f},{PCUTOFF,0.25f},{PRES,0.6f},{PFENV,0.2f},{PATK,0.8f},{PDEC,0.3f},{PSUS,0.8f},{PREL,0.8f}, - {PDSYNC,1.0f},{PDSTEPS,16.0f},{PDFB,0.7f},{PDMIX,0.6f},{PMASTER,0.72f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.7f},{PDMIX,0.6f},{PMASTER,0.72f} }, cNoise); add("Tuned Noise", "FX", @@ -311,6 +531,42 @@ Catalog& catalog() {PDSYNC,0.0f},{PMASTER,0.68f} }, cNoise); + add("Ping Sweep", "FX", + { {PO1WAVE,0.5f},{PO2WAVE,0.0f},{PO1CT,0.45f},{PMIX,0.6f},{PCUTOFF,0.25f},{PRES,0.8f},{PFENV,0.9f}, + {PATK,0.02f},{PDEC,0.5f},{PSUS,0.1f},{PREL,0.4f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.7f},{PDMIX,0.55f},{PMASTER,0.8f} }, + cShp); + + add("Alien Siren", "FX", + { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1CT,0.6f},{PO2CT,0.4f},{PMIX,0.5f}, + {PCUTOFF,0.3f},{PRES,0.7f},{PFENV,0.8f},{PATK,0.5f},{PDEC,0.6f},{PSUS,0.6f},{PREL,0.7f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.8f},{PDMIX,0.6f},{PMASTER,0.72f} }, + { K("CUTOFF",PCUTOFF,0.05f,1.0f),K("RES",PRES,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.95f),K("DELAY",PDMIX,0.0f,1.0f) }); + + add("Riser Hiss", "FX", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1OCT,0.5f},{PO2OCT,0.75f},{PMIX,0.5f},{PNOISE,0.8f},{PCUTOFF,0.15f}, + {PRES,0.4f},{PFENV,0.75f},{PATK,0.9f},{PDEC,0.1f},{PSUS,0.8f},{PREL,0.15f}, + {PDSYNC,0.0f},{PMASTER,0.7f} }, + { K("RISE",PATK,0.2f,1.0f),K("CUTOFF",PCUTOFF,0.05f,1.0f),K("NOISE",PNOISE,0.0f,1.0f),K("D-MIX",PDMIX,0.0f,1.0f) }); + + add("Droplet", "FX", + { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO2OCT,0.83f},{PMIX,0.4f},{PCUTOFF,0.3f},{PRES,0.55f},{PFENV,0.7f}, + {PATK,0.001f},{PDEC,0.5f},{PSUS,0.0f},{PREL,0.45f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.6f},{PDMIX,0.5f},{PMASTER,0.75f} }, + cBell); + + add("Glitch Noise", "FX", + { {PO1WAVE,0.8f},{PO2WAVE,0.8f},{PMIX,0.5f},{PNOISE,0.9f},{PCUTOFF,0.2f},{PRES,0.7f},{PFENV,0.6f}, + {PATK,0.002f},{PDEC,0.4f},{PSUS,0.0f},{PREL,0.3f}, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.7f},{PDMIX,0.6f},{PMASTER,0.8f} }, + cNoise); + + add("Sub Drop", "FX", + { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO1OCT,0.25f},{PO2OCT,0.28f},{PMIX,0.9f},{PNOISE,0.05f}, + {PCUTOFF,0.2f},{PRES,0.4f},{PFENV,0.9f},{PATK,0.01f},{PDEC,0.6f},{PSUS,0.0f},{PREL,0.5f}, + {PDSYNC,0.0f},{PMASTER,0.8f} }, + cTone); + // STAB / ARP ------------------------------------------------------ add("Detroit Stab", "STAB", { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1OCT,0.5f},{PO2OCT,0.5f},{PO1CT,0.52f},{PO2CT,0.48f},{PMIX,0.5f}, @@ -321,7 +577,7 @@ Catalog& catalog() add("Juno Stab", "STAB", { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.5f},{PO2CT,0.5f},{PMIX,0.5f},{PCUTOFF,0.48f},{PRES,0.35f}, {PFENV,0.5f},{PATK,0.003f},{PDEC,0.4f},{PSUS,0.2f},{PREL,0.2f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.3f},{PMASTER,0.78f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.78f} }, cStab); add("Chord Stab", "STAB", @@ -333,38 +589,245 @@ Catalog& catalog() add("House Stab", "STAB", { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.48f},{PO2CT,0.52f},{PMIX,0.5f},{PCUTOFF,0.45f},{PRES,0.3f}, {PFENV,0.5f},{PATK,0.003f},{PDEC,0.3f},{PSUS,0.3f},{PREL,0.18f}, - {PDSYNC,1.0f},{PDSTEPS,8.0f},{PDMIX,0.25f},{PMASTER,0.8f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.25f},{PMASTER,0.8f} }, + cStab); + + add("Gospel Stab", "STAB", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1OCT,0.5f},{PO2OCT,0.62f},{PO1CT,0.52f},{PO2CT,0.48f},{PMIX,0.5f}, + {PCUTOFF,0.5f},{PRES,0.35f},{PFENV,0.6f},{PATK,0.003f},{PDEC,0.4f},{PSUS,0.2f},{PREL,0.2f},{PDRIVE,0.3f}, + {PDSYNC,0.0f},{PMASTER,0.78f} }, + cStab); + + add("Disco Stab", "STAB", + { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1CT,0.5f},{PO2CT,0.5f},{PMIX,0.5f},{PCUTOFF,0.5f},{PRES,0.3f}, + {PFENV,0.5f},{PATK,0.002f},{PDEC,0.3f},{PSUS,0.2f},{PREL,0.12f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.8f} }, + cStab); + + add("Orb Stab", "STAB", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.55f},{PO2CT,0.45f},{PMIX,0.5f},{PCUTOFF,0.3f},{PRES,0.6f}, + {PFENV,0.7f},{PATK,0.02f},{PDEC,0.4f},{PSUS,0.4f},{PREL,0.4f},{PDRIVE,0.2f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.35f},{PMASTER,0.75f} }, + cShp); + + add("Offbeat Stab", "STAB", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.47f},{PO2CT,0.53f},{PMIX,0.5f},{PCUTOFF,0.42f},{PRES,0.4f}, + {PFENV,0.55f},{PATK,0.005f},{PDEC,0.35f},{PSUS,0.2f},{PREL,0.15f}, + {PDSYNC,0.0f},{PMASTER,0.8f} }, cStab); add("Arp Energy", "ARP", { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.52f},{PO2CT,0.5f},{PMIX,0.5f},{PCUTOFF,0.45f},{PRES,0.4f}, {PFENV,0.5f},{PATK,0.008f},{PDEC,0.3f},{PSUS,0.5f},{PREL,0.15f}, - {PDSYNC,1.0f},{PDSTEPS,4.0f},{PDFB,0.5f},{PDMIX,0.45f},{PMASTER,0.78f} }, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.5f},{PDMIX,0.45f},{PMASTER,0.78f} }, cCff); add("Trance Gate", "ARP", { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1CT,0.51f},{PO2CT,0.49f},{PMIX,0.5f},{PCUTOFF,0.4f},{PRES,0.3f}, {PFENV,0.55f},{PATK,0.01f},{PDEC,0.5f},{PSUS,0.4f},{PREL,0.12f},{PDRIVE,0.25f}, - {PDSYNC,1.0f},{PDSTEPS,6.0f},{PDFB,0.6f},{PDMIX,0.5f},{PMASTER,0.78f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.6f},{PDMIX,0.5f},{PMASTER,0.78f} }, { K("CUTOFF",PCUTOFF,0.05f,1.0f),K("RES",PRES,0.0f,1.0f),K("DECAY",PDEC,0.1f,0.9f),K("DELAY",PDMIX,0.0f,1.0f) }); add("Neon Arp", "ARP", { {PO1WAVE,0.5f},{PO2WAVE,0.25f},{PO1OCT,0.62f},{PO2OCT,0.5f},{PO1CT,0.55f},{PO2CT,0.5f},{PMIX,0.5f}, {PCUTOFF,0.35f},{PRES,0.55f},{PFENV,0.7f},{PATK,0.003f},{PDEC,0.4f},{PSUS,0.2f},{PREL,0.3f}, - {PDSYNC,1.0f},{PDSTEPS,4.0f},{PDFB,0.6f},{PDMIX,0.55f},{PMASTER,0.78f} }, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.6f},{PDMIX,0.55f},{PMASTER,0.78f} }, cCff); add("Retro Arp", "ARP", { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1CT,0.5f},{PO2CT,0.5f},{PMIX,0.5f},{PCUTOFF,0.42f},{PRES,0.35f}, {PFENV,0.5f},{PATK,0.004f},{PDEC,0.5f},{PSUS,0.5f},{PREL,0.1f}, - {PDSYNC,1.0f},{PDSTEPS,4.0f},{PDFB,0.55f},{PDMIX,0.4f},{PMASTER,0.78f} }, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.55f},{PDMIX,0.4f},{PMASTER,0.78f} }, cCff); add("Dark Arp", "ARP", { {PO1WAVE,0.25f},{PO2WAVE,0.25f},{PO1CT,0.5f},{PO2CT,0.53f},{PMIX,0.5f},{PCUTOFF,0.25f},{PRES,0.6f}, {PFENV,0.8f},{PATK,0.002f},{PDEC,0.3f},{PSUS,0.1f},{PREL,0.3f}, - {PDSYNC,1.0f},{PDSTEPS,6.0f},{PDFB,0.65f},{PDMIX,0.5f},{PMASTER,0.75f} }, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.65f},{PDMIX,0.5f},{PMASTER,0.75f} }, cShp); + + add("808 Arp", "ARP", + { {PO1WAVE,0.75f},{PO2WAVE,0.5f},{PO1CT,0.5f},{PO2CT,0.53f},{PMIX,0.5f}, + {PCUTOFF,0.35f},{PRES,0.45f},{PFENV,0.6f},{PATK,0.004f},{PDEC,0.4f},{PSUS,0.3f},{PREL,0.12f}, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.5f},{PDMIX,0.4f},{PMASTER,0.78f} }, + cCff); + + add("Squaregate", "ARP", + { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1CT,0.5f},{PO2CT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.5f},{PRES,0.25f},{PFENV,0.4f},{PATK,0.002f},{PDEC,0.35f},{PSUS,0.0f},{PREL,0.1f}, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.8f} }, + cStab); + + add("Pluck Arp 16", "ARP", + { {PO1WAVE,0.5f},{PO2WAVE,0.25f},{PO1CT,0.51f},{PO2CT,0.49f},{PMIX,0.5f}, + {PCUTOFF,0.35f},{PRES,0.5f},{PFENV,0.6f},{PATK,0.002f},{PDEC,0.3f},{PSUS,0.0f},{PREL,0.15f}, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.5f},{PDMIX,0.45f},{PMASTER,0.78f} }, + cPluck); + + add("Dream Melody", "ARP", + { {PO1WAVE,0.25f},{PO2WAVE,0.25f},{PO1CT,0.48f},{PO2CT,0.55f},{PMIX,0.5f}, + {PCUTOFF,0.4f},{PRES,0.3f},{PFENV,0.5f},{PATK,0.004f},{PDEC,0.5f},{PSUS,0.3f},{PREL,0.5f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.6f},{PDMIX,0.6f},{PMASTER,0.75f} }, + cCff); + + add("Filter Sweep Arp", "ARP", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.5f},{PO2CT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.18f},{PRES,0.7f},{PFENV,0.85f},{PATK,0.003f},{PDEC,0.4f},{PSUS,0.2f},{PREL,0.2f}, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.6f},{PDMIX,0.45f},{PMASTER,0.8f} }, + cShp); + + add("Mono Seq", "ARP", + { {PO1WAVE,0.75f},{PO2WAVE,0.0f},{PO1CT,0.5f},{PMIX,0.9f}, + {PCUTOFF,0.4f},{PRES,0.4f},{PFENV,0.5f},{PATK,0.001f},{PDEC,0.3f},{PSUS,0.2f},{PREL,0.1f},{PGLIDE,0.4f}, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.4f},{PDMIX,0.3f},{PMASTER,0.8f} }, + cKeys); + + add("Twilight Arp", "ARP", + { {PO1WAVE,0.5f},{PO2WAVE,0.25f},{PO1OCT,0.55f},{PO2OCT,0.5f},{PO1CT,0.55f},{PO2CT,0.48f},{PMIX,0.5f}, + {PCUTOFF,0.3f},{PRES,0.55f},{PFENV,0.7f},{PATK,0.003f},{PDEC,0.4f},{PSUS,0.15f},{PREL,0.3f}, + {PDSYNC,1.0f},{PDSTEPS,4.0f/15.0f},{PDFB,0.6f},{PDMIX,0.55f},{PMASTER,0.78f} }, + cCff); + + add("Jungle Arp", "ARP", + { {PO1WAVE,0.25f},{PO2WAVE,0.25f},{PO1CT,0.42f},{PO2CT,0.58f},{PMIX,0.5f}, + {PCUTOFF,0.28f},{PRES,0.6f},{PFENV,0.8f},{PATK,0.002f},{PDEC,0.3f},{PSUS,0.1f},{PREL,0.25f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.6f},{PDMIX,0.5f},{PMASTER,0.75f} }, + cShp); + + // ORGAN ------------------------------------------------------------ + add("Church Organ", "ORGAN", + { {PO1WAVE,0.75f},{PO2WAVE,0.75f},{PO1OCT,0.5f},{PO2OCT,0.5f},{PO1CT,0.51f},{PO2CT,0.49f},{PMIX,0.5f}, + {PCUTOFF,0.4f},{PRES,0.3f},{PFENV,0.2f},{PATK,0.02f},{PDEC,0.3f},{PSUS,0.8f},{PREL,0.15f},{PDRIVE,0.25f}, + {PDSYNC,0.0f},{PMASTER,0.78f} }, + cOrgan); + + add("Farfisa", "ORGAN", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.5f},{PO2CT,0.48f},{PMIX,0.5f}, + {PCUTOFF,0.5f},{PRES,0.25f},{PFENV,0.3f},{PATK,0.003f},{PDEC,0.25f},{PSUS,0.7f},{PREL,0.08f},{PDRIVE,0.5f}, + {PDSYNC,0.0f},{PMASTER,0.8f} }, + cOrgan); + + add("Wheel Organ", "ORGAN", + { {PO1WAVE,0.25f},{PO2WAVE,0.25f},{PO1CT,0.5f},{PO2CT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.35f},{PRES,0.3f},{PFENV,0.25f},{PATK,0.005f},{PDEC,0.3f},{PSUS,0.8f},{PREL,0.1f},{PDRIVE,0.4f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.2f},{PMASTER,0.78f} }, + cOrgan); + + add("Rotary Organ", "ORGAN", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.51f},{PO2CT,0.49f},{PMIX,0.5f},{PNOISE,0.05f}, + {PCUTOFF,0.45f},{PRES,0.3f},{PFENV,0.3f},{PATK,0.01f},{PDEC,0.3f},{PSUS,0.8f},{PREL,0.2f},{PDRIVE,0.2f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.4f},{PMASTER,0.78f} }, + cOrgan); + + add("Theater Organ", "ORGAN", + { {PO1WAVE,0.75f},{PO2WAVE,0.5f},{PO1OCT,0.62f},{PO2OCT,0.5f},{PO1CT,0.5f},{PO2CT,0.53f},{PMIX,0.5f}, + {PCUTOFF,0.4f},{PRES,0.35f},{PFENV,0.25f},{PATK,0.01f},{PDEC,0.35f},{PSUS,0.7f},{PREL,0.15f},{PDRIVE,0.35f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.35f},{PMASTER,0.75f} }, + cOrgan); + + add("Junk Organ", "ORGAN", + { {PO1WAVE,0.75f},{PO2WAVE,0.5f},{PO1CT,0.47f},{PO2CT,0.55f},{PMIX,0.5f}, + {PCUTOFF,0.35f},{PRES,0.5f},{PFENV,0.35f},{PATK,0.02f},{PDEC,0.4f},{PSUS,0.6f},{PREL,0.12f},{PDRIVE,0.7f}, + {PDSYNC,0.0f},{PMASTER,0.8f} }, + cOrgan); + + add("Swell Organ", "ORGAN", + { {PO1WAVE,0.25f},{PO2WAVE,0.25f},{PO1OCT,0.5f},{PO2OCT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.3f},{PRES,0.4f},{PFENV,0.4f},{PATK,0.7f},{PDEC,0.35f},{PSUS,0.8f},{PREL,0.5f}, + {PDSYNC,0.0f},{PMASTER,0.72f} }, + cOrgan); + + add("Reggae Cab", "ORGAN", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.5f},{PO2CT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.5f},{PRES,0.2f},{PFENV,0.25f},{PATK,0.004f},{PDEC,0.3f},{PSUS,0.6f},{PREL,0.08f},{PDRIVE,0.45f}, + {PDSYNC,0.0f},{PMASTER,0.8f} }, + cOrgan); + + // STRING ---------------------------------------------------------- + add("Orchestra", "STRING", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.49f},{PO2CT,0.51f},{PMIX,0.4f}, + {PCUTOFF,0.35f},{PRES,0.3f},{PFENV,0.5f},{PATK,0.6f},{PDEC,0.4f},{PSUS,0.8f},{PREL,0.7f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.4f},{PMASTER,0.72f} }, + cStr); + + add("Solo Violin", "STRING", + { {PO1WAVE,0.5f},{PO2WAVE,0.25f},{PO1CT,0.5f},{PO2CT,0.52f},{PMIX,0.7f}, + {PCUTOFF,0.4f},{PRES,0.35f},{PFENV,0.6f},{PATK,0.25f},{PDEC,0.4f},{PSUS,0.6f},{PREL,0.4f},{PGLIDE,0.2f}, + {PDSYNC,0.0f},{PMASTER,0.75f} }, + cStr); + + add("Celloso", "STRING", + { {PO1WAVE,0.25f},{PO2WAVE,0.25f},{PO1OCT,0.25f},{PO1CT,0.52f},{PO2CT,0.48f},{PMIX,0.5f}, + {PCUTOFF,0.3f},{PRES,0.3f},{PFENV,0.6f},{PATK,0.2f},{PDEC,0.5f},{PSUS,0.7f},{PREL,0.5f}, + {PDSYNC,0.0f},{PMASTER,0.7f} }, + cStr); + + add("Lead Strings", "STRING", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1OCT,0.5f},{PO2OCT,0.55f},{PO1CT,0.51f},{PO2CT,0.49f},{PMIX,0.5f}, + {PCUTOFF,0.5f},{PRES,0.3f},{PFENV,0.5f},{PATK,0.03f},{PDEC,0.4f},{PSUS,0.7f},{PREL,0.3f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.35f},{PMASTER,0.75f} }, + cStr); + + add("Glass Strings", "STRING", + { {PO1WAVE,0.25f},{PO2WAVE,0.0f},{PO1OCT,0.55f},{PO2OCT,0.62f},{PO1CT,0.53f},{PO2CT,0.5f},{PMIX,0.6f}, + {PCUTOFF,0.5f},{PRES,0.25f},{PFENV,0.5f},{PATK,0.5f},{PDEC,0.4f},{PSUS,0.6f},{PREL,0.7f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.5f},{PMASTER,0.7f} }, + cStr); + + add("Pizz Strings", "STRING", + { {PO1WAVE,0.5f},{PO2WAVE,0.25f},{PO1CT,0.5f},{PO2CT,0.53f},{PMIX,0.5f}, + {PCUTOFF,0.3f},{PRES,0.5f},{PFENV,0.7f},{PATK,0.001f},{PDEC,0.3f},{PSUS,0.0f},{PREL,0.2f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.35f},{PMASTER,0.75f} }, + cPluck); + + add("Dark Strings", "STRING", + { {PO1WAVE,0.5f},{PO2WAVE,0.75f},{PO1OCT,0.25f},{PO2OCT,0.5f},{PMIX,0.5f}, + {PCUTOFF,0.24f},{PRES,0.5f},{PFENV,0.4f},{PATK,0.7f},{PDEC,0.4f},{PSUS,0.8f},{PREL,0.8f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.5f},{PMASTER,0.72f} }, + cStr); + + add("Ensemble 8", "STRING", + { {PO1WAVE,0.5f},{PO2WAVE,0.5f},{PO1CT,0.45f},{PO2CT,0.55f},{PMIX,0.4f}, + {PCUTOFF,0.32f},{PRES,0.4f},{PFENV,0.6f},{PATK,0.5f},{PDEC,0.4f},{PSUS,0.75f},{PREL,0.6f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.45f},{PMASTER,0.72f} }, + cStr); + + // BELL ------------------------------------------------------------ + add("Temple Bell", "BELL", + { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO2OCT,0.62f},{PMIX,0.5f},{PCUTOFF,0.35f},{PRES,0.3f},{PFENV,0.5f}, + {PATK,0.001f},{PDEC,0.7f},{PSUS,0.0f},{PREL,0.6f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.6f},{PDMIX,0.5f},{PMASTER,0.75f} }, + cBell); + + add("Music Box", "BELL", + { {PO1WAVE,0.25f},{PO2WAVE,0.0f},{PO2OCT,0.83f},{PMIX,0.5f},{PCUTOFF,0.5f},{PRES,0.25f},{PFENV,0.35f}, + {PATK,0.002f},{PDEC,0.45f},{PSUS,0.0f},{PREL,0.4f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.35f},{PMASTER,0.72f} }, + cBell); + + add("Wind Chime", "BELL", + { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO1OCT,0.62f},{PO2OCT,0.83f},{PO1CT,0.55f},{PO2CT,0.5f},{PMIX,0.45f}, + {PCUTOFF,0.4f},{PRES,0.35f},{PFENV,0.5f},{PATK,0.004f},{PDEC,0.6f},{PSUS,0.0f},{PREL,0.7f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.7f},{PDMIX,0.6f},{PMASTER,0.7f} }, + cBell); + + add("Bronze Bell", "BELL", + { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO1OCT,0.25f},{PO2OCT,0.5f},{PO1CT,0.5f},{PO2CT,0.53f},{PMIX,0.5f}, + {PCUTOFF,0.3f},{PRES,0.35f},{PFENV,0.45f},{PATK,0.001f},{PDEC,0.7f},{PSUS,0.0f},{PREL,0.8f}, + {PDSYNC,0.0f},{PMASTER,0.75f} }, + cBell); + + add("Glass Bell", "BELL", + { {PO1WAVE,0.0f},{PO2WAVE,0.0f},{PO1OCT,0.62f},{PO2OCT,0.83f},{PO1CT,0.6f},{PO2CT,0.5f},{PMIX,0.4f}, + {PCUTOFF,0.45f},{PRES,0.4f},{PFENV,0.55f},{PATK,0.001f},{PDEC,0.55f},{PSUS,0.0f},{PREL,0.5f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDFB,0.5f},{PDMIX,0.45f},{PMASTER,0.72f} }, + cBell); + + add("Marimba", "BELL", + { {PO1WAVE,0.25f},{PO2WAVE,0.0f},{PO1OCT,0.62f},{PO2OCT,0.5f},{PMIX,0.7f}, + {PCUTOFF,0.4f},{PRES,0.35f},{PFENV,0.5f},{PATK,0.001f},{PDEC,0.35f},{PSUS,0.0f},{PREL,0.3f}, + {PDSYNC,1.0f},{PDSTEPS,6.0f/15.0f},{PDMIX,0.3f},{PMASTER,0.75f} }, + cBell); } return cat; diff --git a/Source/SynthEngine.cpp b/Source/SynthEngine.cpp index 7a67702..60d6f24 100644 --- a/Source/SynthEngine.cpp +++ b/Source/SynthEngine.cpp @@ -64,6 +64,16 @@ void SynthEngine::setPresetIndex (int i) loadPreset (*PresetStore::findByIndex (i)); } +double SynthEngine::delayTimeMs() const +{ + if (getParam (PDSYNC) > 0.5f) + { + const int stepIdx = juce::jlimit (0, 15, (int) juce::roundToInt (getParam (PDSTEPS) * 15.0f)); + return stepsBeats()[stepIdx] * 60000.0 / lastBpmValue; + } + return paramReal (PDTIME, getParam (PDTIME)); +} + void SynthEngine::setParam (int id, float n01) { if (id < 0 || id >= kNumParams) return; @@ -257,7 +267,7 @@ void SynthEngine::process (AudioBuffer& buffer, MidiBuffer& midi, const int wave2 = paramWaveIndex (snap[(size_t) PO2WAVE]); bool delaySync = snap[(size_t) PDSYNC] > 0.5f; - int stepIdx = juce::jlimit (0, 15, (int) juce::roundToInt (snap[(size_t) PDSTEPS])); + int stepIdx = juce::jlimit (0, 15, (int) juce::roundToInt (snap[(size_t) PDSTEPS] * 15.0f)); float delayMsParam = paramReal (PDTIME, snap[(size_t) PDTIME]); float delaySec; if (delaySync) diff --git a/Source/SynthEngine.h b/Source/SynthEngine.h index cb00aaf..4ac7220 100644 --- a/Source/SynthEngine.h +++ b/Source/SynthEngine.h @@ -42,6 +42,7 @@ public: float lastBpm() const { return lastBpmValue; } bool transport() const { return wasPlaying; } int delayTimeSamples() const { return lastDelaySamples; } + double delayTimeMs() const; const char* waveNameFor (int index) const; diff --git a/Source/SynthParams.cpp b/Source/SynthParams.cpp index 178fe56..66da20d 100644 --- a/Source/SynthParams.cpp +++ b/Source/SynthParams.cpp @@ -178,7 +178,7 @@ String formatParamReal(int id, float n01) return formatTimeMs (paramReal (id, n01) * 1000.0f); case PDTIME: return formatTimeMs (paramReal (id, n01)); case PDSTEPS: - return stepsLabels() [juce::jlimit (0, 15, (int) juce::roundToInt (n01))]; + return stepsLabels() [juce::jlimit (0, 15, (int) juce::roundToInt (n01 * 15.0f))]; case PDSYNC: return n01 > 0.5f ? "SYNC" : "MS"; case PGLIDE: diff --git a/Source/SynthParams.h b/Source/SynthParams.h index 62f7617..0a8d1c0 100644 --- a/Source/SynthParams.h +++ b/Source/SynthParams.h @@ -41,7 +41,7 @@ inline std::array defaultParams() d[PFENV] = 0.38f; d[PFTYPE] = 0.0f; d[PATK] = 0.12f; d[PDEC] = 0.48f; d[PSUS] = 0.50f; d[PREL] = 0.55f; - d[PDTIME] = 0.30f; d[PDSTEPS]= 6.0f; + d[PDTIME] = 0.30f; d[PDSTEPS]= 6.0f / 15.0f; d[PDSYNC] = 1.0f; d[PDFB] = 0.42f; d[PDMIX] = 0.42f; d[PDRIVE] = 0.16f; d[PGLIDE] = 0.0f; d[PMASTER]= 0.70f; diff --git a/tools/gen_buildinfo.sh b/tools/gen_buildinfo.sh index c448682..db3eab3 100755 --- a/tools/gen_buildinfo.sh +++ b/tools/gen_buildinfo.sh @@ -20,7 +20,7 @@ if command -v git >/dev/null 2>&1 && [ -d "$SRC_DIR/.git" ]; then git_branch="$branch" fi -build_time=$(date '+%Y-%m-%d %H:%M:%S %Z' 2>/dev/null || date '+%Y-%m-%d %H:%M:%S') +build_time=$(date '+%Y-%m-%d %H:%M:%S' 2>/dev/null) mkdir -p "$(dirname "$OUT_FILE")" TMP="$OUT_FILE.tmp.$$"