X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=scherzo.c;h=0ff68d125d17e072ff911ac28a351c36244f3b52;hb=4000561216687a173abf597a0fd26d2c336954fc;hp=c285891f0a43d00167f4beb5d164189c227ccfa5;hpb=16d07286a5344861bd26ad97e97612d3806d1da7;p=scherzo diff --git a/scherzo.c b/scherzo.c index c285891..0ff68d1 100644 --- a/scherzo.c +++ b/scherzo.c @@ -194,7 +194,7 @@ scherzo_add_note_midi (scherzo_t *scherzo, unsigned char midi_note) _midi_to_score_pitch_and_octave (midi_note, &pitch, &octave); - note = score_staff_add_note (staff, pitch, octave, SCORE_DURATION_WHOLE); + note = score_add_note (staff, pitch, octave, SCORE_DURATION_WHOLE); scherzo->num_notes_pressed++; scherzo->notes_pressed = talloc_realloc (scherzo->ctx, @@ -214,20 +214,17 @@ scherzo_add_note_midi (scherzo_t *scherzo, unsigned char midi_note) static void scherzo_remove_note_midi (scherzo_t *scherzo, unsigned char midi_note) { - score_staff_t *staff; score_pitch_t pitch; int octave; score_note_t *note; int i; - staff = scherzo->challenge.staff; - _midi_to_score_pitch_and_octave (midi_note, &pitch, &octave); for (i = 0; i < scherzo->num_notes_pressed; i++) { note = scherzo->notes_pressed[i]; if (note->pitch == pitch && note->octave == octave) { - score_staff_remove_note (staff, note); + score_remove_note (note); if (i < scherzo->num_notes_pressed - 1) { memmove (scherzo->notes_pressed + i, scherzo->notes_pressed + i + 1, @@ -251,7 +248,7 @@ _select_challenge (scherzo_t *scherzo) char *s; if (challenge->note) { - score_staff_remove_note (challenge->staff, challenge->note); + score_remove_note (challenge->note); challenge->note = NULL; } @@ -312,8 +309,8 @@ _select_challenge (scherzo_t *scherzo) octave = *s - '0'; - challenge->note = score_staff_add_note (challenge->staff, pitch, octave, - SCORE_DURATION_WHOLE); + challenge->note = score_add_note (challenge->staff, pitch, octave, + SCORE_DURATION_WHOLE); challenge->satisfied = 0; challenge->mistaken = 0; } @@ -361,6 +358,7 @@ on_midi_input (unused (GIOChannel *channel), ssize_t remaining; snd_seq_event_t event; score_note_t *note; + int need_redraw = FALSE; remaining = read (scherzo->midi_fd, buf, MIDI_BUF_SIZE); @@ -372,6 +370,7 @@ on_midi_input (unused (GIOChannel *channel), next, remaining, &event); remaining -= consumed; + next += consumed; switch (event.type) { case SND_SEQ_EVENT_NONE: @@ -380,12 +379,12 @@ on_midi_input (unused (GIOChannel *channel), case SND_SEQ_EVENT_NOTEON: note = scherzo_add_note_midi (scherzo, event.data.note.note); _judge_note (scherzo, note); - gtk_widget_queue_draw (scherzo->window); + need_redraw = TRUE; break; case SND_SEQ_EVENT_NOTEOFF: scherzo_remove_note_midi (scherzo, event.data.note.note); _score_challenge (scherzo); - gtk_widget_queue_draw (scherzo->window); + need_redraw = TRUE; break; case SND_SEQ_EVENT_CLOCK: /* Ignore for now as my piano sends a constant stream of these. */ @@ -399,7 +398,10 @@ on_midi_input (unused (GIOChannel *channel), break; } } - + + if (need_redraw) + gtk_widget_queue_draw (scherzo->window); + /* Return TRUE to continue to get called in the future. */ return TRUE; }