Autor Thema: Angabe von alternativen Akkorden  (Gelesen 2772 mal)

ulmoeh

  • Gast
Angabe von alternativen Akkorden
« am: Freitag, 13. März 2015, 23:05 »
Hallo,

ich möchte gern Alternativen für Akkorde angeben, etwa in der Art C(a) oder C|a. Im Moment habe ich die Alternativen übereinander geschrieben, indem ich zwei "Zeilen" mit Akkorden eingefügt habe:
\version "2.18.2"
\score { <<
\new ChordNames \with {
  #'chordNameLowercaseMinor = ##t
%      \override ChordName #'X-offset = #2.5
%      \override ChordName #'Y-offset = #-2.5
}{
  \germanChords \chordmode { a:m }
}
\new ChordNames \with {
  #'chordNameLowercaseMinor = ##t }{
  \germanChords \chordmode { c }
}
>> }
Mit den auskommentierten Zeilen bekomme ich die Alternativen auch nebeneinander. Hat jemand einen Tipp, wie ich noch zusätzliche Zeichen einfügen kann, eben Klammern oder "|"?

Vielen Dank,
Ulrich

harm6

  • Gast
Re: Angabe von alternativen Akkorden
« Antwort #1 am: Samstag, 14. März 2015, 15:17 »
Hallo,

unten mein Versuch mit diversen Einstellmöglichkeiten, sollte was für Dich dabei sein ;)
Größtes manko ist die Verwendung des markup-commands \score.
Leider haben wir im Moment keine bessere Möglichkeit ein einzelnes chord-name-markup zu generieren.
Das Ganze funktioniert allerdings nur mit einer der neueren devel-Versionen.

\version "2.19.16"

%% needed for 'dir-column-line'
#(define (insert-elt l1 l2 elt)
 "Inserts a new element between every element of list l1
  and outputs this as new list l2.
  While starting, l2 is supposed to be '() "
  (set! l2 (reverse (append (list elt (car l1)) l2)))
  (if (= 1 (length (cdr l1)))
      (append l2 (last-pair l1))
      (insert-elt (cdr l1) (reverse l2) elt)))

