diff options
Diffstat (limited to 'gtk2_ardour/gtk_pianokeyboard.h')
-rw-r--r-- | gtk2_ardour/gtk_pianokeyboard.h | 166 |
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__ */ |