#include "FactoryPresets.h" namespace serum { namespace { using P = std::pair; inline P p (const char* id, float v) { return { id, v }; } // Semitones -> normalised coarse value (param range -24..+24). inline float coarse (int semitones) { return (float) (semitones + 24) / 48.0f; } // Unison count -> normalised value. inline float unison (int n) { return (float) (n - 1) / 15.0f; } // 6/12/24 dB slope -> normalised value. inline float slope (int db) { return db == 6 ? 0.0f : (db == 12 ? 0.5f : 1.0f); } // FxType -> normalised value. inline float fx (FxType t) { return (float) (int) t / 9.0f; } // LFO shape -> normalised value. inline float lfoShape (LfoShape s) { return (float) (int) s / 6.0f; } inline ModConnection mod (ModSource s, ModTarget t, float d, bool b = false) { return { s, t, d, b }; } } const std::vector& getFactoryPresets() { static const std::vector presets = [] { std::vector v; FactoryPreset pr; // 1. Init Saw pr = {}; pr.name = "Init Saw"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 0.0f), p (ids::oscAWtPos, 1.0f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.75f), p (ids::f1Res, 0.05f), p (ids::f1Slope, 1.0f) }; v.push_back (pr); // 2. Supersaw Stack pr = {}; pr.name = "Supersaw Stack"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 0.0f), p (ids::oscAWtPos, 1.0f), p (ids::oscAUnison, unison (7)), p (ids::oscADetune, 0.55f), p (ids::oscASpread, 0.75f), p (ids::oscALevel, 0.85f), p (ids::oscBOn, 1.0f), p (ids::oscBWave, 0.0f), p (ids::oscBWtPos, 1.0f), p (ids::oscBUnison, unison (5)), p (ids::oscBDetune, 0.45f), p (ids::oscBSpread, 0.6f), p (ids::oscBLevel, 0.55f), p (ids::oscBCoarse, coarse (12)), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.68f), p (ids::f1Res, 0.12f), p (ids::f1Slope, 1.0f), p (ids::fx1Type, fx (FxType::Chorus)), p (ids::fx1Mix, 0.35f), p (ids::fx1P1, 0.4f), p (ids::fx1P2, 0.4f), p (ids::fx2Type, fx (FxType::Reverb)), p (ids::fx2Mix, 0.25f), p (ids::fx2P1, 0.55f) }; v.push_back (pr); // 3. Wobble Bass pr = {}; pr.name = "Wobble Bass"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 9.0f / 9.0f), p (ids::oscAWtPos, 0.6f), p (ids::subOn, 1.0f), p (ids::subShape, 0.0f), p (ids::subOct, 0.5f), p (ids::subLevel, 0.6f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.35f), p (ids::f1Res, 0.35f), p (ids::f1Slope, 1.0f), p (ids::lfo1Shape, lfoShape (LfoShape::Square)), p (ids::lfo1Rate, 0.55f), p (ids::env1D, 0.35f), p (ids::env1S, 0.8f) }; pr.mods = { mod (ModSource::Lfo1, ModTarget::Filter1Cutoff, 0.5f, false), mod (ModSource::Env2, ModTarget::Filter1Cutoff, 0.3f, false) }; v.push_back (pr); // 4. Pluck pr = {}; pr.name = "Pluck"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 0.0f), p (ids::oscAWtPos, 0.8f), p (ids::env1A, 0.02f), p (ids::env1D, 0.18f), p (ids::env1S, 0.0f), p (ids::env1R, 0.2f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.7f), p (ids::f1Res, 0.15f), p (ids::f1Slope, 1.0f), p (ids::fx1Type, fx (FxType::Delay)), p (ids::fx1Mix, 0.3f), p (ids::fx1P1, 0.45f), p (ids::fx1P2, 0.45f) }; v.push_back (pr); // 5. Electric Keys pr = {}; pr.name = "Electric Keys"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 5.0f / 9.0f), p (ids::oscAWtPos, 0.5f), p (ids::oscBOn, 1.0f), p (ids::oscBWave, 5.0f / 9.0f), p (ids::oscBWtPos, 0.4f), p (ids::oscBLevel, 0.4f), p (ids::env1D, 0.4f), p (ids::env1S, 0.7f), p (ids::env1R, 0.35f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.6f), p (ids::f1Res, 0.05f), p (ids::f1Slope, 0.5f), p (ids::lfo1Shape, lfoShape (LfoShape::Sine)), p (ids::lfo1Rate, 0.7f) }; pr.mods = { mod (ModSource::Lfo1, ModTarget::Amp, 0.15f, true) }; v.push_back (pr); // 6. Pad Dreams pr = {}; pr.name = "Pad Dreams"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 8.0f / 9.0f), p (ids::oscAWtPos, 0.7f), p (ids::oscAUnison, unison (5)), p (ids::oscADetune, 0.5f), p (ids::oscASpread, 0.8f), p (ids::oscBOn, 1.0f), p (ids::oscBWave, 4.0f / 9.0f), p (ids::oscBWtPos, 0.4f), p (ids::oscBLevel, 0.5f), p (ids::env1A, 0.5f), p (ids::env1D, 0.5f), p (ids::env1S, 0.9f), p (ids::env1R, 0.7f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.5f), p (ids::f1Res, 0.05f), p (ids::f1Slope, 0.5f), p (ids::fx1Type, fx (FxType::Chorus)), p (ids::fx1Mix, 0.5f), p (ids::fx1P1, 0.3f), p (ids::fx1P2, 0.6f), p (ids::fx2Type, fx (FxType::Reverb)), p (ids::fx2Mix, 0.5f), p (ids::fx2P1, 0.75f), p (ids::fx2P2, 0.5f) }; v.push_back (pr); // 7. Lead pr = {}; pr.name = "Lead"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 6.0f / 9.0f), p (ids::oscAWtPos, 1.0f), p (ids::oscAUnison, unison (3)), p (ids::oscADetune, 0.3f), p (ids::oscASpread, 0.5f), p (ids::oscBOn, 1.0f), p (ids::oscBWave, 1.0f / 9.0f), p (ids::oscBWtPos, 0.5f), p (ids::oscBLevel, 0.4f), p (ids::oscBCoarse, coarse (12)), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.6f), p (ids::f1Res, 0.2f), p (ids::f1Slope, 1.0f), p (ids::env2D, 0.4f), p (ids::env2S, 0.4f), p (ids::fx1Type, fx (FxType::Distortion)), p (ids::fx1Mix, 0.2f), p (ids::fx1P1, 0.25f), p (ids::fx2Type, fx (FxType::Delay)), p (ids::fx2Mix, 0.3f), p (ids::fx2P1, 0.4f), p (ids::fx2P2, 0.4f) }; v.push_back (pr); // 8. Sub Bass pr = {}; pr.name = "Sub Bass"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 9.0f / 9.0f), p (ids::oscAWtPos, 0.0f), p (ids::subOn, 1.0f), p (ids::subShape, 0.0f), p (ids::subOct, 0.0f), p (ids::subLevel, 0.9f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.4f), p (ids::f1Res, 0.05f), p (ids::f1Slope, 1.0f) }; v.push_back (pr); // 9. Vowel Morph pr = {}; pr.name = "Vowel Morph"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 4.0f / 9.0f), p (ids::oscAWtPos, 0.3f), p (ids::f1On, 1.0f), p (ids::f1Type, 5.0f / 6.0f), p (ids::f1Cutoff, 0.5f), p (ids::f1Res, 0.2f), p (ids::lfo1Shape, lfoShape (LfoShape::Sine)), p (ids::lfo1Rate, 0.3f) }; pr.mods = { mod (ModSource::Lfo1, ModTarget::OscAWtPos, 0.6f, false) }; v.push_back (pr); // 10. Glass Bell pr = {}; pr.name = "Glass Bell"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 8.0f / 9.0f), p (ids::oscAWtPos, 0.6f), p (ids::env1A, 0.01f), p (ids::env1D, 0.5f), p (ids::env1S, 0.0f), p (ids::env1R, 0.8f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.8f), p (ids::f1Res, 0.1f), p (ids::f1Slope, 0.5f), p (ids::fx1Type, fx (FxType::Reverb)), p (ids::fx1Mix, 0.6f), p (ids::fx1P1, 0.7f), p (ids::fx1P2, 0.35f) }; v.push_back (pr); // 11. Sync Riser pr = {}; pr.name = "Sync Riser"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 2.0f / 9.0f), p (ids::oscAWtPos, 0.2f), p (ids::oscAWarp, 3.0f / 7.0f), p (ids::oscAWarpAmt, 0.6f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.3f), p (ids::f1Res, 0.2f), p (ids::f1Slope, 1.0f), p (ids::lfo1Shape, lfoShape (LfoShape::Saw)), p (ids::lfo1Rate, 0.2f) }; pr.mods = { mod (ModSource::Lfo1, ModTarget::OscAWtPos, 0.8f, false) }; v.push_back (pr); // 12. 8-Bit Blast pr = {}; pr.name = "8-Bit Blast"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 7.0f / 9.0f), p (ids::oscAWtPos, 0.9f), p (ids::oscAWarp, 4.0f / 7.0f), p (ids::oscAWarpAmt, 0.5f), p (ids::env1D, 0.15f), p (ids::env1S, 0.0f), p (ids::env1R, 0.1f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.7f), p (ids::f1Res, 0.05f), p (ids::f1Slope, 1.0f) }; v.push_back (pr); // 13. Organ pr = {}; pr.name = "Cathedral Organ"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 5.0f / 9.0f), p (ids::oscAWtPos, 0.8f), p (ids::oscBOn, 1.0f), p (ids::oscBWave, 5.0f / 9.0f), p (ids::oscBWtPos, 0.3f), p (ids::oscBLevel, 0.5f), p (ids::oscBCoarse, coarse (12)), p (ids::env1A, 0.05f), p (ids::env1S, 1.0f), p (ids::env1R, 0.3f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.7f), p (ids::f1Res, 0.0f), p (ids::f1Slope, 0.5f), p (ids::fx1Type, fx (FxType::Reverb)), p (ids::fx1Mix, 0.35f), p (ids::fx1P1, 0.6f), p (ids::fx1P2, 0.4f) }; v.push_back (pr); // 14. Choir pr = {}; pr.name = "Choir"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 4.0f / 9.0f), p (ids::oscAWtPos, 0.5f), p (ids::oscAUnison, unison (9)), p (ids::oscADetune, 0.4f), p (ids::oscASpread, 0.7f), p (ids::env1A, 0.45f), p (ids::env1S, 0.85f), p (ids::env1R, 0.6f), p (ids::f1On, 1.0f), p (ids::f1Type, 5.0f / 6.0f), p (ids::f1Cutoff, 0.45f), p (ids::f1Res, 0.15f), p (ids::fx1Type, fx (FxType::Chorus)), p (ids::fx1Mix, 0.5f), p (ids::fx1P1, 0.3f), p (ids::fx1P2, 0.7f), p (ids::fx2Type, fx (FxType::Reverb)), p (ids::fx2Mix, 0.55f), p (ids::fx2P1, 0.75f), p (ids::fx2P2, 0.5f) }; v.push_back (pr); // 15. Acid pr = {}; pr.name = "Acid"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 0.0f), p (ids::oscAWtPos, 1.0f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.3f), p (ids::f1Res, 0.6f), p (ids::f1Slope, 1.0f), p (ids::env2A, 0.02f), p (ids::env2D, 0.25f), p (ids::env2S, 0.1f) }; pr.mods = { mod (ModSource::Env2, ModTarget::Filter1Cutoff, 0.7f, false) }; v.push_back (pr); // 16. RAVE Anthem Lead pr = {}; pr.name = "RAVE Anthem Lead"; pr.params = { p (ids::oscAOn, 1.0f), p (ids::oscAWave, 0.0f), p (ids::oscAWtPos, 1.0f), p (ids::oscAUnison, unison (4)), p (ids::oscADetune, 0.4f), p (ids::oscASpread, 0.6f), p (ids::oscALevel, 0.85f), p (ids::oscBOn, 1.0f), p (ids::oscBWave, 0.0f), p (ids::oscBWtPos, 1.0f), p (ids::oscBUnison, unison (4)), p (ids::oscBDetune, 0.35f), p (ids::oscBSpread, 0.5f), p (ids::oscBLevel, 0.5f), p (ids::oscBCoarse, coarse (12)), p (ids::env1D, 0.4f), p (ids::env1S, 0.8f), p (ids::env1R, 0.3f), p (ids::f1On, 1.0f), p (ids::f1Type, 0.0f), p (ids::f1Cutoff, 0.6f), p (ids::f1Res, 0.15f), p (ids::f1Drive, 0.15f), p (ids::f1Slope, 1.0f), p (ids::fx1Type, fx (FxType::Hyper)), p (ids::fx1Mix, 0.35f), p (ids::fx1P1, 0.5f), p (ids::fx2Type, fx (FxType::Delay)), p (ids::fx2Mix, 0.28f), p (ids::fx2P1, 0.42f), p (ids::fx2P2, 0.4f), p (ids::fx3Type, fx (FxType::Reverb)), p (ids::fx3Mix, 0.22f), p (ids::fx3P1, 0.55f) }; pr.macroAssigns = { { 0, ModTarget::OscADetune, 0.5f }, { 0, ModTarget::OscBDetune, 0.4f }, { 0, ModTarget::Filter1Drive, 0.4f }, { 1, ModTarget::OscASpread, 0.6f }, { 1, ModTarget::OscBSpread, 0.5f }, { 2, ModTarget::Filter1Drive, 0.5f }, { 2, ModTarget::Filter2Drive, 0.4f }, { 3, ModTarget::Fx3Mix, 0.4f } }; v.push_back (pr); return v; }(); return presets; } } // namespace serum