ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
From: Henning Hraban Ramm <hraban@fiee.net>
To: mailing list for ConTeXt users <ntg-context@ntg.nl>
Subject: Re: lilypond
Date: Fri, 6 Jul 2007 22:25:05 +0200	[thread overview]
Message-ID: <7F1631B9-8C3B-430D-A1C9-2B4EA842CFA2@fiee.net> (raw)
In-Reply-To: <468A8E78.23950.111C4FD@wwl.musensturm.de>

[-- Attachment #1: Type: text/plain, Size: 1082 bytes --]

Am 2007-07-03 um 17:59 schrieb Wolfgang Werners-Lucchini:

> I tryed the first wiki-example:
> --------------------------------
> There are some notes \lilypond{ \relative{bes a c b} } embedded in
> this line.
> --------------------------------
>
> With version 2.11.27 the lilypond option -b eps is unknown.
> With version 2.10.25 the above example is a 3-page output:
> (1) There are some notes
> (2) lilypond-output
> (3) embedded in this line
>
> Should I downgrad with lilypond?
> Or what else I am doing wrong?

Sorry, the publicly available LilyPond module is outdated. Try the  
attached one.

I delayed the publishing of my latest version because Ruby texexec  
had a bug that prevented lilypond from being called, I guess that's  
gone, but I had no time to check yet. And I didn't adapt the module  
to LilyPond 2.11, too. (2.10.2x should work.)

I don't know if inline LilyPond worked at any time, though; I never  
needed it.

Greetlings from Lake Constance!
Hraban
---
http://www.fiee.net/texnique/
http://wiki.contextgarden.net
https://www.cacert.org (I'm an assurer)

[-- Attachment #2: t-lilypond.tex --]
[-- Type: application/octet-stream, Size: 11483 bytes --]

%D \module
%D	[		 file=t-lilypond,
%D		    version=2007.05.23,
%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]
%C
%C	This module is in the public domain.

%M \usemodule[lilypond]

%D This module serves to include LilyPond music directly in the
%D \CONTEXT\ source, just as \METAPOST\ code can be.
%D It should work from LilyPond version 2.8, but you should always use 
%D the latest stable version of LilyPond (this is tested with 2.10.23).
%D Before starting with the implementation, one or two examples are in order.
%D
%D \startbuffer[sample]
%D % Telemann, TWV 40:11
%D \startlilypond
%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,clef=no]}:
%D 
%D \nobreak
%D \startlilypond[staffsize=24,linewidth=14cm,indent=5cm,time=no,clef=no]
%D %\version "2.10.23" % not necessary, the module adds a version statement
%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 {\bfa Complete list of options:}
%D
%D \starttabulate[|l|l|l|]
%D	\NC	option\NC	default\NC	comment\NC\NR
%D	\HL
%D	\NC	staffsize\NC	20\NC	 in pt	\NC\NR
%D	\NC	indent\NC	0pt\NC	 first line indent	\NC\NR
%D	\NC	time\NC	yes\NC	 count time? (i.e. show time signature, set bars, split line)	\NC\NR
%D	\NC	clef\NC	yes\NC	 show clef?	\NC\NR
%D	\NC	linewidth\NC	\\localhsize\NC		\NC\NR
%D	\NC	betweensystemspace\NC	54pt\NC	space between systems	\NC\NR
%D	\NC	height\NC	\\textheight\NC		\NR
%D	\NC	align\NC	?\NC	 default depends on fragment=...	\NC\NR
%D	\NC	fragment\NC	no\NC		\NC\NR
%D	\NC	barnumbers\NC	no\NC	 show numbers of measures?	\NC\NR
%D	\NC	showempty\NC	no\NC	 drop empty staves?	\NC\NR
%D	\NC	seriffont\NC	"Century Schoolbook L"\NC	 font for e.g. lyrics	\NC\NR
%D	\NC	sansfont\NC	"LMSans10"\NC	 font for e.g. chords	\NC\NR
%D	\NC	monofont\NC	"Courier" \NC	 normally not used	\NC\NR
%D \stoptabulate
%D
%D TODO: The \type{\lower} in the example above should not be necessary.
%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.:

\writestatus{loading}{LilyPond module}
\startmodule[lilypond]

\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.
\def\lily!slash{/}

