Deluge Firmware 1.3.0
Build date: 2025.04.16
Loading...
Searching...
No Matches
param.h
1/*
2 * Copyright © 2024 Synthstrom Audible Limited
3 *
4 * This file is part of The Synthstrom Audible Deluge Firmware.
5 *
6 * The Synthstrom Audible Deluge Firmware is free software: you can redistribute it and/or modify it under the
7 * terms of the GNU General Public License as published by the Free Software Foundation,
8 * either version 3 of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
11 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 * See the GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along with this program.
15 * If not, see <https://www.gnu.org/licenses/>.
16 */
17
18#pragma once
19
20#include "definitions_cxx.hpp"
21#include "modulation/params/param_descriptor.h"
22#include "util/misc.h"
23#include <algorithm>
24#include <cstdint>
25
38
40
60
65using ParamType = uint8_t;
66
69 // Local linear params begin
70 LOCAL_OSC_A_VOLUME,
71 LOCAL_OSC_B_VOLUME,
72 LOCAL_VOLUME,
73 LOCAL_NOISE_VOLUME,
74 LOCAL_MODULATOR_0_VOLUME,
75 LOCAL_MODULATOR_1_VOLUME,
76 LOCAL_FOLD,
77
78 // Local non-volume params begin
79 FIRST_LOCAL_NON_VOLUME,
80 LOCAL_MODULATOR_0_FEEDBACK = FIRST_LOCAL_NON_VOLUME,
81 LOCAL_MODULATOR_1_FEEDBACK,
82 LOCAL_CARRIER_0_FEEDBACK,
83 LOCAL_CARRIER_1_FEEDBACK,
84 LOCAL_LPF_RESONANCE,
85 LOCAL_HPF_RESONANCE,
86 LOCAL_ENV_0_SUSTAIN,
87 LOCAL_ENV_1_SUSTAIN,
88 LOCAL_ENV_2_SUSTAIN,
89 LOCAL_ENV_3_SUSTAIN,
90 LOCAL_LPF_MORPH,
91 LOCAL_HPF_MORPH,
92
93 // Local hybrid params begin
94 FIRST_LOCAL__HYBRID,
95 LOCAL_OSC_A_PHASE_WIDTH = FIRST_LOCAL__HYBRID,
96 LOCAL_OSC_B_PHASE_WIDTH,
97 LOCAL_OSC_A_WAVE_INDEX,
98 LOCAL_OSC_B_WAVE_INDEX,
99 LOCAL_PAN,
100
101 // Local exp params begin
102 FIRST_LOCAL_EXP,
103 LOCAL_LPF_FREQ = FIRST_LOCAL_EXP,
104 LOCAL_PITCH_ADJUST,
105 LOCAL_OSC_A_PITCH_ADJUST,
106 LOCAL_OSC_B_PITCH_ADJUST,
107 LOCAL_MODULATOR_0_PITCH_ADJUST,
108 LOCAL_MODULATOR_1_PITCH_ADJUST,
109 LOCAL_HPF_FREQ,
110 LOCAL_LFO_LOCAL_FREQ_1,
111 LOCAL_LFO_LOCAL_FREQ_2,
112 LOCAL_ENV_0_ATTACK,
113 LOCAL_ENV_1_ATTACK,
114 LOCAL_ENV_2_ATTACK,
115 LOCAL_ENV_3_ATTACK,
116 LOCAL_ENV_0_DECAY,
117 LOCAL_ENV_1_DECAY,
118 LOCAL_ENV_2_DECAY,
119 LOCAL_ENV_3_DECAY,
120 LOCAL_ENV_0_RELEASE,
121 LOCAL_ENV_1_RELEASE,
122 LOCAL_ENV_2_RELEASE,
123 LOCAL_ENV_3_RELEASE,
124
127};
128
132 FIRST_GLOBAL = LOCAL_LAST,
133 // Global (linear) params begin
134 GLOBAL_VOLUME_POST_FX = FIRST_GLOBAL,
135 GLOBAL_VOLUME_POST_REVERB_SEND,
136 GLOBAL_REVERB_AMOUNT,
137 GLOBAL_MOD_FX_DEPTH,
138
139 // Global non-volume params begin
140 FIRST_GLOBAL_NON_VOLUME,
141 GLOBAL_DELAY_FEEDBACK = FIRST_GLOBAL_NON_VOLUME,
142
143 // Global hybrid params begin
144
145 // There are no global hybrid params, so FIRST_GLOBAL_EXP is set to the same value. If you add a GLOBAL_HYBRID
146 // param, make sure you undo that!
147 FIRST_GLOBAL_HYBRID,
148
149 // Global exp params begin
150 FIRST_GLOBAL_EXP = FIRST_GLOBAL_HYBRID,
151 GLOBAL_DELAY_RATE = FIRST_GLOBAL_EXP,
152 GLOBAL_MOD_FX_RATE,
153 GLOBAL_LFO_FREQ_1,
154 GLOBAL_LFO_FREQ_2,
155 GLOBAL_ARP_RATE,
156
157 GLOBAL_NONE,
158};
159
165
166static_assert(util::to_underlying(PLACEHOLDER_RANGE) > util::to_underlying(GLOBAL_NONE),
167 "RANGE placeholder collides with global params");
168
172static_assert(UNPATCHED_START > PLACEHOLDER_RANGE, "UNPATCHED params collide with placeholders");
173
178 UNPATCHED_STUTTER_RATE,
179 UNPATCHED_BASS,
180 UNPATCHED_TREBLE,
181 UNPATCHED_BASS_FREQ,
182 UNPATCHED_TREBLE_FREQ,
183 UNPATCHED_SAMPLE_RATE_REDUCTION,
184 UNPATCHED_BITCRUSHING,
185 UNPATCHED_MOD_FX_OFFSET,
186 UNPATCHED_MOD_FX_FEEDBACK,
187 UNPATCHED_SIDECHAIN_SHAPE,
188 UNPATCHED_COMPRESSOR_THRESHOLD,
189 // Arp
190 UNPATCHED_FIRST_ARP_PARAM,
191 UNPATCHED_ARP_GATE = UNPATCHED_FIRST_ARP_PARAM,
192 UNPATCHED_ARP_RHYTHM,
193 UNPATCHED_ARP_SEQUENCE_LENGTH,
194 UNPATCHED_ARP_CHORD_POLYPHONY,
195 UNPATCHED_ARP_RATCHET_AMOUNT,
196 UNPATCHED_NOTE_PROBABILITY,
197 UNPATCHED_REVERSE_PROBABILITY,
198 UNPATCHED_ARP_BASS_PROBABILITY,
199 UNPATCHED_ARP_CHORD_PROBABILITY,
200 UNPATCHED_ARP_RATCHET_PROBABILITY,
201 UNPATCHED_ARP_SPREAD_GATE,
202 UNPATCHED_ARP_SPREAD_OCTAVE,
203 UNPATCHED_SPREAD_VELOCITY,
204 UNPATCHED_LAST_ARP_PARAM,
206 UNPATCHED_NUM_SHARED = UNPATCHED_LAST_ARP_PARAM,
207};
208
211 UNPATCHED_PORTAMENTO = UNPATCHED_NUM_SHARED,
212 UNPATCHED_SOUND_MAX_NUM,
213};
214
217 UNPATCHED_MOD_FX_RATE = UNPATCHED_NUM_SHARED,
218 UNPATCHED_MOD_FX_DEPTH,
219 UNPATCHED_DELAY_RATE,
220 UNPATCHED_DELAY_AMOUNT,
221 UNPATCHED_ARP_RATE,
222 UNPATCHED_PAN,
223 UNPATCHED_LPF_FREQ,
224 UNPATCHED_LPF_RES,
225 UNPATCHED_LPF_MORPH,
226 UNPATCHED_HPF_FREQ,
227 UNPATCHED_HPF_RES,
228 UNPATCHED_HPF_MORPH,
229 UNPATCHED_REVERB_SEND_AMOUNT,
230 UNPATCHED_VOLUME,
231 UNPATCHED_SIDECHAIN_VOLUME,
232 UNPATCHED_PITCH_ADJUST,
233 UNPATCHED_TEMPO,
234 UNPATCHED_GLOBAL_MAX_NUM,
235};
236
237constexpr ParamType STATIC_START = 162;
238
239enum Static : ParamType {
240 STATIC_SIDECHAIN_ATTACK = STATIC_START,
241 STATIC_SIDECHAIN_RELEASE,
242
243 // Only used for the reverb sidechain. Normally this is done with patching
244 STATIC_SIDECHAIN_VOLUME,
245};
246
248constexpr ParamType PATCH_CABLE = 190;
249
251constexpr ParamType kNumParams = GLOBAL_NONE;
252constexpr ParamType kMaxNumUnpatchedParams =
253 std::max<ParamType>(util::to_underlying(UNPATCHED_GLOBAL_MAX_NUM), util::to_underlying(UNPATCHED_SOUND_MAX_NUM));
254
258constexpr ParamType kUnpatchedAndPatchedMaximum = kMaxNumUnpatchedParams + UNPATCHED_START;
259
260static_assert(kMaxNumUnpatchedParams < STATIC_START, "Error: Too many UNPATCHED parameters, (collision with STATIC)");
261
262bool isParamBipolar(Kind kind, int32_t paramID);
263bool isParamPan(Kind kind, int32_t paramID);
264bool isParamPitch(Kind kind, int32_t paramID);
265bool isParamPitchBend(Kind kind, int32_t paramID);
266bool isParamArpRhythm(Kind kind, int32_t paramID);
267bool isParamStutter(Kind kind, int32_t paramID);
268bool isParamQuantizedStutter(Kind kind, int32_t paramID, ModControllableAudio* modControllableAudio);
269
270bool isVibratoPatchCableShortcut(int32_t xDisplay, int32_t yDisplay);
271bool isSidechainPatchCableShortcut(int32_t xDisplay, int32_t yDisplay);
272bool isPatchCableShortcut(int32_t xDisplay, int32_t yDisplay);
273void getPatchCableFromShortcut(int32_t xDisplay, int32_t yDisplay, ParamDescriptor* paramDescriptor);
274
275char const* getPatchedParamDisplayName(int32_t p);
277char const* getPatchedParamShortName(ParamType type);
278char const* getParamDisplayName(Kind kind, int32_t p);
279
280bool paramNeedsLPF(ParamType p, bool fromAutomation);
281
288char const* paramNameForFile(Kind kind, ParamType param);
289
293ParamType fileStringToParam(Kind kind, char const* name, bool allowPatched);
294
296constexpr uint32_t kNoParamID = 0xFFFFFFFF;
297
300// clang-format off
301const uint32_t patchedParamShortcuts[kDisplayWidth][kDisplayHeight] = {
304 {LOCAL_OSC_A_VOLUME , LOCAL_OSC_A_PITCH_ADJUST , kNoParamID , LOCAL_OSC_A_PHASE_WIDTH, kNoParamID , LOCAL_CARRIER_0_FEEDBACK , LOCAL_OSC_A_WAVE_INDEX, LOCAL_NOISE_VOLUME},
305 {LOCAL_OSC_B_VOLUME , LOCAL_OSC_B_PITCH_ADJUST , kNoParamID , LOCAL_OSC_B_PHASE_WIDTH, kNoParamID , LOCAL_CARRIER_1_FEEDBACK , LOCAL_OSC_B_WAVE_INDEX, kNoParamID},
306 {LOCAL_MODULATOR_0_VOLUME, LOCAL_MODULATOR_0_PITCH_ADJUST, kNoParamID , kNoParamID , kNoParamID , LOCAL_MODULATOR_0_FEEDBACK, kNoParamID , kNoParamID},
307 {LOCAL_MODULATOR_1_VOLUME, LOCAL_MODULATOR_1_PITCH_ADJUST, kNoParamID , kNoParamID , kNoParamID , LOCAL_MODULATOR_1_FEEDBACK, kNoParamID , kNoParamID},
308 {GLOBAL_VOLUME_POST_FX , LOCAL_PITCH_ADJUST , kNoParamID , LOCAL_PAN , kNoParamID , kNoParamID , kNoParamID , kNoParamID},
310 {LOCAL_ENV_0_RELEASE , LOCAL_ENV_0_SUSTAIN , LOCAL_ENV_0_DECAY , LOCAL_ENV_0_ATTACK , LOCAL_LPF_MORPH, kNoParamID , LOCAL_LPF_RESONANCE , LOCAL_LPF_FREQ},
311 {LOCAL_ENV_1_RELEASE , LOCAL_ENV_1_SUSTAIN , LOCAL_ENV_1_DECAY , LOCAL_ENV_1_ATTACK , LOCAL_HPF_MORPH, kNoParamID , LOCAL_HPF_RESONANCE , LOCAL_HPF_FREQ},
314 {GLOBAL_LFO_FREQ_1 , kNoParamID , kNoParamID , kNoParamID , kNoParamID , kNoParamID , GLOBAL_MOD_FX_DEPTH , GLOBAL_MOD_FX_RATE},
315 {LOCAL_LFO_LOCAL_FREQ_1 , kNoParamID , kNoParamID , GLOBAL_REVERB_AMOUNT , kNoParamID , kNoParamID , kNoParamID , kNoParamID},
316 {GLOBAL_DELAY_RATE , kNoParamID , kNoParamID , GLOBAL_DELAY_FEEDBACK , kNoParamID , kNoParamID , kNoParamID , kNoParamID},
318};
319// clang-format on
320
323// clang-format off
324const uint32_t unpatchedNonGlobalParamShortcuts[kDisplayWidth][kDisplayHeight] = {
330 {kNoParamID , kNoParamID, kNoParamID , kNoParamID, kNoParamID , kNoParamID , kNoParamID , UNPATCHED_STUTTER_RATE},
331 {kNoParamID , kNoParamID, kNoParamID , kNoParamID, kNoParamID , UNPATCHED_SAMPLE_RATE_REDUCTION, UNPATCHED_BITCRUSHING, kNoParamID},
335 {kNoParamID , kNoParamID, kNoParamID , kNoParamID, UNPATCHED_SIDECHAIN_SHAPE , kNoParamID , UNPATCHED_BASS , UNPATCHED_BASS_FREQ},
336 {kNoParamID , kNoParamID, UNPATCHED_ARP_GATE, kNoParamID, kNoParamID , kNoParamID , UNPATCHED_TREBLE , UNPATCHED_TREBLE_FREQ},
337 {kNoParamID , kNoParamID, kNoParamID , kNoParamID, UNPATCHED_MOD_FX_OFFSET , UNPATCHED_MOD_FX_FEEDBACK , kNoParamID , kNoParamID},
340 {kNoParamID , UNPATCHED_SPREAD_VELOCITY, kNoParamID , kNoParamID, kNoParamID , kNoParamID , kNoParamID , kNoParamID}
341};
342// clang-format on
343
346// clang-format off
347const uint32_t unpatchedGlobalParamShortcuts[kDisplayWidth][kDisplayHeight] = {
353 {kNoParamID , kNoParamID , kNoParamID , kNoParamID , kNoParamID , kNoParamID , kNoParamID , UNPATCHED_STUTTER_RATE},
354 {UNPATCHED_VOLUME , UNPATCHED_PITCH_ADJUST, kNoParamID , UNPATCHED_PAN , kNoParamID , UNPATCHED_SAMPLE_RATE_REDUCTION, UNPATCHED_BITCRUSHING , kNoParamID},
356 {kNoParamID , kNoParamID , kNoParamID , kNoParamID , UNPATCHED_LPF_MORPH , kNoParamID , UNPATCHED_LPF_RES , UNPATCHED_LPF_FREQ},
357 {kNoParamID , kNoParamID , kNoParamID , kNoParamID , UNPATCHED_HPF_MORPH , kNoParamID , UNPATCHED_HPF_RES , UNPATCHED_HPF_FREQ},
358 {kNoParamID , kNoParamID , UNPATCHED_SIDECHAIN_VOLUME, kNoParamID , UNPATCHED_SIDECHAIN_SHAPE , kNoParamID , UNPATCHED_BASS , UNPATCHED_BASS_FREQ},
359 {UNPATCHED_ARP_RATE , kNoParamID , UNPATCHED_ARP_GATE , kNoParamID , kNoParamID , kNoParamID , UNPATCHED_TREBLE , UNPATCHED_TREBLE_FREQ},
360 {kNoParamID , kNoParamID , kNoParamID , kNoParamID , UNPATCHED_MOD_FX_OFFSET , UNPATCHED_MOD_FX_FEEDBACK , UNPATCHED_MOD_FX_DEPTH, UNPATCHED_MOD_FX_RATE},
361 {kNoParamID , kNoParamID , kNoParamID , UNPATCHED_REVERB_SEND_AMOUNT, kNoParamID , kNoParamID , kNoParamID , kNoParamID},
362 {UNPATCHED_DELAY_RATE, kNoParamID , kNoParamID , UNPATCHED_DELAY_AMOUNT , kNoParamID , kNoParamID , kNoParamID , kNoParamID},
364// clang-format on
365
366uint32_t expressionParamFromShortcut(int x, int y);
367} // namespace deluge::modulation::params
Definition mod_controllable_audio.h:47
Definition param_descriptor.h:27
Definition param.cpp:27
UnpatchedGlobal
Just for GlobalEffectables.
Definition param.h:216
Global
Definition param.h:131
ParamType fileStringToParam(Kind kind, char const *name, bool allowPatched)
Definition param.cpp:704
const uint32_t unpatchedNonGlobalParamShortcuts[kDisplayWidth][kDisplayHeight]
Definition param.h:324
const uint32_t patchedParamShortcuts[kDisplayWidth][kDisplayHeight]
Definition param.h:301
uint8_t ParamType
Definition param.h:65
const uint32_t unpatchedGlobalParamShortcuts[kDisplayWidth][kDisplayHeight]
Definition param.h:347
char const * paramNameForFile(Kind const kind, ParamType const param)
Definition param.cpp:687
constexpr ParamType PATCH_CABLE
Special case for representing patch cables.
Definition param.h:248
Kind
Definition param.h:42
@ UNPATCHED_SOUND
Parameters which apply to the internal sound engine specifically.
Definition param.h:48
@ MIDI
Internal representation for MIDI CCs.
Definition param.h:54
@ PATCHED
Voice-local parameters which can be modulated via the mod matrix.
Definition param.h:46
@ UNPATCHED_GLOBAL
Parameters which can not be modulated and apply to the whole Output.
Definition param.h:50
@ EXPRESSION
Parameter connected to an MPE expression axis.
Definition param.h:58
@ STATIC
Unused.
Definition param.h:52
constexpr ParamType kUnpatchedAndPatchedMaximum
Definition param.h:258
UnpatchedSound
Unpatched params which are only used for Sounds.
Definition param.h:210
constexpr ParamType kNumParams
None is the last global param, 0 indexed so it's also the number of patched params.
Definition param.h:251
Placeholder
Fake param IDs for use when loading old presets.
Definition param.h:161
@ PLACEHOLDER_RANGE
Not a real param. For the purpose of reading old files from before V3.2.0.
Definition param.h:163
constexpr uint32_t kNoParamID
Magic number which represents an invalid or missing param type.
Definition param.h:296
Local
"Local" patched params, which apply to individual voices within the sound
Definition param.h:68
@ LOCAL_LAST
Special value used to chain in to the Global params.
Definition param.h:126
constexpr ParamType UNPATCHED_START
Definition param.h:171
UnpatchedShared
Definition param.h:177
@ UNPATCHED_NUM_SHARED
Special value for chaining the UNPATCHED_* params.
Definition param.h:206
char const * getPatchedParamShortName(ParamType type)
Get the short version of a param name, for use in the OLED mod matrix display (maximum 10 characters)
Definition param.cpp:111