converted to use spaces only.
+@subheading GOP-PROP 2: mentors and frogs
+
+Nothing much was decided. The list of responsibilities was
+slightly altered; see the new one in @ref{Mentors}. We should
+encourage more use of the Frogs mailing list. There's a list of
+contributor-mentor pairs in:
+
+@smallexample
+@uref{https://github.com/gperciva/lilypond-extra/blob/master/people/mentors.txt}
+@end smallexample
+
+That's pretty much it.
+
@node Grand LilyPond Input Syntax Standardization (GLISS)
@section Grand LilyPond Input Syntax Standardization (GLISS)
-devel before being pushed).
@item
-Keep track of patches from your contributor. If you've sent a
-patch to -devel, it's your responsibility to pester people to get
-comments for it, or at very least add it to the google tracker.
+Keep track of patches from your contributor. Either upload them
+to Rietveld yourself, or help+encourage them to upload the patches
+themselves. When a patch is on Rietveld, it's your responbility
+to get comments for it, and to add a link to the patch to the
+google tracker. (tag it @qq{patch-new}, or @qq{patch-review} if
+you feel very confident in it)
+
+@item
+Encourage your contributor to review patches, particularly your
+own! It doesn't matter if they're not familiar with C++ / scheme
+/ build system / doc stuff -- simply going through the process is
+valuable. Besides, anybody can find a typo!
+
+@item
+Contact your contributor at least once a week. The goal is just
+to get a conversation started -- there's nothing wrong with simply
+copy&pasting this into an email:
+
+@example
+Hey there,
+
+How are things going? If you sent a patch and got a review, do
+you know what you need to fix? If you sent a patch but have no
+reviews yet, do you know when you will get reviews? If you are
+working on a patch, what step(s) are you working on?
+@end example
+
@end enumerate
@c -*- coding: utf-8; mode: texinfo; fill-column: 60 -*-
@ignore
- Translation of GIT committish: b275aa092642adb798079f7853309e2f5e4383ce
+ Translation of GIT committish: 6908517be0826a3386264cd6d26d742b18e3a227
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
@c double \\ required because this is inside a macro!
@example
-\\version "@w{@version{}}"
+\\version "@w{@versionStable{}}"
@{
c' e' g' e'
@}
Je ziet dan iets dat lijkt op:
@example
-GNU LilyPond @w{@version{}}
+GNU LilyPond @w{@versionStable{}}
Verwerken van `test.ly'
Ontleden...
Vertolken van muziek...
@c -*- coding: utf-8; mode: texinfo; fill-column: 60 -*-
@ignore
- Translation of GIT committish: 66dd932f6519b7913400a838c5efbc5407e06cd8
+ Translation of GIT committish: 6908517be0826a3386264cd6d26d742b18e3a227
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
Terminologie: @rglos{accidental}, @rglos{key signature},
@rglos{pitch}, @rglos{flat}, @rglos{natural}, @rglos{sharp},
-@rglos{transposition}.
+@rglos{transposition}, @rglos{Pitch names}.
Om uit te maken of er wel of geen @notation{toevallig teken}
geprint moet worden, onderzoekt LilyPond de toonhoogten en
@ruser{Automatic accidentals},
@ruser{Key signature}.
-Terminologie:
-@rglos{Pitch names}.
-
@node Overbindingen en legatobogen
@translationof Ties and slurs
@funindex GrandStaff
@funindex ChoirStaff
-Terminologie: @rglos{brace}.
+Terminologie:
+@rglos{brace},
+@rglos{staff},
+@rglos{system}.
Pianomuziek wordt meestal genoteerd op twee notenbalken die
verbonden zijn door een @notation{accolade}. Het afdrukken
@translationof Combining notes into chords
@subsection Het combineren van noten tot accoorden
+Terminologie: @rglos{chord}.
+
@cindex accoorden
@cindex nootlengten in accoorden
@funindex >
@funindex < ... >
-Terminologie: @rglos{chord}.
-
We zagen eerder hoe noten kunnen worden gecombineerd tot
@notation{accoorden} door aan te geven dat ze tegelijk
klinken door ze tussen dubbele gehoekte haken te zetten.
worden geplaatst buiten de hoekige haken.
@lilypond[verbatim,quote,relative=2]
-r4 <c e g>8[ <c f a>]~ <c f a>2 |
-r4 <c e g>8( <c e g>\> <c e g>4 <c f a>\!) |
+r4 <c e g>~ <c f a>2 |
+<c e g>8[ <c f a> <c e g> <c f a>] <c e g>\>[ <c f a> <c f a> <c e g>]\! |
+r4 <c e g>8.\p <c f a>16( <c e g>4-. <c f a>) |
@end lilypond
+@seealso
+Notatiehandleiding:
+@ruser{Chorded notes}.
+
@node Polyfonie binnen een notenbalk
@translationof Single staff polyphony
>>
@end lilypond
-Merk de accolades op die zowel de muziek als de liedtekst
-afbakenen. Het is van essentiëel belang dat de laatste
+@warning{Het is van essentiëel belang dat de laatste
lettergreep van de afsluitende accolade gescheiden wordt
door een spatie of nieuwe regel, anders wordt aangenomen dat
de accolade nog deel uitmaakt van die lettergreep, wat een
obscure foutmelding oplevert, zie @rprogram{Apparent error
-in ../ly/init.ly}.
+in ../ly/init.ly}.}
-Merk tevens de hoekige haken @w{@code{<< ... >>}} op die om
+Merk de hoekige haken @w{@code{<< ... >>}} op die om
het hele stuk heen staan en aangeven dat de muziek en de
woorden tegelijk klinken.
inserted beam and end before the end of the beam -- not very
musical, perhaps, but possible:
-@lilypond[quote,verbatim,fragment,ragged-right,relative=2]
- { g8\( a b[ c b\) a] g4 }
+@lilypond[quote,verbatim,ragged-right,relative=2]
+g8\( a b[ c b\) a] g4
@end lilypond
In general, different kinds of brackets, bracket-like constructs,
extending into a tuplet, a tie crossing two tuplets, and a
phrasing slur extending out of a tuplet (lines 3 and 4).
-@lilypond[quote,verbatim,fragment,ragged-right]
-{
- r16[ g \times 2/3 { r16 e'8] }
- g16( a \times 2/3 { b16 d) e' }
- g8[( a \times 2/3 { b8 d') e'~] } |
- \times 4/5 { e'32\( a b d' e' } a'4.\)
-}
+@lilypond[quote,verbatim,ragged-right,relative=1]
+r16[ g \times 2/3 { r16 e'8] }
+g,16( a \times 2/3 { b16 d) e }
+g,8[( a \times 2/3 { b8 d) e~] } |
+\times 4/5 { e32\( a, b d e } a4.\)
@end lilypond
so when exactly are multiple voices needed? Look first at
this example of four chords:
-@lilypond[quote,verbatim,fragment,ragged-right,relative=1]
+@lilypond[quote,verbatim,ragged-right,relative=1]
\key g \major
<d g>4 <d fis> <d a'> <d g>
@end lilypond
Here's how we split the chords above into two voices and add both
the passing note and a slur:
-@lilypond[quote,verbatim,fragment,ragged-right,relative=2]
+@lilypond[quote,verbatim,ragged-right,relative=2]
\key g \major
% Voice "1" Voice "2"
<< { g4 fis8( g) a4 g } \\ { d4 d d d } >>
Here's another simple example:
-@lilypond[quote,verbatim,fragment,ragged-right,relative=2]
+@lilypond[quote,verbatim,ragged-right,relative=2]
\key d \minor
% Voice "1" Voice "2"
<< { r4 g g4. a8 } \\ { d,2 d4 g } >> |
@end lilypond
It is not necessary to use a separate @code{<< \\ >>} construct
-for each bar. For music with few notes in each bar this layout
+for each bar. For music with few notes in each bar this layout
can help the legibility of the code, but if there are many
notes in each bar it may be better to split out each voice
separately, like this:
-@lilypond[quote,verbatim,fragment,ragged-right,relative=2]
+@lilypond[quote,verbatim,ragged-right,relative=2]
\key d \minor
<< {
% Voice "1"
@cindex voices, naming
@cindex voices crossing brackets
@cindex slurs crossing brackets
-@cindex ties crossing brackest
+@cindex ties crossing brackets
This example has just two voices, but the same construct may be
used to encode three or more voices by adding more back-slash
In each of these contexts, the vertical direction of slurs,
stems, ties, dynamics etc., is set appropriately.
-@lilypond[quote,verbatim,fragment]
+@lilypond[quote,verbatim]
\new Staff \relative c' {
% Main voice
c16 d e f
we have learnt, using the @code{<< \\ >>} construct to
enter the music of the first bar in three voices:
-@lilypond[quote,verbatim,fragment,ragged-right]
+@lilypond[quote,verbatim,ragged-right]
\new Staff \relative c'' {
\key aes \major
<<
voices downward ones. The stems for voices 1 and 2 are right,
but the stems in voice 3 should go down in this particular piece
of music. We can correct this by skipping voice three
-and placing the music in voice four. This is done by simply
+and placing the music in voice four. This is done by simply
adding another pair of @code{\\}.
-@lilypond[quote,verbatim,fragment,ragged-right]
+@lilypond[quote,verbatim,ragged-right]
\new Staff \relative c'' {
\key aes \major
<< % Voice one
in opposite directions, but the notes from the third and fourth voices
are displaced, if necessary, to avoid the note heads colliding. This
usually works well, but in this example the notes of the lowest voice
-are clearly not well placed by default. LilyPond provides several ways
+are clearly not well placed by default. LilyPond provides several ways
to adjust the horizontal placing of notes. We are not quite ready yet
to see how to correct this, so we shall leave this problem until a
-later section --- see the @code{force-hshift} property in @ref{Fixing
-overlapping notation}.
+later section --- see the @code{force-hshift} property in
+@ref{Fixing overlapping notation}.
@seealso
The @code{\shiftOn}, @code{\shiftOnn}, @code{\shiftOnnn}, and
@code{\shiftOff} commands specify the degree to which notes and
chords of the voice should be shifted if a collision
-would otherwise occur. By default, the outer voices (normally
+would otherwise occur. By default, the outer voices (normally
voices one and two) have @code{\shiftOff} specified, while the
inner voices (three and four) have @code{\shiftOn} specified.
When a shift is applied, voices one and three are shifted to
the lyrics to the notes with @code{\lyricsto@{@}}, using the
name assigned to the Voice.
-@lilypond[quote,verbatim,fragment]
+@lilypond[quote,verbatim]
<<
\new Voice = "one" {
\relative c'' {
output. For example, compare the input and output of the
following example:
-@lilypond[quote,verbatim,relative=2,fragment]
+@lilypond[quote,verbatim,relative=2]
cis4 cis2. | a4 a2. |
@end lilypond
@code{Voice}). This command creates a new context, and starts
interpreting the @var{music-expression} within that context.
-(Note that a @code{\new Score} command is not normally required,
-as the essential top-level @code{Score} context is created
-automatically when the music expression within the @code{\score}
-block is interpreted. The only reason for creating a @code{Score}
-context explicitly using @code{\new Score} is to introduce a
-@code{\with} block in which one or more score-wide default values
-of context properties may be specified. Information on using
-@code{\with} blocks can be found under the heading
-@qq{Setting context properties with @code{\\with} } in
-@ref{Modifying context properties}.)
+@warning{@bs{}@code{new Score} should not be used as the essential
+top-level @code{Score} context is created automatically when the music
+expression within the @bs{}@code{score} block is interpreted. Score-wide
+default values of context properties can be changed within the
+@bs{}@code{layout} block. See @ref{Modifying context properties}}
You have seen many practical examples which created new
@code{Staff} and @code{Voice} contexts in earlier sections, but
other things) several times. The change is from the default
value, not the most recently set value.
-@lilypond[quote,verbatim,ragged-right,relative=1,fragment]
+@lilypond[quote,verbatim,ragged-right,relative=1]
c4 d
% make note heads smaller
\set fontSize = #-4
>>
@end lilypond
-Or, if the property override is to be applied to all staves
-within the score, it may be appended to an explicit
-@code{\new Score} command, like this:
-
-@lilypond[quote,verbatim,ragged-right]
-\score {
- \new Score \with { extraNatural = ##f } <<
- \new Staff {
- \relative c'' {
- gis4 ges aes ais
- }
- }
- \new Staff {
- \relative c'' {
- gis4 ges aes ais
- }
- }
- >>
-}
-@end lilypond
-
Properties set in this way may still be changed dynamically using
@code{\set} and returned to the default value set in the
@code{\with} block with @code{\unset}.
}
@end lilypond
+If the property override is to be applied to all staves
+within the score:
+
+@lilypond[quote,verbatim]
+\score {
+ <<
+ \new Staff {
+ \relative c'' {
+ gis4 ges aes ais
+ }
+ }
+ \new Staff {
+ \relative c'' {
+ gis4 ges aes ais
+ }
+ }
+ >>
+ \layout {
+ \context {
+ \Score extraNatural = ##f
+ }
+ }
+}
+@end lilypond
+
@noindent
Context properties set in this way may be overridden for particular
instances of contexts by statements in a @code{\with} block, and by
@code{\set} command in a @code{\context} block in the
same way.
-
@seealso
Notation Reference: @ruser{Modifying context plug-ins},
@ruser{Changing context default settings}.
+@knownissues
+The @code{Stem_engraver} and @code{Beam_engraver} attach their
+objects to note heads. If the @code{Note_heads_engraver} is removed
+no note heads are produced and therefore no stems or beams are created
+either.
+
@node Extending the templates
@section Extending the templates
@end lilypond
None of the templates provides this layout exactly. The nearest is
-@q{SATB vocal score and automatic piano reduction} -- see @ref{Vocal
-ensembles} -- but we need to change the layout and add a piano
+@q{SATB vocal score and automatic piano reduction} -- see
+@ref{Vocal ensembles} -- but we need to change the layout and add a piano
accompaniment which is not derived automatically from the vocal parts.
The variables holding the music and words for the vocal parts are
fine, but we shall need to add variables for the piano reduction.
@} % end Score context
@end example
+@cindex stretchability of staves
+@cindex staves, stretchability
+
+The above layout of the organ staves is almost perfect; however,
+there is a slight defect which is not visible by looking at just a
+single system: The distance of the pedal staff to the left hand staff
+should behave approximately the same as the right hand staff to the
+left hand staff. In particular, the stretchability of staves in a
+@code{PianoStaff} context is limited (so that the distance between
+the staves for the left and right hand can't become too large), and
+the pedal staff should behave similarly.
+
+@cindex sub-properties
+@cindex properties, sub-properties
+@cindex graphical objects
+@cindex objects, graphical
+@cindex grobs
+
+Stretchability of staves can be controlled with the
+@code{staff-staff-spacing} property of the
+@code{VerticalAxisGroup} @q{graphical object} (commonly called
+@q{grob}s within the lilypond documentation) -- don't worry about
+the details right now; this is fully explained later. For the
+curious, have a look at @ruser{Overview of modifying properties}.
+In this case, we want to modify the @code{stretchability}
+sub-property only. Again, for the curious, you can find the
+default values for the staff-staff-spacing property
+in file @file{scm/define-grobs.scm} by looking up the definition
+of the @code{VerticalAxisGroup} grob. The value for
+@code{stretchability} is taken from the definition of the
+@code{PianoStaff} context (in file @file{ly/engraver-init.ly})
+so that the values are identical.
+
+@example
+\score @{
+ << % PianoStaff and Pedal Staff must be simultaneous
+ \new PianoStaff <<
+ \new Staff = "ManualOne" <<
+ \keyTime % set key and time signature
+ \clef "treble"
+ \new Voice @{
+ \voiceOne
+ \ManualOneVoiceOneMusic
+ @}
+ \new Voice @{
+ \voiceTwo
+ \ManualOneVoiceTwoMusic
+ @}
+ >> % end ManualOne Staff context
+ \new Staff = "ManualTwo" \with @{
+ \override VerticalAxisGroup
+ #'staff-staff-spacing #'stretchability = 5
+ @} <<
+ \keyTime
+ \clef "bass"
+ \new Voice @{
+ \ManualTwoMusic
+ @}
+ >> % end ManualTwo Staff context
+ >> % end PianoStaff context
+ \new Staff = "PedalOrgan" <<
+ \keyTime
+ \clef "bass"
+ \new Voice @{
+ \PedalOrganMusic
+ @}
+ >> % end PedalOrgan Staff
+ >>
+@} % end Score context
+@end example
That completes the structure. Any three-staff organ music
will have a similar structure, although the number of voices
may vary. All that remains now
\ManualOneVoiceTwoMusic
}
>> % end ManualOne Staff context
- \new Staff = "ManualTwo" <<
+ \new Staff = "ManualTwo" \with {
+ \override VerticalAxisGroup
+ #'staff-staff-spacing #'stretchability = 5
+ } <<
\keyTime
\clef "bass"
\new Voice {
} % end Score context
@end lilypond
+@seealso
+Music Glossary:
+@rglos{system}.
@node Saving typing with variables and functions
@subsection Saving typing with variables and functions
>>
@end lilypond
-
@c -*- coding: utf-8; mode: texinfo; fill-column: 60 -*-
@ignore
- Translation of GIT committish: 66dd932f6519b7913400a838c5efbc5407e06cd8
+ Translation of GIT committish: 6908517be0826a3386264cd6d26d742b18e3a227
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
Terminologie: @rglos{time signature}.
-De @notation{maatsoort} kun je aangeven met het @code{\time}
-commando:
+De @notation{maatsoort} kun je aangeven met het @code{\time}-commando:
+
+@lilypond[verbatim,quote]
+\relative c'' {
+ \time 3/4
+ a4 a a
+ \time 6/8
+ a4. a
+ \time 4/4
+ a4 a a a
+}
+@end lilypond
+
+@subheading Tempo-aanduidingen
+
+@cindex tempo marks
+@cindex metronome marks
+
+@funindex \tempo
+@funindex tempo
+
+Terminologie: @rglos{tempo indication}, @rglos{metronome}.
+
+De @notation{tempo indication} en @notation{metronome mark} worden
+gezet met het @code{\tempo}-commando:
@lilypond[verbatim,quote]
\relative c'' {
\time 3/4
+ \tempo "Andante"
a4 a a
\time 6/8
+ \tempo 4. = 96
a4. a
\time 4/4
+ \tempo "Presto" 4 = 120
a4 a a a
}
@end lilypond
\relative c, {
\clef "bass"
\time 3/4
+ \tempo "Andante" 4 = 120
\clef "bass"
c2 e8 c'
g'2.
@c -*- coding: utf-8; mode: texinfo; -*-
@ignore
- Translation of GIT committish: 77c34ddc0877c0625a48e1b41049b6dbaae215e0
+ Translation of GIT committish: 6908517be0826a3386264cd6d26d742b18e3a227
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
MACRO DEFINITIONS GUIDELINES
****************************
-This file should contain macro defintions which are common to all
+This file should contain macro definitions which are common to all
languages, i.e. all macro definitions which do not contain text that
should be translated (namely text visible in the output).
@end ifnothtml
+@c do not translate the following macro -- it is used in
+@c an untranslated manual.
+
+@ifhtml
+
+@macro advanced{TEXT}
+@html
+<div class="advanced">
+@end html
+@strong{Advanced note:} \TEXT\
+@c keep the space for proper nesting of </p>
+
+@html
+</div>
+@end html
+@end macro
+
+@end ifhtml
+
+@ifnothtml
+
+@macro advanced{TEXT}
+@quotation
+@b{Advanced note:} \TEXT\
+@end quotation
+@end macro
+
+@end ifnothtml
+
+
@macro docMain
@cartouche
Voor meer informatie over waar deze handleiding in de rest van de
<!--
- Translation of GIT committish: eef24b23f2bd35eb068584c2c459ba97227caf15
+ Translation of GIT committish: 6908517be0826a3386264cd6d26d742b18e3a227
When revising a translation, copy the HEAD committish of the
version that you are working on. See TRANSLATION for details.
<form action="http://google.com/search"
method="get"
name="search"
- onSubmit="search.q.value='site:lilypond.org +v2.12 '
+ onSubmit="search.q.value='site:lilypond.org +v2.14 '
+ search.brute_query.value"
- onMouseMove="search.q.value='site:lilypond.org +v2.12 '
+ onMouseMove="search.q.value='site:lilypond.org +v2.14 '
+ search.brute_query.value"
- onKeyUp="search.q.value='site:lilypond.org +v2.12 '
+ onKeyUp="search.q.value='site:lilypond.org +v2.14 '
+ search.brute_query.value">
<input type="hidden" name="btnG" value="Zoek met Google">
<input type="text" name="brute_query" onfocus="this.value=''" value="Zoek">
\input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: nl -*-
@ignore
- Translation of GIT committish: 66dd932f6519b7913400a838c5efbc5407e06cd8
+ Translation of GIT committish: 6908517be0826a3386264cd6d26d742b18e3a227
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
@include macros.itexi
@include weblinks.itexi
-@afourpaper
-
@c don't remove this comment.
@ignore
@omfcreator Graham Percival and Patrick McCarty
@end quotation
@end copying
+@c Info files are no longer installed in a subdirectory, images are
+@c expected to be found in lilypond/ subdirectory.
+@dircategory GNU LilyPond --- the music typesetter
+@direntry
+* LilyPond Learning Manual: (lilypond-learning). Start here.
+* Music Glossary: (music-glossary). For non-English users.
+* LilyPond: (lilypond-notation). LilyPond Notation Reference.
+* LilyPond Snippets: (lilypond-snippets). Short tricks, tips, and examples.
+* LilyPond Internals Reference: (lilypond-internals). Definitions for tweaking.
+* LilyPond Application Usage: (lilypond-usage). Installing and running applications.
+* LilyPond Website: (lilypond-web). Preview of new website.
+* lilypond: (lilypond-usage)Running LilyPond. Invoking the LilyPond program.
+* abc2ly: (lilypond-usage)Invoking abc2ly. Importing ABC.
+* convert-ly: (lilypond-usage)Updating files with convert-ly. Older LilyPond versions.
+* etf2ly: (lilypond-usage)Invoking etf2ly. Importing Finale.
+* lilypond-book: (lilypond-usage)LilyPond-book. Integrating text and music.
+* midi2ly: (lilypond-usage)Invoking midi2ly. Importing MIDI.
+* musicxml2ly: (lilypond-usage)Invoking musicxml2ly. Importing MusicXML.
+@end direntry
@c TITLE PAGE
@ifnottex
@divId{quickSummary}
@subheading Wat is LilyPond?
-LilyPond is een muzieknotatie programma en beoogt het produceren van
+LilyPond is een muzieknotatieprogramma en beoogt het produceren van
bladmuziek van de hoogst mogelijke kwaliteit. Het integreert de
esthetiek van traditioneel gegraveerde bladmuziek in computer printouts.
LilyPond is vrije software en is onderdeel van het
@end ignore
-@c Info files are no longer installed in a subdirectory, images are
-@c expected to be found in lilypond/ subdirectory.
-@dircategory GNU LilyPond --- the music typesetter
-@direntry
-* LilyPond Learning Manual: (lilypond-learning). Start here.
-* Music Glossary: (music-glossary). For non-English users.
-* LilyPond: (lilypond-notation). LilyPond Notation Reference.
-* LilyPond Snippets: (lilypond-snippets). Short tricks, tips, and examples.
-* LilyPond Internals Reference: (lilypond-internals). Definitions for tweaking.
-* LilyPond Application Usage: (lilypond-usage). Installing and running applications.
-* LilyPond Website: (lilypond-web). Preview of new website.
-* lilypond: (lilypond-usage)Running LilyPond. Invoking the LilyPond program.
-* abc2ly: (lilypond-usage)Invoking abc2ly. Importing ABC.
-* convert-ly: (lilypond-usage)Updating files with convert-ly. Older LilyPond versions.
-* etf2ly: (lilypond-usage)Invoking etf2ly. Importing Finale.
-* lilypond-book: (lilypond-usage)LilyPond-book. Integrating text and music.
-* midi2ly: (lilypond-usage)Invoking midi2ly. Importing MIDI.
-* musicxml2ly: (lilypond-usage)Invoking musicxml2ly. Importing MusicXML.
-@end direntry
-
-
@c FIXME: this still doesn't solve the broken links in pdf and big
@c html; we'll need a bunch of @iftext and stuff in here. -gp
@c ****************** SPECIAL MACROS FOR WEB MANUAL ************
@c -*- coding: utf-8; mode: texinfo; fill-column: 60 -*-
@ignore
- Translation of GIT committish: 303c4023fce97de0cfb2d27a7e689d1ad7c4752b
+ Translation of GIT committish: 6908517be0826a3386264cd6d26d742b18e3a227
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
@divClass{heading-center}
@ifclear web_version
- @c yes, we want verisonDevel here, since the online links
+ @c yes, we want versionDevel here, since the online links
@c for @version won't be up yet!
@heading Downloads voor LilyPond @versionDevel
@divEnd
+@divClass{link-headings}
+
@divClass{column-left-top}
@subheading Voor gebruikers
@itemize
@item
-@c TODO: duplicate to avoid underlined refs in HTML? icky.
+@c ref is duplicated to avoid underlining ref as image.
@ref{Unix, @sourceimage{logo-linux,,,}
@sourceimage{logo-freebsd,,,}}
@ref{Unix, Unix (Linux en FreeBSD)}
@end itemize
@divEnd
+@divEnd
@divClass{column-center-bottom}
@subheading Sponsors
-Hartelijk dank aan @uref{http://www.vt.edu/, Virgina Tech} en
+Hartelijk dank aan @uref{http://www.vt.edu/, Virginia Tech} en
@uref{http://www.linuxaudio.org/, linuxaudio.org} voor het
sponsoren van onze bandbreedte.
uninstall-lilypond
@end example
-@divEnd
+@subsubheading Hulp
+
+Op de commandoregel, typ:
+@example
+sh lilypond-@versionStable{}-OS-TYPE.sh --help
+@end example
+@divEnd
@divClass{column-right-top}
@subheading Een bestand compileren
@item
@sourceimage{logo-fedora,,,}
@uref{http://koji.fedoraproject.org/koji/packageinfo?packageID=2447,
-Fedora: LilyPond 2.12.3}
+Fedora: LilyPond 2.14.1}
@item
@sourceimage{logo-ubuntu,,,}
@uref{http://packages.ubuntu.com/search?keywords=lilypond,
-Ubuntu: LilyPond 2.12.2}
+Ubuntu: LilyPond 2.12.3}
@item
@sourceimage{logo-slackware,,,}
@uref{http://www.johannes-schoepfer.de/lilypond/,
-Slackware: LilyPond 2.12.3}
+Slackware: LilyPond 2.14.1}
@item
@sourceimage{logo-debian,,,}
@uref{http://packages.debian.org/search?keywords=lilypond,
-Debian: LilyPond 2.12.2}
+Debian: LilyPond 2.12.3}
@item
@sourceimage{logo-suse,,,}
@item
@sourceimage{logo-macosx,,,}
@downloadStableDarwinNormal
-Voor Intel processors (als je twijfelt, gebruik deze).
+Voor MacOS 10.4 of nieuwer, met Intel-processors (als je
+twijfelt, gebruik deze).
@item
@sourceimage{logo-macosx,,,}
@downloadStableDarwinPPC
-Voor G3 and G4 CPUs (oudere Apple computers).
+Voor MacOS 10.4 of nieuwer, met G3- en G4-processors (oudere
+Apple computers).
@end itemize
@item
Maak een bestand genaamd @command{lilypond} met als inhoud
-@help obvious css issue to be dealt with. :(
-@c we need a small font here to fit. -gp
-@smallexample
+@divClass{h-scroll-auto}
+@example
exec @var{MAP}/LilyPond.app/Contents/Resources/bin/lilypond "$@@"
-@end smallexample
+@end example
+@divEnd
@warning{@var{MAP} is normaal gesproken @code{/Applications/}}
Scripts kunnen ook worden uitgevoerd op de commandoregel
door ze direct aan te roepen:
+@divClass{h-scroll-auto}
@example
@var{pad/naar}/LilyPond.app/Contents/Resources/bin/lilypond
@end example
+@divEnd
Dat geldt ook voor alle andere scripts in die map, zoals
@command{lilypond-book} en @command{convert-ly}.
@item
@sourceimage{logo-windows,,,}
@downloadStableWindows
-Voor Windows ME, NT, 2000, XP, Vista, en Windows 7.
+Voor Windows 2000, XP, Vista, en Windows 7.
@end itemize
@include gpl.itexi
@divEnd
-
-
-
@c -*- coding: utf-8; mode: texinfo; documentlanguage: nl; fill-column: 60 -*-
@c This file is part of web.texi
@ignore
- Translation of GIT committish: 303c4023fce97de0cfb2d27a7e689d1ad7c4752b
+ Translation of GIT committish: 6908517be0826a3386264cd6d26d742b18e3a227
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
@divEnd
+@divClass{link-headings}
+
@divClass{column-left-top}
@subheading Wat LilyPond doet
@end itemize
@divEnd
+@divEnd
+
+@c TRANSLATORS, translations are not yet compiled in Info format, so
+@c it's not worth translating the right column of the following
+@c menu. -JM
@divClass{hide}
@menu
* Functies:: What can LilyPond do?
is een indrukwekkende Schenker-analyse, gemaakt door Kris
Schaffer, voor een artikel in in
@uref{http://www.linuxjournal.com/article/8364 , Linux
-Journal.}. Voor de duidelijkheid zijn hier kleuren
+Journal}. Voor de duidelijkheid zijn hier kleuren
toegevoegd.
@exampleImage{bach-schenker}
muziek, beschikbaar voor directe download of ouderwets op papier.
@item
-@uref{http://theshadylanepublishing.com/, The Shady Lane
-Publishing}, een @qq{micro muziekuitgeverij} met als
-doelstelling het promoten van een nieuwe vorm van muzikale
-economie, die dichter bij de muzikanten en muziekliefhebbers
-staat.
+@uref{http://shadylane.fr, The Shady Lane Publishing},
+een @qq{micro muziekuitgeverij} met als doelstelling het
+promoten van een nieuwe vorm van muzikale economie, die
+dichter bij de muzikanten en muziekliefhebbers staat.
@end itemize
@divEnd
+@contactUsAbout{concerten of bladmuziek}
@divClass{column-center-bottom}
@subheading En nu?
@divClass{keep-bullets}
@itemize
+@item
+april 2011
+
+@uref{http://www.linux-magazine.com,Linux Magazine} publiceert een
+artikel getiteld
+@uref{http://www.linux-magazine.com/w3/issue/126/088-090_projects.pdf,
+Projects on the Move}. Het is een inleiding in MuseScore,
+
+LilyPond en Chordii. Auteur Carla Schroder schrijft
+@qq{LilyPond wordt aangestuurd vanaf de commandoregel, maar
+je niet afschrikken door het ontbreken van een GUI; LilyPond
+is gebruiksvriendelijk en gemakkelijk te leren}, en ze geeft
+een direct te gebruiken voorbeeld.
+
++@item
+mei 2010
+
+Peter Kirn, op de Create Digital Music website, publiceert een
+@uref{http://createdigitalmusic.com/2010/05/14/lilypond-free-beautiful-music-notation-engraving-for-anyone/,LilyPond
+recentie}. Hij neemt een
+evenwichtig standpunt in over gebruik, prijst LilyPonds
+hoge kwaliteit van notatie en stelt voor het zelf uit te proberen.
+
@item
september 2009
@uref{http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2009/10/Digitaler-Notenschluessel,
artikel over LilyPond}.
+@item
+augustus 2009
+
+Ann Drinan, op de
+@uref{http://www.polyphonic.org/article.php?id=188, Polyphonic.org}
+website, presenteert opmerkingen van twee orkestbibliothekarissen
+die praten over het gebruik van software om hun bibliotheken te
+onderhouden.
+@item
+juni 2009
+
+In een @uref{http://news.lilynet.net/Free-Music-Now, artikel}
+gepubliceerd in het Franse @emph{National Conservatory Parent
+Association}'s jaarblad, legt de Franse componist en LilyPond-bijdrager
+Valentin Villenave uit waarom Vrije licenties, en in het bijzonder
+LilyPond-gegraveerde partituren, van instrumenteel belang zijn in
+het voor iedereen toegankelijk maken van genoteerde muziek.
+
@item
februari 2008
het wel niet heeft.}
@divEnd
+
+@divClass{testimonial-item}
+@subsubheading @uref{http://webusers.siba.fi/~mkuuskan/, Dr. Mika Kuuskankare}, onderzoeker aan de @uref{http://siba.fi, Sibelius Academy Finland}, componist en auteur van Expressive Notation Package (ENP)
+
+@qq{Ik heb het diepste respect voor LilyPond en haar
+scheppers en beheerders omdat ik uit persoonlijke ervaring
+weet hoe moeilijk dit soort software kan zijn.}
+@divEnd
+
+
+@divClass{testimonial-item}
+@subsubheading @uref{http://camerondh.blogspot.com, David Cameron}, Muzikant, professioneel typesetter en sinds lang SCORE-gebruiker
+
+@qq{Mijn hartelijke dank aan iedereen die bijdraagt​aan dit
+project. Ik was een power SCORE-gebruiker voor grote
+zetwerk huizen lang geleden in de jaren '90, maar voor mijn
+gevoel maakt LilyPond het mogelijk om precies datgene op
+papier te krijgen wat ik wil, in het bijzonder als het niet
+"standaard" praktijk is.}
+@divEnd
+
@divEnd
+@contactUsAbout{nieuwsberichten of gebruikerservaringen}
+
@divClass{column-center-bottom}
@subheading En nu?
syntaxfouten in LilyPond-verfijningen (tweaks) worden
gehighlight in het tekstvenster.
-@warning{Denemo ondersteunt officieel de gedateerde Lilypond
-versie 2.8.7, die veel functies mist die sindsdien zijn
-toegevoegd. De Denemo-ontwikkelaars werken aktief aan
-ondersteunin van onze huidige stabiele 2.12-versie.}
@divEnd
@divClass{column-center-top}
-@subheading Tekst omgeving: Emacs en Vim
+@subheading Tekst omgeving
@sourceimage{logo-linux,,,}
@sourceimage{logo-freebsd,,,}
Geïntegreerde Ontwikkel Omgeving (IDE). Er is een
@q{lilypond mode} die de taaldefinities voor het werken met
LilyPond-broncodebestanden levert. Verder heeft een van
-onze ontwikkelaars @uref{http://nicolas.sceaux.free.fr/
-lilypond/lyqi.html,lyqi} geschreven, een Emacs major mode.
-
+onze ontwikkelaars
+@uref{http://nicolas.sceaux.free.fr/lilypond/lyqi.html,lyqi}
+geschreven, een Emacs major mode.
@uref{http://www.vim.org}
Meer informatie over instellingen voor Emacs en Vim is te
vinden in @rprogram{Text editor support}.
-@divEnd
-
-@ignore these may not need to be here at all, as they are purely
-MacOS scripts.
-
-@divClass{column-center-top}
-@subheading Andere programma's
-
-@subsubheading Tekstomgeving: TexShop
-
@sourceimage{logo-macosx,,,}
-
@uref{http://www.uoregon.edu/~koch/texshop}
De TexShop-editor voor MacOS@tie{}X kan uitgebreid worden
@uref{http://users.dimi.uniud.it/~nicola.vitacolonna/home/content/lilypond-scripts}
@end example
-@subsubheading TextMate
+@sourceimage{logo-macosx,,,}
+Er is een LilyPond bundel voor TextMate, een commerciële editor for MacOS.
+Die kan je installeren met:
+
+@example
+mkdir -p /Library/Application\ Support/TextMate/Bundles
+cd /Library/Application\ Support/TextMate/Bundles
+git clone http://github.com/textmate/lilypond.tmbundle.git
+
+@end example
@divEnd
-@end ignore
+
@divClass{column-center-top}
-@subheading Andere programma's die LilyPond-code kunnen exporteren
+@subheading Programma's die LilyPond-code kunnen exporteren
@subsubheading Score, tab en MIDI-editors:
@item
@uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd},
-is gebaseerd op de @uref{http://cairographics.org, Cairo}
-bibliotheek en heeft experimentele LilyPond export
+een partituur editor gebaseerd op de @uref{http://cairographics.org, Cairo}
+bibliotheek en heeft experimentele LilyPond export.
@item
@uref{http://www.tuxguitar.com.ar/,TuxGuitar}, een
partituur-beeld en tab-beeld en kan exporteren naar LilyPond.
@item
-@uref{http://musescore.org,MuseScore} heeft onvolledige
-LilyPond-export maar wordt actief ontwikkeld.
+@uref{http://musescore.org,MuseScore}, een partituur-editor,
+heeft onvolledige LilyPond-export maar wordt actief
+ontwikkeld.
@item
-@uref{http://canorus.org,Canorus} kan ook exporteren naar
-LilyPond, maar is nog beta-software. Testers zijn welkom.
+@uref{http://canorus.org,Canorus}, een partituur-editor, kan
+ook exporteren naar LilyPond, maar is nog beta-software.
+Testers zijn welkom.
@item
@uref{http://www.volny.cz/smilauer/rumor/rumor.html,Rumor},
een realtime monofonische MIDI naar LilyPond-vertaler.
+@item
+@uref{http://www.holmessoft.co.uk/homepage/software/NWC2LY/index.htm,
+NW2LY} een a C#-programma dat een
+@uref{http://www.noteworthysoftware.com/, NoteWorthy}-lied naar
+LilyPond converteert.
+
@end itemize
@subsubheading Gereedschappen voor de commandoregel
@itemize
@item
-@uref{http://strasheela.sourceforge.net, Strasheela} is
-@qq{een hoog-expressief constraint-gebaseerd muziek
-componeer systeem}.
+@uref{http://www.projectabjad.org/,Abjad}, een
+@uref{http://www.python.org/,Python} API voor Formalized
+Score Control, ontworpen om componisten ingewikkelde stukken
+LilyPond-notatie op te laten bouwen op een iteratieve en
+incrementele manier.
@item
-@uref{http://common-lisp.net/project/fomus/,FOMUS}, een LISP-bibliotheek
-voor het genereren van muzieknotatie.
+@uref{http://common-lisp.net/project/fomus/,FOMUS}, een
+LISP-bibliotheek voor het genereren van muzieknotatie vanuit
+computermuziek softwareomgevingen.
+
+@item
+@uref{http://strasheela.sourceforge.net,Strasheela}, een
+omgeving gebouwd bovenop de
+@uref{http://www.mozart-oz.org/, Mozart/Oz}
+constraint-gebaseerde programmeertaal.
+
@end itemize
@divEnd
@c -*- coding: utf-8; mode: texinfo; fill-column: 60 -*-
@ignore
- Translation of GIT committish: 303c4023fce97de0cfb2d27a7e689d1ad7c4752b
+ Translation of GIT committish: 6908517be0826a3386264cd6d26d742b18e3a227
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
@spanEnd
@end macro
-
@divClass{heading-center}
@ifclear web_version
@heading Handleidingen voor LilyPond @version
@divEnd
-@c TODO: do we want these links to be in larger text / bold ? CSS.
+@divClass{link-headings}
@divClass{column-center-top}
@subheading Inleiding
@itemize
-@item @ref{Tekstinvoer}:
-LilyPond is een @strong{tekstgebaseerd} muzieknotatieprogramma. Lees
-dit eerst!
+@item
+@ref{Tekstinvoer}:
+LilyPond is een @strong{tekstgebaseerd}
+muzieknotatieprogramma. Lees dit eerst!
-@item @ifWebLinks{@manualStableLearningSplitNoName,@rlearningnamed{Top,Beginnen}}
+@item
+@ifWebLinks{@manualStableLearningSplitNoName,@rlearningnamed{Top,Beginnen}}
een @qq{onmisbare} gebruiksvriendelijke inleiding in LilyPond.
@details{Beginnen}
-@item @ifWebLinks{@manualStableGlossarySplitNoName-nl,@rglosnamed{Top,Terminologie}}
+@item
+@ifWebLinks{@manualStableGlossarySplitNoName-nl,@rglosnamed{Top,Terminologie}}
@emph{(optioneel te lezen)}
muziektermen en vertalingen.
@details{Terminologie}
-@item @ifWebLinks{@manualStableEssaySplitNoName,@ressaynamed{Top,Essay}}
+@item
+@ifWebLinks{@manualStableEssaySplitNoName,@ressaynamed{Top,Essay}}
@emph{(optioneel te lezen)}
achtergrondinformatie over muzieknotatie dmv de computer.
@details{Essay}
-
@end itemize
@divEnd
@itemize
-@item @ifWebLinks{@manualStableNotationSplitNoName,@rusernamed{Top,Notatie}}
+@item
+@ifWebLinks{@manualStableNotationSplitNoName,@rusernamed{Top,Notatie}}
syntax handleiding.
@details{Notatie}
-@item @ifWebLinks{@manualStableUsageSplitNoName,@rprogramnamed{Top,Gebruik}}
+@item
+@ifWebLinks{@manualStableUsageSplitNoName,@rprogramnamed{Top,Gebruik}}
het draaien van alle programma's.
@details{Gebruik}
-@item @ifWebLinks{@manualStableSnippetsSplitNoName,@rlsrnamed{Top,Snippers}}
+@item
+@ifWebLinks{@manualStableSnippetsSplitNoName,@rlsrnamed{Top,Snippers}}
handige trucs en tips.
@details{Snippers}
@itemize
-@item @ref{FAQ}:
+@item
+@ref{FAQ}:
Veel gestelde vragen.
-@item @ref{Top, Web}:
+@item
+@ref{Top, Web}:
dit document.
@details{Web}
-@item @ifWebLinks{@manualStableChangesSplitNoName,@rchangesnamed{Top,Veranderingen}}
+@item
+@ifWebLinks{@manualStableChangesSplitNoName,@rchangesnamed{Top,Veranderingen}}
wat is nieuw?
@details{Veranderingen}
-@item @ifWebLinks{@manualStableExtendingSplitNoName,@rextendnamed{Top,Uitbreidingen}}
+@item
+@ifWebLinks{@manualStableExtendingSplitNoName,@rextendnamed{Top,Uitbreidingen}}
specialistische verfraaiingen (tweaks).
@details{Uitbreidingen}
-@item @ifWebLinks{@manualStableInternalsSplitNoName,@rinternalsnamed{Top,Internals}}
+@item
+@ifWebLinks{@manualStableInternalsSplitNoName,@rinternalsnamed{Top,Internals}}
tweaks-handleiding.
@details{Internals}
@itemize
-@item @ref{Vertaald}:
+@item
+@ref{Vertaald}:
status van de vertaling voor niet-Engelstaligen.
-@item @ref{Alles}:
-te downloaden handleidingen en oude handleidingen.
+@item
+@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippers Repository}:
+voorbeelden door gebruikers, hints en tips.
-@item @ref{Development}:
+@item
+@ref{Development}:
handleidingen voor de ontwikkelversie.
-@item @ref{FDL}:
+@item
+@ref{FDL}:
deze handleidingen zijn uitgegeven onder de GNU Free Documentation
License (GNU Vrije Documentatie Licentie).
@divEnd
+@divEnd
+
@divClass{hide}
@menu
@docLinks{Gebruik, usage,
@rprogramnamed{Top,Usage},
@manualStableUsageSplit,
- @manualStableUsageBig, 300 KB,
- @manualStableUsagePdf, 400 KB}
+ @manualStableUsageBig, 400 KB,
+ @manualStableUsagePdf, 600 KB}
@divEnd
@include fdl.itexi
@divEnd
-
-
@knownissues
The relative conversion will not affect @code{\transpose},
-@code{\chordmode} or @code{\relative} sections in its argument.
-To use relative mode within transposed music, an additional
-@code{\relative} must be placed inside @code{\transpose}.
+@code{\chordmode} or @code{\relative} sections in its argument. To use
+relative mode within transposed music, an additional @code{\relative}
+must be placed inside @code{\transpose}.
+
+Triple accidentals will not be printed if using @code{\transpose}. An
+@q{enharmonically equivalent} pitch will be used instead (e.g. d-flat
+rather than e-triple-flat).
+
@node Inversion
@unnumberedsubsubsec Inversion
@knownissues
-
Only the contents of the first @code{Voice} occurring in an
-@code{\addQuote} command will be considered for quotation, so
-@code{@var{music}} cannot contain @code{\new} and
-@code{\context Voice} statements that would switch to a different
-Voice.
-
-Quoting grace notes is broken and can even cause LilyPond to
-crash.
-
-Quoting nested triplets may result in poor notation.
-
-In earlier versions of LilyPond (pre 2.11), @code{addQuote} was
-written entirely in lower-case letters: @code{\addquote}.
+@code{\addQuote} command will be considered for quotation, so the music
+expression must not contain @code{\new} and @code{\context Voice}
+statements which would switch to a different Voice. Quoting grace notes
+is unsupported and may cause LilyPond to crash whereas quoting nested
+triplets may result in poor notation.
@node Formatting cue notes
@end example
The music from the corresponding measures of the @code{@var{quote name}}
-is added as @code{CueVoice} context and occurs simultaneously with the
-@code{@var{music}}, which creates a polyphonic situation. The
+is added as a @code{CueVoice} context and occurs simultaneously with the
+@code{@var{music}}, which then creates a polyphonic situation. The
@code{@var{direction}} takes the argument @code{UP} or @code{DOWN}, and
-corresponds to first and second voices respectively determining how
+corresponds to the first and second voices respectively, determining how
the cue notes are printed in relation to the other voice.
@lilypond[verbatim,quote]
translation status for non-English readers.
@item
-@ref{All}:
-downloadable and old manuals.
+@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository}:
+user-created examples, hints and tips.
@item
@ref{Development}:
--- /dev/null
+\version "2.14"
+
+\header {
+ texidoc = "
+A @code{\Voice} should be able to contain both an @code{Ambitus_engraver}
+and a @code{Mensural_ligature_engraver} without segfaulting.
+ "
+}
+
+\new Voice \with {
+ \consists Ambitus_engraver
+ \consists Mensural_ligature_engraver
+} {
+ \[ c'\longa c''\longa \]
+}
--- /dev/null
+\version "2.15.5"
+
+\header {
+ texidoc = "
+To calculate the total duration of chord tremolos, only real notes shall be
+counted, no other commands.
+"
+}
+
+right = \relative c'' {
+ s2
+}
+
+left = \relative c' {
+ % This tremolo contains just two notes (but three lilypond events/commands!)
+ \repeat tremolo 4 { f,16 \change Staff = "right" f'}
+}
+
+\score {
+ \new PianoStaff <<
+ \new Staff = "right" { \right }
+ \new Staff = "left" { \clef bass \left }
+ >>
+}
-\version "2.14.0"
+\version "2.15.5"
#(use-modules (srfi srfi-13)
(ice-9 format))
%% \ottava
\test "" ##[ \ottava #1 #] % OttavaMusic
+%% \tweak
+\test "" ##[ < \tweak #'duration-log #2 c > #]
+\test "" ##[ < c \tweak #'transparent ##t e > #]
+\test "" ##[ < \tweak #'color #'(1.0 0.0 0.0) \tweak #'duration-log #2 c > #]
+\test "" ##[ c-\tweak #'font-size #3 -> #]
+
%% end test.
#(read-hash-extend #\[ #f) %{ ] %}
--- /dev/null
+\version "2.15.5"
+
+\header {
+ texidoc = "Horizontal brackets are created with the correct event-cause, ensuring
+tweaks are applied to the correct spanner."
+}
+
+\layout {
+ \context {
+ \Voice
+ \consists "Horizontal_bracket_engraver"
+ }
+}
+
+\relative c' {
+ c1-\tweak #'thickness #6 \startGroup
+ c1\startGroup
+ c1\stopGroup
+ c1\stopGroup
+}
--- /dev/null
+\version "2.15.4"
+\header {
+ texidoc = "For Voice-derived contexts like CueVoice, the lyrics should
+still start with the first note."
+}
+
+\score {
+ \new Staff <<
+ \new Voice \relative c'' {
+ g2
+ <<
+ { \voiceOne r2 }
+ \new CueVoice = "cue" { \voiceTwo g4 g }
+ >>
+ }
+ \context Lyrics \lyricsto "cue" { A B }
+ >>
+}
--- /dev/null
+\version "2.15.5"
+
+\header {
+
+ texidoc = "If lyrics are assigned to a non-existing voice, a warning should
+be printed. However, if the lyrics context does not contain any lyrics, then
+no warning should be printed."
+
+}
+
+#(ly:set-option 'warning-as-error #f)
+<<
+ \new Staff
+ \new Voice = "notes" {
+ c1
+ }
+ % This should not give a warning (empty lyrics, existing voice):
+ \new Lyrics \lyricsto "notes" \lyricmode { }
+ % This should give a warning (non-existing voice):
+ \new Lyrics \lyricsto "not-existing-notes" \lyricmode { Test }
+ % This should NOT give a warning (non-existing voice, but also no lyrics):
+ \new Lyrics \lyricsto "not-existing-notes" \lyricmode { }
+>>
--- /dev/null
+\version "2.15.4"
+
+#(ly:set-option 'warning-as-error #f)
+
+\header {
+ texidoc = "LilyPond does not support multiple concurrent phrasing slurs with the
+parentheses syntax. In this case, warnings will be given and the nested
+slur will not be generated. However, one can can create a second slur with
+a different spanner-id."
+}
+
+altPhSlur = #(make-music 'PhrasingSlurEvent 'span-direction START 'spanner-id "alt")
+altPhSlurEnd = #(make-music 'PhrasingSlurEvent 'span-direction STOP 'spanner-id "alt")
+
+\relative c'' {
+ % This will give warnings ("Already have phrasing slur" and "Cannot end phrasing slur")
+ c4\(\( d4\)\( e4\) f\) |
+ % This will give two overlapping slurs:
+ d\( d\altPhSlur e\) f\altPhSlurEnd |
+
+}
--- /dev/null
+\version "2.15.4"
+
+\header {
+ texidoc = "Appoggiatura and acciaccaturas use a different slur than the
+default, so they produce a nested slur without warnings."
+}
+
+\relative c'' {
+ c4( \acciaccatura e8 d4 e4 f) |
+ c4( \appoggiatura e8 d4 e4 f) |
+ c4 \appoggiatura e8 d4 e4 f |
+}
--- /dev/null
+\version "2.15.5"
+
+#(ly:set-option 'warning-as-error #f)
+
+\header {
+ texidoc = "An additional opening slur during a running slur should be ignored
+(and a warning printed), but never influence the slur's extents."
+}
+
+\paper { ragged-right = ##t }
+
+\relative c' {
+ \key fis \major
+ c1(
+ \break
+ a2 b4 c)
+}
+
+\relative c' {
+ \key fis \major
+ c1(
+ \break
+ a2( b4 c)
+% ^ extra SlurEvent
+}
+%% END
\ No newline at end of file
--- /dev/null
+\version "2.15.5"
+
+#(ly:set-option 'warning-as-error #f)
+
+\header {
+ texidoc = "LilyPond does not support multiple concurrent slurs with the
+parentheses syntax. In this case, warnings will be given and the nested
+slur will not be generated. However, one can can create a second slur with
+a different spanner-id."
+}
+
+altSlur = #(make-music 'SlurEvent 'span-direction START 'spanner-id "alt")
+altSlurEnd = #(make-music 'SlurEvent 'span-direction STOP 'spanner-id "alt")
+
+\relative c'' {
+ % This will give warnings ("Already have slur" and "Cannot end slur")
+ c4(( d4)( e4) f) |
+ % This will give two overlapping slurs:
+ d( d\altSlur e) f\altSlurEnd |
+
+}
--- /dev/null
+\version "2.15.5"
+
+\header {
+ texidoc = "The pitch of a pitched trill should not trigger a warning for
+ unterminated ties."
+}
+
+\relative c' {
+ \pitchedTrill
+ c1~\startTrillSpan d
+ c1\stopTrillSpan
+}
#include "engraver.hh"
#include "international.hh"
+#include "item.hh"
#include "note-column.hh"
#include "pointer-group-interface.hh"
#include "side-position-interface.hh"
-#include "stream-event.hh"
#include "spanner.hh"
-#include "item.hh"
+#include "stream-event.hh"
#include "translator.icc"
{
public:
TRANSLATOR_DECLARATIONS (Horizontal_bracket_engraver);
- vector<Spanner*> bracket_stack_;
- vector<Stream_event*> events_;
+ vector<Spanner *> bracket_stack_;
+ vector<Stream_event *> events_;
vsize pop_count_;
vsize push_count_;
DECLARE_TRANSLATOR_LISTENER (note_grouping);
};
-ADD_ACKNOWLEDGER (Horizontal_bracket_engraver, note_column);
-ADD_TRANSLATOR (Horizontal_bracket_engraver,
- /* doc */
- "Create horizontal brackets over notes for musical analysis"
- " purposes.",
-
- /* create */
- "HorizontalBracket ",
-
- /* read */
- "",
-
- /* write */
- ""
- );
-
Horizontal_bracket_engraver::Horizontal_bracket_engraver ()
{
pop_count_ = 0;
void
Horizontal_bracket_engraver::stop_translation_timestep ()
{
- for (int i = pop_count_; i--;)
+ for (vsize i = pop_count_; i--;)
if (bracket_stack_.size ())
bracket_stack_.pop_back ();
pop_count_ = 0;
push_count_ = 0;
+ events_.clear ();
}
+ADD_ACKNOWLEDGER (Horizontal_bracket_engraver, note_column);
+ADD_TRANSLATOR (Horizontal_bracket_engraver,
+ /* doc */
+ "Create horizontal brackets over notes for musical analysis"
+ " purposes.",
+
+ /* create */
+ "HorizontalBracket ",
+
+ /* read */
+ "",
+
+ /* write */
+ ""
+ );
virtual void finalize ();
DECLARE_ACKNOWLEDGER (rest);
- DECLARE_ACKNOWLEDGER (note_head);
+ DECLARE_ACKNOWLEDGER (ligature_head);
virtual void listen_ligature (Stream_event *ev);
void process_music ();
virtual Spanner *create_ligature_spanner () = 0;
ligature_start_mom_ = now_mom ();
- // TODO: dump cause into make_item/spanner.
+ // TODO: dump cause into make_item/spanner.
// announce_grob (ligature_, events_drul_[START]->self_scm ());
}
}
}
void
-Ligature_engraver::acknowledge_note_head (Grob_info info)
+Ligature_engraver::acknowledge_ligature_head (Grob_info info)
{
if (ligature_)
{
primitives_.push_back (info);
if (info.grob () && brew_ligature_primitive_proc != SCM_EOL)
- {
- info.grob ()->set_property ("stencil", brew_ligature_primitive_proc);
- }
+ info.grob ()->set_property ("stencil", brew_ligature_primitive_proc);
}
}
DECLARE_LISTENER (check_new_context);
bool music_found_;
+ bool lyrics_found_;
Context *lyrics_context_;
Context *music_context_;
SCM lyricsto_voice_name_;
Lyric_combine_music_iterator::Lyric_combine_music_iterator ()
{
music_found_ = false;
+ lyrics_found_ = false;
pending_grace_moment_.set_infinite (1);
lyric_iter_ = 0;
music_context_ = 0;
if (!ok ())
return ;
- // TODO: Check first if type=Voice and if id matches
- Stream_event * ev = unsmob_stream_event (sev);
- if (ev->get_property ("type") != ly_symbol2scm ("Voice"))
- return ;
-
+ // Search for a possible candidate voice to attach the lyrics to. If none
+ // is found, we'll try next time again.
Context *voice = find_voice ();
-
if (voice)
{
set_music_context (voice);
if (new_voice)
set_music_context (new_voice);
+ lyrics_found_ = true;
if (!music_context_)
return;
string name;
if (scm_is_string (voice_name))
- name = ly_scm2string (voice_name);
-
- get_music ()->origin ()->warning (_f ("cannot find Voice `%s'",
- name.c_str ()) + "\n");
+ name = ly_scm2string (voice_name);
+ /* Don't print a warning for empty lyrics (in which case we don't try
+ to find the proper voice, so it will not be found) */
+ if (lyrics_found_)
+ get_music ()->origin ()->warning (_f ("cannot find Voice `%s'",
+ name.c_str ()) + "\n");
}
if (lyric_iter_)
virtual Spanner *create_ligature_spanner ();
virtual void build_ligature (Spanner *ligature, vector<Grob_info> primitives);
DECLARE_TRANSLATOR_LISTENER (ligature);
-
+
public:
TRANSLATOR_DECLARATIONS (Mensural_ligature_engraver);
Mensural_ligature_engraver::Mensural_ligature_engraver ()
{
- brew_ligature_primitive_proc =
+ brew_ligature_primitive_proc =
Mensural_ligature::brew_ligature_primitive_proc;
}
}
ADD_ACKNOWLEDGER (Mensural_ligature_engraver, rest);
-ADD_ACKNOWLEDGER (Mensural_ligature_engraver, note_head);
+ADD_ACKNOWLEDGER (Mensural_ligature_engraver, ligature_head);
ADD_TRANSLATOR (Mensural_ligature_engraver,
/* doc */
#include "string-convert.hh"
#include "warn.hh"
-#define PITCH_WHEEL_TOP 0x3FFF
#define PITCH_WHEEL_CENTER 0x2000
-#define PITCH_WHEEL_BOTTOM 0x0000
-#define PITCH_WHEEL_RANGE (PITCH_WHEEL_TOP - PITCH_WHEEL_BOTTOM)
+#define PITCH_WHEEL_SEMITONE 0X1000
Midi_item *
Midi_item::get_midi (Audio_item *a)
+ audio_->transposing_.tone_pitch ()) * Rational (2);
tune -= Rational (get_semitone_pitch ());
- tune *= 100;
+ tune *= PITCH_WHEEL_SEMITONE;
return (int) double (tune);
}
int
Midi_note::get_semitone_pitch () const
{
- return int (double ((audio_->pitch_.tone_pitch ()
- + audio_->transposing_.tone_pitch ()) * Rational (2)));
+ double tune = double ((audio_->pitch_.tone_pitch ()
+ + audio_->transposing_.tone_pitch ()) * Rational (2));
+ return int (rint (tune));
}
string
// print warning if fine tuning was needed, HJJ
if (get_fine_tuning () != 0)
{
- finetune = PITCH_WHEEL_CENTER;
- // Move pitch wheel to a shifted position.
- // The pitch wheel range (of 4 semitones) is multiplied by the cents.
- finetune += (PITCH_WHEEL_RANGE *get_fine_tuning ()) / (4 * 100);
+ finetune = PITCH_WHEEL_CENTER + get_fine_tuning ();
str += ::to_string ((char) (0xE0 + channel_));
str += ::to_string ((char) (finetune & 0x7F));
#include "translator.icc"
-/*
- It is possible that a slur starts and ends on the same note. At
- least, it is for phrasing slurs: a note can be both beginning and
- ending of a phrase.
-
-*/
/*
NOTE NOTE NOTE
- This is largely similar to Slur_engraver. Check if fixes apply there too.
+ This is largely similar to Slur_engraver. Check if fixes
+ apply there too.
(on principle, engravers don't use inheritance for code sharing)
*/
+
+/*
+ It is possible that a slur starts and ends on the same note. At
+ least, it is for phrasing slurs: a note can be both beginning and
+ ending of a phrase.
+
+*/
class Phrasing_slur_engraver : public Engraver
{
- Drul_array<Stream_event *> events_;
- Stream_event *running_slur_start_;
+ vector<Stream_event *> start_events_;
+ vector<Stream_event *> stop_events_;
vector<Grob*> slurs_;
vector<Grob*> end_slurs_;
protected:
- void acknowledge_extra_object (Grob_info);
+ DECLARE_TRANSLATOR_LISTENER (phrasing_slur);
DECLARE_ACKNOWLEDGER (accidental);
DECLARE_ACKNOWLEDGER (fingering);
DECLARE_ACKNOWLEDGER (note_column);
DECLARE_ACKNOWLEDGER (text_script);
DECLARE_ACKNOWLEDGER (tie);
DECLARE_ACKNOWLEDGER (tuplet_number);
- DECLARE_TRANSLATOR_LISTENER (phrasing_slur);
+ void acknowledge_extra_object (Grob_info);
void stop_translation_timestep ();
- virtual void finalize ();
void process_music ();
+ virtual void finalize ();
+
+
public:
TRANSLATOR_DECLARATIONS (Phrasing_slur_engraver);
};
Phrasing_slur_engraver::Phrasing_slur_engraver ()
{
- events_[START] = events_[STOP] = 0;
}
IMPLEMENT_TRANSLATOR_LISTENER (Phrasing_slur_engraver, phrasing_slur);
void
Phrasing_slur_engraver::listen_phrasing_slur (Stream_event *ev)
{
- /*
- Let's not start more than one slur per moment.
- */
Direction d = to_dir (ev->get_property ("span-direction"));
if (d == START)
- ASSIGN_EVENT_ONCE (events_[START], ev);
- else if (d == STOP && !slurs_.empty ())
- ASSIGN_EVENT_ONCE (events_[STOP], ev);
+ start_events_.push_back(ev);
+ else if (d == STOP)
+ stop_events_.push_back(ev);
+ else ev->origin ()->warning (_f ("direction of %s invalid: %d",
+ "phrasing-slur-event", int (d)));
}
void
}
void
-Phrasing_slur_engraver::acknowledge_text_script (Grob_info info)
+Phrasing_slur_engraver::acknowledge_tuplet_number (Grob_info info)
{
acknowledge_extra_object (info);
}
}
void
-Phrasing_slur_engraver::acknowledge_tie (Grob_info info)
+Phrasing_slur_engraver::acknowledge_text_script (Grob_info info)
{
acknowledge_extra_object (info);
}
void
-Phrasing_slur_engraver::acknowledge_tuplet_number (Grob_info info)
+Phrasing_slur_engraver::acknowledge_tie (Grob_info info)
{
acknowledge_extra_object (info);
}
void
Phrasing_slur_engraver::finalize ()
{
- if (slurs_.size ())
- slurs_[0]->warning (_ ("unterminated phrasing slur"));
+ for (vsize i = 0; i < slurs_.size (); i++)
+ {
+ slurs_[i]->warning (_ ("unterminated phrasing slur"));
+ slurs_[i]->suicide ();
+ }
}
void
Phrasing_slur_engraver::process_music ()
{
- if (events_[STOP])
+ for (vsize i = 0; i < stop_events_.size (); i++)
{
- end_slurs_ = slurs_;
- slurs_.clear ();
+ Stream_event *ev = stop_events_[i];
+ string id = robust_scm2string (ev->get_property ("spanner-id"), "");
+
+ // Find the slur that is ended with this event (by checking the spanner-id)
+ bool ended = false;
+ for (vsize j = slurs_.size (); j--;)
+ {
+ if (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), ""))
+ {
+ ended = true;
+ end_slurs_.push_back (slurs_[j]);
+ slurs_.erase (slurs_.begin () + j);
+ }
+ }
+ if (!ended)
+ ev->origin ()->warning (_ ("cannot end phrasing slur"));
}
- if (events_[START] && slurs_.empty ())
+ for (vsize i = 0; i < start_events_.size (); i++)
{
- Stream_event *ev = events_[START];
-
- Grob *slur = make_spanner ("PhrasingSlur", events_[START]->self_scm ());
- Direction updown = to_dir (ev->get_property ("direction"));
- if (updown)
- set_grob_direction (slur, updown);
-
- slurs_.push_back (slur);
+ Stream_event *ev = start_events_[i];
+ string id = robust_scm2string (ev->get_property ("spanner-id"), "");
+ bool have_slur = false;
+ // Check if we already have a slur with the same spanner-id.
+ // In that case, don't create a new slur, but print a warning
+ for (vsize i = 0; i < slurs_.size (); i++)
+ have_slur = have_slur || (id == robust_scm2string (slurs_[i]->get_property ("spanner-id"), ""));
+
+ if (have_slur)
+ ev->origin ()->warning(_ ("already have phrasing slur"));
+ else
+ {
+ Grob *slur = make_spanner ("PhrasingSlur", ev->self_scm ());
+ Direction updown = to_dir (ev->get_property ("direction"));
+ slur->set_property ("spanner-id", ly_string2scm (id));
+ if (updown)
+ set_grob_direction (slur, updown);
+ slurs_.push_back (slur);
+ }
}
}
Phrasing_slur_engraver::stop_translation_timestep ()
{
end_slurs_.clear ();
- events_[START] = events_[STOP] = 0;
+ start_events_.clear ();
+ stop_events_.clear ();
}
ADD_ACKNOWLEDGER (Phrasing_slur_engraver, accidental);
*/
class Slur_engraver : public Engraver
{
- Drul_array<Stream_event *> events_;
- Stream_event *running_slur_start_;
+ vector<Stream_event *> start_events_;
+ vector<Stream_event *> stop_events_;
vector<Grob*> slurs_;
vector<Grob*> end_slurs_;
Slur_engraver::Slur_engraver ()
{
- events_[START] = events_[STOP] = 0;
}
IMPLEMENT_TRANSLATOR_LISTENER (Slur_engraver, slur);
{
Direction d = to_dir (ev->get_property ("span-direction"));
if (d == START)
- ASSIGN_EVENT_ONCE (events_[START], ev);
+ start_events_.push_back(ev);
else if (d == STOP)
- ASSIGN_EVENT_ONCE (events_[STOP], ev);
+ stop_events_.push_back(ev);
else ev->origin ()->warning (_f ("direction of %s invalid: %d",
"slur-event", int (d)));
}
acknowledge_extra_object (info);
}
-
void
Slur_engraver::acknowledge_script (Grob_info info)
{
void
Slur_engraver::finalize ()
{
- if (slurs_.size ())
+ for (vsize i = 0; i < slurs_.size (); i++)
{
- slurs_[0]->warning (_ ("unterminated slur"));
- for (vsize i = 0; i < slurs_.size (); i++)
- slurs_[i]->suicide ();
+ slurs_[i]->warning (_ ("unterminated slur"));
+ slurs_[i]->suicide ();
}
}
void
Slur_engraver::process_music ()
{
- if (events_[STOP])
+ for (vsize i = 0; i < stop_events_.size (); i++)
{
- if (slurs_.size () == 0)
- events_[STOP]->origin ()->warning (_ ("cannot end slur"));
-
-
- end_slurs_ = slurs_;
- slurs_.clear ();
+ Stream_event *ev = stop_events_[i];
+ string id = robust_scm2string (ev->get_property ("spanner-id"), "");
+
+ // Find the slur that is ended with this event (by checking the spanner-id)
+ bool ended = false;
+ for (vsize j = slurs_.size (); j--;)
+ {
+ if (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), ""))
+ {
+ ended = true;
+ end_slurs_.push_back (slurs_[j]);
+ slurs_.erase (slurs_.begin () + j);
+ }
+ }
+ if (!ended)
+ ev->origin ()->warning (_ ("cannot end slur"));
}
- if (events_[START] && slurs_.empty ())
+ for (vsize i = start_events_.size (); i--;)
{
- Stream_event *ev = events_[START];
-
- bool double_slurs = to_boolean (get_property ("doubleSlurs"));
-
- Grob *slur = make_spanner ("Slur", events_[START]->self_scm ());
- Direction updown = to_dir (ev->get_property ("direction"));
- if (updown && !double_slurs)
- set_grob_direction (slur, updown);
-
- slurs_.push_back (slur);
-
- if (double_slurs)
- {
- set_grob_direction (slur, DOWN);
- slur = make_spanner ("Slur", events_[START]->self_scm ());
- set_grob_direction (slur, UP);
- slurs_.push_back (slur);
- }
+ Stream_event *ev = start_events_[i];
+ string id = robust_scm2string (ev->get_property ("spanner-id"), "");
+ bool have_slur = false;
+ // Check if we already have a slur with the same spanner-id.
+ // In that case, don't create a new slur, but print a warning
+ for (vsize j = 0; j < slurs_.size (); j++)
+ have_slur = have_slur || (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), ""));
+
+ if (have_slur)
+ {
+ // We already have a slur, so give a warning and completely ignore
+ // the new slur.
+ ev->origin ()->warning(_ ("already have slur"));
+ start_events_.erase (start_events_.begin () + i);
+ }
+ else
+ {
+ Grob *slur = make_spanner ("Slur", ev->self_scm ());
+ Direction updown = to_dir (ev->get_property ("direction"));
+ slur->set_property ("spanner-id", ly_string2scm (id));
+ if (updown)
+ set_grob_direction (slur, updown);
+ slurs_.push_back (slur);
+
+ if (to_boolean (get_property ("doubleSlurs")))
+ {
+ set_grob_direction (slur, DOWN);
+ slur = make_spanner ("Slur", ev->self_scm ());
+ slur->set_property ("spanner-id", ly_string2scm (id));
+ set_grob_direction (slur, UP);
+ slurs_.push_back (slur);
+ }
+ }
}
set_melisma (slurs_.size ());
}
for (vsize i = 0; i < end_slurs_.size (); i++)
Slur::add_extra_encompass (end_slurs_[i], g);
- if (!events_[START])
+ if (!start_events_.size ())
for (vsize i = 0; i < slurs_.size (); i++)
Slur::add_extra_encompass (slurs_[i], g);
}
announce_end_grob (s, SCM_EOL);
}
end_slurs_.clear ();
- events_[START] = events_[STOP] = 0;
+ start_events_.clear ();
+ stop_events_.clear ();
}
ADD_ACKNOWLEDGER (Slur_engraver, accidental);
/* properties */
"normalized-endpoints "
"minimum-length "
+ "spanner-id "
"to-barline "
);
continue;
}
+ // We only want real notes to cause ties, not e.g. pitched trills
+ if (!left_ev->in_event_class ("note-event"))
+ continue;
SCM left_articulations = left_ev->get_property ("articulations");
Vaticana_ligature_engraver::Vaticana_ligature_engraver ()
{
- brew_ligature_primitive_proc =
+ brew_ligature_primitive_proc =
Vaticana_ligature::brew_ligature_primitive_proc;
augmented_primitives_.clear ();
}
}
ADD_ACKNOWLEDGER (Vaticana_ligature_engraver, rest);
-ADD_ACKNOWLEDGER (Vaticana_ligature_engraver, note_head);
+ADD_ACKNOWLEDGER (Vaticana_ligature_engraver, ligature_head);
ADD_TRANSLATOR (Vaticana_ligature_engraver,
/* doc */
"Handle ligatures by glueing special ligature heads"
\version "2.14.0"
+startGraceSlur = #(make-music 'SlurEvent 'span-direction START 'spanner-id "grace")
+stopGraceSlur = #(make-music 'SlurEvent 'span-direction STOP 'spanner-id "grace")
+
startGraceMusic = {
}
startAppoggiaturaMusic =
{
- s1*0(
+ s1*0\startGraceSlur
}
stopAppoggiaturaMusic = {
- s1*0)
+ s1*0\stopGraceSlur
}
startAcciaccaturaMusic = {
- s1*0(
+ s1*0\startGraceSlur
\override Stem #'stroke-style = #"grace"
}
stopAcciaccaturaMusic = {
\revert Stem #'stroke-style
- s1*0)
+ s1*0\stopGraceSlur
}
$(call src-wildcard,feta-braces-[a-z].mf) \
$(call src-wildcard,feta-alphabet*[0-9].mf) \
$(call src-wildcard,feta-notehead*[0-9].mf) \
+ $(call src-wildcard,feta-flags*[0-9].mf) \
$(call src-wildcard,parmesan[0-9]*.mf)
STAFF_SIZES = 11 13 14 16 18 20 23 26
$(outdir)/emmentaler-%.woff: $(outdir)/emmentaler-%.pe \
$(outdir)/feta%.pfb \
$(outdir)/feta-noteheads%.pfb \
+ $(outdir)/feta-flags%.pfb \
$(outdir)/feta-alphabet%.pfb \
$(outdir)/parmesan%.pfb \
$(outdir)/feta%.otf-table \
$(outdir)/%.otf-table: $(outdir)/%.lisp
cat $< $(if $(findstring brace,$<),,$(subst feta,parmesan,$<)) \
$(if $(findstring brace,$<),,$(subst feta,feta-noteheads,$<)) \
+ $(if $(findstring brace,$<),,$(subst feta,feta-flags,$<)) \
$(if $(findstring brace,$<),,$(subst feta,feta-alphabet,$<)) > $@
## ugh -- we want this to prevent failing -j2 compiles.
$(outdir)/feta26.otf-table: $(outdir)/feta26.lisp \
$(outdir)/feta-noteheads26.lisp \
+ $(outdir)/feta-flags26.lisp \
$(outdir)/parmesan26.lisp \
$(outdir)/feta-alphabet26.lisp
$(outdir)/feta23.otf-table: $(outdir)/feta23.lisp \
$(outdir)/feta-noteheads23.lisp \
+ $(outdir)/feta-flags23.lisp \
$(outdir)/parmesan23.lisp \
$(outdir)/feta-alphabet23.lisp
$(outdir)/feta20.otf-table: $(outdir)/feta20.lisp \
$(outdir)/feta-noteheads20.lisp \
+ $(outdir)/feta-flags20.lisp \
$(outdir)/parmesan20.lisp \
$(outdir)/feta-alphabet20.lisp
$(outdir)/feta18.otf-table: $(outdir)/feta18.lisp \
$(outdir)/feta-noteheads18.lisp \
+ $(outdir)/feta-flags18.lisp \
$(outdir)/parmesan18.lisp \
$(outdir)/feta-alphabet18.lisp
$(outdir)/feta16.otf-table: $(outdir)/feta16.lisp \
$(outdir)/feta-noteheads16.lisp \
+ $(outdir)/feta-flags16.lisp \
$(outdir)/parmesan16.lisp \
$(outdir)/feta-alphabet16.lisp
$(outdir)/feta14.otf-table: $(outdir)/feta14.lisp \
$(outdir)/feta-noteheads14.lisp \
+ $(outdir)/feta-flags14.lisp \
$(outdir)/parmesan14.lisp \
$(outdir)/feta-alphabet14.lisp
$(outdir)/feta13.otf-table: $(outdir)/feta13.lisp \
$(outdir)/feta-noteheads13.lisp \
+ $(outdir)/feta-flags13.lisp \
$(outdir)/parmesan13.lisp \
$(outdir)/feta-alphabet13.lisp
$(outdir)/feta11.otf-table: $(outdir)/feta11.lisp \
$(outdir)/feta-noteheads11.lisp \
+ $(outdir)/feta-flags11.lisp \
$(outdir)/parmesan11.lisp \
$(outdir)/feta-alphabet11.lisp
+++ /dev/null
-#!@FONTFORGE@
-
-
-
-New();
-
-# Separate Feta versioning?
-# Naming: * expose LilyPond20/LilyPond rather than bigcheese
-# * using 20 as Weight works for gnome-font-select widget: gfs
-SetFontNames("bigcheese20", "LilyPond", "LilyPond BigCheese 20", "20", "GNU GPL", "@TOPLEVEL_VERSION@");
-
-MergeFonts("feta20.pfa");
-MergeFonts("feta-noteheads20.pfa");
-MergeFonts("parmesan20.pfa");
-
-# load nummer/din after setting PUA.
-i = 0;
-while (i < CharCnt())
- Select(i);
-# crashes fontforge, use PUA for now -- jcn
-# SetUnicodeValue(i + 0xF0000, 0);
-/*
-PRIVATE AREA
- In the BMP, the range 0xe000 to 0xf8ff will never be assigned to any
- characters by the standard and is reserved for private usage. For the
- Linux community, this private area has been subdivided further into the
- range 0xe000 to 0xefff which can be used individually by any end-user
- and the Linux zone in the range 0xf000 to 0xf8ff where extensions are
- coordinated among all Linux users. The registry of the characters
- assigned to the Linux zone is currently maintained by H. Peter Anvin
- <Peter.Anvin@linux.org>.
-*/
- SetUnicodeValue(i + 0xE000, 0);
- ++i;
-endloop
-
-
-MergeFonts("feta-nummer10.pfa");
-MergeFonts("feta-din14.pfa");
-MergeKern("feta-din14.tfm");
-
-LoadTableFromFile("LILC", "feta20.otf-table")
-
-Generate("bigcheese20.otf");
-Generate("bigcheese20.cff");
--- /dev/null
+% Feta (not the Font-En-Tja) music font -- generic stuff: include lots of files, but don't
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1997--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+%
+% LilyPond is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% LilyPond is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
+
+
+if test = -1:
+ mode := smoke;
+fi
+
+staffsize# := design_size * pt#;
+
+mode_setup;
+
+input feta-macros;
+
+input feta-params;
+
+font_x_height staff_space#;
+
+fet_beginfont ("feta", design_size, "fetaMusic");
+
+input feta-flags;
+
+autometric_parameter ("staffsize", staffsize#);
+autometric_parameter ("stafflinethickness", stafflinethickness#);
+autometric_parameter ("staff_space", staff_space#);
+autometric_parameter ("linethickness", linethickness#);
+autometric_parameter ("black_notehead_width", black_notehead_width#);
+autometric_parameter ("ledgerlinethickness", ledgerlinethickness#);
+autometric_parameter ("blot_diameter", blot_diameter#);
+
+fet_endfont;
enddef;
-fet_beginchar ("8th Flag (up)", "u3");
+
+
+def upstemsingleflag (expr shortening) =
save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
save flagspace, total_depth, flag_count;
flag_count = 1;
- total_depth# = 3 staff_space# - blot_diameter# / 2;
+ total_depth# = (3 - shortening) * staff_space# - blot_diameter# / 2;
flare = staff_space;
flagspace# = staff_space#;
hip_depth_ratio = .72;
draw_square_block ((-0.5 stemthickness_rounded, 0),
(0, (-flag_count * staff_space_rounded)));
-fet_endchar;
+enddef;
-fet_beginchar ("16th Flag (up)", "u4");
+def upstemdoubleflag (expr shortening) =
save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
save flagspace, total_depth, flag_count;
flag_count = 2;
- total_depth# = 3.5 staff_space# - blot_diameter# / 2;
+ total_depth# = (3.5 - shortening) * staff_space# - blot_diameter# / 2;
flare = .85 staff_space;
flagspace# = .85 staff_space#;
hip_depth_ratio = .72;
draw_square_block ((-0.5 stemthickness_rounded, 0),
(0, (-flag_count * staff_space_rounded)));
-fet_endchar;
+enddef;
-fet_beginchar ("32nd Flag (up)", "u5");
+def upstemtripleflag (expr shortening) =
save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
save flagspace, total_depth, flag_count;
flag_count = 3;
- total_depth# = 4.25 staff_space# - blot_diameter# / 2;
+ total_depth# = (4.25 - shortening) * staff_space# - blot_diameter# / 2;
flare = .85 staff_space;
flagspace# = .87 staff_space#;
hip_depth_ratio = .72;
draw_square_block ((-0.5 stemthickness_rounded, 0),
(0, (-flag_count * staff_space_rounded)));
-fet_endchar;
+enddef;
-fet_beginchar ("64th Flag (up)", "u6");
+def upstemquadrupleflag (expr shortening) =
save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
save flagspace, total_depth, flag_count;
flag_count = 4;
- total_depth# = 5.25 staff_space# - blot_diameter# / 2;
+ total_depth# = (5.25 - shortening) * staff_space# - blot_diameter# / 2;
flare = .85 staff_space;
flagspace# = .9 staff_space#;
hip_depth_ratio = .72;
draw_square_block ((-0.5 stemthickness_rounded, 0),
(0, (-flag_count * staff_space_rounded)));
-fet_endchar;
+enddef;
-fet_beginchar ("128th Flag (up)", "u7");
+def upstemquintupleflag (expr shortening) =
save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
save flagspace, total_depth, flag_count;
flag_count = 5;
- total_depth# = 6.25 staff_space# - blot_diameter# / 2;
+ total_depth# = (6.25 - shortening) * staff_space# - blot_diameter# / 2;
flare = .85 staff_space;
flagspace# = .93 staff_space#;
hip_depth_ratio = .72;
draw_square_block ((-0.5 stemthickness_rounded, 0),
(0, (-flag_count * staff_space_rounded)));
-fet_endchar;
+enddef;
+
-fet_beginchar ("8th (down)", "d3");
+
+def downstemsingleflag (expr shortening) =
save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
save flagspace, total_depth, flag_count;
flag_count = 1;
- total_depth# = 2.75 staff_space#;
+ total_depth# = (2.75 - shortening) * staff_space#;
flare = staff_space;
flagspace# = .9 staff_space#;
hip_depth_ratio = .74;
(0, (-flag_count * staff_space_rounded)));
y_mirror_char;
-fet_endchar;
+enddef;
-fet_beginchar ("16th (down)", "d4");
+def downstemdoubleflag (expr shortening) =
save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
save flagspace, total_depth, flag_count;
flag_count = 2;
- total_depth# = 3.0 staff_space# - blot_diameter# / 2;
+ total_depth# = (3.0 - shortening) * staff_space# - blot_diameter# / 2;
flare = .82 staff_space;
flagspace# = .9 staff_space#;
hip_depth_ratio = .85;
(0, (-flag_count * staff_space_rounded)));
y_mirror_char;
-fet_endchar;
+enddef;
-fet_beginchar ("32nd (down)", "d5");
+def downstemtripleflag (expr shortening) =
save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
save flagspace, total_depth, flag_count;
flag_count = 3;
- total_depth# = 3.75 * staff_space# - blot_diameter# / 2;
+ total_depth# = (3.75 - shortening) * staff_space# - blot_diameter# / 2;
flare = .82 staff_space;
flagspace# = .88 staff_space#;
hip_depth_ratio = .87;
(0, (-flag_count * staff_space_rounded)));
y_mirror_char;
-fet_endchar;
+enddef;
-fet_beginchar ("64th (down)", "d6");
+def downstemquadrupleflag (expr shortening) =
save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
save flagspace, total_depth, flag_count;
flag_count = 4;
- total_depth# = 4.5 staff_space# - blot_diameter# / 2;
+ total_depth# = (4.5 - shortening) * staff_space# - blot_diameter# / 2;
flare = .8 staff_space;
flagspace# = .9 staff_space#;
hip_depth_ratio = .83;
(0, (-flag_count * staff_space_rounded)));
y_mirror_char;
-fet_endchar;
+enddef;
-fet_beginchar ("128th (down)", "d7");
+def downstemquintupleflag (expr shortening) =
save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
save flagspace, total_depth, flag_count;
flag_count = 5;
- total_depth# = 5.5 staff_space# - blot_diameter# / 2;
+ total_depth# = (5.5 - shortening) * staff_space# - blot_diameter# / 2;
flare = .8 staff_space;
flagspace# = .92 staff_space#;
hip_depth_ratio = .85;
(0, (-flag_count * staff_space_rounded)));
y_mirror_char;
+enddef;
+
+
+
+
+fet_beginchar ("8th Flag (up)", "u3");
+ upstemsingleflag (0.0);
fet_endchar;
+fet_beginchar ("16th Flag (up)", "u4");
+ upstemdoubleflag (0);
+fet_endchar;
+
+
+fet_beginchar ("32nd Flag (up)", "u5");
+ upstemtripleflag (0);
+fet_endchar;
+
+
+fet_beginchar ("64th Flag (up)", "u6");
+ upstemquadrupleflag (0);
+fet_endchar;
+
+
+fet_beginchar ("128th Flag (up)", "u7");
+ upstemquintupleflag (0);
+fet_endchar;
+
+
+
+
+
+fet_beginchar ("8th Flag (down)", "d3");
+ downstemsingleflag (0.0);
+fet_endchar;
+
+
+fet_beginchar ("16th Flag (down) 3", "d4");
+ downstemdoubleflag (0);
+fet_endchar;
+
+
+fet_beginchar ("32nd Flag (down)", "d5");
+ downstemtripleflag (0);
+fet_endchar;
+
+
+fet_beginchar ("64th Flag (down)", "d6");
+ downstemquadrupleflag (0);
+fet_endchar;
+
+
+fet_beginchar ("128th Flag (down)", "d7");
+ downstemquintupleflag (0);
+fet_endchar;
+
+
+
+
%%%%%%%%
%
% Single Stroke for Short Appogiatura
--- /dev/null
+% feta-flags11.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 11.22;
+test := 0;
+
+
+input feta-flags-generic;
+
+end.
+
--- /dev/null
+% feta-flags13.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 12.60;
+test := 0;
+
+
+input feta-flags-generic;
+
+end.
+
--- /dev/null
+% feta-flags14.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 14.14;
+test := 0;
+
+
+input feta-flags-generic;
+
+end.
+
--- /dev/null
+% feta-flags16.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 15.87;
+test := 0;
+
+
+input feta-flags-generic;
+
+end.
+
--- /dev/null
+% feta-flags18.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 17.82;
+test := 0;
+
+
+input feta-flags-generic;
+
+end.
+
--- /dev/null
+% feta-flags20.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 20;
+test := 0;
+
+
+input feta-flags-generic;
+
+end.
+
--- /dev/null
+% feta-flags23.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 22.45;
+test := 0;
+
+
+input feta-flags-generic;
+
+end.
+
--- /dev/null
+% feta-flags26.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 25.20;
+test := 0;
+
+
+input feta-flags-generic;
+
+end.
+
font_x_height staff_space#;
-%% this is a fallback so we can run the font without including feta-noteheads.
-black_notehead_width# := 1.0 staff_space#;
-
-
fet_beginfont ("feta", design_size, "fetaMusic");
if test = 0:
font_x_height staff_space#;
-%% this is a fallback so we can run the font without
-%% including feta-noteheads.
-black_notehead_width# := 1.0 staff_space#;
-
-
fet_beginfont ("feta", design_size, "fetaMusic");
-if test = 0:
- input feta-noteheads;
- input feta-flags;
-else:
- input feta-noteheads-test-generic.mf;
-fi
+input feta-noteheads;
autometric_parameter ("staffsize", staffsize#);
autometric_parameter ("stafflinethickness", stafflinethickness#);
+++ /dev/null
-%
-% test stuff.
-% in a separate file to avoid tainting non-test font files for testing.
-%
-
-input feta-noteheads;
-%input feta-flags;
% NOTE HEAD VARIABLES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-save black_notehead_width, noteheight;
-save half_notehead_width, whole_notehead_width, slash_thick;
-save slash_slope, overdone_heads, solfa_noteheight;
+save half_notehead_width, whole_notehead_width;
+save solfa_noteheight;
-numeric noteheight;
-numeric slash_thick;
-numeric black_notehead_width;
numeric whole_notehead_width;
numeric half_notehead_width;
-
fet_begingroup ("noteheads");
-% Slope of slash. From scm/grob-description.scm. How to auto-copy?
-slash_slope := 1.7;
-
-% Thickness of slash lines. Quarter notes get 1.5slt width.
-slash_thick# := 2/3 * 0.48 staff_space#;
-
-
-%
-% Hand-engraved music often has balls extending above and below
-% the lines. If you like that, modify overdone heads (unit:
-% stafflinethickness).
-%
-overdone_heads = 0.0;
-noteheight# := staff_space# + (1 + overdone_heads) * stafflinethickness#;
-
-
%
% solfa heads should not overlap on chords.
%
solfa_noteheight# := staff_space# - stafflinethickness#;
-define_pixels (slash_thick);
-define_whole_vertical_pixels (noteheight);
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% SLANT moves both extrema on the long axis (by SLANT * ELLIPTICITY,
-% so SLANT = -1, puts the extreme on the long axis next to the short
-% axis one).
-%
-
-def draw_outside_ellipse (expr ellipticity, tilt, superness, slant) =
- save attachment_y;
- save pat;
- path pat;
-
- pat := superellipse ((ellipticity, 0), (-slant * ellipticity, 1.0),
- (-ellipticity, 0), (slant * ellipticity, -1.0),
- superness);
- pat := pat rotated tilt;
-
- save top_point, right_point;
- pair top_point, right_point;
-
- top_point := directionpoint left of pat;
- right_point := directionpoint up of pat;
-
- save scaling, width;
-
- scaling# = noteheight# / (2 ypart (top_point));
- width# := 2 xpart (right_point) * scaling#;
- define_pixels (scaling, width);
-
- set_char_box (0, width#, noteheight# / 2, noteheight# / 2);
-
- d := d - feta_space_shift;
-
- % attachment Y
- charwy := ypart (right_point) * scaling#;
- charwx := width#;
-
- pat := pat scaled scaling shifted (w / 2, .5 (h - d));
-
- width := hround width;
-
- if test_outlines = 1:
- draw pat;
- else:
- fill pat;
- fi;
-enddef;
-
-
def undraw_inside_ellipse (expr ellipticity, tilt, superness, clearance) =
begingroup
save pat;
fet_beginchar ("Quarter notehead", "s2");
- % used to have 32. With 31, they are slightly bolder.
- draw_outside_ellipse (1.49 - puff_up_factor / 3.0, 31, 0.707, 0);
- black_notehead_width# := charwd;
-
+ draw_quarter_path;
draw_staff (-2, 2, 0);
fet_endchar;
fi;
feta_fillpen := savepen;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Notehead width and height are defined here.
+%
+%
+% Slope of slash. From scm/grob-description.scm. How to auto-copy?
+slash_slope := 1.7;
+
+% Thickness of slash lines. Quarter notes get 1.5slt width.
+slash_thick# := 2/3 * 0.48 staff_space#;
+
+%
+% Hand-engraved music often has balls extending above and below
+% the lines. If you like that, modify overdone heads (unit:
+% stafflinethickness).
+%
+overdone_heads = 0.0;
+noteheight# := staff_space# + (1 + overdone_heads) * stafflinethickness#;
+
+define_pixels (slash_thick);
+define_whole_vertical_pixels (noteheight);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This is used to draw all elliptical notes; it also sets
+% black_notehead_width, so it should be called in any file that
+% needs the value of black_notehead_width.
+%
+% SLANT moves both extrema on the long axis (by SLANT * ELLIPTICITY,
+% so SLANT = -1, puts the extreme on the long axis next to the short
+% axis one).
+%
+
+def draw_outside_ellipse (expr ellipticity, tilt, superness, slant) =
+ save attachment_y;
+ save pat;
+ path pat;
+
+ pat := superellipse ((ellipticity, 0), (-slant * ellipticity, 1.0),
+ (-ellipticity, 0), (slant * ellipticity, -1.0),
+ superness);
+ pat := pat rotated tilt;
+
+ save top_point, right_point;
+ pair top_point, right_point;
+
+ top_point := directionpoint left of pat;
+ right_point := directionpoint up of pat;
+
+ save scaling, width;
+
+ scaling# := noteheight# / (2 ypart (top_point));
+ width# := 2 xpart (right_point) * scaling#;
+ define_pixels (scaling, width);
+ set_char_box (0, width#, noteheight# / 2, noteheight# / 2);
+
+ d := d - feta_space_shift;
+
+ % attachment Y
+ charwy := ypart (right_point) * scaling#;
+ charwx := width#;
+
+ pat := pat scaled scaling shifted (w / 2, .5 (h - d));
+
+ width := hround width;
+
+ if test_outlines = 1:
+ draw pat;
+ else:
+ fill pat;
+ fi;
+enddef;
+
+
+def draw_quarter_path =
+ draw_outside_ellipse (1.49 - puff_up_factor / 3.0, 31, 0.707, 0);
+enddef;
+
+test_outlines := 0;
+draw_quarter_path;
+black_notehead_width# := charwd;
+
+define_pixels (slash_thick);
+define_whole_vertical_pixels (noteheight);
+
+
fet_beginchar ("Arpeggio", "arpeggio");
+ begingroup;
save height, overshoot, width;
- height# = staff_space#;
- width# = 0.8 height#;
- overshoot# = 0.25 staff_space#;
+ height# := staff_space#;
+ width# := 0.8 * height#;
+ overshoot# := 0.25 * staff_space#;
define_pixels (height, overshoot, width);
-
set_char_box (0, width#, 0, height#);
draw_arpeggio;
penlabels (range 1 thru 9);
draw_staff (-2, 2, 0.0);
+ endgroup;
fet_endchar;
%
fet_beginchar ("Trill_element", "trill_element");
- save height, overshoot;
+ begingroup;
+ save height, overshoot, width;
height# = staff_space#;
width# = 0.8 height#;
overshoot# = 0.25 staff_space#;
currentpicture := currentpicture shifted -(width / 2, height / 2);
currentpicture := currentpicture rotated 90;
currentpicture := currentpicture shifted (height / 2, width / 2);
+ endgroup;
fet_endchar;
%
% TODO: should depth/height include appendages/stems?
+save overdone_heads, noteheight;
+
overdone_heads = 0;
noteheight# := staff_space# + (1 + overdone_heads) * stafflinethickness#;
define_pixels (noteheight);
"A key cancellation."
'())
+(ly:add-interface
+ 'ligature-head-interface
+ "A note head that can become part of a ligature."
+ '())
+
(ly:add-interface
'ligature-bracket-interface
"A bracket indicating a ligature in the original edition."
@example
\\override MultiMeasureRest #'spacing-pair = #'(staff-bar . staff-bar)
@end example")
+ (spanner-id ,string? "An identifier to distinguish concurrent spanners.")
(springs-and-rods ,boolean? "Dummy variable for triggering
spacing routines.")
(stacking-dir ,ly:dir? "Stack objects in which direction?")
(interfaces . (font-interface
gregorian-ligature-interface
ledgered-interface
+ ligature-head-interface
mensural-ligature-interface
note-head-interface
rhythmic-grob-interface
(height-limit . 2.0)
(minimum-length . 1.5)
(ratio . 0.333)
+ (spanner-id . "")
(springs-and-rods . ,ly:spanner::set-spacing-rods)
(stencil . ,ly:slur::print)
(thickness . 1.1)
(line-thickness . 0.8)
(minimum-length . 1.5)
(ratio . 0.25)
+ (spanner-id . "")
(springs-and-rods . ,ly:spanner::set-spacing-rods)
(stencil . ,ly:slur::print)
(thickness . 1.2)
;;;
(define (scheme-expr->lily-string scm-arg)
(cond ((or (number? scm-arg)
- (string? scm-arg))
+ (string? scm-arg)
+ (boolean? scm-arg))
(format #f "~s" scm-arg))
((or (symbol? scm-arg)
(list? scm-arg))
;; as a note_chord_element to prevent spurious output, e.g.,
;; \displayLilyMusic < c-1\4 >8 -> c-1\48
(null? (filter post-event?
- (ly:music-property (car simple-elements) 'articulations))))
+ (ly:music-property (car simple-elements) 'articulations)))
+ ;; same for simple_element with \tweak
+ (null? (ly:music-property (car simple-elements) 'tweaks)))
;; simple_element : note | figure | rest | mmrest | lyric_element | skip
(let* ((simple-element (car simple-elements))
(duration (ly:music-property simple-element 'duration))
Options are @code{'text} and @code{'hairpin}.")
(span-text ,markup? "The displayed text for dynamic text spanners
(e.g., cresc.)")
+ (spanner-id ,string? "Identifier to distinguish concurrent spanners.")
(split-list ,list? "Splitting moments for part combiner.")
(start-callback ,procedure? "Function to compute the negative length
of starting grace notes. This property can only be defined as initializer
. ((description . "Start or end phrasing slur.
Syntax: @var{note}@code{\\(} and @var{note}@code{\\)}")
+ (spanner-id . "")
(types . (general-music span-event event phrasing-slur-event))
))
. ((description . "Start or end slur.
Syntax: @var{note}@code{(} and @var{note}@code{)}")
+ (spanner-id . "")
(types . (general-music span-event event slur-event))
))
(format #f "~a\\tag #'~a" (if post-event? "-" "") tag))
(ly:music-property expr 'tags))))
+(define* (tweaks->lily-string expr #:optional (post-event? #f))
+ (format #f "~{~a ~}"
+ (map (lambda (tweak)
+ (format #f "~a\\tweak #'~a #~a"
+ (if post-event? "-" "")
+ (car tweak)
+ (scheme-expr->lily-string (cdr tweak))))
+ (ly:music-property expr 'tweaks))))
+
(define-public (music->lily-string expr parser)
"Print @var{expr}, a music expression, in LilyPond syntax."
(if (ly:music? expr)
(proc expr parser))
procs))))
(if result-string
- (format #f "~a~a"
- (tag->lily-string expr (post-event? expr))
+ (format #f "~a~a~a"
+ (tag->lily-string expr (post-event? expr))
+ (tweaks->lily-string expr (post-event? expr))
result-string)
(format #f "%{ Print method not implemented for music type ~a %}"
music-type)))
;; This works for single-note and multi-note tremolos!
(let* ((children (if (music-is-of-type? main 'sequential-music)
;; \repeat tremolo n { ... }
- (length (ly:music-property main 'elements))
+ (length (extract-named-music main 'EventChord))
;; \repeat tremolo n c4
1))
;; # of dots is equal to the 1 in bitwise representation (minus 1)!
(define (calc-repeat-slash-count music)
"Given the child-list @var{music} in @code{PercentRepeatMusic},
calculate the number of slashes based on the durations. Returns @code{0}
-if durations in in @var{music} vary, allowing slash beats and double-percent
+if durations in @var{music} vary, allowing slash beats and double-percent
beats to be distinguished."
(let* ((durs (map (lambda (elt)
(duration-of-note elt))
MergeFonts("feta%(design_size)d.pfb");
MergeFonts("feta-noteheads%(design_size)d.pfb");
+MergeFonts("feta-flags%(design_size)d.pfb");
MergeFonts("parmesan%(design_size)d.pfb");
# load nummer/din after setting PUA.
enc_name = 'ParmesanEncoding'
elif re.search ('feta-noteheads', filenm):
enc_name = 'FetaNoteheadsEncoding'
+ elif re.search ('feta-flags', filenm):
+ enc_name = 'FetaFlagsEncoding'
elif re.search ('feta-brace', filenm):
enc_name = 'FetaBraceEncoding'
elif re.search ('feta-alphabet', filenm):