Grundkonzept von \markup

Begonnen von buhtz, Samstag, 2. April 2022, 15:39

« vorheriges - nächstes »

buhtz

Ich versuche \markup zu verstehen, ohne zu wissen, ob das für meine Zwecke überhaupt das Richtige ist.
Es geht darum, nach welchem Konzept die Elemente positioniert werden können.

Der Code unten setzt eine Noten mit dem dazugehörigen Saxophon Griff darunter und dem Notenname darüber.

Deutlich zu sehen ist, dass das Griffsymbol nicht unter der Note zentriert ist, sondern eher etwas links sitzt. Vermutlich wurde hier "linksbündig" gesetzt? Der Buchstabe wiederum scheint aber zentriert zu sein. Merkwürdig.

\version "2.22.0"
#(print-keys-verbose 'saxophone)
#(set-global-staff-size 38)
\score{
    \relative {
        \textLengthOn
        d'1_\markup {
            \woodwind-diagram
            #'saxophone
            #'((cc . (one two three four five six))
               (lh . ())
               (rh . ()))
        }^\markup{D}
    }
}

juribel

Hallo,

Markups kann man frei positionieren. Dazu kannst du die Griffbilder als normales Markup einer Note zuordnen.

Allerdings kann man einer Note immer nur ein Markup zuordnen. Hier kannst du dir helfen, indem du die Note mit einer unsichtbaren Pause parallel anordnest, und das zweite Markup an diese Pause heftest, ebenfalls mit einer eigenen Positionierung.

\score{
    \relative {
        \textLengthOn
        <<   
          d'1
          \once \override Score.RehearsalMark.extra-offset = #'(4.8 . -23)
          \mark \markup {
            \null
            \woodwind-diagram
            #'saxophone
            #'((cc . (one two three four five six))
               (lh . ())
               (rh . ()))
          }
          s1
        >>
        \once \override Score.RehearsalMark.extra-offset = #'(-5.3 . -0)
        \mark \markup { \null {"D" } }
    }
}


Bestimmt alles andere als elegant oder perfekt, aber funktioniert :-)

Viele freundliche Grüsse

juribel

Es geht auch noch anders. Ein Markup mit ^markup{A} direkt an die Note hängen, und das andere Markup frei definieren.

Es bietet sich auch an, die einzelnen Ton-Diagramme in Variablen auszulagern, dann wird das Notenbild erheblich lesbarer:

\version "2.22.0"

diagrammD = {
          \once \override Score.RehearsalMark.extra-offset = #'(-5.4 . -23)
          \mark \markup {
            \null
            \woodwind-diagram
            #'saxophone
            #'((cc . (one two three four five six))
               (lh . ())
               (rh . ()))
          }
}         

#(print-keys-verbose 'saxophone)
#(set-global-staff-size 38) 

\score{
    \relative {
        \textLengthOn
        d'1^\markup{X}
        \diagrammD
    }
}


Viele freundliche Grüsse, juribel

harm6

Ich denke, wenn Du \markup schreibst meinst Du doch eigentlich TextScript und das Eltern-grob zu dem es horizontal ausgerichtet wird, idR ist das die NoteColumn.
(Die vertikale Ausdehnung und Positionierung werde ich nicht thematisieren.)

Beide grobs haben ja eine gewisse horizontale Ausdehnung. TextScript wird zum Eltern-grob positioniert indem die Referenzpunkte beider grobs zu einander ausgerichtet werden. Die Referenzpunkte beider grobs liegen bei ihrer eigenen Null-Koordinate, relativ zur eigenen Ausdehnung.
Für die NoteColumn ist das meistens der außerste linke Rand. TextScript ist variabler, bei einfachem Text ist es jedoch ebenfalls der äußerste linke Rand.
Per default werden beide Referenzpukte so ausgerichtet, daß sie vertikal übereinander liegen.

Aber das kann man ändern.

Referenzpunkt des Eltern grob.
Mittels parent-alignment-X kann TextScript links, mittig oder rechts zum Eltern-grob ausgerichtet werden, d.h. der Referenzpunt des TextScript wird über den linken Rand, die Mitte oder den rechten Rand des Elterngrobs positioniert.

{
  b4^"x"
  \override TextScript.parent-alignment-X = #LEFT %% default
  b4^"x"
  \override TextScript.parent-alignment-X = #CENTER
  b4^"x"
  \override TextScript.parent-alignment-X = #RIGHT
  b4^"x"
}


Referenzpunkt des TextScript.
Mittels self-alignment-X wird TextScript links, mittig oder rechts zur eigenen Null-Koordinate gedruckt.

{
  b4^"x"
  \override TextScript.self-alignment-X = #LEFT %% default
  b4^"x"
  \override TextScript.self-alignment-X = #CENTER
  b4^"x"
  \override TextScript.self-alignment-X = #RIGHT
  b4^"x"
}


Darüberhinaus gibt es markup-commands, die die horizontale Ausdehnung und damit die Positionierung von TextScript verändern, z.B. \halign.
Grafische markup-commands haben die Null-Koordinate häufig nicht am linken Rand, z.B. bei \circle im Zentrum. \box läßt sein Argument für gewöhnlich unbeinflußt, fügt aber etwas hinzu, auch am linken Rand. \pad-around und andere ebenfalls etc, etc,

In Deinem Beispiel sind beide TextScript am linken Rand des Eltern-grob ausgerichtet (der default).
Allerdings ist die Null-Koordinate beim Griffbild mittig, beim einfachen Text ganz links.

