nochmal: Hilfslinien

Begonnen von erich, Samstag, 16. September 2017, 11:18

« vorheriges - nächstes »

erich

Hallo allen

Das Script "beispiel-1.ly"

\version "2.19.65"
\score {<<
  \new Staff
    \new Voice {
      \override Staff.StaffSymbol.line-positions = #'( -6 -2  2 6 )
      \once \override NoteHead.ledger-positions = #'(-14 -10 0)
      <c b'>}
        >>}


ergibt vier Linien und drei Hilfslinien.

Dieselben Hilfslinien werden nun im Script "beispiel-2.ly"

\version "2.19.65"

T =
#(define-music-function (liste) (list?)
    #{\once \override NoteHead.ledger-positions =  #liste #})

\score {<<
  \new Staff
    \new Voice {
      \override Staff.StaffSymbol.line-positions = #'( -6 -2  2 6 )
      \T#'(-14 -10 0) <c b'>}
        >>}


durch die  Funktion T defininiert.

Mein Ziel ist es, die Liste, die der Fuktion als Argument mitgegeben wird, durch eine Funktion aus dem nachfolgenden Musikobjekt zu erzeugen.
Leider fuktioniert es nicht so, wie ich dachte; denn schon der nächste Schritt klappt nicht:

Das Script "beispiel-3.ly"

\version "2.19.65"

T =
#(define-music-function (liste music-obj) (list? ly:music?)
    #{\once \override NoteHead.ledger-positions =  #liste #} music-obj)

\score {<<
  \new Staff
    \new Voice {
      \override Staff.StaffSymbol.line-positions = #'( -6 -2  2 6 )
      \T#'(-14 -10 0) <c b'>}
        >>}

gibt leider nicht die Hilfslinien so aus, wie sie durch die T-Funktion definiert sind.

Was muss ich machen, damit die T-Funktion auf das Musikobjekt angewendet wird?

Gruß
Erich





harm6

Hallo Erich,

wie schon gesagt kann ich Dir momentan nicht helfen etwas zu entwickeln, was Deinen Vorstellungen entspricht. Aus Zeitmangel komm ich mit meinem letzten Projekt schon nicht so richtig weiter.
Aber einen schnellen Blick in Deinen Code zu werfen ist immer möglich.

Das Problem ist in

T =
#(define-music-function (liste music-obj) (list? ly:music?)
    #{\once \override NoteHead.ledger-positions =  #liste #}
    music-obj)

Im body der Funktion befinden sich zwei separate Ausdrücke, bei denen der erste nicht auf den zweiten einwirkt.
Besser sichtbar, wenn Du es so schreibst, daß jeder Ausdruck eine Zeile beansprucht.
Der zweite wird dann ausgegeben, also unverändert.
Die Variable 'music-obj' in #{ ... #} zu packen und somit einen einzigen Ausdruck zu haben, der dann ausgegeben wird löst das Problem.
'music-obj' ist eine scheme-Variable, also $- bzw #-Zeichen nicht vergessen (den Unterschied thematisiere ich hier nicht):

T =
#(define-music-function (liste music-obj) (list? ly:music?)
  #{
    \once \override NoteHead.ledger-positions =  #liste
    $music-obj
  #})



Gruß,
  Harm

erich

Hallo harm,

vielen Dank! das hilft schon weiter; der nächste Zwischenschritt ist dann das Script "beispiel-4-ly"

#(define (ledger-liste unten music-obj)
   '(-14 -10 0))

UU =
#(define-music-function (unten music-obj) (number? ly:music?)
    (let ((liste_neu (ledger-liste unten music-obj)))
    #{\once \override NoteHead.ledger-positions =  #liste_neu 
      #music-obj #}))

\score {<<
  \new Staff
    \new Voice {
      \override Staff.StaffSymbol.line-positions = #'( -6 -2  2 6 )
      \UU4 <c b'>}
        >>}


Die Funktion ledger-liste dient dann der Analyse des Musikobjekts. Dazu muss ich  im weiteren Zusammenhang die Programmierung der dodecapitchnames.ly-Funktion nutzen, um die Liste der Hilfslinien zu ermitteln.

Gruß
Erich