Autor Thema: Automatische Textmarker-Markierungen  (Gelesen 1551 mal)

Thomas

  • Gast
Automatische Textmarker-Markierungen
« am: Freitag, 10. März 2017, 16:08 »
Hallo,

kann man einzelne Notenelemente automatisch farbig hinterlegen, wie zum Beispiel Wiederholungen, Tonartwechsel, Versetzungszeichen, ...?

\version "2.18.2"

\relative c' {
 
 c1
 \repeat volta 2 {
   c1
   cis1
 }
 \key g \major
 c1
 
}

fugenkomponist

  • Gast
Re: Automatische Textmarker-Markierungen
« Antwort #1 am: Freitag, 10. März 2017, 17:41 »
Kurze Antwort: Ja, kann man, ist halt evtl. relativ aufwendig (zumindest bis man ne erste Lösung hat, dann kann mans in ne Funktion packen und gut ist).

Lange Antwort: Man kann auf jeden Fall mit \markup etc. rumspielen; ich könnt mir sogar vorstellen, daß man das direkt im stencil der farbig zu hinterlegenden Grobs unterbringen kann. Bevor ich das aber probiere: Ist dir vielleicht schon damit geholfen, die einzelnen Grobs farbig zu drucken statt schwarz auf farbigem Hintergrund? Dann würde es reichen, das per (\once) \override zu ändern:
\override Staff.KeySignature.color = #greenUnd noch ein paar Detailfragen:
• Soll die Färbung alle Grobs des Typs betreffen (z. B. alle Tonartwechsel immer grün)? Davon hängt ab, wo der \override plaziert werden sollte.
• Sollen die Wiederholungen solche Klammern haben wie in rot angedeutet? Dafür gibt es startRepeatType und endRepeatType, die auf "[|:" und ":|]" statt ".|:" und ":|." gesetzt werden.
• Falls ein einfaches Färben nicht ausreicht: farbig umkringeln oder hinterlegen?

\version "2.18.2"

\relative c' {
  c1
  \once \override Staff.BarLine.color = #red
  \repeat volta 2 {
    c1
    \once \override Accidental.color = #darkyellow
    cis1
  }
  \once \override Staff.BarLine.color = #red
  \once \override Staff.KeySignature.color = #darkgreen
  \key g \major
  c1
}

harm6

  • Gast
Re: Automatische Textmarker-Markierungen
« Antwort #2 am: Samstag, 11. März 2017, 22:34 »
Zitat von: fugenkomponist
ich könnt mir sogar vorstellen, daß man das direkt im stencil der farbig zu hinterlegenden Grobs unterbringen kann.

Yup, z.B.:
\version "2.19.56"

#(define* (emphasize-in-color color padding #:optional (y-padding 0))
  (lambda (grob)
(let* ((stil (ly:grob-property grob 'stencil))
       (x-ext (ly:stencil-extent stil X))
       (y-ext (ly:stencil-extent stil Y)))
  (ly:grob-set-property! grob 'layer -100)
  (ly:grob-set-property! grob 'stencil
    (ly:stencil-add
      (stencil-with-color
        (make-filled-box-stencil
          (interval-widen x-ext padding)
          (interval-widen y-ext (+ y-padding padding)))
        color)
      stil)))))   

\relative c' {
  c1
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1)
  \repeat volta 2 {
    c1
    \once \override Accidental.after-line-breaking =
      #(emphasize-in-color yellow 0.2)
    cis1
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1)
   }
  \once \override Staff.KeySignature.after-line-breaking =
    #(emphasize-in-color green 0.2)
  \key g \major
  c1
}

Könnte man jetzt auch als Funktion kodieren ...


Gruß,
  Harm

fugenkomponist

  • Gast
