lilypond-user
[Top][All Lists]
Advanced

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

Re: Adding a root note next to the key signature (like a single note Amb


From: Viktor Mastoridis
Subject: Re: Adding a root note next to the key signature (like a single note Ambitus)
Date: Sat, 9 Jul 2022 15:47:55 +0100




1. How do I change the pitch of the 'root' note? I tried playing with the three numbers from "(+ tonic-position 3) 7) 3)))". But I can't understand their logic.

I'm not quite sure what you mean: The pitch of the 'root' note is taken directly from the \key command.

For example, the following example generates all reasonable roots for key signatures with two sharps:

{
  \key d \major
  a'1
  \key e \dorian
  a'1
  \key fis \phrygian
  a'1
  \key g \lydian
  a'1
  \key a \mixolydian
  a'1
  \key b \aeolian
  a'1
  \key cis \locrian
  a'1
}

Does this already solve your question?

No, it didn't at first.
I was talking about custom scales like Hijaz (1 2b 3 4 5 6b 7b) and its variations. 
I use the \set Staff.keyAlterations command. 
But then I remembered that I have to use the normal \key command before the keyAlterations command, to give it a context for the alterations.
I tried that and it works as a charm (see below). 


But I can also explain the logic behind the three numbers 3 7 3 in the _expression_ you quoted:

  • "tonic" is the tonic as a LilyPond pitch.
  • "tonic-position" is defined as (+ (ly:pitch-steps tonic) (ly:grob-property grob 'c0-position), i.e.
    ... the vertical position of "middle c" for the current clef (measured in half-staff distances, i.e. note steps, from the centermost staff line)
    plus
    ... the number of steps our tonic lies above middle c.
    Now we have the problem that this gives us the position of _some_ tonic note, but we do not know yet in which octave it will lie; so it may very well be sitting far above or far below the staff. Therefore:
  • "adjusted-tonic-position" is defined as (- (modulo (+ tonic-position 3) 7) 3))), i.e. ((tonic-position + 3) mod 7) - 3. The idea is: Take the tonic-position modulo 7 since pitch names repeat after 7 steps. If we would simply take "tonic-position mod 7", this would amount to guaranteeing the tonic-position to lie between 0 and 6: But this means our note will lie on or above the centermost staff line (the lower staff lines will not be used).
    What we want instead is a "shifted" modulo operation that returns values not between 0 and 6 but between -3 and 3; in other words: Values of "tonic-position" between -3 and 3 should not get changed. So we first add 3 (yielding a value between 0 and 6), then doing the modulo and finally transforming back by subtracting 3 again.

To sum up: The 7 should not be changed (that's the amount of steps in our note name system), and the two 3's should be equal (and it's no coincidence that 3 = (7-1)/2).

Thank you for that. It's fantastic how Music Theory gets another life as a Lilypond code:-)

2. How can I remove the parenthesis? I tried but continuously broke the code:-)

The notehead stencil is in the "notehead" variable, and the paranthesized stencil is stored in "notehead-parens". The simplest way to get rid of the parentheses would be to replace "notehead-parens" in the final construction of the stencil by "notehead". But then we can also get rid of "notehead-parens" completely, hence we get:

notehead_key_signature = #
(lambda (grob)
  (let*
   ((key-sig (ly:key-signature-interface::print grob))
     (notehead
      (grob-interpret-markup grob
                             (markup #:tiny #:musicglyph "noteheads.s2")))
     (tonic (assq-ref (ly:grob-property grob 'details) 'tonic))
     (tonic-position (+ (ly:pitch-steps tonic)
                        (ly:grob-property grob 'c0-position)))
     (adjusted-tonic-position
      (- (modulo (+ tonic-position 3) 7) 3)))
   (ly:stencil-combine-at-edge
    key-sig X RIGHT
    (ly:stencil-translate-axis notehead
                               (/ adjusted-tonic-position 2) Y)
    0.5)))

HTH
Lukas


Thank you, thank you, thank you.

I finally arrived where I intended to go. 
This is what I use on top of your code and it renders perfectly - image attached.
\key d \major
  \set Staff.keyAlterations = #`(
(2 . ,FLAT)
(3 . ,SHARP)
(6 . ,FLAT)
)
\mark "D Hijaz"
d' es' fis' g' a' bes' c'' d''

Viktor

Attachment: DHijaz.png
Description: PNG image


reply via email to

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