feat(params): add parameters, macros, RAVE controls and resources
This commit is contained in:
@@ -0,0 +1,250 @@
|
||||
#include "FactoryPresets.h"
|
||||
|
||||
namespace serum
|
||||
{
|
||||
|
||||
namespace
|
||||
{
|
||||
using P = std::pair<const char*, float>;
|
||||
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<FactoryPreset>& getFactoryPresets()
|
||||
{
|
||||
static const std::vector<FactoryPreset> presets = []
|
||||
{
|
||||
std::vector<FactoryPreset> 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
|
||||
@@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
|
||||
#include <JuceHeader.h>
|
||||
#include "../Params.h"
|
||||
#include "../ModulationMatrix.h"
|
||||
|
||||
namespace serum
|
||||
{
|
||||
|
||||
// ===========================================================================
|
||||
// A factory preset: a name plus a sparse map of parameter values, modulation
|
||||
// connections and macro assignments. Unset parameters keep their defaults.
|
||||
// ===========================================================================
|
||||
struct FactoryPreset
|
||||
{
|
||||
juce::String name;
|
||||
std::vector<std::pair<const char*, float>> params;
|
||||
std::vector<ModConnection> mods;
|
||||
|
||||
struct MacroAssign
|
||||
{
|
||||
int macro = 0;
|
||||
ModTarget target = ModTarget::None;
|
||||
float depth = 0.0f;
|
||||
};
|
||||
std::vector<MacroAssign> macroAssigns;
|
||||
};
|
||||
|
||||
// All 16 factory presets, in program order.
|
||||
const std::vector<FactoryPreset>& getFactoryPresets();
|
||||
|
||||
} // namespace serum
|
||||
Reference in New Issue
Block a user