Trees

Begonnen von Köbi, Montag, 2. Oktober 2017, 13:20

« vorheriges - nächstes »

Köbi

Hallo zusammen

Heute bin ich fleissig...

Unter http://lilypondblog.org/2014/07/trees-music-and-lilypond/ habe ich etwas interessantes gefunden. Arbeitet jemand von euch damit? Würde mich sehr interessieren.

Seit einiger Zeit verwende ich es und finde es ganz praktisch. Für meine Bedürfnisse habe ich es noch ein bisschen ausgebaut. Der folgende Code steckt bei mir in einer Datei "Functions_MusicTree.ly":


\version "2.19.64"

% the main trees
#(if (not (defined? 'musicTree)) (define musicTree '()))
#(if (not (defined? 'stringTree)) (define stringTree '()))
#(if (not (defined? 'markupTree)) (define markupTree '()))
#(if (not (defined? 'pitchTree)) (define pitchTree '()))

% functions to store values in the trees
putMusic =
#(define-void-function (parser location path content)(string? ly:music?)
   (let ((pl (string->path path)))
     (set! musicTree (tree-set! musicTree pl content))
     ))
putString =
#(define-void-function (parser location path content)(string? string?)
   (let ((pl (string->path path)))
     (set! stringTree (tree-set! stringTree pl content))
     ))
putMarkup =
#(define-void-function (parser location path content)(string? markup?)
   (let ((pl (string->path path)))
     (set! markupTree (tree-set! markupTree pl content))
     ))
putPitch =
#(define-void-function (parser location path content)(string? ly:pitch?)
   (let ((pl (string->path path)))
     (set! pitchTree (tree-set! pitchTree pl content))
     ))

% functions to get values from the trees
getMusic =
#(define-music-function (parser location path)(string?)
   (let* ((pl (string->path path))
          (content (tree-get musicTree pl)))
     (if (ly:music? content)
         (ly:music-deep-copy content)
         (make-music 'SequentialMusic 'void #t))))
getString =
#(define-scheme-function (parser location path)(string?)
   (let* ((pl (string->path path))
          (content (tree-get stringTree pl)))
           content
     ))
getMarkup =
#(define-scheme-function (parser location path)(string?)
   (let* ((pl (string->path path))
          (content (tree-get markupTree pl)))
           content
     ))
getPitch =
#(define-scheme-function (parser location path)(string?)
   (let* ((pl (string->path path))
          (content (tree-get pitchTree pl)))
           content
     ))

% set a value in a tree -- based on nested association lists
#(define-public (tree-set! tree path val)
   (if (> (length path) 1)
       (let ((tab (assoc (car path) tree)))
         (if (not (pair? tab))(set! tab '((car path))))
         (assoc-set! tree (car path) (tree-set! (cdr tab) (cdr path) val))
         )
       (assoc-set! tree (car path) val))
   )
% get a value from a tree -- based on nested association lists
#(define-public (tree-get tree path)
   (let ((ret (assoc (car path) tree)))
     (if (pair? ret)
         (if (> (length path) 1)
             (tree-get (cdr ret) (cdr path))
             (cdr ret))
         #f))
   )
% split a string by '/'
#(define-public (string->path str)(string-split str #\/))

% helper function to append strings
stringAppendB =
#(define-scheme-function (parser location str1 str2)(string? string?)
   (string-append str1 str2))
stringAppendC =
#(define-scheme-function (parser location str1 str2 str3)(string? string? string?)
   (string-append str1 str2 str3))
stringAppendD =
#(define-scheme-function (parser location str1 str2 str3 str4)(string? string? string? string?)
   (string-append str1 str2 str3 str4))
stringAppendE =
#(define-scheme-function (parser location str1 str2 str3 str4 str5)(string? string? string? string? string?)
   (string-append str1 str2 str3 str4 str5))


Unter anderem poste ich das hier, damit ich dann bei meinen anderen Anfragen darauf verweisen kann.

Gruss
Köbi

Malte

Hallo Köbi,

ich hab den Post auch gelesen, aber für mich noch keinen großen unmittelbaren Nutzen sehen können (auch, weil ich selten an so großen Projekten arbeite). Es gibt auch andere Dinge, die ich eigentlich mal anschauen wollte, z. B. openLilyLib und den edition-engraver sowie den ,,Paketmanager" lyp, aber bisher ists nicht dazu gekommen. Ich find solche Dinge eigentlich ganz gut, aber ich glaub, mich hat immer die Einarbeitungszeit abgeschreckt (ebenso wie beim Beitragen zu LilyPonds Code).