Autor Thema: mehrere Akkorde in Klammern  (Gelesen 2065 mal)

kae

  • Member
mehrere Akkorde in Klammern
« am: Sonntag, 29. Juli 2012, 17:08 »
Hallo,

ich möchte mehrere Akkordsymbole in Klammern setzen, also in etwa
Dm Dm G7 G7 C (Eb0 Dm G7)

Was ich hinbekomme, ist einzelne Klammern um jedes optinale Akkordsymbol
Dm Dm G7 G7 C (Eb0) (Dm) (G7)

und zwar (im \chordmode) mit \parenthesize. Aber sobald ich hinter \parenthesize eine geschweifte Klammer mache, um mehrere Akkordsymbole gemeinsam einzuklammern, macht er gar keine Klammern mehr.

   \new ChordNames \chords {
   d2:m d:m g:7 g:7 c: \parenthesize { es:dim7  d:m7 g:7}
   }


Vielen Dank für jeden Hinweis,
Christian

ding-dong

  • Member
Re: mehrere Akkorde in Klammern
« Antwort #1 am: Sonntag, 29. Juli 2012, 22:55 »
hallo

es gibt da ein snippet: http://lsr.dsi.unimi.it/LSR/Item?id=377 das vielleicht helfen könnte (ev. anpassungsbedürftig).

ding-dong

harm6

  • Member
Re: mehrere Akkorde in Klammern
« Antwort #2 am: Montag, 30. Juli 2012, 00:12 »
Hallo kae,

\parenthesize ist öfter mal ein Problem. Wenn Du hier hinschaust siehst Du die derzeit offenen issues zum Thema.

Hintergrund.
Es gibt zwei verschieden gelagerte, aber gleichnamige Definitionen für \parenthesize.
Die eine ist ein markup-command bei dem { ... } funktionieren kann.
Z.B.
\markup \parenthesize \line { Alles wird eingeklammert }
Aber nur weil ich \line benutzt und damit aus der markup-list ein einzelnes markup gemacht habe, welches von \parenthesize dann eingeklammert wird. (Ansonsten würde jedes Wort  einzeln eingeklammert werden.)
Die andere ist eine Musikfunktion. Sie ist ihrem Typ nach einem \tweak sehr ähnlich. (Und tweaks wirken per se nur einmal). Wenn dieses \parenthesize vor einem Object steht so wird dieses eingeklammert und nur dieses. \parenthesize kann aber auch benutzt werden um Artikulationen, Fingersätze etc einzuklammern. Dann muß man -\parenthesize schreiben.
Z.B.
{ \parenthesize c''-1-| } für den Notenkopf
{ c''-\parenthesize -1-| } für den Fingersatz
{ c''-1-\parenthesize-| } für die Artikulation

Grundsätzlich haben beide Definitionen also die Eigenschaft nur für jeweils ein Objekt zu wirken.

Nun kann man mit verschieden Methoden zwar nur eine Klammer aufrufen, Du wirst Dich aber damit abfinden müsse, daß zwei Befehlsaufrufe nötig werden.
So wird es ja auch in dem snippet zu dem ding-dong verlinkt hat gemacht (obwohl ich denke, daß der Ansatz aus diesem snippet hier nicht zielführend sein wird, da das BreathingSign überschrieben wird und das finde ich in ChordNames fehl am Platze).
In den Regressiontests ist noch ein anderes Beispiel bei dem der 'stencil verändert wird. Suche nach `stencil-hacking.ly'.

