RhythmicStaff mit percussion Clef

Begonnen von Manuela, Donnerstag, 17. Oktober 2019, 18:40

« vorheriges - nächstes »

Manuela

Ich möchte einen RhythmicStaff mit einem Percussion-Notenschlüssel schreiben.
So passt alles
\version "2.19.82"
\language "deutsch"

\layout {
  \context {
    \RhythmicStaff
    \consists Clef_engraver
  }
}

\new RhythmicStaff
{
  \clef percussion
  c4 c c c
}


Wenn ich es hingegen so mache (damit ich den Notenschlüssel nicht jedesmal angeben muss)
\version "2.19.82"
\language "deutsch"

\layout {
  \context {
    \RhythmicStaff
    \consists Clef_engraver
    \override Clef.glyph-name  = #"clefs.percussion"
    %\override Clef.staff-position = #2 %% ist wirkungslos
  }
}

\new RhythmicStaff
{
  c4 c c c
}


so rutscht der Schlüssel nach unten und lässt sich nur mit extra-offset verschieben, nicht mit staff-position. Was mache ich falsch? Muss ich eine andere Eigenschaft als glyph-name für den Notenschlüssel  verwenden?
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

Der \clef ... - Befehl setzt verschiedene context-properties.
Dein override tauscht nur das grafische Symbol aus. Stattdessen setze die context-properties selber.
clefGlyph und clefPosition sollten reichen:


\version "2.19.82"

\layout {
  \context {
    \RhythmicStaff
    \consists Clef_engraver
    clefGlyph = #"clefs.percussion"
    clefPosition = #0
  }
}

\new RhythmicStaff {
  c4 c' c, c,,
}


HTH,
  Harm

Manuela

Danke Harm, das ist genau das was ich wollte.
Beinahe hätte ich es selbst geschafft, ich hatte nach Studium der Internals folgendes probiert:

\set clefGlyph = #"clefs.percussion"

Jetzt weiß ich, warum das nicht funktioniert hat.
Danke für eure Hilfe
viele Grüße
-- Manuela

Malte

Hm ... vielleicht sollte man
    clefGlyph = #"clefs.percussion"
    clefPosition = #0
als Default setzen im RhythmicStaff, was meint ihr?

harm6

Zitat von: Malte am Donnerstag, 17. Oktober 2019, 21:51
Hm ... vielleicht sollte man
    clefGlyph = #"clefs.percussion"
    clefPosition = #0
als Default setzen im RhythmicStaff, was meint ihr?

Denk ich nicht.
Ich hab einen RhythmicStaff öfter ohne als mit Percussion-Notenschlüssel gesehen.

Gruß,
  Harm

Malte

Zitat von: harm6 am Donnerstag, 17. Oktober 2019, 22:13
Zitat von: Malte am Donnerstag, 17. Oktober 2019, 21:51
Hm ... vielleicht sollte man
    clefGlyph = #"clefs.percussion"
    clefPosition = #0
als Default setzen im RhythmicStaff, was meint ihr?

Denk ich nicht.
Ich hab einen RhythmicStaff öfter ohne als mit Percussion-Notenschlüssel gesehen.
Ok, ich hab mich mißverständlich ausgedrückt: Ich hätte jetzt wirklich nur diese beiden Kontexteigenschaften mit neuen Default-Werten versehen, nicht aber den Clef_engraver reingepackt. Aber sollte dann jemand den Clef_engraver reinpacken, müßte er eben nicht noch \clef oder die Eigenschaften von Hand setzen.

harm6

Ich halte nach wie vor nichts davon clefGlyph und clefPosition in den RhythmicStaff zu packen. Natürlich stehen die entsprechenden Werte dann zur Verfügung sobald man den engraver dazunimmt. Aber ohne ihn ist es nur "dead code".
Natürlich kann man einen Kommentar dazusetzen, aber man kann nicht erwarten, daß der durchschnittliche user das liest.

Die Doku, zumindest LM bzw NR, sollte natürlich schon gelesen werden.
Das bringt mich zu http://lilypond.org/doc/v2.19/Documentation/notation/displaying-pitches#clef
Da gibts unter  "Selected Snippets" Tweaking clef properties.

Meines Erachtens ist dieses Kapitel nicht nur unvollständig, sondern mitunter schlichtweg falsch. Das merkt man allerdings nur dann, wenn man versucht \ottava #1 auf das gegebene Beispiel anzuwenden.

