Deluge Firmware 1.3.0
Build date: 2026.05.13
Loading...
Searching...
No Matches
arranger_view.h
1/*
2 * Copyright © 2018-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/colour/colour.h"
22#include "gui/views/timeline_view.h"
23
24class ClipInstance;
25class InstrumentClip;
26class Instrument;
28class Instrument;
30class NoteRow;
31class Kit;
32class Action;
33class Drum;
34class ModelStack;
36
37class ArrangerView final : public TimelineView {
38public:
39 ArrangerView();
40 bool opened() override;
41 void focusRegained() override;
42 ActionResult padAction(int32_t x, int32_t y, int32_t velocity) override;
43 ActionResult handleEditPadAction(int32_t x, int32_t y, int32_t velocity);
44 ActionResult handleStatusPadAction(int32_t y, int32_t velocity, UI* ui);
45 ActionResult handleAuditionPadAction(int32_t y, int32_t velocity, UI* ui);
46 ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine) override;
47 ActionResult verticalEncoderAction(int32_t offset, bool inCardRoutine) override;
48 void selectEncoderAction(int8_t offset) override;
49 void modEncoderAction(int32_t whichModEncoder, int32_t offset) override;
50
51 void repopulateOutputsOnScreen(bool doRender = true);
52 bool renderSidebar(uint32_t whichRows, RGB image[][kDisplayWidth + kSideBarWidth],
53 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth]) override;
54 void drawMuteSquare(int32_t yDisplay, RGB thisImage[]);
55 bool renderMainPads(uint32_t whichRows, RGB image[][kDisplayWidth + kSideBarWidth],
56 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], bool drawUndefinedArea = true) override;
57 bool renderRow(ModelStack* modelStack, int32_t yDisplay, int32_t xScroll, uint32_t xZoom, RGB* thisImage,
58 uint8_t thisOccupancyMask[], int32_t renderWidth);
59 void editPadAction(int32_t x, int32_t y, bool on);
60 ActionResult horizontalEncoderAction(int32_t offset) override;
61 void shiftAutomationHorizontally(int32_t offset, int32_t scroll_amount, Action* action);
62 void shiftClipsHorizontally(int32_t offset, int32_t scroll_amount, Action* action);
63 uint32_t getMaxLength() override;
64 uint32_t getMaxZoom() override;
65 void graphicsRoutine() override;
66 [[nodiscard]] int32_t getNavSysId() const override { return NAVIGATION_ARRANGEMENT; }
67 void navigateThroughPresets(int32_t offset);
68 void notifyActiveClipChangedOnOutput(Output* output);
69 ActionResult timerCallback() override;
70 void reassessWhetherDoingAutoScroll(int32_t pos = -1);
71 void autoScrollOnPlaybackEnd();
72 bool initiateXScroll(int32_t newScrollPos);
73 [[nodiscard]] bool supportsTriplets() const override { return false; }
74 bool putDraggedClipInstanceInNewPosition(Output* output);
75 void tellMatrixDriverWhichRowsContainSomethingZoomable() override;
76 void scrollFinished() override;
77 void notifyPlaybackBegun() override;
78 uint32_t getGreyedOutRowsNotRepresentingOutput(Output* output) override;
79 void playbackEnded() override;
80 void clipNeedsReRendering(Clip* clip) override;
81 void exitSubModeWithoutAction(UI* ui = nullptr);
82 bool transitionToArrangementEditor();
83 bool getGreyoutColsAndRows(uint32_t* cols, uint32_t* rows) override;
84 void setLedStates();
85 ActionResult verticalScrollOneSquare(int32_t direction);
86 ActionResult horizontalScrollOneSquare(int32_t direction);
87
88 void renderOLED(deluge::hid::display::oled_canvas::Canvas& canvas) override;
89
90 Output* outputsOnScreen[kDisplayHeight]{};
91 int8_t yPressedEffective{};
92 int8_t yPressedActual{};
93 int8_t xPressed{};
94 bool actionOnDepress{};
95 uint32_t pressTime{};
96 int32_t desiredLength{};
97 int32_t originallyPressedClipActualLength{};
98 bool pressedHead{};
99
100 int32_t pressedClipInstanceIndex{};
101 Output* pressedClipInstanceOutput{};
102 int32_t pressedClipInstanceXScrollWhenLastInValidPosition{};
103 bool pressedClipInstanceIsInValidPosition{};
104
105 bool blinkOn{};
106
107 bool doingAutoScrollNow;
108 bool mustRedrawTickSquares{};
109
110 int32_t autoScrollNumSquaresBehind{};
111
112 int32_t lastInteractedOutputIndex;
113 int32_t lastInteractedPos;
114 uint8_t lastInteractedSection;
115 ClipInstance* lastInteractedClipInstance;
116
117 int32_t lastInteractedArrangementPos;
118
119 int32_t lastTickSquare{};
120
121 int32_t xScrollWhenPlaybackStarted{};
122
123 // ui
124 UIType getUIType() override { return UIType::ARRANGER; }
125 UIModControllableContext getUIModControllableContext() override { return UIModControllableContext::SONG; }
126
127 Clip* getClipForSelection();
128
129 void requestRendering(UI* ui, uint32_t whichMainRows = 0xFFFFFFFF, uint32_t whichSideRows = 0xFFFFFFFF);
130
131private:
132 void changeOutputType(OutputType newOutputType);
133 void moveClipToSession();
134 void auditionPadAction(bool on, int32_t y, UI* ui);
135 void beginAudition(Output* output);
136 void endAudition(Output* output, bool evenIfPlaying = false);
137 ModelStackWithNoteRow* getNoteRowForAudition(ModelStack* modelStack, Kit* kit);
138 Drum* getDrumForAudition(Kit* kit);
139 void drawAuditionSquare(int32_t yDisplay, RGB thisImage[]);
140 void setNoSubMode();
141 void outputActivated(Output* output);
142 void outputDeactivated(Output* output);
143 void transitionToClipView(ClipInstance* clipInstance);
144 void deleteClipInstance(Output* output, int32_t clipInstanceIndex, ClipInstance* clipInstance, Action* action,
145 bool clearingWholeArrangement = false);
146 void clearArrangement();
147 void interactWithClipInstance(Output* output, int32_t yDisplay, ClipInstance* clipInstance);
148 void rememberInteractionWithClipInstance(int32_t yDisplay, ClipInstance* clipInstance);
149 void deleteOutput();
150 void auditionEnded();
151 void goToSongView();
152 void changeOutputToAudio();
153 bool renderRowForOutput(ModelStack* modelStack, Output* output, int32_t xScroll, uint32_t xZoom, RGB* image,
154 uint8_t occupancyMask[], int32_t renderWidth, int32_t ignoreI);
155 Instrument* createNewInstrument(OutputType newOutputType, bool* instrumentAlreadyInSong);
156 uint32_t doActualRender(int32_t xScroll, uint32_t xZoom, uint32_t whichRows, RGB* image,
157 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], int32_t renderWidth,
158 int32_t imageWidth);
159 void renderDisplay();
160
161 // edit pad actions
162 void cloneClipInstanceToWhite(Output* output, int32_t x, int32_t y, int32_t xScroll);
163 void createNewClipInstance(Output* output, int32_t x, int32_t y, int32_t squareStart, int32_t squareEnd,
164 int32_t xScroll);
165 ClipInstance* createClipInstance(Output* output, int32_t y, int32_t squareStart);
166 Clip* getClipForNewClipInstance(Output* output, Output* lastOutputInteractedWith, ClipInstance* lastClipInstance);
168 void adjustClipInstanceLength(Output* output, int32_t x, int32_t y, int32_t squareStart, int32_t squareEnd);
169 void deleteClipInstance(Output* output, ClipInstance* clipInstance);
170 void createNewClipForClipInstance(Output* output, ClipInstance* clipInstance);
171 void recordEditPadPress(Output* output, ClipInstance* clipInstance, int32_t x, int32_t y, int32_t xScroll);
172};
173
174extern ArrangerView arrangerView;
Definition action.h:75
Definition arpeggiator.h:48
Definition arranger_view.h:37
void recordEditPadPress(Output *output, ClipInstance *clipInstance, int32_t x, int32_t y, int32_t xScroll)
Definition arranger_view.cpp:1726
void adjustClipInstanceLength(Output *output, int32_t x, int32_t y, int32_t squareStart, int32_t squareEnd)
Definition arranger_view.cpp:1570
void cloneClipInstanceToWhite(Output *output, int32_t x, int32_t y, int32_t xScroll)
Definition arranger_view.cpp:1352
UIType getUIType() override
What type of UI is this? e.g. UIType::ARRANGER.
Definition arranger_view.h:124
void createNewClipInstance(Output *output, int32_t x, int32_t y, int32_t squareStart, int32_t squareEnd, int32_t xScroll)
Definition arranger_view.cpp:1378
ClipInstance * createClipInstance(Output *output, int32_t y, int32_t squareStart)
Definition arranger_view.cpp:1431
Clip * getClipFromSection(Output *output)
Definition arranger_view.cpp:1555
UIModControllableContext getUIModControllableContext() override
What mod controllable context is this UI using? E.g. Automation View can use the Song ModControllable...
Definition arranger_view.h:125
void renderDisplay()
redraw OLED and 7SEG displays
Definition arranger_view.cpp:1790
void createNewClipForClipInstance(Output *output, ClipInstance *clipInstance)
Definition arranger_view.cpp:1654
Clip * getClipForNewClipInstance(Output *output, Output *lastOutputInteractedWith, ClipInstance *lastClipInstance)
Definition arranger_view.cpp:1525
void transitionToClipView(ClipInstance *clipInstance)
enter clip view
Definition arranger_view.cpp:1800
Definition clip_instance.h:29
Definition clip.h:46
Definition drum.h:44
Definition instrument_clip.h:48
Definition instrument.h:45
Definition kit.h:34
Definition model_stack.h:189
Definition model_stack.h:123
Definition note_row.h:99
Definition output.h:81
Definition param_manager.h:174
This class represents the colour format most used by the Deluge globally.
Definition rgb.h:14
Definition ui.h:92