Ich habe zwei Lösngsmöglichkeiten für Dich.
Die erste und auch am einfachsten zu verstehende ist ein 'stencil-override mit einfachem Text. Das führt zu:
pl =
\once \override ChordName #'stencil =
  #(lambda (grob)
    (let* ((stil (ly:text-interface::print grob))
           (par-left-stil (grob-interpret-markup grob (markup #:concat ("(" #:stencil stil))))
           )
    par-left-stil))
   
pr =
\once \override ChordName #'stencil =
  #(lambda (grob)
    (let* ((stil (ly:text-interface::print grob))
           (par-left-stil (grob-interpret-markup grob (markup #:concat (#:stencil stil ")" ))))
           )
    par-left-stil))
   
\new ChordNames
\chordmode {
            \pl f1:maj7 f:7 \pr g
}
Nachteil: die Größe der Klammer ist nicht einstellbar.
Vorteil: Sehr simpel. Und die Klammer ist an der baseline ausgerichtet.

Zweite Möglichkeit:
Ich habe die relevanten Definitionen für das ParenthesesItem aus /scm/output-lib.scm ins file kopiert und verändert.
Das führt zu:
#(define (parenthesize-some-elements dir grob . rest)
  (let* ((refp (if (null? rest)
   grob
   (car rest)))
(elts (ly:grob-object grob 'elements))
(x-ext (ly:relative-group-extent elts refp X))
(stencils (ly:grob-property grob 'stencils))
(lp (if (eq? dir -1) (car stencils) point-stencil))
(rp (if (eq? dir 1) (cadr stencils) point-stencil))
(padding (ly:grob-property grob 'padding 0.1)))

    (ly:stencil-add
     (ly:stencil-translate-axis lp (- (car x-ext) padding) X)
     (ly:stencil-translate-axis rp (+ (cdr x-ext) padding) X))))


#(define-public ((parentheses-items::print dir) me)
  (let* ((elts (ly:grob-object me 'elements))
(y-ref (ly:grob-common-refpoint-of-array me elts Y))
(x-ref (ly:grob-common-refpoint-of-array me elts X))
(stencil (parenthesize-some-elements  dir me x-ref))
(elt-y-ext (ly:relative-group-extent elts y-ref Y))
(y-center (interval-center elt-y-ext)))

    (ly:stencil-translate
     stencil
     (cons
      (- (ly:grob-relative-coordinate me x-ref X))
      (- y-center (ly:grob-relative-coordinate me y-ref Y))))))
     
parLeft =
#(define-music-function (parser location mus)(ly:music?)
#{
        \once\override Score.ParenthesesItem #'stencil = #(parentheses-items::print LEFT)
        \once\override Score.ParenthesesItem #'font-size = #0
        \parenthesize $mus
#})

parRight =
#(define-music-function (parser location mus)(ly:music?)
#{
        \once\override Score.ParenthesesItem #'stencil = #(parentheses-items::print RIGHT)
        \once\override Score.ParenthesesItem #'font-size = #0
        \parenthesize $mus
#})

\score {
   
        \new ChordNames {
        \chordmode {
        \parLeft f1:maj7 f:7 \parRight bes:7 \parLeft f \parRight e
}
        }
}
Vorteil: Man hat alle Einstellmöglichkeiten, die für das ParenthesesItem vorgesehen sind.
Nachteil: Das ParenthesesItem ist ausgerichtet auf das Zentrum der Y-Länge des Objektes und die ist bei F-Dur nun mal eine ander als bei Fmaj7. Und so ist die baseline nicht gewahrt.

Beide Vorschläge funktionieren mit 2.14.2 und auch mit den neueren devel-Versionen.


HTH,
  Harm

kae

  • Member
Re: mehrere Akkorde in Klammern
« Antwort #3 am: Montag, 30. Juli 2012, 10:41 »
besten Dank. Da habt Ihr Euch ja echt Mühe gegeben. Aber leider muss ich ehrlich zugeben: das ist mir eine Nummer zu kompliziert. Für mich lautet die Botschaft: es ist nicht vorgesehen. Man kann es hintricksen, aber nur eher aufwendig. Ich werde dann doch lieber einzelne Akkordsymbole umklammern. Aber vielen Dank fürs Mitdenken.

- Christian

trulli

  • Member
Re: mehrere Akkorde in Klammern
« Antwort #4 am: Montag, 30. Juli 2012, 12:19 »
Hi Christian,

so kompliziert ist es gar nicht. Die Beispiele von harm brauchst du bloß in deine Partitur kopieren und dann die Klammern mit den Befehlen öffnen oder schließen.

Das Einzige, was sich dadurch verändert, ist die Länge deines Codes. Es ist darum sinnvoll die Definitionen zu kommentieren. Z.B. mit der Zeile %Öffnen und Schließen von Klammern. Dann kannst du jederzeit nachvollziehen, was du getan hast.

Gruß