• Willkommen im Forum „Archiviertes Lilypond Forum (2017)“.
 

Dies ist das Archiv des alten Forums (bis März 2017). Das aktuelle Forum ist unter lilypondforum.de zu finden.
This is the archive of the old forum (until March 2017). You can find the current forum at lilypondforum.de.

Hauptmenü

\shiftDurations [GELÖST]

Begonnen von ingmar, Samstag, 17. Oktober 2015, 12:17

Vorheriges Thema - Nächstes Thema

ingmar

hallo,


ich habe eine Stück Musik, das ich nun in halbierten Notenwerten wiedergeben möchte. Die Funktion \shiftDurations scheint genau dazu da. Leider aber halbiert sie nur die Notenwerte, nicht die Taktangaben.

In folgendem Beispiel würde ich im unteren System statt 4/2 gerne 4/4 lesen:

\version "2.18.2"

A = { \time 4/2 \relative c' { c d e f g1 } }

\score { \A }

A = \shiftDurations #1 #0 \A

\score { \A }


Ich kann grundsätzlich die \time-Angaben alle ändern (da ich sie in meinem eigenen Code in einer getrennten Variable bereithalte), aber vielleicht gibt es ja eine elegantere Möglichkeit?


Gruß,
--ingmar

fugenkomponist

\version "2.18.2"

shiftTimeSignatures =
#(define-music-function (parser location music) (ly:music?)
   (music-map
    (lambda (m)
      (if (eq? (ly:music-property m 'name) 'TimeSignatureMusic)
          (begin
           (ly:music-set-property! m 'denominator
             (* 2 (ly:music-property m 'denominator)))
           m)
          m))
    music))

A = { \time 4/2 \relative c' { c d e f g1 \time 3/2 a2 f a } }

\score { \A }

A = \shiftTimeSignatures \shiftDurations #1 #0 \A

\score { \A }

ingmar

Funktioniert, wie es soll. Danke!

Erstaunlich aber doch, dass man da mit Scheme nachhelfen muss - wenn es ein \shiftDurations eingebaut gibt, hätte ich erwartet, dass Lilypond auch eine Möglichkeit vorsieht, den gesamten Satz zu skalieren.

Gruß,
--ingmar

fugenkomponist

#3
Ich muss zugeben, ich hab nicht erst nach ner LilyPond-eigenen Lösung gesucht.

Dass \shiftDurations das nicht mit macht, lässt sich folgendermaßen erklären: Es verwendet die Funktion shift-duration-log und diese shift-one-duration-log. Und shift-one-duration-log skaliert einfach die 'duration-Eigenschaft der übergebenen Musik; eine 'TimeSignatureMusic hat aber keine Dauer. So weit zum Ist-Zustand. Zum Soll: Ist irgendwie sinnvoll, denn \shiftDurations akzeptiert ja auch punktierte Werte, und das würde mit Taktarten kaputt gehen ...

ingmar

Wie gesagt, für meine Zwecke reichts.


Um es allgemeiner zu halten, würde man wahrscheinlich noch den Wert, mit dem der Nenner zu multiplizieren ist, als Argument übergeben.


Gruß, : - )
--ingmar

fugenkomponist

Ja, wohl wahr. Und auch für ,,multipliziere mit punktiertem Wert" gibts ne Lösung: Zähler mal 3, Nenner mal 2. Ähnlich auch für mehr Punkte, aber ob dabei immer das gewünschte Ergebnis rauskommt, ist halt die Frage ;)