Changes

Jump to navigation Jump to search
637 bytes removed ,  18:21, 25 January 2021
adapt to current working setup
< [[Graphics]] | [[Using Graphics]] >
[http://www.lilypond.org LilyPond] is a great music engraver, and you can include LilyPond in ConTeXt source using [[moduleshttps:t-lilypond|//github.com/adityam/filter the lilypond filter module]with some setup. This is different from using the lilypond-book preprocessor with LaTeX. (For LaTeX there’s also a package that works similar to our ConTeXt setup here: [https://github.com/jperon/lyluatex lyluatex].)
== Simple Filter Setup == This works with ConTeXt MkII and MkIV, but takes only the first page of multi-pages scores, and you must create the folder "lilytemp" manually:
* First you need a working, recent [http://www.lilypond.org LilyPond] installation (version 2.10.x) plus dependencies like GhostScript.
* Include the lilypond module
<texcode>
\def\readPDFfile#1{\externalfigure[#1]} \usemodule[filter]\defineexternalfilter[lilypond] [continue=yes, readcommand=\readPDFfile, directory=lilytemp/, % directory for LilyPond's files output={\externalfilterbasefile.pdf}, filtercommand={lilypond-dbackend=eps -ddelete-intermediate-files -o"lilytemp/\externalfilterbasefile" "\externalfilterinputfile"}]
</texcode>
* If you want, you can change the default settings using <cmd>setuplilypond</cmd>
* If you need lyrics with accented characters (e.g. umlauts), you '''must''' typeset in UTF-8 encoding (see [[Encodings_and_Regimes]]), because LilyPond doesn't understand anything else. And you need to use UTF-8 without BOM (byte order marker), because ConTeXt doesn't understand BOMs.
* The module works with LuaTeX.
==Multi Page Filter Setup = options ==={| style="border: solid 1px black; padding: 0.5em; vertical-align: top; width: 80%;" |- style="border: solid 1px black; padding: 0.5em; vertical-align: top; background: #eeeeee;"! option !! values !! default !! meaning|-| staffsize || number (pt) || 20 || height of the staff|-| linewidth || measure || <cmd>localhsize</cmd> || width of the staff|-| betweensystemspace || measure || 54pt || space between systems|-| align || yes/no || depends on fragment || ragged-right = (not align)|-| indent || measure || 0pt || first line indent|-| time || yes/no || yes || count the time (i.e. show time signature, draw bars, split the staff)?|-| clef || yes/no || yes || show the clef?|-| fragment || yes/no || no || typeset only a snippet (instead of a whole line)?|-| barnumbers || yes/no || no || show measure numbers?|-| showempty || yes/no || no || drop empty staves?|-| seriffont || "name" || "Tex Gyre Schola" || serif font (e.g. for Lyrics and \markup; was Century Schoolbook L before)|-| sansfont || "name" || "LMSans10" || sans serif font (e.g. for chords)|-| monofont || "name" || "LMTypewriter10" || monospace font (normally not used)|}
== Snippets ==This uses Lua and therefore only works with ConTeXt MkIV. It includes all pages of multi-page scores.It doesn’t look into the complete (multi-page) PDF, but reads a "-system.count" auxiliary file written by LilyPond that contains the number of systems (pages) and includes the single-system PDFs.
<texcode>
There are some notes \lilyponddef\LILYTEMP{lilytemp} % name of folder for LilyPond/buffer files \def\ParseLilypondFile#1% #1 is the name of the output file { \relativectxlua{bes a c bthirddata.parselilypondfile("#1")}}  \startluacode thirddata = thirddata or {} embedded in this line -- create temp folder if missing if not lfs.isdir("\LILYTEMP") then lfs.mkdir("\LILYTEMP") end function thirddata.parselilypondfile(name) -- include all systems (pages) -- name is like \LILYTEMP/mainfile-temp-lilypond-21.pdf logs.report("LILYPOND","name='" .. name .. "'") local scname = string.gsub(name, '%.pdf$', '-systems.count') local syco = tonumber(io.loaddata(scname)) or 0 for nr = 1, syco do logs.report("LILYPOND","including system no." .. nr) context("\\externalfigure[" .. string.gsub(name, '%.pdf$', '-' .. nr) .. "]") end end\stopluacode \usemodule[filter]\defineexternalfilter[lilypond] [continue=yes, cache=yes, readcommand=\ParseLilypondFile, directory=\LILYTEMP/, output={\externalfilterbasefile.pdf}, filtercommand={lilypond -dbackend=eps -ddelete-intermediate-files -o"\LILYTEMP/\externalfilterbasefile/" "\externalfilterinputfile"},]
</texcode>
== Sections ==
E.g. for == LilyPond Settings == Collect your LilyPond settings in a songbook you want to place big chunks of LilyPond output (i.e. note staffs) ly file, put it in your text. It behaves lilytemp directory and include it from within your lilypond block like any other graphics, especially similar to embedded [[MetaPost]] codethis:
<texcode>
\section{A Tune}
 
\startlilypond
\relative { \repeat volta 2 { \partial 4 e4 | a2 c4 d | e2 f4 e | d2. c4 | b4. c8 d4 e | a,2 c4 d | e2 f4 e | g,2 a | \partial 2. b2. | } \repeat volta 2 { \partial 4 r4 | f' g f d | e f e c | a b c d | e2include "mysettings. e4 | f g f8 e d4 |ly" e f e c | a c b8 a g4 | } \alternative { { \partial 2. g2. } { \partial 2. a2. } }}
\stoplilypond
</texcode>
There's nothing to say about You can avoid this tune yet; someone heard it from Lúnasa\include line following [http://modules.contextgarden.net/dl/t-filter/doc/context/third/filter/filter.txt filter module documentation], section "Prepend and append text".In short: you can inline your complete LilyPond settings or at least the include line: <texcode>\startbuffer[lilypond::settings]\include "mysettings.ly"\stopbuffer \defineexternalfilter[lilypond][ ... bufferbefore={lilypond::settings}, ...]
</texcode>
 
=== Sample Include File ===
 
"mysettings.ly" could look like this:
<texcode>
\section{Starlight version "2.18.2"#(roundly:set-option (quote no-point-and-click))#(set-global-staff-size 14)}
\startlilypond<<\context Staff = onlyone << \clef treble \key a \major \time 6/8 \context Voice = one { \relative c'' { a4.^\markup{1.} e' | e8( d cis) b4. | e4.^\markup{2.} d4 d8 | cis( b) a b4 e,8 | a4 a8 gis( a) b |% --- start of setup for single-line output files --- cis4 cis8 b#( cis d) | cis( d) e e4 e,8 | fis4 fis8 gis4. } }>>\lyricsto one \new Lyrics { \lyricmode { Star define default-toplevel- light, star book-handler print- bright, first star I see to book-with- night; I wish I may, I wish I might have the wish I wish to defaults-as- night. }}>>systems )
\stoplilypond#(define toplevel-book-handler</texcode> (lambda ( . rest) (set! output-empty-score-list #f) (apply print-book-with-defaults rest)))
== Font hints ==#(define toplevel-music-handler (lambda ( . rest) (apply collect-music-for-book rest)))
LilyPond depends on the fonts that pango/fontconfig can find#(define toplevel-score-handler (lambda ( . But not even all of those will work, e.g. no fonts from the TeX tree rest) (don't know whyapply collect-scores-for-book rest))), only one face per font file etc.Therefore it doesn't use ConTeXt's font setup.
If you want to know which fonts of your system LilyPond can see with which names, try lilypond #(define toplevel-dshowtext-available-fonts anyhandler (lambda (The 3rd parameter is necessary, but can be anything.rest) (apply collect-scores-for-book rest)))
LilyPond's default text font is Century Schoolbook. You can use it in ConTeXt MkIV #(OpenType fontsset! output-empty-score-list #t) like this:
<texcode>\usetypescriptfile[type% --- stop single-line setup ---otf]
\starttypescript[wiki][songbook]paper { #(define dump-extents #t) indent = 0\usetypescript [serif] [schoolbook]mm ragged-bottom = ##t ragged-last-bottom = ##t print-page-number = ##f line-width = 120\definetypeface [songbook] [mm oddFooterMarkup = ##f oddHeaderMarkup = ##f bookTitleMarkup = ##f scoreTitleMarkup = ##f} \layout { #(layout-set-staff-size 14) % beware, this resets fonts! % set fonts for rm] [serif] [schola] [default]/ ss / tt #(define fonts (make-pango-font-tree "TeX Gyre Schola" "LMSans10" "LMTypewriter10 Regular" (/ 14 20))) \context { \Score \remove "Bar_number_engraver" \override PaperColumn #'keep-inside-line = ##t } % some example settings \definetypeface [songbook] [ss] [sans] [default][default]context { \Staff \override TimeSignature #'style = #'numbered } \definetypeface [songbook] [tt] [mono] [default][default]context { \ChordNames chordChanges = ##t majorSevenSymbol = \stoptypescriptmarkup{ 7+ } }}
\usetypescript [wiki] [songbook]
\setupbodyfont[songbook, rm, 8.5pt]
</texcode>
For ConTeXt MkII usePlease look up the meaning of settings in [http://lilypond.org/doc/v2.22/Documentation/web/manuals LilyPond’s great documentation]!
<texcode>\starttypescript[wiki][songbook]\usetypescript [serif] [schoolbook] [\defaultencoding]\definetypeface [songbook] [rm] [serif] [schoolbook] [default] [encoding=\defaultencoding]\definetypeface [songbook] [ss] [sans] [default][default] [encoding=ec]\definetypeface [songbook] [tt] [mono] [default][default] [encoding=ec]\stoptypescriptIf you’d like to exchange measures like text width between ConTeXt and LilyPond, you could write those into the LilyPond buffer (see below).
\usetypescript [wiki] [songbook]\setupbodyfont[songbookTo give LilyPond measures to ConTeXt, rm, 8you would need to write them into a temp file (using Scheme) and read that in again (using Lua).5pt]</texcode>For the time being this is left as an exercise to the user. ;)
== Current workarounds ==Unfortunately you can’t define LilyPond’s text (lyrics) size with an absolute value, but only relative to staff size...
This section lists workarounds needed in some circumstances; we surely hope to move them to [[#Older_Workarounds|'''Older Workarounds''']] as soon as possible!== Named Buffers ==
=== Something (Normally, your LilyPondsnippets just get a running number. If you re-order your scores, GhostScript etceach one gets re-rendered.) isn't found ===
Depending on You can avoid that if you name your setup (path, installation directories, ...) you must call the lilypond app with the full pathLilyPond snippets: just add <tt>[name=myfunnyname]</tt> to {{cmd|startlilypond}}.
If <tt>pstopdf</tt> can't create PDFs you have just one LilyPond part per component (but LilyPond has made EPS filese.g. songs in a songbook) it might be that , you must set the environment variable could use <tt>GS_LIB[name=\currentcomponent]</tt> for GhostScript.
=== LilyPond 2.11 =Automatical width adaption ==
LilyPond 2.11 (and probably 2.12) changes the call syntaxIf you want to set your note line width automatically to your current text width, thus the module for 2.10 doesn't work.try this:
Look for the lilypond call in <tt>t -lilypond- this goes after "create temp folder" io.tex<savedata("\LILYTEMP/tt> and replace texsettings.ly", "\\paper { line-bepswidth = " .. string.gsub(number.todimen(tex.dimen.textwidth)," with pt"-dbackend=eps,"\\pt") . . " } \n")
=== Typesetting fret diagrams ===and then adapt your snippets or preamble buffer:<texcode>\include "../mysettings.ly"\include "texsettings.ly"</texcode>
Lilypond has commands to typeset fret diagrams for You must comment/delete the guitar chords. The most important one is called <code>\fret"line-diagram</code> and if you want to use it, you need to play a bit with the catcode of the <code>minus</code> sign since ConTeXt is apparently confused by thiswidth" setting in mysettings. In additionly, you can't type the example found in [http://lilypond.org/doc/v2.10/Documentation/user/lilypond/Overview-of-text-markup-commands#index-g_t_0040code_007bfret_002ddiagram_007d-935 the Lilypond documentation] on its own because Lilypond won't accept a score with only markup (the fret diagram) and nothing else; you have to place the markup on the pageotherwise it doesn’t work.
All == Example == Here's an example of placing score snippets in allthe body of the text, something like this will workwith fonts in the score & body matching:
<texcode>
\usemodule[lilypond]def\LILYTEMP{lilytemp} % name of folder for LilyPond/buffer files \starttextdef\ParseLilypondFile#1% #1 is the name of the output file {\catcode`ctxlua{thirddata.parselilypondfile("#1")}} \startluacode thirddata = thirddata or {}  --=11create temp folder if missing if not lfs.isdir("\LILYTEMP") then lfs.mkdir("\LILYTEMP") end
D chord: function thirddata.parselilypondfile(name) -- include all systems (pages) -- name is like \blankLILYTEMP/mainfile-temp-lilypond-21.pdf logs.report("LILYPOND","name='" .. name .. "'") local scname = string.gsub(name, '%.pdf$', '-systems.count') local syco = tonumber(io.loaddata(scname)) or 0
for nr = 1, syco do logs.report("LILYPOND","including system no." .. nr) context("\\setupfloats[location=right,frame=off]\startlilypondd'' ^ \markup placefigure[none]{ }{\\fret-diagram #externalfigure["s:0.75;f:1;6. string.gsub(name, '%.pdf$', '-x;5-x;4-o;3-2-1;2-3-3;1-2-2;' .. nr) .. " ]}")\stoplilypond end end\catcode`\-=12stopluacode
\stoptextusemodule[filter]<\defineexternalfilter[lilypond] [continue=yes, cache=yes, readcommand=\ParseLilypondFile, directory=\LILYTEMP/, output={\externalfilterbasefile.pdf}, filtercommand={lilypond -dbackend=eps -dinclude-eps-fonts -dno-gs-load-fonts -o"\LILYTEMP/texcode>\externalfilterbasefile" "\externalfilterinputfile"}]
If you find a real solution to the <code>catcode</code> problem \setuplayout[textwidth=6in] % matches line-width below\definefontfeature[main][protrusion=quality, please document it here, or report it to the list -- expansion=quality]\definefontfamily[mainface][rm][Adobe Jenson Pro][features=main]\setupbodyfont[User:Arthur|Arthurmainface,13pt]\setupalign[hz,hanging]
== Developer's Corner ==\starttext
For information how the integration works, please check the module code and its PDF version (both available from [[modules:t-lilypond|LilyPond on Modules]]). Unlike <tt>lilypond-book</tt> for LaTeX, the module does not use a precompiling step and thus can react to local width changes and the like, even if the LilyPond code is stored in a buffer.\input zapf
Known bugs:* LilyPond's EPS bounding box is a bit too small, so sometimes the content is cropped. Perhaps call eps2eps or the like to fix that?\startlilypond
Things that have not been implemented yet include:\layout{* indent=0\mm ragged-right = ##f}\paper {myStaffSize = #20 #(define fonts (make lilypond call back on ConTeXt for included TeX -pango-font-tree "Adobe Jenson Pro" "Myriad Pro" "Myriad Pro"(cf. [http://lsr.dsi.unimi.it/LSR/Item?id=107]myStaffSize 20)))* get information from LilyPond about the baseline, for runline-width=6\in music fragments* tell LilyPond how much space is left on the first page oddFooterMarkup=##f* check and probably work on proper multi-page music oddHeaderMarkup=##f bookTitleMarkup = ##f scoreTitleMarkup = ##f }* itmelody = \relative c's not possible to set variables in LilyPond' { \clef treble \key c \major* lots of features \time 4/4
To remember: a b c d* see [http://lilypond.org/doc/v2.10/Documentation/ LilyPond Docs]!}
--[[User:ChristopherCreutzig|Christopher Creutzig]] after ideas by [[User:Hraban|Hraban]]text = \lyricmode {Aaa Bee Cee Dee}
upper == Older Workarounds ==\relative c'' { \clef treble \key c \major \time 2/4
'''Beware: These relate to the old version of the module and older versions of LilyPond (earlier than 2.7)! Nowadays, LilyPond and epstopdf get called via texmfstart, that works without patching!''' a4 b c d}
lower === LilyPond is not found ===\relative c { \clef bass \key c \major \time 2/4
Calling lilypond from command line in Windows fails. (Seems like a bug in lilypond.) a2 c}
You have two options:\score {* modify the module, so that lilypond is called with the whole path ( <code>C:/prog/lilypond/usr/bin/lilypond</code> for example instead of \new Voice = "mel" { \autoBeamOff \melody } \new Lyrics \lyricsto mel \text \new PianoStaff <<code \new Staff = "upper" \upper \new Staff = "lower" \lower >lilypond</code> alone).* place a <code >lilypond.bat</code> somewhere in your search path, calling c:/prog/lilypond/usr/bin/lilypond %1 %2 %3 %4 %5 %6 %7 %8 %9 \layout { \context { \Staff \RemoveEmptyStaves } }}
Calling lilypond from ConTeXt via shell exit (write18) in MacOS X also fails, even if the shell's path is right. (Seems more like write18 wouldn't use the environment.) Modify the module (try <tt>which lilypond</tt> to get its path).\stoplilypond\input tufte
LilyPond 2.7.26 comes without a command line "version", at least in the MacOS X edition, i.e. the <tt>lilypond.sh\stoptext</tttexcode> script is missing.Here's it's relevant content:
#!/bin/sh ## where was the app installed? INSTALLDIR=/Applications if [ "$1" =Too many open files = "--print-appdir" ]; then echo "$INSTALLDIR/LilyPond.app/" exit 0 fi # where to put the output export LILYPOND_DESTDIR=`pwd` # run the program python "$INSTALLDIR/LilyPond.app/Contents/Resources/lilycall.py" \ "$INSTALLDIR/LilyPond.app/" $@
Save this as <tt>lilypond.sh</tt>, make it executable With bigger projects and symlink it the above setup you might run into a directory on your path"too many open files" errors, at least in older Linux, e.gOSX and other Unix-like OSes. chmod a+x lilypond.sh sudo ln -s lilypond.sh /usr/local/bin/lilypondAsk your shell about the open files maximum and set it higher:
=== LilyPond stops with an 'Unbound variable' error === $ ulimit -n 256 $ ulimit -S -n 2048
The [http://modules.contextgarden.net/t-lilypond LilyPond module] as of 2005-09-12 uses some commands in its header that work only with LilyPond 2.6 (at least no more with 2.7.25); replace "ly:parser-print-score" with "print-score-with-defaults" and "ly:music-scorify" with "scorify-music" for LilyPond 2.7 series.
[[Category:Modules]]
[[Category:Music]]
[[Category:Requests]]

Navigation menu