> 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