Autor Thema: \shiftDurations [GELÖST]  (Gelesen 2003 mal)

ingmar

  • Member
\shiftDurations [GELÖST]
« am: Samstag, 17. Oktober 2015, 12:17 »
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
« Letzte Änderung: Samstag, 17. Oktober 2015, 18:27 von ingmar »

fugenkomponist

  • Member
Re: \shiftDuration
« Antwort #1 am: Samstag, 17. Oktober 2015, 12:43 »
\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

  • Member
re: \shiftDurations
« Antwort #2 am: Samstag, 17. Oktober 2015, 18:26 »
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

  • Member
Re: \shiftDurations [GELÖST]
« Antwort #3 am: Samstag, 17. Oktober 2015, 18:45 »
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 …
« Letzte Änderung: Samstag, 17. Oktober 2015, 18:48 von fugenkomponist »

ingmar

  • Member
re: \shiftDurations [GELÖST]
« Antwort #4 am: Montag, 19. Oktober 2015, 20:25 »
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

  • Member
Re: \shiftDurations [GELÖST]
« Antwort #5 am: Montag, 19. Oktober 2015, 21:07 »
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 ;)