Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: Manuela am Freitag, 19. August 2016, 15:30

Titel: Muss Staff.ottavation tatsächlich nach jedem \ottava neu gesetzt werden?
Beitrag von: Manuela am Freitag, 19. August 2016, 15:30
Setze ich das Kommando ottavation = #"8" in den Staff-Kontext, wird nämlich der ganze Staff mit einer Oktavierung versehen. Gibt es eine Möglichkeit, die Beschriftung des Ottava-Spanners grundsätzlich zu ändern?
Titel: Re: Muss Staff.ottavation tatsächlich nach jedem \ottava neu gesetzt werden?
Beitrag von: fugenkomponist am Freitag, 19. August 2016, 16:08
Scheint so, als wär das nicht so einfach möglich. Denn der OttavaSpanner holt sich anscheinend die Beschriftung direkt aus dem OttavaMusic-Event und das holt sie aus make-ottava-set (Funktion in scm/define-music-callbacks.scm), wo die Werte "15ma", "8va", #f, "8vb" und "15mb" hard coded sind. Ich weiß nicht, ob und wie man die Definition von OttavaMusic überschreiben könnte, wahrscheinlich ist folgendes einfacher:
\version "2.19.46"

myOttava =
#(define-music-function (o) (integer?)
   (let ((text (case o
                 ((0) #f)
                 ((1 -1) "8")
                 ((2 -2) "15"))))
     #{
       \ottava #o
       \set Staff.ottavation = #text
     #}))

\relative {
  c''1 c \myOttava 0 c \myOttava 1 c \myOttava 0 c \myOttava 1 c
}

Es wär natürlich schön, wenn man OttavaBracket.text oder OttavaBracket.bound-details.left.text per override überschreiben könnte und das dann auch Wirkung zeigen würde …
Titel: Re: Muss Staff.ottavation tatsächlich nach jedem \ottava neu gesetzt werden?
Beitrag von: Manuela am Freitag, 19. August 2016, 18:23
wahrscheinlich ist folgendes einfacher:


Gute Idee, schon geklaut  ;) :D
Titel: Re: Muss Staff.ottavation tatsächlich nach jedem \ottava neu gesetzt werden?
Beitrag von: harm6 am Freitag, 19. August 2016, 21:36
Die Definition von OttavaMusic (in `music-descriptions') zu überschreiben, ist mir auch nicht gelungen. Zumindest nicht auf die Schnelle - und ich bin momentan mit einem größeren coding beschäftigt, so weiß ich nicht, ob ich demnächst Zeit habe es ernsthafter zu versuchen.

Aber folgender Code funktioniert erstmal für einmaligen Gebrauch, sollte eigentlich machbar sein ein mapping über den gesamten Musikausdruck hinzukriegen.
Ich bin mir allerdings nicht sicher, ob ich diese Methode wirklich empfehlen kann, aber falls es jemand versuchen möchte, hier der Code:

\version "2.18.2"

\paper { ragged-right = ##f }

#(define my-list
  `((2 . ,(markup #:box #:rotate 10 "2 Oktaven nach oben"))
    (1 . "8va")
    (0 . #f)
    (-1 . ,(markup #:box #:rotate -10 "1 Oktave nach unten"))
    (-2 . "15mb"))

  ;;;; default
  ;'((2 . "15ma")
  ;  (1 . "8va")
  ;  (0 . #f)
  ;  (-1 . "8vb")
  ;  (-2 . "15mb"))
    )

#(define (my-make-ottava-set music)
  "Set context properties for an ottava bracket."
  (let ((octavation (ly:music-property music 'ottava-number)))
    (list (context-spec-music
           (make-apply-context
            (lambda (context)
              (let ((offset (* -7 octavation))
                    (string (assoc-get octavation my-list)))
                (set! (ly:context-property context 'middleCOffset) offset)
                (set! (ly:context-property context 'ottavation) string)
                (ly:set-middle-C! context))))
           'Staff))))

{
  %% \withMusicProperty is for one-time-use
  %% TODO apply it generally
  \withMusicProperty #'elements-callback #my-make-ottava-set
  \ottava #2
  c''''1
  c''''
  \ottava #0
  c'1
  \withMusicProperty #'elements-callback #my-make-ottava-set
  \ottava #-1
  c''1
  c''
}

Gruß,
  Harm

png im Anhang