* keyboard". Any "piano keyboard" key knows its own octave and
* accidental already. */
int keyboard_octave;
- pitch_accidental_t keyboard_accidental;
int midi_fd;
snd_midi_event_t *snd_midi_event;
{
scherzo_t *scherzo = user_data;
int octave;
- /* Initialize to keep the compiler quiet. */
- pitch_name_t pitch_name = PITCH_NATURAL (C, 0);
- pitch_t pitch;
+ pitch_t pitch = PITCH_NOT_A_PITCH;
if (scherzo->challenge.active)
octave = PITCH_OCTAVE (scherzo->challenge.pitch);
gtk_widget_queue_draw (widget);
return TRUE;
break;
- case GDK_KEY_q:
- case GDK_KEY_Q:
case GDK_KEY_Escape:
gtk_main_quit ();
return FALSE;
- case GDK_KEY_c:
- case GDK_KEY_C:
- pitch_name = PITCH_NAME_C;
+ /* Map a piano keyboard onto the computer keyboard with white keys
+ * along the home row, (piano C on computer A, up to next octave
+ * higher C on computer K). Black keys are in the expected
+ * positions, (C# is W, D# is E, etc.).
+ */
+ case GDK_KEY_a:
+ case GDK_KEY_A:
+ pitch = PITCH_LITERAL (C, NATURAL, octave);
+ break;
+ case GDK_KEY_s:
+ case GDK_KEY_S:
+ pitch = PITCH_LITERAL (D, NATURAL, octave);
break;
case GDK_KEY_d:
case GDK_KEY_D:
- pitch_name = PITCH_NAME_D;
- break;
- case GDK_KEY_e:
- case GDK_KEY_E:
- pitch_name = PITCH_NAME_E;
+ pitch = PITCH_LITERAL (E, NATURAL, octave);
break;
case GDK_KEY_f:
case GDK_KEY_F:
- pitch_name = PITCH_NAME_F;
+ pitch = PITCH_LITERAL (F, NATURAL, octave);
break;
case GDK_KEY_g:
case GDK_KEY_G:
- pitch_name = PITCH_NAME_G;
+ pitch = PITCH_LITERAL (G, NATURAL, octave);
break;
- case GDK_KEY_a:
- case GDK_KEY_A:
- pitch_name = PITCH_NAME_A;
+ case GDK_KEY_h:
+ case GDK_KEY_H:
+ pitch = PITCH_LITERAL (A, NATURAL, octave);
break;
- case GDK_KEY_b:
- case GDK_KEY_B:
- pitch_name = PITCH_NAME_B;
+ case GDK_KEY_j:
+ case GDK_KEY_J:
+ pitch = PITCH_LITERAL (B, NATURAL, octave);
+ break;
+ case GDK_KEY_k:
+ case GDK_KEY_K:
+ pitch = PITCH_LITERAL (C, NATURAL, octave + 1);
+ break;
+ case GDK_KEY_l:
+ case GDK_KEY_L:
+ pitch = PITCH_LITERAL (D, NATURAL, octave + 1);
+ break;
+ case GDK_KEY_semicolon:
+ case GDK_KEY_colon:
+ pitch = PITCH_LITERAL (E, NATURAL, octave + 1);
+ break;
+ case GDK_KEY_apostrophe:
+ case GDK_KEY_quotedbl:
+ pitch = PITCH_LITERAL (F, NATURAL, octave + 1);
+ break;
+ case GDK_KEY_w:
+ case GDK_KEY_W:
+ pitch = PITCH_LITERAL (C, SHARP, octave);
+ break;
+ case GDK_KEY_e:
+ case GDK_KEY_E:
+ pitch = PITCH_LITERAL (D, SHARP, octave);
+ break;
+ case GDK_KEY_t:
+ case GDK_KEY_T:
+ pitch = PITCH_LITERAL (F, SHARP, octave);
+ break;
+ case GDK_KEY_y:
+ case GDK_KEY_Y:
+ pitch = PITCH_LITERAL (G, SHARP, octave);
+ break;
+ case GDK_KEY_u:
+ case GDK_KEY_U:
+ pitch = PITCH_LITERAL (A, SHARP, octave);
+ break;
+ case GDK_KEY_o:
+ case GDK_KEY_O:
+ pitch = PITCH_LITERAL (C, SHARP, octave + 1);
+ break;
+ case GDK_KEY_p:
+ case GDK_KEY_P:
+ pitch = PITCH_LITERAL (D, SHARP, octave + 1);
+ break;
+ case GDK_KEY_bracketright:
+ case GDK_KEY_braceright:
+ pitch = PITCH_LITERAL (F, SHARP, octave + 1);
break;
case GDK_KEY_0:
case GDK_KEY_1:
case GDK_KEY_space:
scherzo_press_pedal (scherzo);
break;
- case GDK_KEY_Up:
- if (scherzo->keyboard_accidental < PITCH_ACCIDENTAL_DOUBLE_SHARP)
- scherzo->keyboard_accidental++;
- break;
- case GDK_KEY_Down:
- if (scherzo->keyboard_accidental > PITCH_ACCIDENTAL_DOUBLE_FLAT)
- scherzo->keyboard_accidental--;
- break;
}
- pitch = PITCH (pitch_name, scherzo->keyboard_accidental, octave);
-
- if ((key->keyval >= GDK_KEY_A && key->keyval <= GDK_KEY_G) ||
- (key->keyval >= GDK_KEY_a && key->keyval <= GDK_KEY_g))
+ if (pitch != PITCH_NOT_A_PITCH)
{
scherzo_press_note (scherzo, pitch);
_judge_pitch (scherzo, pitch);
{
scherzo_t *scherzo = user_data;
int octave;
- /* Initialize to keep the compiler quiet. */
- pitch_name_t pitch_name = PITCH_NAME_C;
- pitch_t pitch;
+ pitch_t pitch = PITCH_NOT_A_PITCH;
if (scherzo->challenge.active)
octave = PITCH_OCTAVE (scherzo->challenge.pitch);
octave = scherzo->keyboard_octave;
switch (key->keyval) {
- case GDK_KEY_c:
- case GDK_KEY_C:
- pitch_name = PITCH_NAME_C;
+ case GDK_KEY_a:
+ case GDK_KEY_A:
+ pitch = PITCH_LITERAL (C, NATURAL, octave);
+ break;
+ case GDK_KEY_s:
+ case GDK_KEY_S:
+ pitch = PITCH_LITERAL (D, NATURAL, octave);
break;
case GDK_KEY_d:
case GDK_KEY_D:
- pitch_name = PITCH_NAME_D;
- break;
- case GDK_KEY_e:
- case GDK_KEY_E:
- pitch_name = PITCH_NAME_E;
+ pitch = PITCH_LITERAL (E, NATURAL, octave);
break;
case GDK_KEY_f:
case GDK_KEY_F:
- pitch_name = PITCH_NAME_F;
+ pitch = PITCH_LITERAL (F, NATURAL, octave);
break;
case GDK_KEY_g:
case GDK_KEY_G:
- pitch_name = PITCH_NAME_G;
+ pitch = PITCH_LITERAL (G, NATURAL, octave);
break;
- case GDK_KEY_a:
- case GDK_KEY_A:
- pitch_name = PITCH_NAME_A;
+ case GDK_KEY_h:
+ case GDK_KEY_H:
+ pitch = PITCH_LITERAL (A, NATURAL, octave);
break;
- case GDK_KEY_b:
- case GDK_KEY_B:
- pitch_name = PITCH_NAME_B;
+ case GDK_KEY_j:
+ case GDK_KEY_J:
+ pitch = PITCH_LITERAL (B, NATURAL, octave);
+ break;
+ case GDK_KEY_k:
+ case GDK_KEY_K:
+ pitch = PITCH_LITERAL (C, NATURAL, octave + 1);
+ break;
+ case GDK_KEY_l:
+ case GDK_KEY_L:
+ pitch = PITCH_LITERAL (D, NATURAL, octave + 1);
+ break;
+ case GDK_KEY_semicolon:
+ case GDK_KEY_colon:
+ pitch = PITCH_LITERAL (E, NATURAL, octave + 1);
+ break;
+ case GDK_KEY_apostrophe:
+ case GDK_KEY_quotedbl:
+ pitch = PITCH_LITERAL (F, NATURAL, octave + 1);
+ break;
+ case GDK_KEY_w:
+ case GDK_KEY_W:
+ pitch = PITCH_LITERAL (C, SHARP, octave);
+ break;
+ case GDK_KEY_e:
+ case GDK_KEY_E:
+ pitch = PITCH_LITERAL (D, SHARP, octave);
+ break;
+ case GDK_KEY_t:
+ case GDK_KEY_T:
+ pitch = PITCH_LITERAL (F, SHARP, octave);
+ break;
+ case GDK_KEY_y:
+ case GDK_KEY_Y:
+ pitch = PITCH_LITERAL (G, SHARP, octave);
+ break;
+ case GDK_KEY_u:
+ case GDK_KEY_U:
+ pitch = PITCH_LITERAL (A, SHARP, octave);
+ break;
+ case GDK_KEY_o:
+ case GDK_KEY_O:
+ pitch = PITCH_LITERAL (C, SHARP, octave + 1);
+ break;
+ case GDK_KEY_p:
+ case GDK_KEY_P:
+ pitch = PITCH_LITERAL (D, SHARP, octave + 1);
+ break;
+ case GDK_KEY_bracketright:
+ case GDK_KEY_braceright:
+ pitch = PITCH_LITERAL (F, SHARP, octave + 1);
break;
case GDK_KEY_space:
scherzo_release_pedal (scherzo);
break;
}
- pitch = PITCH (pitch_name, scherzo->keyboard_accidental, octave);
-
- if ((key->keyval >= GDK_KEY_A && key->keyval <= GDK_KEY_G) ||
- (key->keyval >= GDK_KEY_a && key->keyval <= GDK_KEY_g))
+ if (pitch != PITCH_NOT_A_PITCH)
{
scherzo_release_note (scherzo, pitch);
_score_challenge (scherzo);
scherzo.chord = NULL;
- /* Default to octave 4 and natural for computer keyboard keypresses. */
+ /* Default to octave 4 for computer keyboard keypresses. */
scherzo.keyboard_octave = 4;
- scherzo.keyboard_accidental = PITCH_ACCIDENTAL_NATURAL;
pitch_group_init (scherzo.ctx, &scherzo.notes_pressed);
pitch_group_init (scherzo.ctx, &scherzo.notes_pedaled);