drumstick  2.9.0
C++ MIDI libraries using Qt objects, idioms, and style.
pianoscene.h
Go to the documentation of this file.
1 /*
2  Virtual Piano Widget for Qt
3  Copyright (C) 2008-2023, Pedro Lopez-Cabanillas <plcl@users.sf.net>
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 3 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License along
16  with this program; If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #ifndef PIANOSCENE_H_
20 #define PIANOSCENE_H_
21 
22 #include <QGraphicsScene>
23 #include <QScopedPointer>
24 #include <QHash>
25 #include <QTouchEvent>
26 #include <drumstick/pianokeybd.h>
27 #include <drumstick/pianopalette.h>
28 #include "pianokey.h"
29 #include "keylabel.h"
30 
36 namespace drumstick { namespace widgets {
37 
46 class PianoScene : public QGraphicsScene
47 {
48  Q_OBJECT
49 public:
50  PianoScene(const int baseOctave,
51  const int numKeys,
52  const int startKey,
53  const QColor &keyPressedColor = QColor(),
54  QObject *parent = nullptr);
55  ~PianoScene();
56 
57  QSize sizeHint() const;
58  void setKeyboardMap(KeyboardMap *map);
59  KeyboardMap *getKeyboardMap() const;
61  void setPianoHandler(PianoHandler *handler);
62 
64  void setHighlightPalette(const PianoPalette &p);
66  void setBackgroundPalette(const PianoPalette &p);
68  void setForegroundPalette(const PianoPalette &p);
69 
70  bool showColorScale() const;
71  void setShowColorScale(const bool show);
72 
73  QColor getKeyPressedColor() const;
74  void setKeyPressedColor(const QColor &color);
75  void resetKeyPressedColor();
76 
77  int getMinNote() const;
78  void setMinNote(const int note);
79  int getMaxNote() const;
80  void setMaxNote(const int note);
81  int getTranspose() const;
82  void setTranspose(const int transpose);
83 
85  void setShowLabels(const LabelVisibility show);
87  void setAlterations(const LabelAlteration use);
89  void setOctave(const LabelCentralOctave octave);
90  LabelOrientation getOrientation() const;
91  void setOrientation(const LabelOrientation orientation);
92 
93  bool isKeyboardEnabled() const;
94  void setKeyboardEnabled(const bool enable);
95  bool isMouseEnabled() const;
96  void setMouseEnabled(const bool enable);
97  bool isTouchEnabled() const;
98  void setTouchEnabled(const bool enable);
99  bool velocityTint() const;
100  void setVelocityTint(const bool enable);
101  bool isOctaveStart(const int note);
102 
103  void showNoteOn(const int note, QColor color, int vel = -1);
104  void showNoteOn(const int note, int vel = -1);
105  void showNoteOff(const int note, int vel = -1);
106  int baseOctave() const;
107  void setBaseOctave(const int base);
108  int numKeys() const;
109  int startKey() const;
110  void allKeysOff();
111  void keyOn(const int note);
112  void keyOff(const int note);
113  bool getRawKeyboardMode() const;
114  void setRawKeyboardMode(const bool b);
115  void useCustomNoteNames(const QStringList &names);
116  void useStandardNoteNames();
117  QStringList customNoteNames() const;
118  QStringList standardNoteNames() const;
119  int getVelocity();
120  void setVelocity(const int velocity);
121  int getChannel() const;
122  void setChannel(const int channel);
123  void retranslate();
124  void refreshLabels();
125  void hideOrShowKeys();
126  void refreshKeys();
127 
128  void setKeyPicture(const bool natural, const QPixmap &pix);
129  QPixmap getKeyPicture(const bool natural);
130 
131  void setUseKeyPictures(const bool enable);
132  bool getUseKeyPictures() const;
133 
134  void saveData(QByteArray &ba);
135  void loadData(QByteArray &ba);
136 
137  bool touchScreenEvent(QTouchEvent *touchEvent);
138 
139  void setUsingNativeFilter(const bool newState);
140  bool isUsingNativeFilter() const;
141 
142  void setOctaveSubscript(const bool enable);
143  bool octaveSubscript() const;
144 
145 Q_SIGNALS:
153  void noteOn(int n, int v);
161  void noteOff(int n, int v);
167  void signalName(const QString &name);
168 
169 protected:
170  void showKeyOn(PianoKey *key, QColor color, int vel);
171  void showKeyOn(PianoKey *key, int vel);
172  void showKeyOff(PianoKey *key, int vel);
173  void displayKeyOn(PianoKey *key);
174  void keyOn(PianoKey *key);
175  void keyOff(PianoKey *key);
176  void keyOn(PianoKey *key, qreal pressure);
177  void keyOff(PianoKey *key, qreal pressure);
178  PianoKey *getKeyForPos(const QPointF &p) const;
179  PianoKey *getPianoKey(const int key) const;
180  QString noteName(PianoKey *key);
181  void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) override;
182  void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) override;
183  void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) override;
184  void keyPressEvent(QKeyEvent *keyEvent) override;
185  void keyReleaseEvent(QKeyEvent *keyEvent) override;
186  bool event(QEvent *event) override;
187 
188  void triggerNoteOn(const int note, const int vel);
189  void triggerNoteOff(const int note, const int vel);
190  int getNoteFromKey(const int key) const;
191  void setHighlightColorFromPolicy(PianoKey *key, const int vel);
192 
193 private:
194  class PianoScenePrivate;
195  QScopedPointer<PianoScenePrivate> d;
196  };
197 
200 }} // namespace drumstick::widgets
201 
202 #endif /*PIANOSCENE_H_*/
The QEvent class is the base class of all event classes.
The QGraphicsScene class provides a surface for managing a large number of 2D graphical items.
The QObject class is the base class of all Qt objects.
The PianoHandler class callbacks.
Definition: pianokeybd.h:84
The PianoPalette class.
Definition: pianopalette.h:71
The PianoScene class is a QGraphicsScene composed by a number of graphics items: the piano keys.
Definition: pianoscene.h:47
void allKeysOff()
Deactivates all keys.
Definition: pianoscene.cpp:807
void triggerNoteOn(const int note, const int vel)
Performs a Note On MIDI event for the given MIDI note number and velocity.
Definition: pianoscene.cpp:492
void resetKeyPressedColor()
Assigns the default highlight palette colors and assigns it to the scene.
Definition: pianoscene.cpp:835
void keyOff(const int note)
Produces a MIDI Note Off event and deactivates the corresponding key for the given MIDI note number.
Definition: pianoscene.cpp:619
bool octaveSubscript() const
Returns whether the subscript octave designation is enabled.
void showKeyOff(PianoKey *key, int vel)
Displays as deactivated a key.
Definition: pianoscene.cpp:423
void setBackgroundPalette(const PianoPalette &p)
Assigns the active background palette.
void setKeyPressedColor(const QColor &color)
Assigns a single color for key highlight.
Definition: pianoscene.cpp:820
void setRawKeyboardMode(const bool b)
Assigns the low level computer keyboard mode.
void keyOn(const int note)
Produces a MIDI Note On event and highlights the corresponding key for the given MIDI note number.
Definition: pianoscene.cpp:607
void useStandardNoteNames()
Assigns the standard note names, clearing the list of custom note names.
void hideOrShowKeys()
Hides or shows keys.
Definition: pianoscene.cpp:856
LabelCentralOctave getOctave() const
Returns the central octave name policy.
PianoScene(const int baseOctave, const int numKeys, const int startKey, const QColor &keyPressedColor=QColor(), QObject *parent=nullptr)
Constructor.
Definition: pianoscene.cpp:253
bool event(QEvent *event) override
This method overrides QGraphicsScene::event().
Definition: pianoscene.cpp:799
int baseOctave() const
Returns the base octave number.
Definition: pianoscene.cpp:483
PianoPalette getForegroundPalette()
Returns the active foreground palette.
void setHighlightPalette(const PianoPalette &p)
Assigns the active highlight palette.
void setShowColorScale(const bool show)
Enables or disables the color scale key background mode.
void setPianoHandler(PianoHandler *handler)
Assigns a PianoHandler pointer for processing note events.
Definition: pianoscene.cpp:356
void setKeyboardMap(KeyboardMap *map)
Assigns the computer keyboard note map.
Definition: pianoscene.cpp:322
void noteOff(int n, int v)
This signal is emitted for each Note Off MIDI event created using the computer keyboard,...
void setVelocity(const int velocity)
Assigns the MIDI note velocity parameter that is assigned to the MIDI OUT notes.
void setMinNote(const int note)
Assigns the minimum MIDI note number that will be displayed.
Definition: pianoscene.cpp:869
bool showColorScale() const
Returns whether the color scale mode is enabled.
void setBaseOctave(const int base)
Assigns the octave base number.
Definition: pianoscene.cpp:911
PianoKey * getKeyForPos(const QPointF &p) const
Returns the piano key for the given scene point coordenates.
Definition: pianoscene.cpp:641
void signalName(const QString &name)
signalName is emitted for each note created, and contains a string with the MIDI note number and the ...
int numKeys() const
Returns the number of keys that will be displayed.
Definition: pianoscene.cpp:924
PianoPalette getHighlightPalette()
Returns the palette used for highlighting the played keys.
Definition: pianoscene.cpp:365
void setKeyboardEnabled(const bool enable)
Enables or disables the computer keyboard note generation.
void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) override
This event handler, for event mouseEvent, is reimplemented to receive mouse move events for the scene...
Definition: pianoscene.cpp:657
bool isUsingNativeFilter() const
Returns whether the application is filtering native events.
void triggerNoteOff(const int note, const int vel)
Performs a Note Off MIDI event for the given MIDI note number and velocity.
Definition: pianoscene.cpp:511
PianoKey * getPianoKey(const int key) const
Returns the piano key object corresponding to the given computer keyboard key.
Definition: pianoscene.cpp:731
int getVelocity()
Returns the MIDI note velocity parameter that is assigned to the MIDI OUT notes.
int getChannel() const
Returns the MIDI channel that is assigned to the output events, or used to filter the input events (u...
void setForegroundPalette(const PianoPalette &p)
Assigns the active foreground palette.
void keyPressEvent(QKeyEvent *keyEvent) override
This event handler, for event keyEvent, is reimplemented to receive keypress events.
Definition: pianoscene.cpp:743
void setVelocityTint(const bool enable)
Enables or disables the velocity parameter of note events to influence the highlight key colors.
bool touchScreenEvent(QTouchEvent *touchEvent)
Process touch screen events, called by the view.
bool velocityTint() const
Returns whether the velocity parameter of note events is used to influence the highlight key colors.
void setUsingNativeFilter(const bool newState)
Enables or disables the application level usage of a native event filter.
QColor getKeyPressedColor() const
Returns the single highlight palette color.
int getNoteFromKey(const int key) const
Returns the note number for the given computer keyboard key code.
Definition: pianoscene.cpp:714
void refreshLabels()
Refresh the visibility and other attributes of the labels shown over the piano keys.
Definition: pianoscene.cpp:962
void showNoteOff(const int note, int vel=-1)
Displays deactivated the corresponding key for a given MIDI note, with MIDI velocity.
Definition: pianoscene.cpp:470
void setShowLabels(const LabelVisibility show)
Assigns the label visibility policy to the piano keys.
void refreshKeys()
Refresh the background colors of all the piano keys.
Definition: pianoscene.cpp:982
QSize sizeHint() const
Returns the calculated size of the scene.
Definition: pianoscene.cpp:313
bool isOctaveStart(const int note)
Returns whether the given note number is a octave startup note.
Definition: pianoscene.cpp:943
void setAlterations(const LabelAlteration use)
Assigns the alterations name policy.
PianoPalette getBackgroundPalette()
Returns the background palette.
QStringList standardNoteNames() const
Returns the standard note names list.
void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) override
This event handler, for event mouseEvent, is reimplemented to receive mouse press events for the scen...
Definition: pianoscene.cpp:679
void setTranspose(const int transpose)
Assigns the transpose amount in semitones.
int getMaxNote() const
Returns the maximum MIDI note number that will be displayed.
Definition: pianoscene.cpp:881
LabelAlteration alterations() const
Returns the alterations name policy.
void setHighlightColorFromPolicy(PianoKey *key, const int vel)
Assigns to the given key the highlight color from the active highlight palette and the given MIDI vel...
Definition: pianoscene.cpp:529
PianoHandler * getPianoHandler() const
Gets the PianoHandler pointer to the note receiver.
Definition: pianoscene.cpp:343
void showKeyOn(PianoKey *key, QColor color, int vel)
Displays highlighted the activated key with the supplied color and note velocity.
Definition: pianoscene.cpp:395
KeyboardMap * getKeyboardMap() const
Returns the computer keyboard note map.
Definition: pianoscene.cpp:331
bool isMouseEnabled() const
Returns whether the computer keyboard note generation is enabled.
bool getRawKeyboardMode() const
Returns whether the low level computer keyboard mode is enabled.
Definition: pianoscene.cpp:631
void noteOn(int n, int v)
This signal is emitted for each Note On MIDI event created using the computer keyboard,...
void showNoteOn(const int note, QColor color, int vel=-1)
Displays highlighted the corresponding key for a given MIDI note, with a color and MIDI velocity.
Definition: pianoscene.cpp:443
void keyReleaseEvent(QKeyEvent *keyEvent) override
This event handler, for event keyEvent, is reimplemented to receive key release events.
Definition: pianoscene.cpp:770
void setMaxNote(const int note)
Assigns the maximum MIDI note number that will be displayed.
Definition: pianoscene.cpp:890
void retranslate()
Retranslates the standard note names.
int startKey() const
Returns the first key number that will be displayed.
Definition: pianoscene.cpp:933
void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) override
This event handler, for event mouseEvent, is reimplemented to receive mouse release events for the sc...
Definition: pianoscene.cpp:696
void setTouchEnabled(const bool enable)
Enables or disables the touch screen note generation.
void displayKeyOn(PianoKey *key)
Displays the note label over a highligted key.
Definition: pianoscene.cpp:374
void useCustomNoteNames(const QStringList &names)
Assigns the list of custom note names, and enables this mode.
void setMouseEnabled(const bool enable)
Enables or disables the mouse note generation.
void setChannel(const int channel)
Assigns the MIDI channel that is included into the output events, or used to filter the input events ...
int getMinNote() const
Returns the minimum MIDI note number that will be displayed.
Definition: pianoscene.cpp:848
void setOrientation(const LabelOrientation orientation)
Assigns the label orientation policy.
QStringList customNoteNames() const
Returns the custom note names list.
LabelVisibility showLabels() const
Returns the label visibility policy (display note names over the piano keys).
void setOctaveSubscript(const bool enable)
Enables or disables the subscript octave designation.
bool isTouchEnabled() const
Returns whether the touch screen note generation is enabled.
int getTranspose() const
Returns the transpose amount in semitones.
Definition: pianoscene.cpp:902
QString noteName(PianoKey *key)
Returns the note name string that will be displayed over a given piano key.
Definition: pianoscene.cpp:953
LabelAlteration
Labels for Alterations.
Definition: pianokeybd.h:131
LabelCentralOctave
Labels Central Octave.
Definition: pianokeybd.h:161
LabelVisibility
Labels Visibility.
Definition: pianokeybd.h:120
LabelOrientation
Labels Orientation.
Definition: pianokeybd.h:141
QHash< int, int > KeyboardMap
KeyboardMap.
Definition: pianokeybd.h:108
Declaration of the KeyLabel class.
Drumstick common.
Definition: alsaclient.cpp:68
Declaration of the PianoKey class.
Piano Keyboard Widget.
Piano Palette declarations.