Autor Thema: PedalLine  (Gelesen 3549 mal)

DocTaxon

  • Member
PedalLine
« am: Mittwoch, 26. Juni 2013, 10:15 »
Hallo zusammen!

Hier habe ich ein paar Probleme mehr:

Ich probiere mich gerade daran, einen Score mal nach einer Vorlage selbst hinzukriegen, bin aber schon am Anfang gescheitert.

Hier habe ich \change Staff verbaut, und dazu PedalLines mit sustainOn und -Off.
Damit auch die Noten auf dem oberen Staff mit sustain in der midi abgespielt werden, muss ich das im Code verbauen, möchte es aber verstecken. Dazu habe ich SustainPedal overriden können, bei der Linie klappt es aber nicht. Die PedalLine im unteren Staff soll aber sichtbar bleiben und sich von der ersten Note bis zur Taktlinie ausdehnen.

Außerdem hätte ich das Piano-Zeichen gern mittig zwischen den Staves und TimeSignature auch genau mittig zwischen den Staves.

Ich denke mal, dass das alles machbar ist, wenn man nur wüsste wie. Für jegliche Vorschläge bin ich wie immer sehr dankbar.

 Habe Code und Bild hier dabei:   


\version "2.16.0"

\header{
  tagline = ##f
}

\layout {
  indent = 0
  \context {
    \Score
    \remove "Bar_number_engraver"
    \override NonMusicalPaperColumn #'line-break-permission = ##f
    \override NonMusicalPaperColumn #'page-break-permission = ##f
  }
  \context {
    \Staff
  }
}

\paper {
  #(set-paper-size "a4")
}

