Autor Thema: Tuplet umdefinieren  (Gelesen 2274 mal)

Manuela

  • Member
Tuplet umdefinieren
« 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.

fugenkomponist

  • Member
Re: Tuplet umdefinieren
« Antwort #1 am: Samstag, 20. August 2016, 17:03 »
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 …
« Letzte Änderung: Samstag, 20. August 2016, 17:05 von fugenkomponist »

fugenkomponist

  • Member
Re: Tuplet umdefinieren
« Antwort #2 am: Samstag, 20. August 2016, 17:15 »
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

  • Member
Re: Tuplet umdefinieren
« Antwort #3 am: Samstag, 20. August 2016, 17:24 »

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

  • Member
Re: Tuplet umdefinieren
« Antwort #4 am: Samstag, 20. August 2016, 17:37 »

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

  • Member
Re: Tuplet umdefinieren
« Antwort #5 am: Samstag, 20. August 2016, 19:50 »
und diesen (make-music …)-Ausdruck einfach übernehmen ;)

Diese Info hat mir gefehlt, danke!