Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: Manuela am Samstag, 26. März 2016, 19:43

Titel: Transponieren von Musiklisten / map /append-map
Beitrag von: Manuela am Samstag, 26. März 2016, 19:43
Einen großen Teil meines Vorhabens habe ich schon gelöst, dank Harm  :D
Die Ausgabe klappt auch ganz wunderbar

Ich kriege es wieder einmal nicht gebacken  :(

Ich möchte eine Liste von Musikausdrücken transponieren, sodass ich eine Liste erhalte, die zunächst die untransponierte Musik, dann die mit dem 1. Pitch transponierte, dann die mit dem 2. Pitch transponierte usw erhalte

\version "2.19.38"

\language "deutsch"

Tonleitern=< des d es >

ChordI = \chordmode { c:1 }
ChordII = \chordmode { c:2 }
ChordIII = \chordmode { c:3 }
ChordIV = \chordmode { c:4 }
ChordV = \chordmode { c:5 }
ChordVI = \chordmode { c:6 }
ChordVII = \chordmode { c:7 }
ChordVIII = \chordmode { c:8 }
ChordIX = \chordmode { c:9 }
ChordX = \chordmode { c:10 }
ChordXI = \chordmode { c:11 }
ChordXII = \chordmode { c:12 }
ChordXIII = \chordmode { c:13 }
ChordXIV = \chordmode { c:13.11 }
ChordXV = \chordmode { c:14 }
ChordXVI = \chordmode { c:m }
ChordXVII = \chordmode { c:m6 }
ChordXVIII = \chordmode { c:m7 }

#(define MusLis (list
                 ChordI
                 ChordII
                 ChordIII
                 ChordIV
                 ChordV
                 ChordVI
                 ChordVII
                 ChordVIII
                 ChordIX
                 ChordX
                 ChordXI
                 ChordXII
                 ChordXIII
                 ChordXIV
                 ChordXV
                 ChordXVI
                 ChordXVII
                 ChordXVIII ))

#(define Transpo
   (define-music-function (m music)(ly:music? ly:music?)
     (music-clone m
       'elements
       (map (lambda (pitch)
              (ly:music-property #{ \transpose c $pitch $music #} 'element))
         (event-chord-pitches m)
         )
       )
     )
   )

#(define Anzahl (length MusLis))
#(define Mehr-Leitern (make-list Anzahl Tonleitern))

#(define Alles (map Transpo Mehr-Leitern MusLis))
#(display (length Alles))


Map ergibt natürlich eine Liste mit 18 Elementen, also nicht das, was ich will, nämlich eine Liste mit 3x18 Elementen. Ersetze ich map durch append-map, erhalte ich jedoch eine Fehlermeldung.

In der letzten Ausbaustufe möchte ich noch die Chordnamen darunter schreiben, habe dazu noch keine Idee.

Sry Harm dass ich dich so oft belästige  :-[
Titel: Re: Transponieren von Musiklisten / map /append-map
Beitrag von: Manuela am Samstag, 26. März 2016, 21:39
Inzwischen kann ich transponieren, das Ergebnis aber dürfte noch irgendeinen Haken haben, weil meine bereits frühere funktionierende Funktion nicht mehr funktioniert.

\version "2.19.38"

\language "deutsch"

Tonleitern=< des d es >

#(define ( Akkorde-in-allen-Tonleitern Pitch Musik)
   (append-map
    (lambda (p)
      (map
       (lambda (music)
         #{ { \transpose c $p $music } #})
       Musik
       )
      )
    (event-chord-pitches Pitch)
    )
   )

Update: es passt doch, ich muss einfach ein "c" bei der Variable Tonleitern hinzufügen  ;D