• 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ü

Tuplet umdefinieren

Begonnen von Manuela, Samstag, 20. August 2016, 16:51

Vorheriges Thema - Nächstes Thema

Manuela

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.

fugenkomponist

#1
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 ...

fugenkomponist

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
   #})

Manuela

Zitat von: fugenkomponist am Samstag, 20. August 2016, 17:15

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...

fugenkomponist

Zitat von: Manuela am Samstag, 20. August 2016, 17:24
Zitat von: fugenkomponist am Samstag, 20. August 2016, 17:15

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 ;)

Manuela

Zitat von: fugenkomponist am Samstag, 20. August 2016, 17:37
und diesen (make-music ...)-Ausdruck einfach übernehmen ;)

Diese Info hat mir gefehlt, danke!