Autor Thema: Ghost Notes Global Ändern  (Gelesen 6438 mal)

schlomo

  • Gast
Ghost Notes Global Ändern
« am: Donnerstag, 8. März 2012, 12:28 »
liebe lilypond-Experten,
ich würde gerne für eine Schlagzeugnotation eine "Funktion" oder etwas ähnliches schreiben, welche Global im gesamten Dokument das Erscheinnungsbild der Ghost-Notes ändert die ich mit dem Befehl "\parenthesize" erstellet habe.
Normalerweise werden  bei "\parenthesize" die bestehenden Notenköpfe in Klammern gesetzt. Ich würde gerne einfach den Notenkopf (und die Klammern) ausblenden.

Ist so etwas überhaut möglich mit lylipond?

Ich habe schon versucht statt "\parenthesize" einfach Manuell mit "\once \override NoteHead #'transparent = ##t" den Notenkopf auszublenden.
Allerdings funktioniert das nicht wenn ich mehrere Noten untereinander platziere:
<< \once \override NoteHead #'transparent = ##t snare8 bassdrum8>>
dann werden nämlich immer ALLE Noten in "<<  ... >>" ohne Notenkopf dargestellt

 
Schlomo




harm6

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #1 am: Donnerstag, 8. März 2012, 12:40 »
Hallo Schlomo,

willkommen im Forum!

Im Moment kann ich mich nicht mit Deiner Frage beschäftigen, frühestens heute abend/nacht.
Es würde mir aber sehr helfen, wenn Du ein kurzes kompilierbares Beispiel mit Angabe der Versionsnummer posten könntest welches das Problem und Deine bisherigen Lösungsversuche zeigt. (Das solltest Du übrigens immer machen!!)

Zitat
Ist so etwas überhaut möglich mit lylipond?

Meine Devise: lily kann alles! ;)

Gruß,
  Harm

Arnold

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #2 am: Donnerstag, 8. März 2012, 12:45 »
Hallo,

schon mal »\tweak« angesehen. Damit kann man Attribute zu einzelnen Notenköpfen eines Akkords ändern. Die Standardbeispiele machen's mit Farbe bzw. Notenkopfgröße.
Und es gibt Beispiele, wie der lange tweak-Text als Scheme-Funktion definiert werden kann, so wie im gerade laufenden Thread »Vorzeichen in Akkorden«.

Aber vielleicht liefert Harm ja schon bis heute abend die fertige Lösung.

schlomo

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #3 am: Donnerstag, 8. März 2012, 15:13 »
Hallo harm6,
danke für die flinke Antwort!

Es würde mir aber sehr helfen, wenn Du ein kurzes kompilierbares Beispiel mit Angabe der Versionsnummer posten könntest welches das Problem und Deine bisherigen Lösungsversuche zeigt. (Das solltest Du übrigens immer machen!!)

Hier ist mein Code:


\version "2.14.0"  % necessary for upgrading to future LilyPond versions.
\layout {
}

