44class SessionView final :
public ClipNavigationTimelineView {
47 bool getGreyoutColsAndRows(uint32_t* cols, uint32_t* rows)
override;
48 bool opened()
override;
49 void focusRegained()
override;
51 ActionResult buttonAction(deluge::hid::Button b,
bool on,
bool inCardRoutine)
override;
52 ActionResult clipCreationButtonPressed(hid::Button i,
bool on,
bool routine);
53 ActionResult padAction(int32_t x, int32_t y, int32_t velocity)
override;
54 ActionResult horizontalEncoderAction(int32_t offset)
override;
55 ActionResult verticalEncoderAction(int32_t offset,
bool inCardRoutine)
override;
56 bool renderSidebar(uint32_t whichRows,
RGB image[][kDisplayWidth + kSideBarWidth],
57 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth])
override;
58 void removeClip(
Clip* clip);
59 void redrawClipsOnScreen(
bool doRender =
true);
60 uint32_t getMaxZoom()
override;
61 void cloneClip(uint8_t yDisplayFrom, uint8_t yDisplayTo);
62 bool renderRow(
ModelStack* modelStack, uint8_t yDisplay,
RGB thisImage[kDisplayWidth + kSideBarWidth],
63 uint8_t thisOccupancyMask[kDisplayWidth + kSideBarWidth],
bool drawUndefinedArea =
true);
64 void graphicsRoutine()
override;
66 void potentiallyRenderClipLaunchPlayhead(
bool reallyNoTickSquare, int32_t sixteenthNotesRemaining);
67 void requestRendering(
UI* ui, uint32_t whichMainRows = 0xFFFFFFFF, uint32_t whichSideRows = 0xFFFFFFFF);
69 int32_t getClipPlaceOnScreen(
Clip* clip);
70 void drawStatusSquare(uint8_t yDisplay,
RGB thisImage[]);
71 void drawSectionSquare(uint8_t yDisplay,
RGB thisImage[]);
72 bool calculateZoomPinSquares(uint32_t oldScroll, uint32_t newScroll, uint32_t newZoom, uint32_t oldZoom)
override;
73 uint32_t getMaxLength()
override;
74 bool setupScroll(uint32_t oldScroll)
override;
75 uint32_t getClipLocalScroll(
Clip* loopable, uint32_t overviewScroll, uint32_t xZoom);
76 void flashPlayRoutine();
78 void modEncoderButtonAction(uint8_t whichModEncoder,
bool on)
override;
79 void modButtonAction(uint8_t whichButton,
bool on)
override;
80 void selectEncoderAction(int8_t offset)
override;
81 ActionResult timerCallback()
override;
84 void editNumRepeatsTilLaunch(int32_t offset);
85 uint32_t getGreyedOutRowsNotRepresentingOutput(
Output* output)
override;
86 bool renderMainPads(uint32_t whichRows,
RGB image[][kDisplayWidth + kSideBarWidth],
87 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth],
bool drawUndefinedArea =
true)
override;
88 void midiLearnFlash()
override;
90 void transitionToViewForClip(
Clip* clip =
nullptr);
91 void transitionToSessionView();
92 void finishedTransitioningHere();
93 void playbackEnded()
override;
94 void clipNeedsReRendering(
Clip* clip)
override;
95 void sampleNeedsReRendering(
Sample* sample)
override;
96 Clip* getClipOnScreen(int32_t yDisplay);
97 Output* getOutputFromPad(int32_t x, int32_t y);
98 void modEncoderAction(int32_t whichModEncoder, int32_t offset)
override;
99 ActionResult verticalScrollOneSquare(int32_t direction);
104 void redrawNumericDisplay();
105 void clearNumericDisplay();
106 void displayRepeatsTilLaunch();
108 uint32_t selectedClipTimePressed;
109 uint8_t selectedClipYDisplay;
110 uint8_t selectedClipPressYDisplay;
111 uint8_t selectedClipPressXDisplay;
112 bool clipWasSelectedWithShift;
113 bool performActionOnPadRelease;
114 bool performActionOnSectionPadRelease;
116 uint8_t sectionPressed;
117 uint8_t masterCompEditMode;
118 int8_t selectedMacro = -1;
120 Clip* getClipForLayout();
121 int32_t getClipIndexForLayout();
123 void copyClipName(
Clip* source,
Clip* target,
Output* targetOutput);
126 inline bool gridFirstPadActive() {
return (gridFirstPressedX != -1 && gridFirstPressedY != -1); }
127 ActionResult gridHandlePads(int32_t x, int32_t y, int32_t on);
128 ActionResult gridHandleScroll(int32_t offsetX, int32_t offsetY);
131 UIType getUIType()
override {
return UIType::SESSION; }
133 Clip* createNewClip(OutputType outputType, int32_t yDisplay);
134 bool createClip{
false};
135 OutputType lastTypeCreated{OutputType::NONE};
138 void enterMacrosConfigMode();
139 void exitMacrosConfigMode();
140 char const* getMacroKindString(SessionMacroKind kind);
143 void enterMidiLearnMode();
144 void exitMidiLearnMode();
147 void displayPotentialTempoChange(
UI* ui);
149 float lastDisplayedTempo = 0;
153 StringBuf& rootNoteAndScaleName,
bool clearArea);
154 int16_t lastDisplayedRootNote = 0;
157 void replaceInstrumentClipWithAudioClip(
Clip* clip);
160 void gridPulseSelectedClip();
167 void commandChangeSectionRepeats(int8_t offset);
168 void commandChangeClipPreset(int8_t offset);
169 void commandChangeCurrentSectionRepeats(int8_t offset);
170 void commandChangeLayout(int8_t offset);
174 void sectionPadAction(uint8_t y,
bool on);
175 void clipPressEnded();
176 void drawSectionRepeatNumber();
177 void beginEditingSectionRepeatsNum();
178 void goToArrangementEditor();
179 void rowNeedsRenderingDependingOnSubMode(int32_t yDisplay);
180 void setCentralLEDStates();
182 Clip* createNewAudioClip(int32_t yDisplay);
183 Clip* createNewInstrumentClip(OutputType outputType, int32_t yDisplay);
185 bool createNewTrackForAudioClip(
AudioClip* newClip);
186 bool createNewTrackForInstrumentClip(OutputType type,
InstrumentClip* clip,
bool copyDrumsFromClip);
188 bool insertAndResyncNewClip(
Clip* newClip, int32_t yDisplay);
193 void selectLayout(int8_t offset);
194 void renderLayoutChange(
bool displayPopup =
true);
195 void selectSpecificLayout(SessionLayoutType layout);
196 SessionLayoutType previousLayout;
197 SessionGridMode previousGridModeActive;
199 bool sessionButtonActive =
false;
200 bool sessionButtonUsed =
false;
201 bool horizontalEncoderPressed =
false;
202 bool viewingRecordArmingActive =
false;
205 bool gridRenderSidebar(uint32_t whichRows,
RGB image[][kDisplayWidth + kSideBarWidth],
206 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth]);
207 void gridRenderActionModes(int32_t y,
RGB image[][kDisplayWidth + kSideBarWidth],
208 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth]);
209 bool gridRenderMainPads(uint32_t whichRows,
RGB image[][kDisplayWidth + kSideBarWidth],
210 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth],
bool drawUndefinedArea =
true);
212 RGB gridRenderClipColor(
Clip* clip, int32_t x, int32_t y,
bool renderPulse =
true);
214 ActionResult gridHandlePadsEdit(int32_t x, int32_t y, int32_t on,
Clip* clip);
215 ActionResult gridHandlePadsLaunch(int32_t x, int32_t y, int32_t on,
Clip* clip);
216 ActionResult gridHandlePadsLaunchImmediate(int32_t x, int32_t y, int32_t on,
Clip* clip);
217 ActionResult gridHandlePadsLaunchWithSelection(int32_t x, int32_t y, int32_t on,
Clip* clip);
218 void gridHandlePadsWithMidiLearnPressed(int32_t x, int32_t on,
Clip* clip);
219 ActionResult gridHandlePadsMacros(int32_t x, int32_t y, int32_t on,
Clip* clip);
220 void gridHandlePadsLaunchToggleArming(
Clip* clip,
bool immediate);
222 void gridTransitionToSessionView();
223 void gridTransitionToViewForClip(
Clip* clip);
225 SessionGridMode gridModeSelected = SessionGridModeEdit;
226 SessionGridMode gridModeActive = SessionGridModeEdit;
227 bool gridActiveModeUsed =
false;
229 int32_t gridFirstPressedX = -1;
230 int32_t gridFirstPressedY = -1;
231 int32_t gridSecondPressedX = -1;
232 int32_t gridSecondPressedY = -1;
233 inline bool gridSecondPadInactive() {
return (gridSecondPressedX == -1 && gridSecondPressedY == -1); }
235 inline void gridResetPresses(
bool first =
true,
bool second =
true) {
237 gridFirstPressedX = -1;
238 gridFirstPressedY = -1;
241 gridSecondPressedX = -1;
242 gridSecondPressedY = -1;
246 Clip* gridCloneClip(
Clip* sourceClip);
247 Clip* gridCreateClipInTrack(
Output* targetOutput);
248 AudioClip* gridCreateAudioClipWithNewTrack();
249 InstrumentClip* gridCreateInstrumentClipWithNewTrack(OutputType type);
250 Clip* gridCreateClip(uint32_t targetSection,
Output* targetOutput =
nullptr,
Clip* sourceClip =
nullptr);
251 void gridClonePad(uint32_t sourceX, uint32_t sourceY, uint32_t targetX, uint32_t targetY);
252 void setupNewClip(
Clip* newClip);
254 void gridStartSection(uint32_t section,
bool instant);
255 void gridToggleClipPlay(
Clip* clip,
bool instant);
257 [[nodiscard]]
const size_t gridTrackCount()
const;
258 uint32_t gridClipCountForTrack(
Output* track);
259 uint32_t gridTrackIndexFromTrack(
Output* track, uint32_t maxTrack);
260 Output* gridTrackFromIndex(uint32_t trackIndex, uint32_t maxTrack);
261 int32_t gridYFromSection(uint32_t section);
262 int32_t gridSectionFromY(uint32_t y);
263 int32_t gridXFromTrack(uint32_t trackIndex);
264 int32_t gridTrackIndexFromX(uint32_t x, uint32_t maxTrack);
265 Output* gridTrackFromX(uint32_t x, uint32_t maxTrack);
266 Clip* gridClipFromCoords(uint32_t x, uint32_t y);
267 int32_t gridClipIndexFromCoords(uint32_t x, uint32_t y);
268 Cartesian gridXYFromClip(
Clip& clip);
270 void gridSetDefaultMode() {
271 switch (FlashStorage::defaultGridActiveMode) {
272 case GridDefaultActiveModeGreen: {
273 gridModeSelected = SessionGridModeLaunch;
276 case GridDefaultActiveModeBlue: {
277 gridModeSelected = SessionGridModeEdit;
281 case GridDefaultActiveModeSelection:
282 case GridDefaultActiveModeMaxElement:;
286 void setupTrackCreation()
const;
287 void exitTrackCreation();
303 bool gridSelectedClipPulsing =
false;
304 Clip* selectedClipForPulsing =
nullptr;
305 RGB gridSelectedClipRenderedColour;
306 bool blendDirection =
false;
307 int32_t progress = 0;
309 static constexpr int32_t kMinProgress = 1;
310 static constexpr int32_t kMaxProgressFull = (65535 / 100) * 60;
311 static constexpr int32_t kMaxProgressDim = 1000;
312 static constexpr int32_t kPulseRate = 50;
313 static constexpr int32_t kBlendRate = 60;
314 static constexpr int32_t kBlendOffsetFull = kPulseRate * kBlendRate;
315 static constexpr int32_t kBlendOffsetDim = kPulseRate;