From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.io/gmane.comp.tex.context/31074 Path: news.gmane.org!not-for-mail From: Henning Hraban Ramm Newsgroups: gmane.comp.tex.context Subject: Re: LilyPond module for LilyPond 2.9.x Date: Wed, 27 Sep 2006 22:26:28 +0200 Message-ID: <46A8585E-FD51-407F-BF80-542AC670FC23@fiee.net> References: <670FE057-FCF8-45F7-AADC-B1B7C947DFF3@fiee.net> <45198C5C.90703@wxs.nl> <6A5E87EB-EBA4-4590-9E46-20812EB3EB36@fiee.net> <451A2E76.8040409@wxs.nl> 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-1-692962607 X-Trace: sea.gmane.org 1159388864 3026 80.91.229.2 (27 Sep 2006 20:27:44 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Wed, 27 Sep 2006 20:27:44 +0000 (UTC) Original-X-From: ntg-context-bounces@ntg.nl Wed Sep 27 22:27:38 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 1GSfzY-0000JC-27 for gctc-ntg-context-518@m.gmane.org; Wed, 27 Sep 2006 22:26:52 +0200 Original-Received: from localhost (localhost [127.0.0.1]) by ronja.ntg.nl (Postfix) with ESMTP id 80B0A1FF35; Wed, 27 Sep 2006 22:26:51 +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 04005-10-3; Wed, 27 Sep 2006 22:26:43 +0200 (CEST) Original-Received: from ronja.vet.uu.nl (localhost [127.0.0.1]) by ronja.ntg.nl (Postfix) with ESMTP id EC7A01FF36; Wed, 27 Sep 2006 22:26:42 +0200 (CEST) Original-Received: from localhost (localhost [127.0.0.1]) by ronja.ntg.nl (Postfix) with ESMTP id 134A91FF36 for ; Wed, 27 Sep 2006 22:26:39 +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 04005-10-2 for ; Wed, 27 Sep 2006 22:26:32 +0200 (CEST) Original-Received: from moutng.kundenserver.de (unknown [212.227.126.186]) by ronja.ntg.nl (Postfix) with SMTP id 4A3481FF35 for ; Wed, 27 Sep 2006 22:26:31 +0200 (CEST) Original-Received: from [83.76.50.65] (helo=[10.128.9.3]) by mrelayeu.kundenserver.de (node=mrelayeu2) with ESMTP (Nemesis), id 0MKwtQ-1GSfzD16NM-0003S6; Wed, 27 Sep 2006 22:26:31 +0200 In-Reply-To: <451A2E76.8040409@wxs.nl> Original-To: mailing list for ConTeXt users 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:31074 Archived-At: --Apple-Mail-1-692962607 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed Am 2006-09-27 um 09:55 schrieb Hans Hagen: >> If I add --ifchanged to the lilypond call, it never does anything; >> without it's called twice (like before, I couldn't find out why). > --ifchanged=filename Ah, great! Here's the new version again (Willi, please try this, no need for patching any more!). I also updated the wiki: http://wiki.contextgarden.net/LilyPond Greetlings from Lake Constance! Hraban --- http://www.fiee.net/texnique/ http://contextgarden.net http://www.cacert.org (I'm an assurer) --Apple-Mail-1-692962607 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.27, %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 \startlines %D staffsize=20, %D indent=0pt, %D time=yes, %D align=?, % default depends on fragment=... %D fragment=no, %D barnumbers=no, %D \stoplines %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{texmfstart --ifchanged=\bufferprefix lilypond-\the\lily!figures.tmp --exec bin:lilypond -b eps -dno-gs-load-fonts -dinclude-eps-fonts \bufferprefix lilypond-\the\lily!figures.tmp} \def\PDF{texmfstart --ifchanged pstopdf \bufferprefix lilypond-\the\lily!figures.eps} \ifeof18 \installprogram{\LP}% \doif\jobsuffix{pdf}{% \installprogram{\PDF}% }% \else \executesystemcommand{\LP}% \doif\jobsuffix{pdf}{% \executesystemcommand{\PDF}% }% \fi \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-1-692962607 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed --Apple-Mail-1-692962607 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-1-692962607--