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