a bunch of tweaks for the step entry process (computer keyboard input now works, for example)
git-svn-id: svn://localhost/ardour2/branches/3.0@7532 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
bd69ec8b25
commit
b1f5a6a68d
@ -47,6 +47,7 @@
|
|||||||
enum {
|
enum {
|
||||||
NOTE_ON_SIGNAL,
|
NOTE_ON_SIGNAL,
|
||||||
NOTE_OFF_SIGNAL,
|
NOTE_OFF_SIGNAL,
|
||||||
|
REST_SIGNAL,
|
||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -183,6 +184,12 @@ release_key(PianoKeyboard *pk, int key)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rest (PianoKeyboard* pk)
|
||||||
|
{
|
||||||
|
g_signal_emit_by_name(GTK_WIDGET(pk), "rest");
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
stop_unsustained_notes(PianoKeyboard *pk)
|
stop_unsustained_notes(PianoKeyboard *pk)
|
||||||
{
|
{
|
||||||
@ -249,6 +256,8 @@ bind_keys_qwerty(PianoKeyboard *pk)
|
|||||||
{
|
{
|
||||||
clear_notes(pk);
|
clear_notes(pk);
|
||||||
|
|
||||||
|
bind_key(pk, "space", 128);
|
||||||
|
|
||||||
/* Lower keyboard row - "zxcvbnm". */
|
/* Lower keyboard row - "zxcvbnm". */
|
||||||
bind_key(pk, "z", 12); /* C0 */
|
bind_key(pk, "z", 12); /* C0 */
|
||||||
bind_key(pk, "s", 13);
|
bind_key(pk, "s", 13);
|
||||||
@ -300,6 +309,8 @@ bind_keys_azerty(PianoKeyboard *pk)
|
|||||||
{
|
{
|
||||||
clear_notes(pk);
|
clear_notes(pk);
|
||||||
|
|
||||||
|
bind_key(pk, "space", 128);
|
||||||
|
|
||||||
/* Lower keyboard row - "wxcvbn,". */
|
/* Lower keyboard row - "wxcvbn,". */
|
||||||
bind_key(pk, "w", 12); /* C0 */
|
bind_key(pk, "w", 12); /* C0 */
|
||||||
bind_key(pk, "s", 13);
|
bind_key(pk, "s", 13);
|
||||||
@ -367,6 +378,14 @@ keyboard_event_handler(GtkWidget *mk, GdkEventKey *event, gpointer notused)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (note == 128) {
|
||||||
|
if (event->type == GDK_KEY_RELEASE) {
|
||||||
|
rest (pk);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
note += pk->octave * 12;
|
note += pk->octave * 12;
|
||||||
|
|
||||||
assert(note >= 0);
|
assert(note >= 0);
|
||||||
@ -586,6 +605,10 @@ piano_keyboard_class_init(PianoKeyboardClass *klass)
|
|||||||
G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
|
G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
|
||||||
0, NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
|
0, NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
|
||||||
|
|
||||||
|
piano_keyboard_signals[REST_SIGNAL] = g_signal_new ("rest",
|
||||||
|
G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
|
||||||
|
0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
|
||||||
|
|
||||||
widget_klass = (GtkWidgetClass*) klass;
|
widget_klass = (GtkWidgetClass*) klass;
|
||||||
|
|
||||||
widget_klass->expose_event = piano_keyboard_expose;
|
widget_klass->expose_event = piano_keyboard_expose;
|
||||||
@ -621,6 +644,7 @@ piano_keyboard_get_type(void)
|
|||||||
sizeof (PianoKeyboard),
|
sizeof (PianoKeyboard),
|
||||||
0, /* n_preallocs */
|
0, /* n_preallocs */
|
||||||
(GInstanceInitFunc) piano_keyboard_init,
|
(GInstanceInitFunc) piano_keyboard_init,
|
||||||
|
0, /* value_table */
|
||||||
};
|
};
|
||||||
|
|
||||||
mk_type = g_type_register_static(GTK_TYPE_DRAWING_AREA, "PianoKeyboard", &mk_info, 0);
|
mk_type = g_type_register_static(GTK_TYPE_DRAWING_AREA, "PianoKeyboard", &mk_info, 0);
|
||||||
|
@ -116,6 +116,7 @@ MidiTimeAxisView::MidiTimeAxisView (PublicEditor& ed, Session* sess,
|
|||||||
, _midi_thru_item (0)
|
, _midi_thru_item (0)
|
||||||
, default_channel_menu (0)
|
, default_channel_menu (0)
|
||||||
, controller_menu (0)
|
, controller_menu (0)
|
||||||
|
, step_editor (0)
|
||||||
{
|
{
|
||||||
subplugin_menu.set_name ("ArdourContextMenu");
|
subplugin_menu.set_name ("ArdourContextMenu");
|
||||||
|
|
||||||
@ -924,16 +925,30 @@ MidiTimeAxisView::start_step_editing ()
|
|||||||
|
|
||||||
midi_track()->set_step_editing (true);
|
midi_track()->set_step_editing (true);
|
||||||
|
|
||||||
StepEntry* se = new StepEntry (*this);
|
if (step_editor == 0) {
|
||||||
|
step_editor = new StepEntry (*this);
|
||||||
|
step_editor->signal_delete_event().connect (sigc::mem_fun (*this, &MidiTimeAxisView::step_editor_hidden));
|
||||||
|
}
|
||||||
|
|
||||||
se->set_position (WIN_POS_MOUSE);
|
step_editor->set_position (WIN_POS_MOUSE);
|
||||||
se->present ();
|
step_editor->present ();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
MidiTimeAxisView::step_editor_hidden (GdkEventAny*)
|
||||||
|
{
|
||||||
|
stop_step_editing ();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MidiTimeAxisView::stop_step_editing ()
|
MidiTimeAxisView::stop_step_editing ()
|
||||||
{
|
{
|
||||||
midi_track()->set_step_editing (false);
|
midi_track()->set_step_editing (false);
|
||||||
|
|
||||||
|
if (step_editor) {
|
||||||
|
step_editor->hide ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -53,6 +53,7 @@ class PublicEditor;
|
|||||||
class MidiStreamView;
|
class MidiStreamView;
|
||||||
class MidiScroomer;
|
class MidiScroomer;
|
||||||
class PianoRollHeader;
|
class PianoRollHeader;
|
||||||
|
class StepEntry;
|
||||||
|
|
||||||
class MidiTimeAxisView : public RouteTimeAxisView
|
class MidiTimeAxisView : public RouteTimeAxisView
|
||||||
{
|
{
|
||||||
@ -172,6 +173,9 @@ class MidiTimeAxisView : public RouteTimeAxisView
|
|||||||
ParameterMenuMap _channel_command_menu_map;
|
ParameterMenuMap _channel_command_menu_map;
|
||||||
/** parameter -> menu item map for the controller menu */
|
/** parameter -> menu item map for the controller menu */
|
||||||
ParameterMenuMap _controller_menu_map;
|
ParameterMenuMap _controller_menu_map;
|
||||||
|
|
||||||
|
StepEntry* step_editor;
|
||||||
|
bool step_editor_hidden (GdkEventAny*);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __ardour_midi_time_axis_h__ */
|
#endif /* __ardour_midi_time_axis_h__ */
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "gtkmm2ext/keyboard.h"
|
||||||
|
|
||||||
#include "midi_time_axis.h"
|
#include "midi_time_axis.h"
|
||||||
#include "step_entry.h"
|
#include "step_entry.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
@ -33,9 +35,14 @@ _note_off_event_handler (GtkWidget* widget, int note, gpointer arg)
|
|||||||
((StepEntry*)arg)->note_off_event_handler (note);
|
((StepEntry*)arg)->note_off_event_handler (note);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_rest_event_handler (GtkWidget* widget, gpointer arg)
|
||||||
|
{
|
||||||
|
((StepEntry*)arg)->rest_event_handler ();
|
||||||
|
}
|
||||||
|
|
||||||
StepEntry::StepEntry (MidiTimeAxisView& mtv)
|
StepEntry::StepEntry (MidiTimeAxisView& mtv)
|
||||||
: ArdourDialog (_("Step Entry Editor"))
|
: ArdourDialog (string_compose (_("Step Entry: %1"), mtv.name()))
|
||||||
, triplet_button ("3")
|
, triplet_button ("3")
|
||||||
, sustain_button ("sustain")
|
, sustain_button ("sustain")
|
||||||
, rest_button ("rest")
|
, rest_button ("rest")
|
||||||
@ -166,10 +173,15 @@ StepEntry::StepEntry (MidiTimeAxisView& mtv)
|
|||||||
upper_box.pack_start (channel_spinner, false, false);
|
upper_box.pack_start (channel_spinner, false, false);
|
||||||
|
|
||||||
_piano = (PianoKeyboard*) piano_keyboard_new ();
|
_piano = (PianoKeyboard*) piano_keyboard_new ();
|
||||||
piano = Glib::wrap ((GtkWidget*) _piano);
|
|
||||||
piano_keyboard_set_keyboard_cue (PIANO_KEYBOARD(_piano), 1);
|
piano_keyboard_set_keyboard_cue (PIANO_KEYBOARD(_piano), 1);
|
||||||
|
|
||||||
|
piano = Glib::wrap ((GtkWidget*) _piano);
|
||||||
|
|
||||||
|
piano->set_flags (Gtk::CAN_FOCUS);
|
||||||
|
piano->signal_enter_notify_event().connect (sigc::mem_fun (*this, &StepEntry::piano_enter_notify_event), false);
|
||||||
|
|
||||||
g_signal_connect(G_OBJECT(_piano), "note-off", G_CALLBACK(_note_off_event_handler), this);
|
g_signal_connect(G_OBJECT(_piano), "note-off", G_CALLBACK(_note_off_event_handler), this);
|
||||||
|
g_signal_connect(G_OBJECT(_piano), "rest", G_CALLBACK(_rest_event_handler), this);
|
||||||
|
|
||||||
rest_button.signal_clicked().connect (sigc::mem_fun (*this, &StepEntry::rest_click));
|
rest_button.signal_clicked().connect (sigc::mem_fun (*this, &StepEntry::rest_click));
|
||||||
chord_button.signal_toggled().connect (sigc::mem_fun (*this, &StepEntry::chord_toggled));
|
chord_button.signal_toggled().connect (sigc::mem_fun (*this, &StepEntry::chord_toggled));
|
||||||
@ -187,6 +199,28 @@ StepEntry::~StepEntry()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
StepEntry::on_key_press_event (GdkEventKey* ev)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
g_signal_emit_by_name (G_OBJECT(_piano), "key-press-event", ev, &ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
StepEntry::on_key_release_event (GdkEventKey* ev)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
g_signal_emit_by_name (G_OBJECT(_piano), "key-release-event", ev, &ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
StepEntry::rest_event_handler ()
|
||||||
|
{
|
||||||
|
_mtv->step_edit_rest();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
StepEntry::note_off_event_handler (int note)
|
StepEntry::note_off_event_handler (int note)
|
||||||
{
|
{
|
||||||
@ -259,3 +293,11 @@ StepEntry::chord_toggled ()
|
|||||||
_mtv->step_edit_toggle_chord ();
|
_mtv->step_edit_toggle_chord ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
StepEntry::piano_enter_notify_event (GdkEventCrossing *ev)
|
||||||
|
{
|
||||||
|
piano->grab_focus ();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ class StepEntry : public ArdourDialog
|
|||||||
~StepEntry ();
|
~StepEntry ();
|
||||||
|
|
||||||
void note_off_event_handler (int note);
|
void note_off_event_handler (int note);
|
||||||
|
void rest_event_handler ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Gtk::VBox packer;
|
Gtk::VBox packer;
|
||||||
@ -81,6 +82,10 @@ class StepEntry : public ArdourDialog
|
|||||||
void sustain_click ();
|
void sustain_click ();
|
||||||
void chord_toggled ();
|
void chord_toggled ();
|
||||||
void triplet_toggled ();
|
void triplet_toggled ();
|
||||||
|
|
||||||
|
bool piano_enter_notify_event (GdkEventCrossing *ev);
|
||||||
|
bool on_key_release_event (GdkEventKey*);
|
||||||
|
bool on_key_press_event (GdkEventKey*);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __gtk2_ardour_step_entry_h__ */
|
#endif /* __gtk2_ardour_step_entry_h__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user