Re: Automatische Textmarker-Markierungen
« Antwort #3 am: Samstag, 11. März 2017, 23:49 »
Das war so das Vorgehen, was mir vorgeschwebt ist von der Idee her, aber daß es in der Umsetzung tatsächlich so gut und übersichtlich geht, hätte ich nicht gedacht ;) Und selbst hätt ich wahrscheinlich ne ganze Weile gebraucht, um Dinge wie stencil-with-color oder interval-widen zu finden (oder letzteres auch selbst zu schreiben …).

harm6

  • Gast
Re: Automatische Textmarker-Markierungen
« Antwort #4 am: Sonntag, 12. März 2017, 00:22 »
Zitat
[...]
daß es in der Umsetzung tatsächlich so gut und übersichtlich geht, hätte ich nicht gedacht
Nun ja, komplizierter wird es wenn man items am Zeilenumbruch nur am Zeilenende oder -anfang farbig unterlegt haben möchte.
Aber da warte ich mal wie Thomas sich äußert. ;)

Zitat
stencil-with-color oder interval-widen
Dokumentiert ist:
Zitat von: IR
Function: ly:stencil-in-color stc r g b

    Put stc in a different color.
stencil-with-color ist aber häufig handlicher da eine vordefinierte Farbe übergeben werden kann.
Allerdings ist stencil-with-color definiert in stencil.scm, interval-widen in lily-library.scm. Im Gegensatz zu den in C++ definierten scheme-Funktionen werden die dortigen Definitionen nicht in die IR aufgenommen. Aber selbst die nur kursorische Lektüre dieser Dateien ist empfehlenswert.


Gruß,
  Harm

Thomas

  • Gast
Re: Automatische Textmarker-Markierungen
« Antwort #5 am: Montag, 13. März 2017, 19:37 »
Kurze Antwort: Ja, kann man, ist halt evtl. relativ aufwendig (zumindest bis man ne erste Lösung hat, dann kann mans in ne Funktion packen und gut ist).

Am Ende will ich am Liebsten nur noch \include "textmarker.ly" schreiben müssen.

Ist dir vielleicht schon damit geholfen, die einzelnen Grobs farbig zu drucken statt schwarz auf farbigem Hintergrund?

Nein, schon mit farbigem Hintergrund.

• Falls ein einfaches Färben nicht ausreicht: farbig umkringeln oder hinterlegen?

Umkringeln würde zur Not auch gehen.

Nun ja, komplizierter wird es wenn man items am Zeilenumbruch nur am Zeilenende oder -anfang farbig unterlegt haben möchte.
Aber da warte ich mal wie Thomas sich äußert. ;)

\version "2.18.2"

#(define* (emphasize-in-color color padding #:optional (y-padding 0))
  (lambda (grob)
(let* ((stil (ly:grob-property grob 'stencil))
       (x-ext (ly:stencil-extent stil X))
       (y-ext (ly:stencil-extent stil Y)))
  (ly:grob-set-property! grob 'layer -100)
  (ly:grob-set-property! grob 'stencil
    (ly:stencil-add
      (stencil-with-color
        (make-filled-box-stencil
          (interval-widen x-ext padding)
          (interval-widen y-ext (+ y-padding padding)))
        color)
      stil)))))   

\relative c' {
  c1
  \break
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1)
  \repeat volta 2 {
    c1
   }
     \once \override Staff.KeySignature.after-line-breaking =
    #(emphasize-in-color green 0.2)
  \key g \major
  \break
  c1
}


Der Code erzeugt auch einen roten Strich am Ende der ersten Notenzeile. Der würde stören. Der Tonartwechsel wird vorne und hinten angezeigt. Das wäre für mich OK.

harm6

  • Gast
Re: Automatische Textmarker-Markierungen
« Antwort #6 am: Montag, 13. März 2017, 23:54 »
Zitat
Am Ende will ich am Liebsten nur noch \include "textmarker.ly" schreiben müssen.
Die eigentlichen Befehle wirst Du aber immer noch in den music-stream einfügen müssen, oder eben alles spezifizierte färben.

