From: Henning Hraban Ramm <hraban@fiee.net>
Subject: LilyPond module for LilyPond 2.9.x
Date: Tue, 26 Sep 2006 20:34:35 +0200 [thread overview]
Message-ID: <670FE057-FCF8-45F7-AADC-B1B7C947DFF3@fiee.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 505 bytes --]
Yeah, I finally got it working with recent versions of LilyPond!
(The most important change was from "linewidth" to "line-width", and
I overlooked that far too long...)
The module still has lots of issues (e.g. paths for external command
like lilypond are hardcoded), but it does what I want it to do. ;-)
Could someone please exchange the module in the garden?
Greetlings from Lake Constance!
Hraban
---
http://www.fiee.net/texnique/
http://contextgarden.net
http://www.cacert.org (I'm an assurer)
[-- Attachment #2: t-lilypond.tex --]
[-- Type: application/octet-stream, Size: 8940 bytes --]
%D \module
%D [ file=t-lilypond,
%D version=2006.09.26,
%D title=\CONTEXT\ User Modules,
%D subtitle=Lilypond Connections (Music Typesetting),
%D author=Christopher Creutzig \& Henning Hraban Ramm,
%D date=\currentdate,
%D copyright=Christopher Creutzig]
%M \usemodule[lilypond]
%D This module serves to include lilypond music directly in the
%D \CONTEXT\ source, just as \METAPOST\ code can be. Before starting
%D with the implementation, one or two examples are in order.
%D \startbuffer[sample]
%D \startlilypond
%D % Telemann, TWV 40:11
%D \version "2.9.18"
%D
%D \relative c' {
%D \set Staff.instrumentName = flute
%D \key fis \minor
%D \time 3/4
%D \partial 4
%D
%D r8 fis'8 | fis4. cis8 a cis | fis, a cis fis a fis |
%D b, d fis b d b | eis,, gis cis eis gis b, |
%D a fis' gis, fis' cis eis | fis,4 r8
%D a' gis fis | e gis, a e' fis cis |
%D d fis, gis b e d | cis4 \trill r8
%D cis b a | b dis e gis cis, b |
%D a e' dis fis b, a | gis4 \trill r8
%D }
%D \stoplilypond
%D \stopbuffer
%D
%D The input
%D
%D \typebuffer[sample]
%D
%D is typeset as
%D
%D \getbuffer[sample]
%D
%D \type{\startlilypond} accepts options, as in\crlf
%D \type{\startlilypond[staffsize=24, linewidth=14cm, indent=5cm, time=no]}:
%D
%D \nobreak
%D \startlilypond[staffsize=24,linewidth=14cm,indent=5cm,time=no]
%D \version "2.9.18"
%D \relative c' {
%D \set Staff.instrumentName = flute
%D \key fis \minor
%D \time 3/4
%D \partial 4
%D r8 fis'8 | fis4. cis8 a cis | fis, a cis fis a fis |
%D b, d fis b d b | eis,, gis cis eis gis b, |
%D a fis' gis, fis' cis eis | fis,4 r8
%D a' gis fis | e gis, a e' fis cis |
%D d fis, gis b e d | cis4 \trill r8
%D cis b a | b dis e gis cis, b |
%D a e' dis fis b, a | gis4 \trill r8
%D }
%D \stoplilypond
%D
%D It is also possible to mix text and music:
%D \lower 8.2pt\hbox{\lilypond[fragment=true,staffsize=16,time=no]{g'}} is a g.
%D
%D TODO: Complete list of options.
%D
%D staffsize=20,
%D indent=0pt,
%D time=yes,
%D align=?,% default depends on fragment=...
%D fragment=no,
%D barnumbers=no,
%D
%D
%D TODO: The \type{\lower} in the example above should not be necessary.
%D
%D TODO: Switches to turn off the clef etc.
%D
%D TODO: Proper support for multipage results.
%D
%D TODO: lilypond -> \CONTEXT.
%D
%D \page
%D Now for the implementation. As usual, we use a prefix for buffers,
%D \type{\getparameters} etc.:
\unprotect
\def\??lily{lilypond-}
%D Define the text snippets to be placed around fragments.
%D Since lilypond uses similar syntax to \TeX, we must do some catcode fiddling.
\bgroup
\catcode`\/=\@@escape
/catcode`/\=/@@other
/catcode`/#=/@@other
/catcode`/<=/@@begingroup
/catcode`/>=/@@endgroup
/catcode`/{=/@@other
/catcode`/}=/@@other
/catcode`/%=/@@other
/gdef/lily!fragmentprefix<
/string^^J
/string^^J
{/string^^J
% ly snippet contents follows:/string^^J
>
/gdef/lily!fragmentsuffix</string^^J
% end ly snippet/string^^J
}/string^^J
>
/gdef/lily!prefix</string^^J
%#(set! toplevel-score-handler print-score-with-defaults)/string^^J
%#(set! toplevel-music-handler
(lambda (p m)
(if (not (eq? (ly:music-property m 'void) #t))
(print-score-with-defaults
p (scorify-music m p)))))/string^^J
/string^^J
#(ly:set-option (quote no-point-and-click))/string^^J
/string^^J
%#(define version-seen #t)/string^^J
\version "2.9.18"/string^^J
/iflily!time/else
% switch off time signature/string^^J
\layout {
ragged-last = ##t
\context {
\Score
timing = ##f
}/string^^J
\context {
\Staff
\remove "Time_signature_engraver"
}
}/string^^J
/fi
/iflily!barnumbers/else
% switch off bar numbers/string^^J
\layout {
\context {
\Score
\remove "Bar_number_engraver"
}
}/string^^J
/fi
\paper {/string^^J
#(define dump-extents #t)/string^^J
ragged-right = /iflily!align ##f/else ##t/fi/string^^J
indent = /withoutpt/the/lily!indent\pt/string^^J
line-width = /withoutpt/the/lily!linewidth\pt/string^^J
vsize = /withoutpt/the/lily!vsize\pt/string^^J
printpagenumber = ##f/string^^J
oddFooterMarkup=##f/string^^J
oddHeaderMarkup=##f/string^^J
bookTitleMarkup = ##f/string^^J
scoreTitleMarkup = ##f/string^^J
}/string^^J
>
/gdef/lily!hash<#>
/egroup
\newdimen\lily!linewidth
\newdimen\lily!vsize
\newdimen\lily!indent
\newif\iflily!align
\newif\iflily!time
\newif\iflily!barnumbers
\newcount\lily!figures
%D Again, as usual, there is a \type{\setuplilypond} command
%D that accepts the same parameters as \type{\lilypond} and
%D \type{\startlilypond} do in their optional argument:
\def\setuplilypond{\dosingleempty\dosetuplilypond}
\def\dosetuplilypond[#1]{%
\getparameters[\??lily][#1]%
}
%D We set the following defaults:
\setuplilypond
[staffsize=20,
indent=0pt,
time=\v!yes,
align=?,% default depends on fragment=...
fragment=\v!no,
barnumbers=\v!no,
]
%D \type{\startlilypond} is a multistage implementation, because
%D end-of-line characters must be treated specially in the
%D \type{\startlilypond}\textellipsis\type{\stoplilypond} range.
\def\startlilypond{\dosingleempty\dostartlilypond}
\def\dostartlilypond[#1]{%
\bgroup
\obeylines
\dodostartlilypond[{#1}]%
}
\long\def\dodostartlilypond[#1]#2\stoplilypond{%
\egroup% from \dostartlilypond
\bgroup%
%D The default of the \type{linewidth} parameter is the local
%D \type{\hsize}.
\setlocalhsize
\getparameters[\??lily][linewidth=\the\localhsize,height=\the\textheight,#1]%
\lily!linewidth\dimexpr\getvalue{\??lily linewidth}\relax
\lily!vsize\dimexpr\getvalue{\??lily height}\relax
\lily!indent\dimexpr\getvalue{\??lily indent}\relax
%D The default of \type{align} depends on whether we typeset a fragment:
\@EAEAEA\doifelse\getvalue{\??lily align}{\v!yes}%
\lily!aligntrue\lily!alignfalse
\@EAEAEA\doif\getvalue{\??lily fragment}{\v!no}{%
\@EAEAEA\doif\getvalue{\??lily align}?
\lily!aligntrue
}%
\@EAEAEA\doifelse\getvalue{\??lily time}\v!yes
\lily!timetrue\lily!timefalse
%D We are using a counter to keep the different lilypond pieces
%D separate. This allows to typeset them only once, during the
%D first run.
%D
%D TODO: This won't work any longer once we pass the remaining
%D vertical space to lilypond.
\global\advance\lily!figures\plusone
\startmode[*\v!first]%
\def\obeyedlines{\string^^J}%
\convertargument#2\to\ascii
\expanded{%
\setbuffer[lilypond-\the\lily!figures]%
\lily!prefix
\lily!hash(set-global-staff-size \getvalue{\??lily staffsize})\string^^J%
\ifundefined{\??lily fragment}\else\lily!fragmentprefix\fi
%% TODO: Option "packed"
\ascii%
\ifundefined{\??lily fragment}\else\lily!fragmentsuffix\fi
}%
\endbuffer%
%D Generating a pdf directly always creates a whole page, so we generate eps first.
%D If \type{\ifeof18} creates an error for you, your pdfetex is too old.
%D just change it to \iftrue then. (\type{\ifeof18} checks whether \type{\write18}
%D is disabled.)
\def\LP{/usr/local/bin/lilypond -b eps -f eps -dno-gs-load-fonts -dinclude-eps-fonts }
\def\TU{/usr/local/teTeX/bin/powerpc-apple-darwin-current/texutil }
\def\toPDF{/usr/local/teTeX/bin/powerpc-apple-darwin-current/epstopdf }
%\def\toPDF{\TU --figures --epstopdf } % not yet in Ruby version
\ifeof18
\installprogram{\LP \bufferprefix lilypond-\the\lily!figures.tmp}%
\else
\executesystemcommand{\LP \bufferprefix lilypond-\the\lily!figures.tmp}%
%\executesystemcommand{rm \bufferprefix lilypond-\the\lily!figures-systems.tex}
%\executesystemcommand{rm \bufferprefix lilypond-\the\lily!figures-systems.texi}
\fi
\doif\jobsuffix{pdf}{%
\executesystemcommand{\toPDF \bufferprefix lilypond-\the\lily!figures.eps}%
%\executesystemcommand{rm \bufferprefix lilypond-\the\lily!figures.eps}
}%
\stopmode% only first run
\doifelse\jobsuffix{pdf}
{\edef\lily!img{\bufferprefix lilypond-\the\lily!figures.pdf}}%
{\edef\lily!img{\bufferprefix lilypond-\the\lily!figures.eps}}%
%D
%D TODO: Get the relevant dimension directly from lilypond,
%D to place the instrument name into the left margin for
%D short snippets as well.
%D If we are not in the middle of some text, we have to check
%D whether lilypond created an image that is wider than requested:
%D It places the instrument names in the left margin.
\ifvmode
\getfiguredimensions[\bufferprefix lilypond-\the\lily!figures.pdf]%
\leavevmode%
\newdimen\FigWidth
\FigWidth=\figurewidth
\ifdim\FigWidth>\localhsize
\!!dimena=\localhsize
\advance\!!dimena by-\FigWidth
\noindent\hskip\!!dimena
\fi
\fi
\externalfigure[\lily!img]%
\egroup%
}%
%D For short snippets, we define an inline alternative to
%D our start/stop pair:
\def\lilypond{\dosingleempty\dolilypond}
\def\dolilypond[#1]#2{\startlilypond[#1]#2\stoplilypond}
\protect
%D End of file
[-- Attachment #3: Type: text/plain, Size: 1 bytes --]
[-- Attachment #4: Type: text/plain, Size: 139 bytes --]
_______________________________________________
ntg-context mailing list
ntg-context@ntg.nl
http://www.ntg.nl/mailman/listinfo/ntg-context
next reply other threads:[~2006-09-26 18:34 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-09-26 18:34 Henning Hraban Ramm [this message]
2006-09-26 20:12 ` Henning Hraban Ramm
2006-09-26 20:23 ` Hans Hagen
2006-09-26 20:52 ` Henning Hraban Ramm
2006-09-27 7:55 ` Hans Hagen
2006-09-27 20:26 ` Henning Hraban Ramm
2006-09-27 22:22 ` Henning Hraban Ramm
2006-10-03 21:37 ` Henning Hraban Ramm
2006-10-03 21:59 ` Mojca Miklavec
2006-10-04 0:18 ` Henning Hraban Ramm
2006-09-26 21:41 ` Willi Egger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=670FE057-FCF8-45F7-AADC-B1B7C947DFF3@fiee.net \
--to=hraban@fiee.net \
--cc=ntg-context@ntg.nl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).