cairo_paint (cr);
/* Add some padding on the sides and top */
- cairo_translate (cr, pad, 2 * scherzo->staff_height);
+ cairo_translate (cr, pad, scherzo->staff_height);
score_set_staff_height (score, scherzo->staff_height);
score_set_width (score, widget_width - 2 * pad);
_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,
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,
char *s;
if (challenge->note) {
- score_staff_remove_note (challenge->staff, challenge->note);
+ score_remove_note (challenge->note);
challenge->note = NULL;
}
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;
}
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);
next, remaining, &event);
remaining -= consumed;
+ next += consumed;
switch (event.type) {
case SND_SEQ_EVENT_NONE:
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. */
break;
}
}
-
+
+ if (need_redraw)
+ gtk_widget_queue_draw (scherzo->window);
+
/* Return TRUE to continue to get called in the future. */
return TRUE;
}