back to list

Microtonal Helmholtz-Ellis notation in Lilypond: fine-tuning

🔗Torsten Anders <torsten.anders@...>

9/7/2009 4:29:59 AM
Attachments
Lily-HE-accidentals.pdf

Dear Lilyponders,

Finally, I got some microtonal notation working in Lilypond that uses a special font for the accidentals (i.e. not the usual Feta font), please see the attached example PDF file. The full Lilypond code is included at the end of this mail. This example shows a harmonic seventh chord over C (first as an "arpeggio" and then all notes together) using the "Extended Helmholtz-Ellis JI Pitch Notation" (HE for short) by Marc Sabat and Wolfgang von Schweinitz. Besides non-Feta accidentals, the example also uses accidentals that consist of multiple signs where additional signs show comma inflections (e.g., the septimal comma before the B-flat in the example, the harmonic 7th over C). The required font and further information about this notation is available at

http://music.calarts.edu/~msabat/ms/pdfs/HE-font-2009.zip.

I implemented this microtonal notation by changing the notation of accidentals to markups, following an idea by Graham Breed. Doing so did not only allow for selecting a different font, but also for accidentals that consist of more than a single sign. Changing accidentals for individual notes in a chord was particularly tricky, and I used an idea by Mark Polesky for this.

Anyway, although this this approach to microtonal notation is already usable, it could use some improvements. I would be grateful for suggestions.

The main problem is the horizontal spacing. Spacing with single-sign accidentals works fine, Lilypond takes care of that automatically. However, Lilypond does not know about multiple-sign accidentals, so I somehow have to create more horizontal space for these manually. The Lily manual (http://lilypond.org/doc/v2.12/Documentation/user/lilypond/Horizontal-spacing-overview#Horizontal-spacing-overview) suggests as a trick to use the following code, however I could not get this approach working. What am I missing?

\once \override Score.SeparationItem #'padding = #1

Instead, I globally increased the horizontal spacing (http://lilypond.org/doc/v2.12/Documentation/user/lilypond/Changing-horizontal-spacing#Changing-horizontal-spacing).

Any further idea to insert some additional horizonal space before a note in order to fit in complex accidentals? Spacing of multiple-sign accidentals in a chord is even more tricky...

The second issue is the readability of the Lilypond code. I defined the music function \accidental that expects a markup and sets the accidental of next note to that markup. I also started defining readable accidental names that are mapped to the respective markup. For example, the following two notes are first an untransposed C and then an E a just major third above it: with respect to the Phythagorean E it is transposed down by a syntonic comma (see the second note in the attached example).

c
\accidental \naturalSyntonicDown
e

However, I failed to do the same for chord tones. I need to define a music function that creates the following code, but the markup should be given as an argument, as above.

\tweak #'before-line-breaking #(accidental-text (markup #:sans "m"))

The problem might be that I do not know how to automatically translate a Lily-syntax markup (e.g., \markup{\sans "m"}) into the Scheme-syntax markup required here.

Of course, I also cordially welcome any other ideas for improving this approach to microtonal notation.

Thank you!

Best
Torsten

--
Torsten Anders
Interdisciplinary Centre for Computer Music Research
University of Plymouth
Office: +44-1752-586219
Private: +44-1752-558917
http://strasheela.sourceforge.net
http://www.torsten-anders.de

-----------------------------------------------
%% Lily code (first various defs and then the score at the end)

\version "2.12.00"

%% Font "HE" must be installed (e.g., on MacOS in /Library/Fonts)
%% Font HE put in as 2nd font: can be accessed as \sans
\paper{
#(define fonts (make-pango-font-tree "Century Schoolbook L"
"HE"
"Bitstream Vera Sans Mono"
1))
}

\layout {
\context
{ \Score
%% more space between all notes (to allow for extra accidentals)
% \override SpacingSpanner #'base-shortest-duration = #(ly:make-moment 1 32)
\override SpacingSpanner #'base-shortest-duration = #(ly:make-moment 1 16)
%% all accidentals are written as markups
\override Accidental #'stencil = #ly:text-interface::print
%% default is natural accidental -- causes error...
\override Accidental #'text = #(markup #:sans "n")
}
}

#(define (modify-accidental note-grob prop-alist)
;; notehead before-line-breaking callback
(let ((accidental (ly:grob-object note-grob 'accidental-grob)))
(if (not (null? accidental))
(for-each
(lambda (x)
(ly:grob-set-property! accidental (car x) (cdr x)))
prop-alist))))
#(define (accidental-text markup)
(lambda (grob)
(modify-accidental grob `((text . ,markup)))))

%% expects a markup and sets accidental of next note to that markup
accidental =
#(define-music-function (parser location markup) (markup?)
#{
\once \override Accidental #'text = #$markup
#})

% %% !! Buggy
% %% expects a markup and sets accidental of next chord note to that markup
% chordAccidental =
% #(define-music-function (parser location markup) (markup?)
% #{
% \tweak #'before-line-breaking #(accidental-text #$markup)
% #})

%%
%% Selection of accidentals to markups mappings, see HE-font-map.pdf provided with font
%%
sharp = \markup{\sans "v"}
natural = \markup{\sans "n"}
flat = \markup{\sans "e"}

sharpSyntonicUp = \markup{\sans "w"}
naturalSyntonicUp = \markup{\sans "o"}
flatSyntonicUp = \markup{\sans "f"}
sharpSyntonicDown = \markup{\sans "u"}
naturalSyntonicDown = \markup{\sans "m"}
flatSyntonicDown = \markup{\sans "d"}

%% etc

%%
%% The score
%%

{

%% there is an accidental for every note
#(set-accidental-style 'dodecaphonic)

c'
\accidental \naturalSyntonicDown
e'
g'
\accidental \markup{\halign #0 \sans "<e"}
b'

%% \override does not work for chords nor for accidentals, but here is a way:
%% see http://www.mail-archive.com/lilypond-devel@.../msg22555.html
%%
%% TODO: def Scheme function that only expects markup and returns lambda-expression
<
c'!
\tweak #'before-line-breaking #(accidental-text (markup #:sans "m"))
e'!
g'!
\tweak #'before-line-breaking #(accidental-text (markup #:halign 0 #:sans "<e"))
b'!>2

}


🔗Torsten Anders <torsten.anders@...>

9/7/2009 4:40:50 AM

On Sep 7, 2009, at 12:29 PM, Torsten Anders wrote:
> Finally, I got some microtonal notation working in Lilypond that uses
> a special font for the accidentals (i.e. not the usual Feta font)

Note that in my previous message Yahoo garbled the path names (long names split, dot after path part of it ...).

Best
Torsten