Deluge Firmware 1.3.0
Build date: 2026.07.15
Loading...
Searching...
No Matches
instrument_clip_view.h
1/*
2 * Copyright © 2014-2023 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 "gui/views/clip_view.h"
22#include "hid/button.h"
23#include "model/clip/instrument_clip_minder.h"
24#include "model/iterance/iterance.h"
25#include "model/note/note_row.h"
26#include "modulation/automation/copied_param_automation.h"
27#include "modulation/params/param_node.h"
28#include "util/d_string.h"
29
30class InstrumentClip;
31class NoteRow;
32class Note;
33class Editor;
34class Instrument;
35class Sound;
36class ModControllable;
37class Kit;
38class Drum;
39class SoundDrum;
41class Action;
42class ParamCollection;
43class CopiedNoteRow;
44class ParamNode;
47
49 bool isActive;
50 uint8_t yDisplay;
51 uint8_t xDisplay;
52 bool deleteOnDepress; // Can also mean to delete tail
53 uint8_t intendedVelocity;
54 uint8_t intendedProbability;
55 Iterance intendedIterance;
56 uint8_t intendedFill;
57 bool deleteOnScroll;
58 bool isBlurredSquare;
59 bool mpeCachedYet;
60 StolenParamNodes stolenMPE[kNumExpressionDimensions];
61 uint32_t intendedPos; // For "blurred squares", means start of square
62 uint32_t intendedLength; // For "blurred squares", means length of square
63};
64
65#define MPE_RECORD_LENGTH_FOR_NOTE_EDITING 3
66#define MPE_RECORD_INTERVAL_TIME (kSampleRate >> 2) // 250ms
67static constexpr const char* PATTERN_FILE_VERSION = "0.0.1";
68
69enum class NudgeMode { QUANTIZE, QUANTIZE_ALL };
70
71class InstrumentClipView final : public ClipView, public InstrumentClipMinder {
72public:
73 InstrumentClipView();
74 bool opened() override;
75 void focusRegained() override;
76 void displayOrLanguageChanged() override;
77
78 // BUTTON ACTION button press / release handling
79
80 ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine) override;
81 // Used to reveal Session macros only after the Session button has passed the long-press threshold.
82 ActionResult timerCallback() override;
83 ActionResult handleScaleButtonAction(bool on, bool inCardRoutine);
84 bool handleInstrumentChange(OutputType outputType);
85
86 // PAD ACTION pad press / release handling
87
88 ActionResult padAction(int32_t x, int32_t y, int32_t velocity) override;
89 ActionResult potentiallyRandomizeDrumSamples();
90 ActionResult potentiallyRandomizeDrumSample(Kit* kit, Drum* drum, char* chosenFilename);
91 ActionResult commandEnterNoteVelocityEditor(int32_t x, int32_t y);
92 ActionResult commandLearnMutePad(int32_t y, int32_t velocity);
93 ActionResult commandLearnAuditionPad(InstrumentClip* clip, Output* output, OutputType outputType, int32_t yDisplay,
94 int32_t velocity);
95 ActionResult commandSaveKitRow(InstrumentClip* clip, Output* output, OutputType outputType, int32_t yDisplay);
96 ActionResult commandActivateSongMacro(int32_t y, int32_t velocity);
97
98 // SCALE MODE related commands.
99
102 ActionResult commandLearnUserScale();
104 ActionResult commandCycleThroughScales();
106 ActionResult commandFlashRootNote();
108 ActionResult commandEnterScaleModeWithRoot(uint8_t root);
110 ActionResult commandEnterScaleMode();
112 ActionResult commandExitScaleMode();
114 ActionResult commandChangeRootNote(uint8_t yDisplay);
115
117 ActionResult verticalEncoderAction(int32_t offset, bool inCardRoutine) override;
118 ActionResult commandTransposeKey(int32_t offset, bool inCardRoutine);
119 void commandTransposeScreen(int32_t offset, bool inOctave);
120 void commandShiftColour(int32_t offset);
121 ActionResult scrollVertical(int32_t scrollAmount, bool inCardRoutine, bool draggingNoteRow = false,
122 ModelStackWithTimelineCounter* modelStack = nullptr);
123 ActionResult scrollVertical_limit(int32_t scrollAmount, bool inCardRoutine, bool draggingNoteRow,
124 ModelStackWithTimelineCounter* modelStack, InstrumentClip* clip, bool isKit,
125 bool preventOverScrolling, int32_t& noteRowToShiftI, int32_t& noteRowToSwapWithI);
126 void scrollVertical_potentiallySwitchOffAuditionedNotes(bool draggingNoteRow,
128 InstrumentClip* clip, bool currentClipIsActive);
129 void scrollVertical_grabNotesPressed(ModelStackWithTimelineCounter* modelStack, InstrumentClip* clip);
130 void scrollVertical_dragSelectedNoteRow(InstrumentClip* clip, Output* output, bool isKit, int32_t noteRowToShiftI,
131 int32_t noteRowToSwapWithI);
132 void scrollVertical_potentiallySwitchOnAuditionedNotes(bool draggingNoteRow,
134 InstrumentClip* clip, Output* output, OutputType outputType,
135 bool isKit, bool inSoundEditor, bool currentClipIsActive,
136 bool renderDisplay, bool updateDrumSelection);
137 void scrollVertical_placeNotesPressed(ModelStackWithTimelineCounter* modelStack, InstrumentClip* clip, bool isKit);
138
140 uint8_t getEditPadPressXDisplayOnScreen(uint8_t yDisplay);
141 void editPadAction(bool state, uint8_t yDisplay, uint8_t xDisplay, uint32_t xZoom);
142 void mutePadPress(uint8_t yDisplay);
143 bool ensureNoteRowExistsForYDisplay(uint8_t yDisplay);
144 void recalculateColours();
145 void recalculateColour(uint8_t yDisplay);
146 void reassessAllAuditionStatus();
147 void reassessAuditionStatus(uint8_t yDisplay);
148 uint8_t getVelocityForAudition(uint8_t yDisplay, uint32_t* sampleSyncLength);
149 uint8_t getNumNoteRowsAuditioning();
150 uint8_t oneNoteAuditioning();
151 void offsetNoteCodeAction(int32_t newOffset);
152 int32_t getYVisualFromYDisplay(int32_t yDisplay);
153 int32_t getYVisualWithinOctaveFromYDisplay(int32_t yDisplay);
154 ActionResult auditionPadAction(int32_t velocity, int32_t yDisplay, bool shiftButtonDown);
155 void potentiallyUpdateMultiRangeMenu(int32_t velocity, int32_t yDisplay, Instrument* instrument);
156 void potentiallyRecordAuditionPadAction(bool clipIsActiveOnInstrument, int32_t velocity, int32_t yDisplay,
157 Instrument* instrument, bool isKit,
158 ModelStackWithTimelineCounter* modelStackWithTimelineCounter,
159 ModelStackWithNoteRow* modelStackWithNoteRowOnCurrentClip, Drum* drum);
160 void recordNoteOnEarly(int32_t velocity, int32_t yDisplay, Instrument* instrument, bool isKit,
161 ModelStackWithNoteRow* modelStackWithNoteRowOnCurrentClip, Drum* drum);
162 void recordNoteOn(int32_t velocity, int32_t yDisplay, Instrument* instrument,
163 ModelStackWithTimelineCounter* modelStackWithTimelineCounter,
164 ModelStackWithNoteRow* modelStackWithNoteRowOnCurrentClip);
165 NoteRow* getNoteRowOnActiveClip(int32_t yDisplay, Instrument* instrument, bool clipIsActiveOnInstrument,
166 ModelStackWithNoteRow* modelStackWithNoteRowOnCurrentClip, Drum* drum);
167 void potentiallyRefreshNoteRowMenu();
168 bool startAuditioningRow(int32_t velocity, int32_t yDisplay, bool shiftButtonDown, bool isKit,
169 NoteRow* noteRowOnActiveClip, Drum* drum, bool displayNoteCode = true);
170 void finishAuditioningRow(int32_t yDisplay, ModelStackWithNoteRow* modelStack, NoteRow* noteRowOnActiveClip);
171 void enterScaleMode(uint8_t yDisplay = 255);
172 void exitScaleMode();
173 void drawMuteSquare(NoteRow* thisNoteRow, RGB thisImage[], uint8_t thisOccupancyMask[]);
174 void cutAuditionedNotesToOne();
175 ActionResult horizontalEncoderAction(int32_t offset) override;
176 void fillOffScreenImageStores();
177 void graphicsRoutine() override;
178
179 void drawAuditionSquare(uint8_t yDisplay, RGB thisImage[]);
180 void flashDefaultRootNote();
181 void selectEncoderAction(int8_t offset) override;
182 void doubleClipLengthAction();
183 void setSelectedDrum(Drum* drum, bool shouldRedrawStuff = true, Kit* selectedKit = nullptr,
184 bool shouldSendMidiFeedback = true);
185 bool isDrumAuditioned(Drum* drum);
186 int32_t setupForEnteringScaleMode(int32_t newRootNote = 2147483647, int32_t yDisplay = (kDisplayHeight / 2));
187 int32_t setupForExitingScaleMode();
188 void setupChangingOfRootNote(int32_t newRootNote, int32_t yDisplay = (kDisplayHeight / 2));
189 void deleteDrum(SoundDrum* drum);
190 void cancelAllAuditioning();
191 void modEncoderButtonAction(uint8_t whichModEncoder, bool on) override;
192
193 void drawDrumName(Drum* drum, bool justPopUp = false);
194 void notifyPlaybackBegun() override;
195 void openedInBackground();
196 bool renderMainPads(uint32_t whichRows, RGB image[][kDisplayWidth + kSideBarWidth],
197 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], bool drawUndefinedArea = true) override;
198 void performActualRender(uint32_t whichRows, RGB* image, uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth],
199 int32_t xScroll, uint32_t xZoom, int32_t renderWidth, int32_t imageWidth,
200 bool drawUndefinedArea = true);
201 bool renderSidebar(uint32_t whichRows, RGB image[][kDisplayWidth + kSideBarWidth],
202 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth]) override;
203
204 void playbackEnded() override;
205 void scrollFinished() override;
206 void clipNeedsReRendering(Clip* clip) override;
207 void modEncoderAction(int32_t whichModEncoder, int32_t offset) override;
208 ClipMinder* toClipMinder() override { return this; }
209 void reportMPEInitialValuesForNoteEditing(ModelStackWithNoteRow* modelStack, int16_t const* mpeValues);
210 void reportMPEValueForNoteEditing(int32_t expressionDimension, int32_t value);
211 void reportNoteOffForMPEEditing(ModelStackWithNoteRow* modelStack);
212 void dontDeleteNotesOnDepress();
213
214 // tempo encoder commands
215 void tempoEncoderAction(int8_t offset, bool encoderButtonPressed, bool shiftButtonPressed);
216 ActionResult commandStopQuantize(int32_t y);
217
218 void sendAuditionNote(bool on, uint8_t yDisplay, uint8_t velocity, uint32_t sampleSyncLength);
219
220 // made these public so they can be accessed by the automation clip view
221 void setLedStates();
222 uint32_t getSquareWidth(int32_t square, int32_t effectiveLength);
223 void drawNoteCode(uint8_t yDisplay);
224 bool createNewInstrument(OutputType instrumentType, bool is_fm = false);
225 bool changeOutputType(OutputType newOutputType);
226 Sound* getSoundForNoteRow(NoteRow* noteRow, ParamManagerForTimeline** getParamManager);
227 void someAuditioningHasEnded(bool recalculateLastAuditionedNoteOnScreen);
228 bool getAffectEntire() override;
229 void checkIfAllEditPadPressesEnded(bool mayRenderSidebar = true);
230 void endEditPadPress(uint8_t i);
231 void endAllEditPadPresses();
232 void copyAutomation(int32_t whichModEncoder, int32_t navSysId = NAVIGATION_CLIP);
233 void pasteAutomation(int32_t whichModEncoder, int32_t navSysId = NAVIGATION_CLIP);
234 // made these public so they can be accessed by the automation clip view
235
236 void renderOLED(deluge::hid::display::oled_canvas::Canvas& canvas) override {
237 InstrumentClipMinder::renderOLED(canvas);
238 }
239
240 CopiedParamAutomation copiedParamAutomation{};
241 // Sometimes the user will want to hold an audition pad without actually sounding the note, by holding an encoder
242 bool auditioningSilently{};
243 // Archaic leftover feature that users wouldn't let me get rid of
244 bool fileBrowserShouldNotPreview{};
245
246 int16_t mpeValuesAtHighestPressure[MPE_RECORD_LENGTH_FOR_NOTE_EDITING][kNumExpressionDimensions]{};
247 int16_t mpeMostRecentPressure{};
248 uint32_t mpeRecordLastUpdateTime{};
249
250 // made these public so they can be accessed by the automation clip view
251 EditPadPress editPadPresses[kEditPadPressBufferSize];
252 uint8_t lastAuditionedVelocityOnScreen[kDisplayHeight]{}; // 255 seems to mean none
253 uint8_t auditionPadIsPressed[kDisplayHeight]{};
254 uint8_t numEditPadPressesPerNoteRowOnScreen[kDisplayHeight]{};
255 uint8_t lastAuditionedYDisplay{};
256 uint8_t numEditPadPresses;
257 uint32_t timeLastEditPadPress;
258 uint32_t timeFirstEditPadPress{};
259 // Only to be looked at if shouldIgnoreHorizontalScrollKnobActionIfNotAlsoPressedForThisNotePress is true after they
260 // rotated a NoteRow and might now be wanting to instead edit its length after releasing the knob
261 uint32_t timeHorizontalKnobLastReleased{};
262 bool shouldIgnoreVerticalScrollKnobActionIfNotAlsoPressedForThisNotePress{};
263 bool shouldIgnoreHorizontalScrollKnobActionIfNotAlsoPressedForThisNotePress{};
264 // Because in this case we can assume that if they press a main pad while auditioning, they're not intending to do
265 // that shortcut into the SoundEditor!
266 bool editedAnyPerNoteRowStuffSinceAuditioningBegan{};
267 // made these public so they can be accessed by the automation clip view
268
269 // ui
270 UIType getUIType() override { return UIType::INSTRUMENT_CLIP; }
271 UIModControllableContext getUIModControllableContext() override { return UIModControllableContext::CLIP; }
272
273 // note editor
274 bool enterNoteEditor();
275 void exitNoteEditor();
276 void handleNoteEditorEditPadAction(int32_t x, int32_t y, int32_t on);
277 void deselectNoteAndGoUpOneLevel();
278 ActionResult handleNoteEditorVerticalEncoderAction(int32_t offset, bool inCardRoutine);
279 ActionResult handleNoteEditorHorizontalEncoderAction(int32_t offset);
280 ActionResult handleNoteEditorButtonAction(deluge::hid::Button b, bool on, bool inCardRoutine);
281
282 SquareInfo gridSquareInfo[kDisplayHeight][kDisplayWidth]{};
283 int32_t lastSelectedNoteXDisplay;
284 int32_t lastSelectedNoteYDisplay;
285
286 // adjust note parameters
287 void adjustVelocity(int32_t velocityChange);
288 void updateVelocityValue(int32_t& velocityValue, int32_t newVelocity);
289 void displayVelocity(int32_t velocityValue, int32_t velocityChange);
290 void popupVelocity(char const* displayString);
291
292 void handleProbabilityOrIteranceEditing(int8_t offset, bool editNoteRow);
293 void adjustNoteProbabilityWithOffset(int32_t offset);
294 void adjustNoteIteranceWithOffset(int32_t offset, bool allowTogglingBetweenPresetsAndCustom = true);
295 void adjustNoteIteranceWithFinalValue(Iterance finalValue);
296 void adjustNoteFillWithOffset(int32_t offset);
297 Note* getLeftMostNotePressed();
298 void adjustNoteParameterValue(int32_t withOffset, int32_t withFinalValue, int32_t changeType,
299 int32_t parameterMinValue, int32_t parameterMaxValue,
300 bool allowTogglingBetweenPresetsAndCustom = true);
301
302 // other note functions
303 void editNoteRepeat(int32_t offset);
304
305 // blink selected note
306 void blinkSelectedNote(int32_t whichMainRows = 0);
307 void resetSelectedNoteBlinking();
308
309 // note row editor
310 bool enterNoteRowEditor();
311 void exitNoteRowEditor();
312 bool handleNoteRowEditorPadAction(int32_t x, int32_t y, int32_t on);
313 bool handleNoteRowEditorMainPadAction(int32_t x, int32_t y, int32_t on);
314 void handleNoteRowEditorAuditionPadAction(int32_t y);
315 void copyNotesToFile(Serializer& writer, bool selectedDrumOnly = false);
316 Error pasteNotesFromFile(Deserializer& reader, bool overwriteExisting, bool noScaling, bool previewOnly,
317 bool selectedDrumOnly);
318 void patternPreview();
319 void patternClear();
320 ActionResult handleNoteRowEditorVerticalEncoderAction(int32_t offset, bool inCardRoutine);
321 ActionResult handleNoteRowEditorHorizontalEncoderAction(int32_t offset);
322 ActionResult handleNoteRowEditorButtonAction(deluge::hid::Button b, bool on, bool inCardRoutine);
323
324 // adjust note row parameters
325 int32_t setNoteRowProbabilityWithOffset(int32_t offset);
326 int32_t setNoteRowIteranceWithOffset(int32_t offset, bool allowTogglingBetweenPresetsAndCustom = true);
327 int32_t setNoteRowIteranceWithFinalValue(Iterance finalValue);
328 int32_t setNoteRowFillWithOffset(int32_t offset);
329 int32_t setNoteRowParameterValue(int32_t withOffset, int32_t withFinalValue, int32_t changeType,
330 int32_t parameterMinValue, int32_t parameterMaxValue,
331 bool allowTogglingBetweenPresetsAndCustom = true);
332 // other note row functions
333 ModelStackWithNoteRow* createNoteRowForYDisplay(ModelStackWithTimelineCounter* modelStack, int32_t yDisplay);
334 ModelStackWithNoteRow* getOrCreateNoteRowForYDisplay(ModelStackWithTimelineCounter* modelStack, int32_t yDisplay);
335 void commandEuclidean(int32_t offset);
336 void editNumEuclideanEvents(ModelStackWithNoteRow* modelStack, int32_t offset, int32_t yDisplay);
337 void editNoteRowLength(int32_t offset);
338 void rotateNoteRowHorizontally(int32_t offset);
339 void editNoteRowLength(ModelStackWithNoteRow* modelStack, int32_t offset, int32_t yDisplay);
340 void noteRowChanged(InstrumentClip* clip, NoteRow* noteRow) override;
341
342 // blink selected note row
343 void blinkSelectedNoteRow(int32_t whichMainRows = 0);
344 void resetSelectedNoteRowBlinking();
345 bool noteRowFlashOn;
346 bool noteRowBlinking;
347
348 const char* getFillString(uint8_t fill);
349
350 // public for velocity keyboard view to access
351 void enterDrumCreator(ModelStackWithNoteRow* modelStack, bool doRecording = false);
352
353private:
354 bool doneAnyNudgingSinceFirstEditPadPress{};
355 bool offsettingNudgeNumberDisplay{};
356
357 uint8_t flashScaleModeLedErrorCount{};
358
359 Drum* selectedDrum{};
360
361 Drum* drumForNewNoteRow{};
362 uint8_t yDisplayOfNewNoteRow{};
363
364 int32_t quantizeAmount{};
365 uint32_t timeSongButtonPressed{};
366 // Set once a held Session button passes the long-press threshold, so short presses never flash macro colours into
367 // the sidebar on their way to Session view.
368 bool sessionMacroSidebarActive{};
369
370 std::array<RGB, kDisplayHeight> rowColour;
371 std::array<RGB, kDisplayHeight> rowTailColour;
372 std::array<RGB, kDisplayHeight> rowBlurColour;
373
374 // note functions
375 void nudgeNotes(int32_t offset);
376 void displayProbability(uint8_t probability, bool prevBase);
377 void displayIterance(Iterance iterance);
378 void displayFill(uint8_t mode);
379
380 // note row functions
381 void copyNotes(Serializer* writer, bool selectedDrumOnly = false);
382 void pasteNotes(bool overwriteExisting = true, bool pasteFromFile = false, bool noScaling = false,
383 bool previewOnly = false, bool selectedDrumOnly = false);
384 void deleteCopiedNoteRows();
385 CopiedNoteRow* firstCopiedNoteRow;
386 int32_t copiedScreenWidth{};
387 ScaleType copiedScaleType{};
388 int16_t copiedYNoteOfBottomRow{};
389
390 void rotateNoteRowHorizontally(ModelStackWithNoteRow* modelStack, int32_t offset, int32_t yDisplay,
391 bool shouldDisplayDirectionEvenIfNoNoteRow = false);
392
393 Drum* getNextDrum(Drum* oldDrum, bool mayBeNone = false);
394 Drum* flipThroughAvailableDrums(int32_t newOffset, Drum* drum, bool mayBeNone = false);
395 NoteRow* getOrCreateEmptyNoteRowForKit(ModelStackWithTimelineCounter* modelStack, int32_t yDisplay,
396 int32_t* getIndex = nullptr);
397 void createDrumForAuditionedNoteRow(DrumType drumType);
398 bool isRowAuditionedByInstrument(int32_t yDisplay);
399
400 // TEMPO encoder commands
401 void commandQuantizeNotes(int8_t offset, NudgeMode nudgeMode);
402 void commandStartQuantize(int8_t offset, NudgeMode nudgeMode);
403 void silenceAllAuditions();
404
405 // auditionPadAction functions
406 Drum* getAuditionedDrum(int32_t velocity, int32_t yDisplay, bool shiftButtonDown, Instrument* instrument,
407 ModelStackWithTimelineCounter* modelStackWithTimelineCounter,
408 ModelStackWithNoteRow* modelStackWithNoteRowOnCurrentClip);
409 void recordNoteOff(int32_t yDisplay, ModelStackWithNoteRow* modelStackWithNoteRowOnCurrentClip);
410 int32_t getVelocityToSound(int32_t velocity);
411};
412
413extern InstrumentClipView instrumentClipView;
Definition action.h:79
Definition clip_minder.h:23
Definition clip.h:46
Definition copied_note_row.h:23
Definition drum.h:44
Definition instrument_clip_view.h:71
ClipMinder * toClipMinder() override
Definition instrument_clip_view.h:208
ActionResult verticalEncoderAction(int32_t offset, bool inCardRoutine) override
VERTICAL ENCODER ACTION related.
Definition instrument_clip_view.cpp:6153
ActionResult commandCycleThroughScales()
Cycle through preset scales. SHIFT + SCALE in scale mode.
Definition instrument_clip_view.cpp:197
ActionResult commandLearnUserScale()
Definition instrument_clip_view.cpp:182
UIType getUIType() override
What type of UI is this? e.g. UIType::ARRANGER.
Definition instrument_clip_view.h:270
ActionResult commandExitScaleMode()
Exit scale mdoe. SCALE when in scale mode.
Definition instrument_clip_view.cpp:246
ActionResult commandChangeRootNote(uint8_t yDisplay)
Change current root note. AUDITION + SCALE or SCALE + AUDITION in scale mod.
Definition instrument_clip_view.cpp:222
ActionResult commandFlashRootNote()
Flash the current root note. Part of SCALE down.
Definition instrument_clip_view.cpp:206
UIModControllableContext getUIModControllableContext() override
What mod controllable context is this UI using? E.g. Automation View can use the Song ModControllable...
Definition instrument_clip_view.h:271
uint8_t getEditPadPressXDisplayOnScreen(uint8_t yDisplay)
OTHER uncategorized (yet).
Definition instrument_clip_view.cpp:2255
ActionResult commandEnterScaleMode()
Enter scale mode. SCALE when in chromatic mode.
Definition instrument_clip_view.cpp:241
ActionResult commandEnterScaleModeWithRoot(uint8_t root)
Enter scale mode with selected root. AUDITION + SCALE or SCALE + AUDITION in schromatic mode.
Definition instrument_clip_view.cpp:216
Definition instrument_clip.h:48
Definition instrument.h:45
Definition kit.h:34
Definition mod_controllable.h:40
Definition model_stack.h:189
Definition model_stack.h:129
Definition note_row.h:99
Definition note.h:24
Definition output.h:81
Definition param_collection.h:39
Definition param_manager.h:174
Definition param_node.h:23
This class represents the colour format most used by the Deluge globally.
Definition rgb.h:14
Definition sound_drum.h:28
Definition sound.h:71
Definition instrument_clip_view.h:48
Definition iterance.h:23
Definition note_row.h:59
Definition param_node.h:45