int num_staves;
};
-typedef struct score_note
-{
- score_pitch_t pitch;
- int octave;
- score_duration_t duration;
-} score_note_t;
-
score_t *
score_create (void *ctx)
{
{
double line;
cairo_glyph_t note_glyph;
+ static double extend_factor = 0.25;
+
+ void _draw_ledger_line (double line, double width) {
+ cairo_move_to (cr,
+ - width * extend_factor / 2.0,
+ score->space_height * line + score->line_width / 2.0);
+ cairo_rel_line_to (cr, (1 + extend_factor) * width, 0);
+ cairo_stroke (cr);
+ }
cairo_save (cr);
}
note_glyph.x = 0;
- note_glyph.y = score->space_height * line + score->line_width / 2.0;
+ note_glyph.y = score->space_height * line;
+
+ if (line < 0 || line > 4) {
+ int i;
+ cairo_text_extents_t note_extents;
+
+ cairo_glyph_extents (cr, ¬e_glyph, 1, ¬e_extents);
+
+ if (line < 0) {
+ for (i = -1; i >= line; i--)
+ _draw_ledger_line (i, note_extents.width);
+ } else {
+ for (i = 5; i <= line; i++)
+ _draw_ledger_line (i, note_extents.width);
+ }
+ }
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */
cairo_show_glyphs (cr, ¬e_glyph, 1);
}
score_note_t *
-score_staff_add_note (score_staff_t *staff,
- score_pitch_t pitch,
- int octave,
- score_duration_t duration)
+score_add_note (score_staff_t *staff,
+ score_pitch_t pitch,
+ int octave,
+ score_duration_t duration)
{
score_note_t *note;
if (note == NULL)
return NULL;
+ note->staff = staff;
note->pitch = pitch;
note->octave = octave;
note->duration = duration;
}
void
-score_staff_remove_note (score_staff_t *staff, score_note_t *note)
+score_remove_note (score_note_t *note)
{
+ score_staff_t *staff = note->staff;
int i;
for (i = 0; i < staff->num_notes; i++)