#(define-markup-command (dir-column-line layout props args)
  (markup-list?)
  #:properties ((direction 1)
                (baseline 0.4)) ;; baseline-skip
  (let* ((cleared-args-stils
           (filter
             (lambda (s)
               (if (string? s)
                   (not (string-null? s))
                   s))
             args))
         (args-length-ls
           (sort
             (map
               (lambda (x)
                 (interval-length
           (ly:stencil-extent (interpret-markup layout props x) X)))
               cleared-args-stils)
             >))
         (ln-mrkp (markup #:draw-line (cons (car args-length-ls) 0)
                    #:vcenter
                    #:vspace 0.2))
         (new-args (insert-elt (reverse cleared-args-stils) '() ln-mrkp)))

  (stack-lines direction
    0.0
    baseline
    (interpret-markup-list layout props new-args))))

%% The main function
alternative-chords =
#(define-music-function (parser location format-mrkp chrd-1 separator chrd-2)
  ((procedure? (lambda (x) x)) ly:music? (markup? "") ly:music?)

  #{
    \once
    \override ChordName.before-line-breaking =
      #(lambda (grob)
        (let ((mrkp-list
                (list
                  (ly:grob-property grob 'text)
                  separator
                   #{
                     \markup {
                       \score {
                         \new MyChordNames $chrd-2
                         \layout {
                           indent = -0.7
                           \override ChordNames.ParenthesesItem.font-size = 1
                           \override ChordNames.ParenthesesItem.padding = #-0.1
                         }
                       }
                     }
                   #})))
            (ly:grob-set-property! grob 'text
              #{
              \markup #(format-mrkp mrkp-list)
              #})))
             
         $chrd-1    
  #})
 
%%%%%%%%%%%%%%%%%%%
%% THE LAYOUT
%%%%%%%%%%%%%%%%%%%

myChordnamesSettings =
\layout {
  %% to get the default chordnaming, comment next two lines
  \set ChordNames.chordNameLowercaseMinor = ##t
  \germanChords
}

\layout {
  \myChordnamesSettings
  \context {
    \ChordNames
  }
  \context {
    \ChordNames
    \name "MyChordNames"
    \alias "ChordNames"
  }
  \context {
    \Score
    \accepts "MyChordNames"
  }
  \context {
    \PianoStaff
    \accepts "MyChordNames"
  }
  \context {
    \GrandStaff
    \accepts "MyChordNames"
  }
  \context {
    \StaffGroup
    \accepts "MyChordNames"
  }
  \context {
    \ChoirStaff
    \accepts "MyChordNames"
  }
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% FOMATTER FOR ALTERNATIVE CHORDS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% formatter for alternative chords:

#(define small-alt-mrkp
  (lambda (args)
    #{
      \markup
        $(append
          (drop-right args 1)
          (list (markup #:scale '(0.6 . 0.6) (last args))))
    #}))
   
#(define column-mrkp
  (lambda (args)
    #{
      \markup \override #'(direction . 1) \dir-column $(reverse args)
    #}))
   
#(define hline-sep-mrkp
  (lambda (args)
    #{
      \markup \dir-column-line $args
    #}))
   

#(define hline-sep-down-small-mrkp
  (lambda (args)
    #{
      \markup \dir-column-line
        $(append
          (drop-right args 1)
          (list (markup #:scale '(0.6 . 0.6) (last args))))
    #}))

%%%%%%%%%%%%%%%%%%%%
%% MUSIC-EXAMPLE
%%%%%%%%%%%%%%%%%%%%

<<
\new ChordNames
  \chordmode {
    \alternative-chords
      %% default
      c4:m13
      a:m7.9-
     
    \alternative-chords
      %% using an optional formatter
      \small-alt-mrkp
      c4:m13
      %% using an optional separator
      "/"
      a:m7.9-
     
    \alternative-chords
      c4:m13
      \markup
        \override #'(thickness . 2)
        \override #'(off . 0.2)
        \draw-dotted-line #'(1 . 2.3)
      a:m7.9-
     
    \alternative-chords
      c4:m13
      " "
      \parenthesize a:m7.9-
     
    \alternative-chords
      \column-mrkp
      c4:m13
      a:m7.9-
     
    \alternative-chords 
      \hline-sep-mrkp
      c4:m13
      a:m7.9-
     
    \alternative-chords 
      \hline-sep-mrkp
      c4:m13
      \parenthesize
      a:m7.9-
     
    \alternative-chords 
      \hline-sep-down-small-mrkp
      c4:m13
      a:m7.9-
    b
  }
 
\new Staff
  \with { instrumentName = \markup \center-column { "Control" "Staff " } }
  {
    \repeat unfold 4 c''4
    \break
    \repeat unfold 4 c''4
    \break
    c''1
  }
>>


HTH,
  Harm
« Letzte Änderung: Samstag, 14. März 2015, 15:44 von harm6 »

ulmoeh

  • Gast
Re: Angabe von alternativen Akkorden
« Antwort #2 am: Sonntag, 22. März 2015, 22:44 »
Hallo Harm,

vielen Dank für Deine Antwort und Deine Hilfe.

Leider habe ich noch nicht die Zeit gefunden, Deine Vorschläge wirklich gründlich zu testen. Ein wenig Rückmeldung möchte ich aber doch endlich geben.

Ich habe noch nicht die von Dir angegebene lilypond-Version, aber auch mit Version 2.18.2 hat das meiste wohl gut funktioniert. Probleme bei der Übersetzung gab es nur bei der siebenten der acht angegebenen Varianten, wahrscheinlich wegen \parenthesize. Bei Einfügen von "" als Separator vor \parenthesize hat auch meine lilypond-Version ein PDF erzeugt.

Bei Nachforschungen zu irgendwelchen Standard-Schreibweisen für meinen Wunsch habe ich nur herausgefunden, dass Deine zweite Beispiel-Variante mit dem Schrägstrich schon anders belegt ist (Angabe Basiston zum Akkord).
Daher tendiere ich im Moment am ehesten zur fünften Variante (Übereinander ohne Strich als Trenner), aber die Alternativ-Variante weiter von der Notenzeile weg und deshalb oben und zusätzlich eingeklammert. Das bekomme ich auch hin. Um die "unwichtige" zweite Variante im Quelltext trotzdem als zweite schreiben zu können, nehme ich bei der Definition von column-mrkp das reverse heraus und schreibe "" vor \parenthesize. Allerdings funktioniert gerade dafür bei mir die Angabe "(baseline 0.4)" nicht. Ich hatte versucht, mit einem etwas größeren Wert zu arbeiten und dabei wurde bei den Varianten 6 bis 8 die obere Angabe weiter verschoben, aber bei Variante 5 blieb alles gleich. Möglicherweise liegt das auch an meiner lilypond-Variante (was ich aber eher nicht wirklich glaube).

Ich melde mich wieder, wenn ich weitere Ergebnisse habe.

Viele Grüße,
Ulrich

harm6

  • Gast
Re: Angabe von alternativen Akkorden
« Antwort #3 am: Montag, 23. März 2015, 00:35 »
Zitat
Ich habe noch nicht die von Dir angegebene lilypond-Version, aber auch mit Version 2.18.2 hat das meiste wohl gut funktioniert. Probleme bei der Übersetzung gab es nur bei der siebenten der acht angegebenen Varianten, wahrscheinlich wegen \parenthesize. Bei Einfügen von "" als Separator vor \parenthesize hat auch meine lilypond-Version ein PDF erzeugt.

Hmm, das ist irgendein obskurer bug. Bin zu faul nachzuforschen ;)
Ist aber gefixt in 2.19.16

Zitat
Daher tendiere ich im Moment am ehesten zur fünften Variante (Übereinander ohne Strich als Trenner), aber die Alternativ-Variante weiter von der Notenzeile weg und deshalb oben und zusätzlich eingeklammert. Das bekomme ich auch hin. Um die "unwichtige" zweite Variante im Quelltext trotzdem als zweite schreiben zu können, nehme ich bei der Definition von column-mrkp das reverse heraus und schreibe "" vor \parenthesize.
Wie Du willst...
Zitat
Allerdings funktioniert gerade dafür bei mir die Angabe "(baseline 0.4)" nicht. Ich hatte versucht, mit einem etwas größeren Wert zu arbeiten und dabei wurde bei den Varianten 6 bis 8 die obere Angabe weiter verschoben, aber bei Variante 5 blieb alles gleich. Möglicherweise liegt das auch an meiner lilypond-Variante (was ich aber eher nicht wirklich glaube).

Das property 'baseline' funktioniert nur bei meinem eigens definierten 'dir-column-line'-markup-command.
Ansonsten mußt Du 'baseline-skip' verwenden.

#(define column-mrkp
  (lambda (args)
    (display-scheme-music args)
    #{
      \markup
        \override #'(baseline-skip . 15)
        \override #'(direction . 1)
        \dir-column $args %$(reverse args)
    #}))

Allerdings wirst Du einen weiteren bug beobachten können, der in 2.19.16 bereits behoben ist.

Ich empfehle manuelles upgrade. Ist kinderleicht.


HTH,
  Harm

P.S.
Ich hatte Schwierigkeiten Deine Bezüge auf 1. - 8. Version nachzuvollziehen. Bitte gib den Code oder zumindest den jeweiligen Namen des Befehls an.

harm6

  • Gast
Re: Angabe von alternativen Akkorden
« Antwort #4 am: Montag, 23. März 2015, 00:44 »
Ich empfehle manuelles upgrade. Ist kinderleicht.

Hab' direkt im Anschluß an das Verfassen des vorigen posts das upgrade auf 2.19.17 gemacht.
Und obwohl ich multiple Versionen auf dem Rechner habe und es damit ein bißchen mehr Aufwand ist, habe ich keine 5 min dafür gebraucht.

Wird beim ersten mal zugegebenermaßen wohl etwas länger dauern.

Gruß,
  Harm

ulmoeh

  • Gast
Re: Angabe von alternativen Akkorden
« Antwort #5 am: Freitag, 27. März 2015, 08:29 »
Hallo Harm,

Zitat
Ich empfehle manuelles upgrade. Ist kinderleicht.
Die parallele Installation (und Deinstallation) wird einem von lilypond.org tatsächlich sehr einfach gemacht und damit funktioniert Dein Code auch wie erwartet.
Mit zwei weiteren Funktionsdefinitionen kann ich jetzt sehr kurz die Akkorde so schreiben, wie ich es benötige. Da ich bisher noch nicht wirklich in lilypond/scheme programmiert habe, hat mich das nötige Verständnis doch einige Einarbeitung gekostet, obwohl es eigentlich gar nicht viel ist.

Hier meine Funktionsdefinitionen:
#(define reverse-column-mrkp
  (lambda (args)
    #{
      \markup \override #'(direction . 1) \dir-column $args
    #}))

my-alt-cords =
#(define-scheme-function
     (parser location Arg1 Arg2)
     (ly:music? ly:music?)
     #{
       \alternative-chords
      \reverse-column-mrkp
      $Arg1
      \parenthesize
      $Arg2
     #}
   )
und der kurze Aufruf damit:
\my-alt-cords c4 a:m

Vielen Dank nochmals,
Ulrich