Autor Thema: Intervallangaben als Zahlen zwischen Notenzeilen setzen  (Gelesen 1689 mal)

Andreas

  • Member
Intervallangaben als Zahlen zwischen Notenzeilen setzen
« am: Sonntag, 14. Februar 2016, 10:42 »
Hallo Lilypond-Experten,

bei einem vierstimmigen Satz mit einer Notenzeile pro Stimme möchte ich gerne die Intervalle zwischen den einzelnen Stimmen als Zahlen zwischen die Zeilen setzen. Könnt Ihr mir helfen, wie ich das bewerkstelligen kann? Innerhalb einer einzelnen Notenzeile gibt es keine Mehrstimmigkeit. Eine Suche im Forum hat mich zwar zum Thema Intervalle innerhalb eines Akkordes bezeichnen - wie? geführt, aber ich verstehe den dort genannten Code überhaupt nicht, so dass ich ihn auch nicht als Startpunkt nutzen kann.

Vielen Dank im Voraus

Andreas

harm6

  • Member
Re: Intervallangaben als Zahlen zwischen Notenzeilen setzen
« Antwort #1 am: Sonntag, 14. Februar 2016, 12:04 »
Hallo Andreas,

mir ist nicht ganz klar wie es aussehen soll.

Im folgenden Code zeige ich zwei Möglichkeiten, via markup und via Lyrics.
Ist da was für Dich dabei?

\version "2.18.2"

I = { c''1 c''_"4" }
II = { g'1 g'_"3" }
III = { e'1 e'_"3" }
IV = { c'1 c' }

adI = \lyricmode { "4" }
adII = \lyricmode { "3" }
adIII = \lyricmode { "3" }

<<
  \new Staff \new Voice = "I"\I
  \new Lyrics \lyricsto "I" \adI
 
  \new Staff \new Voice = "II"\II
  \new Lyrics \lyricsto "II" \adII
 
  \new Staff \new Voice = "III"\III
  \new Lyrics \lyricsto "III" \adIII
 
  \new Staff \new Voice = "IV"\IV
 
>>

Gruß,
  Harm

Andreas

  • Member
Re: Intervallangaben als Zahlen zwischen Notenzeilen setzen
« Antwort #2 am: Sonntag, 14. Februar 2016, 13:17 »
Hallo Harm,

anscheinend habe ich mich uneindeutig ausgedrückt. Ich möchte Lilypond die Zahlen der Intervalle automatisch aus den Stimmen ausrechnen lassen, um mir Arbeit zu ersparen.
Ausgangspunkt: Die vier Stimmen. Einfaches Beispiel:
Sopran = { c''4 c'' b' c'' }
Alt = { g'4 a' g' g' }
Tenor = { e'4 f' d' e' }
Bass = { c4 f g c }
Gesucht: Routine zur Berechnung der Intervalle, die dann z.B. als Lyrics eingefügt werden.
Beispielsweise wäre das Ergebnis zwischen Sopran und Alt 4 3 3 4

Ist das möglich? Ich möchte die Routine dann auf ganze Stücke anwenden und mir die Fleißarbeit des Rausschreibens der Zahlen sparen.

Gruß

Andreas

harm6

  • Member
Re: Intervallangaben als Zahlen zwischen Notenzeilen setzen
« Antwort #3 am: Sonntag, 14. Februar 2016, 17:28 »
Ein Anfang:

\version "2.18.2"

#(define (pitch-step p)
  "Musicological notation for an interval.  Eg. C to D is 2."
  (+ 1 (ly:pitch-steps p)))
   
#(define (my-test-engr context)
  (let ((note-step '())
        (steps '()))
    `((listeners
       (note-event
         .
         ,(lambda (engraver event)
           (set! note-step (cons (ly:event-property event 'pitch) note-step)))))
      (acknowledgers
        (lyric-syllable-interface
         . ,(lambda (engraver grob source-engraver)
              (if (not (null? steps))
                  (begin
                    (ly:grob-set-property! grob 'text
                                                (number->string (car steps)))
                    (set! steps (cdr steps)))))))
      (process-music
       .
       ,(lambda (trans)
       (if (not (null? note-step))
           (set! steps
                 (append
                   (reverse
                     (map
                       (lambda (p q) (pitch-step (ly:pitch-diff q p)))
                       note-step
                       (cdr note-step)))
                   steps)))))
      (stop-translation-timestep
       . ,(lambda (trans)
            (set! steps '())
            (set! note-step '())
            '())))))

\layout {
  \context {
    \Score
    \consists #my-test-engr
  }
}

I = { c''4 c'' b' c'' }
II = { g'4 a' g' g' }
III = { e'4 f' d' e' }
IV = { c4 f g c }

<<
  \new Staff \new Voice = "I" \I
  \new Lyrics \lyricsto "I" { \repeat unfold 4 "_" }
 
  \new Staff \new Voice = "II"\II
  \new Lyrics \lyricsto "II" { \repeat unfold 4 "_" }
 
  \new Staff \new Voice = "III"\III
  \new Lyrics \lyricsto "III" { \repeat unfold 4 "_" }

  \new Staff \new Voice = "IV" { \clef bass \IV }
>>

Funktioniert aber nur wenn alle Stimmen die gleichen Notenwerte haben, auch sonst gibts ein paar Nachteile.
Wie gesagt, nicht mehr als ein Anfang...

Gruß,
  Harm

Andreas

  • Member
Re: Intervallangaben als Zahlen zwischen Notenzeilen setzen
« Antwort #4 am: Montag, 15. Februar 2016, 22:57 »
Hallo Harm,

besten Dank für den Code, der das das Gewollte tut. Kannst Du ihn bitte noch ein wenig erläutern, da meine Lilypond- bzw. Scheme-Kenntnisse recht rudimentär sind? Wenn ich Deinen Ansatz richtig verstehe, hast Du einen neuen Engraver geschrieben, der die Unterstriche in der Lyrics-Umgebung in die Intervallzahlen umwandelt, während die Hilfsfunktion pitch-step das Intervall zwischen zwei Tönen ermittelt. Was ist der Vorteil dieses Ansatzes? Ich habe leider praktisch keine Ahnung von Engravern und wie sie funktionieren. Daher wüsste ich auch nicht, wie ich den Code erweitern könnte, beispielsweise um die Intervalle zwischen Sopran und Tenor auszurechnen.

Gruß,

Andreas