\bgroup
\catcode`\/=\@@escape
/catcode`/\=/@@other
/catcode`/#=/@@other
/catcode`/<=/@@begingroup
/catcode`/>=/@@endgroup
/catcode`/{=/@@other
/catcode`/}=/@@other
/catcode`/%=/@@other
/catcode`/-=/@@letter
/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
/string^^J
#(ly:set-option (quote no-point-and-click))/string^^J
/string^^J
\version "2.10.23"/string^^J
#(define version-seen? #t)/string^^J
\layout {/string^^J
/iflily!time/else
% switch off time signature (i.e. only one line, no bars)/string^^J
	ragged-last = ##t/string^^J
	\context { \Score timing = ##f }/string^^J
	\context { \Staff \remove "Time_signature_engraver" }/string^^J
/string^^J/fi
/iflily!barnumbers/else
% switch off bar numbers/string^^J
	\context { \Score \remove "Bar_number_engraver" }/string^^J
/fi
/string^^J
/iflily!showempty/else
% drop empty staves/string^^J
	\context { \RemoveEmptyStaffContext }/string^^J
	\context { \Score \override VerticalAxisGroup #'remove-first = ##t }/string^^J
/fi
/string^^J
/iflily!clef/else
% switch off clef sign/string^^J
	\context { \Staff \remove "Clef_engraver" }/string^^J
/fi
/string^^J
	#(define fonts
		(make-pango-font-tree
		/lilypond-seriffont/space
		/lilypond-sansfont/space
		/lilypond-monofont/space
	(/lily!slash/space/lilypond-staffsize/space 20)))/string^^J
/string^^J
}/string^^J
\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
	ragged-bottom=##t/string^^J
	ragged-last-bottom=##t/string^^J
	between-system-padding = #0/string^^J
	between-system-space = /withoutpt/the/lily!betweensystemspace\pt/string^^J
}/string^^J
>

/gdef/lily!hash<#>
/egroup

\newdimen\lily!linewidth
\newdimen\lily!vsize
\newdimen\lily!indent
\newdimen\lily!betweensystemspace
\newif\iflily!align
\newif\iflily!clef
\newif\iflily!time
\newif\iflily!barnumbers
\newif\iflily!showempty

\newcounter\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{%
  \start\catcode`\#=\@@other%
  \dosingleempty\dosetuplilypond%
}