Hier ein Code in dem Du für items angeben kannst ob (und wo) sie am Zeilenumbruch farbig unterlegt werden sollen.

Die procedure
(emphasize-in-color color padding #:optional (y-padding 0) dir)
trägt jetzt also zwei optionale Argumente. Nachteil: falls Du 'dir' setzt (möglich ist -1, 0, 1 für Zeilenende, immer, Zeilenanfang) dann musst Du y-padding ebenfalls setzen.

\version "2.19.56"

#(define* (emphasize-in-color color padding #:optional (y-padding 0) dir)
  (lambda (grob)
(let* ((stil (ly:grob-property grob 'stencil))
       (x-ext (ly:stencil-extent stil X))
       (y-ext (ly:stencil-extent stil Y))
       (item-break-dir
         (if (ly:item? grob)
             (ly:item-break-dir grob)
             #f))
       (stil-proc
         (lambda (stl)
           (ly:stencil-add
             (stencil-with-color
               (make-filled-box-stencil
                 (interval-widen x-ext padding)
                 (interval-widen y-ext (+ y-padding padding)))
               color)
             stl))))
       
  (ly:grob-set-property! grob 'layer -100)
  (ly:grob-set-property! grob 'stencil
    (if (or (or (not dir) (zero? dir))
            (and dir (equal? item-break-dir dir)))
        (stil-proc stil)
        stil)))))


\relative c' {
  c1
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1)
  \repeat volta 2 {
    c1
    \once \override Accidental.after-line-breaking =
      #(emphasize-in-color yellow 0.2)
    cis1
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1)
   }
%  \break
  \repeat volta 2 {
    \once \override Staff.KeySignature.after-line-breaking =
      #(emphasize-in-color green 0.2)
    \key g \major
    c1
  }
}

Funktioniert jetzt für alle items. Grobs sind entweder items oder spanners. Willst Du es für spanner auch noch haben?


Gruß,
  Harm

Thomas

  • Gast
Re: Automatische Textmarker-Markierungen
« Antwort #7 am: Dienstag, 14. März 2017, 13:05 »
Zitat
Am Ende will ich am Liebsten nur noch \include "textmarker.ly" schreiben müssen.
Die eigentlichen Befehle wirst Du aber immer noch in den music-stream einfügen müssen, oder eben alles spezifizierte färben.
Wunschvorstellung von mir wäre: Am Anfang einer bestehenden Datei '\include "textmarker.ly"' oder was ähnliches hinschreiben und danach sind alle Wiederholungen, Tonartwechsel, Dal Segnos, Codas, mit '!' und '?' erzeugte Versetzungszeichen farbig angestrichen.  Wenn man die Befehle einzeln einfügen muss, wäre das ein großer Aufwand.

\version "2.19.54"

#(define* (emphasize-in-color color padding #:optional (y-padding 0) dir)
  (lambda (grob)
(let* ((stil (ly:grob-property grob 'stencil))
       (x-ext (ly:stencil-extent stil X))
       (y-ext (ly:stencil-extent stil Y))
       (item-break-dir
         (if (ly:item? grob)
             (ly:item-break-dir grob)
             #f))
       (stil-proc
         (lambda (stl)
           (ly:stencil-add
             (stencil-with-color
               (make-filled-box-stencil
                 (interval-widen x-ext padding)
                 (interval-widen y-ext (+ y-padding padding)))
               color)
             stl))))
       
  (ly:grob-set-property! grob 'layer -100)
  (ly:grob-set-property! grob 'stencil
    (if (or (or (not dir) (zero? dir))
            (and dir (equal? item-break-dir dir)))
        (stil-proc stil)
        stil)))))


\relative c' {
  c1
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1 1)
  \noBreak
  \repeat volta 2 {
    c1^\markup { dir 1 }
   }
    c1
  \break
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1 1)
   \repeat volta 2 {
    c1^\markup { dir 1 }
   }
    c1
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1 0)
  \noBreak
  \repeat volta 2 {
    c1^\markup { dir 0 }
   }
    c1
  \break
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1 0)
   \repeat volta 2 {
    c1^\markup { dir 0 }
   }
    c1
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1 -1)
  \noBreak
  \repeat volta 2 {
    c1^\markup { dir -1 }
   }
    c1
  \break
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1 -1)
   \repeat volta 2 {
    c1^\markup { dir -1 }
   }
    c1
 
}

