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