Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: erich am Samstag, 26. März 2016, 09:34
-
Hallo und frohe Ostern
Mit dem Script
\version "2.18.2"
#(define function
(lambda(x)
(cond ((eq? #t) (begin (display-scheme-music x) x))
(else x))
) )
test =
#(define-music-function (parser location original-music)
(ly:music?)
(music-map
function
original-music )
)
\score {
\new Voice {\test {e'1 <g' c''>1}}
}
werden alle Objekte ausgegeben, die mit make-music überschrieben sind.
Was muss ich in der cond-Anweisung statt (eq? #t) setzen, sodass nur das EventChord-Objekt ausgegeben wird?
Gruß
Erich
-
Verschiedene Möglichkeiten:
\version "2.18.2"
#(define function
(lambda(x)
(cond ;; (1) Vergleich des Namens, via (ly:music-property x 'name)
((eq? (ly:music-property x 'name) 'EventChord)
(begin (display-scheme-music x) x))
;; (2) Vergleich des Namens, via (music-is-of-type? x 'event-chord)
;; Nach meiner Erfahrung klappt das aber nicht immer
((music-is-of-type? x 'event-chord)
(begin (display-scheme-music x) x))
;; (3) Filter nach 'EventChord via (extract-named-music x 'EventChord)
;; Gibt eine Liste aus.
;; Je nach Absicht das elegenteste
(#t
(let ((ev-chords-list (extract-named-music x 'EventChord)))
(begin
(display-scheme-music ev-chords-list)
x)))
(else x))))
test =
#(define-music-function (parser location original-music)
(ly:music?)
(music-map
function
original-music ))
\score {
\new Voice { \test { e'1 <g' c''>1 } }
}
HTH,
Harm
P.S.
Du weißt das (eq? #t) immer #t zurüchgibt?
-
Hallo Harm
"HTH" - ich hab's nachgeschlagen: „Hoffe das hilft weiter“
Vielen Dank, jaaaaaaaaaaaa, es hat geholfen. Der salvatorische Hinweis ließ mich schmunzel; aber man kann ja nie wissen!
Herlichen Gruß
Erich