50class AutomationView final :
public ClipView,
public InstrumentClipMinder {
53 bool opened()
override;
54 void initializeView();
55 void openedInBackground();
56 void focusRegained()
override;
59 void graphicsRoutine()
override;
62 UIType
getUIType()
override {
return UIType::AUTOMATION; }
65 return getUIContextType() == UIType::ARRANGER ? UIModControllableContext::SONG : UIModControllableContext::CLIP;
71 void setAutomationParamType();
73 bool onAutomationOverview();
74 bool inAutomationEditor();
79 bool renderMainPads(uint32_t whichRows,
RGB image[][kDisplayWidth + kSideBarWidth],
80 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth],
bool drawUndefinedArea =
true)
override;
81 bool renderSidebar(uint32_t whichRows,
RGB image[][kDisplayWidth + kSideBarWidth],
82 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth])
override;
83 void renderDisplay(int32_t knobPosLeft = kNoSelection, int32_t knobPosRight = kNoSelection,
84 bool modEncoderAction =
false);
85 void displayAutomation(
bool padSelected =
false,
bool updateDisplay =
true);
88 InstrumentClipMinder::renderOLED(canvas);
92 ActionResult buttonAction(deluge::hid::Button b,
bool on,
bool inCardRoutine)
override;
95 ActionResult padAction(int32_t x, int32_t y, int32_t velocity)
override;
98 ActionResult horizontalEncoderAction(int32_t offset)
override;
99 uint32_t getMaxLength()
override;
100 uint32_t getMaxZoom()
override;
101 [[nodiscard]] int32_t getNavSysId()
const override;
105 ActionResult verticalEncoderAction(int32_t offset,
bool inCardRoutine)
override;
109 void modEncoderAction(int32_t whichModEncoder, int32_t offset)
override;
110 void modEncoderButtonAction(uint8_t whichModEncoder,
bool on)
override;
111 CopiedParamAutomation copiedParamAutomation;
114 void selectEncoderAction(int8_t offset)
override;
115 void getLastSelectedParamShortcut(Clip* clip);
116 void getLastSelectedParamArrayPosition(Clip* clip);
117 bool multiPadPressSelected;
120 void noteRowChanged(InstrumentClip* clip, NoteRow* noteRow)
override;
123 void notifyPlaybackBegun()
override;
126 bool interpolationBefore;
127 bool interpolationAfter;
130 ModelStackWithAutoParam*
131 getModelStackWithParamForClip(ModelStackWithTimelineCounter* modelStack, Clip* clip,
136 void initParameterSelection(
bool updateDisplay =
true);
140 void blinkInterpolationShortcut();
141 void blinkPadSelectionShortcut();
146 int32_t getAutomationParameterKnobPos(ModelStackWithAutoParam* modelStack, uint32_t pos);
147 void setAutomationKnobIndicatorLevels(ModelStackWithAutoParam* modelStack, int32_t knobPosLeft,
148 int32_t knobPosRight);
149 void resetInterpolationShortcutBlinking();
150 void resetPadSelectionShortcutBlinking();
151 AutomationParamType automationParamType;
152 bool getAffectEntire()
override;
155 void resetShortcutBlinking();
159 void handleSessionButtonAction(Clip* clip,
bool on);
160 void handleKeyboardButtonAction(
bool on);
161 void handleClipButtonAction(
bool on,
bool isAudioClip);
162 void handleCrossScreenButtonAction(
bool on);
163 void handleKitButtonAction(OutputType outputType,
bool on);
164 void handleSynthButtonAction(OutputType outputType,
bool on);
165 void handleMidiButtonAction(OutputType outputType,
bool on);
166 void handleCVButtonAction(OutputType outputType,
bool on);
167 bool handleHorizontalEncoderButtonAction(
bool on,
bool isAudioClip);
168 bool handleBackAndHorizontalEncoderButtonComboAction(Clip* clip,
bool on);
169 void handleVerticalEncoderButtonAction(
bool on);
170 void handleSelectEncoderButtonAction(
bool on);
171 void handleAffectEntireButtonAction(
bool on);
174 ActionResult handleEditPadAction(ModelStackWithAutoParam* modelStackWithParam,
175 ModelStackWithNoteRow* modelStackWithNoteRow, NoteRow* noteRow, Clip* clip,
176 Output* output, OutputType outputType, int32_t effectiveLength, int32_t x,
177 int32_t y, int32_t velocity, SquareInfo& squareInfo);
178 bool shortcutPadAction(ModelStackWithAutoParam* modelStackWithParam, Clip* clip, Output* output,
179 OutputType outputType, int32_t effectiveLength, int32_t x, int32_t y, int32_t velocity,
180 int32_t xScroll, int32_t xZoom, SquareInfo& squareInfo);
184 int32_t xScroll, int32_t xZoom);
185 void handleParameterSelection(Clip* clip, Output* output, OutputType outputType, int32_t xDisplay,
187 void noteEditPadAction(ModelStackWithNoteRow* modelStackWithNoteRow, NoteRow* noteRow, InstrumentClip* clip,
188 int32_t x, int32_t y, int32_t velocity, int32_t effectiveLength, SquareInfo& squareInfo);
189 void velocityPadSelectionAction(ModelStackWithNoteRow* modelStackWithNoteRow, InstrumentClip* clip, int32_t x,
190 int32_t y, int32_t velocity, SquareInfo& squareInfo);
191 void velocityEditPadAction(ModelStackWithNoteRow* modelStackWithNoteRow, NoteRow* noteRow, InstrumentClip* clip,
192 int32_t x, int32_t y, int32_t velocity, int32_t effectiveLength, SquareInfo& squareInfo);
193 int32_t getVelocityFromY(int32_t y);
194 int32_t getYFromVelocity(int32_t velocity);
195 void addNoteWithNewVelocity(int32_t x, int32_t velocity, int32_t newVelocity);
196 void adjustNoteVelocity(ModelStackWithNoteRow* modelStackWithNoteRow, NoteRow* noteRow, int32_t x, int32_t velocity,
197 int32_t newVelocity, uint8_t squareType);
198 void setVelocity(ModelStackWithNoteRow* modelStackWithNoteRow, NoteRow* noteRow, int32_t x, int32_t newVelocity);
199 void setVelocityRamp(ModelStackWithNoteRow* modelStackWithNoteRow, NoteRow* noteRow,
200 SquareInfo rowSquareInfo[kDisplayWidth], int32_t velocityIncrement);
201 void recordNoteEditPadAction(int32_t x, int32_t velocity);
202 void automationEditPadAction(ModelStackWithAutoParam* modelStackWithParam, Clip* clip, int32_t xDisplay,
203 int32_t yDisplay, int32_t velocity, int32_t effectiveLength, int32_t xScroll,
205 bool recordAutomationSinglePadPress(int32_t xDisplay, int32_t yDisplay);
208 ActionResult handleMutePadAction(ModelStackWithTimelineCounter* modelStackWithTimelineCounter,
209 InstrumentClip* instrumentClip, Output* output, OutputType outputType, int32_t y,
213 ActionResult handleAuditionPadAction(InstrumentClip* instrumentClip, Output* output, OutputType outputType,
214 int32_t y, int32_t velocity);
215 ActionResult auditionPadAction(InstrumentClip* clip, Output* output, OutputType outputType, int32_t yDisplay,
216 int32_t velocity,
bool shiftButtonDown);
219 void performActualRender(RGB image[][kDisplayWidth + kSideBarWidth],
220 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], int32_t xScroll, uint32_t xZoom,
221 int32_t renderWidth, int32_t imageWidth,
bool drawUndefinedArea =
true);
222 void renderAutomationOverview(ModelStackWithTimelineCounter* modelStackWithTimelineCounter,
223 ModelStackWithThreeMainThings* modelStackWithThreeMainThings, Clip* clip,
224 OutputType outputType, RGB image[][kDisplayWidth + kSideBarWidth],
225 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], int32_t xDisplay,
227 void renderAutomationEditor(ModelStackWithAutoParam* modelStackWithParam, Clip* clip,
228 RGB image[][kDisplayWidth + kSideBarWidth],
229 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], int32_t renderWidth,
230 int32_t xScroll, uint32_t xZoom, int32_t effectiveLength, int32_t xDisplay,
233 RGB image[][kDisplayWidth + kSideBarWidth],
234 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], int32_t lengthToDisplay,
235 int32_t xDisplay,
bool isAutomated, int32_t xScroll, int32_t xZoom,
238 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], int32_t xDisplay,
242 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], int32_t xDisplay,
243 int32_t yDisplay,
bool isAutomated, int32_t knobPos);
244 void renderNoteEditor(ModelStackWithNoteRow* modelStackWithNoteRow, InstrumentClip* clip,
245 RGB image[][kDisplayWidth + kSideBarWidth],
246 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], int32_t renderWidth, int32_t xScroll,
247 uint32_t xZoom, int32_t effectiveLength, int32_t xDisplay,
bool drawUndefinedArea,
248 SquareInfo& squareInfo);
249 void renderNoteColumn(ModelStackWithNoteRow* modelStackWithNoteRow, InstrumentClip* clip,
250 RGB image[][kDisplayWidth + kSideBarWidth],
251 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], int32_t xDisplay, int32_t xScroll,
252 int32_t xZoom, SquareInfo& squareInfo);
254 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], int32_t xDisplay, int32_t yDisplay,
255 uint8_t squareType, int32_t value);
256 void renderUndefinedArea(int32_t xScroll, uint32_t xZoom, int32_t lengthToDisplay,
257 RGB image[][kDisplayWidth + kSideBarWidth],
258 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], int32_t imageWidth,
259 TimelineView* timelineView,
bool tripletsOnHere, int32_t xDisplay);
260 void renderDisplayOLED(Clip* clip, Output* output, OutputType outputType, int32_t knobPosLeft = kNoSelection,
261 int32_t knobPosRight = kNoSelection);
262 void renderAutomationOverviewDisplayOLED(deluge::hid::display::oled_canvas::Canvas& canvas, Output* output,
263 OutputType outputType);
264 void renderAutomationEditorDisplayOLED(deluge::hid::display::oled_canvas::Canvas& canvas, Clip* clip,
265 OutputType outputType, int32_t knobPosLeft, int32_t knobPosRight);
266 void renderNoteEditorDisplayOLED(deluge::hid::display::oled_canvas::Canvas& canvas, InstrumentClip* clip,
267 OutputType outputType, int32_t knobPosLeft, int32_t knobPosRight);
268 void renderDisplay7SEG(Clip* clip, Output* output, OutputType outputType, int32_t knobPosLeft = kNoSelection,
269 bool modEncoderAction =
false);
270 void renderAutomationOverviewDisplay7SEG(Output* output, OutputType outputType);
271 void renderAutomationEditorDisplay7SEG(Clip* clip, OutputType outputType, int32_t knobPosLeft,
272 bool modEncoderAction);
273 void renderNoteEditorDisplay7SEG(InstrumentClip* clip, OutputType outputType, int32_t knobPosLeft);
276 void shiftAutomationHorizontally(ModelStackWithAutoParam* modelStackWithParam, int32_t offset,
277 int32_t effectiveLength);
280 bool automationModEncoderActionForSelectedPad(ModelStackWithAutoParam* modelStackWithParam, int32_t whichModEncoder,
281 int32_t offset, int32_t effectiveLength);
282 void automationModEncoderActionForUnselectedPad(ModelStackWithAutoParam* modelStackWithParam,
283 int32_t whichModEncoder, int32_t offset, int32_t effectiveLength);
286 void copyAutomation(ModelStackWithAutoParam* modelStackWithParam, Clip* clip, int32_t xScroll, int32_t xZoom);
287 void pasteAutomation(ModelStackWithAutoParam* modelStackWithParam, Clip* clip, int32_t effectiveLength,
288 int32_t xScroll, int32_t xZoom);
291 void selectGlobalParam(int32_t offset, Clip* clip);
292 void selectNonGlobalParam(int32_t offset, Clip* clip);
293 bool selectPatchCable(int32_t offset, Clip* clip);
294 bool selectPatchCableAtIndex(Clip* clip, PatchCableSet* set, int32_t patchCableIndex,
bool& foundCurrentPatchCable);
295 void selectMIDICC(int32_t offset, Clip* clip);
296 int32_t getNextSelectedParamArrayPosition(int32_t offset, int32_t lastSelectedParamArrayPosition,
298 void getLastSelectedNonGlobalParamArrayPosition(Clip* clip);
299 void getLastSelectedGlobalParamArrayPosition(Clip* clip);
302 void initPadSelection();
303 void initInterpolation();
304 ParamManagerForTimeline* getParamManagerForClip(Clip* clip);
305 int32_t getEffectiveLength(ModelStackWithTimelineCounter* modelStack);
306 uint32_t getSquareWidth(int32_t square, int32_t effectiveLength, int32_t xScroll, int32_t xZoom);
307 uint32_t getMiddlePosFromSquare(int32_t xDisplay, int32_t effectiveLength, int32_t xScroll, int32_t xZoom);
309 void getAutomationParameterName(Clip* clip, OutputType outputType, StringBuf& parameterName);
311 bool getAutomationNodeInterpolation(ModelStackWithAutoParam* modelStack, int32_t pos,
bool reversed);
312 void setAutomationParameterValue(ModelStackWithAutoParam* modelStack, int32_t knobPos, int32_t squareStart,
313 int32_t xDisplay, int32_t effectiveLength, int32_t xScroll, int32_t xZoom,
314 bool modEncoderAction =
false);
315 void updateAutomationModPosition(ModelStackWithAutoParam* modelStack, uint32_t squareStart,
316 bool updateDisplay =
true,
bool updateIndicatorLevels =
true);
318 void handleAutomationSinglePadPress(ModelStackWithAutoParam* modelStackWithParam, Clip* clip, int32_t xDisplay,
319 int32_t yDisplay, int32_t effectiveLength, int32_t xScroll, int32_t xZoom);
320 void handleAutomationParameterChange(ModelStackWithAutoParam* modelStackWithParam, Clip* clip,
321 OutputType outputType, int32_t xDisplay, int32_t yDisplay,
322 int32_t effectiveLength, int32_t xScroll, int32_t xZoom);
323 int32_t calculateAutomationKnobPosForPadPress(ModelStackWithAutoParam* modelStackWithParam, OutputType outputType,
328 void handleAutomationMultiPadPress(ModelStackWithAutoParam* modelStackWithParam, Clip* clip, int32_t firstPadX,
329 int32_t firstPadY, int32_t secondPadX, int32_t secondPadY,
330 int32_t effectiveLength, int32_t xScroll, int32_t xZoom,
331 bool modEncoderAction =
false);
332 void renderAutomationDisplayForMultiPadPress(ModelStackWithAutoParam* modelStackWithParam, Clip* clip,
333 int32_t effectiveLength, int32_t xScroll, int32_t xZoom,
334 int32_t xDisplay = kNoSelection,
bool modEncoderAction =
false);
336 int32_t calculateAutomationKnobPosForModEncoderTurn(ModelStackWithAutoParam* modelStackWithParam, int32_t knobPos,
339 void blinkShortcuts();
340 void resetParameterShortcutBlinking();
342 bool parameterShortcutBlinking;
344 bool interpolationShortcutBlinking;
345 bool padSelectionShortcutBlinking;
348 bool multiPadPressActive;
349 bool middlePadPressSelected;
350 int32_t leftPadSelectedX;
351 int32_t leftPadSelectedY;
352 int32_t rightPadSelectedX;
353 int32_t rightPadSelectedY;
354 int32_t lastPadSelectedKnobPos;
355 int32_t numNotesSelected;
356 int32_t selectedPadPressed;
358 bool playbackStopped;
361 void initMIDICCShortcutsForAutomation();
362 uint32_t midiCCShortcutsForAutomation[kDisplayWidth][kDisplayHeight];
363 bool midiCCShortcutsLoaded;
365 bool probabilityChanged;
366 uint32_t timeSelectKnobLastReleased;