summaryrefslogtreecommitdiff
path: root/gtk2_ardour/gtk_pianokeyboard.h
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/gtk_pianokeyboard.h')
-rw-r--r--gtk2_ardour/gtk_pianokeyboard.h166
1 files changed, 104 insertions, 62 deletions
diff --git a/gtk2_ardour/gtk_pianokeyboard.h b/gtk2_ardour/gtk_pianokeyboard.h
index 535b143db3..bba08187b1 100644
--- a/gtk2_ardour/gtk_pianokeyboard.h
+++ b/gtk2_ardour/gtk_pianokeyboard.h
@@ -20,20 +20,10 @@
#ifndef __PIANO_KEYBOARD_H__
#define __PIANO_KEYBOARD_H__
-#include <glib.h>
-#include <gtk/gtkdrawingarea.h>
-
-G_BEGIN_DECLS
-
-#define TYPE_PIANO_KEYBOARD (piano_keyboard_get_type ())
-#define PIANO_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PIANO_KEYBOARD, PianoKeyboard))
-#define PIANO_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_PIANO_KEYBOARD, PianoKeyboardClass))
-#define IS_PIANO_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_PIANO_KEYBOARD))
-#define IS_PIANO_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_PIANO_KEYBOARD))
-#define PIANO_KEYBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_PIANO_KEYBOARD, PianoKeyboardClass))
+#include <map>
-typedef struct _PianoKeyboard PianoKeyboard;
-typedef struct _PianoKeyboardClass PianoKeyboardClass;
+#include <glib.h>
+#include <gtkmm/drawingarea.h>
#define NNOTES (128)
#define PIANO_MIN_NOTE 21
@@ -42,59 +32,111 @@ typedef struct _PianoKeyboardClass PianoKeyboardClass;
#define OCTAVE_MIN (-1)
#define OCTAVE_MAX (7)
-struct PKNote {
- int pressed; /* 1 if key is in pressed down state. */
- int sustained; /* 1 if note is sustained. */
- int x; /* Distance between the left edge of the key
- * and the left edge of the widget, in pixels. */
- int w; /* Width of the key, in pixels. */
- int h; /* Height of the key, in pixels. */
- int white; /* 1 if key is white; 0 otherwise. */
-};
+class PianoKeyboard : public Gtk::DrawingArea
+{
+public:
+ PianoKeyboard ();
+ ~PianoKeyboard ();
-struct _PianoKeyboard {
- GtkDrawingArea da;
- int maybe_stop_sustained_notes;
- int sustain_new_notes;
- gboolean enable_keyboard_cue;
- gboolean highlight_grand_piano_range;
- gboolean print_note_label;
- int octave;
- int octave_range;
- int widget_margin;
- int note_being_pressed_using_mouse;
- int min_note;
- int max_note;
- int last_key;
- gboolean monophonic;
- struct PKNote notes[NNOTES];
- GHashTable* key_bindings; /**< Table used to translate from PC keyboard character to MIDI note number. */
- char* note_bindings[NNOTES]; /**< Table to translate from MIDI note number to PC keyboard character. */
- int min_velocity;
- int max_velocity;
- int key_velocity;
-};
+ sigc::signal<void, int, int> NoteOn;
+ sigc::signal<void, int> NoteOff;
+ sigc::signal<void > Rest;
-struct _PianoKeyboardClass {
- GtkDrawingAreaClass parent_class;
-};
+ enum Layout {
+ QWERTY,
+ QWERTZ,
+ AZERTY,
+ DVORAK
+ };
+
+ void sustain_press ();
+ void sustain_release ();
+ void set_note_on (int note);
+ void set_note_off (int note);
+ void set_keyboard_cue (bool enabled);
+ void set_grand_piano_highlight (bool enabled);
+ void show_note_label (bool enabled);
+ void set_monophonic (bool monophonic);
+ void set_octave (int octave);
+ void set_octave_range (int octave_range);
+ void set_keyboard_layout (Layout layout);
+ void set_velocities (int min_vel, int max_vel, int key_vel);
+
+protected:
+ bool on_key_press_event (GdkEventKey *);
+ bool on_key_release_event (GdkEventKey *);
+ bool on_button_press_event (GdkEventButton*);
+ bool on_button_release_event (GdkEventButton*);
+ bool on_motion_notify_event (GdkEventMotion*);
+ bool on_expose_event (GdkEventExpose*);
-GType piano_keyboard_get_type (void) G_GNUC_CONST;
-GtkWidget* piano_keyboard_new (void);
+ void on_size_request (Gtk::Requisition*);
+ void on_size_allocate (Gtk::Allocation&);
-void piano_keyboard_sustain_press (PianoKeyboard* pk);
-void piano_keyboard_sustain_release (PianoKeyboard* pk);
-void piano_keyboard_set_note_on (PianoKeyboard* pk, int note);
-void piano_keyboard_set_note_off (PianoKeyboard* pk, int note);
-void piano_keyboard_set_keyboard_cue (PianoKeyboard* pk, gboolean enabled);
-void piano_keyboard_set_grand_piano_highlight (PianoKeyboard* pk, gboolean enabled);
-void piano_keyboard_show_note_label (PianoKeyboard* pk, gboolean enabled);
-void piano_keyboard_set_monophonic (PianoKeyboard* pk, gboolean monophonic);
-void piano_keyboard_set_octave (PianoKeyboard* pk, int octave);
-void piano_keyboard_set_octave_range (PianoKeyboard* pk, int octave_range);
-void piano_keyboard_set_keyboard_layout (PianoKeyboard* pk, const char* layout);
-void piano_keyboard_set_velocities (PianoKeyboard* pk, int min_vel, int max_vel, int key_vel);
+private:
-G_END_DECLS
+ void draw_keyboard_cue (cairo_t* cr, int note);
+ void queue_note_draw (int note);
+ void draw_note (cairo_t* cr, int note);
+ int press_key (int key, int vel);
+ int release_key (int key);
+ void release_key ();
+ void stop_unsustained_notes ();
+ void stop_sustained_notes ();
+ int key_binding (const char* key);
+ void bind_key (const char* key, int note);
+ void clear_notes ();
+ void bind_keys_qwerty ();
+ void bind_keys_qwertz ();
+ void bind_keys_azerty ();
+ void bind_keys_dvorak ();
+
+ int get_note_for_xy (int x, int y) const;
+ int get_velocity_for_note_at_y (int note, int y) const;
+
+ int is_black (int key) const;
+ double black_key_left_shift (int key) const;
+
+ void recompute_dimensions ();
+
+ struct PKNote {
+ PKNote ()
+ : pressed (false)
+ , sustained (false)
+ , white (false)
+ , x (0)
+ , w (0)
+ , h (0)
+ {}
+
+ bool pressed; /* 1 if key is in pressed down state. */
+ bool sustained; /* 1 if note is sustained. */
+ bool white; /* 1 if key is white; 0 otherwise. */
+ int x; /* Distance between the left edge of the key * and the left edge of the widget, in pixels. */
+ int w; /* Width of the key, in pixels. */
+ int h; /* Height of the key, in pixels. */
+ };
+
+ bool _maybe_stop_sustained_notes;
+ bool _sustain_new_notes;
+ bool _enable_keyboard_cue;
+ bool _highlight_grand_piano_range;
+ bool _print_note_label;
+ int _octave;
+ int _octave_range;
+ int _note_being_pressed_using_mouse;
+ int _min_note;
+ int _max_note;
+ int _last_key;
+ bool _monophonic;
+ int _min_velocity;
+ int _max_velocity;
+ int _key_velocity;
+
+ PKNote _notes[NNOTES];
+
+ std::map<std::string, int> _key_bindings; /**< Table used to translate from PC keyboard character to MIDI note number. */
+ std::map<int, std::string> _note_bindings; /**< Table to translate from MIDI note number to PC keyboard character. */
+};
#endif /* __PIANO_KEYBOARD_H__ */