Bei einer Wiederholung wird bei 'dir 1' nur das Wiederholungszeichen am Zeilenanfang markiert, aber nicht in der Zeilenmitte.

Funktioniert jetzt für alle items. Grobs sind entweder items oder spanners. Willst Du es für spanner auch noch haben?

Was ist der Unterschied zwischen spanners und items?
Sind items Noten, Taktstriche, ...?
Sind spanners Crescendos, Legatos, ...?


fugenkomponist

  • Gast
Re: Automatische Textmarker-Markierungen
« Antwort #8 am: Dienstag, 14. März 2017, 17:12 »
[quote author=Thomas link=topic=2521.msg14265#msg14265 date=148949312
Wunschvorstellung von mir wäre: Am Anfang einer bestehenden Datei '\include "textmarker.ly"' oder was ähnliches hinschreiben und danach sind alle Wiederholungen, Tonartwechsel, Dal Segnos, Codas, mit '!' und '?' erzeugte Versetzungszeichen farbig angestrichen.  Wenn man die Befehle einzeln einfügen muss, wäre das ein großer Aufwand.
[/quote]
Bin grad unterwegs und hab nicht viel Zeit, aber: Für Tonartwechsel und ? geht das relativ einfach (weil die eigene Grobs haben, die man einfach ansprechen kann), bei Wiederholungen, Segno und Coda sowie Vorzeichen per ! müßte man irgendwie ne Fallunterscheidung machen (Wiederholungen sind BarLines, also nicht ganz einfach von anderen Taktstrichen zu unterscheiden, ähnlich Segno und Coda RehearsalMrks und ! Accidentals).
Zitat
Was ist der Unterschied zwischen spanners und items?
Sind items Noten, Taktstriche, ...?
Sind spanners Crescendos, Legatos, ...?
Genau. Weitere spanners sind z. B. Oktavierungsklammern, Textspanner, Glissandi, Haltebögen …

harm6

  • Gast
Re: Automatische Textmarker-Markierungen
« Antwort #9 am: Dienstag, 14. März 2017, 21:09 »
Zitat
alle Wiederholungen, Tonartwechsel, Dal Segnos, Codas, mit '!' und '?' erzeugte Versetzungszeichen
Hm,
(1)
bei Wiederholungen müßte man dann alle einfachen BarLines vom färben ausschließen.
Aber was soll man unter "einfache BarLines" verstehen? Nur "|" oder auch "||". Was ist mit "!" oder ";" oder "S"?
(2)
Wie sind "Dal Segnos, Codas" angegeben?
Als TextScript, RehearsalMark oder noch anders?

Das zumindest müßte man beantwortet wissen und vorausschauend codiert haben, um generelle overrides zu ermöglichen.

Zitat
Bei einer Wiederholung wird bei 'dir 1' nur das Wiederholungszeichen am Zeilenanfang markiert, aber nicht in der Zeilenmitte.
In der Tat, denn so habe ich es kodiert.
Ich habe generelle overrides als wahrscheinlich zu aufwändig nicht in Betracht gezogen.

Zitat
Was ist der Unterschied zwischen spanners und items?
Nun, programmiertechnisch sind grobs spanner wenn sie auf (ly:spanner? grob) #t returnieren, items entsprechend.
spanner haben bounds zwischen denen sie "gespannt" sind.

Du wirst meistens nicht fehl gehen wenn Du Grenzen eines spanners findest, z.B. Die Hairpin geht von dieser Note zu jener Note.
Im Unterschied z.B. zu einem markup mit angegebener line-width. Dises markup ist zwar irgendwo verankert, die Ausdehnung nach rechts ist aber durch die line-width begrenzt nicht durch ein anderes grob.

Es gibt aber auch Beispiele, die nicht ganz so einfach nachzuvollziehen sind, z.B ist die MultiMeasureRestNumber ein spanner. ;)