HTH,
  Harm

buhtz

#4
Ich denke dieses Beispiel ist sehr gut um ein paar Basic an realem Code zu lernen. Der unten stehende Code läuft, dank eurer Hilfe, aber mir sind noch nicht alle Komponenten ganz klar.
Euren Ausführungen konnte ich leider, vermutlich Mangels Grundlagenwissen und fehlender Begriffe, nicht folgen.

\version "2.22.0"
diagrammD = {
          \once \override Score.RehearsalMark.extra-offset = #'(-5.4 . -23)
          \mark \markup {
            \null
            \woodwind-diagram
            #'saxophone
            #'((cc . (one two three four five six))
               (lh . ())
               (rh . ()))
          }
}
diagrammE = {
          \once \override Score.RehearsalMark.extra-offset = #'(-5.4 . -23)
          \mark \markup {
            \null
            \woodwind-diagram
            #'saxophone
            #'((cc . (one two three four five))
               (lh . ())
               (rh . ()))
          }
}       

diagrammF = {
          \once \override Score.RehearsalMark.extra-offset = #'(-5.4 . -23)
          \mark \markup {
            \null
            \woodwind-diagram
            #'saxophone
            #'((cc . (one two three four))
               (lh . ())
               (rh . ()))
          }
}       

#(print-keys-verbose 'saxophone)
\paper {
  #(set-paper-size "a4landscape")
  %#(set-paper-size "a4landscape" 'landscape)
}
#(set-global-staff-size 28)
\score{
    \relative {

        \textLengthOn
        d'1^\markup{D}
        \diagrammD

        \textLengthOn
        e^\markup{E}
        \diagrammE

        \textLengthOn
        f^\markup{F}
        \diagrammF
    }
}


Die Zeile \once \override Score.RehearsalMark.extra-offset = #'(-5.4 . -23) scheint etwas mit der Positionierung des Diagramms zu tun zu haben. Sofern ich eure Ausführungen verstanden habe, wird hier vermutlich ein Orientierungspunkt verschoben, an dem sich wiederum die Ausrichtung des Diagramms orientiert. Richtig?

In meinem Beispiel wird ja viel Code wiederholt. Lässt sich da etwas generalisieren und mit Parametern versehen? Scheme ist nicht so mein Ding, ich bin mehr der Python und C Typ.

EDIT: Auch auf StackExchange hatte ich dazu schon eine Frage positioniert, die bisher allerdings unbeantwortet ist.

EDIT2: Ich habe da auch noch ein Problem mit dem Linebreak: https://lilypondforum.de/index.php/topic,1042.0.html

harm6

Bitte versuche meinen post zum Thema zu verstehen, falls das nicht gelingt, frag bitte nach.

Noch eine zusätzliche Anmerkung: \markup ... ist eine Art Text-Eingabe-Modus. Dieser Text-Eingabe-Modus kann in und für diverse grobs genutzt werden. Den Code-Beispielen nach willst Du TextScript haben nicht RehearsalMark.
Ich rate also dringend davon ab hier \mark \markup ... zu verwenden. RehearsalMark ist ein gänzlich anderes grob mit eigenen defaults für die Positionerung. Es ist nie an eine Note oder NoteColumn gebunden und etc etc.
Don't.
Ansonsten entstehen völlig überflüssige Probleme wie:
https://lilypondforum.de/index.php/topic,1042.0.html

Auch rate ich von 'extra-offset ab, nur als "last resort". Eher X/Y-offset, padding, staff-padding, self-alignment-X, sowas in dieser Art.

buhtz

Folgende Begriffe sind mir unbekannt bzw. fühle ich mich auch mit der Doku unsicher im Verständnis. Ihr könnt hier auch gerne Analogien zu Programmiersprachen sie Python oder zum Textsatz mit *TeX machen. ;)


Ist ein "grob" die kleinste Einheit? So etwas wie ein Buchstabe/Zeichen in einem Text?

Ein "TextScript" ist in der Doku "einfach" erklärt. Es fehlen aber Beispiele und der Kontext. Das hilft mir nicht. OK, ein Ding, dass ich über oder unter einer Note platzieren kann. Fein. :D

Zu "RehearsalMark" finde ich nichts, was mir eine Idee davon gibt.

harm6

#7
Ein grob ist ein "graphical object".
Die einfachsten grobs haben eine Anweisung wie sie gedruckt werden sollen, d.h. eine procedure, die das fertige Druckbild, den stencil, ausgibt.
Es gibt auch andere grobs, ich nenne sie mal Container-grobs, die bestimmte andere grobs zueinander einregeln.
Z.B. die NoteColumn regelt u.a. Notenköpfe und Notenhals.

Das grob RehearsalMark ist ein Probenzeichen. Ist das nicht selbsterklärend?
Wichtig ist, daß Probenzeichen ein eigenes (aber nicht musikalisches) Element bilden, initiert mit \mark ...
Für gewöhnlich sind sie nur dort sinnvoll, wo man auch einen Taktstrich setzt.
Beim Zeilenwechsel werden sie per (änderbarem) default am Anfang der neuen Zeile gedruckt.

Das grob TextScript ist beliebiger Text, angehängt an eine Note oder ähnlichem.
Im Unterschied zum TextScript aber ebenfalls anzuhängen gibt es u.a. Script (alle Arten von Artikulationen), DynamicText, Fingering, StrokeFinger, StringNumber, sowie Objekte, die dort anfangen: Slur (Legatobogen), Tie (Haltebogen), PhrasingSlur, TextSpanner etc