Alle Dauern verdoppeln / halbieren [gelöst]

Begonnen von ingmar, Freitag, 5. Dezember 2025, 10:48

« vorheriges - nächstes »

ingmar

Ich habe viel mit frühbarocker bzw Renaissance-Musik zu tun. Diese Musik wurde in den Ausgaben des letzten Jahrhunderts fast immer in halben Notenwerten notiert, weil sonst der Durchschnittsmusiker sofort ein sehr langsames Tempo assoziierte. Inzwischen haben viele Musiker allerdings dazugelernt. Jedenfalls bedeutet das aber, dass man immer mal wieder existierende Musik neu notieren möchte, sie selbst aber dazu nicht ändern möchte (die existierende Frescobaldi-Funktion würde das tun und hilft mir daher nicht weiter).

Ich habe also eine Variable, die sicher nur einstimmige Musik enthält. Ich möchte nun alle Dauern halbieren (oder verdoppeln). Es gibt bereits eine Funktion \scaleDurations, die allerdings eine leicht abweichende Aufgabe erfüllt.

Also sowas wie
* music = \halfdurations \music
* music = \doubledurations \music

oder halt
* music = \durationsperfactor 1/2 \music
* music = \durationsperfactor 2 \music

oder so ähnlich.

- Andere Faktoren als 1/2 und 2/1 werden sicher nicht vorkommen.
- nice to have: Nicht nur Noten und Pausen, sondern auch spaces (wie s1 s2 s4 s\breve) werden skaliert.
- nice to have: Auch MIDI interpretiert die neuen Werte (verdoppelt/halbiert hörbar das Tempo).
- (wie die Taktarten dabei reagieren, spielt für mich hier erstmal keine Rolle)

Das gleiche Problem wurde hier im Forum schon einmal behandelt, es fehlt mir allerdings der letzte, entscheidende Schritt: Die Funktion wie oben, die das nun tatsächlich auf bestehende Musik anwendet.

Meine LilyPond-Version ist 2.20. Ja.

Danke im Voraus! : - )

--ingmar


Malte

Hallo Ingmar,

was genau an \scaleDurations ist denn anders als du es haben willst? Ich weiß, dass die Taktarten nicht mit skaliert werden, aber sonst fällt mir gerade nichts ein.

Viele Grüße
Malte

ingmar

Zitat von: Malte am Freitag,  5. Dezember 2025, 15:35was genau an \scaleDurations ist denn anders als du es haben willst?

Zitat von: der LilyPond-DokuTondauern skalieren: Die Dauer von einzelnen Noten, Pausen oder Akkorden kann mit einem Bruch multipliziert werden, indem hinter die Notendauer ,,*N/M" (oder ,,*N" wenn M 1 ist) geschrieben wird. Die Erscheinung der Noten oder Pausen wird dadurch nicht beeinflusst, die neue Dauer wird aber dazu benutzt, ihre Position im Takt zu errechnen und die neue Dauer in der MIDI-Ausgabe einzusetzen.
In dürren Worten:
music = \relative { c' d e f g2 g a4 a a a g1 }

\scaleDuration 2/1 \music
...das führt einfach dazu, dass nun in jedem der Viervierteltakte nur zwei Viertelnoten stehen statt vier, oder nur eine Halbe statt zwei – als wären es Zweivierteltakte. Es gibt Fälle, wo das brauchbar ist (z. B., aber nicht nur, für MIDI), aber nicht für die hier benötigte Verdopplung der Notenwerte. Ich wünsche mir stattdessen folgendes Ergebnis:

music = \relative { c'2 d e f g1 g a2 a a a g\breve }
--ingmar

BTW: Hallo Malte! : - )

Malte

Achso, ich habs in meinem Hirn mit \shiftDurations durcheinandergebracht, schau dir das mal an. Das hab ich schon häufiger genutzt und die einzige mir bekannte Einschränkung ist, daß es Taktarten nicht auch automatisch verdoppelt (4/4→4/2 etc.).

ingmar

\shiftDurations!

Yepp, das ist es:

music = \relative { c' d e f g2 g a4 a a a g1 }

\shiftDurations  1 0 \music  % (doppeltes Tempo)

\shiftDurations -1 0 \music  % (halbes Tempo)

Whow. – Ich hatte ziemlich gesucht, es aber beim besten Willen nicht finden können. Ich ahne sogar dunkel, dass ich das vor zehn Jahren oder sowas schonmal benutzt habe. Aber der Name ist auch unglücklich gewählt; man shiftet hier ja nicht die Dauern, sondern deren Logarithmus...

Danke für die prompte Antwort! : - )

--ingmar