Wie kommentiert man Notenzeilen mit Schlagzahlen in Lilypond?

Ich möchte einen RhythmicStaff mit Schlagzahlen beschriften - wie im folgenden Bild:RhythmicStaff mit Beat-Nummern unter dem Notensystem

Vielleicht könnte man das '_'-Zeichen nach einer Note verwenden, um Zahlen hinzuzufügen, die mit einer Note am Anfang des Beats verbunden sind, aber wie wäre es mit leeren Beats - wo es keine Note oder Pause gibt, aber der Beat trotzdem angezeigt werden muss - wie die letzten Takte im Beispielbild.

Was wäre der richtige Weg, dies zu tun? Idealerweise, damit - jeder Takt, jeder Takt in der Partitur automatisch an den richtigen Stellen mit den Schlagzahlen versehen wird?

Antworten (2)

Eine Möglichkeit, dies automatisch zu erhalten:

#(define (Kontext Beat_counter_engraver)
   (let ((measpos #f) (grouping #f) (basemom #f) (beatmom #f))
     (definiere (Mama->Dur Mama)
       (lass ((Paar (Moment->Bruch Mama)))
         (/ (Autopaar) (CDR-Paar))))
     (define (ist-beat-moment? count gping beatcount)
       (if (= (* count (mom->dur basemom)) (mom->dur measpos))
           (+ 1 Beatcount)
           (if (> (* count (mom->dur basemom)) (mom->dur measpos))
               #F
               (wenn (null? gping)
                   #F
                   (ist-beat-moment? (+ count (car gping)) (cdr gping) (+ 1 beatcount))))))
     (Make-Stecher
       ((Prozess-Musik-Stecher)
          (set! measpos (ly:context-property context 'measurePosition 'noof))
          (set! Gruppierung (ly:context-property context 'beatStructure 'noof))
          (set! basemom (ly:context-property context 'baseMoment 'noof))
          (Set! Beatmom (Ist-Beat-Moment? 0 Gruppierung 0))
          (wenn Beatmama
            (let ((grob (ly:engraver-make-grob engraver 'TextScript '())))
                  (ly:grob-set-property! grob 'text (number->string beatmom))
                  (ly:grob-set-property! grob 'Richtung UNTEN)
                  (ly:grob-set-property! grob 'padding 3)))))))

\Layout {
  \context {
    \RhythmicStaff
    \besteht aus #Beat_counter_engraver
  }
}

\new RhythmicStaff
{
  \set RhythmicStaff.baseMoment = #(ly:make-moment 1 16) % Stellen Sie manuell sicher, dass das Basismoment 1/16 ist
  \set RhythmicStaff.beatStructure = 3,3,3,3 % Stellen Sie manuell sicher, dass Beats immer 3 16tel haben
  \time 6/16
  16 16 16 16 16 16|
  r16 16 16 8.
  \time 3/16
  16[ \once\set stemRightBeamCount = 1
      \once\set stemLeftBeamCount = 1
       r16 16]
  \time 6/16
  16 16 r r8. \bar "|."
}


%% mit unterschiedlichen Momenten:

\new RhythmicStaff {
  \time 2/4
  8 16 16 8 16 16
  \time 3/8
  16 16 16 16 16 16
  \time 6/8
  8 16 16 8 16 16 16 16 16 16
  \time 9/7 \tuplet 7/8 { 8 8 8 8 8 8 8 8 8 }
}

was dazu führtGeben Sie hier die Bildbeschreibung ein

Ein Problem hier ist, dass dies nur funktioniert, wenn es sich um ein Ereignis im Takt handelt. Wenn Sie also etwas wie \time 4/4 8 4 8 haben, wird dies beim zweiten Takt nichts ausgeben, da dort nichts ist. Sie möchten also vielleicht so etwas tun

<< \music \repeat unfold #(floor (/ (/ (car (moment->fraction (ly:music-length music))) (cdr (moment->fraction (ly:music-length music)))) 1/16)) s16 >>

EDIT: Um so etwas wie Ihr Beispiel zu erreichen, können Sie auch so etwas tun:

#(define (Kontext Beat_counter_engraver)
   (let ((measpos #f) (grouping #f) (basemom #f) (beatmom #f))
     (definiere (Mama->Dur Mama)
       (lass ((Paar (Moment->Bruch Mama)))
         (/ (Autopaar) (CDR-Paar))))
     (define (ist-beat-moment? count gping beatcount)
       (if (= (* count (mom->dur basemom)) (mom->dur measpos))
           (+ 1 Beatcount)
           (if (> (* count (mom->dur basemom)) (mom->dur measpos))
               #F
               (wenn (null? gping)
                   #F
                   (ist-beat-moment? (+ count (car gping)) (cdr gping) (+ 1 beatcount))))))
     (Make-Stecher
       ((Prozess-Musik-Stecher)
          (set! measpos (ly:context-property context 'measurePosition 'noof))
          (set! Gruppierung (ly:context-property context 'beatStructure 'noof))
          (set! basemom (ly:context-property context 'baseMoment 'noof))
          (Set! Beatmom (Ist-Beat-Moment? 0 Gruppierung 0))
          (wenn Beatmama
            (let ((grob (ly:engraver-make-grob engraver 'TextScript '())))
                  (ly:grob-set-property! grob 'text (number->string beatmom))
                  (ly:grob-set-property! grob 'Richtung UNTEN)))))))

\Layout {
  \context {
    \Dynamik
    \besteht aus #Beat_counter_engraver
    \override TextScript.font-shape = ##f
    \override TextScript.Y-offset = #-0.8
    \besteht Instrument_name_engraver
  }
}

sechzehntes-Gitter-während =
#(define-music-function (m) (ly:music?)
   #{
     \repeat unfold #(floor (/ (/ (car (moment->fraction (ly:music-length m)))) (cdr (moment->fraction (ly:music-length m)))) 1/16)) s16
   #})

\Papier {
  ragged-last = ##f
}

musI = {
  \mark "In 3"
  \time 3/8
  8 8 16 r |
  8 16 16 8 |
  16[ 16 8 r16 16] |
  4. \bar "|."
}

>

musII = {
  \mark "In 4"
  \time 4/8
  \set Score.beatStructure = 1,1,1,1
  8 16 16~ 8 r8 |
  r16 16[ r16 16] r16 8.~ |
  4 ~ 16 8 16 |
  16 r16 4 r8 \bar "|."
}

>

was dir gibtGeben Sie hier die Bildbeschreibung ein

Wofür steht „Lazy“?
In diesem Beitrag gibt es viel zu lernen - ich sehe, dass Lilypond eine Form von Scheme verwendet.
Vielen Dank für die ausführliche Antwort - In diesem Beitrag gibt es viel zu lernen - Ich sehe, dass Lilypond eine Form von Schema verwendet. Es wäre sehr hilfreich, wenn Sie bitte einen Absatz hinzufügen, in dem Sie kommentieren und zusammenfassen, was die Code-Snippets tun - für diejenigen, die mit Lisp-ähnlichen Sprachen nicht vertraut sind. Außerdem, wo sollte die Beat_Counter_Engraver-Definition platziert werden, damit sie in allen meinen .ly-Dateien verwendet werden kann - hier geht es um die Erweiterung der standardmäßigen Lilypond-Schemabibliotheken, also könnte eine separate Frage sein ...
Um genau zu sein, verwendet Lilypond die GNU-Implementierung des Schemas, die Guile genannt wird. Wenn Sie dies in all Ihren Dateien verwenden möchten, können Sie solches Zeug in eine separate Lilypond-Datei packen und \include "path/to/your/file" in jeder Ihrer Dateien verwenden, die dies benötigen könnten. Mit dem Befehlszeilenargument -I können Sie Ordner zu den standardmäßigen Include-Pfade von lilyponds hinzufügen, und Frescobaldi hat eine Vorliebe dafür. Sie können also lilypond zu lilypond -I some/path aliasieren (oder wenn Sie Frescobaldi verwenden, die Einstellung verwenden), alle Ihre Includes in diesen Pfad einfügen, und dann können Sie einfach \include "file" von überall aus ausführen.
Sie könnten dies natürlich zu scm/scheme-engravers.scm hinzufügen, aber das würde bedeuten, dass Sie Ihre eigene Lilypond-Version pflegen müssten, und Sie maskieren, dass Ihre Datei nicht standardmäßige Dinge benötigt. Die Verwendung von Includes ist also eine gute Möglichkeit, dies zu tun. Ich werde später etwas erklären, was hier gemacht wird, aber es definiert im Grunde einen neuen Engraver (das ist im Grunde eine Sammlung von Listenern und Event-Handlern, die Dinge wie das Erstellen von grafischen Objekten tun).
@saraf Dieser neue Engraver macht im Grunde nichts anderes, als zu prüfen, ob wir uns gerade auf einem Schlag befinden, und wenn ja, gibt er die Zählung des Schlags im aktuellen Takt zurück.

Versuchen

<<
  \new RhythmicStaff
  {
    \repeat volta 2 {
      \tempo "in 3"
      \time 3/8
      8 8 16 r |
      8 16 16 8 |
      16[ 16 8 r16 16] |
    }
    \repeat volta 2 {
      \tempo "in 4"
      \time 4/8
      8 16 16~8 r |
      r16 16[ r16 16] r16 8.~ |
      4~16 8 16 |
      16 r16 4 r8 |
    }
  }
  \new Lyrics \lyricmode {
    \repeat unfold 3 { "1"8 "2" "3" | }
    \repeat unfold 4 { "1" "2" "3" "4" | }
  }
>>

Ausgang

LyricsDer grundlegende Trick besteht hier darin, ohne \addlyricsoder zu verwenden \lyricsto, sodass Sie die Dauer explizit angeben können: "1"8ist eine Silbe von "1"mit einer Dauer von 8und diese Dauer wird dann als Standard für alles andere verwendet.