Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: Manuela am Samstag, 20. August 2016, 16:51
-
Ich bräuchte eine Funktion, wo vor dem Tuplet subdivideBeam ausgeschaltet und nachher wieder eingeschaltet wird, das funktioniert leider nicht:
\version "2.19.37"
mytuplet=
#(define-music-function (ratio tuplet-span music)
(fraction? (ly:duration? '()) ly:music?)
#{
\set Voice.subdivideBeams=##f
#(tuplet ratio tuplet-span music)
\set Voice.subdivideBeams=##f
#}
)
Idealerweise würde ich noch vorher abfragen, ob subdivideBeams auf true steht und nur dann wieder zurücksetzen.
-
Anwendungsbeispiel wär gut, ich seh nämlich kein Problem, außer dass du zweimal auf ##f setzt ;) Folgendes funktioniert jedenfalls:
\version "2.19.37"
mytuplet=
#(define-music-function (ratio tuplet-span music)
(fraction? (ly:duration? '()) ly:music?)
#{
\unset Voice.subdivideBeams
\tuplet #ratio #tuplet-span #music
\set Voice.subdivideBeams = ##t
#}
)
{
\set Voice.subdivideBeams = ##t
16[ 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16]
\mytuplet 6/4 4 {
16[ 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16]
}
16[ 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16]
}Hmja, so ein \temporary \set wär schon schön, gibts aber leider nicht …
-
Achso, ich glaub, ich weiß, was du meinst: tuplet erwartet als zweites Argument ly:duration? oder nichts, aber nicht '() (das verwendet es nur, wenn keine ly:duration? kommt). Also kannst du nicht selbst '() an tuplet übergeben. Hier hilft also eine Fallunterscheidung à la
#(define-music-function (ratio tuplet-span music)
(fraction? (ly:duration? '()) ly:music?)
#{
\set Voice.subdivideBeams = ##f
#(if (null? tuplet-span)
(tuplet ratio music)
(tuplet ratio tuplet-span music))
\set Voice.subdivideBeams = ##t
#})
oder du übernimmst die Definition von tuplet (in ly/music-functions-init.ly) direkt:
#(define-music-function (ratio tuplet-span music)
(fraction? (ly:duration? '()) ly:music?)
#{
\set Voice.subdivideBeams = ##f
#(make-music 'TimeScaledMusic
'element (ly:music-compress
music
(ly:make-moment (cdr ratio) (car ratio)))
'numerator (cdr ratio)
'denominator (car ratio)
'duration tuplet-span)
\set Voice.subdivideBeams = ##t
#})
-
oder du übernimmst die Definition von tuplet (in ly/music-functions-init.ly) direkt:
Das hätte ich eh gemacht, wenn ich gewusst hätte wie :-[
Danke für die rasche Antwort. Mit dem Soundfont kann ich dir leider nicht helfen, ich entlocke bloß einem mechanischen Piano Töne...
-
oder du übernimmst die Definition von tuplet (in ly/music-functions-init.ly) direkt:
Das hätte ich eh gemacht, wenn ich gewusst hätte wie :-[
Ich habe den kompletten LilyPond-Sourcecode auf meinem Rechner; den kann ich dann durchsuchen (in diesem Fall hab ich nach "tuplet =" gesucht). Die Definition ist eine Musikfunktion wie deine, die erstmal nen Kommentar enthält, was sie tut und dann nichts anderes als obiges (make-music …) macht. In der durch #{ eingeleiteten LilyPond-Umgebung kann man per # wieder zurück zu scheme gehen und diesen (make-music …)-Ausdruck einfach übernehmen ;)
-
und diesen (make-music …)-Ausdruck einfach übernehmen ;)
Diese Info hat mir gefehlt, danke!