Allgemein > Hilfe beim Einstieg in Lilypond
midi output mit verschiedener dynamic (erst forte, dann piano) für \repeat volta
ingmar:
Ich komme nochmal mit meinem an anderer Stelle geäußerten Vorschlag: Was spricht dagegen, die Formteile in Variablen abzulegen und für die Partitur so und für MIDI anders zusammenzumontieren?
Also, in Pseudocode:
A-Teil = { .. musik 1 ..}
B-Teil = { .. musik 2 ..}
score = ||: \A :||: \B :||
midi = \forte \A \piano \A \forte \B \piano \B
Es kommt natürlich darauf an, was du genau willst und brauchst, aber manchmal muss man nicht alles automatisieren.
Gruß,
--ingmar
Arnold:
--- Zitat von: ingmar am Freitag, 3. Juli 2015, 13:19 ---Ich komme nochmal mit meinem an anderer Stelle geäußerten Vorschlag: Was spricht dagegen, die Formteile in Variablen abzulegen und für die Partitur so und für MIDI anders zusammenzumontieren?
...
--- Ende Zitat ---
Hallo,
der ganze Aufwand eigentlich nur, damit ich die Definitionen beisammen halten kann.
Da diese wiederholungslaufabhängige Dynamik auch in der Mitte dieser Abschnitte vorkommen kann, habe ich in der Vergangenheit auch schon drei, mit Tags versehene Dynamikeintragungen gesetzt: a) für den Druck b) für den ersten Lauf c) für den zweiten Lauf.
Ich spare mir mit diesen Routinen (zumindest weitgehend) den parallelen Aufbau von zwei Wiederholungsstrukturen (PDF mit \repeat und MIDI mit sequentieller Musik).
Und bei den parallelen Musikstrukturen (für die Partitur / gesamtmidi) das ganze noch einmal parallel aufbauen.
Es sähe also in etwa so aus, dabei benutze ich aber schon eine Funktion welche erste mit 2.20.0 kommen wird um Code zu sparen:
--- Code: ---\tagGroup #'(PDF RunOne RunTwo) % in der aktuellen 2.19.x enthalten
musicPDF = {
\A
\repeat volta 2 { \keepWithTag #'PDF \B }
\alternative { { \C } { \D } }
\repeat volta 2 { \keepWithTag #'PDF \E }
\F
\bar "|."
}
musicMIDI = {
\A
\keepWithTag #'RunOne \B
\C
\keepWithTag #'RunTwo \B
\D
\keepWithTag #'RunOne \E
\keepWithTag #'RunTwo \E
\F
\bar "|."
}
--- Ende Code ---
Und bei Vielfach-Wiederholungen (repeat volta 3 oder mehr) und gemeinsamen Volta-Klammern (1.-2. | 3.) kommen noch mehr \keepWithTag hinzu.
Selbstredend, ein höherer Aufwand loht sich nur bei entsprechender Nutzung, also bei längeren Stücken.
Arnold
Arnold:
So, und jetzt mein Ergebnis, das alle meine Test bestanden hat.
Dabei habe ich noch ein paar Funktionen umbenannt, damit die Namen sich besser in des Gefüge der Standardnamen einfügen. Und es gibt jetzt auch eine Funktion, nur die \repeat-Kommandos welche mit einem Tag markiert sind aufzufalten.
Der Code:
--- Code: ---\version "2.18.2"
% getestet mit den Versionen 2.14.2, 2.16.0, 2.18.2 und 2.19.13
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definitionen und Deklarationen:
#(define (make-dynamic-script-with-unfold-data str ufd)
(make-music 'AbsoluteDynamicEvent
'text str
'unfold-list ufd))
#(define (select-dynamic-by-key key mus)
(define (selection-to-use-countdown al k)
(if (pair? al)
(let ((sel (ly:assoc-get k al '())))
(if (and (null? sel) (integer? k) (> k 0))
(selection-to-use-countdown al (1- k))
sel))
'()))
(define (select-this-dynamic-by-key key ade)
(let ((switchlist (ly:music-property ade 'unfold-list)))
(if (not (null? switchlist))
(let ((new-text (selection-to-use-countdown switchlist key)))
(if (and (null? new-text)
(pair? switchlist)
(pair? (car switchlist)))
(set! new-text (cdar switchlist)))
(if (not (null? new-text)) (begin
(ly:music-set-property! ade 'text new-text)
(ly:music-set-property! ade 'unfold-list '())))))))
(let
((name (ly:music-property mus 'name))
(key-is-integer (integer? key))
(key-is-symbol (symbol? key)))
(if (or (eq? name 'NoteEvent)
(eq? name 'SkipEvent)
(eq? name 'RestEvent)
(eq? name 'MultiMeasureRestMusic))
(let ((articul (ly:music-property mus 'articulations)))
(for-each (lambda (a) (let ((sname (ly:music-property a 'name)))
(if (eq? sname 'AbsoluteDynamicEvent)
(select-this-dynamic-by-key key a)))) articul))
(if (eq? name 'EventChord)
(let ((es (ly:music-property mus 'elements)))
(for-each (lambda (a) (let ((sname (ly:music-property a 'name)))
(if (eq? sname 'AbsoluteDynamicEvent)
(select-this-dynamic-by-key key a)))) es)))))
mus)
#(define (split-dynamic-and-unfold-repeats tagged-reps symb mus)
(define (any-eq? tags tag-or-taglist)
(if (pair? tag-or-taglist)
(if (memq (car tag-or-taglist) tags)
#t
(any-eq? tags (cdr tag-or-taglist)))
(if (memq tag-or-taglist tags) #t #f)))
(define (mus-is-tagged mus tag-or-taglist)
(if (boolean? tag-or-taglist)
tag-or-taglist
(let ((tags (ly:music-property mus 'tags)))
(any-eq? tags tag-or-taglist))))
(let
((name (ly:music-property mus 'name)))
(if (or (and (not tagged-reps)
(eq? name 'VoltaRepeatedMusic))
(and tagged-reps
(or (eq? name 'VoltaRepeatedMusic)
(eq? name 'UnfoldedRepeatedMusic)
(eq? name 'TremoloRepeatedMusic)
(eq? name 'PercentRepeatedMusic))
(mus-is-tagged mus symb)))
(let
((count (ly:music-property mus 'repeat-count))
(e (ly:music-property mus 'element))
(es (ly:music-property mus 'elements))
(len (length (ly:music-property mus 'elements)))
(new-es '()))
(do ((i 1 (1+ i))) ((> i count))
(set! new-es (append new-es (cons
(music-map (lambda (m) (select-dynamic-by-key i m))
(ly:music-deep-copy e))
'())))
(if (not (null? es))
(let ((idx (1- (if (> i len) len i))))
(set! new-es (append new-es (cons
(music-map (lambda (m) (select-dynamic-by-key i m))
(ly:music-deep-copy (list-ref es idx)))
'())))))
(set! mus (make-music 'SequentialMusic 'elements new-es))))))
mus)
#(define (int-or-symb? x)
(or (integer? x) (symbol? x)))
selectDynamic =
#(define-music-function (parser location key mus)
(int-or-symb? ly:music?)
(music-map (lambda (m) (select-dynamic-by-key key m)) mus))
splitDynamicsUnfoldVoltaRepeats =
#(define-music-function (parser location mus)
(ly:music?)
(music-map
(lambda (m) (split-dynamic-and-unfold-repeats #f '() m))
mus))
splitDynamicsUnfoldRepeatsWithTag =
#(define-music-function (parser location tags mus)
(scheme? ly:music?)
(music-map
(lambda (m) (split-dynamic-and-unfold-repeats #t tags m))
mus))
splitDynamicsUnfoldAllRepeats =
#(define-music-function (parser location mus)
(ly:music?)
(music-map
(lambda (m) (split-dynamic-and-unfold-repeats #t #t m))
mus))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Anwender-Setup:
mfxppyffText = \markup \center-align \column {
\center-align \line { \normal-text "1." \dynamic "mf" }
\center-align \line { \normal-text "2." \dynamic "pp" }
\center-align \line { \normal-text "beim D.C." \dynamic "ff" }
}
mfxppyffList = #'(( 1 . "mf")
( 2 . "pp")
(DC . "ff"))
mfxppyff = #(make-dynamic-script-with-unfold-data mfxppyffText mfxppyffList)
music = {
\repeat volta 2 {
a'1\mfxppyff
}
\alternative {
{ b'1 }
{ c''1 }
}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Anzeigen und Ausführung:
\markup \bold "geschriebene Musik:"
{ \music }
\markup \bold "diese entfalten unter Berücksichtigung der wechselnden Dynamik:"
{ \splitDynamicsUnfoldVoltaRepeats \music }
\markup \column {
\bold "von der geschriebenen Musik die »Da Capo«-Dynamik übernehmen:"
"(mit Wiederholung, ansonsten suche »senzaRipet« im LSR)"
}
{ \selectDynamic #'DC \music }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%{ %%% weitere Beispiele:
{ \selectDynamic #1 \music } % oder die Nummer 1 (Ganzzahl)
{ \selectDynamic #2 \music } % oder die Nummer 2 (Ganzzahl)
{ \selectDynamic #3 \music } % bei Ganzzahl: eventuell nächst kleinere Nummer nehmen
{ \selectDynamic #0 \music } % oder das erste Element der 'alist' nehmen
musicII = {
\tag #'TAG1 \repeat unfold 2 { a'1\mfxppyff }
\tag #'TAG2 \repeat unfold 2 { a'1\mfxppyff }
\tag #'TAG3 \repeat volta 2 { a'1\mfxppyff }
}
{ \splitDynamicsUnfoldRepeatsWithTag #'TAG1 \musicII }
{ \splitDynamicsUnfoldRepeatsWithTag #'(TAG1 TAG3) \musicII }
{ \splitDynamicsUnfoldAllRepeats \musicII }
%}
--- Ende Code ---
Also auf zu großen Taten! (Partitur mit 50 Einzeielstimmen, jede mit 10 Wiederholungen welche wechselnde Dynamik enthalten - ich habe zuhause eine modifizierte Version von timidity, damit kann ich eine von Lilypond erstellte MIDI-Datei mit 60 Musikspuren in eine WAV-Datei umwandeln).
Arnold
ulanger:
Hallo zusammen,
vielen Dank für eure Mühe. Entschuldigt meine verspätete Reaktion, nachdem es innerhalb der ersten Wochen keine Reaktion gab, glaubte ich keiner weiß eine Lösung, oder ich hätte (unbewust) gegen die Netikette verstoßen.
Heute gab es seit Monaten für mich erneut konkreten Anlass das Forum wieder aufzusuchen (Frage zum Cantus Firmus) und stelle mit Freude fest: Manchmal braucht's einfach nur Geduld.
Also nochmals vielen Dank an Alle; ich mach mich jetzt daran eure Beiträe zu verstehen und umzusetzen.
Liebe Grüße, ulanger
Navigation
[0] Themen-Index
[*] Vorherige Sete
Zur normalen Ansicht wechseln