From c149266df554516300b6700e2108e43bc7bb73bd Mon Sep 17 00:00:00 2001 From: fred Date: Tue, 26 Mar 2002 23:27:41 +0000 Subject: [PATCH] lilypond-1.3.31 --- Documentation/programmer/feta20.sty | 146 ---- Documentation/programmer/fonts.doc | 330 -------- .../programmer/lilypond-overview.doc | 743 ------------------ Documentation/programmer/musicnotes.sty | 43 - flower/include/unionfind.hh | 26 - flower/unionfind.cc | 37 - 6 files changed, 1325 deletions(-) delete mode 100644 Documentation/programmer/feta20.sty delete mode 100644 Documentation/programmer/fonts.doc delete mode 100644 Documentation/programmer/lilypond-overview.doc delete mode 100644 Documentation/programmer/musicnotes.sty delete mode 100644 flower/include/unionfind.hh delete mode 100644 flower/unionfind.cc diff --git a/Documentation/programmer/feta20.sty b/Documentation/programmer/feta20.sty deleted file mode 100644 index 0dbfcf90cc..0000000000 --- a/Documentation/programmer/feta20.sty +++ /dev/null @@ -1,146 +0,0 @@ -% Creator: mf-to-table.py version 0.7 -% Automatically generated on -% Do not edit -% input from out/feta20.log -% name -% rests -\fetdef\wholerest{0} -\fetdef\halfrest{1} -\fetdef\outsidewholerest{2} -\fetdef\outsidehalfrest{3} -\fetdef\breverest{4} -\fetdef\longarest{5} -\fetdef\multirest{6} -\fetdef\quartrest{7} -\fetdef\eighthrest{8} -\fetdef\sixteenthrest{9} -\fetdef\thirtysecondrest{10} -\fetdef\sixtyfourthrest{11} -\fetdef\hundredtwentyeighthrest{12} - -% accidentals -\fetdef\sharp{13} -\fetdef\natural{14} -\fetdef\flat{15} -\fetdef\flatflat{16} -\fetdef\sharpsharp{17} -\fetdef\rightparen{18} -\fetdef\leftparen{19} - -% dots -\fetdef\dot{20} -\fetdef\repeatcolon{21} - -% balls -\fetdef\brevisball{22} -\fetdef\brevisledger{23} -\fetdef\longaball{24} -\fetdef\longaledger{25} -\fetdef\wholeball{26} -\fetdef\wholeledger{27} -\fetdef\halfball{28} -\fetdef\halfledger{29} -\fetdef\quartball{30} -\fetdef\quartledger{31} - -% scripts -\fetdef\ufermata{32} -\fetdef\dfermata{33} -\fetdef\thumb{34} -\fetdef\sforzatoaccent{35} -\fetdef\staccato{36} -\fetdef\ustaccatissimo{37} -\fetdef\dstaccatissimo{38} -\fetdef\tenuto{39} -\fetdef\umarcato{40} -\fetdef\dmarcato{41} -\fetdef\ouvert{42} -\fetdef\plusstop{43} -\fetdef\upbow{44} -\fetdef\downbow{45} -\fetdef\reverseturn{46} -\fetdef\turn{47} -\fetdef\trill{48} -\fetdef\upedalheel{49} -\fetdef\dpedalheel{50} -\fetdef\upedaltoe{51} -\fetdef\dpedaltoe{52} -\fetdef\flageolet{53} -\fetdef\trilelement{54} -\fetdef\prall{55} -\fetdef\mordent{56} -\fetdef\prallprall{57} -\fetdef\prallmordent{58} -\fetdef\upprall{59} -\fetdef\downprall{60} -\fetdef\accDiscant{61} -\fetdef\accDiscantF{62} -\fetdef\accDiscantEh{63} -\fetdef\accDiscantE{64} -\fetdef\accDiscantFE{65} -\fetdef\accDiscantFEh{66} -\fetdef\accDiscantEE{67} -\fetdef\accDiscantFEE{68} -\fetdef\accDiscantEEE{69} -\fetdef\accDiscantFEEE{70} -\fetdef\accDiscantS{71} -\fetdef\accDiscantFS{72} -\fetdef\accDiscantES{73} -\fetdef\accDiscantEhS{74} -\fetdef\accDiscantFES{75} -\fetdef\accDiscantFEhS{76} -\fetdef\accDiscantEES{77} -\fetdef\accDiscantFEES{78} -\fetdef\accDiscantEEES{79} -\fetdef\accDiscantFEEES{80} -\fetdef\accDiscantSS{81} -\fetdef\accDiscantESS{82} -\fetdef\accDiscantEESS{83} -\fetdef\accDiscantEEESS{84} -\fetdef\accFreebass{85} -\fetdef\accFreebassF{86} -\fetdef\accFreebassE{87} -\fetdef\accFreebassFE{88} -\fetdef\accStdbass{89} -\fetdef\accStdbassM{90} -\fetdef\accStdbassBp{91} -\fetdef\accStdbassT{92} -\fetdef\accStdbassTp{93} -\fetdef\accBayanbass{94} -\fetdef\accBayanbassT{95} -\fetdef\accBayanbassE{96} -\fetdef\accBayanbassTE{97} -\fetdef\accBayanbassEE{98} -\fetdef\accBayanbassTEE{99} -\fetdef\accSB{100} -\fetdef\accBB{101} -\fetdef\accOldEE{102} -\fetdef\accOldEES{103} - -% flags -\fetdef\eighthflag{104} -\fetdef\sixteenthflag{105} -\fetdef\thirtysecondflag{106} -\fetdef\sixtyfourthflag{107} -\fetdef\deighthflag{108} -\fetdef\dsixteenthflag{109} -\fetdef\dthirtysecondflag{110} -\fetdef\dsixtyfourthflag{111} - -% clefs -\fetdef\altoclef{112} -\fetdef\caltoclef{113} -\fetdef\bassclef{114} -\fetdef\cbassclef{115} -\fetdef\trebleclef{116} -\fetdef\ctrebleclef{117} - -% timesig -\fetdef\fourfourmeter{118} -\fetdef\allabreve{119} -\fetdef\oldfourfourmeter{120} -\fetdef\oldallabreve{121} -\fetdef\oldthreetwometer{122} -\fetdef\oldsixfourmeter{123} -\fetdef\oldninefourmeter{124} - diff --git a/Documentation/programmer/fonts.doc b/Documentation/programmer/fonts.doc deleted file mode 100644 index 287dde49b1..0000000000 --- a/Documentation/programmer/fonts.doc +++ /dev/null @@ -1,330 +0,0 @@ - - % -*-LaTeX-*- - -\documentclass{article} -\def\kdots{,\ldots,} -\title{Not the Font-En-Tja font} -\author{HWN \& JCN} -\def\preMudelaExample{} -\def\postMudelaExample{} -\begin{document} -\maketitle - - -\section{Introduction} - -This document are some design notes of the Feta font, and other -symbols related to LilyPond. Feta (not an abbreviation of -Font-En-Tja) is a font of music symbols. All MetaFont sources are -original. The symbols are modelled after various editions of music, -notably \begin{itemize} \item B\"arenreiter \item Hofmeister \item -Breitkopf \item Durand \& C'ie \end{itemize} - -The best references on Music engraving are Wanske\cite{wanske} and -Ross\cite{ross} some of their insights were used. Although it is a -matter of taste, I'd say that B\"arenreiter has the finest typography -of all. - - -\section{Bezier curves for slurs} - -Objective: slurs in music are curved objects designating that notes -should fluently bound. They are drawn as smooth curves, with their -center thicker and the endings tapered. - -There are some variants: the simplest slur shape only has the width as -parameter. Then we give some suggestions for tuning the shapes. The -simple slur algorithm is used for drawing ties as well. - - - -\subsection{Simple slurs} - -Long slurs are flat, whereas short slurs look like small circle arcs. -Details are given in Wanske\cite{ross} and Ross\cite{wanske}. The -shape of a slur can be given as a Bezier curve with four control -points: - -\begin{eqnarray*} - B(t) &=& (1-t)^3c_1 +3(1-t)^2tc_2 + 3(1-t)t^2c_3 + t^3c_4. -\end{eqnarray*} - -We will assume that the slur connects two notes of the same -pitch. Different slurs can be created by rotating the derived shape. -We will also assume that the slur has a vertical axis of symmetry -through its center. The left point will be the origin. So we have -the following equations for the control points $c_1\kdots c_4$. - -\begin{eqnarray*} -c_1&=& (0,0)\\ -c_2&=& (i, h)\\ -c_3&=& (b-i, h)\\ -c_4&=& (b, 0) -\end{eqnarray*} - -The quantity $b$ is given, it is the width of the slur. The -conditions on the shape of the slur for small and large $b$ transform -to -\begin{eqnarray*} - h \to h_{\infty} , &&\quad b \to \infty\\ - h \approx r_{0} b, &&\quad b \to 0. -\end{eqnarray*} -To tackle this, we will assume that $h = F(b)$, for some kind of -$F(\cdot)$. One function that satisfies the above conditions is -$$ -F(b) = h_{\infty} \frac{2}{\pi} \arctan \left( \frac{\pi r_0}{2 -h_{\infty}} b \right). -$$ - -For satisfying results we choose $h_{\infty} = 2\cdot \texttt{interline}$ -and $r_0 = \frac 13$. - -\subsection{Height correction} - -Aside from being a smooth curve, slurs should avoid crossing -enclosed notes and their stems. - -An easy way to achieve this is to extend the slur's height, -so that the slur will curve just above any disturbing notes. - -The parameter $i$ determines the flatness of the curve. Satisfying -results have been obtained with $i = h$. - -The formula can be generalised to allow for corrections in the shape, -\begin{eqnarray*} -c_1&=& (0,0)\\ -c_2&=& (i', h')\\ -c_3&=& (b-i', h')\\ -c_4&=& (b, 0) -\end{eqnarray*} -Where -$$ -i' = h(b) (1 + i_{corr}), \quad h' = h(b) (1 + h_{corr}). -$$ - -The default values for these corrections are $0$. A $h_{corr}$ that is -negative, makes the curve flatter in the center. A $h_{corr}$ that is -positive make the curve higher. - -At every encompassed note's x position the difference $\delta _y$ -between the slur's height and the note is calculated. The greatest -$\delta _y$ is used to calculate $h_{corr}$ is by lineair extrapolation. - -However, this simple method produces satisfactory results only for -small and symmetric disturbances. - - -\subsection{Tangent method correction} - -A somewhat more elaborate\footnote{While staying in the realm -of empiric computer science} way of having a slur avoid -disturbing notes is by first defining the slur's ideal shape -and then using the height correction. The ideal shape of a -slur can be guessed by calculating the tangents of the disturbing -notes: -% a picture wouldn't hurt... -\begin{eqnarray*} - y_{disturb,l} &=& \rm{rc}_l x\\ - y_{disturb,r} &=& \rm{rc}_r + c_{3,x}, -\end{eqnarray*} -where -\begin{eqnarray*} - \rm{rc}_l &=& \frac{y_{disturb,l} - y_{encompass,1}} - {x_{disturb,l} - x_{encompass,1}}\dot x\\ - \rm{rc}_r &=& \frac{y_{encompass,n} - y_{disturb,r}} - {x_{encompass,n} - x_{disturb,r}} \dot x + c_{3,x}. -\end{eqnarray*} - -We assume that having the control points $c_2$ and $c_3$ located -on tangent$_1$ and tangent$_2$ resp. -% t: tangent -\begin{eqnarray*} - y_{tangent,l} &=& \alpha \rm{rc}_l x\\ - y_{tangent,r} &=& \alpha \rm{rc}_r + c_{3,x}. -\end{eqnarray*} - -Beautiful slurs have rather strong curvature at the extreme -control points. That's why we'll have $\alpha > 1$. -Satisfactory resulsts have been obtained with -$$ - \alpha \approx 2.4. -$$ - -The positions of control points $c_2$ and $c_3$ are obtained -by solving with the height-line -\begin{eqnarray*} - y_h &=& \rm{rc}_h + c_h. -\end{eqnarray*} - -The top-line runs through the points disturb$_{left}$ and -disturb$_{right}$. In the case that -$$ -z_{disturb,l} = z_{disturb,r}, -$$ -we'll have -$$ - \angle(y_{tangent,l},y_h) = \angle(y_{tangent,r},y_h). -$$ - - - -\section{Sizes} - -Traditional engraving uses a set of 9 standardised sizes for Staffs -(running from 0 to 8). - -We have tried to measure these (helped by a magnifying glass), and -found the staffsizes in table~\ref{fonts:staff-size}. One should note that -these are estimates, so I think there could be a measuring error of ~ -.5 pt. Moreover [Ross] states that not all engravers use exactly -those sizes. - -\begin{table}[h] - \begin{center} - \begin{tabular}{lll} -Staffsize &Numbers &Name\\ -\hline\\ -26.2pt &No. 0\\ -22.6pt &No. 1 &Giant/English\\ -21.3pt &No. 2 &Giant/English\\ -19.9pt &No. 3 &Regular, Ordinary, Common\\ -19.1pt &No. 4 &Peter\\ -17.1pt &No. 5 &Large middle\\ -15.9pt &No. 6 &Small middle\\ -13.7pt &No. 7 &Cadenza\\ -11.1pt &No. 8 &Pearl\\ - \end{tabular} - \caption{Foo} - \label{fonts:staff-size} - \end{center} -\end{table} - - - - -\section{Beams} - -\subsection{Slope} - -Traditionally, beam slopes are computed by following a large and hairy -set of rules. Some of these are talked-about in Wanske, a more -recipy-like description can be found in Ross. - -There are some problems when trying to follow these rules: -\begin{itemize} - -\item the set is not complete - -\item they are not formulated as a general rule with exceptions, but -rather as a huge case of individual rules\cite{ross} - -\item in some cases, the result is wrong or ugly (or both) - -\item they try to solve a couple of problems at a time (e.g. Ross -handles ideal slope and slope-quantisation as a paired problem) -\end{itemize} -Reading Ross it is clear that the rules presented there are certainly -not the ultimate idea of what beam(slope)s should look like, but -rather a (very much) simplified hands-on recipy for a human engraver. - -There are good reasons not to follow those rules: - -\begin{itemize} -\item One cannot expect a human engraver to solve least-squares -problems for every beam - -\item A human engravers will allways trust themselves in judging the -outcome of the applied recipy. If, in a complicated case, the result -"doesn't look good", they will ignore the rules and draw their own -beams, based on experience. - -\item The exact rules probably don't "really exist" but in the minds - of good engravers, in the form of experience -\end{itemize} - -We'll propose to do a least-squares solve. This seems to be the best -way to calculate the slope for a computerised engraver such as Lily. - -It would be nice to have some rules to catch and handle "ugly" cases, -though. In general, the slope of the beam should mirror the pitches -of the notes. If this can't be done because there simply is no -uniform trend, it would probably be best to set the slope to zero. - - -\subsection{Quantising} - -The beams should be prevented to conflict with the stafflines, -especially at small slopes. Traditionally, poor printing techniques -imposed rather strict rules for quantisation. In modern (post 1955) -music printing we see that quality has improved substantially and -obsoleted the technical justification for following some of these -strict rules, notably the avoiding of so-called wedges. - - -\subsection{Thickness and spacing} - -The spacing of double and triple beams (sixteenth and thirtysecond beams) -is the same, quadruple and quintuple (thirtyfourth and hundredtwentyeighth -beams) is wider. -All beams are equally thick. Using the layout of triple beams and the -beam-thickness $bt$ we can calculate the inter-beam spacing $ib$. - -Three beams span two interlines, including stafflines: -\begin{eqnarray*} - 2 ib + bt &=& 2 il\\ - ib &=& (2 il - bt) / 2 -\end{eqnarray*} - -We choose -\begin{eqnarray*} - bt &=& 0.48(il - st) -\end{eqnarray*} - -\subsubsection{Quadruple beams} - -If we have more than three beams they must open-up -in order to not collide with staff lines. The only valid -position that remains is for the upper beam to hang. - -\begin{eqnarray*} - 3 ib_{4+} + bt &=& 3 il\\ - ib_{4+} &=& (3 il - bt) / 3 -\end{eqnarray*} - - -\section{Layout of the source files} - -The main font (with the fixed size music glyphs) uses a the \TeX\ -logfile as a communication device. Use the specialised macros to -create and export glyphs. - -\bibliographystyle{plain} -\bibliography{engraving} - - - -\end{document} - -\begin{verbatim} -Paul Terry writes: - -Ross states that the dies (the stamps to make the symbols) come in -12 different sizes. - ->Can you tell me how big rastrals are? - -According to the Score manual: - - Rastral Size Height in millimetres - - 0 9 mm - 1 8 mm - 2 7.5 mm - 3 7 mm - 4 6.5 mm - 5 6 mm - 6 5.5 mm - -I must say, despite having been a music setter for many years, I had to -look these up - none of the publishers I work for deal in Rastral sizes -these days (they all use millimetres). diff --git a/Documentation/programmer/lilypond-overview.doc b/Documentation/programmer/lilypond-overview.doc deleted file mode 100644 index a408a9e8eb..0000000000 --- a/Documentation/programmer/lilypond-overview.doc +++ /dev/null @@ -1,743 +0,0 @@ -%-*-LaTeX-*- - -\documentclass{article} -\usepackage{a4} -\def\postMudelaExample{\setlength{\parindent}{1em}} -\title{LilyPond, a Music Typesetter} -\author{HWN} -\usepackage{musicnotes} -\usepackage{graphics} - - -\begin{document} -\maketitle - -[THIS IS WORK IN PROGRESS. THIS IS NOT FINISHED] - -% -*-LaTeX-*- -\section{Introduction} - -The Internet has become a popular medium for collaborative work on -information. Its success is partly due to its use of simple, text-based -formats. Examples of these formats are HTML and \LaTeX. Anyone can -produce or modify such files using nothing but a text editor, they are -easily processed with run-of-the-mill text tools, and they can be -integrated into other text-based formats. - -Software for processing this information and presenting these formats -in an elegant form is available freely (Netscape, \LaTeX, etc.). -Ubiquitousness of the software and simplicity of the formats have -revolutionised the way people publish text-based information -nowadays. - -In the field of performed music, where the presentation takes the form -of sheet music, such a revolution has not started yet. Let us review -some alternatives that have been available for transmitting sheet -music until now: -\begin{itemize} -\item MIDI\cite{midi}. This format was designed for interchanging performances - of music; one should think of it as a glorified tape recorder - format. It needs dedicated editors, since it is binary. It does - not provide enough information for producing musical scores: some of - the abstract musical content of what is performed is thrown away. - -\item PostScript\cite{Postscript}. This format is a printer control - language. Printed musical scores can be transmitted in PostScript, - but once a score is converted to PostScript, it is virtually - impossible to modify the score in a meaningful way. - -\item Formats for various notation programs. Notation programs either - work with binary formats (e.g., NIFF\cite{niff-web}), need specific - platforms (e.g., Sibelius\cite{sibelius}), are proprietary or - non-portable tools themselves (idem), produce inadequate output - (e.g., MUP\cite{mup}), are based on graphical content (e.g., - MusixTeX\cite{musixtex1}), limit themselves to specific subdomains - (e.g., ABC\cite{abc2mtex}), or require considerable skill and - knowledge to use (e.g., SCORE\cite{score}) - -\item SMDL\cite{smdl-web}. This is a very rich ASCII format, that is - designed for storing many types of music. Unfortunately, there is - no implementation of a program to print music from SMDL available. - Moreover, SMDL is so verbose, that it is not suitable for human - production. - -\item TAB\cite{tablature-web}. Tab (short for tablature) is a popular - format, for interchanging music over e-mail, but it can only be used - for guitar music. -\end{itemize} - -In summary, sheet music is not published and edited on a wide scale -across the internet because no format for music -interchange exists that is: -\begin{itemize} -\item open, i.e., with publically available specifications. -\item based on ASCII, and therefore suitable for human consumption and - production. -\item rich enough for producing publication quality sheet music from - it. -\item based on musical content (unlike, for example, PostScript), and - therefore suitable for making modifications. -\item accompanied by tools for processing it that are freely available - across multiple platforms. -\end{itemize} - - -With the creation of LilyPond, we have tried to create both a -convenient format for storing sheet music, and a portable, -high-quality implementation of a compiler, that compiles the input -into a printable score. You can find a small example of LilyPond -input along with output in Figure~\ref{fig:intro-fig}. -% -\begin{figure}[htbp] - \begin{center} -\begin[verbatim]{mudela} - \score { - \notes - \context GrandStaff < - \transpose c'' { c4 c4 g4 g4 a4 a4 g2 } - { \clef "bass"; c4 c'4 - \context Staff f'4 c'4 e'4 c'4 } - > - \paper { - linewidth = -1.0\cm ; - } - } -\end{mudela} - \caption{A small example of LilyPond input} - \label{fig:intro-fig} - \end{center} -\end{figure} -% - - -The input language encodes musical events (such as notes and rests) on -the basis of their time-ordering. For example, the grammar includes -constructs that specify that notes start simultaneous and that notes -are to be played in sequence. In this encoding some context that is -present in sheet music is lost. - -The compiler reconstructs the notation from the encoded music. Its -operation comprises four different steps (see -Figure~\ref{fig:intro-steps}). - -\begin{description} -\item[Parsing] During parsing, the input is converted in a syntax tree. - -\item[Interpreting] In the \emph{interpreting} step, it is determined - which symbols have to be printed. Objects that correspond to - notation (\emph{Graphical objects}) are created from the syntax tree - in this phase. Generally speaking, for every symbol printed there is - one graphical object. These objects are incomplete: their position - and their final shape is unknown. - - The context that was lost by encoding the input in a language is - reconstructed during this conversion. -\item[Formatting] The next step is determing where symbols are to be - placed, this is called \emph{formatting}. -\item[Outputting] - Finally, all Graphical objects are outputted as PostScript or \TeX\ code. -\end{description} - -\def\staffsym{\vbox to 16pt{ - \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip - \vfil - \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip - \vfil - \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip - \vfil - \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip - \vfil - \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip -}} - -\def\vspacer{\vbox to 20pt{\vss}} -\begin{figure}[h] -\def\spacedhbox#1{\hbox{\ #1\ }} -\begin{eqnarray*} - {\spacedhbox{Input}\atop \hbox{\texttt{\{c8 c8\}}}} {\spacedhbox{Parsing}\atop\longrightarrow} - {\spacedhbox{Syntax tree}\atop\spacedhbox{\textsf{Sequential(Note,Note)}}} - {\spacedhbox{Interpreting}\atop\longrightarrow}\\ - \vspacer\\ - {\spacedhbox{Graphic objects}\atop\spacedhbox{\texttrebleclef \textquarterhead\texteighthflag\textquarterhead\texteighthflag \staffsym }} - {\spacedhbox{Formatting}\atop\longrightarrow} - {\spacedhbox{Formatted objects}\atop\hbox{ - \mudela{c''8 c''8} - }}\\ -\vspacer\\ - {\spacedhbox{Outputting}\atop\longrightarrow} - {\spacedhbox{PostScript code}\atop\hbox{\texttt{\%!PS-Adobe}\ldots}} -\end{eqnarray*} - \caption{Parsing, Interpreting, Formatting and Outputting} - \label{fig:intro-steps} -\end{figure} - - -The second step, the interpretation phase of the compiler, can be -manipulated as a separate entity: the interpretation process is -composed of many separate modules, and the behaviour of the modules is -parameterised. By recombining these interpretation modules, -and changing parameter settings, the same piece of music can be -printed differently, as is shown in Figure~\ref{fig:intro-interpret}. - -This makes it easy to extend the program. Moreover, this enables the -same music to be printed in different versions, e.g., in a conductors -score and in extracted parts. - - -\begin{figure}[h] - \begin{center} - \begin{mudela} - \score { - \notes - \context GrandStaff < - \transpose c'' { c4 c4 g4 g4 a4 a4 g2 } - { \clef "bass"; c4 c'4 - \context Staff f'4 c'4 e'4 c'4 } - > - \paper { - linewidth = -1.0\cm ; - \translator { - \VoiceContext - \remove "Stem_engraver"; - } - \translator { - \StaffContext - numberOfStaffLines = 3; - } - } - } - \end{mudela} - \caption{The interpretation phase can be manipulated: the same - music as in Figure~\ref{fig:intro-fig} is interpreted - differently: three staff lines and no stems.} - \label{fig:intro-interpret} - \end{center} -\end{figure} - - - -\section{Preliminaries} - -To understand the rest of the article, it is necessary to know -something about music notation and music typography. Since both -communicate music, we will explain some characteristics of instruments -and western music that motivate some notational constructs. - -\subsection{Music} - -Music notation is meant to be read by human performers. They sing or -play instruments that can produce sounds of different pitches. These -sounds are called \emph{notes}. Additionally, the sounds can be -articulated in differents ways, e.g., staccato (short and separated) -or legato (fluently bound together). The loudness of the notes can -also be varied. Changes in loudness are called \emph{dynamics}. - -Silence is also an element of music. The musical terminology for -silence within music is \emph{rest}. - -The basic unit of pitch is the \emph{octave}. The octave corresponds -to a frequency ratio of 1:2. For example the pitch denoted by a' -(frequency: 440 hertz) is one octave lower than a'' (frequency: 880 -hertz). Various instruments have a limited \emph{pitch range}, for -example, a trumpet has a range of about 2.5 octaves. Not all -instruments have ranges in the same register: a tuba also has a range -of 2.5 octaves, but the range of the tuba is much lower. - -Musicology has a confusing mix of relative and absolute measures for -pitches: the term `octave' refers to both a difference between two -pitches (the frequency ratio of 1:2), and to a range of pitches. For -example, the term `[eengestreept] octave' refers to the pitch range -between 261.6 Hz and 523.3 Hz. - - -The octave is divided into smaller pitch steps. In modern western -music, every octave is divided into twelve approximately equidistant -pitch steps, and each step is called a \emph{semitone}. Usually, the -pitches in a musical piece come from a smaller subset of these twelve -possible pitches. This smaller subset along with the musical -functions fo the pitches is called the -\emph{tonality}\footnote{Tonality also refers to the relations between - and functions of certain pitches. Since these do not have any - impact on notation, we ignore this} of the piece. - - -The standard tonality that forms the basis of music notation -(the key of C major) is a set of seven pitches within every octave. -Each of these seven is denoted by a name. In English, these are names -are (in rising pitch) denoted by c, d, e, f, g, a and b. Pitches that -are a semitone higher or lower than one of these seven can be -represented by suffixing the name with `sharp' or `flat' -respectively (this is called an \emph{chromatic alteration}). - -A pitch therefore can be fully specified by a combination of the -octave number, the note name and a chromatic alteration. -Figure~\ref{fig:intro-pitches} shows the relation between names and -frequencies. - - - - -\begin{figure}[h] - \begin{center} - [te doen] - \end{center} - \caption{Pitches in western music. The octave number is denoted - by a superscript.} - \label{fig:intro-pitches} -\end{figure} - - -Many instruments can produce more than one note at the same time, e.g. -pianos and guitars. When more notes are played simultaneously, they -form a so-called \emph{chord}. - -The unit of duration is the \emph{beat}. When playing, the tempo is -determined by setting the number of beats per minute. In western -music, beats are often stressed in a regular pattern: for example -Waltzes have a stress pattern that is strong-weak-weak, i.e. every -note that starts on a `strong' beat is louder and has more pronounced -articulation. This stress pattern is called \emph{meter}. - -\subsection{Music notation} - -Music notation is a system that tries to represent musical ideas -through printed symbols. Music notation has no precise definition, -but most conventions have described in reference manuals on music -notation\cite{read-notation}. - -In music notation, sounds and silences are represented by symbols that -are called note and rest respectively.\footnote{These names serve a - double purpose: the same terms are used to denote the musical - concepts.} The shape of notes and rests indicates their duration -(See figure~\ref{noteshapes}) relative to the whole note. - - -\begin{figure}[h] - \begin{center} -\begin{mudela} - \score { - \notes \transpose c''{ c\longa*1/4 c\breve*1/2 c1 c2 c4 c8 c16 c32 c64 } - \paper { - \translator { - \StaffContext - \remove "Staff_symbol_engraver"; - \remove "Time_signature_engraver"; -% \remove "Bar_engraver"; - \remove "Clef_engraver"; - } -linewidth = -1.; - } -} -\end{mudela} -\begin{mudela} - \score { - \notes \transpose c''\context Staff { r\longa*1/4 r\breve*1/2 r1 r2 r4 r8 r16 r32 r64 } - \paper { - \translator { - \StaffContext - \remove "Staff_symbol_engraver"; - \remove "Time_signature_engraver"; -% \remove "Bar_engraver"; - \remove "Clef_engraver"; - } - linewidth = -1.; - } -} -\end{mudela} - \caption{Note and rest shapes encode the length. At the top notes - are shown, at the bottom rests. From left to right a quadruple - note (\emph{longa}), double (\emph{breve}), whole, half, - quarter, eigth, sixteenth, thirtysecond and sixtyfourth. Each - note has half of the duration of its predecessor.} - \label{fig:noteshapes} -\end{center} -\end{figure} - - -Notes are printed in a grid of horizontal lines called \emph{staff} to -denote their pitch: each line represents the pitch of from the -standard scale (c, d, e, f, g, a, b). The reference point is the -\emph{clef}, eg., the treble clef marks the location of the $g^1$ -pitch. The notes are printed in their time order, from left to right. - - -\begin{figure}[h] - \begin{center} - \begin{mudela} - \score { \notes { - a4 b c d e f g a \clef bass; - a4 b c d e f g a \clef alto; - a4 b c d e f g a \clef treble; - } - \paper { linewidth = 15.\cm; } - } - \end{mudela} - \caption{Pitches ranging from $a, b, c',\ldots a'$, in different - clefs. From left right the bass, alto and treble clef are - featured.} - \label{fig:pitches} - \end{center} -\end{figure} - -The chromatic alterations are indicated by printing a flat sign or a -sharp sign in front of the note head. If these chromatic alterations -occur systematically (if they are part of the tonality of the piece), -then this indicated with a \emph{key signature}. This is a list of -sharp/flat signs which is printed next to the clef. - -Articulation is notated by marking the note shapes wedges, hats and -dots all indicate specific articulations. If the notes are to be -bound fluently (legato), the note shapes are encompassed by a smooth -curve called \emph{slur}, - -\begin{figure}[h] - \begin{center} - \begin{mudela} - c'4-> c'4-. g'4 ( b'4 ) g''4 - \end{mudela} - \caption{Some articulations. From left to right: extra stress - (\emph{marcato}), short (staccato), slurred notes (legato).} - \label{fig:articulation} - \end{center} -\end{figure} - - - -Dynamics are notated in two ways: absolute dynamics are indicated by -letters: \textbf{f} (from Italian ``forte'') stands for loud, -\textbf{p} (from Italian ``piano'') means soft. Gradual changes in -loudness are notated by (de)crescendos. These are hairpin like shapes -below the staff. - -\begin{figure}[h] - \begin{center} - \begin{mudela} - g'4\pp \< g'4 \! g'4 \ff \> g'4 g' \! g'\ppp - \end{mudela} - \caption{Dynamics: start very soft (pp), grow to loud (ff) and - decrease to extremely soft (ppp)} - \label{fig:dynamics} - \end{center} -\end{figure} - - -The meter is indicated by barlines: every start of the stress pattern -is preceded by a vertical line, the \emph{bar line}. The space -between two bar lines is called measure. It is therefore the unit of -the rhythmic pattern. - -The time signature also indicates what kind of rhythmic pattern is -desired. The time signature takes the form of two numbers stacked -vertically. The top number is the number of beats in one measure, the -bottom number is the duration (relative to the whole note) of the note -that takes one beat. Example: 2/4 time signature means ``two beats -per measure, and a quarter note takes one beat'' - -Chords are written by attaching multiple note heads to one stem. When -the composer wants to emphasize the horizontal relationships between -notes, the simultaneous notes can be written as voices (where every -note head has its own stem). A small example is given in -Figure~\ref{fig:simultaneous}. - -\begin{figure}[h] - \begin{center} - \begin{mudela} - \relative c'' {\time 2/4; - \context Staff < \context Voice = VA{ - \stemdown - c4 d - b16 b b b b b b b } - \context Voice = VB { - \stemup e4 f g8 g4 g8 } > - } - \end{mudela} - \caption{Notes sounding together. Chord notation (left, before - the bar line) emphasizes vertical relations, voice notation - emphasizes horizontal relations. Separate voices needn't have - synchronous rhythms (third measure). - } - \label{fig:simultaneous} - \end{center} -\end{figure} - -Separate voices do not have to share one rhythmic pattern---this is -also demonstrated in Figure~\ref{fig:simultaneous}--- they are in a sense%vaag -independent. A different way to express this in notation, is by -printing each voice on a different staff. This is customary when -writing for piano (both left and right hand have a staff of their own) -and for ensemble (every instrument has a staff of its own). - - - -\subsection{Music typography} - -Music typography is the art of placing symbols in esthetically -pleasing configuration. Little is explicitly known about music -typography. There are only a few reference works -available\cite{ross,wanske}. Most of the knowledge of this art has -been transmitted verbally, and was subsequently lost. - -The motivation behind choices in typography is to represent the idea -as clearly as possible. Among others, this results in the following -guidelines: -\begin{itemize} -\item The printed score should use visual hints to accentuate the - musical content -\item The printed score should not contain distracting elements, such - as large empty regions or blotted regions. -\end{itemize} - -An example of the first guideline in action is the horizontal spacing. -The amount of space following a note should reflect the duration of -that note: short notes get a small amount of space, long notes larger -amounts. Such spacing constraints can be subtle, for the -``amount of space'' is only the impression that should be conveyed; there -has to be some correction for optical illusions. See -Figure~\ref{fig:spacing}. - -\begin{figure}[h] - \begin{center} - \begin{mudela} - \relative c'' { \time 3/4; c16 c c c c8 c8 | f4 f, f' } - \end{mudela} - \caption{Spacing conveys information about duration. Sixteenth - notes at the left get less space than quarter notes in the - middle. Spacing is ``visual'', there should be more space - after the first note of the last measure, and less after second. } - \label{fig:spacing} - \end{center} -\end{figure} - -Another example of music typography is clearly visible in collisions. -When chords or separate voices are printed, the notes that start at -the same time should be printed aligned (ie., with the same $x$ -position). If the pitches are close to each other, the note heads -would collide. To prevent this, some notes (or note heads) have to be -shifted horizontally. An example of this is given in -Figure~\ref{fig:collision}. -\begin{figure}[h] - \begin{center} - [todo] - \caption{Collisions} - \label{fig:collision} - \end{center} -\end{figure} - -\bibliographystyle{hw-plain} -\bibliography{engraving,boeken,colorado,computer-notation,other-packages} - -\section{Requirements} - - -\section{Approach} - -\subsection{Input} - -The input format consists of combining a symbolic representation of -music with style sheet that describes how the symbolic presentation -can converted to notation. The symbolic representation is based on a -context free language called \textsf{music}. Music is a recursively -defined construction in the input language. It can be constructed by -combining lists of \textsf{music} sequentially or parallel or from -terminals like notes or lyrics. - -The grammar for \textsf{music} is listed below. It has been edited to -leave out the syntactic and ergonomic details. - -\begin{center} - \begin{tabular}{ll} -Music: & SimpleMusic\\ - & $|$ REPEATED int Music ALTERNATIVE MusicList\\ - & $|$ SIMULTANEOUS MusicList\\ - & $|$ SEQUENTIAL MusicList\\ - & $|$ CONTEXT STRING '=' STRING Music\\ - & $|$ TIMES int int Music \\ - & $|$ TRANSPOSE PITCH Music \\ -SimpleMusic: & $|$ Note\\ - & $|$ Lyric\\ - & $|$ Rest\\ - & $|$ Chord\\ - & $|$ Command\\ -Command: & METERCHANGE\\ - & $|$ CLEFCHANGE\\ - &$|$ PROPERTY STRING '=' STRING\\ -Chord: &PitchList DURATION\\ -Rest: &REST DURATION\\ -Lyric: &STRING DURATION\\ -Note: &PITCH DURATION\\ -\end{tabular} -\end{center} - -The terminals are both purely musical concepts that have a duration, -and take a non-zero amount of musical time, like notes and lyrics, and -commands that behave as if they have no duration.\footnote{The - PROPERTY command is a generic mechanism for controlling the - interpretation, i.e. the musical style sheets. See [forward ref]} - -The nonterminal productions can -\begin{itemize} -\item Some productions combine multiple elements: one can specify that - element are to be played in sequence, simultaneously or repetitively. -\item There are productions for transposing music, and for dilating - durations of music: the TIMES production can be used to encode a - triplet.\footnote{A triplet is a group of three notes marked by a - bracket, that are played 3/2 times faster.} -\item - There are productions that give directions to the interpretation - engine (the CONTEXT production) -\end{itemize} - - -\section{Context in notation} - -Music notation relies heavily on context. Notational symbols do not -have meaning if they are not surrounded by other context elements. In -this section we give some examples how the reader uses this context do -derive meaning of a piece of notation. We will focus on the prime -example of context: the staff. - -A staff is the grid of five horizontal lines, but it contains more components : -\begin{itemize} -\item A staff can have a key signature (printed at the left) -\item A staff can have a time signature (printed at the left) -\item A staff has bar lines -\item A staff has a clef (printed at the left) -\end{itemize} - -It is still possible to print notes without these components, but one -cannot determine the meaning of the notes. -\begin{mudela} -\score{ -\notes \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } -\paper { - linewidth = -1.; - \translator { - \StaffContext - \remove "Time_signature_engraver"; -% \remove "Bar_engraver"; - \remove "Staff_symbol_engraver"; - \remove "Clef_engraver"; - \remove "Key_engraver"; - } - } -} -\end{mudela} - -As you can see, you can still make out the general form of the melody -and the rhythm that is to be played, but the notation is difficult to -read and the musical information is not complete. The stress -pattern in the notes can't be deduced from this output. For this, we -need a time signature. Adding barlines helps with finding the strong -and weak beats. -\begin{mudela} -\score { - \notes \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } - \paper{ - linewidth = -1.; -\translator{ - \StaffContext - \remove "Staff_symbol_engraver"; - \remove "Clef_engraver"; - \remove "Key_engraver";} - } - } -\end{mudela} - -It is impossible to deduce the exact pitch of the notes. One needs a -clef to do so. Staff lines help the eye in determining the vertical -position of a note wrt. to the clef. -\begin{mudela} -\score { - \notes \relative c' {\clef alto; \time 2/4; g'4 c,4 a'4 f4 e c d2 } - \paper { - linewidth = -1.; - } -} -\end{mudela} - -Now you know the pitch of the notes: you look at the start of the line -and see a clef, and with this clef, you can determine the notated pitches. -You have found the em(context) in which the notation is to be -interpreted! - - -\section{Interpretation context} - -Context (clef, time signature etc.) determines the relationship -between musical and its notation in notes. Because LilyPond writes -notation, context works the other way around for LilyPond: with -context a piece of music can be converted to notation. - -A reader remembers this context while reading the notation from left -to right. By analogy, LilyPond constructs this context while -constructing notes from left to right. This is what happens in the -``Interpretation'' phase from~\ref{fig:intro-fig}. In LilyPond, the -state of this context is a set of variables with their values; A staff -context contains variables like - -\begin{itemize} -\item current clef -\item current time signature -\item current key -\end{itemize} - -These variables determine when and how clefs, time signatures, bar -lines and accidentals are printed. - - -Staff is not the only form of context in notation. In polyphonic -music, the stem direction shows which notes form a voice: all notes of -the same voice have stems pointing in the same direction. The value -of this variable determines the appearance of the printed stems. - -In LilyPond ``Notation context'' is abstracted to a data structure -that is used, constructed and modified during the interpretation -phase. It contains context properties, and is responsible for -creating notational elements: the staff context creates symbols for -clefs, time signatures and key signatures. The Voice context creates -stems, note heads. - -For the fragment of polyphonic music below, -\begin{mudela} - \context Staff { c'4 < { \stemup c'4 } \context Voice = VB { \stemdown a4 } > } -\end{mudela} -A staff context is created. Within this staff context (which printed -the clef), a Voice context is created, which prints the first note. -Then, a second Voice context is created, with stem direction set to -``up'', and the direction for the other is set to down. Both Voice -contexts are still part of the same Staff context. - -In the same way, multiple staff scores are created: within the score -context, multiple staff contexts are created. Every staff context -creates the notation associated with a staff. - -\section{Discussion} - - - -\end{document} - -The complexity of music notation was tackled by adopting a modular -design: both the formatting system (which encodes the esthetic rules of -notation), and the interpretation system (which encodes the semantic -rules) are highly modular. - - -The difficulty in creating a format for music notation is rooted in -the fact that music is multi dimensional: each sound has its own -duration, pitch, loudness and articulation. Additionally, multiple -sounds may be played simultaneously. Because of this, there is no -obvious way to ``flatten'' music into a context-free language. - -The difficulty in creating a printing engine is rooted in the fact -that music notation complicated: it is very large graphical -``language'' with many arbitrary esthetic and semantic conventions. -Building a system that formats full fledged musical notation is a -challenge in itself, regardless of whether it is part of a compiler or -an editor. - -The fact that music and its notation are of a different nature, -implies that the conversion between input notation is non-trivial. - -In LilyPond we solved the above problem in the following way: - diff --git a/Documentation/programmer/musicnotes.sty b/Documentation/programmer/musicnotes.sty deleted file mode 100644 index 31d2f83a9c..0000000000 --- a/Documentation/programmer/musicnotes.sty +++ /dev/null @@ -1,43 +0,0 @@ - -\input lilyponddefs - -\def\fetdef#1#2{% - \def#1{\hbox{\char#2}}} - -% huh? from where -\input feta20.sty - -\font\fetasixteenfont=feta16 -\font\fetaelevenfont=feta11 -\def\fetafont{\fetasixteenfont} - -\newdimen\ild -\ild=4pt -\newdimen\stemthick -\stemthick=0.4pt - -\def\eighthstem{{\fetafont\vrule height 3.5ex width \stemthick depth0pt\raise - 3.5ex\hbox{\eighthflag}}} -\def\texteighthflag{{\fetafont\raise 0ex\hbox{\fetafont\eighthflag}}} -\def\textdeighthflag{{\fetafont\raise 0ex\hbox{\deighthflag}}} - -\def\texteighthnote{{\hbox{\hbox{\fetafont\quartball}\kern - -0.5\stemthick\eighthstem}}} -\def\quarterstem{{\fetafont\vrule height 3.5ex width \stemthick depth0pt}} -\def\textquarterstem{\quarterstem} -\def\textchord{{\hbox{\fetafont\lower.5ex\hbox to - 0pt{\textquarterhead}\raise.5ex\hbox{\textquarterhead}\kern - -0.5\stemthick\eighthstem}}} -\def\textbassclef{\hbox{\fetafont\bassclef}} -\def\texttrebleclef{\hbox{\fetafont\trebleclef}} -\def\textslur{\embeddedps{9.378744 -3.171539 3.923099 -3.171539 0.000000 0.000000 12.800000 0.000000 3.672177 -3.672177 9.127823 -3.672177 12.800000 0.000000 0.000000 0.000000 draw_slur}} - -\def\textmarcato{{\fetafont\raise 1ex\hbox{\hskip 1ex\sforzatoaccent}}} - - -\def\textquarterhead{\hbox{\fetafont\raise 2.5pt\hbox{\quartball}}} -\def\texteighthstem{\hbox{\lower 5pt\hbox{\eighthstem}}} -\def\texthalfnote{{\hbox{\hbox{\fetafont\halfball}\kern -0.5\stemthick\quarterstem}}} -\def\textquarternote{{\hbox{\hbox{\fetafont\quartball}\kern -0.5\stemthick\quarterstem}}} -\def\textflat{{\fetafont\raise 1ex\hbox{\flat}}} -\def\textsharp{{\fetafont\raise1ex\hbox{\sharp}}} diff --git a/flower/include/unionfind.hh b/flower/include/unionfind.hh deleted file mode 100644 index b83a673a5d..0000000000 --- a/flower/include/unionfind.hh +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef UNIONFIND_HH -#define UNIONFIND_HH -#include "array.hh" - -/** - which points of a graph are connected?. - Union find, a standard algorithm: - - Union_find represents an undirected graph of N points. You can - connect two points using #connect()#. #find (i)# finds a uniquely - determined representant of the equivalence class of points - connected to #i#. - - */ -struct Union_find { - void connect (int i, int j); - int find (int i); - bool equiv (int i, int j) { return find (i) == find (j); } - Union_find (int sz); - - /** - This array provides the representing point for each node in the graph. - */ - Array classes_; -}; -#endif diff --git a/flower/unionfind.cc b/flower/unionfind.cc deleted file mode 100644 index cb5afce6e4..0000000000 --- a/flower/unionfind.cc +++ /dev/null @@ -1,37 +0,0 @@ -#include "unionfind.hh" -/* - see a book on data structures - */ - -Union_find::Union_find (int n) -{ - classes_.set_size (n); - - for (int i=0; i < n; i++) - { - classes_[i] = i; - } -} - -int -Union_find::find (int i) -{ - int rep = i; - while (classes_[rep] != rep) - rep = classes_[rep]; - while (classes_[i] != rep) - { - int next =classes_[i]; - classes_[i] = rep; - i = next; - } - return rep; -} - -void -Union_find::connect (int i, int j) -{ - i = find (i); - j = find (j); - classes_[i] = j; -} -- 2.39.5