From f60f0cb3dd6fb75ee17e237e87ef0c9088e5bec4 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Tue, 17 Sep 2013 16:40:06 -0700 Subject: [PATCH] Allow keys 0-8 to specify desired octave. This allows specifying notes across a wider range than a single octave with the computer keyboard. --- scherzo.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/scherzo.c b/scherzo.c index b6fda6f..55a2cc9 100644 --- a/scherzo.c +++ b/scherzo.c @@ -51,6 +51,11 @@ typedef struct scherzo score_staff_t *treble; score_staff_t *bass; score_chord_t *chord; + + /* This is for a "computer keyboard". Any "piano keyboard" key + * knows its own octave. */ + int keyboard_octave; + int midi_fd; snd_midi_event_t *snd_midi_event; @@ -129,7 +134,7 @@ on_key_press_event (GtkWidget *widget, if (scherzo->challenge.note) octave = scherzo->challenge.note->octave; else - octave = 4; + octave = scherzo->keyboard_octave; switch (key->keyval) { case GDK_KEY_plus: @@ -179,6 +184,17 @@ on_key_press_event (GtkWidget *widget, case GDK_KEY_B: pitch = SCORE_PITCH_B; break; + case GDK_KEY_0: + case GDK_KEY_1: + case GDK_KEY_2: + case GDK_KEY_3: + case GDK_KEY_4: + case GDK_KEY_5: + case GDK_KEY_6: + case GDK_KEY_7: + case GDK_KEY_8: + scherzo->keyboard_octave = key->keyval - GDK_KEY_0; + break; } if ((key->keyval >= GDK_KEY_A && key->keyval <= GDK_KEY_G) || @@ -210,7 +226,7 @@ on_key_release_event (unused (GtkWidget *widget), if (scherzo->challenge.note) octave = scherzo->challenge.note->octave; else - octave = 4; + octave = scherzo->keyboard_octave; switch (key->keyval) { case GDK_KEY_c: @@ -508,10 +524,13 @@ scherzo_add_note (scherzo_t *scherzo, score_pitch_t pitch, int octave) score_note_t *note; int i; - if (scherzo->challenge.note) + if (scherzo->challenge.note) { staff = scherzo->challenge.staff; - else + } else if (octave >= 4) { staff = scherzo->treble; + } else { + staff = scherzo->bass; + } /* Do nothing if this note is already pressed. */ for (i = 0; i < scherzo->num_notes_pressed; i++) { @@ -791,6 +810,9 @@ main (int argc, char *argv[]) scherzo.chord = NULL; + /* Default to octave 4 for computer keyboard keypresses. */ + scherzo.keyboard_octave = 4; + scherzo.num_notes_pressed = 0; scherzo.notes_pressed = NULL; -- 2.43.0