Hi Torsten,
thank you very much for your work. This is great!
While I probably won't use it ever for myself, I find that an
extremely useful addition to LilyPond, and I hope you will get
enough assistance to get it into LilyPond's default distribution.
Best
Urs
Am 14.03.2013 11:36, schrieb "Torsten Hämmerle":
Hello all,
I've just noticed the my last mail didn't get through to
the list for some reason. Well, here it is again in a second
attempt:
In the first place: I've attached a zip file containing the
current (albeit unfinished) versions of the LilyJAZZ music and
LilyJAZZ Text font plus the corresponding LilyJAZZ.ily
include.
As an example to demonstrate what's already there (well, I
missed grace notes/acciaccaturas/appoggiaturas) there's a PDF
file for all those who'd like to take a look at the result
without having to install anything.
At any rate, the whole LilyJAZZ issue shall be open and free
(just like Lilypond), so I first had to create my own fonts in
order to become independent of commercial ones.
It's (still) a preliminary version, many things are missing
(spanners like trill-span, repeat bar lines, multi measure
rests, ...), but you can use clefs, key signatures, time
signatures, accidentals, note heads and flags, articulations,
dynamics. And: there is a LilyJAZZ Text font included. Most
characters should be there (including accented characters for
German/French/Italian etc. texts).
I know that a chord font is indispensable for all virtually
any jazz application, especially lead sheets, but I'll keep it
separate first for several reasons (I'll get back to this
soon).
BUT: Even if all this may be quite an ambitious task, I just
started off to see what's possible and how Lilypond behaves in
a jazz context. Fortunately, the results look quite
encouraging. :)
So finally: what have I done and why?
The main obstacle is the rigid way Lilypond handles its (her,
his?) internal music font. I deliberately decided to stick to
an "ordinary" OTF/TTF font first to learn how to use external
fonts (who knows what it's good for) and my metafont phase of
life dates back to the last millennium.
In the meantime, most of the characters have been re-drawn
manually from scans of the well-known Sigler fonts FontForge,
a few still have been created using FontForge's tracing
functionality. It should be enough for experimenting and
getting an impression, though.
To match the overall appearance of the jazz font, I've
slightly (perhaps too much...) increased the stem, beam, tie,
slur, and bar line thickness. Nothing fancy about.
Currently, the "LilyJAZZ mode" can be switched on using the
\jazzOn command and it can (almost) be switched off again
using \jazzOff. This has proved most helpful in this early
stage when comparing/checking spacing against the standard.
Some technical background for those interested in the scheme
coding. Unforunately, I'm fairly new to scheme, but there's a
lot of coding around to learn from.
The alist jazz-map contains mapping information from glyph
name to unicode character number, so that any external font
could be accessed as long as it supports Unicode:
%***********************************************************************
% MAPPING ALISTS / LOOKUP TABLES
%***********************************************************************
% MAPPING ALIST: GLYPH NAME TO UNICODE CHAR NUMBER
=====================
#(define jazz-map '(
("noteheads.s0jazz" . #xe191)
("noteheads.s1jazz" . #xe192)
("noteheads.s2jazz" . #xe193)
("noteheads.s0slashjazz" . #xe19c)
("noteheads.s1slashjazz" . #xe19d)
("noteheads.s2slashjazz" . #xe19e)
("noteheads.s2crossjazz" . #xe1a1)
("flags.u3jazz" . #xe21c)
("flags.u4jazz" . #xe21d)
[...]
As a jazz replacement for \musicglyph, there now is a simliar
\jazzglyph command that can be used in exactly the same way,
returning the corresponding jazz font glyph.
Example: \musicglyph #"script.ufermata" becomes \jazzglyph
#"scripts.ufermatajazz".
%***********************************************************************
% JAZZ GLYPH ACCESS
%***********************************************************************
% JAZZGLYPH: REPLACEMENT FOR MUSICGLYPH
================================
#(define-markup-command (jazzglyph layout props glyphname)
(string?)
"musicglyph replacemet for jazz (i. e. non-Feta) characters"
(let* ((charnum (cdr (assoc glyphname jazz-map))))
(interpret-markup layout props
(markup (#:fontsize 5 #:override '(font-name .
"LilyJAZZ") #:char charnum)))))
[...]
Having established this basic functionality, we can start
actually changing various stencils.
Let's have a look at the clefs. The new jazz-clef stencil
function appends the "jazz" suffix to the standard glyph name
and searches the jazz-map lookup table. If there's no entry,
the standard function ly:clef::print will be used.
%***********************************************************************
% JAZZ CLEFS
%***********************************************************************
#(define (jazz-clef grob)
"jazz clef stencil"
(let* ((glyphname (string-append (ly:grob-property grob
'glyph-name) "jazz")))
(if (pair? (assoc glyphname jazz-map))
(grob-interpret-markup grob (markup #:jazzglyph
glyphname))
(ly:clef::print grob))))
Currently, I've just implemented three diffent note heads:
whole, half and quarter, depending on the duration-log
property. The stem-attachment has been slightly shifted to
match the steeper "slope" of the jazz noteheads and the
increased stem thickness.
%***********************************************************************
% NOTE HEADS
%***********************************************************************
#(define (jazz-notehead grob)
"stencil: jazz noteheads"
(let* ((log (ly:grob-property grob 'duration-log)))
(set! (ly:grob-property grob 'stem-attachment) '(1.0 .
0.35))
(grob-interpret-markup grob
(cond
((<= log 0) (markup #:jazzglyph
"noteheads.s0jazz"))
((<= log 1) (markup #:jazzglyph
"noteheads.s1jazz"))
(else (markup #:jazzglyph "noteheads.s2jazz"))))))
[...]
These new stencil functions now can be assigned, e. g.
\override Staff.Clef #'stencil = #jazz-clef
\override Staff.NoteHead #'stencil = #jazz-notehead
\override Staff.NoteHead #'Y-extent =
\makeUnpurePureContainer
The use of pure-unpure-containers is tremendously important in
certain cases, because otherwise, the spacing will go belly
up.
That's basically the way LilyJAZZ works, the coding of the
first line in the demo PDF looks thus:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\version "2.16.1"
\include "LilyJAZZ.ily"
\paper { indent = #10 }
\relative c' {
\jazzOn
\set Staff.instrumentName = "Trumpet"
\clef treble
\key es \major
\time 4/4
\tempo "Medium Swing"
r8 es4->\mf f8-. g-- as4-^ bes8-^ |
r4. b8\trill\fff ~ b2 |
bes?16-> r as4\mp r8 g4( \times 2/3 { es8 f e\pp ~ } |
e1) \fermata |
\bar "||"
\mark \markup \jazzglyph #"scripts.varsegnojazz"
\clef bass
\time 5/4
\key g \major
geses,4_"Various Accidentals" ges g gis gisis |
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
As you can see, apart from the \include statement and the
\jazzOn command, it's still standard lilypond input without
many special "jazz commands" and tweaking. The second example
in the PDF is also totally standard Lilypond output without
any manual corrections.
Of course, there are some spacing issues, but after all,
vaticana neumes or modern Gregorian ligatures have their
problems, either, so we’re in good company here. ;-)
And, yes, I have refrained so far from using
"pango-font-tree", just to keep track of what might still be
missing.
All the best,
Torsten
_______________________________________________
lilypond-user mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/lilypond-user
|