Noten richtig setzen bei Diatonisches Akkordeon

Begonnen von Bienenschwarm, Freitag, 22. November 2024, 15:16

« vorheriges - nächstes »

Bienenschwarm

Hallo liebe Musikfreunde

Ich spiele seit einem halben Jahr wieder mit einem diatonischen Akkordeon. Es ist eine Hohner Morino-Club. Seit einiger Zeit schreibe ich mit Lilly-Pond auch Noten und habe für mich ein Programm geschrieben wo die Noten wie früher dargestellt werden.
Nun habe ich da ein Problem: Bekanntlich sind die Noten zwischen den Linien rechts auf der Tastatur, die Noten auf den Linien sind in der Mitte und die Noten mit einem Kreuz (zwischen den Linien) sind links.
Mein Wunsch wäre, dass die Noten so gesetzt werden das sie der Logik der Tastatur entsprechen. Die Spielbarkeit wäre massiv besser.

Ich habe hier einige Muster eingefügt. Links sind sie so wie von LilyPond gesetzt. Rechts sind sie so wie ich es haben möchte.
Wer kann mir helfen? Besten Dank!

Liebe Grüsse
Bienenschwarm





Manuela

#1
Ich habe was in der Mailingliste gefunden. Ganz automatisch geht es leider nicht, und die Notenhälse passen nicht ganz (keine Ahnung warum)

\version "2.25.22"
\language "deutsch"

