Autor Thema: Vorzähler / metronome tick /snippet 876  (Gelesen 2630 mal)

martinusbaum

  • Member
Vorzähler / metronome tick /snippet 876
« am: Mittwoch, 12. Oktober 2016, 05:33 »
hallo,
da gibt es ein snippet [url][http://lsr.di.unimi.it/LSR/Item?id=876]

martinusbaum

  • Member
Re: Vorzähler / metronome tick /snippet 876
« Antwort #1 am: Mittwoch, 12. Oktober 2016, 05:53 »
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

  • Member
Re: Vorzähler / metronome tick /snippet 876
« Antwort #2 am: Mittwoch, 12. Oktober 2016, 06:52 »
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://liarchiv.joonet.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

  • Member
Re: Vorzähler / metronome tick /snippet 876
« Antwort #3 am: Mittwoch, 12. Oktober 2016, 12:02 »
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

  • Member
Re: Vorzähler / metronome tick /snippet 876
« Antwort #4 am: Mittwoch, 12. Oktober 2016, 19:12 »
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

  • Member
Re: Vorzähler / metronome tick /snippet 876
« Antwort #5 am: Donnerstag, 13. Oktober 2016, 03:20 »
Zitat von: harm
Hier 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

  • Member
Re: Vorzähler / metronome tick /snippet 876
« Antwort #6 am: Donnerstag, 13. Oktober 2016, 15:21 »
Ein weiteres Problem:
`countTwoBarsBefore' funktioniert schlecht wenn die Musik mit einem Auftakt beginnt.
Ich schau mal, ob das geregelt werden kann.

Gruß,
  Harm

harm6

  • Member
Re: Vorzähler / metronome tick /snippet 876
« Antwort #7 am: Donnerstag, 13. Oktober 2016, 17:21 »
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

  • Member
Re: Vorzähler / metronome tick /snippet 876
« Antwort #8 am: Montag, 14. November 2016, 21:32 »
hallo,
vielen Dank
a) für die Nachhilfe in der Forennutzung
b) für die Lösung!