Ich habe mal versucht ein besseres Beispiel mit Erklärungen zu schreiben.
Es ist bislang nur ein Entwurf aber hier schon mal der code, Bild im Anhang.


\version "2.19.83"

doc =
#"THIS SNIPPET DEMONSTRATES HOW TO MANUALLY SET/TWEAK CLEF-PROPERTIES.


To set a clef manually, we will want a correct clef-glyph and probably a
ClefModifier. And ofcourse the NoteHeads should be moved according to the
usual meaning of the clef.
I.e. we need to care for a pure graphical and for the functional aspect
of the clef.

Note: clefs like percussion or tab will not need all of the steps listed below.

We will go step by step.
First the graphic:
  (1) set glyph
  (2) move it appropriate
  (3) probably go for a transposing clef
  (4) probably set the bracketing style for the ClefModifier
Then care for the funcionality to get the NoteHeads positioned correctly
  (5+6) set middleCClefPosition and apply ly:set-middle-C! to let
      middleCPosition been calculated.
Note: setting middleCPosition directly will not nicely interplay with \\ottava."
 
$(let ((lines (string-split doc #\nl)))
  (make-column-markup (append lines (make-list 2 " "))))


\paper {
  indent = 20
}

mus = { a4_"a" b_"b" c'_"c'" d'_"d'" }

music =
\new Voice {
  %% without clef and anything else NoteHeads are printed with c' on the
  %% zero-line
  \mus
  %%%%%%%%%%%%%%%%%%%%%%%%%
  %% First: clef-graphic
  %%%%%%%%%%%%%%%%%%%%%%%%%
  %% (1) set glyph
  %%     Remark: no clue why the clef is always repeated
  \set Staff.clefGlyph = #"clefs.C"
  \mus
  %% (2) move it appropriate
  \set Staff.clefPosition = -4
  \mus
  %% (3) prabably set the clefTransposition, here an octave down
  \set Staff.clefTransposition = -7
  \mus
  %% (4) probably set clefTranspositionStyle, available are 'bracketed and
  %%   ' parenthesized
  \set Staff.clefTranspositionStyle = #'bracketed
  \set Staff.forceClef = ##t
  \mus
 
  %%%%%%%%%%%%%%%%%%%%%%%%%
  %% Second: clef-function
  %%%%%%%%%%%%%%%%%%%%%%%%%
  %% (5+6) set middleCClefPosition and apply ly:set-middle-C! to let 
  %%     middleCPosition be calculated, as it is done by the default
  %%     \clef command.
  \set Staff.middleCClefPosition = 3
  \context Staff \applyContext #ly:set-middle-C!
  \set Staff.forceClef = ##t
  \mus
 
  %% Setting middleCPosition directly is not recommended, because it will
  %% lead to wrong output as soon as octavation comes into the game.
  \set Staff.middleCPosition = 3
  \set Staff.forceClef = ##t
  \mus
}

\score {
  <<
    \new StaffGroup
      <<
        \new Staff
          \with {
            instrumentName =
              \markup \center-column {
                "manually" "create" "\\clef \"soprano_[8]\""
              }
          }
          \music
         
        \new Staff
          \with {
            instrumentName =
              \markup \center-column { "control" }
          }
          { R1*5 \clef "soprano_[8]" \mus \mus }
     >>
     
    \new StaffGroup
      <<
        \new Staff
          \with {
            instrumentName =
              \markup \center-column { "apply" "\\ottava #1" "to it" }
          }
          <<
            { s1*6 <>_\tweak color #red _"wrong" }
            { \ottava #1 \music }
          >>
         
        \new Staff
          \with {
            instrumentName =
              \markup \center-column { "ottava" "control" }
          }
          { \ottava #1 R1*5 \clef "soprano_[8]" \mus \mus }
      >>
  >>

  \layout {
    \context {
      \Score
      %% Unset all clef related properties
      clefGlyph = #'()
      clefPosition = #'()
      middleCClefPosition = #'()
      clefTransposition = #'()
      clefTranspositionStyle = #'()
     
      middleCPosition = #'()
    }
    %% keep it on one line
    \autoBreaksOff
    \context {
      \Staff
      %% Don't use small clef-glyphs
      \override Clef.full-size-change = ##t
      %% Smaller InstrumentName
      \override InstrumentName.font-size = -2
      \override InstrumentName.baseline-skip = 0
    }
  }
}


Gruß,
  Harm

Malte

Zitat von: harm6 am Samstag, 19. Oktober 2019, 13:25
Meines Erachtens ist dieses Kapitel nicht nur unvollständig, sondern mitunter schlichtweg falsch. Das merkt man allerdings nur dann, wenn man versucht \ottava #1 auf das gegebene Beispiel anzuwenden.
Hm ... Das könnte auch ein Fehler von \ottava sein, oder?

harm6

#8
EDIT: Beitrag überarbeitet

ZitatHm ... Das könnte auch ein Fehler von \ottava sein, oder?
Denke ich nicht.
Ottava_spanner_engraver liest middleCOffset. Berechnet laut IR: "The offset of middle C from the position given by middleCClefPosition"
\clef berechnet middleCPosition.
Wenn middleCPosition manuell gesetzt wird, müßte es für \ottava modifiziert werden.
Falls das nicht passiert dann ist dieser Wert falsch, dann kann \ottava ja nur falsch werden.

Deshalb sollte middleCPosition auch nicht manuell (für einen manuellen clef) gesetzt werden.

Das mach \clef schließlich auch nicht:

\void \displayMusic \clef "soprano_[8]"
->
Zitat von: terminal
(make-music
  'ContextSpeccedMusic
  'context-type
  'Staff
  'element
  (make-music
    'SequentialMusic
    'elements
    (list (make-music
            'PropertySet
            'value
            "clefs.C"
            'symbol
            'clefGlyph)
          (make-music
            'PropertySet
            'value
            3
            'symbol
            'middleCClefPosition)
          (make-music
            'PropertySet
            'value
            -4
            'symbol
            'clefPosition)
          (make-music
            'PropertySet
            'value
            -7
            'symbol
            'clefTransposition)
          (make-music
            'PropertySet
            'value
            'bracketed
            'symbol
            'clefTranspositionStyle)
          (make-music
            'ApplyContext
            'procedure
           ly:set-middle-C!))))

Rot eingefärbt ist was \clef wirklich macht - keine middleCPosition

Genauer gesagt: die middleCPosition wird anhand der middleCClefPosition neu berechnet und eben nicht manuell zementiert.

Gruß,
  Harm


Malte

Hmmm ... Das erinnert mich grad daran, daß ich genau über diese ganze Geschichte vor Kurzem schon mal gestolpert bin.
Zitat von: ambitus-engraver.cc      /* 
       * \ottava reads middleCClefPosition and overrides
       * middleCOffset and middleCPosition ignoring previously
       * set values. Therefore
       *  1. \ottava is incompatible with non-default offset and
       *     position values (is this a bug? TODO)
       *  2. we don't need to read these values and revert the
       *     changes \ottava made but we can just read the
       *     clef position.
       */
Damals hab ich nur gemeint ,,is this a bug?" und mich nicht weiter drum gekümmert, weil ich gerade eben mit Ambitus zu tun hatte. Vielleicht sollte ich das mal zum Anlaß nehmen, zu überlegen, ob diese ganzen Kontexteigenschaften nicht eine zu viel sind, die Abhängigkeiten besser programmiert werden sollten oder einfach die Dokumentation verbessert werden sollte ...

harm6

ZitatVielleicht sollte ich das mal zum Anlaß nehmen, zu überlegen, ob diese ganzen Kontexteigenschaften nicht eine zu viel sind, die Abhängigkeiten besser programmiert werden sollten oder einfach die Dokumentation verbessert werden sollte

Das wäre sicherlich sinnvoll.
Dieses ganze middleCWasAuchImmerZeug saugt mir das Hirn aus, wenn ich versuche es nachzuvollziehen. Ich habe ebenfalls das Gefühl, daß man das einfacher hinkriegen können müßte. Allerdings wird das an zahlreichen Stellen verwendet und sobald es nach C++ geht bin ich draußen.


Gruß,
  Harm

Malte

Mit C++ kann ich zum Glück ganz gut, auch wenn mir die LilyPond-spezifischen Teile manchmal noch nicht ganz klar sind, vor allem wegen der Schnittstelle zu Guile/Scheme und irgendwelcher grob-interface-Magie etc. Ich setz mich mal dran.