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

Vorzähler / metronome tick /snippet 876

Begonnen von martinusbaum, Mittwoch, 12. Oktober 2016, 05:33

Vorheriges Thema - Nächstes Thema

martinusbaum

hallo,
da gibt es ein snippet [url][http://lsr.di.unimi.it/LSR/Item?id=876]

martinusbaum

eigentlicht wollte ich oben weiterschreiben....
Da gibt es ein snippet [http://lsr.di.unimi.it/LSR/Item?id=876][http://lsr.di.unimi.it/LSR/Item?id=876], das metronome ticks mit schlaginstrumenten (/drummode) einfügt anhand der Länge einer Mustermelodie.
Wenn man das Beispiel ändert von 4/4-Takt auf 3/4-Takt: \time = 3/4, bei harmonics nur s2., bei ticktock ein woodblock weniger
dann werden drei Takte dargestellt statt einem...

Eigentlich suche ich eine Lösung für einen Vorzähler mit zwei Takten ticktock mit woodblock 2/2, 3/4, 4/4, 6/8
wenn man einfach die benötigte woodblock-Anzahl hintereinander schreibt geht es natürlich. Mich irritiert das Verhalten bei Nutzung der Wiederholungsfunktion

Für eine Erklärung danbar...

Manuela

Du kannst deinen Beitrag updaten, wenn beim Editieren etwas schief gegangen ist  ;)

Eine klickbare URL erzeugst du, indem du die Adresse markierst und auf den Button drückst.
Willst du die URL mit einem anderen Text versehen, schreibst du in die erste eckige Klammer die http-Adresse
und setzt den gewünschten Text in die URL-Klammer

[ url=https://archiv.lilypondforum.de/index.php?action=post;topic=2389.0 ]hier der Text[ / url ]

Die Leerzeichen habe ich jetzt eingefügt, damit die Forensoftware keine automatische Umwandlung durchführt (geht sicher irgendwie anders, aber ich finde das Escape-Zeichen nicht).

fugenkomponist

Das Problem liegt in makeUnfold:makeUnfold =
#(define-music-function (parser location name mus) (ly:music? ly:music?)
  (let ((r (make-repeated-music "unfold")))
    (set! (ly:music-property r 'element) mus)
    (set! (ly:music-property r 'repeat-count)
          (ly:moment-main-numerator (ly:music-length name)))
    r))
In der vierten und fünften Zeile wird die Länge der Musik namens name herausgefunden. music-length gibt einen Bruch zurück, z. B. wird für 5 Takte 3/4-Takt 15/4 zurückgegeben. Und repeat-count wird jetzt ungeachtet der Taktart auf den Zähler dieses Bruchs gesetzt, also in diesem Fall 15 statt 5. Deshalb funktioniert das Ganze nur für 2/2, 4/4 und ähnliche Taktarten. Man müßte also irgendwie an den Kontext kommen, der die Musik beinhaltet, und von dem die Taktart rauskriegen. Ich probier das nachher mal.

harm6

Hier mein erster Ansatz. Es ist aber wirklich nur ein "Vorzähler", ich habe ihn nicht "durchzählend" gemacht.


\version "2.19.48"

countTwoBarsBefore =
#(define-music-function (mus)(ly:music?)
  (let* ((time-sig '()))
    (music-map
      (lambda (m)
        (if (eq? (ly:music-property m 'name) 'TimeSignatureMusic)
            (begin
              (set! time-sig (cons m time-sig))
              m)
            m))
      mus)
    (let* ((num
             (if (null? time-sig) 4 (ly:music-property (last time-sig) 'numerator)))
           (denom
             (if (null? time-sig) 4 (ly:music-property (last time-sig) 'denominator)))
           (time-sig-frac (cons num denom)))

      (make-sequential-music
        (list
          #{
          \new DrumVoice
            \drummode {
              \time #time-sig-frac
              \repeat unfold 2 {
                \withMusicProperty
                  #'duration
                  #(ly:make-duration (ly:intlog2 denom))
                hiwoodblock
               
                \repeat unfold #(1- num) {
                  \withMusicProperty
                    #'duration
                    #(ly:make-duration (ly:intlog2 denom))
                  lowoodblock
                }
              }
            }
          #}
          #{ \new Voice \notemode { $mus } #})))))

m = {
\time 3/4
e''4 e' e'
\time 5/8
8 8 8 8 8
}

\score {
  \m
}

\score {
  \countTwoBarsBefore \m
  \midi { \tempo 4=160 }
}


HTH,
  Harm

harm6

Zitat von: harmHier mein erster Ansatz.

Ich habe in meinem ersten Versuch einen bug entdeckt, der auftritt falls der Anwender keine Taktangabe schreibt, aber später Taktwechsel vorkommen.
Sollte mit dem Code unten besser klappen...


\version "2.19.48"

countTwoBarsBefore =
#(define-music-function (mus)(ly:music?)
  (let* ((time-sig '()))
    (music-map
      (lambda (m)
        (if (eq? (ly:music-property m 'name) 'TimeSignatureMusic)
            (begin
              (if (not (pair? time-sig))
                  (set! time-sig (cons m time-sig)))
              m)
            (begin
              (if (not (pair? time-sig))
                  (set! time-sig (cons '() time-sig)))
              m)))
      mus)
    (let* ((num
             (if (null? (car time-sig))
                 4
                 (ly:music-property (car time-sig) 'numerator)))
           (denom
             (if (null? (car time-sig))
                 4
                 (ly:music-property (car time-sig) 'denominator)))
           (time-sig-frac (cons num denom)))
      (make-sequential-music
        (list
          #{
          \context DrumVoice
            \drummode {
              \time #time-sig-frac
              \repeat unfold 2 {
                \withMusicProperty
                  #'duration
                  #(ly:make-duration (ly:intlog2 denom))
                hiwoodblock
               
                \repeat unfold #(1- num) {
                  \withMusicProperty
                    #'duration
                    #(ly:make-duration (ly:intlog2 denom))
                  lowoodblock
                }
              }
            }
          #}
          #{ \context Voice \notemode { $mus } #})))))

m = {
%\time 2/2
%\time 3/4
e''4 e' e' e'
\time 5/8
8 8 8 8 8
}

\score {
  \m
}

\score {
  \countTwoBarsBefore \m
  \midi { \tempo 4=160 }
}


HTH,
  Harm

harm6

Ein weiteres Problem:
`countTwoBarsBefore' funktioniert schlecht wenn die Musik mit einem Auftakt beginnt.
Ich schau mal, ob das geregelt werden kann.

Gruß,
  Harm

harm6

Sollte jetzt auch mit Auftakten funktionieren.


\version "2.19.48"

countTwoBarsBefore =
#(define-music-function (mus)(ly:music?)
  (let* ((time-sig '())
         (partial-set '()))
    (music-map
      (lambda (m)
        (if (eq? (ly:music-property m 'name) 'PartialSet)
            (begin
              (if (not (pair? partial-set))
                  (set! partial-set (cons m partial-set)))
              m)
            (begin
              (if (not (pair? partial-set))
                  (set! partial-set (cons '() partial-set)))
              m))
        (if (eq? (ly:music-property m 'name) 'TimeSignatureMusic)
            (begin
              (if (not (pair? time-sig))
                  (set! time-sig (cons m time-sig)))
              m)
            (begin
              (if (not (pair? time-sig))
                  (set! time-sig (cons '() time-sig)))
              m)))
      mus)
    (let* ((num
             (if (null? (car time-sig))
                 4
                 (ly:music-property (car time-sig) 'numerator)))
           (denom
             (if (null? (car time-sig))
                 4
                 (ly:music-property (car time-sig) 'denominator)))
           (time-sig-frac (cons num denom))
           (partial-dur (ly:music-property (car partial-set) 'duration))
           (length-before
             (ly:moment-sub
               (ly:make-moment (* 2 (/ num denom)))
               (ly:music-duration-length (car partial-set))))
           (to-preclude (ly:music-compress #{ \skip 1 #} length-before))
           (drum-counter
             #{
               \context DrumVoice
                 \drummode {
                   \time #time-sig-frac
                     \withMusicProperty
                       #'duration
                       #(ly:make-duration (ly:intlog2 denom))
                     hiwoodblock
                     
                     \repeat unfold #(1- num) {
                       \withMusicProperty
                         #'duration
                         #(ly:make-duration (ly:intlog2 denom))
                       lowoodblock
                     }
                     \withMusicProperty
                       #'duration
                       #(ly:make-duration (ly:intlog2 denom))
                     hiwoodblock
                     \repeat unfold
                       #(ceiling
                         (* denom
                            (- (ly:moment-main length-before)
                               1
                               (/ 1 denom))))
                     {
                       \withMusicProperty
                         #'duration
                         #(ly:make-duration (ly:intlog2 denom))
                       lowoodblock
                     }
                 }
             #}))
      (make-simultaneous-music
        (list
          drum-counter
          #{ \new Voice \notemode { $to-preclude $mus  } #})))))

m = {
%\time 2/2
%\time 3/4
\partial 4. e''4.
e''4 e' e' e'
\time 5/8
8 8 8 8 8
}

\score {
  \m
}

\score {
  \countTwoBarsBefore \m
  \midi { \tempo 4=160 }
}


Bis zum nächsten bug ...

Gruß,
  Harm

martinusbaum

hallo,
vielen Dank
a) für die Nachhilfe in der Forennutzung
b) für die Lösung!