Vital
Loading...
Searching...
No Matches
midi_keyboard.h
Go to the documentation of this file.
1#pragma once
2
3#include "JuceHeader.h"
6
18public:
25 static const float kBlackKeyOffsets[];
26
32 static const bool kWhiteKeys[];
33
35 static constexpr int kNumWhiteKeys = 75;
37 static constexpr int kNumWhiteKeysPerOctave = 7;
42
44 static constexpr float kBlackKeyHeightRatio = 0.7f;
46 static constexpr float kBlackKeyWidthRatio = 0.8f;
47
53 force_inline static bool isWhiteKey(int midi) {
55 }
56
61 MidiKeyboard(MidiKeyboardState& state);
62
67 void paintBackground(Graphics& g) override;
68
74 void parentHierarchyChanged() override;
75
81 void resized() override;
82
88 int getNoteAtPosition(Point<float> position);
89
95 bool isBlackKeyHeight(Point<float> position) { return position.y / getHeight() < kBlackKeyHeightRatio; }
96
103 float getVelocityForNote(int midi, Point<float> position);
104
109 void init(OpenGlWrapper& open_gl) override {
110 black_notes_.init(open_gl);
111 white_pressed_notes_.init(open_gl);
112 black_pressed_notes_.init(open_gl);
113 }
114
120 void render(OpenGlWrapper& open_gl, bool animate) override;
121
126
131 void destroy(OpenGlWrapper& open_gl) override {
132 black_notes_.destroy(open_gl);
133 white_pressed_notes_.destroy(open_gl);
134 black_pressed_notes_.destroy(open_gl);
135 }
136
141 void mouseDown(const MouseEvent& e) override {
142 hover_note_ = getNoteAtPosition(e.position);
143 state_.noteOn(midi_channel_, hover_note_, getVelocityForNote(hover_note_, e.position));
144 }
145
150 void mouseUp(const MouseEvent& e) override {
151 state_.noteOff(midi_channel_, hover_note_, 0.0f);
152 hover_note_ = getNoteAtPosition(e.position);
153 }
154
159 void mouseEnter(const MouseEvent& e) override {
160 hover_note_ = getNoteAtPosition(e.position);
161 }
162
167 void mouseExit(const MouseEvent& e) override {
168 hover_note_ = -1;
169 }
170
175 void mouseDrag(const MouseEvent& e) override {
176 int note = getNoteAtPosition(e.position);
177 if (note == hover_note_)
178 return;
179
180 state_.noteOff(midi_channel_, hover_note_, 0.0f);
181 state_.noteOn(midi_channel_, note, getVelocityForNote(note, e.position));
182 hover_note_ = note;
183 }
184
189 void mouseMove(const MouseEvent& e) override {
190 hover_note_ = getNoteAtPosition(e.position);
191 }
192
197 void setMidiChannel(int channel) { midi_channel_ = channel; }
198
202 void setColors();
203
204private:
211 void setWhiteKeyQuad(OpenGlMultiQuad* quads, int quad_index, int white_key_index);
212
219 void setBlackKeyQuad(OpenGlMultiQuad* quads, int quad_index, int black_key_index);
220
221 MidiKeyboardState& state_;
222 int midi_channel_;
223 int hover_note_;
224
225 OpenGlMultiQuad black_notes_;
226 OpenGlMultiQuad white_pressed_notes_;
227 OpenGlMultiQuad black_pressed_notes_;
228 OpenGlQuad hover_note_quad_;
229
230 Colour key_press_color_;
231 Colour hover_color_;
232 Colour white_key_color_;
233 Colour black_key_color_;
234
235 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MidiKeyboard)
236};
A visual and interactive MIDI keyboard component.
Definition midi_keyboard.h:17
static const float kBlackKeyOffsets[]
Horizontal offsets for black keys relative to white keys, per octave.
Definition midi_keyboard.h:3
void init(OpenGlWrapper &open_gl) override
Initializes OpenGL resources for rendering keys.
Definition midi_keyboard.h:109
void parentHierarchyChanged() override
Called when the parent hierarchy changes.
Definition midi_keyboard.cpp:89
void setMidiChannel(int channel)
Sets the MIDI channel used by note-on and note-off messages.
Definition midi_keyboard.h:197
float getVelocityForNote(int midi, Point< float > position)
Calculates the note velocity based on vertical mouse click position.
Definition midi_keyboard.cpp:152
static constexpr int kNumBlackKeysPerOctave
Number of black keys per octave.
Definition midi_keyboard.h:41
void mouseExit(const MouseEvent &e) override
Handles mouse exit events to clear the hovered note.
Definition midi_keyboard.h:167
static const bool kWhiteKeys[]
Array indicating which notes (semitones) in an octave are white keys.
Definition midi_keyboard.h:11
void mouseEnter(const MouseEvent &e) override
Handles mouse enter events to update the hovered note.
Definition midi_keyboard.h:159
int getNoteAtPosition(Point< float > position)
Determines the MIDI note at a given mouse position.
Definition midi_keyboard.cpp:130
static force_inline bool isWhiteKey(int midi)
Determines if a given MIDI note number corresponds to a white key.
Definition midi_keyboard.h:53
void paintBackground(Graphics &g) override
Paints any background elements of the keyboard, typically key boundaries.
Definition midi_keyboard.cpp:79
void mouseDown(const MouseEvent &e) override
Handles mouse down events to trigger note-on messages.
Definition midi_keyboard.h:141
void mouseMove(const MouseEvent &e) override
Handles mouse move events to update which note is hovered.
Definition midi_keyboard.h:189
void setPressedKeyPositions()
Updates which keys are displayed as pressed according to the current MidiKeyboardState.
Definition midi_keyboard.cpp:196
static constexpr int kNumWhiteKeys
Total number of white keys across the entire MIDI range.
Definition midi_keyboard.h:35
void setColors()
Updates the color scheme of the keys.
Definition midi_keyboard.cpp:93
void destroy(OpenGlWrapper &open_gl) override
Destroys OpenGL resources when the component is removed or reinitialized.
Definition midi_keyboard.h:131
void resized() override
Called when the component is resized.
Definition midi_keyboard.cpp:103
static constexpr int kNumWhiteKeysPerOctave
Number of white keys per octave.
Definition midi_keyboard.h:37
bool isBlackKeyHeight(Point< float > position)
Checks if a given position falls within the vertical range of a black key.
Definition midi_keyboard.h:95
void render(OpenGlWrapper &open_gl, bool animate) override
Renders the keyboard and its keys using OpenGL.
Definition midi_keyboard.cpp:162
static constexpr float kBlackKeyWidthRatio
Horizontal ratio of the black key width relative to white keys.
Definition midi_keyboard.h:46
static constexpr float kBlackKeyHeightRatio
Ratio of keyboard height covered by black keys.
Definition midi_keyboard.h:44
static constexpr int kNumBlackKeys
Total number of black keys across the entire MIDI range.
Definition midi_keyboard.h:39
void mouseDrag(const MouseEvent &e) override
Handles mouse drag events, allowing note slides across keys.
Definition midi_keyboard.h:175
MidiKeyboard(MidiKeyboardState &state)
Constructs the MidiKeyboard component.
Definition midi_keyboard.cpp:59
void mouseUp(const MouseEvent &e) override
Handles mouse up events to trigger note-off messages.
Definition midi_keyboard.h:150
A base component class that integrates JUCE's Component with OpenGL rendering.
Definition open_gl_component.h:20
A component for rendering multiple quads using OpenGL, with customizable colors, rounding,...
Definition open_gl_multi_quad.h:16
virtual void init(OpenGlWrapper &open_gl) override
Initializes OpenGL buffers and shader attributes.
Definition open_gl_multi_quad.cpp:37
virtual void destroy(OpenGlWrapper &open_gl) override
Releases OpenGL resources when the component is destroyed.
Definition open_gl_multi_quad.cpp:69
A convenience class for a single quad rendered via OpenGL.
Definition open_gl_multi_quad.h:447
#define force_inline
Definition common.h:23
constexpr int kNotesPerOctave
Number of semitones per octave.
Definition common.h:51
constexpr int kMidiSize
MIDI note count (0-127).
Definition common.h:44
A helper struct containing references to OpenGL context, shaders, and display scale.
Definition shaders.h:174