diff options
-rw-r--r-- | contrib/lilypond/groff_lilypond.man | 313 | ||||
-rwxr-xr-x | contrib/lilypond/groff_lilypond.pl | 137 |
2 files changed, 450 insertions, 0 deletions
diff --git a/contrib/lilypond/groff_lilypond.man b/contrib/lilypond/groff_lilypond.man new file mode 100644 index 00000000..8bcaf30d --- /dev/null +++ b/contrib/lilypond/groff_lilypond.man @@ -0,0 +1,313 @@ +.TH groff_lilypond @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +.SH NAME +groff\-lilypond \[em] integrate \f[CI]lilypond\f[] parts into \f[CI]groff\f[] +. +.\" The .SH was moved to this place in order to appease `apropos'. +. +.\" -------------------------------------------------------------------- +.\" Legalese +.\" -------------------------------------------------------------------- +. +.de authors +This file was written by Bernd Warken +.MT groff\-bernd.warken\-72@web.de +.ME . +.. +. +. +.de copying +Copyright \(co 2013 +.RS +.ft CI +Free Software Foundation, Inc. +.ft R +.RE +. +.P +This file is part of +.ft CI +groff\\f[R], a free software project. +. +.P +You can redistribute it and/or modify it under the terms of the +.nh +.ft CI +GNU General Public License +.ft R +.hy +as published by the +.nh +.ft CI +Free Software Foundation (FSF)\\f[R], +.hy +either version 3 of the License, or (at your option) any later version. +. +.P +You should have received a copy of the +.nh +.ft CI +GNU General Public License +.ft R +.hy +along with +.ft CI +groff\\f[R], +see the files +.nh +.ft CB +COPYING +.ft R +and +.ft CB +LICENSE +.ft R +.hy +in the top directory of the +.ft CI +groff +.ft R +source package. +. +.P +You can also visit +.UR http://\\:www.gnu.org/\\:licenses +.UE . +.. +. +. +.\" -------------------------------------------------------------------- +.\" Setup +.\" -------------------------------------------------------------------- +. +.ds1 Ellipsis "\&.\|.\|.\&\" +. +. +.\" -------------------------------------------------------------------- +.\" Macro definitions +.\" -------------------------------------------------------------------- +. +.\" -------------------------------------------------------------------- +.\" .FONT (<font name> <text> [<font name> <text> ...]) +.\" +.\" Print in different fonts: R, I, B, CR, CI, CB +.\" +.de1 FONT +. if (\\n[.$] = 0) \{\ +. nop \&\f[P]\& +. return +. \} +. ds result \& +. while (\\n[.$] >= 2) \{\ +. as result \,\f[\\$1]\\$2 +. if !"\\$1"P" .as result \f[P] +. shift 2 +. \} +. if (\\n[.$] = 1) .as result \,\f[\\$1] +. nh +. nop \\*[result]\& +. hy +.. +. +. +.\" -------------------------------------------------------------------- +.\" SH "SYNOPSIS" +.\" -------------------------------------------------------------------- +. +.SY groff_lilypond +.OP -- +.OP \%filespec +.YS +. +.SY groff_lilypond +.BR -h | --help +.YS +. +.SY groff_lilypond +.BR -v | --version +.YS +. +. +.\" -------------------------------------------------------------------- +.SH DESCRIPTION +.\" -------------------------------------------------------------------- +. +.FONT CB groff_lilypond +transforms sheet music in the +.FONT CI lilypond +language in a +.FONT CI groff +file such that +.FONT CB groff +can display them. +. +. +.P +Without arguments, +.FONT CB groff_lilypond +reads from standard input. +. +A single file can be given as an argument. +. +. +.\" -------------------------------------------------------------------- +.SH "HOW THE TRANSFORMATION WORKS" +.\" -------------------------------------------------------------------- +. +A +.FONT CI lilypond +part within a structure written in the +.FONT CI groff +language is the whole part between the marks +.FONT CB ".lilypond start" +and +.FONT CB ".lilypond end" R . +. +A +.FONT CI groff +file can have several of these +.FONT CI lilypond +parts. +. +. +.P +These +.FONT CI lilypond +parts are sent into temporary files with the file name extension +.FONT CB .ly R . +. +. +.P +These files are transformed by the +.FONT CB lilypond +program into +.FONT CI pdf +files, using +.EX +.FONT CB "lilypond \-\-pdf \-\-output=" I file-name +.EE +for each +.FONT .ly +file. +. +The +.I file-name +must be provided without the extension +.FONT CB .pdf R . +. +By this process, a file +.FONT CI file-name CB .pdf +is generated. +. +. +.P +The next step is to transform these +.FONT CI pdf +files into a +.FONT CI ps +file. +. +This is done by the +.FONT CB pdf2ps +program using +.EX +.FONT CB "pdf2ps " CI file-name CB ".pdf " CI file-name CB ".ps" +.EE +. +. +The next step creates an +.FONT CI EPS +file from the +.FONT CI ps +file. +. +This is done by the +.FONT CB ps2eps +program using +.EX +.FONT CB "ps2eps " CI file-name CB ".ps" +.EE +. +. +.P +By that, a file +.FONT CI file-name CB .eps +is created for each +.FONT CI lilypond +part in the +.FONT CI groff +file or standard input. +. +. +.P +The last step to be done is replacing all +.FONT CI lilypond +parts by the +.FONT CI groff +command +.EX +.FONT CB ".PSPIC " CI file-name CB .eps +.EE +. +. +.P +That new +.FONT CI groff +structure is sent to standard output. +. +It can either be saved in a file or piped to groff for a display. +. +. +.\" -------------------------------------------------------------------- +.SH "TEMPORARY FILES" +.\" -------------------------------------------------------------------- +. +By the transformation process, there are many temporary files +generated. +. +All of them except the +.FONT CI EPS +files are deleted when the +.FONT CB groff_lilypond +process is finished. +. +. +.P +These +.FONT CI EPS +files are stored in a temporary directory. +. +But they cannot be deleted by the transformation process because they +are needed for the display which can take a long time. +. +. +.\" -------------------------------------------------------------------- +.SH "DISPLAY" +.\" -------------------------------------------------------------------- +. +The display maps each +.FONT CI lilypond +part on a complete page, preceded and followed by a page break. +. +I do not know how to change this or what very long music sheets will +do. +. +. +.\" -------------------------------------------------------------------- +.SH "AUTHOR" +.\" -------------------------------------------------------------------- +.author +. +. +.\" -------------------------------------------------------------------- +.SH "COPYING" +.\" -------------------------------------------------------------------- +.copyleft +. +. +.\" -------------------------------------------------------------------- +.\" Emacs settings +.\" -------------------------------------------------------------------- +. +.\" Local Variables: +.\" mode: nroff +.\" End: diff --git a/contrib/lilypond/groff_lilypond.pl b/contrib/lilypond/groff_lilypond.pl new file mode 100755 index 00000000..c3d3a7a0 --- /dev/null +++ b/contrib/lilypond/groff_lilypond.pl @@ -0,0 +1,137 @@ +#! /usr/bin/env perl + +# groff_lilypond - integrate lilypond into groff files + +# Source file position: <groff-source>/contrib/lilypond/groff_lilypond.pl +# Installed position: <prefix>/bin/groff_lilypond + +# Copyright (C) 2013 Free Software Foundation, Inc. +# Written by Bernd Warken <groff-bernd.warken-72@web.de>. + +# Last update: 09 Feb 2013 + +# This file is part of `groff'. + +# `groff' is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# `groff' is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +######################################################################## + +use strict; +use warnings; + +sub version { + print "groff_lilypond version 0.1 is part of groff\n"; +} + +sub usage { + print <<EOF +groff_lilypond [filename] +groff_lilypond -h|--help +groff_lilypond -v|--version +Read a roff file or standard input and transform `lilypond' parts +(everything between `.lilypond start' and `.lilypond end') +into temporary EPS-files that can be read by groff using `.PSPIC'. +See groff_lilypond(1) +EOF +} + +foreach (@ARGV) { + if (/(-v|--version)/) { + &version; + goto QUIT; + } elsif (/(-h)|--help/) { + &usage; + goto QUIT; + } +} + + +my $tempdir; +{ + my @tempdirs = ('/tmp', $ENV{'HOME'} . '/tmp'); + foreach (reverse @tempdirs) { + if (-w) { + s<$></>; + s</+></>g; + my $sub = $_; + my $groff_tempdir = $sub . 'groff'; + if (-e $groff_tempdir) { + if (-w $groff_tempdir) { + $tempdir = $groff_tempdir; + } else { + $tempdir = $sub; + } + } else { + if (mkdir $groff_tempdir, oct("0700")) { + $tempdir = $groff_tempdir; + } else { + $tempdir = $sub; + } + } + last; + } + } +} +$tempdir =~ s(/*$)(/); + +my $file_time; +{ + use Time::HiRes qw[]; + (my $second, my $micro_second) = Time::HiRes::gettimeofday(); + $file_time = $second . $micro_second; +} + +my $file_prefix = $tempdir . 'lilypond' . '_' . $file_time . '_'; +my $file_number = 0; +my $file_numbered; +my $file_ly; + +my $lilypond_mode = 0; + +foreach (<>) { + chomp; + if (/^\.\s*lilypond\s+start/) { + die "Line `.lilypond stop' expected." if ($lilypond_mode); + $lilypond_mode = 1; + $file_number++; + $file_numbered = $file_prefix . $file_number; + $file_ly = $file_numbered . '.ly'; + open FILE_LY, ">", $file_ly or + die "cannot open .ly file: $!"; + next; + } elsif (/^\.\s*lilypond\s+stop/) { + die "Line `.lilypond start' expected." unless ($lilypond_mode); + $lilypond_mode = 0; + close FILE_LY; + + system "lilypond", "--pdf", "--output=$file_numbered", $file_ly and + die 'Program lilypond does not work.'; + # .pdf is added automatically + system 'pdf2ps', $file_numbered . '.pdf', $file_numbered . '.ps' and + die 'Program pdf2ps does not work.'; + system 'ps2eps', $file_numbered . '.ps' and + die 'Program ps2eps does not work.'; + print '.PSPIC ' . $file_numbered . '.eps' . "\n"; + + next; + } elsif ($lilypond_mode) { + print FILE_LY $_ . "\n"; + } else { + print $_ . "\n"; + } +} + +unlink glob $file_prefix . "*.[a-df-z]*"; + +QUIT: |