Autor Thema: Muss Staff.ottavation tatsächlich nach jedem \ottava neu gesetzt werden?  (Gelesen 2001 mal)

Manuela

  • Member
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?

fugenkomponist

  • Member
Re: Muss Staff.ottavation tatsächlich nach jedem \ottava neu gesetzt werden?
« Antwort #1 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 …
« Letzte Änderung: Freitag, 19. August 2016, 16:10 von fugenkomponist »

Manuela

  • Member
Re: Muss Staff.ottavation tatsächlich nach jedem \ottava neu gesetzt werden?
« Antwort #2 am: Freitag, 19. August 2016, 18:23 »
wahrscheinlich ist folgendes einfacher:


Gute Idee, schon geklaut  ;) :D

harm6

  • Member
Re: Muss Staff.ottavation tatsächlich nach jedem \ottava neu gesetzt werden?
« Antwort #3 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