Rechte Hand separat setzen?

Begonnen von asmodeus, Dienstag, 6. Juli 2021, 00:16

« vorheriges - nächstes »

asmodeus

Hallo,

ich hab mir schon lange gewuenscht den Fingersatz der rechten Hand separat setzen zu koennen.
Dazu habe ich das Snippet withRH definiert. Das klappt schon ganz gut, als naechstes wuerde ich gerne wie unten in den Kommentaren

1. Statt { s4 s\M s\I } lieber { S M I } schreiben
2. Die Syntax um Akkorde erweitern.

Wie koennte das gehen?

\version "2.22"

#(define RH rightHandFinger)
P = \RH #1
I = \RH #2
M = \RH #3
A = \RH #4

withRH=
#(define-music-function (parser location music fingering) (ly:music? ly:music?)
  (let ((melts (extract-named-music music '(NoteEvent EventChord)))
        (felts (extract-named-music fingering '(StrokeFingerEvent))))
    (if (and (pair? melts) (pair? felts))
      (map
        (lambda (m f)
          (set! (ly:music-property m 'articulations)
            (cons
              f
              (ly:music-property m 'articulations))))
            melts felts)))
  #{
    $music
  #})

\absolute {
  \withRH
    { r4 d'-2 e'-3 }
    { s4 s\M s\I }
    % lieber: { S M I }
   
    % \withRH
    %   { <c e g>4 }
    %   { <P I M> } um <c\P e\I g\M>4 zu erhalten
}

harm6

Hallo,

{ S M I } ist als Syntax nur im lyricmode erlaubt. Diese Eingabe dann in StrokeFingerEvents umzumodeln mag möglich sein, aber da ist der Aufwand nicht gerechtfertigt. Auch müßtest Du dann immer \lyricmode { S M I } schreiben...
Darüberhinaus sieht Deine Funktion keine Möglichkeit vor einen StrokeFinger nicht zu setzen, also eine Note zu überspringen.

Schau doch mal, ob Du nicht mit
https://lsr.di.unimi.it/LSR/Item?id=768
zurechtkommst.

Gruß,
  Harm

asmodeus

Hallo Harm,

Danke fuer den Hinweis auf das Snippet! Hab es gleich ausprobiert und angepasst so dass auch #"pimimi" fuer die rechte Hand akzeptiert wird.
Ein gravierender Nachteil ist mir dann aber aufgefallen: Hyperlinks von RH-Text aus dem erzeugten PDF zum Lilypond Source funktionieren mit diesem Ansatz nicht, da die aus dem String generiert werden.

Nun koennte man das verlinkte Skript anpassen so dass es ly:music statt string fuer die Finger akzeptiert. Wuerde das helfen damit Hyperlinks funktionieren?

Falls ja braeuchte ich noch einen Rat bzgl:

1. Gibt es eine Moeglichkeit durch zwei music Strukturen parallel zu iterieren? Quasi:

(map-music (lambda (x y) ...) m1 m2)

2. Was waere eine geeignete music Syntax die es erlaubt auch zu Akkorden die rechte Hand mit Skipnotes zu setzen? So etwas?


\withRH
{ <c' e' g'>4 c' e'}
{ s\P\I\M s\I S\M}


VG,
Achim

harm6

Zitat
Ein gravierender Nachteil ist mir dann aber aufgefallen: Hyperlinks von RH-Text aus dem erzeugten PDF zum Lilypond Source funktionieren mit diesem Ansatz nicht, da die aus dem String generiert werden.

Ein bißchen hilft das Einfügen der rot eingefärbten Zeile:
Zitat
#(define (add-articulation event-name property-name min max music finger-str)         
(let* ((my-char-set (char-set-adjoin char-set:letter+digit #\+ #\- #\'))
       (pre-str (expand-chars (delete-comments finger-str)))
       (str-list (string->list pre-str))
       (str-list-filtered->char (lambda ()
              (define (loop)                               
                (let ((c (car str-list)))
                  (if (char-set-contains? my-char-set c)
                                 c
                                 (begin (set! str-list (cdr str-list))
                                        (if (null? str-list) #\nul (loop))))))
              (loop)))
       (current-char (if (null? str-list) #\nul (str-list-filtered->char)))
       (next-char (lambda (filter?)(set! current-char
                            (if (or (null? str-list)
                                    (begin (set! str-list (cdr str-list))
                                           (null? str-list)))
                              #\nul           
                              (if filter? (str-list-filtered->char)
                                          (car str-list)))))))
  (define (set-dir dir); "+" return 1, "-" return -1. To call with (set-dir 0).
      (cond ((char=? current-char #\+)
                  (next-char #t)
                  (set-dir 1))
            ((char=? current-char #\-)
                  (next-char #t)
                  (set-dir -1))
            (else dir)))
  (music-map
     (lambda (evt)
        (if (and (eq? (name-of evt) 'NoteEvent)
                 (pair? str-list))
           (let*((dir (set-dir 0))
                 (tweaks? (and
                   (char=? current-char #\')  ; section between 2 apostrophes ?
                   (let loop ((text-list '())
                              (prev-char current-char))
                      (next-char #f)
                      (let*((apostrophe? (char=? current-char #\'))
                            (escaped-char? (and (or apostrophe?
                                                    (char=? current-char #\%))
                                                (char=? prev-char #\nul))))
                         (cond
                            (escaped-char?
                                  (loop (cons current-char (cdr text-list))
                                        current-char))
                            ((or apostrophe? (null? str-list)) ; close section
                                  (list (cons
                                    (quote text)
                                    (reverse-list->string text-list))))
                            (else (loop (cons current-char text-list)
                                        current-char)))))))
                 (i (if tweaks? min (- (char->integer current-char)
                                       (char->integer #\0))))
                 (tweaks (if tweaks? tweaks? '())))
              (if (and (>= i min)(<= i max))
                (ly:music-set-property! evt 'articulations (append
                  (list (make-music
                          event-name
                          'origin (*location*)
                          'tweaks tweaks
                          'direction dir                         
                          property-name i ))
                  (ly:music-property evt 'articulations))))               
              (next-char #t)))
        evt)
     music)))

Zitat
1. Gibt es eine Moeglichkeit durch zwei music Strukturen parallel zu iterieren? Quasi:

(map-music (lambda (x y) ...) m1 m2)
music-map funktioniert nur mit einem music-Argument. Um über zwei music Strukturen parallel zu iterieren, müßten diese exakt die gleiche Struktur haben, um nicht aus der Kurve zu fliegen.
Ich halte das mit vertretbarem Aufwand für nicht machbar.

Zitat
2. Was waere eine geeignete music Syntax die es erlaubt auch zu Akkorden die rechte Hand mit Skipnotes zu setzen? So etwas?


\withRH
{ <c' e' g'>4 c' e'}
{ s\P\I\M s\I S\M}


Auch hier gibt es unter anderem das Problem, wie Du einen StrokeFinger nicht setzen könntest...
Nicht umsonst geht das LSR-snippet Note für Note vor und definert eine skip-Möglichkeit.

Im Moment sehe ich da keine guten Möglichkeiten, vielleicht fällt ja jemand anderem noch was ein.

Gruß,
  Harm

harm6

Vielleicht hilft auch der edition-engraver:
https://github.com/openlilylib/edition-engraver

Hab' ich aber selbst nie verwendet...

Gruß,
  Harm