lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: tuplet numbers on kneed beams - David's function stopped working


From: David Kastrup
Subject: Re: tuplet numbers on kneed beams - David's function stopped working
Date: Tue, 16 Oct 2012 14:20:30 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.2.50 (gnu/linux)

Thomas Morley <address@hidden> writes:

> 2012/10/16 David Nalesnik <address@hidden>:
>> Hi Janek,
>>
>>>> David Nalesnik's function correcting tuplet number placement on kneed
>>>> beams throws an error with Lilypond 2.17.5 (it works with 2.16.0):
>>>>
>>>> Drawing systems.../home/janek/desk/tuplet_numers_on_kneed_beams.ily:44:26:
>>>> In procedure * in expression (* 0.5 (ly:grob-property beam #)):
>>>> /home/janek/desk/tuplet_numers_on_kneed_beams.ily:44:26: Wrong type: ()
>>>>
>>>> line 44 reads:
>>>> (beam-gap (* 0.5 (ly:grob-property beam 'gap)))
>>
>>
>> Checking the Internals Reference, it looks like 'gap has been renamed
>> 'beam-gap, so changing that line should fix the problem.
>>
>> -David
>
> Hi David,
>
> 'beam-gap is now a pair.
> So I'm not sure if it should be
> (car (ly:grob-property grob 'beam-gap))
> or
> (interval-length (ly:grob-property grob 'beam-gap))
>
> Currently I haven't found a proper documentation:
>
> git grep beam-gap
>
> Documentation/misc/CHANGES-1.3:beams on whole notes.  'beam-gap' had
> been rename
> Documentation/misc/ChangeLog-2.1:       lines for falling into beam-gap.
> lily/beam.cc: Interval gap_lengths = robust_scm2interval
> (me->get_property ("be
> lily/beam.cc:               "beam-gap "
> scm/define-grob-properties.scm:     (beam-gap ,number-pair? "Size of a gap in 
> a
> scm/define-grobs.scm:   (beam-gap . ,ly:beam::calc-beam-gap)
>
>

> * Chord tremolo fixes: shift beams vertically on whole notes.  Center
> beams on whole notes.  'beam-gap' had been renamed to 'gap', but only
> for reading.
>
> I'm investigating further.

commit d8dfa746ead381a80901106b9c9b079dc9b5d004
Author: Mike Solomon <address@hidden>
Date:   Fri Aug 31 09:27:17 2012 +0200

    Uses a heuristic to determine if chord tremolos collide with accidentals.
    
    This heuristic makes several assumptions about when a chord tremolo
    will collide with accidentals. It must be between whole notes, it
    must be in the staff, and it must be an ascending major third or lower.
    The heuristic is entirely contained in Beam::whole_note_close_chord_tremolo,
    which should be modified if other cases involving chord tremolos arise.


I just love it when only loosely related API and functionality changes
are sneaked in with other stuff.

The only documentation is

+     (beam-gap ,number-pair? "Size of a gap in a @code{Beam}.")

without any explanation of why a size would be a number _pair_.

The whole commit contains two comment lines among several hundred lines
of code.  One is the following:

+//------ for whole note chord tremolos
+
+bool
+Beam::whole_note_close_chord_tremolo (Grob *me)
+{
+  if (!scm_is_integer (me->get_property ("gap-count")))
+    return false;
+
+  extract_grob_set (me, "stems", stems);
+  for (vsize i = 0; i < stems.size (); i++)
+    if (Stem::duration_log (stems[i]))
+      return false;
+
+  Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
+  if (staff)
+    {
+      Grob *outside_stems[2] = {Stem::extremal_heads (stems[0])[DOWN],
+                                Stem::extremal_heads (stems.back ())[DOWN]};
+
+      Interval lines = Staff_symbol::line_span (staff);
+      for (int i = 0; i < 2; i++)
+        {
+          Real my_pos = Staff_symbol_referencer::get_position 
(outside_stems[i]);
+          if (my_pos > lines[UP] + 1)
+            return false;
+          else if (my_pos < lines[DOWN] - 1)
+            return false;
+        }
+    }
+
+  return (Staff_symbol_referencer::get_position (Stem::extremal_heads 
(stems.back ())[DOWN])
+          - Staff_symbol_referencer::get_position (Stem::extremal_heads 
(stems[0])[DOWN]))
+         < 2;
+}

Which obviously fully and exhaustively explains what the function is
supposed to be doing, how it fits with the rest of the code, what the
rationale for writing it was, and what and how it does this based on
what assumptions.

Of course, the change of the beam API is mentioned nowhere.  Not even in
the commit message.

-- 
David Kastrup



reply via email to

[Prev in Thread] Current Thread [Next in Thread]