#(define ((shift offsets) grob)
   (let ((note-heads (ly:grob-array->list (ly:grob-object grob 'note-heads))))
     (for-each
      (lambda (p q) (ly:grob-translate-axis! p (* q 1.251178) X))
      note-heads offsets)))

displaceHeads =
#(define-music-function (offsets) (list?)
   #{
     \once \override NoteColumn.before-line-breaking = #(shift offsets)
   #}
   )

\paper {
  indent = #0
  tagline = ##f
  ragged-right = ##t
}

\relative {
  \textLengthOn
  < d' f g >2-\markup "Standard  "
  \displaceHeads #'(1 1 0)
  < d f g >-\markup "displaceHeads #'(1 1 0)"
  \break
  < f g c >-\markup "Standard  "
  \displaceHeads #'(1 0 1)
  < f g c >-\markup "displaceHeads #'(1 0 1)"
}

Update: das ist die einfache Variante, im LSR habe ich Code gefunden, der die Anpassung des Notenhalses erlaubt.

Du musst halt an den Parametern schrauben

\version "2.25.22"
\language "deutsch"

% #(define ((shift offsets) grob)
%    (let ((note-heads (ly:grob-array->list (ly:grob-object grob 'note-heads))))
%      (for-each
%       (lambda (p q) (ly:grob-translate-axis! p (* q 1.251178) X))
%       note-heads offsets)))
%
% displaceHeads =
% #(define-music-function (offsets) (list?)
%    #{
%      \once \override NoteColumn.before-line-breaking = #(shift offsets)
%    #}
%    )

#(define ((shift offsets) grob)
   "Defines how NoteHeads should be moved according to the given list of offsets."
   (let* (
           ;; NoteHeads
           ;; Get the NoteHeads of the NoteColumn
           (note-heads (ly:grob-array->list (ly:grob-object grob 'note-heads)))
           ;; Get their durations
           (nh-duration-log
            (map
             (lambda (note-head-grobs)
               (ly:grob-property note-head-grobs 'duration-log))
             note-heads))
           ;; Get their length in X-axis-direction
           (stencils-x-lengths
            (map
             (lambda (x)
               (let* ((grob-x-ext (ly:grob-extent x grob X)))
                 (if (interval-sane? grob-x-ext)
                     (interval-length grob-x-ext)
                     0)))
             note-heads))
           ;; Stem
           (stem (ly:grob-object grob 'stem))
           (stem-thick (ly:grob-property stem 'thickness 1.3))
           (stem-x-width (if (ly:grob? stem)
                             (let ((stem-x-ext (ly:grob-extent stem grob X)))
                               (if (interval-sane? stem-x-ext)
                                   (interval-length stem-x-ext)
                                   (/ stem-thick 10)))
                             ;; Fall back
                             ;; TODO is it ever used?
                             (/ stem-thick 10)))
           (stem-dir (ly:grob-property stem 'direction))
           ;; Calculate a value to compensate the stem-extension
           (stem-x-corr
            (map
             (lambda (q)
               ;; TODO better coding if (<= log 0)
               (cond ((and (= q 0) (= stem-dir 1))
                      (* -1 (+ 2  (* -4 stem-x-width))))
                     ((and (< q 0) (= stem-dir 1))
                      (* -1 (+ 2  (* -1 stem-x-width))))
                     ((< q 0)
                      (* 2 stem-x-width))
                     (else (/ stem-x-width 2))))
             nh-duration-log)))
     ;; Final Calculation for moving the NoteHeads
     (for-each
      (lambda (nh nh-x-length off x-corr)
        (if (= off 0)
            #f
            (ly:grob-translate-axis! nh (* off (- nh-x-length x-corr)) X)))
      note-heads stencils-x-lengths offsets stem-x-corr)))

displaceHeads =
#(define-music-function (offsets) (list?)
   "
 Moves the NoteHeads, using (shift offsets)
"
   #{
     \once \override NoteColumn.before-line-breaking = #(shift offsets)
   #})

adjustStem =
#(define-music-function (val)(pair?)
   "
 Adjust 'stem-attachment via
 adding multiples of the stem-width to the x-default (car val)
 and multiplying the y-default with (cdr val).
"
   #{
     \once \override NoteHead.before-line-breaking =
     #(lambda (grob)
        (let* ((stem-at (ly:grob-property grob 'stem-attachment))
               (stem (ly:grob-object grob 'stem))
               (stem-x-width (interval-length (ly:grob-property stem 'X-extent))))
          (ly:grob-set-property!
           grob
           'stem-attachment
           (cons (+ (car stem-at) (* stem-x-width (car val))) (* (cdr val) (cdr stem-at)))
           )))
   #})

setOtherScriptParent =
#(define-music-function (which-note-head)(integer?)
   "
 If the parent-NoteHead of a Script is moved, another parent from the
 NoteColumn could be chosen.
 The NoteHeads are numbered 1 2 3 ...
 not 0 1 2 ...
"
   #{
     %% Let "staccato" be centered on NoteHead, if Stem 'direction is forced
     %% with \stemUp, \stemDown, \voiceOne, \voiceTwo etc
     \once \override Script.toward-stem-shift = #0

     \once \override Script.after-line-breaking =
     #(lambda (grob)
        (let* ((note-head (ly:grob-parent grob X))
               (note-column (ly:grob-parent note-head X))
               (note-heads-list
                (ly:grob-array->list
                 (ly:grob-object note-column 'note-heads)))
               (count-note-heads (length note-heads-list)))
          (if (> which-note-head count-note-heads)
              (ly:warning "Can't find specified note-head - ignoring")
              (set! (ly:grob-parent grob X)
                    (list-ref note-heads-list (- which-note-head 1))))))
   #})


\paper {
  indent = #0
  tagline = ##f
  ragged-right = ##t
}

\relative {
  \textLengthOn
  < d' f g >2-\markup "Standard  "
  \displaceHeads #'(1 1 -1)
  \adjustStem #'(0.75 . -1)
  < d f g >-\markup "displaceHeads #'(1 1 -1)"
  \break
  < f g c >-\markup "Standard  "
  \displaceHeads #'(1 -1 1)
  \adjustStem #'(0.75 . -1)
  < f g c >-\markup "displaceHeads #'(1 0 1)"
}
Danke für eure Hilfe
viele Grüße
-- Manuela