summaryrefslogtreecommitdiff
path: root/obsolete/macros/texmuse/Program/texmuse.tex
diff options
context:
space:
mode:
Diffstat (limited to 'obsolete/macros/texmuse/Program/texmuse.tex')
-rw-r--r--obsolete/macros/texmuse/Program/texmuse.tex624
1 files changed, 624 insertions, 0 deletions
diff --git a/obsolete/macros/texmuse/Program/texmuse.tex b/obsolete/macros/texmuse/Program/texmuse.tex
new file mode 100644
index 0000000000..740b75b12b
--- /dev/null
+++ b/obsolete/macros/texmuse/Program/texmuse.tex
@@ -0,0 +1,624 @@
+\makeatletter
+\newcommand{\TeXmuse}{\TeX{\itshape\kern-.1em m\kern-.05em use}}
+%Declarations
+\newtoks\@temptoks
+\newtoks\quant@toks
+\newtoks\curr@note
+\newtoks\this@note
+\newtoks\to@write
+\newtoks\extracted@line
+\newtoks\@plainnote
+\newtoks\@atnote
+\newtoks\@@atnote
+\newwrite\written@tm@file
+\newwrite\instrument@file
+\newread\read@tm@file
+\@tempswafalse % (tempswa = repeat@test)
+\newif\if@tempswb \@tempswbtrue % (tempswb = first@file)
+\newif\ifnot@written\not@writtentrue
+\newif\ifbeam@sw % Whether the note has to be added to a beam
+\newif\ifblock@done % Whether the last block is over (to catch pre-barline material)
+\newcount\@octave
+\newcount\@key
+\newcount\block@period
+\newcount\instrument@number
+\newcount\@no@of@instr % No. of instruments included in the system
+\newcount\extracted@number
+\newcount\current@quantum\current@quantum=0\relax
+\newcount\quantum@skip\quantum@skip=0\relax
+\newcount\char@no
+\newcount\block@no
+\newcount\file@no
+\newcount\s@factor
+\newcount\@restshift\@restshift0
+\newcount\@tempcntd
+\newcount\@hookels
+\newcount\@@break
+\newcount\@firstmf
+\newcount\FontSplit % Number of characters per font
+\newcount\beam@no %Number of beam lines in the beam (modified by \e@n, etc.)
+\chardef\@ther=12
+\chardef\@i=1
+\chardef\@ii=2
+\chardef\@iii=3
+\chardef\@iv=4
+\chardef\@v=5
+\chardef\@vi=6
+\chardef\@vii=7
+\chardef\@viii=8
+\chardef\@ix=9
+\chardef\@z=0
+\newenvironment{texmuse}{\bgroup%
+ \catcode`\[=13 \catcode`\]=13
+ \catcode`\|=13
+ \catcode`A=13 \lccode`A=`A
+ \catcode`B=13 \lccode`B=`B
+ \catcode`C=13 \lccode`C=`C
+ \catcode`D=13 \lccode`D=`D
+ \catcode`E=13 \lccode`E=`E
+ \catcode`F=13 \lccode`F=`F
+ \catcode`G=13 \lccode`G=`G
+ \catcode`R=13 \lccode`R=`R
+ \catcode`\!=\@ther \lccode`\!=`\1 \catcode`1=\active
+ \catcode`\?=\@ther \lccode`\?=`\2 \catcode`2=\active
+ \catcode`\_=\@ther \lccode`\_=`\3 \catcode`3=\active
+ \catcode`\$=\@ther \lccode`\$=`\4 \catcode`4=\active
+ \catcode`\/=\@ther \lccode`\/=`\5 \catcode`5=\active
+ \catcode`\^=\@ther \lccode`\^=`\6 \catcode`6=\active
+ \catcode`\&=\@ther \lccode`\&=`\7 \catcode`7=\active
+ \catcode`\*=\@ther \lccode`\*=`\8 \catcode`8=\active
+ }{\egroup}
+%Newinstrument
+\newcommand\newinstrument[2][\trebleclef]{%
+ \expandafter\newtoks\csname #2@toks\endcsname%
+ \expandafter\def\csname #2\endcsname{\global\csname #2@toks\endcsname}%
+ \bgroup
+ \edef\trebleclef{\gdef\expandafter\noexpand\csname #2@clef\endcsname{0}}%
+ \edef\bassclef{\gdef\expandafter\noexpand\csname #2@clef\endcsname{6}}%
+ #1
+ \egroup}
+ %
+%Constant definitions
+\def\quant@note#1{\let\@let@token=#1\@quant@note}
+\def\@quant@note{\let\next\@let@token
+ \ifx\@let@token-\let\next\quant@note
+ \else\ifx\@let@token+\let\next\quant@note
+ \else\ifx\@let@token.\let\next\quant@dot
+ \else\ifx=\@let@token\let\next\@@quant@note
+ \else\def\next{\@@quant@note\@let@token}%
+ \fi\fi\fi\fi\next}
+\def\quant@dot#1{\let\@let@token=#1\@quant@dot}
+\def\@quant@dot{\let\next\@let@token
+ \ifx\@let@token.\let\next\@quant@dot % Not sure it works like this
+ \else\ifx=\@let@token\let\next\@@quant@dot
+ \else\def\next{\@@quant@dot\@let@token}%
+ \fi\fi\next}
+\def\@@quant@dot{\global\quant@toks\expandafter{\the\quant@toks\quant@@dot\@note\quant@@undot}}
+\def\@@quant@note{\global\quant@toks\expandafter{\the\quant@toks\@note}}
+\def\quant@sixtif{\quantum@skip4\relax}
+\def\quant@thirt{\quantum@skip8\relax}
+\def\quant@sixt{\quantum@skip16\relax}
+\def\quant@eighth{\quantum@skip32\relax}
+\def\quant@quarter{\quantum@skip64\relax}
+\def\quant@half{\quantum@skip128\relax}
+\def\quant@whole{\quantum@skip256\relax}
+\def\quant@double{\quantum@skip512\relax}
+\def\quant@@dot{\multiply\quantum@skip3\divide\quantum@skip2\relax}
+\def\quant@@undot{\multiply\quantum@skip2\divide\quantum@skip3\relax}
+\def\quant@barline{\global\quant@toks\expandafter{\the\quant@toks\no@note0\current@quantum0\relax}}
+%\@note
+\def\@note{%
+ \if@tempswa\else\read\read@tm@file to \matrix@line
+ \expandafter\extract@from@line\matrix@line
+ \fi
+ \@tempswafalse
+ \def\next{\global\advance\current@quantum\quantum@skip\relax}%
+ \ifnum\block@period>\current@quantum\relax
+ \ifnum\extracted@number=\current@quantum\relax
+ \edef\to@write{\the\extracted@number:\the\extracted@line,%
+ 1.}%
+ \else\ifnum\extracted@number>\current@quantum\relax
+ \@tempswatrue
+ \@tempcnta=\instrument@number\relax
+ \edef\to@write{\the\current@quantum:\noexpand\@gobble}%
+ \loop\ifnum\@tempcnta>1\relax\edef\to@write{\to@write,0}%
+ \advance\@tempcnta-1\relax\repeat
+ \edef\to@write{\to@write,1.}%
+ \else% (extracted@number<current@quantum)
+ \let\next\@note
+ \edef\to@write{\the\extracted@number:%
+ \the\extracted@line,0.}%
+ \fi\fi
+ \immediate\write\written@tm@file{\to@write}%
+ \else
+ \def\next{\@tempswatrue\no@note0\current@quantum0\relax\@note}%
+ \fi
+ \next}
+\def\no@note#1{%
+ \if@tempswa\else\read\read@tm@file to \matrix@line
+ \expandafter\extract@from@line\matrix@line
+ \fi
+ \@tempswafalse
+ \let\@next\relax
+ \ifnum\extracted@number=\current@quantum\relax
+ \edef\to@write{\the\extracted@number:\the\extracted@line,%
+ #1.}%
+ \else\ifnum\extracted@number>\current@quantum\relax
+ \@tempswatrue
+ \@tempcnta=\instrument@number\relax
+ \edef\to@write{\the\current@quantum:\noexpand\@gobble}%
+ \loop\ifnum\@tempcnta>1\relax\edef\to@write{\to@write,0}%
+ \advance\@tempcnta-1\relax\repeat
+ \edef\to@write{\to@write,#1.}%
+ \else% (extracted@number<current@quantum)
+ \def\@next{\no@note{#1}}%
+ \edef\to@write{\the\extracted@number:%
+ \the\extracted@line,0.}%
+ \fi\fi
+ \immediate\write\written@tm@file{\to@write}%
+ \@next}
+\def\@stem{\immediate\write\written@tm@file{\space\space\space regular_stem;}}
+\def\@rest#1{\immediate\write\written@tm@file{\space\space\space add_rest(\the\beam@no,#1);}}
+\begin{texmuse}
+\lowercase{%
+%Octave handling
+ \global\def\rangefrom#!{\numbers@as@numbers\relax\@tempcnta=4\relax
+ \expandafter\@rangefrom\noexpand#!}%
+ \global\def\@rangefrom#!#?{%
+ \global\@tempcntb=#?\relax\global\@tempcnta=#?\relax\global\advance\@tempcnta1\relax\egroup
+ \expandafter\@@la\the\@tempcnta\relax
+ \ifx#!A\expandafter\@@la\the\@tempcntb\else
+ \ifx#!B\expandafter\@@ti\the\@tempcntb\else
+ \ifx#!C\expandafter\@@do\the\@tempcntb\else
+ \ifx#!D\expandafter\@@re\the\@tempcntb\else
+ \ifx#!E\expandafter\@@mi\the\@tempcntb\else
+ \ifx#!F\expandafter\@@fa\the\@tempcntb\else
+ \expandafter\@@sol\the\@tempcntb\relax
+ \fi\fi\fi\fi\fi\fi
+ }
+ \global\def\@@sol#!{\global\defG{\@octave#!\def\@pitch{g}\@tempswafalse\@@octave}}%
+ \global\def\@@fa#!{\@@sol#!\global\defF{\@octave#!\def\@pitch{f}\@tempswafalse\@@octave}}%
+ \global\def\@@mi#!{\@@fa#!\global\defE{\@octave#!\def\@pitch{e}\@tempswafalse\@@octave}}%
+ \global\def\@@re#!{\@@mi#!\global\defD{\@octave#!\def\@pitch{d}\@tempswafalse\@@octave}}%
+ \global\def\@@do#!{\@@re#!\global\defC{\@octave#!\def\@pitch{c}\@tempswafalse\@@octave}}%
+ \global\def\@@ti#!{\@@do#!\global\defB{\@octave#!\def\@pitch{b}\@tempswafalse\@@octave}}%
+ \global\def\@@la#!{\@@ti#!\global\defA{\@octave#!\def\@pitch{a}\@tempswafalse\@@octave}}}
+\gdef\numbers@as@numbers{\bgroup% Esto también tiene que ser un loop
+ \def1{\@i}\def2{\@ii}\def3{\@iii}\def4{\@iv}\def5{\@v}\def6{\@vi}\def7{\@vii}\def8{\@viii}}
+%Accidentals
+\gdef\#{\open@block\this@note\expandafter{\the\this@note\string\@sharp}}%
+\gdef\b{\open@block\this@note\expandafter{\the\this@note\string\@flat}}%
+\gdef\n{\open@block\this@note\expandafter{\the\this@note\string\@natural}}%
+%Beams and rhythmic notation
+ \gdef\rhythm@not{\stem@kind}%
+ \gdef[{\@open@beam}\gdef]{\@close@beam}%
+ \gdef\@open@beam{%
+ \open@block
+ \edef\current@block{\current@block\relax\string\next@note\string\open@beam}%
+ \def\rhythm@not{\string\add@tobeam}%
+ \not@writtenfalse}%
+ \gdef\@close@beam{\edef\current@block{\current@block\string\close@beam\relax}%
+ \def\rhythm@not{\stem@kind}}%
+%%notes
+\lowercase{%
+ \gdef\@add@note#!#?{%
+ \open@block
+ \ifnot@written% When \@open@beam has been called, it already added \next@note
+ \edef\current@block{\current@block\relax\string\next@note}%
+ \fi
+ \edef\current@block{\current@block
+ \@value\the\this@note\the\@atnote\the\@@atnote\string\add@note{#!#?}\rhythm@not}%
+ \@atnote{}%
+ \@@atnote{}%
+ \this@note\@plainnote
+ \not@writtentrue
+ \advance\current@quantum\quantum@skip\relax
+ \block@donefalse}%
+ \global\defR{\@ifnextchar-{\advance\@restshift-!\relax\@firstoftwoR}\@@rest}%
+ \global\def\@@rest{\@ifnextchar+{\advance\@restshift!\relax\@firstoftwo\@@rest}\@@@rest}
+ \gdef|{\def\@barline{!0}\current@quantum0\relax}%
+ }%
+\gdef\@@@rest{%
+ \open@block
+ \def\rhythm@not{\string\@rest{\the\@restshift}}%
+ \ifnot@written%
+ \edef\current@block{\current@block\relax\string\next@note}%
+ \fi
+ \edef\current@block{\current@block%
+ \@value\the\this@note\the\@@atnote\rhythm@not}%
+ \this@note\@plainnote
+ \@@atnote{}%
+ \not@writtentrue
+ \@restshift0\relax
+ \def\rhythm@not{\stem@kind}%
+ \advance\current@quantum\quantum@skip\relax
+ \block@donefalse}%
+%clefs
+\gdef\trebleclef{\this@note\expandafter{\the\this@note\string\@clef0}}
+\gdef\bassclef{\this@note\expandafter{\the\this@note\string\@clef\string6}}
+%blocks
+\gdef\open@block{%
+ \ifnum\block@period>\current@quantum\else\current@quantum0\relax\fi
+ \ifnum\current@quantum=0\relax
+ \end@block
+ \fi}
+\gdef\end@block{%
+ \ifblock@done\else
+ \immediate\write\instrument@file{%
+ \current@block\string\end@of@block}%
+ \immediate\write\instrument@file\expandafter{%
+ \the\this@note\string\@bar@line{\@barline}\string\relax}%
+ \def\current@block{\@gobble}%
+ \this@note\@plainnote
+ \let\@barline\barline@default
+ \fi
+ \block@donetrue}
+%bars
+%rhythmic values
+ \global\def2{\quant@thirt\global\quant@toks\expandafter{\the\quant@toks\quant@thirt}%
+ \def\@value{\string\t@n}\def\stem@kind{\string\@stem\string\@flag}}%
+ \global\def3{\quant@sixt\global\quant@toks\expandafter{\the\quant@toks\quant@sixt}%
+ \def\@value{\string\s@n}\def\stem@kind{\string\@stem\string\@flag}}%
+ \global\def4{\quant@eighth\global\quant@toks\expandafter{\the\quant@toks\quant@eighth}%
+ \def\@value{\string\e@n}\def\stem@kind{\string\@stem\string\@flag}}%
+ \global\def5{\quant@quarter\global\quant@toks\expandafter{\the\quant@toks\quant@quarter}%
+ \def\@value{\string\q@n}\def\stem@kind{\string\@stem}}%
+ \global\def6{\quant@half\global\quant@toks\expandafter{\the\quant@toks\quant@half}%
+ \def\@value{\string\h@n}\def\stem@kind{\string\@stem}}%
+ \global\def7{\quant@whole\global\quant@toks\expandafter{\the\quant@toks\quant@whole}%
+ \def\@value{\string\w@n}\def\stem@kind{\string\relax}}%
+ \global\def8{\quant@double\global\quant@toks\expandafter{\the\quant@toks\quant@double}%
+ \def\@value{\string\d@n}\def\stem@kind{\string\relax}}%
+%The actual reading of the user's input for quantization (redefinition of musical commands)
+\lowercase{%
+ \global\def\key#!{\numbers@as@numbers\global\@key=#!\relax\egroup}
+ \global\def\meter#!#?{\numbers@as@numbers\global\block@period?/^\relax
+ \global\divide\block@period by #?\relax %If any argument is a two-digit number, this does not yet work
+ \global\multiply\block@period by #!\relax\egroup}
+ \global\def\extr@quant@toks#!{%
+ \begin{texmuse}%Meaning of commands for quantization purposes.
+ \let[\relax\let]\relax
+ \let|\quant@barline
+ \letA\quant@note\letB\quant@note\letC\quant@note\letD\quant@note
+ \letE\quant@note\letF\quant@note\letG\quant@note\letR\quant@note
+ \let\rangefrom\@gobble
+ \let\#\relax\let\n\relax\let\b\relax
+ \expandafter\the#!%
+ \global\quant@toks\expandafter{\the\quant@toks\quant@instr@end\relax}%
+ \end{texmuse}}}%
+\end{texmuse}
+\def\@@octave#1{\let\next\@@octave
+ \ifx#1-\advance\@octave-1\else\ifx#1+\advance\@octave1\relax
+ \else\if@tempswa\else\@add@note{\@pitch}{\the\@octave}\@tempswatrue\fi
+ \ifx=#1\add@tie{\expandafter\@pitch\the\@octave}\let\next\relax
+ \else\ifx#1.\add@dot{\@pitch}{\the\@octave}%
+ \else\let\next#1%
+ \fi\fi
+ \fi\fi\next}
+%Quantization functions
+\def\quant@instr@end{\let\next\quant@instr@end
+ \if@tempswa\else\read\read@tm@file to \matrix@line
+ \expandafter\extract@from@line\matrix@line
+ \fi
+ \ifnum\extracted@number=9999\relax
+ \immediate\write\written@tm@file{\matrix@line}%
+ \immediate\closeout\written@tm@file\immediate\closein\read@tm@file\current@quantum0\relax
+ \let\next\relax
+ \else
+ \edef\to@write{\the\extracted@number:%
+ \the\extracted@line,0.}%
+ \immediate\write\written@tm@file{\to@write}%
+ \@tempswafalse
+ \fi\next}
+%Character construction functions
+\def\read@blocks#1{\@for\curr@instr:=#1\do
+ {\expandafter\read\csname\curr@instr @file\endcsname to \@tempcs
+ \csname\curr@instr @blocktoks\endcsname\expandafter{\@tempcs}%
+ \expandafter\extract@note\csname\curr@instr @blocktoks\endcsname}}
+\def\open@beam{\expandafter\let\csname\curr@instr @beam\endcsname\@gobble}
+\def\close@beam{\immediate\write\written@tm@file\expandafter{\space\space\space
+ beam(\csname\curr@instr @beam\endcsname);}%
+ \beam@swfalse}
+\def\t@n{\beam@no3\relax\def\notehead@kind{add_noteheads}}
+\def\s@n{\beam@no2\relax\def\notehead@kind{add_noteheads}}
+\def\e@n{\beam@no1\relax\def\notehead@kind{add_noteheads}}
+\def\q@n{\beam@no0\relax\def\notehead@kind{add_noteheads}}
+\def\h@n{\beam@no-1\relax\def\notehead@kind{add_halfheads}}
+\def\w@n{\beam@no-2\relax\def\notehead@kind{add_wholeheads}}
+\def\d@n{\beam@no-3\relax\def\notehead@kind{add_doubleheads}}
+\def\@flag{\immediate\write\written@tm@file{\space\space\space add_flag(\the\beam@no);}}
+\def\@sharp#1\add@note#2{#1\relax\add@note{#2}\immediate\write\written@tm@file{\space\space\space add_sharp(#2);}}
+\def\@flat#1\add@note#2{#1\relax\add@note{#2}\immediate\write\written@tm@file{\space\space\space add_flat(#2);}}
+\def\@natural#1\add@note#2{#1\relax\add@note{#2}\immediate\write\written@tm@file{\space\space\space add_natural(#2);}}
+\def\add@note#1{\def\@@note{#1}%
+ \immediate\write\written@tm@file{\space\space\space\notehead@kind(\@@note);}}
+\def\add@dot#1#2{{\divide\quantum@skip2\relax
+ \global\advance\current@quantum\quantum@skip}%
+ \edef\current@block{\current@block
+ \the\this@note\string\@dot{#1#2}}%
+ \not@writtentrue}%
+\def\add@tie#1{\expandafter\expandafter\expandafter\add@@tie#1}
+\def\add@@tie#1#2{%
+ \edef\current@block{\current@block
+ \the\this@note\string\@tie{#1#2}}%
+ \not@writtentrue
+ {\@temptoks{\string\close@tie{#1#2}}\global\@@atnote\expandafter{\the\@temptoks}}%
+ }%
+\def\@tie#1{\immediate\write\written@tm@file{\space\space\space add_tie(#1);}}
+\def\close@tie#1{\immediate\write\written@tm@file{\space\space\space close_tie(#1);}}
+\def\@dot#1{\immediate\write\written@tm@file{\space\space\space add_dot(#1);}}
+\def\@clef#1{\expandafter\def\csname\curr@instr @clef\endcsname{#1}%
+ \immediate\write\written@tm@file{\space\space\space clef_(#1);}}
+\def\add@tobeam{\expandafter\edef\csname\curr@instr @beam\endcsname{%
+ \csname\curr@instr @beam\endcsname,\the\char@no,\the\beam@no,1,\@@note}} % 1 is for just one note-head
+\def\init@char{%
+ \immediate\write\written@tm@file{new_char(\the\s@factor);}}
+\def\extract@note#1{\expandafter\extract@@note\the#1\relax
+ #1\expandafter{\the\@temptoks}}
+\def\extract@@note#1\next@note#2\end@of@block{\curr@note{#1}\@temptoks{#2\next@note\end@of@block}}
+%Auxiliary functions
+\def\get@instr#1,#2,. {\def\curr@instr{#1}\edef\temp@instr@list{#2\noexpand\@gobble}}
+\def\open@tm@files{\if@tempswb\immediate\openout\written@tm@file=\jobname.tm1\relax
+ \immediate\openin\read@tm@file=\jobname.tm2\relax
+ \else\immediate\openout\written@tm@file=\jobname.tm2\relax
+ \immediate\openin\read@tm@file=\jobname.tm1\relax
+ \fi}
+\def\extract@from@line#1:#2. {\extracted@number=#1\relax\extracted@line{#2}}
+\def\@gobbleline#1.{\relax}
+\def\strip@spaces#1{%
+ \@temptoks#1%
+ \@temptoks\expandafter{\the\@temptoks{\relax} }%
+ \quant@toks{}%
+ \@tempswatrue
+ \loop\if@tempswa
+ \expandafter\strip@@spaces\the\@temptoks{\relax} \@nil
+ \repeat
+ #1\quant@toks}
+\def\strip@@spaces#1 #2#3\@nil{\quant@toks\expandafter{\the\quant@toks#1}%
+ \ifx#2\relax\@tempswafalse\fi
+ \@temptoks{#2#3}}
+%Music Boxes
+\def\music#1{%
+ \def\@desiredwidth{\the\textwidth}%
+ \def\@break{1}\@@break\@break
+ \def\@afterblock{\ }%
+ \def\@lastbreak{numeric desired_width}%
+ \def\last@barline{20}%
+ \def\instr@list{#1}%
+ \def\block@chars{\@gobble}%
+ \def\music@font@splits{\@gobble}%
+ \@no@of@instr0\relax
+ \instrument@number0\relax
+ \@quantization
+ \mf@files
+ \@compose
+ \global\@firstmf\file@no\global\advance\@firstmf1\relax}
+\def\excerpt#1{%
+ \def\@desiredwidth{desired_width}%
+ \def\@break{0}\@@break\@break
+ \def\@afterblock{\relax}%
+ \def\@lastbreak{\@gobble}%
+ \def\last@barline{0}%
+ \def\instr@list{#1}%
+ \def\block@chars{\@gobble}%
+ \def\music@font@splits{\@gobble}%
+ \@no@of@instr0\relax
+ \instrument@number0\relax
+ \@quantization
+ \mf@files
+ \@compose
+ \global\@firstmf\file@no\global\advance\@firstmf1\relax}
+\def\@quantization{%
+ %First the quantization
+ \init@quantization
+ \@for\curr@instr:=\instr@list\do
+ {\expandafter\strip@spaces\csname\curr@instr @toks\endcsname%
+ \advance\@no@of@instr1\relax
+ \quant@toks{}\current@quantum0\relax
+ \extr@quant@toks{\csname\curr@instr @toks\endcsname}%
+ \@tempswafalse
+ \advance\instrument@number1\relax
+ \if@tempswb\@tempswbfalse\else\@tempswbtrue\fi\open@tm@files
+ \the\quant@toks
+ %Then, the writing of the auxiliary files for each instrument
+ \this@note\@plainnote
+ \def\current@block{\@gobble}%
+ \current@quantum0\relax
+ \block@donetrue
+ \immediate\openout\instrument@file=\curr@instr.tms\relax
+ \expandafter\the\csname\curr@instr @toks\endcsname
+ \ifnum\current@quantum=0% Which means there was '|' at the end
+ \end@block
+ \else
+ \immediate\write\instrument@file{\current@block\string\end@of@block}%
+ \fi
+ \immediate\closeout\instrument@file}%
+ \count@chars}
+\def\mf@files{%
+ \open@matrix
+ \open@tms
+ \char@no0
+ \block@no0
+ \newtoks\previous@line
+ \@tempswatrue
+ \file@no\@firstmf
+ \mf@@headers
+ \let\music@@font@splits\music@font@splits%
+ \extracted@number0\relax
+ \read\read@tm@file to \matrix@line
+ \expandafter\extract@from@line\matrix@line
+ \loop\ifnum\extracted@number<9999\relax
+ \expandafter\check@split\music@font@splits,1000\@nil
+ \read@blocks{\instr@list}%
+ \let\next\build@block
+ \build@block
+ \repeat}
+\def\build@block{%
+ \edef\temp@instr@list{\instr@list}%
+ \previous@line\expandafter{\the\extracted@line}%
+ \@tempcnta\extracted@number\relax
+ \read\read@tm@file to \matrix@line
+ \expandafter\extract@from@line\matrix@line
+ \ifnum\extracted@number=0\relax
+ \let\next\finish@block
+ \else
+ \advance\char@no1\relax
+ \ifnum\extracted@number=9999\relax
+ \ifnum\@tempcnta=\block@period
+ \def\next{\finish@block\finish@music}%
+ \else
+ \def\next{\last@block\finish@music}%
+ \fi
+ \extracted@number\block@period\relax
+ \fi
+ \find@sf
+ \init@char
+ \@for\matrix@number:=\the\previous@line\do
+ {\expandafter\get@instr\temp@instr@list,,.
+ \ifnum\matrix@number>0\relax
+ \global\block@donefalse
+ \immediate\write\written@tm@file{\curr@instr;}%
+ \expandafter\extract@note\csname\curr@instr @blocktoks\endcsname
+ \the\curr@note
+ \fi}%
+ \immediate\write\written@tm@file{end_of_char;}%
+ \fi
+ \next
+ }
+\def\finish@block{%
+ \advance\char@no1\relax
+ \immediate\write\written@tm@file{new_char(-least_spaced);}%
+ \@for\curr@instr:=\instr@list\do
+ {\expandafter\read\csname\curr@instr @file\endcsname to \@tempcs
+ \immediate\write\written@tm@file{\curr@instr;}%
+ \@tempcs}%
+ \immediate\write\written@tm@file{end_of_char;}%
+ \ifcase\@@break %\@@break is set in the instruments' tokens
+ \or\immediate\write\written@tm@file{end_of_block;}% 1 default for \music: breakable block
+ \advance\block@no1\relax
+ \or\immediate\write\written@tm@file{make_line(next_char);}% 2 is forced break
+ \fi
+ \@@break\@break\relax}
+\def\last@block{%
+ \advance\char@no1\relax
+ \immediate\write\written@tm@file{new_char(-least_spaced);}%
+ \@for\curr@instr:=\instr@list\do
+ {\immediate\write\written@tm@file{\curr@instr;}%
+ \immediate\write\written@tm@file{\space\space\space barline_(\last@barline);}}%
+ \immediate\write\written@tm@file{end_of_char;}}
+\def\finish@music{%
+ \extracted@number9999\relax
+ \immediate\write\written@tm@file{\@lastbreak; end_of_block; make_line(next_char);}%
+ \immediate\write\written@tm@file{showstats; end.}%
+ \immediate\closeout\written@tm@file}
+\def\@compose{%
+ \file@no\@firstmf
+ \block@no-1\relax
+ {%
+ \char@no0\relax
+ \@tempcnta0\relax
+ \font\@musicfont=\jobname\the\@firstmf\relax
+ \@for\@tempcsa:=\block@chars\do
+ {\advance\block@no1\relax
+ \@musicfont
+ \@whilenum\char@no<\@tempcsa\do
+ {\advance\char@no1\relax
+ \message{\the\char@no}\mbox{\char\the\char@no}%
+ }%
+ \message{|}\@afterblock %
+ \expandafter\check@@split\music@@font@splits,0\@nil
+ }%
+ }}
+\def\@bar@line#1{\immediate\write\written@tm@file{\space\space\space barline_(#1);}}
+
+\def\find@sf{%
+ \bgroup
+ \advance\extracted@number-\@tempcnta
+ \global\s@factor\extracted@number
+ \egroup}
+\def\count@chars{%
+ \open@matrix
+ \extracted@number0\relax
+ \char@no0\relax
+ \@tempcnta-1\relax % The number of blocks
+ \@tempcntb0\relax % The number of the last character in the last block
+ \loop\ifnum\extracted@number<9999\relax
+ \read\read@tm@file to \matrix@line
+ \expandafter\extract@from@line\matrix@line
+ \ifnum\char@no>\FontSplit\relax
+ \edef\music@font@splits{\music@font@splits,\the\@tempcnta}%
+ \advance\char@no-\@tempcntb\relax
+ \fi
+ \ifnum\extracted@number=0\relax % To fix all this with the new model.
+ \advance\@tempcnta1\relax
+ \@tempcntb\char@no\relax
+ \edef\block@chars{\block@chars,\the\char@no}%
+ \fi
+ \advance\char@no1\relax
+ \repeat
+ \edef\block@chars{\block@chars,\the\char@no}%
+ \edef\music@font@splits{\music@font@splits,1000}%
+ \immediate\closein\read@tm@file}
+\def\check@split#1,#2\@nil{%
+ \ifnum\block@no=#1\relax %This block was the last to write into the current file
+ \char@no0\relax
+ \close@@line
+ \global\advance\file@no1\relax
+ \mf@@headers
+ \def\music@font@splits{#2}%
+ \fi}
+\def\check@@split#1,#2\@nil{%
+ \ifnum\block@no=#1%
+ \char@no0\relax
+ \global\advance\file@no1\relax
+ \font\@musicfont=\jobname\the\file@no
+ \def\music@@font@splits{#2}%
+ \@musicfont\newline
+ \fi}
+\def\mf@@headers{%
+ \immediate\openout\written@tm@file=\jobname\the\file@no.mf%
+ \immediate\write\written@tm@file{mode_setup;}%
+ \immediate\write\written@tm@file{input txmfont;}%
+ \immediate\write\written@tm@file{input texmuse;}%
+ \immediate\write\written@tm@file{instr_no(\the\@no@of@instr);}%
+ \@tempcnta0\relax
+ \immediate\write\written@tm@file{key_ := \the\@key;}%
+ \immediate\write\written@tm@file{desired_width := \@desiredwidth/pt;}%
+ \@tempcnta0\relax
+ \@for\curr@instr:=\instr@list\do
+ {\advance\@tempcnta1\relax
+ \immediate\write\written@tm@file{staff_\the\@tempcnta="-1,0,1,2,3";}%
+ \immediate\write\written@tm@file{bar_type\the\@tempcnta=\barline@default;}%
+ \immediate\write\written@tm@file{instr_clef\the\@tempcnta :=
+ \csname\curr@instr @clef\endcsname;}%
+ \immediate\write\written@tm@file{def \curr@instr\space =}%
+ \immediate\write\written@tm@file{\space\space\space curr_instr:="\curr@instr;";}%
+ \immediate\write\written@tm@file{\space\space\space note_[index][instr_]:=currentpicture;}%
+ \immediate\write\written@tm@file{\space\space\space instr_:=\the\@tempcnta;}%
+ \immediate\write\written@tm@file{\space\space\space currentpicture:=note_[index][instr_];}%
+ \immediate\write\written@tm@file{\space\space\space enddef;}}%
+ \@tempswatrue}
+\def\close@@line{%
+ \immediate\write\written@tm@file{make_line(next_char); showstats; end.}%
+ \immediate\closeout\written@tm@file}
+%Initializations
+\def\init@quantization{\@tempswbtrue
+ \immediate\openout\written@tm@file=\jobname.tm1\relax%
+ \immediate\write\written@tm@file{9999: 0.}%
+ \immediate\closeout\written@tm@file\relax}%
+\def\open@matrix{\immediate\openin\read@tm@file=\jobname.tm\ifodd\instrument@number 2\else1\fi\relax}
+\def\open@tms{%
+ \@for\curr@instr:=\instr@list\do
+ {\expandafter\newread\csname\curr@instr @file\endcsname
+ \immediate\openin\csname\curr@instr @file\endcsname=\curr@instr.tms%
+ \expandafter\newtoks\csname\curr@instr @blocktoks\endcsname}}
+\@plainnote{}
+\@atnote{}
+\@hookels0
+\@firstmf1\relax
+\FontSplit=180\relax
+\def\barline@default{10}
+\let\@barline\barline@default
+
+\makeatother
+