X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Fgtk_pianokeyboard.c;h=2be8cdf2b663abd6f7dac9fc83d79384248623ad;hb=864f9e497dfa6bf6f7ab349e1b2b123e9bc575ba;hp=34bf184249178ecccd1a9ebbc47a9a4c04a9ee8d;hpb=84f55440a3c6317dd2ab5d7e3d638016609e4d03;p=ardour.git diff --git a/gtk2_ardour/gtk_pianokeyboard.c b/gtk2_ardour/gtk_pianokeyboard.c index 34bf184249..2be8cdf2b6 100644 --- a/gtk2_ardour/gtk_pianokeyboard.c +++ b/gtk2_ardour/gtk_pianokeyboard.c @@ -155,6 +155,13 @@ press_key(PianoKeyboard *pk, int key) else pk->notes[key].sustained = 0; + if (pk->monophonic && pk->last_key != key) { + pk->notes[pk->last_key].pressed = 0; + pk->notes[pk->last_key].sustained = 0; + queue_note_draw(pk, pk->last_key); + } + pk->last_key = key; + pk->notes[key].pressed = 1; g_signal_emit_by_name(GTK_WIDGET(pk), "note-on", key); @@ -244,7 +251,7 @@ bind_key(PianoKeyboard *pk, const char *key, int note) { assert(pk->key_bindings != NULL); - g_hash_table_insert(pk->key_bindings, key, (gpointer)((intptr_t)note)); + g_hash_table_insert(pk->key_bindings, (const gpointer)key, (gpointer)((intptr_t)note)); } static void @@ -610,15 +617,15 @@ piano_keyboard_class_init(PianoKeyboardClass *klass) /* Set up signals. */ piano_keyboard_signals[NOTE_ON_SIGNAL] = g_signal_new ("note-on", - G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_TYPE_FROM_CLASS (klass), (GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION), 0, NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); piano_keyboard_signals[NOTE_OFF_SIGNAL] = g_signal_new ("note-off", - G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_TYPE_FROM_CLASS (klass), (GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION), 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, + G_TYPE_FROM_CLASS (klass), (GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION), 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); widget_klass = (GtkWidgetClass*) klass; @@ -659,7 +666,7 @@ piano_keyboard_get_type(void) 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, (GTypeFlags)0); } return mk_type; @@ -668,7 +675,7 @@ piano_keyboard_get_type(void) GtkWidget * piano_keyboard_new(void) { - GtkWidget *widget = gtk_type_new(piano_keyboard_get_type()); + GtkWidget *widget = (GtkWidget*)gtk_type_new(piano_keyboard_get_type()); PianoKeyboard *pk = PIANO_KEYBOARD(widget); @@ -677,7 +684,11 @@ piano_keyboard_new(void) pk->enable_keyboard_cue = 0; pk->octave = 4; pk->note_being_pressed_using_mouse = -1; - memset((void *)pk->notes, 0, sizeof(struct Note) * NNOTES); + pk->last_key = 0; + pk->monophonic = FALSE; + + memset((void *)pk->notes, 0, sizeof(struct PKNote) * NNOTES); + pk->key_bindings = g_hash_table_new(g_str_hash, g_str_equal); bind_keys_qwerty(pk); @@ -690,6 +701,12 @@ piano_keyboard_set_keyboard_cue(PianoKeyboard *pk, int enabled) pk->enable_keyboard_cue = enabled; } +void +piano_keyboard_set_monophonic(PianoKeyboard *pk, gboolean monophonic) +{ + pk->monophonic = monophonic; +} + void piano_keyboard_sustain_press(PianoKeyboard *pk) {