Autor Thema: Scheme Liste in Musikoutput überführen  (Gelesen 1426 mal)

Manuela

  • Member
Scheme Liste in Musikoutput überführen
« am: Freitag, 25. März 2016, 22:39 »
Harm, dank deiner Hilfe habe ich doch etwas zustande gebracht, wenn es auch nicht besonders elegant sein mag. Zunächste wollte ich eine Liste von Paaren definieren, deren erstes Element die Musik, das 2. die Pitchliste ist, jedoch habe ich diese Komplexität nicht auf die Reihe gekriegt und behandle daher zwei einzelne Listen.

Nur beim letzten Schritt, der Ausgabe in Musik, hapert es, make-sequential-music bewirkt gar nichts.

\version "2.19.32"

\language "deutsch"

myMusik= < fis a d >
ChordI=\chordmode { d:m7 }
ChordII=\chordmode { d:7 }
ChordIII=\chordmode { d:9 }

#(define (pitch-equals? p1 p2)
   (and
    (= (ly:pitch-alteration p1) (ly:pitch-alteration p2))
    (= (ly:pitch-notename p1) (ly:pitch-notename p2))))

#(define myInput (sort (music-pitches myMusik) ly:pitch<?) )

#(define MusLis (list ChordI ChordII ChordIII ))

#(define mk-pitch
   ;; wir erschaffen eine Pitchliste aus der Musikliste
   (lambda (ls)
     (cond
      ;; wir haben fertig, wenn Liste leer ist
      ((null? ls) '())

      ;; wenn das Listenelement ein gültiger Musikausdruck ist
      ;; dann fügen wir ein die sortierte Pitchliste als Listenelement hinzu
      ((ly:music? (car ls))
       (cons (sort (music-pitches (car ls) ) ly:pitch<?)
         ;(cons (car l2) (vvv l1 (cdr l2)))
         (mk-pitch (cdr ls)))
       )
      ;; ansonsten machen wir mit dem Rest der Liste weiter
      (else (mk-pitch (cdr ls)))
      )
     )
   )

#(define is-in?
   ;; wir versuchen zu eruieren
   ;; ob alle Elemente der Liste l1 in l2 enthalten sind
   ;; genauer gesagt müssen nur notename und alteration stimmen
   ;; die Oktavlage interessiert uns nicht
   (lambda ( l1 l2 )
     ( cond
       ;; zunächst prüfen wir, ob die Testliste bereits erschöpft ist
       ;; wenn ja dann ist es wahr
       ((null? l1) #t
         )
       ;; wenn die Zielliste erschöpft ist
       ;; ist es falsch
       ((null? l2) #f
         )
       ;; wir überprüfen das erste Element der Testliste
       ;; wenn es gleich dem ersten Element der Zielliste ist
       ;; dann können wir mit dem restlichen Teil der Testliste fortsetzen
       ((pitch-equals? (car l1) (car l2))
        (is-in? (cdr l1) l2)
        ;'equalPitch
        )
       ;; ansonsten versuchen wir es mit dem folgenden Element der Zielliste
       (else (is-in? l1 (cdr l2))
         )
       )
     )
   )

#(define www
   ;; wir wollen jetzt die Musikausdrücke in eine Liste hängen
   ;; l1 ist unsere Testliste
   ;; l2 enthält die Pitches
   ;; l3 ist die Musikliste
   (lambda (l1 l2 l3)
     ( cond
       ;; wenn die Akkordliste leer ist, dann verabschieden wir uns
       ((null? l2) '()
         )
       ;; wenn die Testliste leer ist, dann ist es auch aus
       ((null? l1) '() )
       ;; wenn die Noten der Testliste im ersten Akkord enthalten sind,
       ;; wird der Akkord hinzugefügt
       ((is-in? l1 (car l2))
        (cons (car l3) (www l1 (cdr l2) (cdr l3)))
        )
       ;; wenn die Noten von l1 nicht im ersten Akkort enthalten sind
       ;; machen wir mit der restlichen Akkordliste weiter
       (else (www l1 (cdr l2) (cdr l3))
         )
       )
     )
   )

#(define PitLis (mk-pitch MusLis))

#(make-sequential-music (www myInput PitLis MusLis))

#(display (length (www myInput PitLis MusLis)))

harm6

  • Member
Re: Scheme Liste in Musikoutput überführen
« Antwort #1 am: Samstag, 26. März 2016, 11:00 »
Hallo Manuela,

ich habe mir Deinen Code nicht im einzelnen angesehen, aber ändere
#(make-sequential-music (www myInput PitLis MusLis))
zu
$(make-sequential-music (www myInput PitLis MusLis))

Dann kriegst Du zumindest etwas gedruckt, obs das gewünschte ist, kann ich natürlich nicht sagen. ;)

Gruß,
  Harm

Manuela

  • Member
Re: Scheme Liste in Musikoutput überführen
« Antwort #2 am: Samstag, 26. März 2016, 15:11 »
Super, Harm, danke, das klappt.

Hab zwar keine Ahnung wieso...

Jetzt habe ich endlich meine "Kleinen" auf 2.19.38 umgestellt. Das war wirklich lästig, die ständige Hin- und Herschalterei der Versionen vom StandPC zum Laptop.