Autor Thema: Ignore Manual Beams  (Gelesen 1349 mal)

ingmar

  • Member
Ignore Manual Beams
« am: Sonntag, 28. Februar 2016, 08:18 »
Ich habe eine Variable, die 'Manual Beams' enthält, also eckige Klammern - Angaben darüber, welche Note an einem gemeinsamen Balken hängen sollen:

\version "2.18.2"
MUSIC = \relative c'' { c4 b8 g16[ a b c] d8 }
\score { \MUSIC }

Meine Angaben überschreiben also die automatische (Default-)Anordnung von Balken.

Nun möchte ich aber die Noten meiner Variablen nach der automatischen Methode darstellen. Meine Manual Beams sollen also ignoriert werden:

\score { \ignoreManualBeams {\MUSIC }}
Wie gehe ich das Problem am besten an?

Gruß, danke,
--ingmar

fugenkomponist

  • Member
Re: Ignore Manual Beams
« Antwort #1 am: Sonntag, 28. Februar 2016, 09:39 »
\version "2.18.2"

ignoreManualBeams =
#(define-music-function (parser location music) (ly:music?)
   (music-map
    (lambda (m)
      (if (not (null? (ly:music-property m 'articulations)))
          (ly:music-set-property! m 'articulations
            (filter
             (lambda (a)
               (not (or (eq? (ly:music-property a 'name) 'BeamEvent)
                        (eq? (ly:music-property a 'name) 'BeamForbidEvent))))
             (ly:music-property m 'articulations))))
      m)
    music))

MUSIC = \relative c'' { c4 b8 g16[ a b c-.] d8 d4-> d8\noBeam c b a g2 }

\score { \displayMusic \MUSIC }
\score { \displayMusic \ignoreManualBeams \MUSIC }

[ und ] sind nichts anderes als Artikulationen vom Typ BeamEvent. Außerdem gibts ja noch \noBeam, welches eine Artikulation namens BeamForbidEvent einfügt, darum hab ich mich gleich mit gekümmert.

Die Funktion \ignoreManualBeams macht nun nichts anderes, als Einträge BeamEvent und BeamForbidEvent aus Listen 'articulations aller Musik-Events rauszufiltern. Die Abfrage in Zeile 7 ist nur dafür da, dass keine neue, leere Liste 'articulations angelegt wird, wenn eine Note (oder auch irgendwas anderes) vorher keine Artikulationen hatte.

Falls dich irgendwelche Detail näher interessieren, frag gerne nach :)

\displayMusic ist nachher natürlich nicht mehr nötig, hier nur für die Veranschaulichung der internen Struktur.

Edit: Sorry, ich hab natürlich jetzt deine eigentliche Frage „Wie gehe ich das Problem am besten an?“ überhaupt nicht beantwortet, sondern dir stattdessen eine fertige Lösung serviert … Es hilft immer, erstmal \displayMusic auf alles draufzuschmeißen. Dann hab ich gesehen, gibts da diese Liste 'articulations, wo das drin ist, ich brauchte also eine Filterfunktion und wurde hier fündig. Und die Funktionen music-map, ly:music-property und ly:music-set-property! muss man einfach kennen, die braucht man fast immer, wenns darum geht, irgendwelche Eigenschaften von Musik zu bearbeiten. Auf die Abfrage in Zeile 7 bin ich gekommen, weil ich in der Ausgabe von \displayMusic plötzlich lauter leere 'articulations-Listen gesehen habe (ergibt ja auch Sinn, nachdem ly:music-property '(), also ne leere Liste, zurückgibt, wenn nichts da ist).
« Letzte Änderung: Sonntag, 28. Februar 2016, 10:02 von fugenkomponist »