Re: [tablatures] bend.ly - please test and comment |
[ Thread Index |
Date Index
| More lilynet.net/tablatures Archives
]
- To: tablatures@xxxxxxxxxxx
- Subject: Re: [tablatures] bend.ly - please test and comment
- From: Marc Hohl <marc@xxxxxxxxxx>
- Date: Thu, 20 Aug 2009 08:22:27 +0200
- Dkim-signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1250749349; l=16718; s=domk; d=hohlart.de; h=Content-Type:In-Reply-To:References:Subject:To:MIME-Version:From: Date:X-RZG-CLASS-ID:X-RZG-AUTH; bh=abB+i8I39GUzAPLr1BrDBsMsr4Q=; b=rv4H/atMILxosT8ADjTq7TDu61DUVHfQFtP4D8wnbNo/IbDub6uiwQtXsxL0gJrZXTR T95hq/kQveC7rge4RfYdSz1qPlWnCOIdBEQgyJw28DIrOfUuLAQv3v1mdIjUAeUIavp7S a9A8iJJvmVzwrBkptBzgxApuwdUn0Eq204I=
Federico Bruni schrieb:
Hi Marc,
thanks for your answer
Marc Hohl wrote:
[...]
Interpreting music...
warning: type check for `stringTunings' failed; value
`#<unspecified>' must be of type `list'
This error comes from the missing definition for seven strings...
[8][16]
Preprocessing graphical objects...
Interpreting music...
Interpreting music...
Preprocessing graphical objects...
MIDI output to `bend-test.midi'...
Solving 1 page-breaking chunks...[1: 1 pages]
Drawing
systems.../home/fede/lilypond/usr/share/lilypond/current/ly/bend.ly:244:57:
In expression (parenthesize-tab-note-head grob):
/home/fede/lilypond/usr/share/lilypond/current/ly/bend.ly:244:57:
Unbound variable: parenthesize-tab-note-head
Sorry, this is a little bug in tablature.ly; please search the line
where you can find
#(define (parenthesize-tab-note-head grob)
and change it to
#(define-public (parenthesize-tab-note-head grob)
Then (hopefully) everything will be ok.
I can't find this line in my tablature.ly
Could you please send me your tablature.ly?
Yes, here you are.
Marc
%%%% tablature.ly
%%%%
%%%% source file of the GNU LilyPond music typesetter
%%%%
%%%% (c) 2009 Marc Hohl <marc@xxxxxxxxxx>
% some publications use the triangle-shaped note head
% for palm mute, so here we go:
palmMuteOn = {
\override NoteHead #'style = #'do
}
palmMuteOff = {
\revert NoteHead #'style
}
% for single notes (even in chord constructs <...>),
% or grouped notes in {...}
palmMute =
#(define-music-function (parser location note) (ly:music?)
;; are we inside a <...>?
(if (eq? (ly:music-property note 'name) 'NoteEvent)
;; yes -> add a tweak
(begin (set! (ly:music-property note 'tweaks)
(acons 'style 'do (ly:music-property note 'tweaks)))
note)
;; no -> use predefined commands to switch to triangle-shaped note heads
#{
\palmMuteOn
$note
\palmMuteOff
#}))
% dead notes are marked with a cross-shape note head,
% both in normal notation and in tablature:
deadNotesOn = {
\override TabNoteHead #'style = #'cross
\override NoteHead #'style = #'cross
}
deadNotesOff = {
\revert TabNoteHead #'style
\revert NoteHead #'style
}
% for single notes (even in chord constructs <...>),
% or grouped notes in {...}
deadNote =
#(define-music-function (parser location note) (ly:music?)
;; are we inside a <...>?
(if (eq? (ly:music-property note 'name) 'NoteEvent)
;; yes -> add a tweak
(begin (set! (ly:music-property note 'tweaks)
(acons 'style 'cross (ly:music-property note 'tweaks)))
note)
;; no -> use predefined commmands for changing
;; note head and tablature fret signs
#{
\deadNotesOn
$note
\deadNotesOff
#}))
% for more control over glyph-name calculations,
% use custom callback with tab noteheads which will ignore
% 'style = 'do
#(define-public (tab-note-head::calc-glyph-name grob)
(let ((style (ly:grob-property grob 'style)))
(case style
((cross) "2cross"))))
% ensure we only call notehead callback when
% 'style = 'cross
#(define-public (tab-note-head::whiteout-if-style-set grob)
(let ((style (ly:grob-property grob 'style)))
(if (and (symbol? style)
(eq? style 'cross))
(stencil-whiteout (ly:note-head::print grob))
(ly:text-interface::print grob))))
% definitions for the "moderntab" clef:
% the "moderntab" clef will be added to the list of known clefs,
% so it can be used as any other clef:
%
% \clef "moderntab"
%
#(add-new-clef "moderntab" "markup.moderntab" 0 0 0)
% this function decides which clef to take
#(define-public (clef::print-modern-tab-if-set grob)
(let ((glyph (ly:grob-property grob 'glyph)))
;; which clef is wanted?
(if (string=? glyph "markup.moderntab")
;; if it is "moderntab", we'll draw it
(let* ((staff-symbol (ly:grob-object grob 'staff-symbol))
(line-count (ly:grob-property staff-symbol 'line-count))
(staff-space (ly:grob-property staff-symbol 'staff-space 1)))
(grob-interpret-markup grob (make-customTabClef-markup line-count staff-space)))
;; otherwise, we simply use the default printing routine
(ly:clef::print grob))))
% define sans serif-style tab-Clefs as a markup:
#(define-markup-command (customTabClef layout props num-strings staff-space) (integer? number?)
(define (square x) (* x x))
(let* ((scale-factor (/ staff-space 1.5))
(font-size (- (* num-strings 1.5 scale-factor) 7))
(base-skip (* (square (+ (* num-strings 0.195) 0.4)) scale-factor)))
(interpret-markup layout props
(markup #:vcenter #:bold
#:override (cons 'font-family 'sans)
#:fontsize font-size
#:override (cons 'baseline-skip base-skip)
#:left-align #:center-column ("T" "A" "B")))))
% if the stems are drawn, it is nice to have a double stem for
% (dotted) half notes to distinguish them from quarter notes:
#(define-public (tabvoice::draw-double-stem-for-half-notes grob)
(let ((stem (ly:stem::print grob)))
;; is the note a (dotted) half note?
(if (= 1 (ly:grob-property grob 'duration-log))
;; yes -> draw double stem
(ly:stencil-combine-at-edge stem X RIGHT stem 0.5)
;; no -> draw simple stem
stem)))
% as default, the glissando line between fret numbers goes
% upwards, here we have a function to correct this behavior:
#(define-public (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)))
(if (< (ly:pitch-semitones right-pitch) (ly:pitch-semitones left-pitch))
-0.75
0.75)))
% for ties in tablature, fret numbers that are tied to should be invisible,
% except for 'tied to' numbers after a line break; these will be parenthesized
% (thanks to Neil for his solution):
#(define-public (parenthesize-tab-note-head grob)
;; Helper function to parenthesize tab noteheads,
;; since we can't use ParenthesesItem at this stage
;; This is basically the same as the C++ function
;; in accidental.cc, converted to Scheme
(let* ((font (ly:grob-default-font grob))
(open (stencil-whiteout (ly:font-get-glyph font "accidentals.leftparen")))
(close (stencil-whiteout (ly:font-get-glyph font "accidentals.rightparen")))
(me (ly:text-interface::print grob)))
(ly:stencil-combine-at-edge
(ly:stencil-combine-at-edge
me
X
LEFT
open)
X
RIGHT
close)))
% ParenthesesItem doesn't work very well for TabNoteHead, since
% the parentheses are too small and clash with the staff-lines
% Define a callback for the 'stencils property which will tweak
% the parentheses' appearance for TabNoteHead
#(define-public (parentheses-item::calc-tabstaff-parenthesis-stencils grob)
;; the grob we want to parenthesize
(let ((victim (ly:grob-array-ref (ly:grob-object grob 'elements) 0)))
;; check whether it's a notehead
(if (grob::has-interface victim 'note-head-interface)
(begin
;; tweak appearance before retrieving list of stencils '(left-paren right-paren)
(ly:grob-set-property! grob 'font-size -2)
(ly:grob-set-property! grob 'padding 0)
;; apply whiteout to each element of the list
(map stencil-whiteout (parentheses-item::calc-parenthesis-stencils grob)))
(parentheses-item::calc-parenthesis-stencils grob))))
% the handler for ties in tablature; split ties yield in a parenthesized
% fret number, otherwise the fret number will be invisible.
#(define-public (tie::handle-tab-tie grob)
(let* ((original (ly:grob-original grob))
(tied-tab-note-head (ly:spanner-bound grob RIGHT))
(siblings (if (ly:grob? original)
(ly:spanner-broken-into original) '())))
(if (and (>= (length siblings) 2)
(eq? (car (last-pair siblings)) grob))
;; tie is split -> parenthesize
(ly:grob-set-property! tied-tab-note-head 'stencil
(lambda (grob) (parenthesize-tab-note-head grob)))
;; tie is not split -> make fret number invisible
(ly:grob-set-property! tied-tab-note-head 'transparent #t))))
% repeat ties occur within alternatives in a repeat construct;
% the correspondig fret numbers are shown in parentheses:
#(define-public (repeat-tie::parenthesize-tab grob)
(let ((tied-tab-note-head (ly:grob-object grob 'note-head)))
(ly:grob-set-property! tied-tab-note-head 'stencil
(lambda (grob) (parenthesize-tab-note-head grob)))))
% a command for switching to the (improved) full notation
tabFullNotation = {
% time signature
\revert TabStaff.TimeSignature #'stencil
% stems (the half note gets a double stem)
\override TabVoice.Stem #'stencil = #tabvoice::draw-double-stem-for-half-notes
% beams, dots
\revert TabVoice.Beam #'stencil
\revert TabVoice.Dots #'stencil
\revert TabVoice.Tie #'stencil
\revert TabVoice.Tie #'after-line-breaking
\revert TabVoice.RepeatTie #'stencil
\revert TabVoice.RepeatTie #'after-line-braking
\revert TabVoice.LaissezVibrerTie #'stencil
\revert TabVoice.Slur #'stencil
\revert PhrasingSlur #'stencil
% tuplet stuff
\revert TabVoice.TupletBracket #'stencil
\revert TabVoice.TupletNumber #'stencil
% dynamic signs
\revert DynamicText #'transparent
\revert DynamicTextSpanner #'stencil
\revert TabVoice.DynamicTextSpanner #'stencil
\revert TabVoice.Hairpin #'transparent
% rests
\revert TabVoice.Rest #'stencil
\revert TabVoice.MultiMeasureRest #'stencil
% markups etc.
\revert TabVoice.Script #'stencil
\revert TabVoice.TextScript #'stencil
\revert TabStaff.Arpeggio #'stencil
}
% the defaults for tablature:
\layout {
\context {
\TabStaff
% the clef handler
\override Clef #'stencil = #clef::print-modern-tab-if-set
% no time signature
\override TimeSignature #'stencil = ##f
% better parentheses in a TabStaff
\override ParenthesesItem #'stencils = #parentheses-item::calc-tabstaff-parenthesis-stencils
% no arpeggios
\override Arpeggio #'stencil = ##f
}
\context {
\TabVoice
% remove stems, beams, dots and rests ...
\override Stem #'stencil = ##f
\override Beam #'stencil = ##f
\override Dots #'stencil = ##f
\override Rest #'stencil = ##f
\override MultiMeasureRest #'stencil = ##f
% ... all kinds of ties/slurs
\override Tie #'stencil = ##f
\override RepeatTie #'stencil = ##f
\override LaissezVibrerTie #'stencil = ##f
\override Slur #'stencil = ##f
\override PhrasingSlur #'stencil = ##f
% 'tied to' fret numbers become invisible or parenthesized, respectively)
\override Tie #'after-line-breaking = #tie::handle-tab-tie
\override RepeatTie #'after-line-breaking = #repeat-tie::parenthesize-tab
% ... and all kinds of markups, spanners etc.
\override TupletBracket #'stencil = ##f
\override TupletNumber #'stencil = ##f
\override DynamicText #'transparent = ##t
\override DynamicTextSpanner #'stencil = ##f
\override TextSpanner #'stencil = ##f
\override Hairpin #'transparent = ##t
\override Script #'stencil = ##f
\override TextScript #'stencil = ##f
% the direction for glissando lines will be automatically corrected
\override Glissando #'extra-dy = #glissando::calc-tab-extra-dy
% dead notes in tablature and within chord constructs
\override TabNoteHead #'glyph-name = #tab-note-head::calc-glyph-name
\override TabNoteHead #'stencil = #tab-note-head::whiteout-if-style-set
}
}