lmms
Cross-platform music production software
Loading...
Searching...
No Matches
AutomationEditor.h
Go to the documentation of this file.
1/*
2 * AutomationEditor.h - declaration of class AutomationEditor which is a window
3 * where you can edit dynamic values in an easy way
4 *
5 * Copyright (c) 2006-2008 Javier Serrano Polo <jasp00/at/users.sourceforge.net>
6 *
7 * This file is part of LMMS - https://lmms.io
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public
20 * License along with this program (see COPYING); if not, write to the
21 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301 USA.
23 *
24 */
25
26#ifndef LMMS_GUI_AUTOMATION_EDITOR_H
27#define LMMS_GUI_AUTOMATION_EDITOR_H
28
29#include <QWidget>
30#include <array>
31
32#include "AutomationClip.h"
33#include "ComboBoxModel.h"
34#include "Editor.h"
35#include "JournallingObject.h"
36#include "MidiClip.h"
37#include "SampleClip.h"
38#include "TimePos.h"
39#include "LmmsTypes.h"
40#include "SampleThumbnail.h"
41
42class QPushButton;
43class QScrollBar;
44
45namespace lmms
46{
47namespace gui
48{
49
50class ComboBox;
51class Knob;
52class TimeLineWidget;
53
54
55
56class AutomationEditor : public QWidget, public JournallingObject
57{
58 Q_OBJECT
59 Q_PROPERTY(QColor barLineColor MEMBER m_barLineColor)
60 Q_PROPERTY(QColor beatLineColor MEMBER m_beatLineColor)
61 Q_PROPERTY(QColor lineColor MEMBER m_lineColor)
62 Q_PROPERTY(QColor nodeInValueColor MEMBER m_nodeInValueColor)
63 Q_PROPERTY(QColor nodeOutValueColor MEMBER m_nodeOutValueColor)
65 Q_PROPERTY(QBrush scaleColor MEMBER m_scaleColor)
66 Q_PROPERTY(QBrush graphColor MEMBER m_graphColor)
67 Q_PROPERTY(QColor crossColor MEMBER m_crossColor)
68 Q_PROPERTY(QColor backgroundShade MEMBER m_backgroundShade)
69 Q_PROPERTY(QColor ghostNoteColor MEMBER m_ghostNoteColor)
70 Q_PROPERTY(QColor detuningNoteColor MEMBER m_detuningNoteColor)
71 Q_PROPERTY(QColor ghostSampleColor MEMBER m_ghostSampleColor)
72 Q_PROPERTY(QColor outOfBoundsShade MEMBER m_outOfBoundsShade)
73public:
74 void setCurrentClip(AutomationClip * new_clip);
75 void setGhostMidiClip(MidiClip* newMidiClip);
76 void setGhostSample(SampleClip* newSample);
77
78 inline const AutomationClip * currentClip() const
79 {
80 return m_clip;
81 }
82
83 inline bool validClip() const
84 {
85 return m_clip != nullptr;
86 }
87
88 void saveSettings(QDomDocument & doc, QDomElement & parent) override;
89 void loadSettings(const QDomElement & parent) override;
90 QString nodeName() const override
91 {
92 return "automationeditor";
93 }
94
95 enum class EditMode
96 {
97 Draw,
98 Erase,
99 DrawOutValues,
100 EditTangents
101 };
102
103public slots:
104 void update();
106
107
108protected:
110
111 void keyPressEvent(QKeyEvent * ke) override;
112 void leaveEvent(QEvent * e) override;
113 void mousePressEvent(QMouseEvent * mouseEvent) override;
114 void mouseDoubleClickEvent(QMouseEvent * mouseEvent) override;
115 void mouseReleaseEvent(QMouseEvent * mouseEvent) override;
116 void mouseMoveEvent(QMouseEvent * mouseEvent) override;
117 void paintEvent(QPaintEvent * pe) override;
118 void resizeEvent(QResizeEvent * re) override;
119 void wheelEvent(QWheelEvent * we) override;
120
121 float getLevel( int y );
122 int xCoordOfTick( int tick );
123 float yCoordOfLevel( float level );
124 inline void drawLevelTick(QPainter & p, int tick, float value);
125
127 //
136 timeMap::iterator getNodeAt(int x, int y, bool outValue = false, int r = 5);
137
141 timeMap::iterator getClosestNode(int x);
142
143 void drawLine( int x0, float y0, int x1, float y1 );
144 bool fineTuneValue(timeMap::iterator node, bool editingOutValue);
145
146protected slots:
147 void play();
148 void stop();
149
150 void horScrolled( int new_pos );
151 void verScrolled( int new_pos );
152
154 void setEditMode(int mode);
155
157
163 void setProgressionType(int type);
164 void setTension();
165
166 void updatePosition();
167
168 void zoomingXChanged();
169 void zoomingYChanged();
170
171 void updateYDelta();
172
174 void setQuantization();
175
177 {
178 m_ghostNotes = nullptr;
179 m_ghostSample = nullptr;
180 update();
181 }
182
183private:
184
185 enum class Action
186 {
188 MoveValue,
189 EraseValues,
190 MoveOutValue,
191 ResetOutValues,
192 DrawLine,
193 MoveTangent,
194 ResetTangents
195 } ;
196
197 // some constants...
198 static const int SCROLLBAR_SIZE = 12;
199 static const int TOP_MARGIN = 16;
200
201 static const int DEFAULT_Y_DELTA = 6;
202 static const int DEFAULT_STEPS_PER_BAR = 16;
203 static const int DEFAULT_PPB = 12 * DEFAULT_STEPS_PER_BAR;
204
205 static const int VALUES_WIDTH = 64;
206
207 static const int NOTE_HEIGHT = 10;
208 static const int NOTE_MARGIN = 40;
209 static const int MIN_NOTE_RANGE = 20;
210 static const int SAMPLE_MARGIN = 40;
211 static constexpr int MAX_SAMPLE_HEIGHT = 400; // constexpr for use in min
212
215 ~AutomationEditor() override;
216
217 QPixmap m_toolDraw = embed::getIconPixmap("edit_draw");
218 QPixmap m_toolErase = embed::getIconPixmap("edit_erase");
219 QPixmap m_toolDrawOut = embed::getIconPixmap("edit_draw_outvalue");
220 QPixmap m_toolEditTangents = embed::getIconPixmap("edit_tangent");
221 QPixmap m_toolMove = embed::getIconPixmap("edit_move");
224
228
229 static const std::array<float, 7> m_zoomXLevels;
230
232
236 float m_step;
240
241 // QPointers to set to nullptr on deletion
242 QPointer<MidiClip> m_ghostNotes = nullptr;
243 QPointer<SampleClip> m_ghostSample = nullptr;
244 bool m_renderSample = false;
245
248
249 QScrollBar * m_leftRightScroll;
250 QScrollBar * m_topBottomScroll;
251
252 void adjustLeftRightScoll(int value);
253
255
257
259
262
263 int m_ppb;
266
269
272
275
277
279 bool m_mouseDownRight; //true if right click is being held down
280
283
284 void drawCross(QPainter & p );
285 void drawAutomationPoint( QPainter & p, timeMap::iterator it );
286 void drawAutomationTangents(QPainter& p, timeMap::iterator it);
287 bool inPatternEditor();
288
303
305
307
308
309signals:
311} ;
312
313
314
315
317{
318 Q_OBJECT
319
320 static const int INITIAL_WIDTH = 860;
321 static const int INITIAL_HEIGHT = 480;
322public:
324 ~AutomationEditorWindow() override = default;
325
326 void setCurrentClip(AutomationClip* clip);
328 void setGhostSample(SampleClip* newSample) { m_editor->setGhostSample(newSample); };
329
331
332 void dropEvent( QDropEvent * _de ) override;
333 void dragEnterEvent( QDragEnterEvent * _dee ) override;
334
335 void open(AutomationClip* clip);
336
338
339 QSize sizeHint() const override;
340
341public slots:
342 void clearCurrentClip();
343
344signals:
346
347protected:
348 void focusInEvent(QFocusEvent * event) override;
349
350protected slots:
351 void play() override;
352 void stop() override;
353
354private slots:
355 void updateWindowTitle();
356 void setProgressionType(int progType);
357
360 void updateEditTanButton();
361
362private:
363 QAction* m_drawAction;
367
371
374
376
380
381 QPushButton* m_resetGhostNotes;
382};
383
384} // namespace gui
385
386} // namespace lmms
387
388#endif // LMMS_GUI_AUTOMATION_EDITOR_H
Definition AutomationClip.h:52
QMap< int, AutomationNode > timeMap
Definition AutomationClip.h:62
ProgressionType
Definition AutomationClip.h:56
Definition ComboBoxModel.h:39
Definition AutomatableModel.h:468
JournallingObject()
Definition JournallingObject.cpp:36
Definition MidiClip.h:46
Definition SampleClip.h:46
Definition TimePos.h:68
Definition AutomationEditor.h:57
int m_draggedTangentTick
The tick from the node whose tangent is being dragged.
Definition AutomationEditor.h:271
int xCoordOfTick(int tick)
Definition AutomationEditor.cpp:1427
bool m_mouseDownRight
Definition AutomationEditor.h:279
void setProgressionType(AutomationClip::ProgressionType type)
Definition AutomationEditor.cpp:1754
void updateYDelta()
Definition AutomationEditor.cpp:1832
void zoomingXChanged()
Definition AutomationEditor.cpp:1813
void updatePosition()
Definition AutomationEditor.cpp:1785
QColor m_detuningNoteColor
Definition AutomationEditor.h:300
QColor m_outOfBoundsShade
Definition AutomationEditor.h:302
float yCoordOfLevel(float level)
Definition AutomationEditor.cpp:1436
QColor m_barLineColor
Definition AutomationEditor.h:289
void drawLine(int x0, float y0, int x1, float y1)
Definition AutomationEditor.cpp:303
void resetGhostNotes()
Definition AutomationEditor.h:176
bool m_renderSample
Definition AutomationEditor.h:244
void paintEvent(QPaintEvent *pe) override
Definition AutomationEditor.cpp:1027
QBrush m_scaleColor
Definition AutomationEditor.h:296
QColor m_ghostNoteColor
Definition AutomationEditor.h:299
QPointer< MidiClip > m_ghostNotes
Definition AutomationEditor.h:242
QColor nodeInValueColor
Definition AutomationEditor.h:62
void keyPressEvent(QKeyEvent *ke) override
Definition AutomationEditor.cpp:252
void updateAfterClipChange()
Definition AutomationEditor.cpp:207
bool fineTuneValue(timeMap::iterator node, bool editingOutValue)
Definition AutomationEditor.cpp:337
QBrush scaleColor
Definition AutomationEditor.h:65
QColor m_nodeTangentLineColor
Definition AutomationEditor.h:295
Action m_action
Definition AutomationEditor.h:256
QColor m_beatLineColor
Definition AutomationEditor.h:290
static const int DEFAULT_Y_DELTA
Definition AutomationEditor.h:201
QColor barLineColor
Definition AutomationEditor.h:59
static const int SAMPLE_MARGIN
Definition AutomationEditor.h:210
const AutomationClip * currentClip() const
Definition AutomationEditor.h:78
static const int NOTE_MARGIN
Total border margin for notes.
Definition AutomationEditor.h:208
void wheelEvent(QWheelEvent *we) override
Definition AutomationEditor.cpp:1548
QBrush graphColor
Definition AutomationEditor.h:66
static const int MIN_NOTE_RANGE
Min number of keys for fixed size.
Definition AutomationEditor.h:209
QColor backgroundShade
Definition AutomationEditor.h:68
int m_ppb
Definition AutomationEditor.h:263
void setQuantization()
Updates the clip's quantization using the current user selected value.
Definition AutomationEditor.cpp:1858
QPixmap m_toolDraw
Definition AutomationEditor.h:217
FloatModel * m_tensionModel
Definition AutomationEditor.h:231
QColor ghostSampleColor
Definition AutomationEditor.h:71
static const int VALUES_WIDTH
Definition AutomationEditor.h:205
QColor m_nodeInValueColor
Definition AutomationEditor.h:293
float m_drawLastLevel
Definition AutomationEditor.h:260
void loadSettings(const QDomElement &parent) override
Definition AutomationEditor.cpp:199
void stop()
Definition AutomationEditor.cpp:1693
QPixmap m_toolXFlip
Definition AutomationEditor.h:223
QPixmap m_toolYFlip
Definition AutomationEditor.h:222
QColor m_crossColor
Definition AutomationEditor.h:297
static constexpr int MAX_SAMPLE_HEIGHT
Definition AutomationEditor.h:211
QPointer< SampleClip > m_ghostSample
Definition AutomationEditor.h:243
QPixmap m_toolMove
Definition AutomationEditor.h:221
void drawAutomationPoint(QPainter &p, timeMap::iterator it)
Definition AutomationEditor.cpp:953
void mouseDoubleClickEvent(QMouseEvent *mouseEvent) override
Definition AutomationEditor.cpp:657
friend class AutomationEditorWindow
Definition AutomationEditor.h:306
QPixmap m_toolErase
Definition AutomationEditor.h:218
static const int DEFAULT_STEPS_PER_BAR
Definition AutomationEditor.h:202
void mouseMoveEvent(QMouseEvent *mouseEvent) override
Definition AutomationEditor.cpp:718
void adjustLeftRightScoll(int value)
Definition AutomationEditor.cpp:1540
void centerTopBottomScroll()
Definition AutomationEditor.cpp:1482
float m_step
Definition AutomationEditor.h:236
void horScrolled(int new_pos)
Definition AutomationEditor.cpp:1713
void setCurrentClip(AutomationClip *new_clip)
Definition AutomationEditor.cpp:170
QColor nodeTangentLineColor
Definition AutomationEditor.h:64
QColor ghostNoteColor
Definition AutomationEditor.h:69
TimeLineWidget * m_timeLine
Definition AutomationEditor.h:281
ComboBoxModel m_quantizeModel
Definition AutomationEditor.h:227
QPixmap m_toolEditTangents
Definition AutomationEditor.h:220
QColor lineColor
Definition AutomationEditor.h:61
QColor m_ghostSampleColor
Definition AutomationEditor.h:301
static const int NOTE_HEIGHT
Height of individual notes.
Definition AutomationEditor.h:207
tick_t m_drawLastTick
Definition AutomationEditor.h:261
QColor nodeOutValueColor
Definition AutomationEditor.h:63
void mousePressEvent(QMouseEvent *mouseEvent) override
Definition AutomationEditor.cpp:386
bool m_mouseDownLeft
Definition AutomationEditor.h:278
int m_moveXOffset
Definition AutomationEditor.h:258
QScrollBar * m_leftRightScroll
Definition AutomationEditor.h:249
void zoomingYChanged()
Definition AutomationEditor.cpp:1826
float m_minLevel
Definition AutomationEditor.h:234
QScrollBar * m_topBottomScroll
Definition AutomationEditor.h:250
float m_scrollLevel
Definition AutomationEditor.h:237
AutomationClip * m_clip
Definition AutomationEditor.h:233
float m_maxLevel
Definition AutomationEditor.h:235
void drawCross(QPainter &p)
Definition AutomationEditor.cpp:918
timeMap::iterator getClosestNode(int x)
Given a mouse X coordinate, returns a timeMap::iterator that points to the closest node.
Definition AutomationEditor.cpp:1956
QColor m_backgroundShade
Definition AutomationEditor.h:298
QColor m_lineColor
Definition AutomationEditor.h:291
AutomationEditor(const AutomationEditor &)
bool m_scrollBack
Definition AutomationEditor.h:282
float m_bottomLevel
Definition AutomationEditor.h:238
void leaveEvent(QEvent *e) override
Definition AutomationEditor.cpp:292
QColor crossColor
Definition AutomationEditor.h:67
void setEditMode(AutomationEditor::EditMode mode)
Definition AutomationEditor.cpp:1733
void setTension()
Definition AutomationEditor.cpp:1773
float m_topLevel
Definition AutomationEditor.h:239
void resizeEvent(QResizeEvent *re) override
Definition AutomationEditor.cpp:1506
Action
Definition AutomationEditor.h:186
QString nodeName() const override
Definition AutomationEditor.h:90
ComboBoxModel m_zoomingXModel
Definition AutomationEditor.h:225
float m_y_delta
Definition AutomationEditor.h:264
QPixmap m_toolDrawOut
Definition AutomationEditor.h:219
QColor outOfBoundsShade
Definition AutomationEditor.h:72
int m_draggedOutValueKey
Time position (key) of automation node whose outValue is being dragged.
Definition AutomationEditor.h:268
bool m_draggedOutTangent
Whether the tangent being dragged is the InTangent or OutTangent.
Definition AutomationEditor.h:274
AutomationEditor()
Definition AutomationEditor.cpp:68
void setGhostSample(SampleClip *newSample)
Definition AutomationEditor.cpp:1019
QColor beatLineColor
Definition AutomationEditor.h:60
timeMap::iterator getNodeAt(int x, int y, bool outValue=false, int r=5)
Returns the automation node at a given mouse position, if any.
Definition AutomationEditor.cpp:1915
float getLevel(int y)
Definition AutomationEditor.cpp:1625
static const int DEFAULT_PPB
Definition AutomationEditor.h:203
void setGhostMidiClip(MidiClip *newMidiClip)
Definition AutomationEditor.cpp:1012
static const std::array< float, 7 > m_zoomXLevels
Definition AutomationEditor.h:229
void verScrolled(int new_pos)
Definition AutomationEditor.cpp:1723
AutomationClip::timeMap timeMap
Definition AutomationEditor.h:109
EditMode m_editMode
Definition AutomationEditor.h:276
QColor detuningNoteColor
Definition AutomationEditor.h:70
QColor m_nodeOutValueColor
Definition AutomationEditor.h:294
bool inPatternEditor()
Definition AutomationEditor.cpp:1642
void drawAutomationTangents(QPainter &p, timeMap::iterator it)
Definition AutomationEditor.cpp:979
void update()
Definition AutomationEditor.cpp:238
void drawLevelTick(QPainter &p, int tick, float value)
Definition AutomationEditor.cpp:1452
void saveSettings(QDomDocument &doc, QDomElement &parent) override
Definition AutomationEditor.cpp:191
void play()
Definition AutomationEditor.cpp:1650
SampleThumbnail m_sampleThumbnail
Definition AutomationEditor.h:304
bool m_y_auto
Definition AutomationEditor.h:265
TimePos m_currentPosition
Definition AutomationEditor.h:254
bool validClip() const
Definition AutomationEditor.h:83
void updateTopBottomLevels()
Definition AutomationEditor.cpp:1868
QBrush m_graphColor
Definition AutomationEditor.h:292
EditMode
Definition AutomationEditor.h:96
static const int TOP_MARGIN
Definition AutomationEditor.h:199
static const int SCROLLBAR_SIZE
Definition AutomationEditor.h:198
ComboBoxModel m_zoomingYModel
Definition AutomationEditor.h:226
void mouseReleaseEvent(QMouseEvent *mouseEvent) override
Definition AutomationEditor.cpp:684
QAction * m_flipXAction
Definition AutomationEditor.h:373
void dropEvent(QDropEvent *_de) override
Definition AutomationEditor.cpp:2222
QAction * m_drawOutAction
Definition AutomationEditor.h:365
QAction * m_linearAction
Definition AutomationEditor.h:369
AutomationEditorWindow()
Definition AutomationEditor.cpp:2002
void stop() override
Definition AutomationEditor.cpp:2285
void setGhostMidiClip(MidiClip *clip)
Definition AutomationEditor.h:327
void updateWindowTitle()
Definition AutomationEditor.cpp:2290
ComboBox * m_zoomingYComboBox
Definition AutomationEditor.h:378
QAction * m_eraseAction
Definition AutomationEditor.h:364
QAction * m_editTanAction
Definition AutomationEditor.h:366
QAction * m_flipYAction
Definition AutomationEditor.h:372
QAction * m_cubicHermiteAction
Definition AutomationEditor.h:370
void open(AutomationClip *clip)
Definition AutomationEditor.cpp:2255
QAction * m_discreteAction
Definition AutomationEditor.h:368
void play() override
Definition AutomationEditor.cpp:2279
QSize sizeHint() const override
Definition AutomationEditor.cpp:2263
ComboBox * m_quantizeComboBox
Definition AutomationEditor.h:379
AutomationEditor * m_editor
Definition AutomationEditor.h:337
Knob * m_tensionKnob
Definition AutomationEditor.h:375
void setCurrentClip(AutomationClip *clip)
Definition AutomationEditor.cpp:2163
void dragEnterEvent(QDragEnterEvent *_dee) override
Definition AutomationEditor.cpp:2247
void setProgressionType(int progType)
Definition AutomationEditor.cpp:2301
QAction * m_drawAction
Definition AutomationEditor.h:363
~AutomationEditorWindow() override=default
void focusInEvent(QFocusEvent *event) override
Definition AutomationEditor.cpp:2274
QPushButton * m_resetGhostNotes
Definition AutomationEditor.h:381
ComboBox * m_zoomingXComboBox
Definition AutomationEditor.h:377
static const int INITIAL_WIDTH
Definition AutomationEditor.h:320
void updateEditTanButton()
Definition AutomationEditor.cpp:2307
void setGhostSample(SampleClip *newSample)
Definition AutomationEditor.h:328
static const int INITIAL_HEIGHT
Definition AutomationEditor.h:321
const AutomationClip * currentClip()
Definition AutomationEditor.cpp:2217
void clearCurrentClip()
Definition AutomationEditor.cpp:2268
Definition ComboBox.h:38
Editor(bool record=false, bool stepRecord=false)
Definition Editor.cpp:91
Definition Knob.h:47
Definition SampleThumbnail.h:57
Definition TimeLineWidget.h:54
auto getIconPixmap(std::string_view name, int width, int height, const char *const *xpm) -> QPixmap
Return an image for the icon pixmap cache.
Definition embed.cpp:107
Definition AudioPortAudio.cpp:209
Definition RemotePluginBase.cpp:34
std::int32_t tick_t
Definition LmmsTypes.h:35
@ None
Definition LadspaBase.h:49