Innerhalb einer Variablendefinition eine weitere Variable 'mitschneiden'

Begonnen von Arnold, Freitag, 24. November 2017, 18:05

« vorheriges - nächstes »

Arnold

Hallo,

Ich wollte (schon lange) »im Fluß einer Variablendefinition« (z. Bsp. Abschrift einer einzelnen Stimme) einen Abschnitt als weitere Variable definieren, um diesen Abschnitt dann (in der gleichen übergeordneten Variablendefinition) wiederzuverwenden, und auf diese Weise im Quelltext die sequentielle Struktur des Notenblatts beigehalten.
Den Namen »tee« habe ich von der Unix-Kommandozeilenanwendung übernommen.

Die »Dal Segno al Fine«-Aufgabe läßt sich dann auf folgende Weise lösen:
\version "2.19.80"
tee = #(define-music-function (name mus) (string? ly:music?)
  (ly:parser-define! (string->symbol name) mus)
  mus)

\tagGroup #'(Part Score Midi)

Music = {
  g'1
  \inStaffSegno
  \repeat volta 2 \tee MusicRi {
    c''1
    e''1_\markup \halign #-1.5 "Fine"
  }
  \repeat volta 2 {
    g''1
    d''1_\markup \halign #-0.2 \column {
     \right-align "D.S. al Fine" \right-align "e poi"
    }
  }
  \tag #'Midi {
    \MusicRi
  }
  \mark "    Trio"
  \repeat volta 2 {
    b'1
    c''1
  }
}

\score {
  \keepWithTag #'Part
  \Music
  \header { piece = "Einzelstimme (\\keepWithTag #'Part) – analog dazu für die Partitur (\\keepWithTag #'Score)" }
}

\score {
  \unfoldRepeats
  \keepWithTag #'Midi
  \Music
  \header { piece = "für MIDI-Ausgabe (\\unfoldRepeats \\keepWithTag #'Midi)" }
}

Falls das mehrere Anwender als »genial (und einfach)« bewerten, könnte man anregen, das in die Standardfunktionen von LILYPOND zu übernehmen.

Arnold

(Version im Beispiel ergänzt)

Malte

Kieren MacMillan hat auf der englischen Liste nach etwas ähnlichem gefragt, Harm hat diesen Thread hier verlinkt. Erste Reaktionen: Kieren fände sowas sehr praktisch, David Kastrup hat einiges einzuwenden. Also ja, einfach, aber noch nicht genial, weil diverse Seiteneffekte.

Arnold

Ja, Malte, es war der erste Wurf, und daruch sicher nicht ganz ausgereift.

Und da ich in meinen (einfachsten) Beispielen keine Probleme hatte, habe ich auch noch kein ly:music-deep-copy eingebaut.
Um die Schreibweise der Variablennamen bei der Definition gleich aussehen zu lassen, habe ich den Typ String verwendent, so wie der Typ String ja letztlich vom Parser bei der "normalen Variablendefinition" [ABC = { ... }] zum intern verwendeten Symbol gewandelt wird.
Da das tee quasi eine »gekapselte Variablendefinition mit sofortiger Weitergabe« ist, war für mich klar, daß ein eventuelles \relative innerhalb definiert werden muß. In meinem Berufsumfeld nennt man so etwas schlichtweg »trainings issue«. Würde ich mit einer Scheme-Music-Function versuchen, Schnipsel (z. Bsp. zwischen zwei markups) auszuschneiden und neu zusammenzusetzen, hätte ich die gleichen Beschränkungen, oder einen nicht absehbaren Programmieraufwand.
Ob ich nun mit \tag #'U \tee x { a1 } eine Varible definiere und deren Erscheinen später wieder herausfiltere, oder ob ich die Variable vorher definiere und dann nur deren Erscheinung herausfiltere, bleibt vom Geschehen her gleich.

Zustimmen kann ich, daß diese tee-Funktion eher etwas für den erfahrenen Lilypond-Anwender ist, weniger für den Anfänger, der die Struktur der Variablendefinition noch nicht versteht.
Den größten Nutzen bringt es mir wenn ich Noten abschreibe, weil ich dann den Notenschriftfluß der Vorlage beibehalten kann.

Diese Funktion kann und soll sich ruhig weiterentwicklen. Vielleicht wird es ja in ferner Zukunft eine Lilypond-Interne Lösung die alle Eventualitäten abdeckt und von den unerfahrensten Anfängern problemlos verwendet werden kann - fast so gut wie ein Musikinstrument spielen zu können ohne Unterricht genommen zu haben.

Arnold.

Arnold

Hallo,

die neueste Version von meinem »tee«:

  • alternativ kann ein Symbol (wie intern referenziert) oder ein String (wie vom Parser in »xxx = { ... }« interpretiert) als Name angegeben werden.
  • Ein zusätzliches ly:music-deep-copy verhindert, daß z. Bsp. ein vorangesetztes remove-with-tag destruktiv auf das abgespeicherte Musik-Schnipsel wirkt

\version "2.19.80"

tee = #(define-music-function (name mus) (string-or-symbol? ly:music?)
  (ly:parser-define! (if (symbol? name) name (string->symbol name)) mus)
  (ly:music-deep-copy mus))


Und, wie in der Vergangenheit bereits gesagt,
der 'Vorteil' gegenüber der Methode, die Elemente vorher zu definieren und später nur noch zu referenzieren, liegt 'nur' darin, daß die 'räumliche Reihenfolge der Musik-Anweisungen' in der LY-Datei näher am 'Layout eines abzuschreibenden Notenblattes' liegt.

Arnold