Autor Thema: defíne-music-function mappen (GELÖST)  (Gelesen 2829 mal)

Manuela

  • Member
defíne-music-function mappen (GELÖST)
« am: Dienstag, 17. Mai 2016, 22:48 »
Ich habe eine funktionierende music-function, die ich auf eine Liste anwenden möchte
etwa in der nachstehenden Art (die so nicht funktioniert)

Beispiel =
#(define-music-function (m1 m2 m3)
   (ly:music? ly:music? ly:music?)
   (map
    (lambda (m)
      #{ {
        \funktionierendemusicfunction $m $m2 $m3
        \break
         }
      #})
    (make-a-list-all-chords-from-music m1)
    ))
« Letzte Änderung: Mittwoch, 18. Mai 2016, 16:10 von Manuela »

fugenkomponist

  • Member
Re: defíne-music-function mappen
« Antwort #1 am: Mittwoch, 18. Mai 2016, 04:10 »
Was willst du erreichen? map nimmt ne Funktion und ne Liste und gibt auch eine Liste zurück. Keinen einzelnen Musikausdruck, wie define-music-function es braucht.

Mehr helfen geht nicht, funktionierendemusicfunction und make-a-list-all-chords-from-music sind nicht definiert ;)

Manuela

  • Member
Re: defíne-music-function mappen
« Antwort #2 am: Mittwoch, 18. Mai 2016, 11:15 »
Ich habe jetzt ein kompilierbares Beispiel erstellt

\version "2.19.37"

