2009/5/15 Marc Hohl <m...@hohlart.de>: > I still don't get it - when I use extra-dy = 0, I get glissando lines > parallel to the staff lines, > so a value of zero can't be right. I have attached the pdf output, the > upmost tab lie is the > standard behaviour, the middle line is extra-dy = 0, and the lowest line is > the one with my > calculated value for extra-dy.
Hmm, I don't seem to be doing a very good job of explaining it. :) > As I can see, a value of 0 is definitely wrong here, so it seems that a > normal score and a tab score > handle extra-dy differently. Exactly: as I mentioned earlier in the thread, in engraver-init.ly there's a setting for 'extra-dy in the context definition for TabVoice, whereas there's no setting for normal glissandos. If you have a look at line-spanner.cc you'll find the code which reads 'extra-dy: it uses robust_scm2double () to ensure a sane value is returned (0 in this case) if the property isn't set. To recap, the current behaviour for glissandos is as follows: 1. If a glissando is in a Voice context other than TabVoice, 'extra-dy = #0 unless overridden by the user. 2. In a TabVoice, 'extra-dy = #0.75 for all glissandos, even if they're between notes at different staff-positions. For a TabVoice glissando, we want 'extra-dy to be 0.75/-0.75 for notes at the same staff-position, depending on the change in pitch; otherwise 'extra-dy should be 0, since we don't need to add any extra slope to glissandos between notes at different staff-positions (or do we... see below ;) > (if (and (= left-staff-position right-staff-position) > (< (ly:pitch-semitones right-pitch) (ly:pitch-semitones > left-pitch))) > -0.75 > 0.75 ))) This code can't distinguish between (equal staff-positions & right-pitch > left-pitch) and (different staff-positions), so will return 0.75 for both situations. Here's a version of the callback which will only apply 'extra-dy if the staff-positions are equal: #(define (glissando::calc-tab-extra-dy grob) (let* ((original (ly:grob-original grob)) (left-bound (ly:spanner-bound original LEFT)) (right-bound (ly:spanner-bound original RIGHT)) (left-pitch (ly:event-property (event-cause left-bound) 'pitch)) (right-pitch (ly:event-property (event-cause right-bound) 'pitch)) (left-staff-position (ly:grob-property left-bound 'staff-position)) (right-staff-position (ly:grob-property right-bound 'staff-position)) (extra-dy (if (= left-staff-position right-staff-position) (if (< (ly:pitch-semitones right-pitch) (ly:pitch-semitones left-pitch)) -0.75 0.75) ;; not on same staff-position -> no extra-dy 0))) extra-dy)) Of course, you might prefer to apply 'extra-dy in all cases, since the above places the glissando start and end points on staff-lines (see attached image). :) Regards, Neil
\version "2.12.2" \paper { indent = 0 ragged-right = ##f } #(define (glissando::calc-tab-extra-dy grob) (let* ((original (ly:grob-original grob)) (left-bound (ly:spanner-bound original LEFT)) (right-bound (ly:spanner-bound original RIGHT)) (left-pitch (ly:event-property (event-cause left-bound) 'pitch)) (right-pitch (ly:event-property (event-cause right-bound) 'pitch)) (left-staff-position (ly:grob-property left-bound 'staff-position)) (right-staff-position (ly:grob-property right-bound 'staff-position))) (if (and (= left-staff-position right-staff-position) (< (ly:pitch-semitones right-pitch) (ly:pitch-semitones left-pitch))) -0.75 0.75))) #(define (extra-dy-test-a grob) (let* ((original (ly:grob-original grob)) (left-bound (ly:spanner-bound original LEFT)) (right-bound (ly:spanner-bound original RIGHT)) (left-pitch (ly:event-property (event-cause left-bound) 'pitch)) (right-pitch (ly:event-property (event-cause right-bound) 'pitch)) (left-staff-position (ly:grob-property left-bound 'staff-position)) (right-staff-position (ly:grob-property right-bound 'staff-position))) (if (= left-staff-position right-staff-position) (if (< (ly:pitch-semitones right-pitch) (ly:pitch-semitones left-pitch)) -0.75 0.75) ;; not on same staff-position -> no extra-dy 0))) #(define (extra-dy-test-b grob) (let* ((original (ly:grob-original grob)) (left-bound (ly:spanner-bound original LEFT)) (right-bound (ly:spanner-bound original RIGHT)) (left-pitch (ly:event-property (event-cause left-bound) 'pitch)) (right-pitch (ly:event-property (event-cause right-bound) 'pitch)) (left-staff-position (ly:grob-property left-bound 'staff-position)) (right-staff-position (ly:grob-property right-bound 'staff-position))) ;; apply extra-dy for all glissandos (if (< (ly:pitch-semitones right-pitch) (ly:pitch-semitones left-pitch)) -0.75 0.75))) tabs = \relative c { \set TabStaff.minimumFret = #2 c'4 \glissando d \glissando e, \glissando f \bar "|." } \score { << \new TabStaff { \clef "tab" \override Glissando #'extra-dy = #glissando::calc-tab-extra-dy \tabs } \new TabStaff { \clef "tab" \override Glissando #'extra-dy = #extra-dy-test-a \tabs } \new TabStaff { \clef "tab" \override Glissando #'extra-dy = #extra-dy-test-b \tabs } >> }
tabgliss.pdf
Description: Adobe PDF document
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org http://lists.gnu.org/mailman/listinfo/lilypond-user