\def\dosetuplilypond[#1]{%
  \stop% restore \catcode`\#
  \getparameters[\??lily][#1]%
}

%D We set the following defaults:
\setuplilypond
	[staffsize=20,
	indent=0pt,
	betweensystemspace=54pt,
	time=\v!yes,
	clef=\v!yes,
	align=?,	% default depends on fragment=...
	fragment=\v!no,
	barnumbers=\v!no,
	showshowemptyempty=\v!no,
	seriffont="Century Schoolbook L", % LilyPond default font
	sansfont="LMSans10",
	monofont="Bitstream Vera Sans Mono",
	]

%D If you want to know which fonts of your system LilyPond can see
%D with which names, try \type{lilypond -dshow-available-fonts any}.
%D (The 3rd parameter is necessary, but can be anything.)
%D There are a lot of restrictions, e.g. no fonts from the \TeX\ tree (don't know why),
%D only one face per font file etc.

%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%
	\catcode`\#=\@@other%
	\dodostartlilypond[{#1}]%
}

\def\doprocesslilypond#1{%
	\edef\LPFN{#1}%
	\writestatus{DEBUG-w18}{\LPFN}%
	\installprogram{texmfstart --ifchanged=\LPFN.tmp --exec bin:lilypond -b eps -dno-gs-load-fonts -dinclude-eps-fonts \LPFN.tmp}%
	\doif\jobsuffix{pdf}{%
		\installprogram{texmfstart --ifchanged=\LPFN.eps pstopdf \LPFN.eps}%
	}%
}

\long\def\dodostartlilypond[#1]#2\stoplilypond{%
	\egroup% from \dostartlilypond
	\bgroup%
%D The default of the \type{linewidth} parameter is the local \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
	\lily!betweensystemspace\dimexpr\getvalue{\??lily betweensystemspace}\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
	\@EAEAEA\doifelse\getvalue{\??lily barnumbers}\v!yes
		\lily!barnumberstrue\lily!barnumbersfalse
	\@EAEAEA\doifelse\getvalue{\??lily showempty}\v!yes
		\lily!showemptytrue\lily!showemptyfalse
	\@EAEAEA\doifelse\getvalue{\??lily clef}\v!yes
		\lily!cleftrue\lily!cleffalse
%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
	\doglobal\increment\lily!figures
	\def\lily!filename{\bufferprefix lilypond-\lily!figures}%\the
	%\writestatus{buffering}{\lily!filename}
	%\startmode[*\v!first]% 
	\def\obeyedlines{\string^^J}%
	\convertargument#2\to\ascii
	\expanded{%
	\setbuffer[lilypond-\lily!figures]%\the
	\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
	}% expanded
	\endbuffer%
%D Generating a PDF directly always creates a whole page, so we generate EPS first.
%D
%D If \type{\ifeof18} creates an error for you, your pdfe\TeX\ is too old.
%D just change it to \type{\iftrue} then.
%D (\type{\ifeof18} checks whether \type{\write18} is disabled.)
	
	%\def\LP{echo LILYPOND \lily!filename.tmp}
	%\def\PDF{echo PStoPDF \lily!filename.eps}
	\edef\LP{texmfstart --ifchanged=\lily!filename .tmp --exec bin:lilypond -b eps -dno-gs-load-fonts -dinclude-eps-fonts \lily!filename .tmp}
	\edef\PDF{texmfstart --ifchanged=\lily!filename .eps pstopdf \lily!filename .eps}
	%\doprocesslilypond{\lily!filename}
	\ifeof18
		\writestatus{DEBUG-w18}{\LP}%
		\expanded{\installprogram{\LP}}%
		\doif\jobsuffix{pdf}{%
			\installprogram{\PDF}%
		}%
	\else
		\writestatus{DEBUG-EXE}{\LP}%
		\executesystemcommand{\LP}%
		\doif\jobsuffix{pdf}{%
			\executesystemcommand{\PDF}%
		}%
	\fi
	%\stopmode% only first run
	\doifelse\jobsuffix{pdf}
		{\def\lily!img{\lily!filename .pdf}}%
		{\def\lily!img{\lily!filename .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
%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.
%D
	\ifvmode
		\getfiguredimensions[\lily!filename.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}

\stopmodule

\protect
%D End of file

[-- Attachment #3: Type: text/plain, Size: 1 bytes --]



[-- Attachment #4: Type: text/plain, Size: 487 bytes --]

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://tex.aanhet.net
archive  : https://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________

  reply	other threads:[~2007-07-06 20:25 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-03 15:59 lilypond Wolfgang Werners-Lucchini
2007-07-06 20:25 ` Henning Hraban Ramm [this message]
2007-08-27 14:28   ` lilypond Mojca Miklavec
2007-08-27 10:28 ` lilypond Steffen Wolfrum
2007-08-26 22:35 lilypond Hans Hagen
2011-08-18 22:32 buffer names in MKII Mojca Miklavec
2011-08-18 21:29 ` Aditya Mahajan
2011-08-19  7:53   ` Henning Hraban Ramm
2011-08-19 15:08     ` Lilypond (Re: buffer names in MKII) Aditya Mahajan
2011-08-19 20:18       ` Lilypond Henning Hraban Ramm
2011-08-20  8:19         ` Lilypond Aditya Mahajan
2011-08-21  1:22           ` Lilypond David Wooten
2011-08-21 12:07           ` Lilypond Henning Hraban Ramm
2011-08-21 18:25             ` Lilypond Henning Hraban Ramm
2011-08-21 22:14             ` Lilypond Aditya Mahajan
2011-08-21 22:24               ` Lilypond Hans Hagen
2011-08-21 22:32                 ` Lilypond Aditya Mahajan
2011-08-22  1:53               ` Lilypond Aditya Mahajan
2011-08-22 13:59                 ` Lilypond Henning Hraban Ramm
2011-08-22 15:18                   ` Lilypond Aditya Mahajan
2014-06-08 22:31 Lilypond David Wooten
2014-06-10  9:53 ` Lilypond Henning Hraban Ramm
2014-06-10 18:26   ` Lilypond David Wooten
2014-06-11  8:51     ` Lilypond Henning Hraban Ramm
2014-06-12 17:00       ` Lilypond David Wooten
2014-06-12 17:37         ` Lilypond Henning Hraban Ramm
2014-06-12 20:21           ` Lilypond David Wooten

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=7F1631B9-8C3B-430D-A1C9-2B4EA842CFA2@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).