Pausen können mit @code{_} notiert werden. Klammern werden mit @code{[}
und @code{]} gesetzt. Text kann auch eingefügt werden nach den Regeln im
-Abschnitt @ref{Overview of text markup commands}.
+Abschnitt @ref{Text markup commands}.
@example
< [4 6] 8 [_! 12] > < 5 \markup @{ \number 6 \super (1) @} >
@menu
* Articulations::
* Dynamics::
+* New dynamic marks::
@end menu
@node Articulations
@internalsref{DynamicLineSpanner} verwaltet.
+@node New dynamic marks
+@subsubsection New dynamic marks
+
+UNTRANSLATED NODE: IGNORE ME
+
+
@node Curves
@subsection Curves
}
@end lilypond
-Es gibt drei Modi für die Abbildung der Tabulatur: den Standardmodus,
-einen ausführlichen Modus und einen knappen Modus. Die unterschiedlichen
-Modi werden angewählt, indem an den Befehl @code{fret-diagram} die Begriffe
-@code{-standard}, @code{-verbose} bzw. @code{-terse} angehängt werden.
-Die Modi produzieren gleichwertige Ausgaben, haben aber unterschiedliche
-Informationen im Beschriftungsbefehl. Details über die
-Beschriftungsbefehle finden sich im Abschnitt
- @ref{Overview of text markup commands}. Alle drei Modi werden im obigen
- Beispiel gezeigt.
+Es gibt drei Modi für die Abbildung der Tabulatur: den Standardmodus,
+einen ausführlichen Modus und einen knappen Modus. Die
+unterschiedlichen Modi werden angewählt, indem an den Befehl
+@code{fret-diagram} die Begriffe @code{-standard}, @code{-verbose}
+bzw. @code{-terse} angehängt werden. Die Modi produzieren
+gleichwertige Ausgaben, haben aber unterschiedliche Informationen im
+Beschriftungsbefehl. Details über die Beschriftungsbefehle finden sich
+im Abschnitt @ref{Text markup commands}. Alle drei Modi werden im
+obigen Beispiel gezeigt.
Einige graphische Eigenschaften können verändert werden. Genaueres zur
Schnittstelle für die Griffsymboleigenschaften findet sich unter
soll, indem seine Finger die Saiten nur berühren, anstatt sie vollständig
herunterzudrücken. Damit werden schlagzeugartige Geräusche erreicht,
die aber noch die ursprüngliche Tonhöhe ahnen lassen. Diese Spielart
-wird mit Kreuz-Notenköpfen notiert, wie im Abschnitt @ref{Special noteheads}
+wird mit Kreuz-Notenköpfen notiert, wie im Abschnitt @ref{Special note heads}
gezeigt.
gut @code{melodie}, @code{GLOBAL},
@code{rechteHandklavier}, oder @code{foofoobarbaz} heißen. Für mehr
Information siehe
-@ruser{Saving typing with identifiers and functions}.
+@ref{Saving typing with variables and functions}.
Eine komplette Definition des Eingabeformats findet sich
im Kapitel @ruser{File structure}.
@node Score is a (single) compound musical expression
@subsection Score is a (single) compound musical expression
-Im vorigen Kapitel, @ruser{How LilyPond files work},
+Im vorigen Kapitel, @ref{How LilyPond files work},
wurde die allgemeine Struktur einer LilyPond-Quelldatei
beschrieben. Aber anscheinend haben wir die wichtigste
Frage ausgelassen, nämlich wie man herausfindet, was nach
@noindent
Vielleicht wollen Sie noch einmal
-@ruser{Music expressions explained} überfliegen. In diesem
+@ref{Music expressions explained} überfliegen. In diesem
Kapitel wurde gezeigt, wie sich große musikalische Ausdrücke
aus kleinen Teilen zusammensetzen. Noten können zu Akkorden
verbunden werden usw. Jetzt gehen wir aber in die andere Richtung
beginnen.
@item
-@emph{@ref{Putting it all together}},
+@emph{@ref{Fundamental concepts}},
erklärt generelle Konzepte des LilyPond-Dateiformates. Wenn Sie sich nicht
sicher sind, wohin ein Befehl gesetzt werden soll, lesen Sie hier nach.
@itemize @bullet
@item
-@emph{@ref{Basic notation}},
+@emph{@ruser{Musical notation}},
erklärt alles über die grundlegenden Notationskonstruktionen. Dieses Kapitel
-ist für fast jedes Notationsprojekt nützlich.
+ist für fast jedes Notationsprojekt nützlich.
@item
-@emph{@ref{Instrument-specific notation}},
+@emph{@ruser{Specialist notation}},
erklärt spezifische Schwierigkeiten, die sich bei bestimmten Notationstypen
ergeben. Dieses Kapitel ist nur in entsprechenden Fällen bestimmter Instrumente
oder bei Gesang zu konsultieren.
@item
-@emph{@ref{Advanced notation}},
-erklärt komplizierte oder unübliche Anwendungen nach Notationsgegenstand geordnet.
-
-@item
-@emph{@ref{Changing defaults}},
+@emph{@ruser{Changing defaults}},
erklärt, wie des Layout getrimmt werden kann.
@item
-@emph{@ref{Non-musical notation}},
+@emph{@ruser{Non-musical notation}},
zeigt alles, was nicht direkt mit den Noten zu tun hat wie Titel, mehrere Sätze oder
wie man ein MIDI-Instrument auswählt.
@item
-@emph{@ref{Spacing issues}},
+@emph{@ruser{Spacing issues}},
befasst sich mit globalen Fragen wie der Definition von Papierformaten
oder wie man Seitenumbrüche definiert.
@item
-@emph{@ref{Interfaces for programmers}},
+@emph{@ruser{Interfaces for programmers}},
demonstriert die Erstellung von musikalischen Funktionen.
@end itemize
@ifhtml
Die
@end ifhtml
-@emph{@ref{Literature list}},
+@emph{@ruser{Literature list}},
enthält einige wichtige Quellen für alle, die mehr über Notation und
den Notensatz erfahren wollen.
die musikalischen Funktionen gebildet werden.
@item
-@emph{@ref{Notation manual tables}},
+@emph{@ruser{Notation manual tables}},
sind Tabellen, in denen Akkordbezeichnungen, MIDI-Instrumente,
Farbbezeichnungen und die Zeichen der Feta-Schriftart gesammelt sind.
@item
Die
-@emph{@ref{Cheat sheet}},
+@emph{@ruser{Cheat sheet}},
zeigt die wichtigsten LilyPond-Befehle.
@item
Der
-@emph{@ref{LilyPond command index}},
+@emph{@ruser{LilyPond command index}},
listet alle Befehle auf, die mit @code{\} anfangen.
@item
@seealso
-Im Handbuch: @ref{Manual staff switches}.
+Im Handbuch: @rlearning{Single staff}.
Programmreferenz: @internalsref{AutoChangeMusic}.
* List of colors::
* The Feta font::
* Note head styles::
+* Text markup commands::
+* Text markup list commands::
+* List of articulations::
+* All context properties::
+* Layout properties::
+* Identifiers::
+* Scheme functions::
@end menu
@node Chord name chart
kann direkt zugegriffen werden, indem man die übliche Textbeschriftung
benutzt. @code{\musicglyph} greift direkt auf die Notationsschriftart
zu (bspw. @code{g^\markup @{
-\musicglyph #"scripts.segno" @}}). Siehe auch @ref{Text markup}.
+\musicglyph #"scripts.segno" @}}). Siehe auch @ref{Formatting text}.
@lilypondfile[noindent]{font-table.ly}
@lilypondfile[noindent]{note-head-style.ly}
-@ignore
-@n ode All context properties
-@a ppendixsec All context properties
+@include markup-commands.tely
-@i nclude context-properties.tely
+@include markup-list-commands.tely
+@node List of articulations
+@appendixsec List of articulations
-@n ode Layout properties
-@ap pendixsec Layout properties
+@cindex Akzent
+@cindex Marcato
+@cindex Staccatissimo
+@cindex Espressivo
+@cindex Fermate
+@cindex Gedämpft
+@cindex Staccato
+@cindex Portato
+@cindex Tenuto
+@cindex Aufstrich
+@cindex Abstrich
+@cindex Fußbezeichnung
+@cindex Orgelpedalbezeichnung
+@cindex Triller
+@cindex Offen
+@cindex Flageolet
+@cindex Praller
+@cindex Mordent
+@cindex Doppelpraller
+@cindex Prallermordent
+@cindex Fingersatz
+@cindex Daumenbezeichnung
+@cindex Segno
+@cindex Coda
+@cindex Varcoda
-@in clude layout-properties.tely
+Hier ist eine Liste, die alle möglichen Zeichen darstellt:
+
+@lilypondfile[ragged-right,quote]{script-chart.ly}
+
+@node All context properties
+@appendixsec All context properties
+
+@include context-properties.tely
+
+
+@node Layout properties
+@appendixsec Layout properties
+
+@include layout-properties.tely
+
+
+@node Identifiers
+@appendixsec Identifiers
+
+@include identifiers.tely
+
+
+@node Scheme functions
+@appendixsec Scheme functions
+
+@include scheme-functions.tely
-@end ignore
* Writing pitches::
* Changing multiple pitches::
* Displaying pitches::
+* Note heads::
@end menu
* Key signature::
* Ottava brackets::
* Instrument transpositions::
+* Automatic accidentals::
+* Ambitus::
@end menu
@node Clef
UNTRANSLATED NODE: IGNORE ME
+
+@node Automatic accidentals
+@unnumberedsubsubsec Automatic accidentals
+
+UNTRANSLATED NODE: IGNORE ME
+
+@node Ambitus
+@unnumberedsubsubsec Ambitus
+
+UNTRANSLATED NODE: IGNORE ME
+
+
+@node Note heads
+@subsection Note heads
+
+UNTRANSLATED NODE: IGNORE ME
+
+@menu
+* Special note heads::
+* Easy notation note heads::
+* Shape note heads::
+* Improvisation::
+@end menu
+
+@node Special note heads
+@unnumberedsubsubsec Special note heads
+
+UNTRANSLATED NODE: IGNORE ME
+
+@node Easy notation note heads
+@unnumberedsubsubsec Easy notation note heads
+
+UNTRANSLATED NODE: IGNORE ME
+
+@node Shape note heads
+@unnumberedsubsubsec Shape note heads
+
+UNTRANSLATED NODE: IGNORE ME
+
+@node Improvisation
+@unnumberedsubsubsec Improvisation
+
+UNTRANSLATED NODE: IGNORE ME
@item @code{(volta @var{text})}
Setzt eine Volta-Klammer mit der Beschriftung @var{text}: Der Text
kann definiert werden als Textstring oder formatierter Text, siehe
-Abschnitt @ref{Text markup}. Es darf nicht vergessen werden, die
+Abschnitt @ref{Formatting text}. Es darf nicht vergessen werden, die
Schriftart zu verändern, weil die Standardschriftart für die Nummern
keine Buchstaben enthält.
* Automatic beams::
* Manual beams::
* Feathered beams::
+* Setting automatic beam behavior::
@end menu
@node Automatic beams
UNTRANSLATED NODE: IGNORE ME
+@node Setting automatic beam behavior
+@unnumberedsubsubsec Setting automatic beam behavior
+
+UNTRANSLATED NODE: IGNORE ME
+
@node Bars
@subsection Bars
<c e g>4 <c>8
@end lilypond
-Siehe @ref{Chord names} für mehr Information.
+Siehe @ref{Chord notation} für mehr Information.
@node Clusters
vermeiden. Zusätzliche Stimmen werden durch einen neuen Bezeichner
erstellt, wie das nächste Beispiel zeigt.
-@lilypond[quote,verbatim,ragged-right,relative=2]
+@lilypond[quote,verbatim,ragged-right]
voiceFive = #(context-spec-music (make-voice-props-set 4) 'Voice)
\relative c''' <<
@cindex Vorhalt
@subheading Grace notes
-Glossar: @rglos{grace notes}, @rglos{acciacccatura},
+Glossar: @rglos{grace notes}, @rglos{acciaccatura},
@rglos{appoggiatura}.
Verzierungen werden mit dem Befehl @code{\grace}
@seealso
-Benutzerhandbuch: @ruser{Piano music},
+Benutzerhandbuch: @ruser{Keyboard instruments},
@ruser{Displaying staves}.
@seealso
-@ruser{The \override command}, @ruser{Common tweaks}.
+@ruser{The \override command}, @ref{Common tweaks}.
@node Fixing overlapping notation
@section Fixing overlapping notation
-Im Kapitel @ruser{Moving objects} wurde gezeigt, wie man Texte
+Im Kapitel @ref{Moving objects} wurde gezeigt, wie man Texte
(@code{TextScript}-Objekte) verschiebt. Mit der gleichen
Technik können auch andere Objektklassen verschoben werden,
@code{TextScript} muss dann nur durch den Namen des Objektes
@code{\override TextScript #'extra-offset = ( 1 . -1)} benutzt. Aber
noch mehr Einfluss auf die Formatierung kann durch den Einsatz von
Scheme genommen werden. Eine vollständige Erklärung findet sich in der
- @ruser{Scheme tutorial} und den
+ @ref{Scheme tutorial} und den
@ruser{Interfaces for programmers}.
Scheme kann benutzt werden, um einfach nur Befehle zu @qq{überschreiben}
eines Tages umarrangieren wollen.
@item @strong{Trennen Sie Einstellungen} von den eigentlichen
-Noten. Siehe auch @ruser{Saving typing with identifiers and functions}
+Noten. Siehe auch @ref{Saving typing with variables and functions}
und
-@ruser{Style sheets}.
+@ref{Style sheets}.
@end itemize
@end example
@item @strong{Trennen Sie Einstellungen von den Noten}. Diese
-Empfehlung wurde schon im Abschnitt @ruser{General suggestions} gegeben,
+Empfehlung wurde schon im Abschnitt @ref{General suggestions} gegeben,
aber für große Projekte ist es unumgänglich. Muss z. B. die
Definition für @code{fdannp} verändert werden, so braucht
man es nur einmal vorzunehmen und die Noten in der Geigenstimme,
Die Benutzung von Variablen hilft auch, viele Schreibarbeit zu
vermeiden, wenn die Eingabesyntax von LilyPond sich verändert
-(siehe auch @ruser{Updating old files}). Wenn nur eine einzige
+(siehe auch @ref{Updating old files}). Wenn nur eine einzige
Definition (etwa @code{\dolce}) für alle Dateien verwendet wird
-(vgl. @ruser{Style sheets}), muss nur diese einzige Definition
+(vgl. @ref{Style sheets}), muss nur diese einzige Definition
verändert werden, wenn sich die Syntax ändert. Alle Verwendungen
des Befehles beziehen sich dann auf die neue Definition.
@subsection Style sheets
Die Ausgabe, die LilyPond erstellt, kann sehr stark modifiziert
-werden, siehe @ruser{Tweaking output} für Einzelheiten. Aber wie
+werden, siehe @ref{Tweaking output} für Einzelheiten. Aber wie
kann man diese Änderungen auf eine ganze Serie von Dateien
anwenden? Oder die Einstellungen von den Noten trennen? Das
Verfahren ist ziemlich einfach.
Hier ist ein Beispiel. Es ist nicht schlimm, wenn Sie nicht auf
Anhieb die Abschnitte mit den ganzen @code{#()} verstehen. Das
-wird im Kapitel @ruser{Advanced tweaks with Scheme} erklärt.
+wird im Kapitel @ref{Advanced tweaks with Scheme} erklärt.
@lilypond[quote,verbatim,ragged-right]
mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0)
@end lilypond
Es treten einige Probleme mit überlappenden Symbolen auf. Sie
-werden beseitigt mit den Tricks aus dem Kapitel @ruser{Moving objects}.
+werden beseitigt mit den Tricks aus dem Kapitel @ref{Moving objects}.
Aber auch die @code{mpdolce} und @code{tempoMark}-Definitionen
können verbessert werden. Sie produzieren das Ergebnis, das
gewünscht ist, aber es wäre schön, sie auch in anderen Stücken
Zeile finden.
Eine andere nützliche Technik zur Problemlösung ist es,
-@ruser{Minimal examples} zu konstruieren.
+@ref{Minimal examples} zu konstruieren.
@node Minimal examples
Tiefer gehende Information darüber, wie Stimmauszüge und Partituren
erstellt werden, finden sich im Notationshandbuch, siehe
-@ruser{Orchestral music}.
+@ref{Scores and parts}.
Das Setzen der Variablen, die das Verhalten von LilyPond beeinflussen
(@q{properties}), wird im Kapitel
Se pueden insertar espacios mediante el uso de @code{_}. Los corchetes se
escriben con @code{[} y @code{]}. También puede incluir cadenas de
-texto y elementos de marcado textuales, consulte @ref{Overview of text markup commands}.
+texto y elementos de marcado textuales, consulte @ref{Text markup commands}.
@example
< [4 6] 8 [_! 12] > < 5 \markup @{ \number 6 \super (1) @} >
una forma un poco fuerte de hacer desaparecer objetos, porque afectará
al pentagrama completo. Este método también influye en el espaciado, lo que podría ser
deseable o no. Un método más
-sofisticado de borrar objetos se muestra en @rlearning{Common tweaks}.
+sofisticado de borrar objetos se muestra en @rlearning{Further tweaking}.
El ejemplo siguiente muestra una aplicación práctica. Las líneas divisorias y las indicaciones
de compás están normalmente sincronizadas en toda la partitura. Esto se hace
Hemos estado hablando de @emph{el} objeto @code{Fingering}, pero realmente esto no significa
mucho. El archivo de inicialización (véase
-@rlearning{Default files})
+@ref{File structure})
@file{scm/@/define@/-grobs@/.scm} muestra el alma del @q{objeto},
@example
@section Chord notation
@menu
-* TODO chords fix::
+* Modern chords::
@end menu
-@node TODO chords fix
-@subsection TODO chords fix
+@node Modern chords
+@subsection Modern chords
@menu
* Entering chord names::
las barras de corchea o las ligaduras.
@warning{Para los tamaños de tipografía del @strong{texto}, consulte
-@ref{Common markup commands}.}
+@ref{Text markup list commands}.}
@lilypond[quote,fragment,relative=2,verbatim,ragged-right]
\huge
@snippets
@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
-{grid-lines-changing-their-appearance.ly}
+{grid-lines--changing-their-appearance.ly}
@seealso
Existen tres interfaces distintos para el marcado de los diagramas de trastes: estándar, escueto
y prolijo. Los tres interfaces producen unos elementos de marcado equivalentes, pero tienen
cantidades variables de información en la cadena de marcado. Se pueden encontrar
-más detalles sobre los interfaces de marcado en @ref{Overview of text markup commands}.
+más detalles sobre los interfaces de marcado en @ref{Text markup commands}.
Puede establecer un cierto número de propiedades gráficas según su elección.
Se pueden encontrar más detalles sobre el interface de las propiedades de los diagramas de trastes en
@cindex expresión musical compuesta
@cindex música, expresión compuesta de
-En la sección anterior, @ruser{How LilyPond files work} hemos podido
+En la sección anterior, @ref{How LilyPond files work} hemos podido
ver la organización general de los archivos de entrada de LilyPond.
Pero parece que nos saltamos la parte más importante: ¿cómo
averiguamos qué escribir después de @code{\score}?
@end quotation
@noindent
-Quizá encuentre útil dar un repaso a @ruser{Music expressions
+Quizá encuentre útil dar un repaso a @ref{Music expressions
explained}. En esta sección, vimos cómo elaborar grandes expresiones
musicales a partir de pequeñas piezas (comenzábamos con notas, luego
acordes, etc.). Ahora partiremos de una gran expresión musical y
tiene fácil solución. Presentamos aquí la plantilla completa para
soprano y cello.
-@lilypond[quote,verbatim,ragged-right]
-\version "2.11.38"
+@lilypond[quote,verbatim,ragged-right,addversion]
sopranoMusic = \relative c' {
\clef treble
\key c \major
Al combinar todo esto junto y escribir la música de los tres compases
del ejemplo anterior, obtenemos:
-@lilypond[quote,verbatim,ragged-right]
-\version "2.11.38"
+@lilypond[quote,verbatim,ragged-right,addversion]
global = { \key d \major \time 4/4 }
sopMusic = \relative c'' {
\clef "treble"
puede variar. Todo lo que nos queda es añadir la música, y combinar
todas las partes.
-@lilypond[quote,verbatim,ragged-right]
-\version "2.11.38"
+@lilypond[quote,verbatim,ragged-right,addversion]
\header {
title = "Jesu, meine Freude"
composer = "J S Bach"
@c -*- coding: utf-8; mode: texinfo; -*-
@c This file is part of lilypond.tely
@ignore
- Translation of GIT committish: 03184badb3c2378e1ab3eec6ee62a6bdc0609082
+ Translation of GIT committish: 23542761090f167ad42dbff7ef11d44a9c1374ac
When revising a translation, copy the HEAD committish of the
version that you are working on. See TRANSLATION for details.
la funcionalidad del programa quedaba como esculpida en piedra por los desarrolladores.
Este esquema resultó no ser muy satisfactorio por una serie de motivos:
-@itemize @bullet
+@itemize
@item Cuando LilyPond comete fallos,
los usuarios tienen la necesidad de superar las decisiones de formateo. Por
ello el usuario debe tener acceso
@section Keyboard instruments
@menu
-* Piano sections::
+* Common notation for keyboards::
+* Piano::
+* Accordion::
@end menu
@node Common notation for keyboards
@subsection Common notation for keyboards
@menu
-* Automatic staff changes::
-* Manual staff switches::
-* Pedals::
-* Staff switch lines::
-* Cross staff stems::
+* References for keyboards::
+* The piano staff::
+* Changing staff manually::
+* Changing staff automatically::
+* Staff-change lines::
+* Cross-staff stems::
@end menu
@node References for keyboards
@seealso
-En este manual: @ref{Manual staff switches}.
+En este manual: @ref{Inside the staff}.
Referencia del programa: @internalsref{AutoChangeMusic}.
@subsection Piano
@menu
-* Piano pedals::
+* Piano pedals::
@end menu
@node Piano pedals
@subsection Accordion
@menu
-* Discant symbols::
+* Discant symbols::
@end menu
@node Discant symbols
* List of colors::
* The Feta font::
* Note head styles::
-* Overview of text markup commands::
-* Overview of text markup list commands::
+* Text markup commands::
+* Text markup list commands::
* List of articulations::
* All context properties::
* Layout properties::
@lilypondfile[noindent]{note-head-style.ly}
-@node Overview of text markup commands
-@appendixsec Overview of text markup commands
-
+@ignore
Todas las instrucciones siguientes se pueden usar dentro de @code{\markup @{ @}}.
+@end ignore
@include markup-commands.tely
-@node Overview of text markup list commands
-@appendixsec Overview of text markup list commands
-
+@ignore
Todas las instrucciones siguientes se pueden utilizar con @code{\markuplines}.
+@end ignore
@include markup-list-commands.tely
@end lilypond
El ejemplo anterior muestra una notación polifónica prolija. La notación
-polifónica abreviada, descrita en @ref{Basic polyphony}, también se puede usar si
+polifónica abreviada, descrita en @rlearning{I'm hearing Voices}, también se puede usar si
las @internalsref{DrumVoice}s se instancian primero a mano. Por ejemplo,
@lilypond[quote,ragged-right,fragment,verbatim]
@rglos{double sharp},
@rglos{double flat},
@rglos{Pitch names},
-@rglos{quarter-tone}.
+@rglos{semitone}.
Manual de aprendizaje:
@rlearning{Accidentals and key signatures}.
@c -*- coding: utf-8; mode: texinfo; -*-
@ignore
- Translation of GIT committish: 4123193c08a3d9c8a54a3d058ab2be8511e4e075
+ Translation of GIT committish: b5ba45ccb092324961dac292dc58cc0eddbc7307
When revising a translation, copy the HEAD committish of the
version that you are working on. See TRANSLATION for details.
@subsubsection Chorded notes
@cindex acordes
+@cindex paréntesis en ángulo
+@funindex <
+@funindex >
+@funindex <...>
Un acorde se forma encerrando un conjunto de notas entre @code{<} y
@code{>}. Un acorde puede ir seguido de una duración o un conjunto de
articulaciones, como si fueran simples notas.
@lilypond[verbatim,ragged-right,fragment,quote,relative=1]
-<c e g>4 <c>8
+<c e g>2 <c f a>4-> <e g c>-.
@end lilypond
-Para ver más información sobre los acordes, consulte @ref{Entering chord
-names}.
+Para ver más información sobre los acordes, consulte @ref{Modern chords}.
@seealso
Glosario musical:
@rglos{chord}.
-Referencia de la notación: @ref{Entering chord names}.
+Manual de aprendizaje:
+@rlearning{Combining notes into chords}.
-Fragmentos de código:
-@lsrdir{Simultaneous,Simultaneous-notes}.
+Referencia de la notación:
+@ref{Modern chords}.
+
+Snippets:
+@rlsr{Simultaneous notes}.
@knownissues
-Las expresiones musicales como @code{<< @{ g8 e8 @} a4 >>} no se
-imprimen con exactitud. Utilice @code{<g a>8 <e a>8} en su lugar.
+Por algún motivo, expresiones musicales como @code{<< @{ g8 e8 @} a4
+>>}, que se deberían convertir en acordes, aparecen en dos pentagramas
+separados. Para evitarlo emplee acordes explícitos como en
+@code{<g a>8 <e a>8}.
@cindex racimo (cluster)
Un «cluster» o racimo indica que se deben tocar simultáneamente un
-conjunto de notas consecutivas. Se pueden denotar como la envolvente
-de un conjunto de notas. Se introducen aplicando la función
-@code{makeClusters} a una secuencia de cordes, p.ej.:
+conjunto de notas consecutivas. Se escriben aplicando la función
+@code{\makeClusters} a una secuencia de acordes, p.ej.:
@lilypond[quote,ragged-right,relative=2,fragment,verbatim]
-\makeClusters { <c e > <b f'> }
+\makeClusters { <g b>2 <c g'> }
@end lilypond
Se pueden mezclar en el mismo pentagrama notas normales y clusters,
@seealso
+Glosario musical:
+@rglos{cluster}.
+
Fragmentos de código:
-@lsrdir{Simultaneous,Simultaneous-notes}.
+@rlsr{Simultaneous notes}.
Referencia de funcionamiento interno:
@internalsref{ClusterSpanner},
@internalsref{ClusterSpannerBeacon},
@internalsref{Cluster_spanner_engraver}.
-Examples: @c @lsr{contemporary,cluster@/.ly}.
+@c Examples: @rlsr{contemporary,cluster@/.ly}.
+
+@knownissues
+
+Los clusters sólo tienen un buen aspecto cuando abarcan un mínimo de
+dos acordes. En caso contrario aperecerán excesivamente estrechos.
+Los clusters no llevan plica y por sí mismos no pueden indicar las
+duraciones. Los racimos separados necesitarían silencios de
+separación entre ellos.
@node Multiple voices
@subsection Multiple voices
adicionales se añaden definiendo una variable, como se muestra a
continuación:
-@lilypond[quote,verbatim,ragged-right,relative=2]
+@lilypond[quote,verbatim,ragged-right]
voiceFive = #(context-spec-music (make-voice-props-set 4) 'Voice)
\relative c''' <<
podemos establecer la propiedad @code{printPartCombineTexts} al valor
false.
-@lilypond[quote,verbatim,ragged-right,fragment,relative=2]
+@lilypond[quote,verbatim,ragged-right,fragment]
\new Staff <<
\set Staff.printPartCombineTexts = ##f
\partcombine
podemos establecer las propiedades @code{soloText}, @code{soloIIText}
y @code{aDueText}.
-@lilypond[quote,verbatim,ragged-right,fragment,relative=2]
+@lilypond[quote,verbatim,ragged-right,fragment]
\new Staff <<
\set Score.soloText = #"ichi"
\set Score.soloIIText = #"ni"
@lilypond[quote,fragment,verbatim]
\parallelMusic #'(voiceA voiceB) {
- r8 g'16[ c''] e''[ g' c'' e''] r8 g'16[ c''] e''[ g' c'' e''] |
- c'2 c'2 |
- r8 a'16[ d''] f''[ a' d'' f''] r8 a'16[ d''] f''[ a' d'' f''] |
- c'2 c'2 |
+ r8 g'16[ c''] e''[ g' c'' e''] r8 g'16[ c''] e''[ g' c'' e''] |
+ c'2 c'2 |
+ r8 a'16[ d''] f''[ a' d'' f''] r8 a'16[ d''] f''[ a' d'' f''] |
+ c'2 c'2 |
}
\new StaffGroup <<
\new Staff \new Voice \voiceA
Esto funciona bastante bien para música de piano.
@lilypond[quote,verbatim]
+global = { \key g \major \time 2/4 }
music = {
- \key c \major
- \time 4/4
\parallelMusic #'(voiceA voiceB voiceC voiceD) {
- % Bar 1
- r8 g'16[ c''] e''[ g' c'' e''] r8 g'16[ c''] e''[ g' c''
-e''] |
- c'2 c'2 |
- r8 a16[ d'] f'[ a d' f'] r8 a16[ d'] f'[ a d' f'] |
- c2 c2 |
+ % Bar 1
+ a'8 b' c'' d'' |
+ d'4 e' |
+ c16 d e f d e f g |
+ a,4 a,4 |
% Bar 2
- a'8 b' c'' d'' e'' f'' g'' a'' |
- d'4 d' d' d' |
- c16 d e f d e f g e f g a f g a b |
- a,4 a,4 a,4 a,4 |
+ e''8 f'' g'' a'' |
+ f'4 g' |
+ e16 f g a f g a b |
+ a,4 a,4 |
% Bar 3 ...
}
}
-\score {
+\score {
\new PianoStaff <<
- \music
- \new Staff <<
- \voiceA \\
- \voiceB
- >>
\new Staff {
- \clef bass
+ \global
+ <<
+ \voiceA \\
+ \voiceB
+ >>
+ }
+ \new Staff {
+ \global \clef bass
<<
\voiceC \\
\voiceD
@seealso
Fragmentos de código:
-@lsrdir{Simultaneous,Simultaneous-notes}
+@rlsr{Simultaneous notes}.
@c \version "2.11.38"
+@node Specialist notation
+@chapter Specialist notation
+
This chapter explains how to create musical notation for specific
types of instrument or in specific styles.
@appendixsec lilypond-book templates
Estas plantillas se usan para @code{lilypond-book}. Si no está familiarizado con este
-programa, consulte @rprogram{lilypond-book}.
+programa, consulte @rprogram{LilyPond-book}.
@appendixsubsec LaTeX
Algunas situaciones (como las indicaciones de dinámica) tienen propiedades de tipografía
establecidas como fijas. Si estamos creando texto en estas situaciones, se recomienda
cancelar dichas propiedades con
-@code{normal-text}. Consulte @ref{Overview of text markup commands} para
+@code{normal-text}. Consulte @ref{Text markup commands} para
ver más detalles.
@cindex make-dynamic-script
@end lilypond
@noindent
-Consulte @ref{Overview of text markup commands}, para ver una lista de todas las
+Consulte @ref{Text markup commands}, para ver una lista de todas las
instrucciones.
@code{\markup} se usa principalmente para indicaciones del tipo @internalsref{TextScript},
Algunas situaciones (como las indicaciones de dinámica) tienen propiedades de tipografía
preestablecidas. Si está creando texto en tales situaciones, recomendamos
cancelar dichas propiedades con
-@code{normal-text}. Consulte @ref{Overview of text markup commands}
+@code{normal-text}. Consulte @ref{Text markup commands}
para ver más detalles.
@seealso
-En el presente manual: @ref{Overview of text markup commands}.
+En el presente manual: @ref{Text markup commands}.
Referencia del programa: @internalsref{TextScript}.
@code{\markuplines} admite una lista de elementos de marcado, ya sea el resultado de
una instrucción de lista de marcado, o una lista de elementos o listas de elementos. Las
instrucciones incorporadas de lista de elementos de marcado se describen en
-@ref{Overview of text markup list commands}.
+@ref{Text markup list commands}.
@seealso
-En este manual: @ref{Overview of text markup list commands},
+En este manual: @ref{Text markup list commands},
@ref{New markup list command definition}.
@predefined
@seealso
-Notation Reference: @ruser{Simultaneous notes}.
+Referencia de la notación: @ruser{Simultaneous notes}.
@node Songs
La información sobre el título, autor, número de Opus y similares se
escriben en el bloque @code{\header}. Éste se encuentra fuera de la
expresión musical principal; el bloque @code{\header} normalmente se
-sitúa por debajo del @ruser{Version number}.
+sitúa por debajo del @ref{Version number}.
@example
\version @w{"@version{}"}
dos piezas. Comience con una de las plantillas del @ref{Templates} y
añada algunas notas. Si necesita un tipo de notación que no ha sido
tratada en el tutorial, eche un vistazo a la Referencia de Notación,
-empezando por @ruser{Basic notation}. Si quiere escribir música para
+empezando por @ruser{Musical notation}. Si quiere escribir música para
un conjunto instrumental que no está cubierto por ninguna plantilla,
consulte @ref{Extending the templates}.
@c -*- coding: utf-8; mode: texinfo; -*-
@c This file is part of lilypond.tely
@ignore
- Translation of GIT committish: 7cc6b12897031c450e3399d59cdb22ca9df4fd8c
+ Translation of GIT committish: 23542761090f167ad42dbff7ef11d44a9c1374ac
When revising a translation, copy the HEAD committish of the
version that you are working on. See TRANSLATION for details.
mezcla de notas, pero una búsqueda de texto por la palabra @q{fusión}
o @q{mezcla} nos lleva rápidamente a las sobreescrituras necesarias
para mezclar o fusionar notas con distinta cabeza y con o sin puntillo
-en @ruser{Collision Resolution}. En nuestro ejemplo tenemos que
+en @ruser{Collision resolution}. En nuestro ejemplo tenemos que
fusionar ambos tipos de nota en el transcurso de la sección polifónica
del compás 3; por tanto, en virtud de la información que aparece en la
Referencia de la Notación, escribimos
@node Other uses for tweaks
@subsection Other uses for tweaks
-@itemize
-
@cindex transparent, uso de la propiedad
@cindex objetos, hace invisibles
@cindex eliminar objetos
@cindex invisibles, objetos
@cindex ligar notas entre voces distintas
-@item
@subheading Tying notes across voices
El ejemplo siguiente muestra cómo conectar notas que están en
>>
@end lilypond
-@item
@subheading Simulating a fermata
@cindex sello, uso de la propiedad
separación de las notas, mientras que la segunda (sin «sello») no
influye.
-@end itemize
-
@node Using variables for tweaks
@subsection Using variables for tweaks
@lilypond[ragged-right,verbatim,fragment,quote]
\time 3/4
-\relative { c2 e4 g2. }
+\relative c' { c2 e4 g2. }
\addlyrics { play the game }
@end lilypond
@lilypond[ragged-right,verbatim,fragment,quote]
\time 3/4
-\relative { c2 e4 g2. }
+\relative c' { c2 e4 g2. }
\addlyrics { play the game }
\addlyrics { speel het spel }
\addlyrics { joue le jeu }
espacios entre las sílabas, o usar el símbolo de tilde curva
(@code{~}) para obtener una ligadura entre sílabas de la letra.
-@lilypond[quote,relative=2,ragged-right,fragment,verbatim]
+@lilypond[quote,ragged-right,fragment,verbatim]
\time 3/4
-\relative { c2 e4 g2 e4 }
+\relative c' { c2 e4 g2 e4 }
\addlyrics { gran- de_a- mi- go }
\addlyrics { pu- "ro y ho-" nes- to }
\addlyrics { pu- ro~y~ho- nes- to }
@c FIXME: quotes.
@lilypond[quote,ragged-right,fragment,verbatim]
-\relative { e4 f e d e f e2 }
+\relative c' { e4 f e d e f e2 }
\addlyrics { He said: “Let my peo ple go”. }
@end lilypond
@menu
* Automatic syllable durations::
* Manual syllable durations::
-* Multiple notes to one syllable::
+* Multiple syllables to one note::
* Multiple notes to one syllable::
* Skipping notes::
* Extenders and hyphens::
Referencia de funcionamiento interno: @internalsref{Lyrics}.
-@node Multiple notes to one syllable
-@subsubsection Multiple notes to one syllable
+@node Multiple syllables to one note
+@subsubsection Multiple syllables to one note
@funindex _
tanto debe asegurarse de tener instalada una tipografía (como
DejaVuLGC) que incluya este glifo.}.
-@lilypond[quote,relative=2,ragged-right,fragment,verbatim]
+@lilypond[quote,ragged-right,fragment,verbatim]
\time 3/4
-\relative { c2 e4 g2 e4 }
+\relative c' { c2 e4 g2 e4 }
\addlyrics { gran- de_a- mi- go }
\addlyrics { pu- "ro y ho-" nes- to }
\addlyrics { pu- ro~y~ho- nes- to }
Para que este cambio sea válido para la letra de la partitura
completa, establezca la propiedad dentro del @q{layout} o disposición.
-@lilypond[relative,verbatim,quote,ragged-right]
+@lilypond[verbatim,quote,ragged-right]
\score {
\relative c' {
c c c c
Hi, my name is Bert.
} \addlyrics {
\set vocalName = "Ernie "
- Oh, che -- ri, je t'aime
+ Oh, ché -- ri, je t'aime
}
@end lilypond
@lilypond[verbatim,ragged-right,quote]
%{
<<
- \relative \new Voice = "lahlah" {
+ \relative c' \new Voice = "lahlah" {
\set Staff.autoBeaming = ##f
c4
\slurDotted
texto se retrasará una nota más. Por ejemplo,
@lilypond[verbatim,ragged-right,quote]
-\relative { c c g' }
+\relative c' { c c g' }
\addlyrics {
twin -- \skip 4
kle
@lilypond[ragged-right,quote]
<<
- \relative \new Voice = "lahlah" {
+ \relative c' \new Voice = "lahlah" {
\set Staff.autoBeaming = ##f
c4
<<
@c -*- coding: utf-8; mode: texinfo; -*-
@c This file is part of lilypond.tely
@ignore
- Translation of GIT committish: 7cc6b12897031c450e3399d59cdb22ca9df4fd8c
+ Translation of GIT committish: 23542761090f167ad42dbff7ef11d44a9c1374ac
When revising a translation, copy the HEAD committish of the
version that you are working on. See TRANSLATION for details.
tengan sus archivos. Sin embargo existen algunas otras cosas a tener
en cuenta cuando se escriben archivos de LilyPond.
-@itemize @bullet
+@itemize
@item ¿Qué ocurre si comete un fallo? La estructura de un archivo
de LilyPond puede hacer que ciertos errores se hagan más fáciles (o
más difíciles) de encontrar.
Presentamos algunas sugerencias que le pueden servir de ayuda para evitar
o corregir problemas:
-@itemize @bullet
+@itemize
@item @strong{Incluya los números de @code{\version} en todos los archivos}. Dese cuenta de que todas las
plantillas contienen información sobre la @code{\version}. Le
recomendamos mucho que siempre incluya la @code{\version}, sin
@code{convert-ly} requiere que declare qué versión de LilyPond
utilizó.
-@item @strong{Incluya comprobaciones}: @ruser{Bar and barnumber checks},
-@ruser{Octave check}. Si incluye comprobaciones de vez en cuando, en
+@item @strong{Incluya comprobaciones}: @rglos{baritone},
+@ruser{Absolute octave entry}. Si incluye comprobaciones de vez en cuando, en
caso de que cometa un error podrá localizarlo mucho más rápidamente.
¿Con qué frecuencia es @q{de vez en cuando}? Depende de la
complejidad de la música. Para una música muy sencilla, quizá tan
Si está introduciendo música a partir de una partitura existente (es decir, tipografiando una hoja
de música ya impresa),
-@itemize @bullet
+@itemize
@item Introduzca un sistema del manuscrito (la copia física) cada vez (pero mantenga
la práctica de escribir un compás por línea de texto), y compruebe
Al trabajar en proyecto grande se hace esencial tener una estructura clara
en los archivos de LilyPond
-@itemize @bullet
+@itemize
@item @strong{Utilice un identificador para cada voz}, con un mínimo de
estructura dentro de la definición. La estructura de la sección
Le caractère @code{_} insère un espace, et l'on peut imprimer des
crochets avec @code{[} et @code{]}. Vous pouvez aussi ajouter des
-chaînes de caractères ou des étiquettes --- cf. @ref{Overview of text
+chaînes de caractères ou des étiquettes --- cf. @ref{Text
markup commands}.
@example
les entrailles du programme, et de ce fait requiert l'emploi du Scheme.
Les fragments de Scheme, dans un fichier @code{.ly}, sont introduits par le
caractère @q{hash}, (@code{#}, improprement surnommé @q{dièse}).@footnote{Le
-@ref{Scheme tutorial} fournit quelques notions de base pour saisir des nombres,
+@rlearning{Scheme tutorial} fournit quelques notions de base pour saisir des nombres,
des listes, des chaînes de caractères ou des symboles, en Scheme.}
Il est possible d'aligner verticalement chaque nouveau contexte,
en-dessous ou au-dessus, par exemple dans le cas de musique vocale
-(@ref{Vocal ensembles}) ou d'@qq{ossias}.
+(@rlearning{Vocal ensembles}) ou d'@qq{ossias}.
@cindex ossia
@findex alignAboveContext
@qq{standard}, @qq{terse} ou @qq{verbeux}. Ces trois interfaces
produisent des schémas similaires, mais demandent d'entrer plus ou moins
d'informations. Vous trouverez tout les détails dans
-@ref{Overview of text markup commands}.
+@ref{Text markup commands}.
Par ailleurs, plusieurs propriétés permettent d'ajuster le graphisme
à votre convenance. Vous en trouverez les détails dans
la corde sans la presser, en un effet presque percussif, mais où la
hauteur est encore perceptible ---, on peut employer des têtes de notes
spéciales en forme de croix.
-Vous trouverez plus de détails dans @ref{Special noteheads}.
+Vous trouverez plus de détails dans @ref{Special note heads}.
variables sont sensibles à la casse, et ne peuvent contenir ni
chiffre, ni tiret, ni caractère accentué.} ; ce peut être
@code{melodie}, @code{global}, @code{maindroitepiano}, ou
-@code{laTeteAToto}. Pour plus de détails, voir @ruser{Saving typing
-with identifiers and functions}.
+@code{laTeteAToto}. Pour plus de détails, voir @ref{Saving
+typing with variables and functions}.
Pour une description complète du format des fichiers d'entrée, voir
@ruser{File structure}.
@noindent
Peut-être serait-il judicieux de relire la section
-@ruser{Music expressions explained}, dans laquelle vous avez
+@ref{Music expressions explained}, dans laquelle vous avez
appris à construire de grandes expressions musicales petit bout
par petit bout --- nous avons vu les notes, puis les accords, etc.
Maintenant, nous allons partir d'une grande expression musicale,
de notes. Ces voix additionnelles s'ajoutent en définissant un
identificateur, comme le montre l'exemple suivant :
-@lilypond[quote,verbatim,ragged-right,relative=2]
+@lilypond[quote,verbatim,ragged-right]
voiceFive = #(context-spec-music (make-voice-props-set 4) 'Voice)
\relative c''' <<
Cette variante sert à des expressions musicales qui peuvent être interprétées à
plusieurs niveaux. Par exemple, une commande telle que @code{\applyOutput} (voir
@c FIXME: broken link
-@c @ref{Running a function on all layout objects}) : si elle n'est pas associée avec
+@c @ruser{Running a function on all layout objects}) : si elle n'est pas associée avec
@code{\context}, elle s'applique par défaut dans le contexte @context{Voice}.
@example
mettre un peu d'ordre dans l'indentation. Voici le modèle pour
soprano et violoncelle au complet :
-@lilypond[quote,verbatim,ragged-right]
-\version "2.11.38"
+@lilypond[quote,verbatim,ragged-right,addversion]
sopranoMusic = \relative c' {
\clef treble
\key c \major
@ifhtml
Le
@end ifhtml
-@emph{@ruser{Tutorial}}
+@emph{@ref{Tutorial}}
propose une introduction en douceur à la typographie musicale.
Les utilisateurs débutants sont invités à commencer ici.
@item
-@emph{@ruser{Putting it all together}}
+@emph{@ref{Fundamental concepts}}
explique des concepts généraux du format de fichier ly. Si vous n'êtes
pas certain de l'endroit où placer une commande, lisez ce chapitre !
@item
-@emph{@ruser{Working on LilyPond projects}}
+@emph{@ref{Working on LilyPond projects}}
montre des utilisations pratiques de LilyPond et donne des conseils
afin d'éviter les problèmes les plus courants.
@item
-@emph{@ruser{Tweaking output}}
+@emph{@ref{Tweaking output}}
est une introduction aux retouches de gravure avec LilyPond.
@end itemize
@itemize @bullet
@item
-@emph{@ruser{Basic notation}}
+@emph{@ruser{Musical notation}}
traite de sujets groupés par type de notation. Cette section
détaille la notation de base, qui sera utile dans la plupart des
projets de partition.
@item
-@emph{@ruser{Instrument-specific notation}}
+@emph{@ruser{Specialist notation}}
traite de sujets groupés par type de notation. Cette section détaille
des notations spéciales qui ne seront utiles que pour des types
particuliers d'instruments ou la voix.
-@item
-@emph{@ruser{Advanced notation}}
-traite de sujets groupés par type de notation. Cette section
-donne des précisions à propos de notations compliquées et
-inhabituelles
-
@item
@emph{@ruser{Changing defaults}}
explique comment ajuster finement la mise en page.
@item
Le
-@emph{@ruser{Scheme tutorial}}
+@emph{@ref{Scheme tutorial}}
propose une courte introduction à Scheme, le langage de programmation
utilisé dans les fonctions de musique.
@item
Les
-@emph{@ruser{Templates}}
+@emph{@ref{Templates}}
de pièces LilyPond. Copiez et collez un modèle
dans un fichier, ajoutez les notes, et c'est prêt !
Les nuances ne sont pas centrées verticalement, mais il existe
des astuces. Voir à ce sujet le modèle @q{alignement des nuances au
-piano} au chapitre @ref{Piano templates}.
+piano} au chapitre @rlearning{Piano templates}.
@node Changing staff manually
@seealso
-Dans ce même manuel : @ref{Manual staff switches}.
+Dans ce même manuel : @ruser{Changing staff manually}.
Référence du programme : @internalsref{AutoChangeMusic}.
@node Notation manual tables
@appendix Notation manual tables
-UNTRANSLATED NODE: IGNORE ME
-
@menu
* Chord name chart::
* MIDI instruments::
* List of colors::
* The Feta font::
* Note head styles::
-* Overview of text markup commands::
-* Overview of text markup list commands::
+* Text markup commands::
+* Text markup list commands::
* List of articulations::
* All context properties::
* Layout properties::
UNTRANSLATED NODE: IGNORE ME
-
-@node Overview of text markup commands
-@appendixsec Overview of text markup commands
-
+@ignore
Vous pouvez utiliser les commandes suivantes au sein d'un bloc
@code{\markup @{ @}}.
+@end ignore
@include markup-commands.tely
-@node Overview of text markup list commands
-@appendixsec Overview of text markup list commands
-
+@ignore
Vous pouvez utiliser les commandes suivantes avec @code{\markuplines}.
+@end ignore
@include markup-list-commands.tely
<c e g>4 <c>8
@end lilypond
-Pour plus d'information à propos des accords, voir @ref{Chord names}.
+Pour plus d'information à propos des accords, voir @ref{Chord notation}.
@node Clusters
propriétés particulières et prédéfinies quant à leur police. Lorsque
vous créez du texte en pareille situation, nous vous recommandons
d'utiliser @code{normal-text} pour annuler ces propriétés. Voir
-@ref{Overview of text markup commands} pour plus de détails.
+@ref{Text markup commands} pour plus de détails.
@cindex make-dynamic-script
@noindent
Pour une liste des différentes commandes disponibles, consultez
-@ref{Overview of text markup commands}.
+@ref{Text markup commands}.
@code{\markup} est avant tout conçu pour gérer les
nuance, possèdent des propriétés prédéfinies quant à leur police.
Nous vous conseillons, en pareil cas, de réinitialiser ces propriétés
en utilisant @code{normal-text}. Pour plus d'informations, consultez
-@ref{Overview of text markup commands}.
+@ref{Text markup commands}.
@seealso
-Dans ce manuel : @ref{Overview of text markup commands}.
+Dans ce manuel : @ref{Text markup commands}.
Référence du programme : @internalsref{TextScript}.
@end verbatim
Les différentes commandes permettant de générer des listes de lignes
-se trouve dans @ref{Overview of text markup list commands}.
+se trouve dans @ref{Text markup list commands}.
@seealso
-Dans ce manuel : @ref{Overview of text markup list commands},
+Dans ce manuel : @ref{Text markup list commands},
@ref{New markup list command definition}.
@predefined
@end itemize
Vous trouverez plus d'astuces pour organiser vos fichiers LilyPond dans
-@ruser{Suggestions for writing LilyPond files}.
+@ref{Suggestions for writing LilyPond files}.
@node How to read the tutorial
@subsection How to read the tutorial
-Comme nous l'avons vu dans @ruser{Working on text files}, un code
+Comme nous l'avons vu dans @ref{Working on text files}, un code
LilyPond doit être encadré par des @{ @} ou bien par @code{\relative
c'' @{ ... @}} afin d'être compris. Cependant, dans la suite de ce
manuel, la plupart des exemples ne feront pas apparaître ces signes.
@node Relative note names
@subsection Relative note names
-Comme nous l'avons vu dans @ruser{Simple notation}, LilyPond calcule la
+Comme nous l'avons vu dans @ref{Simple notation}, LilyPond calcule la
hauteur de chaque note en fonction de la précédente@footnote{Il existe
-un autre mode de saisie des hauteurs, le mode @ruser{Absolute note
+un autre mode de saisie des hauteurs, le mode @ref{Absolute note
names}, mais en pratique il est bien plus aisé et sûr d'avoir recours
au mode de hauteurs relatives.}. Si aucune indication supplémentaire
d'octaviation n'est ajoutée, il en concluera que chaque hauteur est
@item nolets
voir @ruser{Tuplets},
@item levées
-voir @ruser{Partial measures}.
+voir @ruser{Upbeats}.
@end table
@end quotation
@node Multiple staves
@subsection Multiple staves
-Comme nous l'avons vu dans @ruser{Music expressions explained}, un fichier
+Comme nous l'avons vu dans @ref{Music expressions explained}, un fichier
d'entrée LilyPond est fait d'expressions musicales. Si la partition
commence par plusieurs expressions simultanées, LilyPond créera
plusieurs portées. Cependant, il est plus facile de voir ce qu'il
@cindex voix changeant manuellement de portée
La musique pour piano s'écrit sur deux portées reliées par une accolade.
Imprimer ce type de portée revient au même que dans l'exemple de musique
-polyphonique de @ruser{Multiple staves}, mais maintenant cette expression
+polyphonique de @ref{Multiple staves}, mais maintenant cette expression
entière doit être interprétée dans un contexte @code{PianoStaff} :
@example
@seealso
@quotation
-Voir @ruser{Piano music}.
+Voir @ruser{Keyboard instruments}.
@end quotation
@seealso
@quotation
Une liste complète de modificateurs et d'autres options de mise en forme
-se trouve à la section @ruser{Chords}.
+se trouve à la section @ruser{Chord notation}.
@end quotation
@subsection After the tutorial
Après avoir parcouru ce tutoriel, vous devriez vous essayer à écrire un
-morceau ou deux. Commencez par copier l'un des @ruser{Templates} types et
+morceau ou deux. Commencez par copier l'un des @ref{Templates} types et
ajoutez-y des notes. Si vous voulez employer une notation que vous
n'avez pas trouvé dans le tutoriel, consultez la référence de notation,
-en commençant par la @ruser{Basic notation}. Si vous désirez écrire pour
-un ensemble instrumental non couvert par les @ruser{Templates}, lisez la
-section @ruser{Extending the templates}.
+en commençant par la @ruser{Musical notation}. Si vous désirez écrire pour
+un ensemble instrumental non couvert par les @ref{Templates}, lisez la
+section @ref{Extending the templates}.
Après avoir écrit quelques pièces courtes, lisez les chapitres 3 à 5 du
manuel d'apprentissage. Rien ne s'oppose à ce que vous consultiez dès à
@node How to read the manual
@subsection How to read the manual
-Comme nous l'avons déjà vu dans @ruser{How to read the tutorial}, de
+Comme nous l'avons déjà vu dans @ref{How to read the tutorial}, de
nombreux exemples du tutoriel n'ont pas fait apparaître
@code{\relative c'' @{ ... @}} dans l'extrait de code affiché.
alors.
Pour en savoir plus sur l'organisation de la suite de ce manuel,
-reportez-vous à @ruser{About this manual}.
+reportez-vous à @ref{About this manual}.
@seealso
-Dans ce même manuel : @ruser{The \override command}, @ruser{Common tweaks}.
+Dans ce même manuel : @ruser{The \override command}, @ref{Common tweaks}.
@node Fixing overlapping notation
@section Fixing overlapping notation
-Dans la section @ruser{Moving objects}, nous avons vu comment
+Dans la section @ref{Moving objects}, nous avons vu comment
déplacer un objet @code{TextScript}. Ce même procédé peut être
appliqué à d'autres types d'objet : il vous suffira de remplacer
@code{TextScript} par le nom de l'objet en question.
@code{\override TextScript #'extra-offset = ( 1 . -1)}. Cependant,
l'utilisation de Scheme ouvre des possibilités encore plus grandes.
Pour des explications complètes là-dessus, consultez le
-@ruser{Scheme tutorial} et les @ruser{Interfaces for programmers}.
+@ref{Scheme tutorial} et les @ruser{Interfaces for programmers}.
On peut utiliser Scheme simplement à l'aide des commandes @code{\override}.
Le @emph{parlato} est du texte scandé en rythme, mais sans hauteurs
définies ; il est indiqué par des notes en croix, à l'instar des
-percussions --- voir @ref{Special noteheads}.
+percussions --- voir @ref{Special note heads}.
@node Setting simple songs
note d'une mélodie ou d'une voix existante, avec @code{\addlyrics} ou
@code{\lyricsto}.
@c TODO: broken but exists Aligning lyrics
-@c For more details see @ref{The Lyrics context}.
+@c For more details see @ref{Aligning contexts}.
Dans les paroles, un mot ou une syllabe commence par une lettre de
l'alphabet, et se termine par un espace (éventuellement précédé d'un
caractère souligné (@code{_}), ou encore utiliser un tilde (@code{~})
pour obtenir une liaison entre les syllabes.
-@lilypond[quote,relative=2,ragged-right,fragment,verbatim]
+@lilypond[quote,ragged-right,fragment,verbatim]
\time 3/4
-\relative { c2 e4 g2 e4 }
+\relative c' { c2 e4 g2 e4 }
\addlyrics { gran- de_a- mi- go }
\addlyrics { pu- "ro y ho-" nes- to }
\addlyrics { pu- ro~y~ho- nes- to }
Pour utiliser des lettres accentuées ou des caractères spéciaux
--- cœurs ou guillemets inversés par exemple --- il suffit de les insérer
dans le fichier et de veiller à sauvegarder ce dernier avec le codage
-utf-8. Voir à ce sujet @ref{Text encoding} pour plus de détails.
+UTF-8. Voir à ce sujet @ref{Text encoding} pour plus de détails.
@lilypond[quote,ragged-right,fragment,verbatim]
-\relative { e4 f e d e f e2 }
+\relative c' { e4 f e d e f e2 }
\addlyrics { He said: “Let my peo ple go”. }
@end lilypond
n'apparaîtra dans la partition que si le système dispose d'une police
installée qui contient ce symbole(par exemple DejaVuLGC).}.
-@lilypond[quote,relative=2,ragged-right,fragment,verbatim]
+@lilypond[quote,ragged-right,fragment,verbatim]
\time 3/4
-\relative { c2 e4 g2 e4 }
+\relative c' { c2 e4 g2 e4 }
\addlyrics { gran- de_a- mi- go }
\addlyrics { pu- "ro y ho-" nes- to }
\addlyrics { pu- ro~y~ho- nes- to }
@cindex choral score
Vous trouverez un exemple complet de partition pour chœur dans la
-section @ref{Vocal ensembles}.
+section @rlearning{Vocal ensembles}.
@predefined
Pour que ce réglage s'applique à toute la partition, définissez-le
dans le bloc @code{\layout}.
-@lilypond[relative,verbatim,quote,ragged-right]
+@lilypond[verbatim,quote,ragged-right]
\score {
\relative c' {
c c c c
Hi, my name is Bert.
} \addlyrics {
\set vocalName = "Ernie "
- Oh, che -- ri, je t'aime
+ Oh, ché -- ri, je t'aime
}
@end lilypond
suivant d'une note :
@lilypond[verbatim,ragged-right,quote]
-\relative { c c g' }
+\relative c' { c c g' }
\addlyrics {
twin -- \skip 4
kle
@lilypond[ragged-right,quote]
<<
- \relative \new Voice = "lahlah" {
+ \relative c' \new Voice = "lahlah" {
\set Staff.autoBeaming = ##f
c4
<<
viennent d'un défaut de parité entre @code{@{} et @code{@}}.
@item @strong{Séparez les affinages de mise en forme} de la musique
-elle-même. Voyez @ruser{Saving typing with identifiers and functions} et
-@ruser{Style sheets}.
+elle-même. Voyez @ref{Saving typing with variables and functions} et
+@ref{Style sheets}.
@end itemize
@end example
@item @strong{Séparez les retouches} des définitions de
-musique. Ce conseil a été vu dans @ruser{General suggestions},
+musique. Ce conseil a été vu dans @ref{General suggestions},
mais pour les projets d'importance c'est absolument vital. Nous
pouvons avoir besoin de changer la définition de
@code{fthenp}, mais dans ce cas nous n'aurons besoin de le faire
Utiliser les identificateurs est aussi un bon moyen pour vous épargner
du travail si la syntaxe de LilyPond change un jour --- voir
-@ruser{Updating old files}. Si vous avez une seule définition, par
-exemple @code{\dolce}, pour tous vos fichiers (voir @ruser{Style
+@ref{Updating old files}. Si vous avez une seule définition, par
+exemple @code{\dolce}, pour tous vos fichiers (voir @ref{Style
sheets}), et que la syntaxe change, alors vous n'aurez qu'à mettre à
jour votre seule définition @code{\dolce}, au lieu de devoir modifier
chaque fichier @code{.ly}.
@subsection Style sheets
La sortie que produit LilyPond peut être largement modifiée --- voir
-@ruser{Tweaking output} pour plus de détails. Mais que faire si vous
+@ref{Tweaking output} pour plus de détails. Mais que faire si vous
avez beaucoup de fichiers auxquels vous souhaitez appliquer vos
retouches ? Ou si vous souhaitez simplement séparer les retouches de
la musique elle-même ? Rien de plus facile.
Prenons un exemple. Ne vous inquiétez pas si vous ne comprenez pas
les parties avec tous les @code{#()}. Celles-ci sont expliquées dans
-@ruser{Advanced tweaks with Scheme}.
+@ref{Advanced tweaks with Scheme}.
@lilypond[quote,verbatim,ragged-right]
mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0)
@end lilypond
Il y a quelques problèmes de chevauchement ; nous allons arranger
-cela en utilisant les techniques de @ruser{Moving objects}. On peut
+cela en utilisant les techniques de @ref{Moving objects}. On peut
aussi faire quelque chose pour les définitions de @code{mpdolce}
et @code{tempoMark}. Elles produisent le résultat que nous désirons,
mais nous pourrions aussi vouloir les utiliser dans une autre pièce.
Une autre technique de déboguage très utile est la construction
@iftex
-de @ruser{Minimal examples}.
+de @ref{Minimal examples}.
@end iftex
@ifnottex
-d'@ruser{Minimal examples}.
+d'@ref{Minimal examples}.
@end ifnottex
Des informations plus détaillées sur la mise en place de conducteurs
et de parties séparées se trouvent dans le manuel : voir
-@ruser{Orchestral music}.
+@ruser{Writing parts}.
Les variables (@q{propriétés}) réglables sont abordées en détail dans
@ruser{Changing context properties on the fly}.
@end ignore
+@item
+Arpeggios may now use ``parenthesis'' style brackets:
+
+@lilypond[relative,ragged-right]
+ \override Arpeggio #'stencil = #ly:arpeggio::brew-chord-slur
+
+ % Note: does not work for cross staff arpeggios.
+ \override Arpeggio #'X-extent = #ly:grob::stencil-width
+ <c g' c>2\arpeggio ~ c
+@end lilypond
+
@item
Enclosing text within boxes with rounded corners is now possible,
using the @code{rounded-box} command.
Internals Reference: @rinternals{KeySignature}.
-Examples: @c @lsrdir{ancient}
@node Ancient rests
@subsubsection Ancient rests
@seealso
Examples:
-@c @lsrdir{chords}
Init files: @file{scm/@/chords@/-ignatzek@/.scm}, and
@file{scm/@/chord@/-entry@/.scm}.
@seealso
-Music Glossary: @rglos{tenuto}, @rglos{accent}, @rglos{staccato},
+Music Glossary:
+@rglos{tenuto},
+@rglos{accent},
+@rglos{staccato},
@rglos{portato}.
+Notation Reference:
+@ref{Controlling direction and placement}.
+
+Installed Files:
+@file{scm/@/script@/.scm}.
+
Snippets:
@rlsr{Expressive marks}.
-Internals Reference: @rinternals{Script},
+Internals Reference:
+@rinternals{Script},
@rinternals{TextScript}.
@node Dynamics
@subsubsection Dynamics
+@cindex absolute dynamics
@cindex dynamics
+@cindex dynamics, absolute
@funindex \ppppp
@funindex \pppp
@funindex \ppp
c1\!
@end lilypond
-A @notation{hairpin} normally starts at the left edge of the
-beginning note and ends on the right edge of the ending note. If
-the ending note falls on the downbeat, the @notation{hairpin} ends
-on the immediately preceding bar line. The following example
-illustrates this behavior:
-
-@c This example currently does not work. -pm
-@c TODO: Add link to new snippet for #'to-barline
-
Spacer notes are needed to engrave multiple marks on one note.
@lilypond[verbatim,quote,ragged-right,fragment,relative=2]
<< f1 { s4 s4\< s4\> s4\! } >>
@end lilypond
-If hairpins are too short, they can be lengthened using the
-following method:
-
-@lilypond[verbatim,quote,ragged-right,fragment,relative=2]
-c4\< c\! d\> e\!
-\override Voice.Hairpin #'minimum-length = #5
-<< f1 { s4 s4\< s4\> s4\! } >>
-@end lilypond
-
-@cindex espressivo, articulation
+@cindex espressivo articulation
In some situations the @code{\espressivo} articulation mark may be
-the appropriate choice to indicate a crescendo and decrescendo on
-one note:
+the appropriate choice to indicate a @notation{crescendo} and
+@notation{decrescendo} on one note:
@lilypond[verbatim,quote,ragged-right,fragment,relative=2]
c2 b4 a
g1\espressivo
@end lilypond
-@cindex al niente
-@cindex niente, al
-
-Hairpins may be printed with a circled tip (al niente notation):
-
-@lilypond[verbatim,quote,ragged-right,fragment,relative=2]
-\override Hairpin #'circled-tip = ##t
-c2\< c\!
-c4\> c\< c2\!
-@end lilypond
-
@cindex crescendo
@cindex decrescendo
@cindex diminuendo
@funindex \setHairpinDim
@funindex \setHairpinDecresc
-Crescendos and decrescendos can be engraved as @notation{cresc.},
-@notation{decresc.}, @notation{decr.}, or @notation{dim.} instead
-of using hairpins with the commands @code{\setTextCresc},
+@notation{Crescendos} and @notation{decrescendos} can be engraved
+as textual markings instead of hairpins. The built-in commands
+that enable these text modes are @code{\setTextCresc},
@code{\setTextDecresc}, @code{\setTextDecr}, and
@code{\setTextDim}. The corresponding @code{\setHairpinCresc},
-@code{\setHairpinDim}, and @code{\setHairpinDecresc} will revert
-to hairpins again:
+@code{\setHairpinDim}, and @code{\setHairpinDecresc} commands will
+revert to hairpins again:
@lilypond[verbatim,quote,ragged-right,fragment,relative=2]
-\setTextCresc
c\< d e f\!
-\setHairpinCresc
e\> d c b\!
+\setTextCresc
+c\< d e f\!
\setTextDecresc
-e\> d e f\!
-\setTextDecr
-c\> d e f\!
-\setTextDim
e\> d c b\!
+\setHairpinCresc
+c\< d e f\!
@end lilypond
-You can also supply your own texts and change the style of the
-spanner line with the properties @code{crescendoText},
-@code{crescendoSpanner}, @code{decrescendoText}, and
-@code{decrescendoSpanner}. Available values for the spanner
-properties are @code{hairpin}, @code{line}, @code{dashed-line},
-and @code{dotted-line}. If unset, a hairpin crescendo is used:
+The text used for @notation{crescendos} and
+@notation{decrescendos} can be changed by modifying the context
+properties @code{crescendoText} and @code{decrescendoText}. The
+style of the spanner line can be changed by modifying the context
+properties @code{crescendoSpanner} and @code{decrescendoSpanner}.
+Available values for the spanner properties are @code{'hairpin},
+@code{'line}, @code{'dashed-line}, and @code{'dotted-line}. If
+unset, a hairpin crescendo is used:
@lilypond[verbatim,quote,ragged-right,fragment,relative=1]
\set crescendoText = \markup { \italic "cresc. poco" }
\set crescendoSpanner = #'dotted-line
-a'2\< a a a a a a a\!\mf
+a'2\< a a a a a a a\mf
@end lilypond
To create new absolute dynamic marks or text that should be
@c Add LilyPond examples to these snippets. -pm
+@c A @notation{hairpin} normally starts at the left edge of the
+@c beginning note and ends on the right edge of the ending note. If
+@c the ending note falls on the downbeat, the @notation{hairpin} ends
+@c on the immediately preceding bar line. The following example
+@c illustrates this behavior:
+@c
+@c TODO: Add link to new snippet for #'to-barline
+
+If hairpins are too short, they can be lengthened using the
+following method:
+
+@lilypond[verbatim,quote,ragged-right,fragment,relative=2]
+c4\< c\! d\> e\!
+\override Voice.Hairpin #'minimum-length = #5
+<< f1 { s4 s4\< s4\> s4\! } >>
+@end lilypond
+
+@cindex al niente
+@cindex niente, al
+
+Hairpins may be printed with a circled tip (al niente notation):
+
+@lilypond[verbatim,quote,ragged-right,fragment,relative=2]
+\override Hairpin #'circled-tip = ##t
+c2\< c\!
+c4\> c\< c2\!
+@end lilypond
+
Dynamics that occur at, begin on, or end on the same note will be
vertically aligned. If you want to ensure that dynamics are
aligned when they do not occur on the same note, you can increase
\override DynamicLineSpanner #'staff-padding = #4
@end example
-@noindent
-You may also use this property if the dynamics are colliding with
-other notation.
-
@notation{Crescendi} and @notation{decrescendi} that cross a line
break will be continued on the second line. If they end on the
first note of a new line, nothing will be printed on that line.
Learning Manual:
@rlearning{Articulation and dynamics}.
+Notation Reference:
+@ref{Controlling direction and placement}.
+
Snippets:
@rlsr{Expressive marks}.
@seealso
-Music Glossary: @rglos{slur}
+Music Glossary:
+@rglos{slur}.
+
+Notation Reference:
+@ref{Controlling direction and placement}.
Snippets:
@rlsr{Expressive marks}.
-Internals Reference: @rinternals{Slur}.
+Internals Reference:
+@rinternals{Slur}.
@node Phrasing slurs
@seealso
+Notation Reference:
+@ref{Controlling direction and placement}.
+
Snippets:
@rlsr{Expressive marks}.
-Internals Reference: @rinternals{PhrasingSlur}
+Internals Reference:
+@rinternals{PhrasingSlur}.
@node Breath marks
@rlsr{Expressive marks}.
@c @lsr{expressive,breathing-sign.ly}.
-Internals Reference: @rinternals{BreathingSign}
+Internals Reference:
+@rinternals{BreathingSign}.
@node Falls and doits
@seealso
@c TODO: add falls and doits to glossary.
-@c Music Glossary: @rglos{falls}, @rglos{doits}.
+@c Music Glossary:
+@c @rglos{falls},
+@c @rglos{doits}.
Snippets:
@rlsr{Expressive marks}.
@seealso
-Music Glossary: @rglos{glissando}
+Music Glossary:
+@rglos{glissando}.
Snippets:
@rlsr{Expressive marks}.
@c @lsr{expressive,glissando.ly},
@c @lsr{expressive,line-styles.ly}
-Internals Reference: @rinternals{Glissando}
+Internals Reference:
+@rinternals{Glissando}.
@knownissues
@cindex arpeggio
@cindex broken chord
+@c Add documentation for new 'parenthesis' style arpeggio. Maybe
+@c create a new \arpeggioParen command, or something similar. -pm
+
You can specify an @notation{arpeggio} (also known as a
@notation{broken chord}) on a chord by attaching an
@code{\arpeggio} to the chord:
@c TODO: Add 'broken chord' to glossary.
-Music Glossary: @rglos{arpeggio}
+Music Glossary:
+@rglos{arpeggio}.
-Notation Reference: @ref{Ties}, for writing out arpeggios.
+Notation Reference:
+@ref{Ties}, for writing out arpeggios.
Snippets:
@rlsr{Expressive marks}.
-Internals Reference: @rinternals{Arpeggio},
+Internals Reference:
+@rinternals{Arpeggio},
@rinternals{PianoStaff}.
@seealso
-Music Glossary: @rglos{trill}
+Music Glossary:
+@rglos{trill}.
Snippets:
@rlsr{Expressive marks}.
-Internals Reference: @rinternals{TrillSpanner}
+Internals Reference:
+@rinternals{TrillSpanner}.
@seealso
-Examples: @c @lsrdir{guitar}
@node Right hand fingerings
examples this works well, but for more complex examples, especially
when additional commands are used, the implicit creation of contexts
can give surprising results, maybe creating extra unwanted staves.
-When entering more than a few lines of music it is advisable to
-always create staves and voices explicitly, see
+The way to create contexts explicitly is explained in
@ref{Contexts and engravers}.
+@warning{When entering more than a few lines of music it is
+advisable to always create staves and voices explicitly.}
+
For now, though, let us return to the first example and examine the
@code{\score} command, leaving the others to default.
@end quotation
@noindent
-You may find it useful to review
+To understand what is meant by a music expression and a compound
+music expression you may find it useful to review
@ref{Music expressions explained}. In that section, we saw how to
build big music expressions from small pieces -- we started from
notes, then chords, etc. Now we're going to start from a big
}
@end lilypond
+Now let's look at three different ways to notate the same passage
+of polyphonic music, each of which is advantageous in different
+circumstances, using the example from the previous section.
+
An expression that appears directly inside a @code{<< >>} belongs
to the main voice (but, note, @strong{not} in a @code{<< \\ >>}
construct). This is useful when extra voices appear while the
-main voice is playing. Here is a more correct rendition of the
-example from the previous section. The red diamond-shaped notes
+main voice is playing. Here is a more correct rendition of our
+example. The red diamond-shaped notes
demonstrate that the main melody is now in a single voice context,
permitting a phrasing slur to be drawn over them.
More deeply nested polyphony constructs are possible, and if a
voice appears only briefly this might be a more natural way to
-typeset the music.
+typeset the music:
@lilypond[quote,ragged-right,verbatim]
\new Staff \relative c' {
>>
@end lilypond
+@subsubheading Note columns
+
@cindex note column
@cindex shift commands
@funindex \shiftOff
Here is a example of the first line of a hymn with four
verses, set for SATB. In this case the words for all four
-parts are the same.
+parts are the same. Note how we use variables to separate the
+music notation and words from the staff structure. See too
+how a variable, which we have chosen to call @q{TimeKey}, is used
+to hold several commands for use within the two staves. In other
+examples this is often called @q{global}.
@lilypond[quote,verbatim]
TimeKey = { \time 4/4 \partial 4 \key c \major}
the single top-level @code{Score} context is introduced
with @code{\score}.
+You have seen many practical examples which created new
+@code{Staff} and @code{Voice} contexts in earlier sections, but
+to remind you how these commands are used in practice, here's an
+annotated real-music example:
+
+@lilypond[quote,verbatim,ragged-right]
+\score { % start single compound music expression
+ << % start of simultaneous staves section
+ \time 2/4
+ \new Staff { % create RH staff
+ \key g \minor
+ \clef "treble"
+ \new Voice { % create voice for RH notes
+ \relative c'' { % start of RH notes
+ d4 ees16 c8. |
+ d4 ees16 c8. |
+ } % end of RH notes
+ } % end of RH voice
+ } % end of RH staff
+ \new Staff << % create LH staff; needs two simultaneous voices
+ \key g \minor
+ \clef "bass"
+ \new Voice { % create LH voice one
+ \voiceOne
+ \relative g { % start of LH voice one notes
+ g8 <bes d> ees, <g c> |
+ g8 <bes d> ees, <g c> |
+ } % end of LH voice one notes
+ } % end of first LH voice
+ \new Voice { % create LH voice two
+ \voiceTwo
+ \relative g { % start of LH voice two notes
+ g4 ees |
+ g4 ees |
+ } % end of LH voice two notes
+ } % end of LH voice two
+ >> % end of LH staff
+ >> % end of simultaneous staves section
+} % end of single compound music expression
+@end lilypond
+
+(Note how all the statements which open a block with either a
+curly bracket, @code{@{}, or double angle brackets, @code{<<},
+are indented by two further spaces, and the corresponding
+closing bracket is indented by exactly the same amount. While
+this is not required, following this practice will greatly
+reduce the number of @q{unmatched bracket} errors, and is
+strongly recommended. It enables the structure of the music to
+be seen at a glance, and any unmatched brackets will be obvious.
+Note too how the LH staff is created using double angle brackets
+because it requires two voices for its music, whereas the RH staff
+is created with a single music expression surrounded by curly
+brackets because it requires only one voice.)
+
@cindex contexts, naming
@cindex naming contexts
>> % end ChoirStaff
\new PianoStaff <<
- \set PianoStaff.instrumentName = "Piano "
+ \set PianoStaff.instrumentName = "Piano"
\new Staff = "upper" \upper
\new Staff = "lower" \lower
>>
>> % end ChoirStaff
\new PianoStaff <<
- \set PianoStaff.instrumentName = "Piano "
+ \set PianoStaff.instrumentName = "Piano"
\new Staff = "upper" \upper
\new Staff = "lower" \lower
>>
Next we need to add a staff for the pedal organ.
This goes underneath the PianoStaff, but it must
be simultaneous with it, so we need angle brackets
-round the two. Missing these out would generate
+around the two. Missing these out would generate
an error in the log file. It's a common mistake
which you'll make sooner or later! Try copying
the final example at the end of this section,
g4 g f ees | d2 c2 |
}
ManualOneVoiceTwoMusic = \relative c' {
- ees16 d ees8~ ees16 f ees s c8 d~ d c~ |
+ ees16 d ees8~ ees16 f ees d c8 d~ d c~ |
c c4 b8 c8. g16 c b c d |
}
ManualTwoMusic = \relative c' {
@rlearning{Fixing overlapping notation}.
Notation Reference:
-@ruser{Stems},
-@ruser{Automatic beams}.
+@ref{Stems},
+@ref{Automatic beams}.
Snippets:
@rlsr{Keyboards}.
@rglos{time signature}
Notation Reference:
-@ruser{Ancient time signatures},
-@ruser{Time administration}.
+@ref{Ancient time signatures},
+@ref{Time administration}.
Snippets:
@rlsr{Rhythms}.
articulations, just like simple notes:
@lilypond[verbatim,ragged-right,fragment,quote,relative=1]
-<c e g>1 <c e g>->
+<c e g>2 <c f a>4-> <e g c>-.
@end lilypond
For more information about chords, see @ref{Modern chords}.
@ref{Modern chords}.
Snippets:
-@lsrdir{Simultaneous,Simultaneous-notes}.
+@rlsr{Simultaneous notes}.
@knownissues
-Music expressions like @code{<< @{ g8 e8 @} a4 >>} are not printed
-accurately. Use @code{<g a>8 <e a>8} instead.
+For some reason, music expressions like @code{<< @{ g8 e8 @} a4 >>}
+that should automatically turn into chords, appear splitted in two
+staves. To avoid this, use explicit chords instead as in
+@code{<g a>8 <e a>8}.
@node Clusters
@rglos{cluster}.
Snippets:
-@lsrdir{Simultaneous,Simultaneous-notes}.
+@rlsr{Simultaneous notes}.
Internals Reference:
-@internalsref{ClusterSpanner},
-@internalsref{ClusterSpannerBeacon},
-@internalsref{Cluster_spanner_engraver}.
+@rinternals{ClusterSpanner},
+@rinternals{ClusterSpannerBeacon},
+@rinternals{Cluster_spanner_engraver}.
-@c Examples: @lsr{contemporary,cluster@/.ly}.
+@c Examples: @rlsr{contemporary,cluster@/.ly}.
@knownissues
Normally, note heads with a different number of dots are not
merged, but when the object property
@code{merge-differently-dotted} is set in the
-@internalsref{NoteCollision} object, they are merged:
+@rinternals{NoteCollision} object, they are merged:
@lilypond[quote,verbatim,fragment,ragged-right,relative=2]
\new Voice << {
additional voices to avoid collisions between notes. Additional
voices are added by defining an variable, as shown below:
-@lilypond[quote,verbatim,ragged-right,relative=2]
+@lilypond[quote,verbatim,ragged-right]
voiceFive = #(context-spec-music (make-voice-props-set 4) 'Voice)
\relative c''' <<
levels.
When LilyPond cannot cope, the @code{force-hshift} property of the
-@internalsref{NoteColumn} object and pitched rests can be used to
+@rinternals{NoteColumn} object and pitched rests can be used to
override typesetting decisions.
@lilypond[quote,verbatim,ragged-right]
@seealso
Snippets:
-@lsrdir{Simultaneous,Simultaneous-notes}.
+@rlsr{Simultaneous notes}.
Internals Reference: the objects responsible for resolving collisions
are
-@internalsref{NoteCollision} and
-@internalsref{RestCollision}.
+@rinternals{NoteCollision} and
+@rinternals{RestCollision}.
@knownissues
If you just want the merging parts, and not the textual markings,
you may set the property @code{printPartCombineTexts} to false.
-@lilypond[quote,verbatim,ragged-right,fragment,relative=2]
+@lilypond[quote,verbatim,ragged-right]
\new Staff <<
\set Staff.printPartCombineTexts = ##f
\partcombine
set the @code{soloText}, @code{soloIIText}, and @code{aDueText}
properties.
-@lilypond[quote,verbatim,ragged-right,fragment,relative=2]
+@lilypond[quote,verbatim,ragged-right]
\new Staff <<
\set Score.soloText = #"ichi"
\set Score.soloIIText = #"ni"
@end lilypond
Both arguments to @code{\partcombine} will be interpreted as
-@internalsref{Voice} contexts. If using relative octaves,
+@rinternals{Voice} contexts. If using relative octaves,
@code{\relative} should be specified for both music expressions,
i.e.,
@rglos{a due}.
Snippets:
-@lsrdir{Simultaneous,Simultaneous-notes}.
+@rlsr{Simultaneous notes}.
Internals Reference:
-@internalsref{PartCombineMusic},
-@internalsref{Voice}.
+@rinternals{PartCombineMusic},
+@rinternals{Voice}.
@knownissues
Internally, the @code{\partcombine} interprets both arguments as
@code{Voice}s named @code{one} and @code{two}, and then decides
when the parts can be combined. Consequently, if the arguments
-switch to differently named @internalsref{Voice} contexts, the
+switch to differently named @rinternals{Voice} contexts, the
events in those will be ignored.
This works quite well for piano music.
-@c It would be nice if the first bar fit onto one 66-char line.
-@c Maybe simplify the example? -gp
@lilypond[quote,verbatim]
+global = { \key g \major \time 2/4 }
music = {
- \key c \major
- \time 4/4
\parallelMusic #'(voiceA voiceB voiceC voiceD) {
- % Bar 1
- r8 g'16[ c''] e''[ g' c'' e'']
- r8 g'16[ c''] e''[ g' c'' e''] |
- c'2
- c'2 |
- r8 a16[ d'] f'[ a d' f']
- r8 a16[ d'] f'[ a d' f'] |
- c2
- c2 |
+ % Bar 1
+ a'8 b' c'' d'' |
+ d'4 e' |
+ c16 d e f d e f g |
+ a,4 a,4 |
% Bar 2
- a'8 b' c'' d'' e'' f'' g'' a'' |
- d'4 d' d' d' |
- c16 d e f d e f g e f g a f g a b |
- a,4 a,4 a,4 a,4 |
+ e''8 f'' g'' a'' |
+ f'4 g' |
+ e16 f g a f g a b |
+ a,4 a,4 |
% Bar 3 ...
}
}
-\score {
+\score {
\new PianoStaff <<
- \music
- \new Staff <<
- \voiceA \\
- \voiceB
- >>
\new Staff {
- \clef bass
+ \global
+ <<
+ \voiceA \\
+ \voiceB
+ >>
+ }
+ \new Staff {
+ \global \clef bass
<<
\voiceC \\
\voiceD
@seealso
Snippets:
-@lsrdir{Simultaneous,Simultaneous-notes}.
+@rlsr{Simultaneous notes}.
a duration, so @code{1 4} is a longer duration
than @code{1 16}.
-@lilypond[relative,verbatim,line-width=12\cm]
+@lilypond[verbatim,line-width=12\cm]
\score {
\relative c'' {
g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 |
}
@end lilypond
-@lilypond[relative,verbatim,line-width=12\cm]
+@lilypond[verbatim,line-width=12\cm]
\score {
\relative c'' {
g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 |
be placed in either.
Much more detail on the options for tweaking the laying out
-of music are contained in @ruser{Spacing issues}.
+of music are contained in @ref{Spacing issues}.
@node Global sizes
@subsection Global sizes
Of course, the @code{\pageBreak} command also forces a line break.
Like @code{\break}, the @code{\pageBreak} command is effective only
at the end of a @q{complete} bar as defined above. For more
-details see @ruser{Page breaking} and following sections.
+details see @ref{Page breaking} and following sections.
There are also analogous settings to @code{ragged-right} and
@code{ragged-last} which have the same effect on vertical spacing:
@code{##t} the systems on all pages or just the last page
respectively will not be justified vertically.
-For more details see @ruser{Vertical spacing}.
+For more details see @ref{Vertical spacing}.
@node Fitting music onto fewer pages
@subsection Fitting music onto fewer pages
When investigating layout issues, @code{annotate-spacing} is
an invaluable tool. This command prints the values of various
-layout spacing commands; see @ruser{Displaying spacing}, for more
+layout spacing commands; see @ref{Displaying spacing}, for more
details. From the output of @code{annotate-spacing}, we can
see which margins we may wish to alter.
@item
Alter the horizontal spacing via @code{SpacingSpanner}. See
-@ruser{Changing horizontal spacing}, for more details. Here's
+@ref{Changing horizontal spacing}, for more details. Here's
an example first showing the default behavior:
@lilypond[verbatim,quote,ragged-right]
staff is stopped and started explicitely and white space is inserted
with the @code{\skip} command.
-@lilypond[verbatim,relative=2,quote]
+@lilypond[verbatim,quote]
<<
\new Staff \with
{
@lilypond[quote,ragged-right,verbatim]
\score {
- \context Staff \relative c'' { c8 c c16 c c c }
+ \new Staff \relative c'' { c8 c c16 c c c }
\layout{
\context {
\Staff
because the setting applies only to the specific staff inside
of which it is written.
-@lilypond[quote,ragged-right,verbatim,relative=2]
+@lilypond[quote,ragged-right,verbatim]
\layout {
\context {
\RemoveEmptyStaffContext
}
<<
- \context Staff = "picc" \picc
- \context Staff = "cbsn" \cbsn
+ \new Staff = "picc" \picc
+ \new Staff = "cbsn" \cbsn
>>
@end lilypond
@cindex markup text
@cindex typeset text
-A @code{\markup} block is used to typeset text with an extensible syntax,
-called @qq{markup mode}.
-Specific commands can be entered in this mode, using the
-backslash @code{\} character.
-@c TODO: move the following sentence (and add an example?) -vv
-To @emph{print} such characters as
-@code{\} and @code{#} in the output, use double
-quotation marks.
+A @code{\markup} block is used to typeset text with an extensible
+specific syntax called @qq{markup mode}.
-@lilypond[quote,verbatim,fragment,relative=1]
-c1^\markup { hello }
-c1_\markup { hi there }
-c1^\markup { hi \bold there, is \italic {anyone home?} }
-c1_\markup { "\special {weird} #characters" }
-@end lilypond
+@cindex markup expressions
+@cindex markup syntax
-@noindent
-An exhaustive list of @code{\markup}-specific commands can be found in
-@ref{Text markup commands}.
+The markup syntax is similar to LilyPond's usual syntax: a
+@code{\markup} expression is enclosed in curly braces @code{@{
+@dots{} @}}.
+In markup mode, specific commands are entered using the backslash
+@code{\} character. Such commands only affect the first following
+expression.
-@lilypond[quote,verbatim]
-\header{ title = \markup{ \bold { foo \italic { bar! } } } }
-\score{
- \relative c'' {
- \override Score.RehearsalMark
- #'break-visibility = #begin-of-line-invisible
- \override Score.RehearsalMark #'self-alignment-X = #right
-
- \set Staff.instrumentName = \markup{ \column{ Alto solo } }
- c2^\markup{ don't be \flat }
- \override TextSpanner #'bound-details #'left #'text = \markup{\italic rit }
- b2\startTextSpan
- a2\mark \markup{ \large \bold Fine }
- r2\stopTextSpan
- \bar "||"
- }
- \addlyrics { bar, foo \markup{ \italic bar! } }
-}
-@end lilypond
+Markup expressions may also be enclosed in double quotes
+@code{"..."}. Such expressions are treated as text strings
+and may not contain nested expressions or commands.
+Therefore, braces are generally prefered to double quotes;
+the following example demonstrates both syntaxes.
+@lilypond[quote,verbatim,fragment,relative=1]
+e1-\markup "intenso"
+a2^\markup { poco \italic più forte }
+c e1
+d2_\markup { \italic "string. assai" }
+e
+b1^\markup { \bold { molto \italic agitato } }
+c
+@end lilypond
+@cindex special characters in markup mode
+@cindex markup mode, special characters
+@cindex reserved characters, printing
+@cindex printing special characters
-@cindex font switching
-
-Some font switching commands are demonstrated here. Such commands
-apply only to the first following word; several words may be affected
-by enclosing them in braces.
-
-@example
-\markup @{ \bold @{ hi there @} @}
-@end example
+Special characters such as @code{\} and @code{#}
+can be printed in the output simply using double
+quotes. Double quotation marks are only printed
+in the output when preceded by backslashes:
-@c TODO: remove the following line and example? -vv
-@noindent
-For clarity, you can also do this for single arguments, e.g.,
-
-@example
-\markup @{ is \italic @{ anyone @} home @}
-@end example
+@lilypond[quote,verbatim,fragment,relative=1]
+\clef bass
+a^\markup "##\ LEPORELLO \##"
+a_\markup "Bravi! \"Cosa rara\"!"
+r a8 d
+cis a r4 r2
+@end lilypond
-The markup mode can be used to compose expressions, similar to
-mathematical expressions, XML documents, and music expressions.
-Such expressions can be vertically stacked, horizontally centered,
-or aligned in different ways:
+The way markup expressions are defined affects
+how these expressions will stacked, centered and aligned
+when using the commands explained in @ref{Text alignment}.
@lilypond[quote,verbatim,fragment,relative=1]
c1^\markup { \column { a bbbb \line { c d } } }
c1^\markup { \line { a b c } }
@end lilypond
-Lists with no previous command are not kept distinct. In
-the following example, the two @code{\markup} expressions
+Lists of words that are not enclosed with double quotes
+or preceded by a previous command are not kept distinct. In
+the following example, the first two @code{\markup} expressions
are equivalent:
-@c TODO: merge these two examples in a @lilypond example -vv
+@lilypond[quote,verbatim,fragment,relative=1]
+c1^\markup { \center-align { a bbb c } }
+c1^\markup { \center-align { a { bbb c } } }
+c1^\markup { \center-align { a \line { bbb c } } }
+@end lilypond
-@example
-\center-align @{ @{ a b @} @{ c d @} @}
-\center-align @{ a b c d @}
-@end example
-@noindent
+Markups can be stored in variables. These variables may be
+directly attached to notes:
-To keep lists of words distinct, please use quotes @code{"} or
-the @code{\line} command
+@lilypond[quote,verbatim]
+allegro = \markup { \bold \large Allegro }
-@lilypond[quote,verbatim,fragment,relative=1]
-\textLengthOn
-c4^\markup{ \center-align { on three lines } }
-c4^\markup{ \center-align { "all one line" } }
-c4^\markup{ \center-align { { on three lines } } }
-c4^\markup{ \center-align { \line { on one line } } }
+{
+ d''8.^\allegro
+ d'16 d'4 r2
+}
@end lilypond
-Markups can be stored in variables and these variables may be
-attached to notes, like
-@example
-allegro = \markup @{ \bold \large @{ Allegro @} @}
- @{ a^\allegro b c d @}
-@end example
+@noindent
+An exhaustive list of @code{\markup}-specific commands can be found in
+@ref{Text markup commands}.
-Some objects have alignment procedures of their own, which cancel
-out any effects of alignments applied to their markup arguments as
-a whole. For example, the @rinternals{RehearsalMark} is
-horizontally centered, so using @code{\mark \markup @{ \left-align
-.. @}} has no effect.
-In addition, vertical placement is performed after creating the
-text markup object. If you wish to move an entire piece of
-markup, you need to use the #'padding property or create an
-@q{anchor} point inside the markup (generally with @code{\hspace
-#0}).
+@seealso
+
+This manual: @ref{Text markup commands}.
+
+Snippets:
+@rlsr{Text}.
+
+Internals Reference: @rinternals{TextScript}.
+
+Init files: @file{scm/@/new@/-markup@/.scm}.
+
+
+@knownissues
+
+@c FIXME: this is totally deprecated, isn't it? -vv
+Kerning or generation of ligatures is only done when the @TeX{}
+backend is used. In this case, LilyPond does not account for them
+so texts will be spaced slightly too wide.
+
+@c is the following sentence really relevant? -vv
+Syntax errors for markup mode are confusing.
+
+
+@node Common markup commands
+@subsubsection Common markup commands
+
+Some basic formatting can be used blah blah
-@lilypond[quote,verbatim,fragment,relative=1]
-\textLengthOn
-c'4^\markup{ \raise #5 "not raised" }
-\once \override TextScript #'padding = #3
-c'4^\markup{ raised }
-c'4^\markup{ \hspace #0 \raise #1.5 raised }
-@end lilypond
-Some situations (such as dynamic marks) have preset font-related
-properties. If you are creating text in such situations, it is
-advisable to cancel those properties with @code{normal-text}. See
-@ref{Text markup commands}, for more details.
@ignore
TODO: here are some commands that could be described here.
@end ignore
-@seealso
-
-This manual: @ref{Text markup commands}.
-
-Snippets:
-@rlsr{Text}.
-
-Internals Reference: @rinternals{TextScript}.
-
-Init files: @file{scm/@/new@/-markup@/.scm}.
-
-
-@knownissues
-
-Kerning or generation of ligatures is only done when the @TeX{}
-backend is used. In this case, LilyPond does not account for them
-so texts will be spaced slightly too wide.
-Syntax errors for markup mode are confusing.
-@node Common markup commands
-@subsubsection Common markup commands
+@cindex font switching
-Some basic formatting can be used blah blah
+Some font switching commands are demonstrated here.
\italic
\upright
@node Text alignment
@subsubsection Text alignment
+
+Some objects have alignment procedures of their own, which cancel
+out any effects of alignments applied to their markup arguments as
+a whole. For example, the @rinternals{RehearsalMark} is
+horizontally centered, so using @code{\mark \markup @{ \left-align
+.. @}} has no effect.
+
+In addition, vertical placement is performed after creating the
+text markup object. If you wish to move an entire piece of
+markup, you need to use the #'padding property or create an
+@q{anchor} point inside the markup (generally with @code{\hspace
+#0}).
+
+@lilypond[quote,verbatim,fragment,relative=1]
+\textLengthOn
+c'4^\markup{ \raise #5 "not raised" }
+\once \override TextScript #'padding = #3
+c'4^\markup{ raised }
+c'4^\markup{ \hspace #0 \raise #1.5 raised }
+@end lilypond
+
+Some situations (such as dynamic marks) have preset font-related
+properties. If you are creating text in such situations, it is
+advisable to cancel those properties with @code{normal-text}. See
+@ref{Text markup commands}, for more details.
+
+
Alignment basics:
\left-align
\center-align
@lilypond[ragged-right,verbatim,fragment,quote]
\time 3/4
-\relative { c2 e4 g2. }
+\relative c' { c2 e4 g2. }
\addlyrics { play the game }
@end lilypond
@lilypond[ragged-right,verbatim,fragment,quote]
\time 3/4
-\relative { c2 e4 g2. }
+\relative c' { c2 e4 g2. }
\addlyrics { play the game }
\addlyrics { speel het spel }
\addlyrics { joue le jeu }
surround them with quotes or use a @code{_} character, to get spaces
between syllables, or use tilde symbol (@code{~}) to get a lyric tie.
-@lilypond[quote,relative=2,ragged-right,fragment,verbatim]
+@lilypond[quote,ragged-right,fragment,verbatim]
\time 3/4
-\relative { c2 e4 g2 e4 }
+\relative c' { c2 e4 g2 e4 }
\addlyrics { gran- de_a- mi- go }
\addlyrics { pu- "ro y ho-" nes- to }
\addlyrics { pu- ro~y~ho- nes- to }
To enter lyrics with characters from non-English languages, or with
accented and special characters (such as the heart symbol or slanted quotes),
simply insert the characters directly into the input file and save
-it with utf-8 encoding. See @ref{Text encoding}, for more info.
-
-FIXME: quotes.
+it with UTF-8 encoding. See @ref{Text encoding}, for more info.
@lilypond[quote,ragged-right,fragment,verbatim]
-\relative { e4 f e d e f e2 }
-\addlyrics { He said: ââ\82¬Å\93Let my peo ple goââ\82¬Â\9d. }
+\relative c' { e4 f e d e f e2 }
+\addlyrics { He said: â\80\9cLet my peo ple goâ\80\9d. }
@end lilypond
To use normal quotes in lyrics, add a backslash before the
sure to have a font (Like DejaVuLGC) installed that includes this
glyph.}.
-@lilypond[quote,relative=2,ragged-right,fragment,verbatim]
+@lilypond[quote,ragged-right,fragment,verbatim]
\time 3/4
-\relative { c2 e4 g2 e4 }
+\relative c' { c2 e4 g2 e4 }
\addlyrics { gran- de_a- mi- go }
\addlyrics { pu- "ro y ho-" nes- to }
\addlyrics { pu- ro~y~ho- nes- to }
For example,
@lilypond[verbatim,ragged-right,quote]
-\relative { c c g' }
+\relative c' { c c g' }
\addlyrics {
twin -- \skip 4
kle
To make this change for all lyrics in the score, set the property in the
layout.
-@lilypond[relative,verbatim,quote,ragged-right]
+@lilypond[verbatim,quote,ragged-right]
\score {
\relative c' {
c c c c
Hi, my name is Bert.
} \addlyrics {
\set stanza = "2. "
- Oh, chÃ\83© -- ri, je t'aime
+ Oh, ché -- ri, je t'aime
}
@end lilypond
+
@noindent
These numbers are put just before the start of the first syllable.
Hi, my name is Bert.
} \addlyrics {
\set vocalName = "Ernie "
- Oh, che -- ri, je t'aime
+ Oh, ché -- ri, je t'aime
}
@end lilypond
@lilypond[verbatim,ragged-right,quote]
%{
<<
- \relative \new Voice = "lahlah" {
+ \relative c' \new Voice = "lahlah" {
\set Staff.autoBeaming = ##f
c4
\slurDotted
@lilypond[ragged-right,quote]
<<
- \relative \new Voice = "lahlah" {
+ \relative c' \new Voice = "lahlah" {
\set Staff.autoBeaming = ##f
c4
<<
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=11
-PATCH_LEVEL=45
+PATCH_LEVEL=46
MY_PATCH_LEVEL=
--- /dev/null
+#!/usr/bin/env python
+
+"""
+check_texi_refs.py
+Interactive Texinfo cross-references checking and fixing tool
+
+
+"""
+
+
+import sys
+import re
+import os
+import optparse
+
+outdir = 'out-www'
+
+log = sys.stderr
+stdout = sys.stdout
+
+warn_not_fixed = "*** Warning: this broken x-ref has not been fixed!\n"
+
+opt_parser = optparse.OptionParser (usage='check_texi_refs.py [OPTION]... FILE',
+ description='''Check and fix \
+cross-references in a collection of Texinfo
+documents heavily cross-referenced each other.
+''')
+
+opt_parser.add_option ('-a', '--auto-fix',
+ help="Automatically fix cross-references whenever \
+it is possible",
+ action='store_true',
+ dest='auto_fix',
+ default=False)
+
+opt_parser.add_option ('-b', '--batch',
+ help="Do not run interactively",
+ action='store_false',
+ dest='interactive',
+ default=True)
+
+opt_parser.add_option ('-p', '--check-punctuation',
+ help="Check for punctuation after x-ref",
+ action='store_true',
+ dest='check_punctuation',
+ default=False)
+
+(options, files) = opt_parser.parse_args ()
+
+class InteractionError (Exception):
+ pass
+
+
+manuals = {}
+exit_code = 0
+
+def set_exit_code (n):
+ global exit_code
+ exit_code = max (exit_code, n)
+
+if options.interactive:
+ try:
+ import readline
+ except:
+ pass
+
+ def yes_prompt (question, default=False, retries=3):
+ d = {True: 'y', False: 'n'}.get (default, False)
+ while retries:
+ a = raw_input ('%s [default: %s]' % (question, d) + '\n')
+ if a.lower ().startswith ('y'):
+ return True
+ if a.lower ().startswith ('n'):
+ return False
+ if a == '' or retries < 0:
+ return default
+ stdout.write ("Please answer yes or no.\n")
+ retries -= 1
+
+ def search_prompt ():
+ """Prompt user for a substring to look for in node names.
+
+If user input is empty or matches no node name, return None,
+otherwise return a list of (manual, node name, file) tuples.
+
+"""
+ substring = raw_input ("Enter a substring to search in node names \
+(press Enter to skip this x-ref):\n")
+ if not substring:
+ return None
+ substring = substring.lower ()
+ matches = []
+ for k in manuals:
+ matches += [(k, node, manuals[k]['nodes'][node][0])
+ for node in manuals[k]['nodes']
+ if substring in node.lower ()]
+ return matches
+
+else:
+ def yes_prompt (question, default=False, retries=3):
+ return default
+
+ def search_prompt ():
+ return None
+
+ref_re = re.compile (r'@(ref|ruser|rlearning|rprogram|rglos)\{([^,\\]*?)\}(.)',
+ re.DOTALL)
+node_include_re = re.compile (r'(?m)^@(node|include)\s+(.+?)$')
+
+whitespace_re = re.compile (r'\s+')
+line_start_re = re.compile ('(?m)^')
+
+manuals_to_refs = {'lilypond': 'ruser',
+ 'lilypond-learning': 'rlearning',
+ 'lilypond-program': 'rprogram',
+ # 'lilypond-snippets': 'rlsr',
+ 'music-glossary': 'rglos'}
+
+def which_line (index, newline_indices):
+ """Calculate line number of a given string index
+
+Return line number of string index index, where
+newline_indices is an ordered iterable of all newline indices.
+"""
+ inf = 0
+ sup = len (newline_indices) - 1
+ n = len (newline_indices)
+ while inf + 1 != sup:
+ m = (inf + sup) / 2
+ if index >= newline_indices [m]:
+ inf = m
+ else:
+ sup = m
+ return inf + 1
+
+def read_file (f, d):
+ """Look for all node names and cross-references in a Texinfo document
+
+Return a dictionary with three keys:
+
+ 'manual' contains the cross-reference
+macro name which matches the base name of f in global manuals_to_refs
+dictionary,
+
+ 'nodes' is a dictionary of `node name':(file name, line number),
+
+ 'contents' is a dictionary of file:`full file contents'.
+
+ 'newline_indices' is a dictionary of
+file:[list of beginning-of-line string indices]
+
+Included files that can be read are processed too.
+
+"""
+ s = open (f).read ()
+ # TODO (maybe as option)
+ # s = trim_comments (s)
+ base = os.path.basename (f)
+ dir = os.path.dirname (f)
+ if d == {}:
+ d['manual'] = manuals_to_refs.get (os.path.splitext (base)[0], '')
+ print "Processing manual %s(%s)" % (f, d['manual'])
+ d['nodes'] = {}
+ d['contents'] = {}
+ d['newline_indices'] = {}
+
+ d['newline_indices'][f] = [m.end () for m in line_start_re.finditer (s)]
+ d['contents'][f] = s
+
+ for m in node_include_re.finditer (s):
+ if m.group (1) == 'node':
+ line = which_line (m.start (), d['newline_indices'][f])
+ d['nodes'][m.group (2)] = (f, line)
+
+ elif m.group (1) == 'include':
+ p = os.path.join (dir, m.group (2))
+ if os.path.isfile (p):
+ read_file (p, d)
+ else:
+ p = os.path.join (dir, outdir, m.group (2))
+ if os.path.isfile (p):
+ read_file (p, d)
+ return d
+
+log.write ("Reading files...\n")
+
+manuals = dict ([(d['manual'], d)
+ for d in [read_file (f, dict ()) for f in files]])
+
+ref_fixes = set ()
+fixes_count = 0
+
+def add_fix (old_type, old_ref, new_type, new_ref):
+ ref_fixes.add ((old_type, old_ref, new_type, new_ref))
+
+def lookup_fix (r):
+ found = []
+ for (old_type, old_ref, new_type, new_ref) in ref_fixes:
+ if r == old_ref:
+ found.append ((new_type, new_ref))
+ return found
+
+
+def preserve_linebreak (text, linebroken):
+ if linebroken:
+ if ' ' in text:
+ text = text.replace (' ', '\n', 1)
+ n = ''
+ else:
+ n = '\n'
+ else:
+ n = ''
+ return (text, n)
+
+def choose_in_numbered_list (message, string_list, sep=' ', retries=3):
+ S = set (string_list)
+ S.discard ('')
+ string_list = list (S)
+ numbered_list = sep.join ([str (j + 1) + '. ' + string_list[j]
+ for j in range (len (string_list))]) + '\n'
+ t = retries
+ while t > 0:
+ value = ''
+ stdout.write (message +
+ "(press Enter to discard and start a new search)\n")
+ input = raw_input (numbered_list)
+ if not input:
+ return ''
+ try:
+ value = string_list[int (input) - 1]
+ except IndexError:
+ stdout.write ("Error: index number out of range\n")
+ except ValueError:
+ matches = [input in v for v in string_list]
+ n = matches.count (True)
+ if n == 0:
+ stdout.write ("Error: input matches no item in the list\n")
+ elif n > 1:
+ stdout.write ("Error: ambiguous input (matches several items \
+in the list)\n")
+ else:
+ value = string_list[matches.index (True)]
+ if value:
+ return value
+ t -= 1
+ raise InteractionError ("%d retries limit exceeded" % retries)
+
+def check_ref (manual, file, m):
+ global fixes_count
+ type = m.group (1)
+ original_name = m.group (2)
+ name = whitespace_re.sub (' ', original_name). strip ()
+ newline_indices = manuals[manual]['newline_indices'][file]
+ line = which_line (m.start (), newline_indices)
+ linebroken = '\n' in m.group (2)
+ next_char = m.group (3)
+
+ # check for puncuation after x-ref
+ if options.check_punctuation and not next_char in '.,;:!?':
+ stdout.write ("Warning: %s: %d: `%s': x-ref not followed by punctuation\n"
+ % (file, line, name))
+
+ # validate xref
+ explicit_type = type
+ new_name = name
+
+ if type != 'ref' and type == manual:
+ stdout.write ("\n%s: %d: `%s': external %s x-ref should be internal\n"
+ % (file, line, name, type))
+ if options.auto_fix or yes_prompt ("Fix this?"):
+ type = 'ref'
+
+ if type == 'ref':
+ explicit_type = manual
+
+ if not name in manuals[explicit_type]['nodes']:
+ fixed = False
+ stdout.write ('\n')
+ if type == 'ref':
+ stdout.write ("%s: %d: `%s': wrong internal x-ref\n"
+ % (file, line, name))
+ else:
+ stdout.write ("%s: %d: `%s': wrong external `%s' x-ref\n"
+ % (file, line, name, type))
+ # print context
+ stdout.write ('--\n' + manuals[manual]['contents'][file]
+ [newline_indices[max (0, line - 2)]:
+ newline_indices[min (line + 3,
+ len (newline_indices) - 1)]] +
+ '--\n')
+
+ # try to find the reference in other manuals
+ found = []
+ for k in [k for k in manuals if k != explicit_type]:
+ if name in manuals[k]['nodes']:
+ if k == manual:
+ found = ['ref']
+ stdout.write (" found as internal x-ref\n")
+ break
+ else:
+ found.append (k)
+ stdout.write (" found as `%s' x-ref\n" % k)
+
+ if len (found) == 1 and (options.auto_fix
+ or yes_prompt ("Fix this x-ref?")):
+ add_fix (type, name, found[0], name)
+ type = found[0]
+ fixed = True
+
+ elif len (found) > 1:
+ if options.interactive or options.auto_fix:
+ stdout.write ("* Several manuals contain this node name, \
+cannot determine manual automatically.\n")
+ if options.interactive:
+ t = choose_in_numbered_list ("Choose manual for this x-ref by \
+index number or beginning of name:\n", found)
+ if t:
+ add_fix (type, name, t, name)
+ type = t
+ fixed = True
+
+ if not fixed:
+ # try to find a fix already made
+ found = lookup_fix (name)
+
+ if len (found) == 1:
+ stdout.write ("Found one previous fix: %s `%s'\n" % found[0])
+ if options.auto_fix or yes_prompt ("Apply this fix?"):
+ type, new_name = found[0]
+ fixed = True
+
+ elif len (found) > 1:
+ if options.interactive or options.auto_fix:
+ stdout.write ("* Several previous fixes match \
+this node name, cannot fix automatically.\n")
+ if options.interactive:
+ concatened = choose_in_numbered_list ("Choose new manual \
+and x-ref by index number or beginning of name:\n", [''.join ([i[0], ' ', i[1]])
+ for i in found],
+ sep='\n')
+ if concatened:
+ type, new_name = concatenated.split (' ', 1)
+ fixed = True
+
+ if not fixed:
+ # all previous automatic fixes attempts failed,
+ # ask user for substring to look in node names
+ while True:
+ node_list = search_prompt ()
+ if node_list == None:
+ if options.interactive:
+ stdout.write (warn_not_fixed)
+ break
+ elif not node_list:
+ stdout.write ("No matched node names.\n")
+ else:
+ concatenated = choose_in_numbered_list ("Choose \
+node name and manual for this x-ref by index number or beginning of name:\n", \
+ [' '.join ([i[0], i[1], '(in %s)' % i[2]]) for i in node_list],
+ sep='\n')
+ if concatenated:
+ t, z = concatenated.split (' ', 1)
+ new_name = z.split (' (in ', 1)[0]
+ add_fix (type, name, t, new_name)
+ type = t
+ fixed = True
+ break
+
+ # compute returned string
+ if new_name == name:
+ return ('@%s{%s}' % (type, original_name)) + next_char
+ else:
+ fixes_count += 1
+ (ref, n) = preserve_linebreak (new_name, linebroken)
+ return ('@%s{%s}' % (type, ref)) + next_char + n
+
+
+log.write ("Checking cross-references...\n")
+
+try:
+ for key in manuals:
+ for file in manuals[key]['contents']:
+ s = ref_re.sub (lambda m: check_ref (key, file, m),
+ manuals[key]['contents'][file])
+ if s != manuals[key]['contents'][file]:
+ open (file, 'w').write (s)
+
+except KeyboardInterrupt:
+ log.write ("Operation interrupted, exiting.\n")
+ sys.exit (2)
+
+except InteractionError, instance:
+ log.write ("Operation refused by user: %s\nExiting.\n" % instance)
+ sys.exit (3)
+
+log.write ("Done, fixed %d x-refs.\n" % fixes_count)
def mark_verbatim_section (ly_code):
return end_header_re.sub ('\\1 % begin verbatim\n', ly_code, 1)
-begin_header_re = re.compile ('\\header\\s*{', re.M)
+# '% LSR' comments are to be stripped
+lsr_comment_re = re.compile (r'\s*%+\s*LSR.*')
+
+begin_header_re = re.compile (r'\\header\s*{', re.M)
# add tags to ly files from LSR
def add_tags (ly_code, tags):
s = LY_HEADER_NEW + s
s = mark_verbatim_section (s)
+ s = lsr_comment_re.sub ('', s)
open (dest, 'w').write (s)
e = os.system ("convert-ly -e '%s'" % dest)
Drul_array ()
{
}
- Drul_array (T t1, T t2)
+ Drul_array (T const &t1, T const &t2)
+ {
+ set (t1, t2);
+ }
+ void set (T const &t1, T const &t2)
{
array_[0] = t1;
array_[1] = t2;
--- /dev/null
+
+\header {
+
+ texidoc = "There is a variant of the arpeggio sign that uses a
+ `vertical slur' instead of the wiggle."
+
+}
+
+\version "2.11.46"
+
+\relative c' {
+ \override Arpeggio #'stencil = #ly:arpeggio::brew-chord-slur
+
+ % Note: does not work for cross staff arpeggios.
+ \override Arpeggio #'X-extent = #ly:grob::stencil-width
+ <c g' c>2\arpeggio ~ c
+}
--- /dev/null
+\header {
+ texidoc = "You can put lyrics under completion heads."
+}
+\version "2.11.45"
+
+mel = \relative c'' {
+ c1. c1.
+}
+
+lyr = \lyricmode {
+ One two
+}
+
+\score {
+ \new Score <<
+ \new Staff <<
+ \new Voice = "completion" \with {
+ \remove "Note_heads_engraver"
+ \remove "Forbid_line_break_engraver"
+ \consists "Completion_heads_engraver"
+ } \mel
+ >>
+ \new Lyrics \lyricsto "completion" \lyr
+ >>
+}
--- /dev/null
+
+\version "2.11.45"
+
+\header {
+
+ texidoc = "In the single tie case, broken ties peek across line
+ boundaries to determine which direction to take."
+
+}
+
+
+\paper {
+ ragged-right = ##t
+}
+
+\relative c'' {
+ bes1~ \break
+ bes2.
+ \stemUp bes4 ~ \break
+ bes1
+}
*/
#include "align-interface.hh"
-#include "spanner.hh"
-#include "item.hh"
#include "axis-group-interface.hh"
-#include "pointer-group-interface.hh"
-#include "hara-kiri-group-spanner.hh"
#include "grob-array.hh"
+#include "hara-kiri-group-spanner.hh"
#include "international.hh"
+#include "item.hh"
+#include "paper-column.hh"
+#include "pointer-group-interface.hh"
+#include "spanner.hh"
+#include "skyline-pair.hh"
#include "system.hh"
#include "warn.hh"
-#include "paper-column.hh"
/*
TODO: for vertical spacing, should also include a rod & spring
#include "arpeggio.hh"
+#include "bezier.hh"
+#include "font-interface.hh"
#include "grob.hh"
+#include "lookup.hh"
#include "output-def.hh"
-#include "stem.hh"
+#include "pointer-group-interface.hh"
#include "staff-symbol-referencer.hh"
#include "staff-symbol.hh"
+#include "stem.hh"
#include "warn.hh"
-#include "font-interface.hh"
-#include "lookup.hh"
-#include "pointer-group-interface.hh"
Grob *
Arpeggio::get_common_y (Grob *me)
return mol.smobbed_copy ();
}
+MAKE_SCHEME_CALLBACK (Arpeggio, brew_chord_slur, 1);
+SCM
+Arpeggio::brew_chord_slur (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ Interval heads = robust_scm2interval (me->get_property ("positions"),
+ Interval())
+ * Staff_symbol_referencer::staff_space (me);
+
+ Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
+ Real dy = heads.length ();
+
+ Real height_limit = 1.5;
+ Real ratio = .33;
+ Bezier curve = slur_shape (dy, height_limit, ratio);
+ curve.rotate (M_PI / 2);
+
+ Stencil mol (Lookup::slur (curve, lt, lt));
+ mol.translate_axis (heads[LEFT], Y_AXIS);
+ return mol.smobbed_copy ();
+}
+
/*
We have to do a callback, because print () triggers a
vertical alignment if it is cross-staff.
#include "paper-column.hh"
#include "paper-score.hh"
#include "separation-item.hh"
+#include "skyline-pair.hh"
#include "stencil.hh"
#include "system.hh"
#include "warn.hh"
return scm_from_double (ret);
}
-extern bool debug_skylines;
MAKE_SCHEME_CALLBACK (Axis_group_interface, print, 1)
SCM
Axis_group_interface::print (SCM smob)
Stencil ret;
if (Skyline_pair *s = Skyline_pair::unsmob (me->get_property ("vertical-skylines")))
{
- ret.add_stencil (Lookup::points_to_line_stencil (0.1, (*s)[UP].to_points (X_AXIS)).in_color (255, 0, 255));
- ret.add_stencil (Lookup::points_to_line_stencil (0.1, (*s)[DOWN].to_points (X_AXIS)).in_color (0, 255, 255));
+ ret.add_stencil (Lookup::points_to_line_stencil (0.1, (*s)[UP].to_points (X_AXIS))
+ .in_color (255, 0, 255));
+ ret.add_stencil (Lookup::points_to_line_stencil (0.1, (*s)[DOWN].to_points (X_AXIS))
+ .in_color (0, 255, 255));
}
return ret.smobbed_copy ();
}
event->set_property ("pitch", pits);
event->set_property ("duration", note_dur.smobbed_copy ());
+ event->set_property ("length", Moment (note_dur.get_length ()).smobbed_copy ());
event->set_property ("duration-log", scm_from_int (note_dur.duration_log ()));
Item *note = make_note_head (event);
}
left_to_do_ -= note_dur.get_length ();
-
if (left_to_do_)
- get_global_context ()->add_moment_to_process (now.main_part_ + left_to_do_);
+ get_global_context ()->add_moment_to_process (now.main_part_ + note_dur.get_length());
/*
don't do complicated arithmetic with grace notes.
*/
note_events_.clear ();
prev_notes_.clear ();
}
+ context ()->set_property ("completionBusy",
+ ly_bool2scm (note_events_.size ()));
}
Completion_heads_engraver::Completion_heads_engraver ()
"measureLength ",
/* write */
- ""
+ "completionBusy "
);
--- /dev/null
+/*
+ dynamic-align-engraver.cc -- implement Dynamic_align_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+
+*/
+
+#include <set>
+
+#include "engraver.hh"
+
+#include "axis-group-interface.hh"
+#include "directional-element-interface.hh"
+#include "item.hh"
+#include "side-position-interface.hh"
+#include "spanner.hh"
+#include "stream-event.hh"
+
+#include "translator.icc"
+
+class Dynamic_align_engraver : public Engraver
+{
+ TRANSLATOR_DECLARATIONS (Dynamic_align_engraver);
+ DECLARE_ACKNOWLEDGER (note_column);
+ DECLARE_ACKNOWLEDGER (dynamic);
+ DECLARE_END_ACKNOWLEDGER (dynamic);
+
+protected:
+ virtual void stop_translation_timestep ();
+
+private:
+ void create_line_spanner (Stream_event *cause);
+ Spanner* line_;
+
+ vector<Spanner*> ended_;
+ vector<Spanner*> started_;
+ vector<Grob*> scripts_;
+ vector<Grob*> support_;
+
+ set<Spanner*> running_;
+};
+
+Dynamic_align_engraver::Dynamic_align_engraver ()
+{
+ line_ = 0;
+}
+
+ADD_ACKNOWLEDGER (Dynamic_align_engraver, dynamic);
+ADD_ACKNOWLEDGER (Dynamic_align_engraver, note_column);
+ADD_END_ACKNOWLEDGER (Dynamic_align_engraver, dynamic);
+
+void
+Dynamic_align_engraver::create_line_spanner (Stream_event* event)
+{
+ if (!line_)
+ line_ = make_spanner ("DynamicLineSpanner",
+ event ? event->self_scm() : SCM_EOL);
+}
+
+void
+Dynamic_align_engraver::acknowledge_end_dynamic (Grob_info info)
+{
+ if (Spanner::has_interface(info.grob()))
+ ended_.push_back (info.spanner ());
+}
+
+void
+Dynamic_align_engraver::acknowledge_note_column (Grob_info info)
+{
+ support_.push_back (info.grob ());
+}
+
+void
+Dynamic_align_engraver::acknowledge_dynamic (Grob_info info)
+{
+ Stream_event *cause = info.event_cause ();
+ create_line_spanner (cause);
+ if (Spanner::has_interface(info.grob()))
+ started_.push_back (info.spanner ());
+ else if (info.item())
+ scripts_.push_back (info.item());
+ else
+ info.grob ()->programming_error ("Unknown dynamic grob.");
+
+ Axis_group_interface::add_element (line_, info.grob ());
+
+ if (cause)
+ {
+ if (Direction d = to_dir (cause->get_property ("direction")))
+ set_grob_direction (line_, d);
+ }
+}
+
+void
+Dynamic_align_engraver::stop_translation_timestep ()
+{
+ for (vsize i = 0; i < started_.size(); i++)
+ running_.insert (started_[i]);
+ for (vsize i = 0; i < ended_.size(); i++)
+ {
+ Spanner *sp = ended_[i];
+
+ set<Spanner*>::iterator it = running_.find (sp);
+ if (it != running_.end())
+ running_.erase (it);
+ else
+ started_[i]->programming_error ("Lost track of this dynamic spanner.");
+ }
+
+ bool end = line_ && running_.empty ();
+ Direction d = LEFT;
+ do
+ {
+ if (line_
+ && ((d == LEFT && !line_->get_bound (LEFT))
+ || (end && d == RIGHT && !line_->get_bound (RIGHT))))
+ {
+ vector<Spanner*> const &spanners =
+ (d == LEFT) ? started_ : ended_;
+
+ Grob *bound = 0;
+ if (scripts_.size())
+ bound = scripts_[0];
+ else if (spanners.size())
+ bound = spanners[0]->get_bound (d);
+ else
+ {
+ programming_error ("Started DynamicLineSpanner but have no left bound.");
+ bound = unsmob_grob (get_property ("currentMusicalColumn"));
+ }
+
+ line_->set_bound (d, bound);
+ }
+ }
+ while (flip (&d) != LEFT);
+
+ for (vsize i = 0; line_ && i < support_.size (); i++)
+ Side_position_interface::add_support (line_, support_[i]);
+
+ if (end)
+ line_ = 0;
+
+ ended_.clear ();
+ started_.clear ();
+ scripts_.clear ();
+ support_.clear ();
+}
+
+
+ADD_TRANSLATOR (Dynamic_align_engraver,
+ /* doc */
+ "Align hairpins and dynamic texts on a horizontal line",
+
+ /* create */
+ "DynamicLineSpanner ",
+
+ /* read */
+ "currentMusicalColumn ",
+
+ /* write */
+ ""
+ );
#include "axis-group-interface.hh"
#include "context.hh"
+#include "engraver.hh"
#include "dimensions.hh"
#include "directional-element-interface.hh"
#include "engraver.hh"
cresc_->set_property ("style", s);
context ()->set_property ((start_type
+ "Spanner").c_str (), SCM_EOL);
- s = get_property ((start_type + "Text").c_str ());
+ s = get_property ((start_type + "Text").c_str ());
if (Text_interface::is_markup (s))
{
cresc_->set_property ("text", s);
cresc_->set_bound (LEFT, script_);
add_bound_item (line_spanner_, cresc_->get_bound (LEFT));
}
-
Axis_group_interface::add_element (line_spanner_, cresc_);
}
}
{
cause = m->to_event ()->unprotect ();
}
- if (unsmob_stream_event (cause) || unsmob_grob (cause))
+ if (e->get_property ("cause") == SCM_EOL
+ && (unsmob_stream_event (cause) || unsmob_grob (cause)))
e->set_property ("cause", cause);
Grob_info i (this, e);
{
if (!group.continuation_line_)
{
- Spanner * line = make_spanner ("BassFigureContinuation", SCM_EOL);
+ Spanner * line
+ = make_spanner ("BassFigureContinuation", SCM_EOL);
Item * item = group.figure_item_;
group.continuation_line_ = line;
line->set_bound (LEFT, item);
void
Figured_bass_engraver::create_grobs ()
{
- Grob *muscol = dynamic_cast<Item*> (unsmob_grob (get_property ("currentMusicalColumn")));
+ Grob *muscol
+ = dynamic_cast<Item*> (unsmob_grob (get_property ("currentMusicalColumn")));
if (!alignment_)
{
alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL);
LY_DEFINE (ly_make_global_context, "ly:make-global-context",
1, 0, 0, (SCM output_def),
"Set up a global interpretation context, using the output"
- " block @var{output_def}. The context is returned.\n")
+ " block @var{output_def}. The context is returned.")
{
LY_ASSERT_SMOB (Output_def, output_def, 1);
Output_def *odef = unsmob_output_def (output_def);
Grob *
common_refpoint_of_array (vector<Grob*> const &arr, Grob *common, Axis a)
{
- for (vsize i = arr.size (); i--;)
- if (Grob *s = arr[i])
- {
- if (common)
- common = common->common_refpoint (s, a);
- else
- common = s;
- }
+ for (vsize i = 0; i < arr.size (); i++)
+ if (common)
+ common = common->common_refpoint (arr[i], a);
+ else
+ common = arr[i];
return common;
}
&& ly_is_equal (bounds[RIGHT]->get_column ()->get_property ("when"),
bounds[LEFT]->get_property ("when")))
me->suicide ();
-
}
MAKE_SCHEME_CALLBACK (Hairpin, print, 1);
/*
should do relative to staff-symbol staff-space?
*/
-
Stencil mol;
Real x = 0.0;
DECLARE_SCHEME_CALLBACK (print, (SCM));
DECLARE_SCHEME_CALLBACK (calc_positions, (SCM));
DECLARE_SCHEME_CALLBACK (brew_chord_bracket, (SCM));
+ DECLARE_SCHEME_CALLBACK (brew_chord_slur, (SCM));
DECLARE_SCHEME_CALLBACK (width, (SCM));
DECLARE_SCHEME_CALLBACK (height, (SCM));
DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM));
class Simultaneous_music_iterator;
class Skyline;
class Skyline_entry;
+class Skyline_pair;
class Slur_configuration;
class Slur_score_state;
class Source_file;
formatted content of the grob is put into a
Property_object. Page-breaking handles Property_object objects.
*/
+
class Prob
{
DECLARE_SMOBS (Prob);
Prob (Prob const &);
virtual string name () const;
SCM type () const { return type_; }
- SCM get_property_alist (bool mutble) const;
+ SCM get_property_alist (bool _mutable) const;
SCM internal_get_property (SCM sym) const;
void instrumented_set_property (SCM, SCM, const char*, int, const char*);
void internal_set_property (SCM sym, SCM val);
};
+
DECLARE_UNSMOB(Prob,prob);
+
SCM ly_prob_set_property_x (SCM system, SCM sym, SCM value);
SCM ly_prob_property (SCM system, SCM sym, SCM dfault);
+SCM ly_prob_type_p (SCM obj, SCM sym);
+
#endif /* PROPERTY_OBJECT_HH */
--- /dev/null
+/*
+ skyline-pair.hh -- declare Skyline_pair
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+
+*/
+
+#ifndef SKYLINE_PAIR_HH
+#define SKYLINE_PAIR_HH
+
+#include "skyline.hh"
+
+class Skyline_pair
+{
+private:
+ Drul_array<Skyline> skylines_;
+
+ DECLARE_SIMPLE_SMOBS(Skyline_pair);
+public:
+ Skyline_pair ();
+ Skyline_pair (vector<Box> const &boxes, Real horizon_padding, Axis a);
+ Skyline_pair (Box const &, Real horizon_padding, Axis a);
+ void raise (Real);
+ void shift (Real);
+ void insert (Box const &, Real horizon_padding, Axis);
+ void merge (Skyline_pair const &other);
+ Skyline &operator [] (Direction d);
+ Skyline const &operator [] (Direction d) const;
+ bool is_empty () const;
+ void print () const;
+ void print_points () const;
+};
+
+#endif /* SKYLINE_PAIR_HH */
bool is_empty () const;
};
-class Skyline_pair
-{
-private:
- Drul_array<Skyline> skylines_;
-
- DECLARE_SIMPLE_SMOBS(Skyline_pair);
-public:
- Skyline_pair ();
- Skyline_pair (vector<Box> const &boxes, Real horizon_padding, Axis a);
- Skyline_pair (Box const &, Real horizon_padding, Axis a);
- void raise (Real);
- void shift (Real);
- void insert (Box const &, Real horizon_padding, Axis);
- void merge (Skyline_pair const &other);
- Skyline &operator [] (Direction d);
- Skyline const &operator [] (Direction d) const;
- bool is_empty () const;
-};
+extern bool debug_skylines;
#endif /* SKYLINE_HH */
// todo: move to somewhere else.
Real get_broken_left_end_align () const;
void substitute_one_mutable_property (SCM sym, SCM val);
- bool fast_substitute_grob_array (SCM sym, Grob_array *);
Interval_t<Moment> spanned_time () const;
virtual Interval_t<int> spanned_rank_interval () const;
void set_my_columns ();
virtual Grob *clone () const;
virtual void do_break_processing ();
+ bool fast_substitute_grob_array (SCM sym, Grob_array *);
};
void add_bound_item (Spanner *, Grob *);
int single_tie_region_size_;
int multi_tie_region_size_;
+ Direction neutral_direction_;
Tie_details ();
void from_grob (Grob *);
{
if (music_context_)
{
- music_context_->event_source ()->remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event"));
+ music_context_->event_source ()->
+ remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event"));
}
music_context_ = to;
if (to)
{
- to->event_source ()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event"));
+ to->event_source ()->add_listener (GET_LISTENER (set_busy),
+ ly_symbol2scm ("music-event"));
}
}
--- /dev/null
+/*
+ new-dynamic-engraver.cc -- implement New_dynamic_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+
+*/
+
+
+#include "engraver.hh"
+
+#include "item.hh"
+#include "pointer-group-interface.hh"
+#include "text-interface.hh"
+#include "note-column.hh"
+#include "self-alignment-interface.hh"
+#include "spanner.hh"
+#include "stream-event.hh"
+
+#include "translator.icc"
+
+class New_dynamic_engraver : public Engraver
+{
+ TRANSLATOR_DECLARATIONS (New_dynamic_engraver);
+ DECLARE_ACKNOWLEDGER (note_column);
+ DECLARE_TRANSLATOR_LISTENER (absolute_dynamic);
+ DECLARE_TRANSLATOR_LISTENER (span_dynamic);
+
+protected:
+ virtual void process_music ();
+ virtual void stop_translation_timestep ();
+private:
+ Drul_array<Stream_event *> accepted_spanevents_drul_;
+ Spanner *current_spanner_;
+ Spanner *finished_spanner_;
+
+ Item *script_;
+ Stream_event *script_event_;
+ Stream_event *current_span_event_;
+};
+
+New_dynamic_engraver::New_dynamic_engraver ()
+{
+ script_event_ = 0;
+ current_span_event_ = 0;
+ script_ = 0;
+ finished_spanner_ = 0;
+ current_spanner_ = 0;
+ accepted_spanevents_drul_.set (0, 0);
+}
+
+IMPLEMENT_TRANSLATOR_LISTENER (New_dynamic_engraver, absolute_dynamic);
+void
+New_dynamic_engraver::listen_absolute_dynamic (Stream_event *ev)
+{
+ ASSIGN_EVENT_ONCE (script_event_, ev);
+}
+
+IMPLEMENT_TRANSLATOR_LISTENER (New_dynamic_engraver, span_dynamic);
+void
+New_dynamic_engraver::listen_span_dynamic (Stream_event *ev)
+{
+ Direction d = to_dir (ev->get_property ("span-direction"));
+
+ ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[d], ev);
+}
+
+
+void
+New_dynamic_engraver::process_music ()
+{
+ if (current_spanner_
+ && (accepted_spanevents_drul_[STOP] || script_event_ || accepted_spanevents_drul_[START]))
+ {
+ Stream_event* ender = accepted_spanevents_drul_[STOP];
+ if (!ender)
+ ender = script_event_;
+
+ if (!ender)
+ ender = accepted_spanevents_drul_[START];
+
+ finished_spanner_ = current_spanner_;
+ announce_end_grob (finished_spanner_, ender->self_scm ());
+ current_spanner_ = 0;
+ current_span_event_ = 0;
+ }
+
+ if (accepted_spanevents_drul_[START])
+ {
+ current_span_event_ = accepted_spanevents_drul_[START];
+
+ SCM start_sym = current_span_event_->get_property ("class");
+ string start_type;
+
+ if (start_sym == ly_symbol2scm ("decrescendo-event"))
+ start_type = "decrescendo";
+ else if (start_sym == ly_symbol2scm ("crescendo-event"))
+ start_type = "crescendo";
+ else
+ {
+ programming_error ("unknown dynamic spanner type");
+ return;
+ }
+
+ SCM cresc_type = get_property ((start_type + "Spanner").c_str ());
+
+ if (cresc_type == ly_symbol2scm ("text"))
+ {
+ current_spanner_
+ = make_spanner ("DynamicTextSpanner",
+ accepted_spanevents_drul_[START]->self_scm ());
+
+ SCM text = get_property ((start_type + "Text").c_str ());
+ if (Text_interface::is_markup (text))
+ {
+ current_spanner_->set_property ("text", text);
+ }
+ }
+ else
+ {
+ if (cresc_type != ly_symbol2scm ("hairpin"))
+ {
+ // Fixme: should put value in error message.
+ ly_display_scm (cresc_type);
+ current_span_event_
+ ->origin()->warning ("unknown crescendo style; defaulting to hairpin.");
+ }
+ current_spanner_ = make_spanner ("Hairpin",
+ current_span_event_->self_scm ());
+ if (finished_spanner_)
+ {
+ Pointer_group_interface::add_grob (finished_spanner_,
+ ly_symbol2scm ("adjacent-hairpins"),
+ current_spanner_);
+
+ Pointer_group_interface::add_grob (current_spanner_,
+ ly_symbol2scm ("adjacent-hairpins"),
+ finished_spanner_);
+ }
+ }
+ }
+
+ if (script_event_)
+ {
+ script_ = make_item ("DynamicText", script_event_->self_scm ());
+ script_->set_property ("text",
+ script_event_->get_property ("text"));
+
+ if (finished_spanner_)
+ finished_spanner_->set_bound (RIGHT, script_);
+ if (current_spanner_)
+ {
+ current_spanner_->set_bound (LEFT, script_);
+ set_nested_property (current_spanner_,
+ scm_list_3 (ly_symbol2scm ("bound-details"),
+ ly_symbol2scm ("left"),
+ ly_symbol2scm ("attach-dir")
+ ),
+ scm_from_int (RIGHT));
+
+ }
+ }
+}
+
+
+
+void
+New_dynamic_engraver::stop_translation_timestep ()
+{
+ if (finished_spanner_ && !finished_spanner_->get_bound (RIGHT))
+ finished_spanner_->set_bound (RIGHT,
+ unsmob_grob (get_property ("currentMusicalColumn")));
+
+ if (current_spanner_ && !current_spanner_->get_bound (LEFT))
+ current_spanner_->set_bound (LEFT,
+ unsmob_grob (get_property ("currentMusicalColumn")));
+ script_ = 0;
+ script_event_ = 0;
+ accepted_spanevents_drul_.set (0, 0);
+ finished_spanner_ = 0;
+}
+
+void
+New_dynamic_engraver::acknowledge_note_column (Grob_info info)
+{
+ if (script_ && !script_->get_parent (X_AXIS))
+ {
+ extract_grob_set (info.grob (), "note-heads", heads);
+ if (heads.size ())
+ {
+ Grob *head = heads[0];
+ script_->set_parent (head, X_AXIS);
+ Self_alignment_interface::set_center_parent (script_, X_AXIS);
+ }
+ }
+
+ if (current_spanner_ && !current_spanner_->get_bound (LEFT))
+ current_spanner_->set_bound (LEFT, info.grob ());
+ if (finished_spanner_ && !finished_spanner_->get_bound (RIGHT))
+ finished_spanner_->set_bound (RIGHT, info.grob ());
+}
+
+ADD_ACKNOWLEDGER (New_dynamic_engraver, note_column);
+ADD_TRANSLATOR (New_dynamic_engraver,
+ /* doc */
+ "Create hairpins, dynamic texts, and their vertical"
+ " alignments. The symbols are collected onto a"
+ " @code{DynamicLineSpanner} grob which takes care of vertical"
+ " positioning.",
+
+ /* create */
+ "DynamicTextSpanner "
+ "DynamicText "
+ "Hairpin "
+ "TextSpanner ",
+
+ /* read */
+ "currentMusicalColumn ",
+
+ /* write */
+ ""
+ );
#include "paper-column.hh"
-#include "break-align-interface.hh"
-#include "moment.hh"
-#include "paper-score.hh"
-#include "warn.hh"
#include "axis-group-interface.hh"
-#include "spaceable-grob.hh"
-#include "text-interface.hh"
-#include "lookup.hh"
+#include "break-align-interface.hh"
#include "font-interface.hh"
-#include "output-def.hh"
-#include "pointer-group-interface.hh"
#include "grob-array.hh"
-#include "system.hh"
-#include "spring.hh"
#include "lookup.hh"
+#include "lookup.hh"
+#include "moment.hh"
+#include "output-def.hh"
+#include "paper-score.hh"
+#include "pointer-group-interface.hh"
#include "separation-item.hh"
+#include "skyline-pair.hh"
+#include "spaceable-grob.hh"
+#include "spring.hh"
#include "string-convert.hh"
+#include "system.hh"
+#include "text-interface.hh"
+#include "warn.hh"
Grob *
Paper_column::clone () const
--- /dev/null
+/*
+ paper-system-scheme.cc -- implement Paper_system bindings.
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+
+*/
+
+#include "prob.hh"
+
+#include "skyline-pair.hh"
+
+LY_DEFINE (ly_paper_system_p, "ly:paper-system?",
+ 1, 0, 0, (SCM obj),
+ "Type predicate.")
+{
+ return ly_prob_type_p (obj, ly_symbol2scm ("paper-system"));
+}
+
+LY_DEFINE (ly_paper_system_minimum_distance, "ly:paper-system-minimum-distance",
+ 2, 0, 0, (SCM sys1, SCM sys2),
+ "Measure the minimum distance between these two paper-systems,"
+ " using their stored skylines if possible and falling back to"
+ " their extents otherwise.")
+{
+ Real ret = 0;
+ Prob *p1 = unsmob_prob (sys1);
+ Prob *p2 = unsmob_prob (sys2);
+ Skyline_pair *sky1 = Skyline_pair::unsmob (p1->get_property ("vertical-skylines"));
+ Skyline_pair *sky2 = Skyline_pair::unsmob (p2->get_property ("vertical-skylines"));
+
+ if (sky1 && sky2)
+ ret = (*sky1)[DOWN].distance ((*sky2)[UP]);
+ else
+ {
+ Stencil *s1 = unsmob_stencil (p1->get_property ("stencil"));
+ Stencil *s2 = unsmob_stencil (p2->get_property ("stencil"));
+ Interval iv1 = s1->extent (Y_AXIS);
+ Interval iv2 = s2->extent (Y_AXIS);
+ ret = iv2[UP] - iv1[DOWN];
+ }
+ return scm_from_double (ret);
+}
*/
#include "prob.hh"
-#include "skyline.hh"
LY_DEFINE (ly_prob_set_property_x, "ly:prob-set-property!",
2, 1, 0, (SCM obj, SCM sym, SCM value),
return pr->unprotect ();
}
-
-LY_DEFINE (ly_paper_system_p, "ly:paper-system?",
- 1, 0, 0, (SCM obj),
- "Type predicate.")
+
+LY_DEFINE (ly_prob_mutable_properties, "ly:prob-mutable-properties",
+ 1, 0, 0,
+ (SCM prob),
+ "Retrieve an alist of mutable properties.")
{
- return ly_prob_type_p (obj, ly_symbol2scm ("paper-system"));
+ LY_ASSERT_SMOB (Prob, prob, 1);
+ Prob *ps = unsmob_prob (prob);
+ return ps->get_property_alist (true);
}
-LY_DEFINE (ly_paper_system_minimum_distance, "ly:paper-system-minimum-distance",
- 2, 0, 0, (SCM sys1, SCM sys2),
- "Measure the minimum distance between these two paper-systems,"
- " using their stored skylines if possible and falling back to"
- " their extents otherwise.")
+LY_DEFINE (ly_prob_immutable_properties, "ly:prob-immutable-properties",
+ 1, 0, 0,
+ (SCM prob),
+ "Retrieve an alist of mutable properties.")
{
- Real ret = 0;
- Prob *p1 = unsmob_prob (sys1);
- Prob *p2 = unsmob_prob (sys2);
- Skyline_pair *sky1 = Skyline_pair::unsmob (p1->get_property ("vertical-skylines"));
- Skyline_pair *sky2 = Skyline_pair::unsmob (p2->get_property ("vertical-skylines"));
-
- if (sky1 && sky2)
- ret = (*sky1)[DOWN].distance ((*sky2)[UP]);
- else
- {
- Stencil *s1 = unsmob_stencil (p1->get_property ("stencil"));
- Stencil *s2 = unsmob_stencil (p2->get_property ("stencil"));
- Interval iv1 = s1->extent (Y_AXIS);
- Interval iv2 = s2->extent (Y_AXIS);
- ret = iv2[UP] - iv1[DOWN];
- }
- return scm_from_double (ret);
+ LY_ASSERT_SMOB (Prob, prob, 1);
+ Prob *ps = unsmob_prob (prob);
+ return ps->get_property_alist (false);
}
+
#include "separation-item.hh"
+#include "accidental-placement.hh"
#include "axis-group-interface.hh"
#include "lookup.hh"
#include "note-head.hh"
-#include "stencil.hh"
-#include "skyline.hh"
#include "paper-column.hh"
-#include "warn.hh"
#include "pointer-group-interface.hh"
-#include "accidental-placement.hh"
+#include "skyline-pair.hh"
+#include "stencil.hh"
+#include "warn.hh"
void
Separation_item::add_item (Grob *s, Item *i)
return out;
}
-extern bool debug_skylines;
MAKE_SCHEME_CALLBACK (Separation_item, print, 1)
SCM
Separation_item::print (SCM smob)
--- /dev/null
+/*
+ skyline-pair.cc -- implement Skyline_pair
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+
+*/
+
+#include "skyline-pair.hh"
+
+#include "ly-smobs.icc"
+
+Skyline_pair::Skyline_pair ()
+ : skylines_ (Skyline (DOWN), Skyline (UP))
+{
+}
+
+Skyline_pair::Skyline_pair (vector<Box> const &boxes, Real padding, Axis a)
+ : skylines_ (Skyline (boxes, padding, a, DOWN), Skyline (boxes, padding, a, UP))
+{
+}
+
+Skyline_pair::Skyline_pair (Box const &b, Real padding, Axis a)
+ : skylines_ (Skyline (b, padding, a, DOWN), Skyline (b, padding, a, UP))
+{
+}
+
+void
+Skyline_pair::raise (Real r)
+{
+ skylines_[UP].raise (r);
+ skylines_[DOWN].raise (r);
+}
+
+void
+Skyline_pair::shift (Real r)
+{
+ skylines_[UP].shift (r);
+ skylines_[DOWN].shift (r);
+}
+
+void
+Skyline_pair::insert (Box const &b, Real padding, Axis a)
+{
+ skylines_[UP].insert (b, padding, a);
+ skylines_[DOWN].insert (b, padding, a);
+}
+
+void
+Skyline_pair::merge (Skyline_pair const &other)
+{
+ skylines_[UP].merge (other[UP]);
+ skylines_[DOWN].merge (other[DOWN]);
+}
+
+void
+Skyline_pair::print () const
+{
+ skylines_[UP].print ();
+ skylines_[DOWN].print ();
+}
+
+void
+Skyline_pair::print_points () const
+{
+ skylines_[UP].print ();
+ skylines_[DOWN].print ();
+}
+
+
+bool
+Skyline_pair::is_empty () const
+{
+ return skylines_[UP].is_empty ()
+ && skylines_[DOWN].is_empty ();
+}
+
+Skyline&
+Skyline_pair::operator [] (Direction d)
+{
+ return skylines_[d];
+}
+
+Skyline const&
+Skyline_pair::operator [] (Direction d) const
+{
+ return skylines_[d];
+}
+
+IMPLEMENT_SIMPLE_SMOBS (Skyline_pair);
+IMPLEMENT_TYPE_P (Skyline_pair, "ly:skyline-pair?");
+IMPLEMENT_DEFAULT_EQUAL_P (Skyline_pair);
+
+SCM
+Skyline_pair::mark_smob (SCM)
+{
+ return SCM_EOL;
+}
+
+int
+Skyline_pair::print_smob (SCM s, SCM port, scm_print_state *)
+{
+ Skyline_pair *r = (Skyline_pair *) SCM_CELL_WORD_1 (s);
+ (void) r;
+
+ scm_puts ("#<Skyline-pair>", port);
+ return 1;
+}
return b.end_ == infinity_f && b.y_intercept_ == -infinity_f;
}
-Skyline_pair::Skyline_pair ()
- : skylines_ (Skyline (DOWN), Skyline (UP))
-{
-}
-
-Skyline_pair::Skyline_pair (vector<Box> const &boxes, Real padding, Axis a)
- : skylines_ (Skyline (boxes, padding, a, DOWN), Skyline (boxes, padding, a, UP))
-{
-}
-
-Skyline_pair::Skyline_pair (Box const &b, Real padding, Axis a)
- : skylines_ (Skyline (b, padding, a, DOWN), Skyline (b, padding, a, UP))
-{
-}
-
-void
-Skyline_pair::raise (Real r)
-{
- skylines_[UP].raise (r);
- skylines_[DOWN].raise (r);
-}
-
-void
-Skyline_pair::shift (Real r)
-{
- skylines_[UP].shift (r);
- skylines_[DOWN].shift (r);
-}
-
-void
-Skyline_pair::insert (Box const &b, Real padding, Axis a)
-{
- skylines_[UP].insert (b, padding, a);
- skylines_[DOWN].insert (b, padding, a);
-}
-
-void
-Skyline_pair::merge (Skyline_pair const &other)
-{
- skylines_[UP].merge (other[UP]);
- skylines_[DOWN].merge (other[DOWN]);
-}
-
-bool
-Skyline_pair::is_empty () const
-{
- return skylines_[UP].is_empty ()
- && skylines_[DOWN].is_empty ();
-}
-
-Skyline&
-Skyline_pair::operator [] (Direction d)
-{
- return skylines_[d];
-}
-
-Skyline const&
-Skyline_pair::operator [] (Direction d) const
-{
- return skylines_[d];
-}
/****************************************************************/
IMPLEMENT_TYPE_P (Skyline, "ly:skyline?");
IMPLEMENT_DEFAULT_EQUAL_P (Skyline);
-IMPLEMENT_SIMPLE_SMOBS (Skyline_pair);
-IMPLEMENT_TYPE_P (Skyline_pair, "ly:skyline-pair?");
-IMPLEMENT_DEFAULT_EQUAL_P (Skyline_pair);
-
SCM
Skyline::mark_smob (SCM)
{
return 1;
}
-
-SCM
-Skyline_pair::mark_smob (SCM)
-{
- return SCM_EOL;
-}
-
-int
-Skyline_pair::print_smob (SCM s, SCM port, scm_print_state *)
-{
- Skyline_pair *r = (Skyline_pair *) SCM_CELL_WORD_1 (s);
- (void) r;
-
- scm_puts ("#<Skyline-pair>", port);
- return 1;
-}
#include "paper-column.hh"
#include "separation-item.hh"
#include "skyline.hh"
+#include "skyline-pair.hh"
#include "system.hh"
/* return the right-pointing skyline of the left-items and the left-pointing
#include "paper-score.hh"
#include "pointer-group-interface.hh"
#include "separation-item.hh"
+#include "skyline-pair.hh"
#include "spaceable-grob.hh"
#include "spacing-interface.hh"
#include "staff-spacing.hh"
#include "axis-group-interface.hh"
#include "grob-array.hh"
#include "international.hh"
+#include "lookup.hh"
#include "main.hh"
#include "output-def.hh"
#include "paper-column.hh"
#include "paper-score.hh"
#include "paper-system.hh"
#include "pointer-group-interface.hh"
+#include "skyline-pair.hh"
#include "staff-symbol-referencer.hh"
#include "warn.hh"
-#include "lookup.hh"
-
-extern bool debug_skylines;
System::System (System const &src)
: Spanner (src)
Skyline_pair *skylines = Skyline_pair::unsmob (get_property ("vertical-skylines"));
if (skylines)
{
- sys_stencil.add_stencil (Lookup::points_to_line_stencil (0.1, (*skylines)[UP].to_points (X_AXIS)).in_color (255, 0, 0));
- sys_stencil.add_stencil (Lookup::points_to_line_stencil (0.1, (*skylines)[DOWN].to_points (X_AXIS)).in_color (0, 255, 0));
+ Stencil up
+ = Lookup::points_to_line_stencil (0.1, (*skylines)[UP].to_points (X_AXIS));
+ Stencil down
+ = Lookup::points_to_line_stencil (0.1, (*skylines)[DOWN].to_points (X_AXIS));
+ sys_stencil.add_stencil (up.in_color (255, 0, 0));
+ sys_stencil.add_stencil (down.in_color (0, 255, 0));
}
}
{
staff_symbol_referencer_ = me;
staff_space_ = Staff_symbol_referencer::staff_space (me);
-
+
+ neutral_direction_ = to_dir (me->get_property ("neutral-direction"));
+ if (!neutral_direction_)
+ neutral_direction_ = DOWN;
SCM details = me->get_property ("details");
tie_configs->at (0).dir_ = Direction (sign (tie_configs->at (0).position_));
if (!tie_configs->at (0).dir_)
- tie_configs->at (0).dir_ = DOWN;
+ tie_configs->at (0).dir_
+ = (tie_configs->size() > 1) ? DOWN : details_.neutral_direction_;
}
if (!tie_configs->back ().dir_)
#include "note-head.hh"
#include "output-def.hh"
#include "paper-column.hh"
+#include "pointer-group-interface.hh"
#include "rhythmic-head.hh"
#include "spanner.hh"
#include "staff-symbol-referencer.hh"
Direction d = LEFT;
do
{
- Grob *stem = head (me, d) ? Rhythmic_head::get_stem (head (me, d)) : 0;
+ Grob *one_head = head (me, d);
+ if (!one_head && dynamic_cast<Spanner*> (me))
+ one_head = Tie::head (dynamic_cast<Spanner*> (me)->broken_neighbor (d), d);
+
+ Grob *stem = one_head ? Rhythmic_head::get_stem (one_head) : 0;
if (stem)
stem = Stem::is_invisible (stem) ? 0 : stem;
else if (int p = get_position (me))
return Direction (sign (p));
- return UP;
+ return to_dir (me->get_property("neutral-direction"));
}
// && unsmob_grob_array (yparent->get_object ("ties"))->size () > 1
)
{
+ extract_grob_set (yparent, "ties", ties);
+ if (ties.size() == 1
+ && !to_dir (me->get_property_data ("direction")))
+ {
+ assert (ties[0] == me);
+ set_grob_direction (me, Tie::get_default_dir (me));
+ }
+
/* trigger positioning. */
(void) yparent->get_property ("positioning-done");
}
"dash-period "
"details "
"direction "
- "separation-item "
"head-direction "
"line-thickness "
+ "neutral-direction "
"quant-score "
+ "separation-item "
"staff-position "
"thickness "
);
\consists "Part_combine_engraver"
\consists "Text_engraver"
- \consists "Dynamic_engraver"
+ \consists "New_dynamic_engraver"
+ \consists "Dynamic_align_engraver"
+% \consists "Dynamic_engraver"
\consists "Fingering_engraver"
\consists "Bend_engraver"
middleCClefPosition = #-6
middleCPosition = #-6
firstClef = ##t
+
+ crescendoSpanner = #'hairpin
+ decrescendoSpanner = #'hairpin
defaultBarType = #"|"
barNumberVisibility = #first-bar-number-invisible
setTextCresc = {
\set crescendoText = \markup { \italic "cresc." }
- \set crescendoSpanner = #'dashed-line
+ \set crescendoSpanner = #'text
+ \override DynamicTextSpanner #'style = #'dashed-line
}
setTextDecresc = {
\set decrescendoText = \markup { \italic "decresc." }
- \set decrescendoSpanner = #'dashed-line
+ \set decrescendoSpanner = #'text
+ \override DynamicTextSpanner #'style = #'dashed-line
}
setTextDecr = {
\set decrescendoText = \markup { \italic "decr." }
- \set decrescendoSpanner = #'dashed-line
+ \set decrescendoSpanner = #'text
+ \override DynamicTextSpanner #'style = #'dashed-line
}
setTextDim = {
\set decrescendoText = \markup { \italic "dim." }
- \set decrescendoSpanner = #'dashed-line
+ \set decrescendoSpanner = #'text
+ \override DynamicTextSpanner #'style = #'dashed-line
}
+
setHairpinCresc = {
\unset crescendoText
\unset crescendoSpanner
}
+
setHairpinDecresc = {
\unset decrescendoText
\unset decrescendoSpanner
}
+
setHairpinDim = {
\unset decrescendoText
\unset decrescendoSpanner
$(outdir)/%/index.html: $(outdir)/%.texi $(outdir)/version.itexi
mkdir -p $(dir $@)
- -$(MAKEINFO) -P $(outdir) --output=$(outdir)/$* --css-include=$(top-src-dir)/Documentation/texinfo.css --html $<
+ $(MAKEINFO) -P $(outdir) --output=$(outdir)/$* --css-include=$(top-src-dir)/Documentation/texinfo.css --html $<
$(outdir)/%-big-page.html: $(outdir)/%.texi $(outdir)/version.itexi
- -$(MAKEINFO) -P $(outdir) --output=$@ --css-include=$(top-src-dir)/Documentation/texinfo.css --html --no-split --no-headers $<
+ $(MAKEINFO) -P $(outdir) --output=$@ --css-include=$(top-src-dir)/Documentation/texinfo.css --html --no-split --no-headers $<
$(outdir)/%.pdftexi: $(outdir)/%.texi doc-po $(outdir)/version.itexi
$(PYTHON) $(buildscript-dir)/texi-gettext.py $(ISOLANG) $<
(clefPosition ,number? "Where should the center of the clef
symbol go, measured in half staff spaces from the center of the
staff.")
+ (completionBusy ,boolean? "Whether a completion-note head is playing.")
(connectArpeggios ,boolean? "If set, connect arpeggios across
piano staff.")
(countPercentRepeats ,boolean? "If set, produce counters for
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-public default-melisma-properties
- '(melismaBusy slurMelismaBusy tieMelismaBusy beamMelismaBusy))
+ '(melismaBusy slurMelismaBusy tieMelismaBusy beamMelismaBusy completionBusy))
(shortest-starter-duration ,ly:moment? "The duration of the
shortest note that starts here.")
(side-axis ,number? "If the value is @code{#X} (or
-equivalently@tie{}@code{1}), the object is placed horizontally next
-to the other object. If the value is @code{#Y} or@tie{}@code{0}, it
+equivalently@tie{}@code{0}), the object is placed horizontally next
+to the other object. If the value is @code{#Y} or@tie{}@code{1}, it
is placed vertically.")
(side-relative-direction ,ly:dir? "Multiply direction of
@code{direction-source} with this to get the direction of this
(springs-and-rods . ,ly:spanner::set-spacing-rods)
(avoid-slur . inside)
(direction . ,ly:tie::calc-direction)
+ (neutral-direction . ,UP)
(stencil . ,ly:tie::print)
(font-size . -6)
(details . (
'grob-property gprop))
(define direction-polyphonic-grobs
- '(Stem Tie Rest Slur PhrasingSlur Script TextScript Dots DotColumn Fingering))
+ '(DotColumn
+ Dots
+ Fingering
+ LaissezVibrerTie
+ PhrasingSlur
+ RepeatTie
+ Rest
+ Script
+ Slur
+ Stem
+ TextScript
+ Tie))
(define-safe-public (make-voice-props-set n)
(make-sequential-music