Autor Thema: Code Snippet #507 (ghost voice) - Umkehrung wie? (gelöst)  (Gelesen 2216 mal)

Manuela

  • Member
Code Snippet #507 (ghost voice) - Umkehrung wie? (gelöst)
« am: Sonntag, 31. Juli 2016, 18:02 »
Das Code Snippet #507 http://lsr.di.unimi.it/LSR/Item?id=507 ersetzt alle Noten durch s.
Praktisch wäre jetzt auch noch die Umkehrung, also das Entfernen aller Artikulationszeichen, Bögen etc.

Meine Modifikation schafft nur Akkorde und entfernt Einzelnoten. Leider durchschaue ich das System immer noch zu wenig  :-[

\version "2.19.37"

%% http://lsr.dsi.unimi.it/LSR/Item?id=507

%% LSR This snippet was contributed by Gilles Thibault, on an idea by Eluze.
%% updated by Gilles Thibault on Feb. 2014

#(define (MM->Script-text evt)
   (if (eq? 'MultiMeasureTextEvent (ly:music-property evt 'name))
       (let ((res (make-music 'TextScriptEvent)))
         (newline) (display (ly:music-mutable-properties evt)) ; if you are curious ...
         (for-each (lambda(props)
                     (ly:music-set-property! res (car props) (cdr props)))
           (ly:music-mutable-properties evt))
         res)
       evt))

ghostMusic =
#(define-music-function (parser location music) (ly:music? )
   (map-some-music
    (lambda(x)
      (let
       ((dur (ly:music-property x 'duration #f)))
       (and
        (or dur (eq? 'EventChord (ly:music-property x 'name)))
        (let
         ((skip (make-music 'SkipEvent 'duration
                  (or dur (make-duration-of-length (ly:music-length x)))))
          (artis (let ((elts (ly:music-property x 'elements #f)))
                   (if elts
                       (filter
                        (lambda(y)   ;; EventChord
                          (not (eq? 'NoteEvent (ly:music-property y 'name))))
                        elts)
                       (map MM->Script-text (ly:music-property x 'articulations '()))))))
         (ly:music-set-property! skip 'articulations artis)
         skip))))
    music))

nurMusic =
#(define-music-function (parser location music) (ly:music? )
   (map-some-music
    (lambda(x)
      (let
       ((dur (ly:music-property x 'duration #f)))
       (and
        (or dur (eq? 'EventChord (ly:music-property x 'name)))
        (let
         ((skip (make-music 'SkipEvent 'duration
                  (or dur (make-duration-of-length (ly:music-length x)))))
          (artis (let ((elts (ly:music-property x 'elements #f)))
                   (if elts
                       (filter
                        (lambda(y)   ;; EventChord
                           (eq? 'NoteEvent (ly:music-property y 'name)))
                        elts)
                       (map MM->Script-text (ly:music-property x 'articulations '()))))))
         (ly:music-set-property! skip 'articulations artis)
         skip))))
    music))

notes = { <a>2-"hello" b4 r-"1"  R1^"2" b2 a-"bye" <c e g c' e' g'>1-"oho ;-)" }
#'()
\notes
\ghostMusic \notes
\nurMusic \notes
« Letzte Änderung: Sonntag, 21. August 2016, 11:04 von Manuela »

fugenkomponist

  • Member
Re: Code Snippet #507 (ghost voice) - Umkehrung wie?
« Antwort #1 am: Sonntag, 31. Juli 2016, 21:31 »
Praktisch wäre jetzt auch noch die Umkehrung, also das Entfernen aller Artikulationszeichen, Bögen etc.
Was genau ist „etc.“? Das Original-Snippet lässt ja sogar die Zahlen von Mehrtaktpausen stehen, soll sowas auch weg, oder meinst du wirklich nur Artikulationen und Textbeschriftungen?

Manuela

  • Member
Re: Code Snippet #507 (ghost voice) - Umkehrung wie?
« Antwort #2 am: Sonntag, 31. Juli 2016, 21:41 »
Was genau ist „etc.“? Das Original-Snippet lässt ja sogar die Zahlen von Mehrtaktpausen stehen

Sagen wir es umgekehrt: es sollen nur Noten und Pausen stehen bleiben, alles andere soll weg, sozusagen nur die "nackten" Noten. Wenn ich alle Noten als Akkorde setze, kommt bei meinem derzeitigen Code genau das raus, was ich will, mal abgesehen von den Pausen, die lassen sich nicht als Akkorde setzen.

Mehrtaktpausen u.ä. interessiert mich eher weniger, ich denke eher an Klaviermusik.
« Letzte Änderung: Sonntag, 31. Juli 2016, 21:43 von Manuela »

fugenkomponist

  • Member
Re: Code Snippet #507 (ghost voice) - Umkehrung wie?
« Antwort #3 am: Sonntag, 31. Juli 2016, 22:38 »
Hm, ok, ich muss zugeben, ich verstehe nicht ganz, was die Funktion macht …

Ich habe eine funktionierende Lösung von Grund auf neu geschrieben. Was dir bei der Rekonstruktion helfen könnte: case oder if, filter, ein lambda-Ausdruck, und Abfragen auf (ly:music-property … 'name)
Oder nachfragen, dass ich den kompletten Code rausrücke, aber vielleicht hilft dir schon das hier fürs Verständnis ;)
nurMusic =
#(define-music-function (parser location music) (ly:music? )
   (music-map
    (lambda (m)
      ; falls m vom Typ (bzw. music-property 'name) NoteEvent, RestEvent oder MultiMeasureRestMusic ist,
      ; entferne alle Artikulationen (leere die 'articulations-Liste)
      ; falls m vom Typ EventChord ist,
      ; entferne alle Artikulationen und
      ; filtere aus der Liste 'elements alle 'TextScriptEvents raus
    )
    music))

Manuela

  • Member
Re: Code Snippet #507 (ghost voice) - Umkehrung wie?
« Antwort #4 am: Sonntag, 31. Juli 2016, 22:56 »
Oder nachfragen, dass ich den kompletten Code rausrücke, aber vielleicht hilft dir schon das hier fürs Verständnis ;)
nurMusic =
#(define-music-function (parser location music) (ly:music? )
   (music-map
    (lambda (m)
      ; falls m vom Typ (bzw. music-property 'name) NoteEvent, RestEvent oder MultiMeasureRestMusic ist,
      ; entferne alle Artikulationen (leere die 'articulations-Liste)
      ; falls m vom Typ EventChord ist,
      ; entferne alle Artikulationen und
      ; filtere aus der Liste 'elements alle 'TextScriptEvents raus
    )
    music))

Ich fürchte, da müsste ich noch einige Stunden in das Durchforsten der Lilypond- und Scheme-Syntax investieren. Daher bitte ich gleich um den kompletten Code  :)

fugenkomponist

  • Member
Re: Code Snippet #507 (ghost voice) - Umkehrung wie?
« Antwort #5 am: Montag, 1. August 2016, 00:02 »
Sorry, dass ich es jetzt erst gelesen hab … hier ist er:
nurMusic =
#(define-music-function (parser location music) (ly:music? )
   (music-map
    (lambda (m)
      (case (ly:music-property m 'name)
        ((NoteEvent RestEvent MultiMeasureRestMusic)
         (ly:music-set-property! m 'articulations '()))
        ((EventChord)
         (ly:music-set-property! m 'articulations '())
         (ly:music-set-property! m 'elements
           (filter
            (lambda (e)
              (not (eq? 'TextScriptEvent (ly:music-property e 'name))))
            (ly:music-property m 'elements)))))
      m)
    music))
« Letzte Änderung: Montag, 1. August 2016, 00:04 von fugenkomponist »

Manuela

  • Member
Re: Code Snippet #507 (ghost voice) - Umkehrung wie?
« Antwort #6 am: Montag, 1. August 2016, 06:19 »
Danke fugenkomponist.

Falls du irgendetwas brauchst (VBA-Code z.B.  ;)  oder SQL ), wende dich an mich.

Update: habe es ausprobiert, funktioniert perfekt!
« Letzte Änderung: Freitag, 5. August 2016, 18:10 von Manuela »