Scheme-Unterschied for-each und map; scorify-music als music-function-wie?gelöst

Begonnen von Manuela, Montag, 5. Juni 2017, 11:37

« vorheriges - nächstes »

Manuela

Im alten Forum hat Harm dankenswerterweise Code zur Verfügung gestellt, um Scores per Scheme-Funktion zu erzeugen, ich poste hier mal ein Beispiel.

\version "2.19.56"

musI = \relative c' { e4 c d e }
musII = \relative c' { < e c >2 < d e > }

\markup "for-each"
#(for-each
  (lambda (p)
    (add-score
     (scorify-music #{ { \transpose c $p \musI } #}))
    (add-score
     (scorify-music #{ { \transpose c $p \musII } #})))
  (event-chord-pitches #{ < f g > #}))

\markup "map"
#(map
  (lambda (p)
    (add-score
     (scorify-music #{ { \transpose c $p \musI } #}))
    (add-score
     (scorify-music #{ { \transpose c $p \musII } #})))
  (event-chord-pitches #{ < f g > #}))

%% das funktioniert nicht
\markup "was mache ich hier falsch"
#(map
  (lambda (p)
    (add-score
     (scorify-music #{ {\transpose c $p \musI }
       } #}))
    (add-score (scorify-music #{ { \transpose c $p \musII } #})))
  (ly:make-pitch 2 0 0))


Wo liegt der Unterschied zwischen for-each und map? Es kommt in beiden Fällen das gleiche Ergebnis. Das dritte Beispiel liefert eine Fehlermeldung, wo liegt der Fehler?

Weiters würde ich das Ganze gerne in eine  Art make-music-function verpacken, was natürlich so wie unten stehend nicht geht, weil kein einzelner Musikausdruck zurück geliefert wird.

\version "2.19.56"

musI = \relative c' { e4 c d e }
musII = \relative c' { < e c >2 < d e > }

myTest =
#(define-music-function (mypitch)(ly:pitch?)
   (map
    (lambda (p)
      (add-score
       (scorify-music #{ { \transpose c $p \musI } #}))
      (add-score
       (scorify-music #{ { \transpose c $p \musII } #})))
    mypitch))

\markup "das funktioiert nicht"

\myTest e'


Danke für eure Hilfe
viele Grüße
-- Manuela

Malte

Zitat von: Manuela am Montag,  5. Juni 2017, 11:37
Im alten Forum hat Harm dankenswerterweise Code zur Verfügung gestellt, um Scores per Scheme-Funktion zu erzeugen, ich poste hier mal ein Beispiel.
Magst du das noch in deinem Beitrag oben verlinken?
Zitat
Wo liegt der Unterschied zwischen for-each und map? Es kommt in beiden Fällen das gleiche Ergebnis.
Die Reihenfolge, in der die Liste abgearbeitet wird und der Rückgabewert (den du hier einfach verwirfst), siehe Guile-1.8-Doku zu list mapping.
ZitatDas dritte Beispiel liefert eine Fehlermeldung, wo liegt der Fehler?
map kann nur auf eine Liste angewandt werden. (ly:make-pitch 2 0 0) ist keine Liste, du kannst aber per (list (ly:make-pitch 2 0 0)) eine einelementige Liste draus machen.* Desweiteren hast du dann noch ne } zu viel ;)
Zitat
Weiters würde ich das Ganze gerne in eine  Art make-music-function verpacken, was natürlich so wie unten stehend nicht geht, weil kein einzelner Musikausdruck zurück geliefert wird.
Eine music function heißt so, weil sie einen Musikausdruck zurück gibt. Du willst hier nichts zurück geben, sondern nur etwas tun, also gibts keinen Rückgabewert. Hierfür braucht man nicht define-music-function, sondern define-void-function (falls du andere Programmiersprachen kennst, ist dir void sicherlich ein Begriff). Außerdem brauchst du auch hier wieder eine Liste von pitches, bzw. weil du ja eh immer nur einen hast, kannst du dir das map und lambda sparen und den pitch direkt einsetzen:\version "2.19.56"

musI = \relative c' { e4 c d e }
musII = \relative c' { < e c >2 < d e > }

myTest =
#(define-void-function (mypitch) (ly:pitch?)
      (add-score
       (scorify-music #{ { \transpose c $mypitch \musI } #}))
      (add-score
       (scorify-music #{ { \transpose c $mypitch \musII } #})))

\markup "so gehts"

\myTest e'


* Edit: Natürlich kann man sich bei einer einelementigen Liste stattdessen auch das map sparen, siehe mein Code zur darauffolgenden Frage.

Manuela

Hallo Malte,

danke für die hilfreiche Antwort.

Hier die gewünschten Links zu den Themen im Archiv:

Wieder mal Scheme - for-each und define-music-function

Lilypond compiliert nicht, zu viele Contexte

Zitat von: Malte am Montag,  5. Juni 2017, 13:17
sondern define-void-function (falls du andere Programmiersprachen kennst, ist dir void sicherlich ein Begriff).

Ich hab's im Kopf, aber es fällt mir momentan nicht ein  ;D ;D ;D
ich weiß, der Witz ist nicht mehr ganz jung...
Danke für eure Hilfe
viele Grüße
-- Manuela