From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.io/gmane.comp.tex.context/31029 Path: news.gmane.org!not-for-mail From: Henning Hraban Ramm Newsgroups: gmane.comp.tex.context Subject: LilyPond module for LilyPond 2.9.x Date: Tue, 26 Sep 2006 20:34:35 +0200 Message-ID: <670FE057-FCF8-45F7-AADC-B1B7C947DFF3@fiee.net> Reply-To: mailing list for ConTeXt users NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 (Apple Message framework v752.2) Content-Type: multipart/mixed; boundary=Apple-Mail-6-599849515 X-Trace: sea.gmane.org 1159295746 23268 80.91.229.2 (26 Sep 2006 18:35:46 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Tue, 26 Sep 2006 18:35:46 +0000 (UTC) Original-X-From: ntg-context-bounces@ntg.nl Tue Sep 26 20:35:42 2006 Return-path: Envelope-to: gctc-ntg-context-518@m.gmane.org Original-Received: from ronja.vet.uu.nl ([131.211.172.88] helo=ronja.ntg.nl) by ciao.gmane.org with esmtp (Exim 4.43) id 1GSHlk-0000Ch-Bs for gctc-ntg-context-518@m.gmane.org; Tue, 26 Sep 2006 20:35:00 +0200 Original-Received: from localhost (localhost [127.0.0.1]) by ronja.ntg.nl (Postfix) with ESMTP id E47A61FF19; Tue, 26 Sep 2006 20:34:59 +0200 (CEST) Original-Received: from ronja.ntg.nl ([127.0.0.1]) by localhost (smtp.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 28671-01-3; Tue, 26 Sep 2006 20:34:52 +0200 (CEST) Original-Received: from ronja.vet.uu.nl (localhost [127.0.0.1]) by ronja.ntg.nl (Postfix) with ESMTP id 6571B1FE57; Tue, 26 Sep 2006 20:34:52 +0200 (CEST) Original-Received: from localhost (localhost [127.0.0.1]) by ronja.ntg.nl (Postfix) with ESMTP id 0EED81FE57 for ; Tue, 26 Sep 2006 20:34:48 +0200 (CEST) Original-Received: from ronja.ntg.nl ([127.0.0.1]) by localhost (smtp.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 28671-01-2 for ; Tue, 26 Sep 2006 20:34:42 +0200 (CEST) Original-Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.187]) by ronja.ntg.nl (Postfix) with SMTP id 9F4C61FE18 for ; Tue, 26 Sep 2006 20:34:39 +0200 (CEST) Original-Received: from [62.203.216.29] (helo=[10.128.9.3]) by mrelayeu.kundenserver.de (node=mrelayeu2) with ESMTP (Nemesis), id 0MKwtQ-1GSHlN0GH9-0003V0; Tue, 26 Sep 2006 20:34:37 +0200 Original-To: ConTeXt ML X-Mailer: Apple Mail (2.752.2) X-Provags-ID: kundenserver.de abuse@kundenserver.de login:71ece21a21b2fa6ef1812787a4eaee0e X-Virus-Scanned: amavisd-new at ntg.nl X-BeenThere: ntg-context@ntg.nl X-Mailman-Version: 2.1.7 Precedence: list List-Id: mailing list for ConTeXt users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: ntg-context-bounces@ntg.nl Errors-To: ntg-context-bounces@ntg.nl X-Virus-Scanned: amavisd-new at ntg.nl Xref: news.gmane.org gmane.comp.tex.context:31029 Archived-At: --Apple-Mail-6-599849515 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed 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) --Apple-Mail-6-599849515 Content-Transfer-Encoding: 7bit Content-Type: application/octet-stream; x-mac-type=54455854; x-unix-mode=0600; x-mac-creator=54655873; name=t-lilypond.tex Content-Disposition: attachment; filename=t-lilypond.tex %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 /gdef/lily!prefix /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 --Apple-Mail-6-599849515 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed --Apple-Mail-6-599849515 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ ntg-context mailing list ntg-context@ntg.nl http://www.ntg.nl/mailman/listinfo/ntg-context --Apple-Mail-6-599849515--