#(define (music-name x)
   (if (not (ly:music? x))
       #f
       (ly:music-property x 'name)))

#(define (music-elts x)
   (if (not (ly:music? x))
       #()
       (ly:music-property x 'elements)))

#(define (make-a-list-all-chords-from-music music)
   "Return a list of all Chords from @var{music}."
   (reverse!
    (let loop ((music music) (pitches '()))
      (let ((p (music-name music)))
        (if (eq? p 'EventChord)
            (cons music pitches)
            (let ((elt (ly:music-property music 'element)))
              (fold loop
                (if (ly:music? elt)
                    (loop elt pitches)
                    pitches)
                (music-elts music))))))))

TestTest =
#(define-music-function (music)
   (ly:music?)
   (make-sequential-music (make-a-list-all-chords-from-music music)
     ))

myMusik={  < c d e > c d < e f g >}

\TestTest \myMusik %% das klappt zufriedenstellend!

meinTest=
#(define-music-function (music)
   (ly:music?)
   (map
    (lambda (m)
      (let ((m1 (make-sequential-music (list m)))))
        ( #{ { $m1 } #} )
        )
    (make-a-list-all-chords-from-music music)
    ))

\meinTest \myMusik

\meinTest liefert einen Fehler, wahrscheinlich bzw. sicher habe ich falsch geklammert oder sonstwas wesentliches vergessen. Oder es geht grundsätzlich überhaupt ganz anders  ???
« Letzte Änderung: Mittwoch, 18. Mai 2016, 11:21 von Manuela »

fugenkomponist

  • Member
Re: defíne-music-function mappen
« Antwort #3 am: Mittwoch, 18. Mai 2016, 12:28 »
\meinTest liefert einen Fehler, wahrscheinlich bzw. sicher habe ich falsch geklammert […]
Ja, hast du. Die Fehlermeldung sagt zu Zeile 42 „Missing expression in (let ((m1 (make-sequential-music (list m)))))“. Und da hast dus: fünf Klammern auf, fünf zu, der let-Ausdruck ist zu, obwohl er noch nicht fertig ist/sein soll. Je nach Texteditor (z. B. in Frescobaldi) kann man eine solche falsche Klammerung an der Einrückung erkennen. So wäre richtig geklammert:
meinTest=
#(define-music-function (music)
   (ly:music?)
   (map
    (lambda (m)
      (let ((m1 (make-sequential-music (list m))))
        (#{
          { $m1 }
         #})))
    (make-a-list-all-chords-from-music music)))
Hier ist wie gesagt das Problem, dass du deine Musikfunktion nicht einen Musikausdruck, sondern eine Liste zurückgibt, deshalb wiederhole ich meine Frage: Was willst du genau erreichen, was soll \meinTest \myMusik zurückgeben?

Davon abgesehen lässt sich das ganze noch weit vereinfachen zu:
meinTest=
#(define-music-function (music)
   (ly:music?)
   (map
    (lambda (m)
      (make-sequential-music (list m)))
    (make-a-list-all-chords-from-music music)))
Funktioniert natürlich immer noch nicht, dürfte aber das sein, was du meintest:
Bei ( #{ { $m1 } #} ) sind die äußeren Klammern falsch/zu viel, die inneren geschweiften vermutlich überflüssig (du willst doch nicht nochmal alles in SequentialMusic schachteln, oder?). Statt #{ $m1 #} kannst du aber auch gleich m1 schreiben. Weiter gehts mit dem let-Ausdruck: statt (let ((x BLA)) x) geht doch genauso gut einfach BLA. Somit ergibt sich obiger Code ;)

Edit: Ich glaub, ich hab inzwischen ne Ahnung, was du mit dem map vorhattest, mir kam es nämlich spanisch vor, dass du im map aus den einzelnen Listenelementen jeweils einelementige Listen erstellst und auf die jeweils make-sequential-music raufschmeißt. Wolltest du vielleicht diese Funktion einfach auf die ganze Liste schmeißen?
meinTest=
#(define-music-function (music)
   (ly:music?)
   (make-sequential-music (make-a-list-all-chords-from-music music)))

\meinTest \myMusik

Als Analogie, um meine Denkweise zu veranschaulichen, nehmen wir das mal als Sortierfunktion: '(4 3 5 2) soll sortiert werden. Du hast nun per map aus jedem Listenelement eine einelementige Liste gemacht und die jeweils sortiert, ergibt '((4) (3) (5) (2)).  Stattdessen wärs viel einfacher: die Sortierfunktion auf die ganze Liste anwenden, ergibt '(2 3 4 5). Ist meine Glaskugelvermutung richtig? ;)
« Letzte Änderung: Mittwoch, 18. Mai 2016, 12:34 von fugenkomponist »

Manuela

  • Member
Re: defíne-music-function mappen
« Antwort #4 am: Mittwoch, 18. Mai 2016, 13:00 »

meinTest=
#(define-music-function (music)
   (ly:music?)
   (map
    (lambda (m)
      (let ((m1 (make-sequential-music (list m))))
        (#{
          { $m1 \break (...sonstige Lily-Musikausdrück) }
         #})))
    (make-a-list-all-chords-from-music music)))
Hier ist wie gesagt das Problem, dass du deine Musikfunktion nicht einen Musikausdruck, sondern eine Liste zurückgibt, deshalb wiederhole ich meine Frage: Was willst du genau erreichen, was soll \meinTest \myMusik zurückgeben?


Vielleicht ist es jetzt klarer. Natürlich könnte ich die Funktion vereinfachen, so wie es dort steht, ist es unnötig kompliziert.  ;)

Wie im Eingangsbeitrag erwähnt, habe ich eine Funktion geschrieben, die 3 Musikargumente hat. Wenn ich jetzt eine Liste von Musikausdrücken habe, wie es (make-a-list-all-chords-from-music music)erzeugt, dann möchte ich diese Funktion auf alle Elemente der Liste der Reihe nach anwenden und somit einen Output erhalten, der etwa durch Zeilenumbrüche getrennt ist.

In meinem (nicht) kompilierbaren Beispiel habe ich die Musikausgabe vereinfacht und meine Funktion weggelassen, es würde mir genügen, wenn $m1 einen gültigen ly:music?-Ausdruck ergeben würde, dann würde meine Funktion auch damit funktionieren.

Ich hoffe, ich habe jetzt erklären können, was ich eigentlich will.

Update: ich habe weiter probiert und bin auf das gekommen
meinTest=
#(define-music-function (music)
   (ly:music?)
   (map
    (lambda (m)
      (let ((m1 (make-sequential-music (list m))))
        #{  $m1 \break < c d e > #}
        )
      ( make-a-list-all-chords-from-music music)
      )
    )
   )

Die Fehlermeldung lautet jetzt In procedure map in expression (map (lambda # # ...)):
c:/users/manuela/appdata/local/temp/frescobaldi-eml85p/tmpedk068/let4.ly:43:4: Wrong number of arguments to #<primitive-generic map>
« Letzte Änderung: Mittwoch, 18. Mai 2016, 13:24 von Manuela »

fugenkomponist

  • Member
Re: defíne-music-function mappen
« Antwort #5 am: Mittwoch, 18. Mai 2016, 15:07 »
[…] dann möchte ich diese Funktion auf alle Elemente der Liste der Reihe nach anwenden und somit einen Output erhalten, der etwa durch Zeilenumbrüche getrennt ist.
Wichtige Information. Das erreichst du aber nicht, indem du weiterhin probierst, eine Liste statt eines einzelnen Musikausdrucks zurückzugeben … \break ist da angebracht, ja. Falls du mehrere \scores haben willst, reicht aber eine Musikfunktion einfach nicht, weil ja jeder \score einen einzelnen Musikausdruck enthält.
Zitat
[…] es würde mir genügen, wenn $m1 einen gültigen ly:music?-Ausdruck ergeben würde, dann würde meine Funktion auch damit funktionieren.
Tuts doch, nur danach machst du damit Murks.
Zitat
Update: ich habe weiter probiert und bin auf das gekommen
meinTest=
#(define-music-function (music)
   (ly:music?)
   (map
    (lambda (m)
      (let ((m1 (make-sequential-music (list m))))
        #{  $m1 \break < c d e > #}
        )
      ( make-a-list-all-chords-from-music music)
      )
    )
   )

Die Fehlermeldung lautet jetzt In procedure map in expression (map (lambda # # ...)):
c:/users/manuela/appdata/local/temp/frescobaldi-eml85p/tmpedk068/let4.ly:43:4: Wrong number of arguments to #<primitive-generic map>

Hier ist wiedre falsch geklammert, dein lambda-Ausdruck enthält sieben öffnende und sechs schließende Klammern. Damit erstreckt der sich noch auf „(make-a-list…“ und das zweite Argument für map, nämlich diese Liste, wird nicht gefunden.

Ich probiers jetzt nochmal: Eine Musikfunktion darf nur einen Ausdruck zurückgeben; du machst ne Liste aus Musikausdrücken, die aus einelementigen Listen erstellt wurden. Ich bemühe jetzt noch ein letztes Mal die Glaskugel:
meinTest=
#(define-music-function (music)
   (ly:music?)
   (make-sequential-music
    (map
     (lambda (m)
       #{
         $m \break < c d e >
       #})
     (make-a-list-all-chords-from-music music))))

\meinTest \myMusik
Hier ist richtig geklammert und make-sequential-music an nen sinnvollen Ort geschoben. Den let-Ausdruck brauchst du wie gesagt nicht. Die \breaks haben keinen Effekt, weil sie mitten im Takt auftreten, aber mit ganzen Noten sieht man ihn.

Manuela

  • Member
Re: defíne-music-function mappen
« Antwort #6 am: Mittwoch, 18. Mai 2016, 15:13 »

Ich probiers jetzt nochmal: Eine Musikfunktion darf nur einen Ausdruck zurückgeben; du machst ne Liste aus Musikausdrücken, die aus einelementigen Listen erstellt wurden. Ich bemühe jetzt noch ein letztes Mal die Glaskugel:
meinTest=
#(define-music-function (music)
   (ly:music?)
   (make-sequential-music
    (map
     (lambda (m)
       #{
         $m \break < c d e >
       #})
     (make-a-list-all-chords-from-music music))))

\meinTest \myMusik
Hier ist richtig geklammert und make-sequential-music an nen sinnvollen Ort geschoben. Den let-Ausdruck brauchst du wie gesagt nicht. Die \breaks haben keinen Effekt, weil sie mitten im Takt auftreten, aber mit ganzen Noten sieht man ihn.

Genau das wollte ich, 1000 Dank!!!  :) :) :) :)