string-number aufrufen

Begonnen von Multimax, Montag, 4. Juni 2018, 17:41

« vorheriges - nächstes »

Multimax

Ich versuche momentan, die String-numbers für einen anderen Zweck zu gebrauchen. Dabei will es mir einfach nicht gelingen diesen Wert anzusprechen. Es muss doch irgendwie möglich sein, die Stringnumber als Entscheidungskriterium anzusprechen.

Z.B: Wenn Stringnumber 1, dann färbe note.

\version "2.18.2"
saitennummer=
#(define-music-function (parser location music) (ly:music?)
   (music-map
    (lambda (m)
      (if 
       (eq? 1 (ly:music-property m 'string-number))
               (begin
               (ly:music-set-property! m 'tweaks
               (acons 'color yellow
               (ly:music-property m 'tweaks)))
             m)
   
       m)
      )
music)
)
\new Staff  \saitennummer {c'\1 <d'\1 e'\2> f' g'}


Displaymusic liefert:
(make-music
  'SequentialMusic
  'elements
  (list (make-music
          'NoteEvent
          'articulations
          (list (make-music
                  'StringNumberEvent
                  'string-number
                  1))
          'pitch
          (ly:make-pitch -1 0 0)
          'duration
          (ly:make-duration 2 0 1))))

Was also mit Pitch bei mir vorher schon funktionierte,  klappt hier nicht. Der Unterschied liegt hier in der zusätzlichen Liste, die für die Articulations aufgemacht wird, also eine Liste innerhalb der Liste?

harm6

ZitatWas also mit Pitch bei mir vorher schon funktionierte,  klappt hier nicht. Der Unterschied liegt hier in der zusätzlichen Liste, die für die Articulations aufgemacht wird, also eine Liste innerhalb der Liste?

Ìn gewisser Weise.

Die Definition von music-map ist kurz genug sie hier vollständig zu zitieren.

Zitat von: music-functions.scm
(define-public (music-map function music)
  "Apply @var{function} to @var{music} and all of the music it contains.

First it recurses over the children, then the function is applied to
@var{music}."
  (let ((es (ly:music-property music 'elements))
        (e (ly:music-property music 'element)))
    (if (pair? es)
        (set! (ly:music-property music 'elements)
              (map (lambda (y) (music-map function y)) es)))
    (if (ly:music? e)
        (set! (ly:music-property music 'element)
              (music-map function  e)))
    (function music)))

Rot eingefärbt habe ich durch welche Listen music-map iteriert.
Die 'articulations eines NoteEvents gehören nicht dazu.

Du mußt also die 'articulations einer jeden Note daraufhin prüfen, ob dort irgendwo etwas mit einer gesetzten 'string-number drin ist, um eine Handhabe zu bekommen.

Führt zu:

saitennummer =
#(define-music-function (parser location music) (ly:music?)
   (music-map
     (lambda (m)
       (if (music-is-of-type? m 'note-event)
           (let* ((arts (ly:music-property m 'articulations)))
             (for-each
               (lambda (art)
                 (if (eq? 1 (ly:music-property art 'string-number))
                     (ly:music-set-property! m 'tweaks
                       (acons 'color yellow (ly:music-property m 'tweaks)))))
               arts)
             m)
           m))
     music))
     
\saitennummer {
  c'\1 <d'\1 e'\2> f' g'
}


Genau genommen müßte man prüfen, obs überhaupt eine StringNumber ist. Siehe:


{
  \displayMusic c'-\withMusicProperty #'string-number #1 -"foo"
}

=>
Zitat von: terminal
(make-music
  'NoteEvent
  'articulations
  (list (make-music
          'TextScriptEvent
          'string-number
          1
          'text
          "foo"))
  'duration
  (ly:make-duration 1)
  'pitch
  (ly:make-pitch 0 0))

Aber eigentlich wäre das was für Paranoiker...

Auf der anderen Seite, wäre man damit auf jeden Fall auf der sicheren Seite.
Falls Du's noch einfügen willst, betrachte es als Hausaufgabe ... ;)

Gruß,
  Harm

Multimax

Hi Harm,

wow, vielen Dank. In etwa habe mir schon gedacht, dass ich mit der üblichen music-map Lambda-konstruktion nicht weiterkomme.
Man muss also innerhalb der Mapping Funktion die articulations property nochmal explizit ansprechen und diese nochmal elementweise durchgehen.
Auf die Konstruktion mit let*  und for-each wäre ich aber so nie gekommen. Let war mir bisher noch unbekannt.

Was die Überprüfung angeht, wüsste ich nicht, wie auf normalem Wege überhaupt eine falsche Info in die 'string-number kommen könnte. Deshalb glaube ich erstmal nicht dass ich die brauche.

harm6

ZitatAuf die Konstruktion mit let*  und for-each wäre ich aber so nie gekommen.

Hmm, let* ist hier überflüssig, hab ich vergessen zu korrigieren. Einfaches let tut's auch.

Gruß,
  Harm