drumstylemap farbe einzelner Notenköpfe beeinflussen

Begonnen von filzmann, Samstag, 20. August 2022, 20:42

« vorheriges - nächstes »

filzmann

Hallo zusammen,

ich habe mir eine eigene drumstyle-tabelle gebastelt und kann diese auch benutzen.
Jetzt würde ich gerne, beispielsweise die Bassdrum prinzipiell mit einem roten Notenkopf darstellen.
Ist das an dieser Stelle irgendwie erreichbar oder muss ich jedes Vorkommen einzeln tweaken?

#(define flzdrums '(
         (bassdrum        default   color=#red   -5)
         (snare           default   #f           1)
  [...]
         (opentriangle    xcircle   #f           5)
         
   )

)

also das hier funktioniert schonmal nicht und Tante google war bisher auch nicht sehr hilfreich.

Vielen Dank im Voraus. ;)

harm6

Farben kannst Du so nicht setzen. Verwende einen selectierenden grob-override:

\layout {
  \context {
    \DrumVoice
    \override NoteHead.color =
      #(lambda (grob)
        (case (ly:prob-property (ly:grob-property grob 'cause) 'drum-type)
          ((bassdrum) red)
          ((hihat) green)
          ;; other settings
          (else #f)))
  }
}

\drums {
  bd2 hh
}

Gruß,
  Harm

filzmann

Danke Dir, das sieht schonmal super aus.

jetzt bin ich schonmal angefixed, da noch tiefer einzusteigen.
Ich hab das gleiche soeben mit Notehead.style probiert, das reagiert allerdings gar nicht und gibt keine Fehlermeldung

\context {
      \DrumVoice
      \override NoteHead.style =
        #(lambda (grob)
          (case (ly:prob-property (ly:grob-property grob 'cause) 'drum-type)
            ((maracas) slash)
            ((handclap) slash)
            ((tambourine) slash)
            ((hitimbale) diamond)
            ((lotimbale) slash)
            ((hitom) slash)
            ((lotom) slash)
           
            ;; other settings
            (else #f)))
    }



Weitere Anschlussfrage:
Ich würde gerne direkt im Drummode den Notenkopf durch eine fest definierte Ziffer (1-9) überschreiben, um so kenntlich zu machen, welches Samplepad ich benutze. Bisher hab ich das nur in Abhängigkeit von der Tonhöhe gefunden.

Haste dafür auch nen Trick? vermutlich irgendwie über \tweak, oder?




harm6

Sorry für die späte Antwort, ich kam vorher nicht dazu...

@all
Aber ich wundere mich, daß nicht schon andere geantwortet haben, da ein einfaches ausprobieren dirket zeigt warum Dein style-override nicht funktioniert.
Man bekommt ja
Zitat von: terminalERROR: In procedure %resolve-variable:
Unbound variable: slash
zurück (mit einer neuen devel Version, die Fehlermeldung bei der aktuellen stable ist aber ähnlich).
slash muß halt ein symbol sein also 'slash.
Wenn man also symbols verwendet und weiter probiert dann stellt man fest, daß es manchmal funktioniert manchmal nicht.
Dann könnte man http://lilypond.org/doc/v2.23/Documentation/notation-big-page.html#custom-percussion-staves nochmal nachlesen:
ZitatCustom percussion styles may be defined, to which the drumStyleTable property may then be set. Existing notations may be redefined as an association list where each entry has to be comprised of four items: a name, the note head style (or default), an articulation sign if needed (or #f if not), and the note head's position on the staff.
und zu der (zutreffenden) Vermutung kommen, daß die Setzung der drumStyleTable (und ein gewisser default ist natürlich gesetzt) den custom-override aushebelt.
Deshalb ist es nicht sinnvoll einen override für 'style zu setzen, sondern das sollte in der drumStyleTable gemacht werden.

Also: ausprobieren/rtfm/nachdenken.
Das hätte doch von jedem mit mittlerem Erfahrungsschatz herausgefunden werden können.

@filzmann
Wie schon gesagt verwende die drumStyleTable für den 'style.
Tatsächlich halte ich es für möglich die drumStyleTable auf null zu setzen, sodaß der override funktioniert.
Möglich, aber nicht sinnvoll.
Denn die drumStyleTable regelt ja auch articulation und staff-position. Das müsste Du dann ebenfalls anders eingeben.
Frag nochmal falls Du wirklich diesen Weg gehen willst.

ZitatIch würde gerne direkt im Drummode den Notenkopf durch eine fest definierte Ziffer (1-9) überschreiben, um so kenntlich zu machen, welches Samplepad ich benutze.
Hier verstehe ich nicht was Du willst:
Das überschreiben des Notenkopfs: Anstelle des Kopfes die Ziffer oder die Ziffer noch auf den Notenkopf drauf?
Offensichtlich soll das abhängig von einer Bedingung. Aber was meinst Du mit Samplepad?
Was ist das (im Sinne von ly- oder scheme-code).

Gruß,
  Harm



filzmann

Hallo Harm, hallo ihr möglicherweise vorhandenen anderen User ;)

Erstmal danke für deine ausführliche Antwort. Ich hatte heute endlich mal wieder Zeit, mich den optischen Aspekten meiner Notation zu widmen und musste feststellen:

Du hast absolut recht, das hätte ich auch selber sehen können.  :o
Ich sag nur Wald vor lauter Bäumen...

Also der lange ausführliche Part wird selbstverständlich über die drum-style-table geklärt. Danke. ;)


Zum 2. Teil:
Ein Teil meines Drumsets ist ein elektronisches Gerät mit 9 Schlagflächen (Roland SPD-SX), welche mit beliebigen Samples belegt werden können.

zB. eine  verzerrte bassdrum auf pad 7, eine klickendes Feuerzeug als hihat auf pad 2 und ein peitschensound als Snare auf Pad 5

im code will ich sowas schreiben (Pseudocode):

<\tweak mach_ne_7 bd>4 <\tweak mach_ne_2 hh> <\tweak mach_ne_5 sn> <\tweak mach_ne_2 hh>
was im notenbild anstelle des Notenkopfes, so wie bei Tabulatoren, die entsprechende Zahl darstellt.

ohne tweak möchte ich dann den ganz normalen Notenkopf, der für bassdrum, hihat und snare in der drum style table definiert ist.

es geht mir darum, schon ein visuelles, schnell erfassbares Bild des grooves zu haben und trotzdem die Information "wo jetzt genau drauf hauen" mitzugeben.

Ich hoffe, ich habe mich jetzt etwas verständlicher ausgedrückt.

harm6

Meinst Du etwas wie:
#(define type-index-alist
  '((bassdrum . 7)
    (hihat . 2)
    (snare . 5)
    ;; other settings
    ))

\layout {
  \context {
    \DrumVoice
    \override NoteHead.stencil =
      #(grob-transformer 'stencil
        (lambda (grob orig)
          ;; Needed values for vertical stem-attachment and fontsize depend on
          ;; the used font. See comments below.
          (let* ((drum-type
                   (ly:prob-property (ly:grob-property grob 'cause) 'drum-type))
                 (drum-index (assoc-get drum-type type-index-alist)))
            (if drum-index
                (begin
                  (ly:grob-set-property! grob 'stem-attachment
                    (cons
                      0
                      (+ (cdr (ly:grob-property grob 'stem-attachment))
                         (* 0.6 ;; adjust to taste
                           (ly:grob-property
                             (ly:grob-object grob 'stem)
                             'direction)))))
                  (centered-stencil
                    (grob-interpret-markup grob
                      (make-fontsize-markup -2 ;; adjust to taste
                        (number->string drum-index)))))
                orig))))
  }
}

\drums {
  bd2 hh sn
}
?

Gruß,
  Harm

filzmann

Moin Harm,

optisch ist es genau das.

allerdings möchte ich es nicht global für alle bd (hh, sn)setzen, sondern selektiv in der \drums{...} - Section auslösen.
daher mein "\tweak" im Pseudocode.



 

harm6

Hier verschiedene Möglichkeiten:
%%%%%
%% 1
%%%%%

#(define type-index-alist
  '((bassdrum . 7)
    (hihat . 2)
    (snare . 5)
    ;; other settings
    ))

numberDrumHead =
  \override NoteHead.stencil =
    #(grob-transformer 'stencil
      (lambda (grob orig)
        ;; Needed values for vertical stem-attachment and fontsize depend on
        ;; the used font. See comments below.
        (let* ((drum-type
                 (ly:prob-property (ly:grob-property grob 'cause) 'drum-type))
               (drum-index (assoc-get drum-type type-index-alist)))
          (if drum-index
              (begin
                (ly:grob-set-property! grob 'stem-attachment
                  (cons
                    0
                    (+ (cdr (ly:grob-property grob 'stem-attachment))
                       (* 0.6 ;; adjust to taste
                         (ly:grob-property
                           (ly:grob-object grob 'stem)
                           'direction)))))
                (centered-stencil
                  (grob-interpret-markup grob
                    (make-fontsize-markup -2 ;; adjust to taste
                      (number->string drum-index)))))
              orig))))
             
%% 1a \once
             
\drums {
  \once \numberDrumHead bd2 hh \once \numberDrumHead sn
}

%% 1b \undo
   
\drums {
  \numberDrumHead bd2 \undo \numberDrumHead hh \numberDrumHead sn
}

%% 1c \once \undo

\drums {
  \numberDrumHead bd2 \once \undo \numberDrumHead hh sn
}

%%%%%
%% 2
%%%%%
             
tweakNumberDrumHead =
#(define-music-function (idx m)(index? ly:music?)
#{
  \tweak stencil
    #(lambda (grob)
       ;; Needed values for vertical stem-attachment and fontsize depend on
       ;; the used font. See comments below.
       (ly:grob-set-property! grob 'stem-attachment
         (cons
           0
           (+ (cdr (ly:grob-property grob 'stem-attachment))
              (* 0.6 ;; adjust to taste
                (ly:grob-property
                  (ly:grob-object grob 'stem)
                  'direction)))))
       (centered-stencil
         (grob-interpret-markup grob
           (make-fontsize-markup -2 ;; adjust to taste
             (number->string idx)))))
  $m
#})

\drums {
  \tweakNumberDrumHead #7 bd2 hh \tweakNumberDrumHead #5 sn
}

Gruß,
  Harm