From e2f58ec825991f245bae430875f9d78f96625069 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Fri, 17 Sep 2004 22:32:13 +0000 Subject: [PATCH] * input/regression/accidental-piano.ly (Module): new file. * lily/lily-guile.cc (LY_DEFINE): ly_assoc_get: new function. --- ChangeLog | 6 ++ input/regression/accidental-piano.ly | 20 ++++++ lily/accidental-engraver.cc | 94 ++++++++++++++++++---------- lily/include/lily-guile.hh | 1 + lily/lily-guile.cc | 17 +++++ scm/lily.scm | 7 +-- 6 files changed, 106 insertions(+), 39 deletions(-) create mode 100644 input/regression/accidental-piano.ly diff --git a/ChangeLog b/ChangeLog index 341576c10a..46d2249c34 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2004-09-18 Han-Wen Nienhuys + + * input/regression/accidental-piano.ly (Module): new file. + + * lily/lily-guile.cc (LY_DEFINE): ly_assoc_get: new function. + 2004-09-17 Han-Wen Nienhuys * lily/slur-scoring.cc (score_extra_encompass): widen X extent of diff --git a/input/regression/accidental-piano.ly b/input/regression/accidental-piano.ly new file mode 100644 index 0000000000..864e484381 --- /dev/null +++ b/input/regression/accidental-piano.ly @@ -0,0 +1,20 @@ +\header { + + texidoc = "In piano accidental style, notes in both staves +influence each other. In this example, each note should have an +accidental." + +} + +\version "2.3.17" + +\paper +{ + raggedright = ##t +} + +\new PianoStaff \relative << + #(set-accidental-style 'piano) + \new Staff { ges'4 ges4 } + \new Staff { r8 gis r8 gis } + >> diff --git a/lily/accidental-engraver.cc b/lily/accidental-engraver.cc index d4bfad593d..83355e868b 100644 --- a/lily/accidental-engraver.cc +++ b/lily/accidental-engraver.cc @@ -140,59 +140,87 @@ Accidental_engraver::initialize () * Then check the global signature (only step). Return number of accidentals (0, 1 or 2). */ + +static bool +recent_enough (int bar_number, SCM alteration_def, SCM laziness) +{ + if (scm_is_number (alteration_def)) + return true; + + return (bar_number <= scm_to_int (ly_cdr (alteration_def)) + scm_to_int (laziness)); +} + +static int +extract_alteration (SCM alteration_def) +{ + if (scm_is_number (alteration_def)) + return scm_to_int (alteration_def); + else if (ly_c_pair_p (alteration_def)) + return scm_to_int (ly_car (alteration_def)); + else if (alteration_def == SCM_BOOL_F) + return 0; + else + assert (0); + return 0; +} + static int number_accidentals_from_sig (bool *different, SCM sig, Pitch *pitch, - int curbarnum, SCM laziness, bool ignore_octave) + int bar_number, SCM laziness, bool ignore_octave) { int n = pitch->get_notename (); int o = pitch->get_octave (); - int a = pitch->get_alteration (); - SCM prev_alt = SCM_BOOL_F; + SCM previous_alteration = SCM_BOOL_F; - if (!ignore_octave) - { - SCM prev_local - = scm_assoc (scm_cons (scm_int2num (o), scm_int2num (n)), sig); - - if (ly_c_pair_p (prev_local)) - { - if (ly_c_pair_p (ly_cdr (prev_local)) - && scm_is_number (laziness)) - { - int barnum = scm_to_int (ly_cddr (prev_local)); - prev_local = scm_cons (ly_car (prev_local), ly_cadr (prev_local)); - if (curbarnum <= barnum + scm_to_int (laziness)) - prev_alt = prev_local; - } - } + SCM from_same_octave = ly_assoc_get (scm_cons (scm_int2num (o), + scm_int2num (n)), sig, SCM_BOOL_F); + SCM from_key_signature = ly_assoc_get (scm_int2num (n), sig, SCM_BOOL_F); + SCM from_other_octaves = SCM_BOOL_F; + for (SCM s = sig ; ly_c_pair_p (s); s = ly_cdr (s)) + { + SCM entry = ly_car (s); + if (ly_c_pair_p (ly_car (entry)) + && ly_cdar (entry) == scm_int2num (n)) + from_other_octaves = ly_cdr (entry); } + - if (prev_alt == SCM_BOOL_F) - prev_alt = scm_assoc (scm_int2num (n), sig); - - prev_alt = (prev_alt == SCM_BOOL_F) ? scm_int2num (0) : ly_cdr (prev_alt); - + if (from_same_octave != SCM_BOOL_F + && recent_enough (bar_number, from_same_octave, laziness)) + { + previous_alteration = from_same_octave; + } + else if (ignore_octave + && from_other_octaves != SCM_BOOL_F + && recent_enough (bar_number, from_other_octaves, laziness)) + { + previous_alteration = from_other_octaves; + } + else if (from_key_signature != SCM_BOOL_F) + { + previous_alteration = from_key_signature; + } + /* UGH. prev_acc can be #t in case of ties. What is this for? */ - int p = scm_is_number (prev_alt) ? scm_to_int (prev_alt) : 0; - int num; - if (a == p && scm_is_number (prev_alt)) + int prev = extract_alteration (previous_alteration); + int alter = pitch->get_alteration (); + int num = 1; + if (alter == prev) num = 0; - else if ( (abs (a) ly_scm2realdrul (SCM); Slice int_list_to_slice (SCM l); diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index 2bc7c4e2e1..019a87bc5c 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -265,6 +265,22 @@ is_direction (SCM s) return false; } +LY_DEFINE(ly_assoc_get, "ly:assoc-get", + 2, 1, 0, + (SCM key, SCM alist, SCM default_value), + "Return value if KEY in ALIST, else DEFAULT-VALUE (or #f if not specified).") +{ + SCM handle = scm_assoc (key, alist); + + if (default_value == SCM_UNDEFINED) + default_value = SCM_BOOL_F; + + if (ly_c_pair_p (handle)) + return ly_cdr (handle); + else + return default_value; +} + bool is_axis (SCM s) { @@ -822,3 +838,4 @@ LY_DEFINE (ly_gettext, "ly:gettext", __FUNCTION__, "string"); return scm_makfrom0str (gettext (scm_i_string_chars (string))); } + diff --git a/scm/lily.scm b/scm/lily.scm index 9e47a9208f..84da44a6a7 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -134,12 +134,7 @@ ;;;;;;;;;;;;;;;; ; alist -(define-public (assoc-get key alist . default) - "Return value if KEY in ALIST, else DEFAULT (or #f if not specified)." - (let ((entry (assoc key alist))) - (if (pair? entry) - (cdr entry) - (if (pair? default) (car default) #f)))) +(define-public assoc-get ly:assoc-get) (define-public (uniqued-alist alist acc) (if (null? alist) acc -- 2.39.5