Difference between revisions of "LilyPond"

From Wiki
Jump to navigation Jump to search
m (some unimportant cosmetics)
m (fix link of filter module)
(36 intermediate revisions by 7 users not shown)
Line 1: Line 1:
 
< [[Graphics]] | [[Using Graphics]] >
 
< [[Graphics]] | [[Using Graphics]] >
  
[http://www.lilypond.org LilyPond] is a great music engraver, and you can include LilyPond in ConTeXt source using [[modules:t-lilypond|the lilypond module]].
+
[http://lilypond.org LilyPond] is a great music engraver, and you can include LilyPond in ConTeXt source using [https://github.com/adityam/filter the 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].)
  
== Setup ==
+
== 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 [http://www.lilypond.org LilyPond] installation (version 2.8+) plus dependencies like GhostScript.
 
* Include the lilypond module
 
 
<texcode>
 
<texcode>
\usemodule[lilypond]
+
\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>
 
</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 that.
 
  
=== options ===
+
== Multi Page Filter Setup ==
{| 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
 
|-
 
| time || yes/no || yes || count the time (i.e. show time signature, draw bars, split the staff)?
 
|-
 
| clef || yes/no || yes || show the clef?
 
|-
 
| align || yes/no || depends on fragment || ragged-right = (not align)
 
|-
 
| fragment || yes/no || no || typeset only a snippet (instead of a whole line)?
 
|-
 
| barnumbers || yes/no || no || show measure numbers?
 
|-
 
| seriffont || "name" || "Century Schoolbook L" || serif font (e.g. for Lyrics and \markup)
 
|-
 
| sansfont || "name" || "LMSans10" || sans serif font (e.g. for chords)
 
|-
 
| monofont || "name" || "Bitstream Vera Sans Mono" || 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>
 
<texcode>
There are some notes \lilypond{ \relative{bes a c b} } embedded in this line.
+
\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"}]
 
</texcode>
 
</texcode>
  
== Sections ==
 
  
E.g. for 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 [[MetaPost]] code:
+
== 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>
\section{A Tune}
 
 
 
\startlilypond
 
\startlilypond
\relative {
+
\include "mysettings.ly"
\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 |
 
e2. e4 |
 
f g f8 e d4 |
 
e f e c |
 
a c b8 a g4 |
 
}
 
\alternative {
 
{ \partial 2. g2. }
 
{ \partial 2. a2. }
 
}
 
}
 
 
\stoplilypond
 
\stoplilypond
 +
</texcode>
 +
 +
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".
 +
In short: you can inline your complete LilyPond settings or at least the include line:
 +
 +
<texcode>
 +
\startbuffer[lilypond::settings]
 +
\include "mysettings.ly"
 +
\stopbuffer
  
There's nothing to say about this tune yet; my friend heard it from Lúnasa.
+
\defineexternalfilter[lilypond][
 +
...
 +
bufferbefore={lilypond::settings},
 +
...]
 
</texcode>
 
</texcode>
 +
 +
=== Sample Include File ===
 +
 +
"mysettings.ly" could look like this:
  
 
<texcode>
 
<texcode>
\section{Starlight (round)}
+
\version "2.18.2"
 +
#(ly:set-option (quote no-point-and-click))
 +
#(set-global-staff-size 14)
 +
 
 +
% --- start of setup for single-line output files ---
 +
#(define default-toplevel-book-handler
 +
  print-book-with-defaults-as-systems )
 +
 
 +
#(define toplevel-book-handler
 +
  (lambda ( . rest)
 +
  (set! output-empty-score-list #f)
 +
  (apply print-book-with-defaults rest)))
 +
 
 +
#(define toplevel-music-handler
 +
  (lambda ( . rest)
 +
  (apply collect-music-for-book rest)))
 +
 
 +
#(define toplevel-score-handler
 +
  (lambda ( . rest)
 +
  (apply collect-scores-for-book rest)))
 +
 
 +
#(define toplevel-text-handler
 +
  (lambda ( . rest)
 +
  (apply collect-scores-for-book rest)))
 +
 
 +
