Hi David,
2012/2/20 David Kastrup <[email protected]>:
>> Furthermore, I realized, that there seems to be no conversion rule for
>> the following 2.12.3-definitions:
>>
>> From 2.12.3: \scm\lily-library.scm
>>
>> (define (interval-translate iv amount)
>> (cons (+ amount (car iv))
>> (+ amount (cdr iv))))
>
> It's used in snippets? Ugh.
http://lsr.dsi.unimi.it/LSR/Item?id=700 by Neil Puttock
< Probably easiest to put that back in and
> document it, then.
I reintegrated the interval-translate-definition into the file
->attached my manual update
> Is there a known replacement?
Don't know.
>
>> From 2.12.3: \ly\markup-init.ly
>>
>> #(define-public toplevel-module-define-public! #f)
>> #(define-public toplevel-module-ref #f)
>
> Those can be replaced by their straightforward counterpart. Where are
> they used?
http://lsr.dsi.unimi.it/LSR/Item?id=657
I reintegrated the old definitions, too. ->attached my manual update
I don't know about their counterpart.
>
>> And of course any 2.14.2-chordRootNamer-definition expects two
>> arguments now. I've no idea how that could be covered by converting
>> rules.
>
> Give a before/after example. It might be more reliable to actually just
> let the function deal with it via an optional argument,
In http://lsr.dsi.unimi.it/LSR/Search?q=chordRootNamer I simple added
the non-functional argument lowercase? to the definition. -> attached
my manual update
Or should I try to competely rewrite this snippet due to the new possibillities?
< but it is not
> inconceivable to write conversion rules either. If you take a look at
> convertrules.py, you'll see that I did some rather heavy lifting inside
> of Scheme constructs for dealing with ly:export. It is not the same as
> doing compatibility in Scheme itself, but it was sufficient for the
> LilyPond repository.
Will have a look at it.
Cheers,
Harm
\version "2.14.0"
\header {
texidoc = "
Staff lines can be colored independently by overriding the default
stencil for @code{StaffSymbol}.
The @code{StaffSymbol} callback @code{color-staff-lines} takes a set of
colors (using LilyPond's predefined colors or the functions
@code{x11-color} and @code{rgb-color}) which are applied to each staff
line in turn starting with the fifth line (for a standard staff), or
each item in the list for custom staves defined with
@code{line-positions}. To signal that a particular line between
colored lines should remain black, use @code{#f}.
"
doctitle = "Coloring individual staff lines"
}
%LSR This snippet was contributed by Neil Puttock
#(define-public ((color-staff-lines . rest) grob)
(define (index-cell cell dir)
(if (equal? dir RIGHT)
(cdr cell)
(car cell)))
(define (index-set-cell! x dir val)
(case dir
((-1) (set-car! x val))
((1) (set-cdr! x val))))
;;;; Definition added!
(define (interval-translate iv amount)
(cons (+ amount (car iv))
(+ amount (cdr iv))))
(let* ((common (ly:grob-system grob))
(span-points '(0 . 0))
(thickness (* (ly:grob-property grob 'thickness 1.0)
(ly:output-def-lookup (ly:grob-layout grob) 'line-thickness)))
(width (ly:grob-property grob 'width))
(line-positions (ly:grob-property grob 'line-positions))
(staff-space (ly:grob-property grob 'staff-space 1))
(line-stencil #f)
(total-lines empty-stencil)
;; use a local copy of colors list, since
;; stencil creation mutates list
(colors rest))
(for-each
(lambda (dir)
(if (and (= dir RIGHT)
(number? width))
(set-cdr! span-points width)
(let* ((bound (ly:spanner-bound grob dir))
(bound-ext (ly:grob-extent bound bound X)))
(index-set-cell! span-points dir
(ly:grob-relative-coordinate bound common X))
(if (and (not (ly:item-break-dir bound))
(not (interval-empty? bound-ext)))
(index-set-cell! span-points dir
(+ (index-cell span-points dir)
(index-cell bound-ext dir))))))
(index-set-cell! span-points dir (- (index-cell span-points dir)
(* dir thickness 0.5))))
(list LEFT RIGHT))
(set! span-points
(interval-translate span-points
(- (ly:grob-relative-coordinate grob common X))))
(set! line-stencil
(make-line-stencil thickness (car span-points) 0 (cdr span-points) 0))
(if (pair? line-positions)
(for-each (lambda (position)
(let ((color (if (pair? colors)
(car colors)
#f)))
(set! total-lines
(ly:stencil-add
total-lines
(ly:stencil-translate-axis
(if (color? color)
(ly:stencil-in-color line-stencil
(first color)
(second color)
(third color))
line-stencil)
(* position staff-space 0.5) Y)))
(and (pair? colors)
(set! colors (cdr colors)))))
line-positions)
(let* ((line-count (ly:grob-property grob 'line-count 5))
(height (* (1- line-count) (/ staff-space 2))))
(do ((i 0 (1+ i)))
((= i line-count))
(let ((color (if (and (pair? colors)
(> (length colors) i))
(list-ref colors i)
#f)))
(set! total-lines (ly:stencil-add
total-lines
(ly:stencil-translate-axis
(if (color? color)
(ly:stencil-in-color line-stencil
(first color)
(second color)
(third color))
line-stencil)
(- height (* i staff-space)) Y)))))))
total-lines))
\relative c' {
% color all lines in a standard five-line staff
\override Staff.StaffSymbol #'stencil = #(color-staff-lines red green yellow blue cyan)
c1 \stopStaff
\revert Staff.StaffSymbol #'stencil
\startStaff
% color the fifth, third and second lines only
\override Staff.StaffSymbol #'stencil = #(color-staff-lines (rgb-color 0 0.3 0.8) #f grey (x11-color 'LightGreen))
c1 \stopStaff
\revert Staff.StaffSymbol #'stencil
\startStaff
% color an individual line in a custom staff
\override Staff.StaffSymbol #'line-positions = #'(-4 0 4)
\override Staff.StaffSymbol #'stencil = #(color-staff-lines #f red)
c1
}
\version "2.14.0"
\header {
texidoc = "
Some files of definitions should be included only once in a project,
but they need to be mentioned by all of the files that require them.
I defined \\includeIfAbsent to include a file if and only if it has not
already been included by \\includeIfAbsent. It works in a different
scope from \\include, so definitions in the included file need to be
made global with define-public-toplevel in order to be effective.
"
doctitle = "Including a file only once"
}
% Will not work in 2.13 or later since define-public-toplevel has been removed
% Include a file unless it has already been included. This executes
% in a cloned parser, so all definitions in the included file need to
% be made global with define-public-toplevel. Include seems to be
% implemented in the lexical analyzer, and I don't see how to do it
% properly at a higher level. Executing in the main parser appears to
% have the right effect, and produce all desired output, but LilyPond
% ends with a segmentation fault.
%
% In the included file, do lilypond variable defintion
%
% var = <stuff>
% as
% #(define-public-toplevel var #{ <stuff> #} )
%
% music function definition
%
% fname = #(define-music-function <stuff>)
% as
% #(define-public-toplevel fname (define-music-function <stuff>))
%
% markup definition
%
% var = \markup { <stuff> }
% as
% #(define-public-toplevel var (markup <translated-stuff>))
%
% Using the translation described in the LilyPond Notation Manual
% section Markup-construction-in-Scheme
%
%%%% fixed reimplementing the relevant definitions from "2.12.3"
%%%% TODO ask Devs
#(define-public toplevel-module-define-public! #f)
#(define-public toplevel-module-ref #f)
#(let ((toplevel-module (current-module)))
(set! toplevel-module-define-public!
(lambda (symbol value)
(module-define! toplevel-module symbol value)
(module-export! toplevel-module (list symbol))))
(set! toplevel-module-ref
(lambda (symbol)
(module-ref toplevel-module symbol))))
#(defmacro-public define-public-toplevel
(first-arg . rest)
"Define a public variable or function in the toplevel module:
(define-public-toplevel variable-name value)
or:
(define-public-toplevel (function-name . args)
..body..)"
(if (symbol? first-arg)
;; (define-public-toplevel symbol value)
(let ((symbol first-arg)
(value (car rest)))
`(toplevel-module-define-public! ',symbol ,value))
;; (define-public-toplevel (function-name . args) . body)
(let ((function-name (car first-arg))
(arg-list (cdr first-arg))
(body rest))
`(toplevel-module-define-public!
',function-name
(let ((proc (lambda ,arg-list
,@body)))
(set-procedure-property! proc
'name
',function-name)
proc)))))
#(if (not (defined? 'includeIfAbsent))
(define-public-toplevel includeIfAbsent(define-music-function (parser location fileName) (string?)
(let ((guardName (string-append "Already Got " fileName)))
(if (not (defined? (string->symbol guardName)))
(begin
(primitive-eval (list 'define (string->symbol guardName) #t))
(ly:parser-parse-string (ly:parser-clone parser) (string-concatenate (list "\\include \"" fileName "\"")))
(make-music 'SequentialMusic 'void #t))
(make-music 'SequentialMusic 'void #t))))))
\markup {
Pointless markup to avoid LSR rejecting the snippet for lack of output
}
\version "2.14.0"
\header {
texidoc = "
For typesetting chords, LilyPond uses its internal accidentals (i.e. it
uses glyphs from the Feta font). This example shows how you can change
LilyPond's behaviour to use the accidentals \"#\" and \"b\" from the
currently selected font. This is useful if you'd like to use a font for
setting jazz chords in RealBook style.
"
doctitle = "Use custom font's flat (b) and sharp (#) symbols for chords"
}
% correct markup for "b" and "#" (use symbols from current font...)
chordFlat = \markup { \hspace #0.2 \fontsize #-1 \raise #0.3 "b" }
chordSharp = \markup { \hspace #0.1 \fontsize #-1 \raise #0.3 "#" }
% define custom chords
myPopChordsMusic =
{
<c es ges bes>-\markup { "m" \super { "7/" \chordFlat "5" } }
<c e g bes dis'>-\markup { \super { "7/" \chordSharp "9" } }
% ... define all other possible chords here...
}
% Add to existing exceptions
myPopChordsAdd = #(append (sequential-music-to-chord-exceptions myPopChordsMusic #t) ignatzekExceptions)
%% Ugly fix by simply adding lowercase? to the definition-args
% fix accidentals with some Scheme (using the current font's symbols)
#(define (my-chord-name->pop-markup pitch lowercase?)
(let* ((alt (ly:pitch-alteration pitch)))
(make-line-markup
(list
(make-simple-markup (vector-ref #("C" "D" "E" "F" "G" "A" "B") (ly:pitch-notename pitch)))
;; If it's natural, do nothing
(if (= alt 0)
(make-line-markup (list empty-markup))
(if (= alt FLAT)
;; Otherwise, handle adding the flat symbol
(make-line-markup
(list
(make-hspace-markup 0.3)
(make-small-markup (make-raise-markup 0.7
(make-text-markup "b")))
))
;; or handle adding the sharp symbol
(make-line-markup
(list
(make-hspace-markup 0.1)
(make-small-markup (make-raise-markup 0.7
(make-text-markup "#")))
))
)))))
)
\new Score
{
\new ChordNames
{
% for demonstration purposes, use Arial as font
% this does not look very nice, but shows the functionality
\override ChordNames . ChordName #'font-name = #"Arial"
% use our new chord definitions (including the new accidentals)
\set chordNameExceptions = #myPopChordsAdd
% use our new markup chord naming functions to get the new accidentals
\set chordRootNamer = #my-chord-name->pop-markup
\chordmode { cis1:m7.5- des1:7.9+ }
}
}
% % use like this:
%
% {
% popChords =
% {
% \set chordNameExceptions = #myPopChordsAdd
% \set chordRootNamer = #my-chord-name->pop-markup
% }
% }
%
% % or like this:
%
% \layout
% {
% \context
% {
% \Score
% chordNameExceptions = #myPopChordsAdd
% chordRootNamer = #my-chord-name->pop-markup
% }
% }
_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user