Gruß,
  Harm



Thomas

  • Gast
Re: Automatische Textmarker-Markierungen
« Antwort #10 am: Mittwoch, 15. März 2017, 16:32 »
(1)
bei Wiederholungen müßte man dann alle einfachen BarLines vom färben ausschließen.
Aber was soll man unter "einfache BarLines" verstehen? Nur "|" oder auch "||". Was ist mit "!" oder ";" oder "S"?
(2)
Wie sind "Dal Segnos, Codas" angegeben?
Als TextScript, RehearsalMark oder noch anders?

Das zumindest müßte man beantwortet wissen und vorausschauend codiert haben, um generelle overrides zu ermöglichen.
zu (1): "einfache BarLines" wären für mich alle Taktstriche zu denen ich nicht hin- oder wegspringen muss, also "|", "||", "!", ";"
vielleicht kann man ja eine White- oder Blacklist machen in der alle Arten von Barlines drinstehen die (nicht) eingefärbt werden sollen.

zu (2): Dal Segno: \bar"S" und Varianten ("S-S", "S.|:", ...)   
Coda: \mark \markup { \musicglyph #"scripts.coda" }

Zitat
Bei einer Wiederholung wird bei 'dir 1' nur das Wiederholungszeichen am Zeilenanfang markiert, aber nicht in der Zeilenmitte.
In der Tat, denn so habe ich es kodiert.
Ich habe generelle overrides als wahrscheinlich zu aufwändig nicht in Betracht gezogen.
Das ist jetzt halt aufwändig, wenn man für jede Wiederholung prüfen muss, ob sie am Zeilenende oder nicht ist, um 'dir' entsprechend zu setzen. Und dann ändert sich eine Kleinigkeit und alles verschiebt sich um 1 Takt.


Ich habe beim testen festgestellt, dass die Voltenklammern nach oben verschoben werden, wenn man den Taktstrich einfärbt.
\version "2.18.2"

#(define* (emphasize-in-color color padding #:optional (y-padding 0) dir)
  (lambda (grob)
(let* ((stil (ly:grob-property grob 'stencil))
       (x-ext (ly:stencil-extent stil X))
       (y-ext (ly:stencil-extent stil Y))
       (item-break-dir
         (if (ly:item? grob)
             (ly:item-break-dir grob)
             #f))
       (stil-proc
         (lambda (stl)
           (ly:stencil-add
             (stencil-with-color
               (make-filled-box-stencil
                 (interval-widen x-ext padding)
                 (interval-widen y-ext (+ y-padding padding)))
               color)
             stl))))
       
  (ly:grob-set-property! grob 'layer -100)
  (ly:grob-set-property! grob 'stencil
    (if (or (or (not dir) (zero? dir))
            (and dir (equal? item-break-dir dir)))
        (stil-proc stil)
        stil)))))


\relative c' {
  c1
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1)
  \repeat volta 2 {
    c1
}
\alternative{
   {
      c1
      \once \override Staff.BarLine.after-line-breaking =
      #(emphasize-in-color red 0.2 1)
   }
   {
      c1
   }
}
    c1
}

\relative c' {
  c1
  \once \override Staff.BarLine.after-line-breaking =
    #(emphasize-in-color red 0.2 1)
  \repeat volta 2 {
    c1
}
\alternative{
   {
      c1
   }
   {
      c1
   }
}
    c1
}