#(set! output-empty-score-list #t)
 +
 
 +
% --- stop single-line setup ---
 +
 
 +
\paper {
 +
#(define dump-extents #t)
 +
indent = 0\mm
 +
ragged-bottom = ##t
 +
ragged-last-bottom = ##t
 +
print-page-number = ##f
 +
line-width = 120\mm
 +
oddFooterMarkup  = ##f
 +
oddHeaderMarkup  = ##f
 +
bookTitleMarkup  = ##f
 +
scoreTitleMarkup = ##f
 +
}
  
\startlilypond
+
\layout {
<<
+
#(layout-set-staff-size 14) % beware, this resets fonts!
\context Staff = onlyone <<
+
% set fonts for rm / ss / tt
\clef treble
+
#(define fonts (make-pango-font-tree "TeX Gyre Schola" "LMSans10" "LMTypewriter10 Regular" (/ 14 20)))
\key a \major
+
\context { \Score
\time 6/8
+
\remove "Bar_number_engraver"
\context Voice = one {
+
\override PaperColumn #'keep-inside-line = ##t
\relative c'' {
+
}
a4.^\markup{1.} e' |
+
        % some example settings
e8( d cis) b4. |
+
\context { \Staff
e4.^\markup{2.} d4 d8 |
+
  \override TimeSignature #'style = #'numbered
cis( b) a b4 e,8 |
+
}
a4 a8 gis( a) b |
+
\context { \ChordNames
cis4 cis8 b( cis d) |
+
chordChanges = ##t
cis( d) e e4 e,8 |
+
majorSevenSymbol = \markup{ 7+ }
fis4 fis8 gis4.
 
}
 
}
 
>>
 
\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 -- night.
 
 
}
 
}
 
}
 
}
>>
 
  
\stoplilypond
 
 
</texcode>
 
</texcode>
  
== Font hints ==
+
Please look up the meaning of settings in [http://lilypond.org/doc/v2.18/Documentation/web/manuals LilyPond’s great documentation]!
 +
 
 +
If you’d like to exchange measures like text width between ConTeXt and LilyPond, you could write those into the LilyPond buffer.
 +
To give LilyPond measures to ConTeXt, you would need to write them into a temp file (using Scheme) and read that in again (useing Lua).
 +
For the time being this is left as an exercise to the user. ;)
 +
 
 +
Unfortunately you can’t define LilyPond’s text (lyrics) size with an absolute value, but only relative to staff size...
 +
 
 +
== Named Buffers ==
 +
 
 +
Normally, your LilyPond snippets just get a running number. If you re-order your scores, each one gets re-rendered.
 +
 
 +
You can avoid that if you name your LilyPond snippets: just add <tt>[name=myfunnyname]</tt> to <cmd>startlilypond</cmd>.
 +
 
 +
If you have just one LilyPond part per component (e.g. songs in a songbook), you could use <tt>[name=\currentcomponent]</tt>.
 +
 
 +
== Automatical width adaption ==
 +
 
 +
If you want to set your note line width automatically to your current text width, try this:
 +
 
 +
  -- this goes after "create temp folder"
 +
  io.savedata("\LILYTEMP/texsettings.ly", "\\paper { line-width = " ..
 +
string.gsub(number.todimen(tex.dimen.textwidth),"pt","\\pt") .. " } \n")
 +
 
 +
and then adapt your snippets or preamble buffer:
 +
<texcode>
 +
\include "../mysettings.ly"
 +
\include "texsettings.ly"
 +
</texcode>
  
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.
+
You must comment/delete the "line-width" setting in mysettings.ly, otherwise it doesn’t work.
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
+
== Example ==
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 this:
+
Here's an example of placing score snippets in the body of the text, with fonts in the score & body matching:
  
 
<texcode>
 
<texcode>
\starttypescript[wiki][songbook]
+
\def\LILYTEMP{lilytemp} % name of folder for LilyPond/buffer files
\usetypescript [serif] [schoolbook] [\defaultencoding]
+
 
