lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Vaticana ligatures / spacing / other...


From: Juergen Reuter
Subject: Re: Vaticana ligatures / spacing / other...
Date: Thu, 17 Nov 2005 04:20:14 +0100 (CET)

On Thu, 17 Nov 2005, Han-Wen Nienhuys wrote:

...
Ligature spacing: as has been mentioned before, coherent ligatures (at
least of the vaticana variety) should act like a single un-breakable
paper column, but should not receive extra spacing based on the number
of notes within the ligature.  I am interested in getting this
working.  I can start with the TODO notes in
coherent-ligature-engraver.cc.

You should create a new ligature engraver. It should acknowledge all the relevant notes/neume item grobs. The engraver creates an Item at the start of the ligature. The Item is an X axis-group, and all neumes/notes are added to the Item as children. The item determines the positioning of its X-children (see eg. Dot_column::calc_positioning_done). In a first version, it can put the children in a row.


I tried a similar approach long time ago around 1.9.x, but I failed, since I would have needed to duplicate much code around the note head engraver (e.g. handling of articulation scripts, ...). However, lily has changed a lot since then; hence, it may be worth trying again.

For engravers, code reuse through shared super classes has always had bad results. So, derive the engraver directly from the Engraver class.


Well, the original idea was to have not only a vaticana engraver, but also a medicea engraver, a gothic neumes (hufnagel) engraver, maybe even an adiastematic neumes engraver, etc. In that case, the amount of code reuse would have been rather tremendously.

Please notice the idea of stacked abstraction layers. Gregorian chant notation exists in a plethora of notational styles. If you write down the same piece once in Vaticana style and once in gothic neumes, the non-professional reader possibly would not even recognize that it is the same piece of music. However, the syntax was designed to be the same for all common notational styles, such that you e.g. can switch between them by just adding/removing a proper engraver to/from the voice context (though this has not been proven so far since the gothic neumes engraver has not yet been implemented). This goal is achieved by internally breaking down complex neumes into primitive ones, e.g. porrectus into flexa+pes, or epiphonus into pes+deminutum. The intention is to share this approach between all Gregorian chant notation flavours. The shared super classes reflect this intention of hierarchical abstraction.

Btw. (off-topic), I also intended to implement the Gregorian square neumes ligatures table (cp. lily v2.7.16 manual Sect. 7.7.10.2) slilghtly generalized as scheme functions, such that you e.g. can say "\porrectus { a b c }" which will translate to "\[ a \flexa g \pes b \]". A "\ligature" command that internally produces "\[" and "\]" is already defined in ly/gregorian-init.ly.

I think this is the major task that you should focus on. The rest of your items are comparatively simple.

What about the spacing *between* ligature items? Even with packed and raggedright options, lily's spacing engine heavily depends on note durations, while neumes per se do not have any fixed duration.

Michael Welsh Duggan wrote:

...
Breaking: when typesetting chant notation, we should be allowed to
break after any note or ligature,

This should already work (assuming it's not currently broken): "get_score_engraver ()->forbid_breaks ()" in Ligature_engraver::process_music () forbids breaks within ligatures (although Coherent_ligature_engraver may be a more apropriate place for it); and "Score.timing = ##f" and "Score.barAlways = ##t" allows breaks anywhere else.

but with preference on the breath
marks. (Actually, ideal would be to try to only break on word
boundaries, but there's no simple representation for that right now.
Something to think about later, I guess...)


This requires far more work, afaics. Btw., interaction between lyrics and breath marks is also required for correct aligning of directive signs like versus, responsio, etc. Maybe the stanza number engraver can be generalized to handle such things; conceptually, stanza numbers are strongly related.

Ligature melismata: the ligature should act as automatic melismata for
purposes of setting text.


In general, this is difficult to accomplish: usually, there may be at most one syllable per ligature; however, there may be multiple ligatures per syllable. Hence, you would still have to tell which ligatures belong to a single syllable.

Punctum-mora stacking: Punctum-mora (dots) should stack nicely.


Right. This task is similar to the accidental engraving: you have to collect all dots and put them behind the ligature aligned in a column. For mensural music, however, you often find the dots printed above the ligature. So, in general, you should be able to easily switch between these two modes plus the conventional mode of dot engraving.

Accidental engraving: Should act as mentioned in the TODO in
coherent-ligature-engraver.cc.

I tried to write an according patch two months ago, but unfortunately I failed. I guess the main problem is that my code can deliver the accidentals in a bunch only after the ligature has finished, while lily seems to require the accidentals to be announced much earlier. I also had to duplicate some amount of private data structures and code of the accidentals related engravers...

Greetings,
Juergen




reply via email to

[Prev in Thread] Current Thread [Next in Thread]