\header { tagline = ##f }
#(set-global-staff-size 20)

\paper  {
   system-system-spacing #'basic-distance = #20
   indent = #(* mm 0)
   top-margin = #(* mm 20)
}

\layout {
  \context {
    \Score
    %\remove "Bar_number_engraver"
  }
}

#(define mydrums '(
      (bassdrum      default            #f         -5)
      (snare         default            #f          0)
      (hihat         cross            #f          5)
      (pedalhihat      cross            #f         -3)
      (openhihat      xcircle            #f          5)
      (lowtom         default            #f          1)
      (hightom      default            #f          3)
      (lowfloortom   default            #f         -1)
      (ridecymbal      harmonic-black      #f          6)
      (ridebell      harmonic-black      #f          5)
      (crashcymbal   harmonic-black      #f          7)
      )
)

oben = \drummode {
\numericTimeSignature
\time 4/4
   {
   \override TextScript #'script-priority = #100
   cymc8\upbow rb
   rb16 rb16 rb8
   rb8 rb16 rb16
   rb8 rb16 rb16
   }
}

unten = \drummode
   {
   bd16 hhp sn hhp
   sn16 hhp8 << sn16 hhp >>
   %Hier ist der Fehler. sn16 wird ohne Notenkopf dargestellt. Leider aber auch hhp
   bd16 << \once \override NoteHead #'transparent = ##t sn16  hhp >> << \parenthesize sn >> hhp
   r16 << sn8 hhp >> hhp16
   }

\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \unten }
>>



Danke
Gruß
Schlomo


PS:
Du kannst mir bei der Gelegenheit sicher auch verraten wie ich im unteren Drummode alle Notenbalken Waagrecht und auf gleicher Höhe verlaufen lassen kann ;)
« Letzte Änderung: Donnerstag, 8. März 2012, 16:10 von schlomo »

harm6

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #4 am: Donnerstag, 8. März 2012, 23:02 »
Hallo Schlomo,

also ein kurzes Beispiel in diesem Sinne war das jetzt nicht. ;) Aber es war auch nicht so lang, das einem die Lust vergeht dran zu arbeiten. (Als Negativ-Beispiel denke ich noch mit Schaudern an einen Post auf der englischen Liste: ~8000 Zeilen Code, in Worten: achttausend!).
Aber benutze bitte den "Code einfügen"-Button, wenn Du Code posten möchtest, der länger als zwei Zeilen ist.

Zum Problem:
  • Transparenz: Wie Arnold schon sagte, der tweak-Befehl muß hier zur Anwendung kommen. Bitte beachte die < ... > Klammern!
  • Bebalkung: Ich finde die default-Bebalkung eigentlich völlig in Ordnung.
    Aber falls Du immer waagerechte Balken haben willst: \override Beam #'damping = #+inf.0 Sie sind dann allerdings nicht immer auf gleicher Höhe.
    Ansonsten benutze: \override Beam #'positions = #'(-5 . -5) Bei gleichen Werten ist der Balken waagerecht und da das ein dauerhafter Befehl ist (bis zur Aufhebung), sind die Balken auch auf gleicher Höhe.
  • Ich wäre ein bißchen Vorsichtig mit dem << ... >> -Konstrukt (zumindest so wie Du es anwendest). Irgenwo in meinem Hinterkopf läutet eine kleine Alarmglocke. Ich kann mich aber beim besten Willen nicht mehr erinnern warum, vielleicht versteckt sich irgendwo ein bug, der manchmal erscheint. Irgendwie sowas war das.
    Deshalb, warum nicht normale Akkorde notieren mit < ... > -Klammern?

Der Code:

\version "2.14.0"  % necessary for upgrading to future LilyPond versions.
\layout {
}

\header { tagline = ##f }
#(set-global-staff-size 20)

\paper  {
   system-system-spacing #'basic-distance = #20
   indent = #(* mm 0)
   top-margin = #(* mm 20)
}

\layout {
  \context {
    \Score
    %\remove "Bar_number_engraver"
  }
}

#(define mydrums '(
      (bassdrum      default            #f         -5)
      (snare         default            #f          0)
      (hihat         cross            #f          5)
      (pedalhihat      cross            #f         -3)
      (openhihat      xcircle            #f          5)
      (lowtom         default            #f          1)
      (hightom      default            #f          3)
      (lowfloortom   default            #f         -1)
      (ridecymbal      harmonic-black      #f          6)
      (ridebell      harmonic-black      #f          5)
      (crashcymbal   harmonic-black      #f          7)
      )
)

oben = \drummode {
\numericTimeSignature
\time 4/4
   {
   \override TextScript #'script-priority = #100
   cymc8\upbow rb
   rb16 rb16 rb8
   rb8 rb16 rb16
   rb8 rb16 rb16
   }
}

unten = \drummode
   {
           %\override Beam #'damping = #+inf.0
           \override Beam #'positions = #'(-5 . -5)
   bd16 hhp sn hhp
   sn16 hhp8 << sn16 hhp >>
   %Hier ist der Fehler. sn16 wird ohne Notenkopf dargestellt. Leider aber auch hhp
   % \tweak löst das Problem!
   bd16 << <\tweak #'transparent  ##t sn>16  hhp >> << \parenthesize sn >> hhp
   r16 << sn8 hhp >> hhp16
   }

\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \unten }
>>

Aber eigentlich heißt der Thread ja "Ghost Notes Global Ändern". Der \tweak-Befehl wirkt jedoch punktuell, also völlig entgegengesetzt. Ob man da irgenwas globales machen kann, weiß ich noch nicht.

HTH,
  Harm

Arnold

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #5 am: Freitag, 9. März 2012, 09:17 »
Hallo,

ich habe noch mal versucht, unabhängig von der Überschricht, Dein Problem zu beschreiben.

So wie ich die Bescheibung verstehe, geht es darum, an einzelnen Noten bzw. Notenköpfen eine »kurze« Information anzuhängen, damit anschließend en Kreuz-Notenkopf benutzt wird.
Nur eine Lösungsmöglichkeit könnte eine «globale Funktion« sein, welche einen (einfach einzugebenen) »Stellvertreter« in ein anderes (das gewünschte) Objekt umwandelt.

Die aktuelle Lösung mit tweak macht die Änderung direkt am Notenkopf. Der ganze tweak-Befehl kann zu einem kurzen Schlässelwort zusammengefaßt werden, welches dann im Akkord (einfache spitze Klammer) der Tonhöhe vorangestellt wird - anstelle des \parenthesize.

Würde die Information als Artikulation angehängt (wie das Staccato »-.« ) müßte ich auch auf getrennte Notenhälse (mehrere parallele Stimmen) ausweichen.

Da das ganze in einer Schlagzeugstimme geschehen soll, stelle ich mir noch die Frage, ob man nicht einen (oder mehrere) passende weitere »Schlaginstumentpitches« definieren kann, die dann mit Kreuzkopf dargestellt werden. Aber mit Schlagzeugnotation (Drumstaff) habe ich leider keine Erfahrung.

Und zu guter Letzt, ich glaube mich zu entsinnen, in der Version 2.15.30 irgendwas mit Ghostnotes als neues Feature gelesen zu haben. (Handbuch notation.pdf in englisch, für 2.15.31, Kaptitel 2.5.1, Seite 353 - aber das ist nur ein Einklammern)

Vielleicht ist auch eine Funktion machbar, welche das \parenthesize in ein entsprechendes \tweak umwnadelt. Doch sinnvoll ist da nur noch, wenn ich Quellen, die \parenthesize benutzen, ohne Änderung in der Quelle mit den anderen Notenköpfen anstelle des Einklammerns darstellen will.

Arnold

harm6

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #6 am: Freitag, 9. März 2012, 11:38 »
Hallo,

@Arnold
Zitat
So wie ich die Bescheibung verstehe, geht es darum, an einzelnen Noten bzw. Notenköpfen eine »kurze« Information anzuhängen, damit anschließend en Kreuz-Notenkopf benutzt wird.
Ich glaube eher, daß die erstmal eingeklammerten Noten so bearbeitet werden sollen, daß anderer Output möglich wird. (Der Kreuz-Notenkopf wird ja schon in der mydrums-alist als default-Notenkopf für für zwei verschiedene Schlagzeuginstrumente benutzt)

@Schlomo
Ich hab' mal affect-parenthesized-note-heads definiert. Es werden nur eingeklammerte Noten ausgelesen, d.h. eingeklammerte Pausen bleiben unberücksichtigt)
Diese Definition verlangt noch ein property und einen value.
Ich habe dann mal ein paar Anwendungsmöglichkeiten in den Code gepackt. Warum mir die Änderung der Größe nicht gelingt weiß ich allerdings nicht. Arnold: weißt Du Rat?

\version "2.14.0"  % necessary for upgrading to future LilyPond versions.

#(define ((affect-parenthesized-note-heads property value) grob)
     (let* ((sys (ly:grob-system grob))
            (array (ly:grob-object sys 'all-elements))
            (grob-name (lambda (x) (assq-ref (ly:grob-property x 'meta) 'name)))
            (note-heads (ly:grob-object grob 'note-heads))
            (note-heads-grobs (if (not (null? note-heads))
            (ly:grob-array->list note-heads)
            '()))
            (par-lst (filter (lambda (x) (eq? 'ParenthesesItem (grob-name x)))
                                (ly:grob-array->list array)))
            (rel-coord (lambda (z) (ly:grob-relative-coordinate z sys X)))
            (proc (lambda (x)
                      (if (eq? (ly:prob-property (ly:grob-property x 'cause) 'parenthesize ) #t)
                        (begin
                          (ly:grob-set-property! x property value)
                          (map (lambda (y)
                          (if (= (rel-coord x) (rel-coord y))
                            (ly:grob-set-property! y 'transparent #t)
                            #f))
                          par-lst))
                        #f))))
        (map proc note-heads-grobs)))
       
colorParenthesizedNoteHeads = \override Staff.NoteColumn #'after-line-breaking =
#(affect-parenthesized-note-heads 'color (x11-color 'grey66))

makeTransparentParenthesizedNoteHeads = \override Staff.NoteColumn #'after-line-breaking =
#(affect-parenthesized-note-heads 'transparent #t)

% Funktioniert nicht. Warum?
smallerParenthesizedNoteHeads = \override Staff.NoteColumn #'after-line-breaking =
#(affect-parenthesized-note-heads 'font-size -3)

#(define (new-stil grob)
   (grob-interpret-markup grob (markup
      #:with-color red
      #:fontsize -2
      #:rotate -90 ":)")))
     
newStencilParenthesizedNoteHeads = \override Staff.NoteColumn #'after-line-breaking =
#(affect-parenthesized-note-heads 'stencil new-stil)

%--- Test

\layout {
}

\header { tagline = ##f }
#(set-global-staff-size 20)

\paper  {
   system-system-spacing #'basic-distance = #20
   indent = #(* mm 0)
   top-margin = #(* mm 20)
}

\layout {
  \context {
    \Score
    %\remove "Bar_number_engraver"
  }
}

#(define mydrums '(
      (bassdrum      default            #f         -5)
      (snare         default            #f          0)
      (hihat         cross            #f          5)
      (pedalhihat      cross            #f         -3)
      (openhihat      xcircle            #f          5)
      (lowtom         default            #f          1)
      (hightom      default            #f          3)
      (lowfloortom   default            #f         -1)
      (ridecymbal      harmonic-black      #f          6)
      (ridebell      harmonic-black      #f          5)
      (crashcymbal   harmonic-black      #f          7)
      )
)

oben = \drummode {
\numericTimeSignature
\time 4/4
   {
   \override TextScript #'script-priority = #100
   cymc8\upbow rb
   rb16 rb16 rb8
   rb8 rb16 rb16
   rb8 rb16 rb16
   }
}

unten = \drummode
   {
           %\override Beam #'damping = #+inf.0
           \override Beam #'positions = #'(-5 . -5)
   bd16 hhp sn hhp
   sn16 hhp8 < sn hhp >16
   bd16 < \parenthesize sn  hhp >16 << \parenthesize sn >> hhp
   r16 << sn8 hhp >> hhp16
   }
\markup \bold "Original"

\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \unten }
>>

\markup \bold "Mit Farbe, hier: grau"

\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \colorParenthesizedNoteHeads \unten }
>>


\markup \bold "Transparent"

\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \makeTransparentParenthesizedNoteHeads \unten }
>>
% Funktioniert nicht. Warum?
% \new DrumStaff <<
%   \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
%   \new DrumVoice { \voiceOne \oben }
%   \new DrumVoice { \voiceTwo \smallerParenthesizedNoteHeads \unten }
% >>

\markup \bold "Neuer Notenkopf"

\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \newStencilParenthesizedNoteHeads \unten }
>>

HTH,
  Harm

schlomo

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #7 am: Freitag, 9. März 2012, 13:20 »
Hallo Harm, hallo Arnold

Fantastisch!
es klappt
die "Gohstys" sind genau so wie ich es wollte.
- Ohne Notenkopf.
- Global geregelt.
- Es besteht aber trotzdem noch die Möglichkeit Sonderzeichen für Artikulation und Handsatz hinzuzufügen.

@ Harm
mit

bd16 hhp sn hhp
\once\override Beam #'positions = #'(-5 . -5)


klappt es sogar einzelne Notenbalken waagrecht auszurichten!

Mit "<< >>" hatte ich bisher noch keine Probleme, und immerhin ist die Schlagzeugpartitur schon 32 Takte lang
allerdings hat die log-File manchmal gemeckert wenn ich nur "< >" benutzt habe.

Ich muss aber eingestehen, dass mir die Syntax von Lilypond noch "etwas" Schleierhaft ist.

Ansonsten gilt:
Danke, Danke, Danke!

Schönes WE
viele Grüße
Schlomo



 

harm6

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #8 am: Samstag, 10. März 2012, 02:08 »
Hallo Schlomo,

schön, daß es Dir gefällt!

Mir ließ es aber keine Ruhe, daß ich die Größenveränderung nicht hinbekommen habe.

Jetzt schon! Allerdings mußte ich den 'stencil manipulieren und mir ist nach wie vor schleierhaft, warum dieser Aufwand nötig war:

\version "2.14.0"  % necessary for upgrading to future LilyPond versions.

#(define ((affect-parenthesized-note-heads property value) grob)
     (let* ((sys (ly:grob-system grob))
            (array (ly:grob-object sys 'all-elements))
            (grob-name (lambda (x) (assq-ref (ly:grob-property x 'meta) 'name)))
            (note-heads (ly:grob-object grob 'note-heads))
            (note-heads-grobs (if (not (null? note-heads))
            (ly:grob-array->list note-heads)
            '()))
            (par-lst (filter (lambda (x) (eq? 'ParenthesesItem (grob-name x)))
                                (ly:grob-array->list array)))
            (rel-coord (lambda (z) (ly:grob-relative-coordinate z sys X)))
            (proc (lambda (x)
                      (if (eq? (ly:prob-property (ly:grob-property x 'cause) 'parenthesize ) #t)
                        (begin
                          (ly:grob-set-property! x property value)
                          ;(ly:prob-set-property! x 'tweak (cons 'font-size 8))
                          (map (lambda (y)
                          (if (= (rel-coord x) (rel-coord y))
                            (ly:grob-set-property! y 'transparent #t)
                            #f))
                          par-lst))
                        #f))))
        (map proc note-heads-grobs)))
       
colorParenthesizedNoteHeads = \override Staff.NoteColumn #'after-line-breaking =
#(affect-parenthesized-note-heads 'color (x11-color 'grey66))

makeTransparentParenthesizedNoteHeads = \override Staff.NoteColumn #'after-line-breaking =
#(affect-parenthesized-note-heads 'transparent #t)

#(define (smaller-stencil grob)
  (let* ((sys (ly:grob-system grob))
         (rel-coord (lambda (z) (ly:grob-relative-coordinate z sys X))) 
         (note-heads (ly:grob-object grob 'note-heads))
         (note-heads-grobs (if (not (null? note-heads))
                       (ly:grob-array->list note-heads)
                       '()))
         (n-c-coord (rel-coord (ly:grob-parent grob X)))
         (n-h-coord (rel-coord grob))
         (stencil (ly:note-head::print grob))
         (stencil-length-x (interval-length (ly:stencil-extent stencil X)))
         (new-stencil (ly:stencil-scale stencil 0.7 0.7))
         (new-stencil-length-x (interval-length (ly:stencil-extent new-stencil X)))
         (stem (ly:grob-object grob 'stem))
         (stem-dir (ly:grob-property stem 'direction))
         (diff (- stencil-length-x new-stencil-length-x)))
  (ly:stencil-translate-axis
    new-stencil
    (cond ((< stem-dir 0)
           (if (> n-c-coord n-h-coord)
             diff
             0))
          ((> stem-dir 0)
           (if (>= n-c-coord n-h-coord)
             diff
             0)))
    X)))
   
smallerParenthesizedNoteHeads = \override Staff.NoteColumn #'stencil =
#(affect-parenthesized-note-heads 'stencil smaller-stencil)

#(define (new-stil grob)
   (grob-interpret-markup grob (markup
      #:with-color red
      #:fontsize -2
      #:rotate -90 ":)")))
     
newStencilParenthesizedNoteHeads = \override Staff.NoteColumn #'after-line-breaking =
#(affect-parenthesized-note-heads 'stencil new-stil)

%--- Test

\layout {
}

\header { tagline = ##f }
#(set-global-staff-size 20)

\paper  {
   system-system-spacing #'basic-distance = #20
   indent = #(* mm 0)
   top-margin = #(* mm 20)
}

\layout {
  \context {
    \Score
    %\remove "Bar_number_engraver"
  }
}

#(define mydrums '(
      (bassdrum      default            #f         -5)
      (snare         default            #f          0)
      (hihat         cross            #f          5)
      (pedalhihat      cross            #f         -3)
      (openhihat      xcircle            #f          5)
      (lowtom         default            #f          1)
      (hightom      default            #f          3)
      (lowfloortom   default            #f         -1)
      (ridecymbal      harmonic-black      #f          6)
      (ridebell      harmonic-black      #f          5)
      (crashcymbal   harmonic-black      #f          7)
      )
)

oben = \drummode {
\numericTimeSignature
\time 4/4
   {
   \override TextScript #'script-priority = #100
   cymc8\upbow rb
   rb16 rb16 rb8
   rb8 rb16 rb16
   rb8 rb16 rb16
   }
}

unten = \drummode
   {
           %\override Beam #'damping = #+inf.0
           \override Beam #'positions = #'(-5 . -5)
   bd16 hhp sn hhp
   sn16 hhp8 < sn hhp >16
   bd16 <  \parenthesize  sn hhp >16 << \parenthesize sn >> hhp
   r16 << sn8 hhp >> hhp16
   }
\markup \bold "Original"

\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \unten }
>>

\markup \bold "Mit Farbe, hier: grau"

\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \colorParenthesizedNoteHeads \unten }
>>

\markup \bold "Transparent"

\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \makeTransparentParenthesizedNoteHeads \unten }
>>

\markup \bold "Kleiner Notenkopf"
 \new DrumStaff <<
   \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
   \new DrumVoice { \voiceOne \oben }
   \new DrumVoice { \voiceTwo \smallerParenthesizedNoteHeads \unten }
 >>

\markup \bold "Neuer Notenkopf"

\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \newStencilParenthesizedNoteHeads \unten }
>>

\markup \bold "Mit Noten im Sekundabstand"

\relative c'' {
        %\colorParenthesizedNoteHeads
        %\makeTransparentParenthesizedNoteHeads
        \smallerParenthesizedNoteHeads
        %\newStencilParenthesizedNoteHeads
        <d \parenthesize f  \parenthesize g  b>4
        <d, \parenthesize f  \parenthesize g  b>
}

Gruß,
  Harm

P.S.

Zitat
allerdings hat die log-File manchmal gemeckert wenn ich nur "< >" benutzt habe.

Bei "< ... >" muß der Notenwert hinter die Klammer z.B. <c e g>8. Zumindest vermute ich, daß das Problem so lag.

Arnold

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #9 am: Mittwoch, 14. März 2012, 10:05 »
Hallo Harm,

ich habe auch ein bischen herumprobiert und nachgedacht und bin zum Schluß gekommen, daß es mit einem Caching Mechanismus zusammenhängt. Dafär spricht sowohl deine Beobachtung, daß ein Überladen des Stencil im »after-line-breaking« zum Ergebnis führt, und genauso die Beobachtung bei meinen »pitched Accidentals«, daß diese Callbacks nur einmal aufgerufen werden (und nicht zweimal, mämlich zuerst für die Größendefinition, und später für die Ausgabe nocheinmal).
Ich habe noch nicht untersucht, ob ein anderer YIELD-Wert zu einem anderen Caching-Verhalten führt.

Nun zu ein bischen Theorie.
Ich sehe drei praktikable Wege für diese Veränderungen:
- eine Music-Function, welche ein ly:music? mit parenthesize liest, und eine modifizierte ly:muisc? mit \tweak ... zurückgibt.
- eine »before-line-breaking«-Funktion, die abläuft noch bevor die Ausdehnung der GROBs evaluiert wird.
- eine »after-line-breaking«-Funktion (wie du es programmiert hast), bevor die Grafik (in die PS-Datei) ausgegeben wird.

Den zweiten Weg habe ich ein bischen ausprobiert - also bevor der Notenkopf und der Notenhals »gerückt« werden - und da funktionierts mit dem Setzen des font-size. Wie ich vom Notehead-Grob zum Parenthesize grob komme, habe ich aber noch nicht herausgefunden. Und alle ParenthesesItem-Grobs in die Aptose zu schicken, habe ich auch noch nicht ausprobiert. Da bin ich mir aber noch nicht sicher, ob ich nicht zuviel entferne.
\version "2.14.0"  % necessary for upgrading to future LilyPond versions.

#(define (twitter notehead-grob)
  (let*
   ((is-par (ly:event-property (event-cause notehead-grob) 'parenthesize))
   )
   (if (not (null? is-par))
    (begin
     ; (display "\nis-par = ") (display is-par)
     (if is-par
      (begin
       ; (display "\n Parenthesized Notehad ... ")
       ; (ly:grob-set-property! notehead-grob 'color (x11-color 'green))
       (ly:grob-set-property! notehead-grob 'font-size -4)
       (ly:grob-set-property! notehead-grob 'parenthesize #f)                 ; no effect (parenthesis grob allready exists?)
       (ly:event-set-property! (event-cause notehead-grob) 'parenthesize #f)  ; no effect (parenthesis grob allready exists?)
       ; How to find the associated parenthesis grob, to execute 'ly:grob-suicde!' ?
      )
     )
    )
   )
  )
 )

% Funktioniert nicht mit after-line-breaking. Warum?
% #(define (affect-parenthesized-note-heads-size-three grob) ((affect-parenthesized-note-heads 'font-size -3) grob))

smallerParenthesizedNoteHeads = \override Staff.NoteHead #'before-line-breaking =
        #twitter
%        #(lambda (grob) ((affect-parenthesized-note-heads 'font-size -3) grob))
% #affect-parenthesized-note-heads-size-three
%        #(affect-parenthesized-note-heads 'font-size -3)

%--- Test

\layout {
}

\header { tagline = ##f }
#(set-global-staff-size 20)

\paper  {
   system-system-spacing #'basic-distance = #20
   indent = #(* mm 0)
   top-margin = #(* mm 20)
}

\layout {
  \context {
    \Score
    %\remove "Bar_number_engraver"
  }
}

#(define mydrums '(
      (bassdrum      default            #f         -5)
      (snare         default            #f          0)
      (hihat         cross            #f          5)
      (pedalhihat      cross            #f         -3)
      (openhihat      xcircle            #f          5)
      (lowtom         default            #f          1)
      (hightom      default            #f          3)
      (lowfloortom   default            #f         -1)
      (ridecymbal      harmonic-black      #f          6)
      (ridebell      harmonic-black      #f          5)
      (crashcymbal   harmonic-black      #f          7)
      )
)

oben = \drummode {
\numericTimeSignature
\time 4/4
   {
   \override TextScript #'script-priority = #100
   cymc8\upbow rb
   rb16 rb16 rb8
   rb8 rb16 rb16
   rb8 rb16 rb16
   }
}

unten = \drummode
   {
           %\override Beam #'damping = #+inf.0
           \override Beam #'positions = #'(-5 . -5)
   bd16 hhp sn hhp
   sn16 hhp8 < sn hhp >16
   bd16 < \parenthesize sn  hhp >16 << \parenthesize sn >> hhp
   r16 << sn8 hhp >> hhp16
   }

\markup \bold "Original"

\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \unten }
>>

\markup \bold \column {
  "Funktioniert nicht mit 'after-line-breaking', allenfalls 'before-line-breakomg'. Warum?"
  "Und wie bekommt man dann die Klammern weg,"
  "wenn nicht durch ein weiteres after-line-breaking?"
}
\new DrumStaff <<
  \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
  \new DrumVoice { \voiceOne \oben }
  \new DrumVoice { \voiceTwo \smallerParenthesizedNoteHeads \unten }
>>


Ich hoffe, diese Informationen helfen weiter.

harm6

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #10 am: Freitag, 16. März 2012, 02:16 »
Hallo Arnold,

Zitat
Ich sehe drei praktikable Wege für diese Veränderungen

Ich hab' alle diese Wege mal ausprobiert, hier rumgedoktort, dort versucht etc., letztlich alles ohne Erfolg.

Also habe ich einen vierten Weg beschritten:

Ich habe mir ein paar properties definiert, und einen Engraver.
Das schöne ist, daß es absolut variabel einsetzbar ist. Man kann selektiv vorgehen oder global. Man kann das ParenthesesItem löschen oder auch nicht.
Im Moment sehe ich nur Vorteile. Aber natürlich steht ein Test mit einem größeren Musikstück noch aus.

\version "2.14.2"
           
#(define (define-grob-custom-property symbol type? description)
  (if (not (equal? (object-property symbol 'backend-doc) #f))
      (ly:error (_ "symbol ~S redefined") symbol))

    (set-object-property! symbol 'backend-type? type?)
    (set-object-property! symbol 'backend-doc description)
    symbol)

#(define all-user-grob-custom-properties
   (map
     (lambda (x)
       (apply define-grob-custom-property x))

     `(
       (smaller-not-parenthesize-note-heads ,boolean? "boolean for making smaller parenthesized NoteHeads")
       (color-not-parenthesize-note-heads ,boolean? "boolean for coloring parenthesized NoteHeads")
       (transparent-not-parenthesize-note-heads ,boolean? "boolean for making transparent parenthesized NoteHeads")
       (new-stencil-not-parenthesize-note-heads ,boolean? "boolean for making a new stencil for parenthesized NoteHeads")
       (un-parenthesize ,boolean? "boolean for un-parenthesize NoteHeads")
     )))
     
#(define (new-stil grob)
   (grob-interpret-markup grob (markup
      #:with-color red
      #:fontsize -2
      #:rotate -90 ":)")))
     
AffectParenthesizedNoteHeadsEngraver =
#(lambda (context)
    `((acknowledgers
      (note-head-interface .
        ,(lambda (engraver grob source-engraver)
          (if (not (null? (ly:event-property (event-cause grob) 'parenthesize)))
              (cond ((eq? #t (ly:grob-property grob 'smaller-not-parenthesize-note-heads))
                     (set! (ly:grob-property grob 'font-size) -3))
                    ((eq? #t (ly:grob-property grob 'color-not-parenthesize-note-heads))
                     (set! (ly:grob-property grob 'color) (x11-color 'grey66)))
                    ((eq? #t (ly:grob-property grob 'transparent-not-parenthesize-note-heads))
                     (set! (ly:grob-property grob 'transparent) #t))
                    ((eq? #t (ly:grob-property grob 'new-stencil-not-parenthesize-note-heads))
                     (set! (ly:grob-property grob 'stencil) new-stil))
                    (else #f))
              #f)))
      (parentheses-interface .
        ,(lambda (engraver grob source-engraver)   
          (if (eq? #t (ly:grob-property grob 'un-parenthesize))
            (ly:grob-suicide! grob)
            #f))))))

%--- Test --%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

myLayoutI = \layout {
  \context {
    \Voice
    \override NoteHead #'smaller-not-parenthesize-note-heads = ##t
    \override ParenthesesItem  #'un-parenthesize = ##t
    \consists \AffectParenthesizedNoteHeadsEngraver
  }
}

myLayoutII = \layout {
  \context {
    \Voice
    \override NoteHead #'color-not-parenthesize-note-heads = ##t
    \override ParenthesesItem  #'un-parenthesize = ##t
    \consists \AffectParenthesizedNoteHeadsEngraver
  }
}

myLayoutIII = \layout {
  \context {
    \Voice
    \override NoteHead #'transparent-not-parenthesize-note-heads = ##t
    \override ParenthesesItem  #'un-parenthesize = ##t
    \consists \AffectParenthesizedNoteHeadsEngraver
  }
}

myLayoutIV = \layout {
  \context {
    \Voice
    \override NoteHead #'new-stencil-not-parenthesize-note-heads = ##t
    \override ParenthesesItem  #'un-parenthesize = ##t
    \consists \AffectParenthesizedNoteHeadsEngraver
  }
}

myLayoutV = \layout {
  \context {
    \DrumStaff
    \override NoteHead #'smaller-not-parenthesize-note-heads = ##t
    \override ParenthesesItem  #'un-parenthesize = ##t
    \consists \AffectParenthesizedNoteHeadsEngraver
  }
}

myLayoutVI = \layout {
  \context {
    \DrumStaff
    \override NoteHead #'color-not-parenthesize-note-heads = ##t
    \override ParenthesesItem  #'un-parenthesize = ##t
    \consists \AffectParenthesizedNoteHeadsEngraver
  }
}

myLayoutVII = \layout {
  \context {
    \DrumStaff
    \override NoteHead #'transparent-not-parenthesize-note-heads = ##t
    \override ParenthesesItem  #'un-parenthesize = ##t
    \consists \AffectParenthesizedNoteHeadsEngraver
  }
}

myLayoutVIII = \layout {
  \context {
    \DrumStaff
    \override NoteHead #'new-stencil-not-parenthesize-note-heads = ##t
    \override ParenthesesItem  #'un-parenthesize = ##t
    \consists \AffectParenthesizedNoteHeadsEngraver
  }
}

music = \relative c' {
  <fis \parenthesize d'>4
  <g \parenthesize d'>
}

\score {
        \new Staff
\relative c' {
  \once\override NoteHead #'smaller-not-parenthesize-note-heads = ##t
  \once\override ParenthesesItem  #'un-parenthesize = ##t
  \music
 
  \once\override NoteHead #'color-not-parenthesize-note-heads = ##t
  \once\override ParenthesesItem  #'un-parenthesize = ##t
  \music
 
  \once\override NoteHead #'transparent-not-parenthesize-note-heads = ##t
  \once\override ParenthesesItem  #'un-parenthesize = ##t
  \music
 
  \once\override NoteHead #'new-stencil-not-parenthesize-note-heads = ##t
  \once\override ParenthesesItem  #'un-parenthesize = ##t
  \music
}
\layout {
  \context {
    \Voice
    \consists \AffectParenthesizedNoteHeadsEngraver
  }
}
}

\score {
        \new Staff <<
        \new Voice { \voiceOne \music }
        \new Voice \transpose c c, { \voiceTwo \music }
          >>
\layout {
        \myLayoutI
}
}

#(define mydrums '(
      (bassdrum      default            #f         -5)
      (snare         default            #f          0)
      (hihat         cross            #f          5)
      (pedalhihat      cross            #f         -3)
      (openhihat      xcircle            #f          5)
      (lowtom         default            #f          1)
      (hightom      default            #f          3)
      (lowfloortom   default            #f         -1)
      (ridecymbal      harmonic-black      #f          6)
      (ridebell      harmonic-black      #f          5)
      (crashcymbal   harmonic-black      #f          7)
      )
)

oben = \drummode {
\numericTimeSignature
\time 4/4
   {
   \override TextScript #'script-priority = #100
   cymc8\upbow rb
   rb16 rb16 rb8
   rb8 rb16 rb16
   rb8 rb16 rb16
   }
}

unten = \drummode
   {
   %\override Beam #'damping = #+inf.0
   \override Beam #'positions = #'(-5 . -5)
   bd16 hhp sn hhp
   sn16 hhp8 < sn hhp >16
   bd16 <  \parenthesize  sn hhp >16 << \parenthesize sn >> hhp
   r16 << sn8 hhp >> hhp16
   }

\score {
        \new DrumStaff <<
          \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
          \new DrumVoice { \voiceOne \oben }
          \new DrumVoice { \voiceTwo \unten }
        >>
\layout {
        \myLayoutVIII
}
}

Getestet mit "2.14.2" und "2.15.33"


Gruß,
  Harm

P.S. Das Problem wie man vom NoteHead-grob zum ParenthesesItem-grob kommt, wenn man 'before-line-breaking benutzt, bleibt natürlich ungelöst, es wird schlichtweg umgangen.
« Letzte Änderung: Freitag, 16. März 2012, 02:25 von harm6 »

harm6

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #11 am: Samstag, 17. März 2012, 00:32 »
Hallo,

in meinem Eifer meinen zweiten custom-scheme-engraver zu vollenden habe ich übersehen, daß ich (soweit es das ParenthesesItem betrifft) eigentlich nur den Befehl \override ParenthesesItem #'stencil = ##f dupliziert hatte.

Hier nun die verbesserte Fassung.
Man kann jetzt auch die Eigenschaften der Änderungen anpassen, indem man die Werte aus change-parenthesized-note-heads-alist verändert.
Alle neu definierten properties sind sowohl im \override als auch im \tweak einsetzbar. Kombinationen sind ebenfalls möglich.


Gruß,
  Harm

Arnold

  • Gast
Re: Ghost Notes Global Ändern
« Antwort #12 am: Dienstag, 20. März 2012, 16:18 »
Ja, Harm,

an den vierten Weg habe ich zwar noch gedacht, aber nicht gewagt ihn zu erwähnen. Ich hielt einen neuen Engraver damals für ein »ne Nummer zu groß«.

Hast du jemanls schon \musicMap ausprobiert? Das wäre vielleicht auch ein Lösungsansatz gewesen (als Music-Funktion). Leider ist die Beschreibung in den Handbüchern mehr als dürftig. Diese Funktion scheint in »articulate.ly« benutzt zu sein.

Arnold