\definetypeface [songbook] [rm] [serif] [schoolbook] [default] [encoding=\defaultencoding]
+
\def\ParseLilypondFile#1% #1 is the name of the output file
\definetypeface [songbook] [ss] [sans]  [default][default] [encoding=ec]
+
  {\ctxlua{thirddata.parselilypondfile("#1")}}
\definetypeface [songbook] [tt] [mono] [default][default] [encoding=ec]
+
 
\stoptypescript
+
\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("\\setupfloats[location=right,frame=off]\\placefigure[none]{}{\\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 -dinclude-eps-fonts -dno-gs-load-fonts -o"\LILYTEMP/\externalfilterbasefile" "\externalfilterinputfile"}]
 +
 
 +
  \setuplayout[textwidth=6in] % matches line-width below
 +
\definefontfeature[main][protrusion=quality, expansion=quality]
 +
\definefontfamily[mainface][rm][Adobe Jenson Pro][features=main]
 +
\setupbodyfont[mainface,13pt]
 +
\setupalign[hz,hanging]
 +
 
 +
\starttext
  
\usetypescript [wiki] [songbook]
+
\input zapf
\setupbodyfont[songbook, rm, 8.5pt]
 
</texcode>
 
  
 +
\startlilypond
  
== Developer's Corner ==
+
\layout{
 +
  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/4
  
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 lilypond-book 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.
+
  a b c d
 +
}
  
Things that have not been implemented yet include:
+
text = \lyricmode {
* make lilypond call back on ConTeXt for included TeX (cf. [http://lsr.dsi.unimi.it/LSR/Item?id=107])
+
Aaa Bee Cee Dee
* get information from lilypond about the baseline, for run-in music fragments
+
}
* tell lilypond how much space is left on the first page
 
* check and probably work on proper multi-page music
 
  
To remember:
+
upper = \relative c'' {
* see [http://lilypond.org/doc/v2.9/Documentation/ LilyPond Docs]!
+
  \clef treble
* How do we handle version/syntax changes of LilyPond?
+
  \key c \major
 +
  \time 2/4
  
--[[User:ChristopherCreutzig|Christopher Creutzig]] after ideas by [[User:Hraban|Hraban]]
+
  a4 b c d
 +
}
  
== Older Workarounds ==
+
lower = \relative c {
 +
  \clef bass
 +
  \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!'''
+
  a2 c
 +
}
  
=== LilyPond is not found ===
+
\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 }
 +
  }
 +
}
  
Calling lilypond from command line in Windows fails. (Seems like a bug in lilypond.)
+
\stoplilypond
 +
\input tufte
  
You have two options:
+
\stoptext
* 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).
+
</texcode>
* 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) 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).
+
== Too many open files ==
  
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.
+
With bigger projects and the above setup you might run into "too many open files" errors, at least in Linux, OSX and other Unix-like OSes.
Here's it's relevant content:
+
Ask your shell about the open files maximum and set it higher:
  
#!/bin/sh
+
  $ ulimit -n
## where was the app installed?
+
  256
INSTALLDIR=/Applications
+
  $ ulimit -S -n 2048
 
if [ "$1" == "--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 and symlink it into a directory on your path, e.g.
+
== Deprecation ==
chmod a+x lilypond.sh
 
sudo ln -s lilypond.sh /usr/local/bin/lilypond
 
  
=== LilyPond stops with an 'Unbound variable' error ===
+
The old LilyPond module (t-lilypond) doesn't work any more with 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:Modules]]
[[Category:Music]]
 
[[Category:Requests]]
 

Revision as of 20:15, 22 February 2018

< Graphics | Using Graphics >

LilyPond is a great music engraver, and you can include LilyPond in ConTeXt source using the 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: 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:

\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"}]

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.

\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"}]


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:

\startlilypond
\include "mysettings.ly"
...
\stoplilypond

You can avoid this \include line following filter module documentation, section "Prepend and append text". In short: you can inline your complete LilyPond settings or at least the include line:

\startbuffer[lilypond::settings]
\include "mysettings.ly"
\stopbuffer

\defineexternalfilter[lilypond][
	...
	bufferbefore={lilypond::settings},
	...]

Sample Include File

"mysettings.ly" could look like this:

\version "2.18.2"
#(ly:set-option (quote no-point-and-click))
#(set-global-staff-size 14)

% --- start of setup for single-line output files ---
#(define default-toplevel-book-handler
  print-book-with-defaults-as-systems )

#(define toplevel-book-handler
  (lambda ( . rest)
  (set! output-empty-score-list #f)
  (apply print-book-with-defaults rest)))

#(define toplevel-music-handler
  (lambda ( . rest)
   (apply collect-music-for-book rest)))

#(define toplevel-score-handler
  (lambda ( . rest)
   (apply collect-scores-for-book rest)))

#(define toplevel-text-handler
  (lambda ( . rest)
   (apply collect-scores-for-book rest)))

#(set! output-empty-score-list #t)

% --- stop single-line setup ---

\paper {
	#(define dump-extents #t)
	indent = 0\mm
	ragged-bottom = ##t
	ragged-last-bottom = ##t
	print-page-number = ##f
	line-width = 120\mm
	oddFooterMarkup  = ##f
	oddHeaderMarkup  = ##f
	bookTitleMarkup  = ##f
	scoreTitleMarkup = ##f
}

\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
	\context { \Staff
  		\override TimeSignature #'style = #'numbered
 	}
	\context { \ChordNames
		chordChanges = ##t
		majorSevenSymbol = \markup{ 7+ }
	}
}

Please look up the meaning of settings in LilyPond’s great documentation!

If you’d like to exchange measures like text width between ConTeXt and LilyPond, you could write those into the LilyPond buffer. To give LilyPond measures to ConTeXt, you would need to write them into a temp file (using Scheme) and read that in again (useing Lua). For the time being this is left as an exercise to the user. ;)

Unfortunately you can’t define LilyPond’s text (lyrics) size with an absolute value, but only relative to staff size...

Named Buffers

Normally, your LilyPond snippets just get a running number. If you re-order your scores, each one gets re-rendered.

You can avoid that if you name your LilyPond snippets: just add [name=myfunnyname] to \startlilypond.

If you have just one LilyPond part per component (e.g. songs in a songbook), you could use [name=\currentcomponent].

Automatical width adaption

If you want to set your note line width automatically to your current text width, try this:

 -- this goes after "create temp folder"
 io.savedata("\LILYTEMP/texsettings.ly", "\\paper { line-width = " .. 
	string.gsub(number.todimen(tex.dimen.textwidth),"pt","\\pt") .. " } \n")

and then adapt your snippets or preamble buffer:

\include "../mysettings.ly"
\include "texsettings.ly"

You must comment/delete the "line-width" setting in mysettings.ly, otherwise it doesn’t work.

Example

Here's an example of placing score snippets in the body of the text, with fonts in the score & body matching:

\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("\\setupfloats[location=right,frame=off]\\placefigure[none]{}{\\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 -dinclude-eps-fonts -dno-gs-load-fonts -o"\LILYTEMP/\externalfilterbasefile" "\externalfilterinputfile"}]

 \setuplayout[textwidth=6in] % matches line-width below
\definefontfeature[main][protrusion=quality, expansion=quality]
\definefontfamily[mainface][rm][Adobe Jenson Pro][features=main]
\setupbodyfont[mainface,13pt]
\setupalign[hz,hanging]

\starttext

\input zapf

\startlilypond

\layout{
  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/4

  a b c d
}

text = \lyricmode {
Aaa Bee Cee Dee
}

upper = \relative c'' {
  \clef treble
  \key c \major
  \time 2/4

  a4 b c d
}

lower = \relative c {
  \clef bass
  \key c \major
  \time 2/4

  a2 c
}

\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 }
  }
}

\stoplilypond
\input tufte

\stoptext

Too many open files

With bigger projects and the above setup you might run into "too many open files" errors, at least in Linux, OSX and other Unix-like OSes. Ask your shell about the open files maximum and set it higher:

 $ ulimit -n
 256
 $ ulimit -S -n 2048

Deprecation

The old LilyPond module (t-lilypond) doesn't work any more with recent versions of ConTeXt, therefore we removed its documentation here.