Changes

Jump to navigation Jump to search
4,880 bytes removed ,  20:15, 22 February 2018
m
fix link of filter module
< [[Graphics]] | [[Using Graphics]] >
[http://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].)
== Deprecation Warning Simple Filter Setup ==
The LilyPond module doesn't work any more This works with recent versions ConTeXt MkII and MkIV, but takes only the first page of ConTeXt. You can simply replace it with multi-pages scores, and you must create the [http://modules.contextgarden.net/filter Filter module] like thisfolder "lilytemp" manually:
<texcode>
directory=lilytemp/, % directory for LilyPond's files
output={\externalfilterbasefile.pdf},
filtercommand={lilypond -dbackend=eps -dno-gs-load-fonts -dinclude-eps-fonts -ddelete-intermediate-files -o"lilytemp/\externalfilterbasefile" "\externalfilterinputfile"}]
</texcode>
You can't use == Multi Page Filter Setup == 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. <cmdtexcode>setuplilypond\def\LILYTEMP{lilytemp} % name of folder for LilyPond/buffer files \def\ParseLilypondFile#1% #1 is the name of the output file {\ctxlua{thirddata.parselilypondfile("#1")}} \startluacode thirddata = thirddata or {} -- 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 -o"\LILYTEMP/\externalfilterbasefile" "\externalfilterinputfile"}]</cmdtexcode> any more, but there is a better replacement:   == LilyPond Settings == Collect your LilyPond settings in a .ly file, put it in your lilytemp directory and include it from within your lilypond block like this:
<texcode>
</texcode>
Here's an example of placing score snippets in the body of the You can avoid this \include line following [http://modules.contextgarden.net/dl/t-filter/doc/context/third/filter/filter.txt filter module documentation], section "Prepend and append text, with fonts in ".In short: you can inline your complete LilyPond settings or at least the score & body matchinginclude line:
<texcode>
\unprotectstartbuffer[lilypond::settings]\include "mysettings.ly"\stopbuffer
\usemoduledefineexternalfilter[filterlilypond][ ... bufferbefore={lilypond::settings}, ...]</texcode>
\traceexternalfilters=== Sample Include File ===
\defineexternalfilter [lilypond] [\c!output=\externalfilterbasefile"mysettings.pdf, \c!filtercommand=\lilypondcommand, \c!continue=\v!yes, \c!readcommand=\readlilypondoutput, %\c!directory=output, ]ly" could look like this:
% frame=on is for testing<texcode>\def\readlilypondoutputversion "2.18.2"#1{\setupfloats[location=right,frame=off]\placefigure[]{From \sc{http(ly://lsr.dsi.unimi.it/LSR/Search?q=piano}}{\externalfigure[set-option (quote no-point-and-click))#1]}}(set-global-staff-size 14)
\def\lilypondcommand%--- start of setup for single-line output files --- {lilypond #(define default-dbackend=eps toplevel-dnobook-gshandler print-loadbook-fonts with-dincludedefaults-epsas-fonts \externalfilterinputfile}\protectsystems )
\setuplayout[textwidth=6in] % matches line#(define toplevel-width belowbook-handler (lambda ( . rest)\usetypescript[palatino] (set! output-empty-score-list #f)\setupbodyfont[palatino,13pt] (apply print-book-with-defaults rest)))
\starttext#(define toplevel-music-handler (lambda ( . rest) (apply collect-music-for-book rest)))
\input zapf #(define toplevel-score-handler (lambda ( . rest) (apply collect-scores-for-book rest)))
\startlilypond\layout{#(define toplevel-text-handler indent=0\mm ragged-right = ##f}\paper { myStaffSize = #20 #(define fontslambda ( . rest) (makeapply collect-pangoscores-fontfor-tree "palatino" "palatino" "palatino" (/ myStaffSize 20book rest))) line-width=6\in oddFooterMarkup=##f oddHeaderMarkup=##f bookTitleMarkup = ##f scoreTitleMarkup = ##f }global = { \key c \major \time 4/4}
sopMusic = \relative c'' { c4 c c8[#( bset! output-empty-score-list #t)] c4}sopWords = \lyricmode { hi hi hi hi}
altoMusic = \relative c' { e4 f d e}altoWords =\lyricmode { ha ha ha ha}% --- stop single-line setup ---
tenorMusic \paper { #(define dump-extents #t) indent = 0\relative c' {mm ragged-bottom = ##t ragged-last-bottom = ##t print-page-number = ##f line-width = 120\mm g4 a oddFooterMarkup = ##f g} oddHeaderMarkup = ##ftenorWords bookTitleMarkup = \lyricmode {##f hu hu hu hu scoreTitleMarkup = ##f
}
bassMusic \layout { #(layout-set-staff-size 14) % beware, this resets fonts! % set fonts for rm / 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 \relative c context {\Staff c4 c g c \override TimeSignature #'style = #'numbered }bassWords \context { \ChordNames chordChanges = ##t majorSevenSymbol = \lyricmode markup{7+ } ho ho ho hø }
}
\score {
<<
\new ChoirStaff <<
\new Lyrics = "sopranos"
\new Staff = "women" <<
\new Voice = "sopranos" { \voiceOne << \global \sopMusic >> }
\new Voice = "altos" { \voiceTwo << \global \altoMusic >> }
>>
\new Lyrics = "altos"
\new Lyrics = "tenors"
\new Staff = "men" <<
\clef bass
\new Voice = "tenors" { \voiceOne << \global \tenorMusic >> }
\new Voice = "basses" { \voiceTwo << \global \bassMusic >> }
>>
\new Lyrics = "basses"
\context Lyrics = "sopranos" \lyricsto "sopranos" \sopWords
\context Lyrics = "altos" \lyricsto "altos" \altoWords
\context Lyrics = "tenors" \lyricsto "tenors" \tenorWords
\context Lyrics = "basses" \lyricsto "basses" \bassWords
>>
\new PianoStaff <<
\new Staff <<
\set Staff.printPartCombineTexts = ##f
\partcombine
<< \global \sopMusic >>
<< \global \altoMusic >>
>>
\new Staff <<
\clef bass
\set Staff.printPartCombineTexts = ##f
\partcombine
<< \global \tenorMusic >>
<< \global \bassMusic >>
>>
>>
>>
}
\stoplilypond
\input zapf
\stoptext
</texcode>
== Setup ==Please look up the meaning of settings in [http://lilypond.org/doc/v2.18/Documentation/web/manuals LilyPond’s great documentation]!
* First you need a working, recent [http://www.lilypond.org LilyPond] installation (version 2.12.x) plus dependencies If you’d like to exchange measures like GhostScript.* Install the lilypond module via [[ConTeXt_Minimals#Installing_third_party_modules|ConTeXt minimals]], or get it from [[modules:t-lilypond|ConteXt garden]] or [http://github.com/fiee/text width between ConTeXt/tree/master/t-lilypond/ github] and install it in one of your TeX trees.* Include the lilypond module<texcode>\usemodule[lilypond]</texcode>* If you wantLilyPond, you can change could write those into the default settings using <tt>\setuplilypond</tt>LilyPond buffer.* If To give LilyPond measures to ConTeXt, you would need lyrics with accented characters to write them into a temp file (e.g. umlautsusing Scheme), you '''must''' typeset and read that in UTF-8 encoding again (see [[Encodings_and_Regimes]]useing Lua), 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.* Versions from May 2009 on work with LuaTeX ''only.'' Supported For the time being this is only left as an exercise to the latest beta of MkIVuser.;)
=== 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 = Unfortunately you can’t define LilyPond’s text (not alignlyrics)|-| indent || measure || 0pt || first line indent|-| time || yes/no || yes || count the time (i.e. show time signaturesize with an absolute value, draw bars, split the but only relative to 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 (esize.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)|-| tmpdir || "name" || "./lilytemp" || directory for temporary files (.tmp, .md5, .eps); gets created if not existant|-| imgdir || "name" || "./lilypdfs" || directory for LilyPond PDFs; gets created if not existant|}
== Snippets Named Buffers ==
<texcode>There are some notes \lilypond{ \relative{bes Normally, your LilyPond snippets just get a c b} } embedded in this linerunning number. If you re-order your scores, each one gets re-rendered.</texcode>
You can avoid that if you name your LilyPond snippets: just add <tt>[name== Sections ==myfunnyname]</tt> to <cmd>startlilypond</cmd>.
EIf you have just one LilyPond part per component (e.g. for songs in a songbook you want to place big chunks of LilyPond output (i.e. note staffs) in your text. It behaves like any other graphics, especially similar to embedded [you could use <tt>[MetaPostname=\currentcomponent]] code:</tt>.
<texcode>\section{A Tune}== Automatical width adaption ==
\startlilypond\relative { \repeat volta 2 { \partial 4 e4 | a2 c4 d | e2 f4 e | d2. c4 | b4. c8 d4 e | aIf you want to set your note line width automatically to your current text width,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 | e2. e4 | f g f8 e d4 | e f e c | a c b8 a g4 | } \alternative { { \partial 2. g2. } { \partial 2. a2. } }}\stoplilypondtry this:
There's nothing to say about -- this tune yet; someone heard it from Lúnasagoes after "create temp folder" io.savedata("\LILYTEMP/texsettings.ly", "\\paper { line-width = " ..</texcode> string.gsub(number.todimen(tex.dimen.textwidth),"pt","\\pt") .. " } \n")
and then adapt your snippets or preamble buffer:
<texcode>
\section{Starlight (round)} \startlilypond<<\context Staff = onlyone << \clef treble \key a \major \time 6/8 \context Voice = one { \relative c'' { a4include ".^\markup{1.} e' | e8( d cis) b4. | e4.^\markup{2.} d4 d8 | cis( b) a b4 e,8 | a4 a8 gis( a) b | cis4 cis8 b( cis d) | cis( d) e e4 e,8 | fis4 fis8 gis4/mysettings.ly" } }>>\lyricsto one \new Lyrics { \lyricmode { Star -- light, star -- bright, first star I see to -- night; I wish I may, I wish I might have the wish I wish to -- nightinclude "texsettings. }}>> \stoplilypondly"
</texcode>
== Font hints ==You must comment/delete the "line-width" setting in mysettings.ly, otherwise it doesn’t work.
LilyPond depends on the fonts that pango/fontconfig can find. But not even all of those will work, e.g. no fonts from the TeX tree (don't know why), only one face per font file etc.Therefore it doesn't use ConTeXt's font setup.== Example ==
If you want to know which fonts Here's an example of placing score snippets in the body of your system LilyPond can see the text, with which names, try lilypond -dshow-available-fonts any(The 3rd parameter is necessary, but can be anything.) LilyPond's default text font is Century Schoolbook. You can use it in ConTeXt like thisthe score & body matching:
<texcode>
\usetypescriptfile[type-otf] def\starttypescript[wiki][songbook] \usetypescript [serif] [schoolbook] \definetypeface [songbook] [rm] [serif] [schola] [default] \definetypeface [songbook] [ss] [sans] [default][default] \definetypeface [songbook] [tt] [mono] [default][default]\stoptypescriptLILYTEMP{lilytemp} % name of folder for LilyPond/buffer files
\usetypescript [wiki] [songbook]def\ParseLilypondFile#1% #1 is the name of the output file {\setupbodyfont[songbook, rm, 8ctxlua{thirddata.5pt]</texcode>parselilypondfile("#1")}}
\startluacode thirddata == Current workarounds ==thirddata or {}
This section lists workarounds needed in some circumstances; we surely hope to move them to [[#Older_Workarounds|'''Older Workarounds''']] as soon as possible! -- 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 == Something string.gsub(LilyPondname, '%.pdf$', GhostScript etc'-systems.count') isn't found == local syco =tonumber(io.loaddata(scname)) or 0
Depending on your setup for nr = 1, syco do logs.report(path"LILYPOND", installation directories"including system no." .. nr) context("\\setupfloats[location=right, frame=off]\\placefigure[none]{}{\\externalfigure[" ..string.gsub(name, '%.pdf$', '-' .. nr) you must call the lilypond app with the full path.. "]}") end end\stopluacode
If <tt>pstopdf<\usemodule[filter]\defineexternalfilter[lilypond] [continue=yes, cache=yes, readcommand=\ParseLilypondFile, directory=\LILYTEMP/tt> can't create PDFs (but LilyPond has made EPS files) it might be that you must set the environment variable <tt>GS_LIB<, output={\externalfilterbasefile.pdf}, filtercommand={lilypond -dbackend=eps -dinclude-eps-fonts -dno-gs-load-fonts -o"\LILYTEMP/tt> for GhostScript.\externalfilterbasefile" "\externalfilterinputfile"}]
\setuplayout[textwidth=== LilyPond pre6in] % matches line-2.12 width below\definefontfeature[main][protrusion=quality, expansion=quality]\definefontfamily[mainface][rm][Adobe Jenson Pro][features=main]\setupbodyfont[mainface,13pt]\setupalign[hz,hanging]
The module as of 2009-05-03 works only with LilyPond 2.12 (probably also with some versions of 2.11).
 
For older versions of LilyPond please use an older version of the module. 2008-09 fits LilyPond 2.10
 
=== Typesetting fret diagrams ===
 
Lilypond has commands to typeset fret diagrams for the guitar chords. The most important one is called <code>\fret-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 this. In addition, 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 page.
 
All in all, something like this will work:
 
<texcode>
\usemodule[lilypond]
\starttext
\catcode`\-=11
D chord:\blankinput zapf
\startlilypond
d'' ^ \markup { \fret-diagram #"s:0.75;f:1;6-x;5-x;4-o;3-2-1;2-3-3;1-2-2;" }
\stoplilypond
\catcode`\-=12
\stoptextlayout{< indent=0\mm ragged-right = ##f}\paper {myStaffSize = #20 #(define fonts (make-pango-font-tree "Adobe Jenson Pro" "Myriad Pro" "Myriad Pro"(/ myStaffSize 20)))line-width=6\in oddFooterMarkup=##f oddHeaderMarkup=##f bookTitleMarkup = ##f scoreTitleMarkup = ##f }melody = \relative c'' { \clef treble \key c \major \time 4/texcode>4
If you find a real solution to the <code>catcode</code> problem, please document it here, or report it to the list -- [[User:Arthur|Arthur]]b c d}
text == Developer's Corner ==\lyricmode {Aaa Bee Cee Dee}
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<upper = \relative c'' { \clef treble \key c \major \time 2/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.4
Known bugs: a4 b c d* LilyPond's EPS bounding box is sometimes a bit too small, so sometimes the content is cropped. Perhaps call eps2eps or the like to fix that?}
Things that have not been implemented yet include:* work with existing PDFs on systems where LilyPond isn't installed.* make lilypond call back on ConTeXt for included TeX (cf. [http://lsr.dsi.unimi.it/LSR/Item?idlower =107])\relative c {* get information from LilyPond about the baseline, for run-in music fragments \clef bass* tell LilyPond how much space is left on the first page \key c \major* check and probably work on proper multi-page music* it's not possible to set variables in LilyPond* lots of features \time 2/4
To remember: a2 c* see [http://lilypond.org/doc/v2.12/Documentation/ LilyPond Docs]!}
--[[User:ChristopherCreutzig|Christopher Creutzig]] after ideas by [[User:Hraban|Hraban]]\score { << \new Voice = "mel" { \autoBeamOff \melody } \new Lyrics \lyricsto mel \text \new PianoStaff << \new Staff = "upper" \upper \new Staff = "lower" \lower >> >> \layout { \context { \Staff \RemoveEmptyStaves } }}
== Older Workarounds ==\stoplilypond\input tufte
'''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!''' === Fonts with ConTeXt MkII === For the latest versions of the module work with ConTeXt MkIV (LuaTeX) exclusively, so we moved this to "Older": <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]\stoptypescript \usetypescript [wiki] [songbook]\setupbodyfont[songbook, rm, 8.5pt]stoptext
</texcode>
==Too many open files = LilyPond is not found === Calling lilypond from command line in Windows fails. You have two options:* modify the module, so that lilypond is called with the whole path (<code>C:/prog/lilypond/usr/bin/lilypond</code> for example instead of <code>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
Calling lilypond from ConTeXt via shell exit (write18) With bigger projects and the above setup you might run into "too many open files" errors, at least in MacOS X also failsLinux, even if the shell's path is right. (Seems more OSX and other Unix-like write18 wouldn't use the environmentOSes.) Modify Ask your shell about the module (try <tt>which lilypond</tt> to get its path).open files maximum and set it higher:
LilyPond 2.7.26 comes without a command line "version", at least in the MacOS X edition, i.e. the <tt>lilypond.sh</tt> script is missing.Here's it's relevant content: $ ulimit -n #!/bin/sh 256 ## where was the app installed? INSTALLDIR=/Applications if [ " $1" == "ulimit -S -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/" $@n 2048
Save this as <tt>lilypond.sh</tt>, make it executable and symlink it into a directory on your path, e.g. chmod a+x lilypond.sh sudo ln -s lilypond.sh /usr/local/bin/lilypond== Deprecation ==
=== The old LilyPond stops module (t-lilypond) doesn't work any more with an 'Unbound variable' error ===recent versions of ConTeXt, therefore we removed its documentation here.
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:Requests]]

Navigation menu