\score {
  \new PianoStaff <<
    \new Staff = "upper" \relative c'' {
      \clef treble
      \numericTimeSignature \time 4/4
      \set Staff.pedalSustainStyle = #'mixed
      s1
      s1
    }
    \new Staff = "lower" \relative c {
      \clef bass
      \override Staff.TimeSignature #'stencil = ##f \time 4/4
      \set Staff.pedalSustainStyle = #'mixed
      gis8^[(\laissezVibrer^\p\sustainOn e'\laissezVibrer\sustainOff \change Staff = "upper" \override Staff.SustainPedal #'stencil = ##f \override Staff.SustainPedalLineSpanner #'stencil = ##f b'\laissezVibrer\sustainOn b'~] b2)\laissezVibrer\sustainOff \change Staff = "lower"
      gis,,8^[(\laissezVibrer^\p\sustainOn e'\laissezVibrer\sustainOff \change Staff = "upper" \override Staff.SustainPedal #'stencil = ##f \override Staff.SustainPedalLineSpanner #'stencil = ##f b'\laissezVibrer\sustainOn b'~] b2)\laissezVibrer\sustainOff
    }
  >>
 
  \layout { }
 
  \midi {
    \context {
      \Staff
      \remove "Staff_performer"
    }
    \context {
      \Voice
      \consists "Staff_performer"     
    }
    \tempo 4 = 58
  }
}

fugenkomponist

  • Member
Re: PedalLine
« Antwort #1 am: Mittwoch, 26. Juni 2013, 11:58 »
Für Pedal und zentrierte Dynamik empfiehlt sich \new Dynamics. Was genau du mit dem Pedal im Midi anstellen willst, weiß ich aber nicht, bei mir hat das Pedal überhaupt keinen Effekt aufs Midi, egal, wo es steht. Und ein weiteres Rätsel ist mir, warum \numericTimeSignature nicht hilft.
\version "2.16.0"

\header{
  tagline = ##f
}

\layout {
  indent = 0
  \context {
    \Score
    \remove "Bar_number_engraver"
    \override NonMusicalPaperColumn #'line-break-permission = ##f
    \override NonMusicalPaperColumn #'page-break-permission = ##f
  }
  \context {
    \Staff
  }
}

\paper {
  #(set-paper-size "a4")
}

\score {
  <<
    \new PianoStaff <<
      \new Staff = "upper" \with {
        % ich entferne den engraver nicht komplett (oder setze stencil = ##f),
        % weil ich den horizontalen Platz brauche
        \override TimeSignature #'transparent = ##t
      } {
        \relative c'' {
          \clef treble
          s1
          s1
        }
      }
      \new Dynamics \with {
        \consists Time_signature_engraver
      } {
        \numericTimeSignature
        s1\p s\p
      }
      \new Staff = "lower" \with {
        \override TimeSignature #'stencil = ##f
      } {
        \relative c {
          \clef bass
          gis8^[(\laissezVibrer e'\laissezVibrer \change Staff = "upper" b'\laissezVibrer b'~] b2)\laissezVibrer \change Staff = "lower"
          gis,,8^[(\laissezVibrer e'\laissezVibrer \change Staff = "upper" b'\laissezVibrer b'~] b2)\laissezVibrer
        }
      }
    >>
    \new Dynamics {
      \set pedalSustainStyle = #'mixed
      s2\sustainOn s\sustainOff
      s\sustainOn s\sustainOff
    }
  >>


  \layout { }

  \midi {
    \context {
      \Staff
      \remove "Staff_performer"
    }
    \context {
      \Voice
      \consists "Staff_performer"
    }
    \tempo 4 = 58
  }
}

DocTaxon

  • Member
Re: PedalLine
« Antwort #2 am: Mittwoch, 26. Juni 2013, 12:48 »
Aha, dann ist \new Dynamics ein Ding für sich, was hier zwischen und unter den Staves steht. Kannte ich noch gar nicht. Bin halt noch blutiger Lily-Anfänger.

Und dass sustain in der midi nicht ausgegeben wird, weiß ich dann jetzt auch. Hätte es ruhig vorher selbst mal ausprobieren können, ob man das hört - sorry!

Dann ist das einzige Problem \numericTimeSignature , was hier noch stehen bleibt. Eine Idee habe ich dazu aber auch nicht. Ein override zur "Nummerifizierung" gibt es auch nicht, oder? Ist ja komisch ...
« Letzte Änderung: Mittwoch, 26. Juni 2013, 12:50 von DocTaxon »

fugenkomponist

  • Member
Re: PedalLine
« Antwort #3 am: Mittwoch, 26. Juni 2013, 13:27 »
Dann ist das einzige Problem \numericTimeSignature , was hier noch stehen bleibt. Eine Idee habe ich dazu aber auch nicht. Ein override zur "Nummerifizierung" gibt es auch nicht, oder? Ist ja komisch ...
War mir bisher auch nicht bekannt, ich habs dann aber in der property-init.ly gefunden:
numericTimeSignature = \override Staff.TimeSignature #'style = #'numberedUnd das geht natürlich in Dynamics kaputt, weils nunmal kein Staff ist. Die Lösung lautet also:
\new Dynamics \with {
        \consists Time_signature_engraver
      } {
        \override TimeSignature #'style = #'numbered
        s1\p s\p
      }

DocTaxon

  • Member
Re: PedalLine
« Antwort #4 am: Mittwoch, 26. Juni 2013, 13:39 »
Sehr schön!

Um das ganze perfekt zu machen, muss jetzt nur noch irgendwie die Kollision von piano mit dem Notenhals weg. ...

fugenkomponist

  • Member
Re: PedalLine
« Antwort #5 am: Mittwoch, 26. Juni 2013, 13:56 »
Hmja, Dynamik mit Hälsen oder auch Balken über mehrere Systeme scheinen LilyPond noch Schwierigkeiten zu machen; ich habe selbst noch keine gute Lösung dafür gefunden …

harm6

  • Member
Re: PedalLine
« Antwort #6 am: Mittwoch, 26. Juni 2013, 13:58 »
Dann ist das einzige Problem \numericTimeSignature , was hier noch stehen bleibt. Eine Idee habe ich dazu aber auch nicht. Ein override zur "Nummerifizierung" gibt es auch nicht, oder? Ist ja komisch ...
War mir bisher auch nicht bekannt, ich habs dann aber in der property-init.ly gefunden:
numericTimeSignature = \override Staff.TimeSignature #'style = #'numberedUnd das geht natürlich in Dynamics kaputt, weils nunmal kein Staff ist. Die Lösung lautet also:
\new Dynamics \with {
        \consists Time_signature_engraver
      } {
        \override TimeSignature #'style = #'numbered
        s1\p s\p
      }


Noch ein bißchen Hintergrund:

`Dynamics' ist definiert in /ly/engraver-init.ly als
Zitat
\context {
  \type "Engraver_group"
  \name Dynamics
  \alias Voice
  ...
  }

Es ist also ein 'Bottom-context.
'Bottom ist der context auf niedrigster Ebene, z.B. Voice, TabVoice etc

Da \alias Voice drinsteht funktioniert jeder override für 'Voice.

Die Syntax für override ist ja
  \override <context> . <grob> #'<grob-property = #<value>
(Für einen 'Bottom-override kann man <context> auch weglassen.)

Nun ist der "Time_signature_engraver" (eigentlich im Staff-context) einem Bottom-context hinzugefügt worden, also müssen sich overrides auch auf diesen Bottom-context beziehen.
Die Befehle:
  \override TimeSignature #'style = #'numbered
  \override Voice.TimeSignature #'style = #'numbered
  \override Dynamics.TimeSignature #'style = #'numbered
sind da gleichwertig und führen alle zum selben Ergebnis.


Zitat von: Doc
Um das ganze perfekt zu machen, muss jetzt nur noch irgendwie die Kollision von piano mit dem Notenhals weg. ...

Ich habs mir einfach gemacht mit:

\version "2.16.2"

    \new Dynamics \with { \consists "Time_signature_engraver" }
    {
        \override Voice.TimeSignature #'style = #'numbered
        \once \override Score.NoteColumn #'X-offset = #0.5
        s1\p
        \once \override Score.NoteColumn #'X-offset = #0.5
        s\p
    }

Geht wahrscheinlich auch noch anders.


HTH,
  Harm


DocTaxon

  • Member
Re: PedalLine
« Antwort #7 am: Mittwoch, 26. Juni 2013, 15:35 »
Im dritten Takt dann müsste ich \compoundMeter #'((3 4) (1 8)) angeben, da bastelt Lilypond automatisch ein 7/8 draus. Ich möchte da aber ein 3/4+1/8 stehen haben. Ich denke, das liegt daran, dass ich das in den Dynamics-Tag schreiben muss, denn im Staff-Tag funktioniert's ja.

Wie lässt sich das denn wieder lösen?

fugenkomponist

  • Member
Re: PedalLine
« Antwort #8 am: Mittwoch, 26. Juni 2013, 16:27 »
Auch hier ists wieder Staff vs. Voice/Dynamics (Auszug aus music-functions-init.ly):
compoundMeter =
#(define-music-function (parser location args) (pair?)
  (_i "Create compound time signatures. The argument is a Scheme list of
lists. Each list describes one fraction, with the last entry being the
denominator, while the first entries describe the summands in the
enumerator. If the time signature consists of just one fraction,
the list can be given directly, i.e. not as a list containing a single list.
For example, a time signature of (3+1)/8 + 2/4 would be created as
@code{\\compoundMeter #'((3 1 8) (2 4))}, and a time signature of (3+2)/8
as @code{\\compoundMeter #'((3 2 8))} or shorter
@code{\\compoundMeter #'(3 2 8)}.")
  (let* ((mlen (calculate-compound-measure-length args))
         (beat (calculate-compound-base-beat args))
         (beatGrouping (calculate-compound-beat-grouping args))
         (timesig (cons (ly:moment-main-numerator mlen)
                        (ly:moment-main-denominator mlen))))
  #{
    \once \override Staff.TimeSignature #'stencil = #(lambda (grob)
      (grob-interpret-markup grob (format-compound-time args)))
    \set Timing.timeSignatureFraction = $timesig
    \set Timing.baseMoment = $beat
    \set Timing.beatStructure = $beatGrouping
    \set Timing.beamExceptions = #'()
    \set Timing.measureLength = $mlen
  #} ))
Du kannst das im Prinzip kopieren, umbenennen (dynamicsCompoundMeter o. ä.), Staff zu Voice ändern und dann genauso verwenden (\dynamicsCompoundMeter #'((3 4) (1 8))). Edit: Das sähe dann so aus (die Funktionsdefinition irgendwo außerhalb vom \score (z. B. noch vor den \header)):
voiceCompoundMeter =
#(define-music-function (parser location args) (pair?)
  (_i "my own compound meter function for use in Dynamics or Voice context")
  (let* ((mlen (calculate-compound-measure-length args))
         (beat (calculate-compound-base-beat args))
         (beatGrouping (calculate-compound-beat-grouping args))
         (timesig (cons (ly:moment-main-numerator mlen)
                        (ly:moment-main-denominator mlen))))
  #{
    \once \override TimeSignature #'stencil = #(lambda (grob)
      (grob-interpret-markup grob (format-compound-time args)))
    \set Timing.timeSignatureFraction = $timesig
    \set Timing.baseMoment = $beat
    \set Timing.beatStructure = $beatGrouping
    \set Timing.beamExceptions = #'()
    \set Timing.measureLength = $mlen
  #} ))

[…]

\new Dynamics \with {
        \consists Time_signature_engraver
      } {
        \override TimeSignature #'style = #'numbered
        \once \override Score.NoteColumn #'X-offset = #0.5
        s1\p
        \once \override Score.NoteColumn #'X-offset = #0.5
        s\p
        \voiceCompoundMeter #'((3 4) (1 8))
        s
      }
Edit: Haken „keine Smileys benutzen“ gesetzt … 8) ist aber auch ein komischer Smiley …
« Letzte Änderung: Mittwoch, 26. Juni 2013, 16:31 von fugenkomponist »

harm6

  • Member
Re: PedalLine
« Antwort #9 am: Mittwoch, 26. Juni 2013, 22:42 »
Hallo,

ein Gedanke wäre einen neuen Context zu definieren, anstatt alle möglichen Funktionen auf `Dynamics' anzupassen.

Das könnte dann so aussehen:

\version "2.16.2"

timeSigDynamicLayout =
\layout {
  \context {
    \type "Engraver_group"
    \name TimeSigDynamic
    \alias Staff
   
    \consists "Output_property_engraver"
    \consists "Bar_engraver"
    \consists "Script_engraver"
    \consists "New_dynamic_engraver"
    \consists "Dynamic_align_engraver"
    \consists "Text_engraver"
    \consists "Text_spanner_engraver"
    \consists "Font_size_engraver"
    \consists "Axis_group_engraver"
    \consists "Time_signature_engraver"
   
    \override VerticalAxisGroup #'staff-affinity = #CENTER
    \override VerticalAxisGroup #'nonstaff-relatedstaff-spacing =
      #'((basic-distance . 5)
         (padding . 0.5))
    \override TextScript #'font-shape = #'italic
    \override DynamicLineSpanner #'Y-offset = #0
    \override DynamicLineSpanner #'outside-staff-priority = ##f
    \override DynamicText #'outside-staff-priority = ##f
    \override Hairpin #'outside-staff-priority = ##f
    \override DynamicText #'X-offset =
    #(ly:make-simple-closure
      `(,+
        ,(ly:make-simple-closure
           (list ly:self-alignment-interface::centered-on-note-columns))
        ,(ly:make-simple-closure
          (list ly:self-alignment-interface::x-aligned-on-self))))
 
    \description "Holds a single line of dynamics and time-signatures,
      which will be centered between the staves surrounding this context."
  }
  \context {
    \Score
    \accepts "TimeSigDynamic"
  }
  \context {
    \StaffGroup
    \accepts "TimeSigDynamic"
  }
  \context {
    \ChoirStaff
    \accepts "TimeSigDynamic"
  }
  \context {
    \PianoStaff
    \accepts "TimeSigDynamic"
  }
}

upperStaff = \relative c'' {
      s1
      s1
      s2. s8
    }
   
downStaff = \relative c {
      \clef bass
      \repeat unfold 2 {
            gis8^[(\laissezVibrer
            e'\laissezVibrer
            \change Staff = "upper" 
            b'\laissezVibrer
            b'~]
            b2)\laissezVibrer
            \change Staff = "lower"
      }
      gis,,8^[(\laissezVibrer
      e'\laissezVibrer
      \change Staff = "upper" 
      b'\laissezVibrer
      b'~]
      b4.)\laissezVibrer
      \change Staff = "lower"
    }

timeDyn = {
\numericTimeSignature
\time 4/4
\once \override Score.NoteColumn #'X-offset = #0.5
        s2\p s
\once \override Score.NoteColumn #'X-offset = #0.5
        s\p s
        \compoundMeter #'((3 4) (1 8))
\once \override Score.NoteColumn #'X-offset = #3.6
\once \override DynamicText #'X-offset = #3
        s2.\p s8
}

pedal = {
        \set pedalSustainStyle = #'mixed
        s2\sustainOn s\sustainOff
        s\sustainOn s\sustainOff
}


\header {
  tagline = ##f
}

pianoStaff =
\new PianoStaff <<
  \new Staff = "upper" \upperStaff
  \new TimeSigDynamic \timeDyn
  \new Staff = "lower" \downStaff
  \new Dynamics \pedal
  >>

\score {
  \pianoStaff
  \layout {
    \timeSigDynamicLayout
    indent = 0
    \context {
      \Staff
      \override TimeSignature #'transparent = ##t
    }
    \context {
      \Score
      \remove "Bar_number_engraver"
      \override NonMusicalPaperColumn #'line-break-permission = ##f
      \override NonMusicalPaperColumn #'page-break-permission = ##f
    }
  }
}

`TimeSigDynamic' ist ein Context auf Staff-Ebene (->\alias Staff) insoweit funktionieren Befehle wie \numericTimeSignature und \compoundMeter #'((3 4) (1 8)) ohne weitere Anpassungen.

Ich habe allerdings nur das kleine Beispiel von oben getestet!

HTH,
  Harm