Autor Thema: Noten in \header { \meter }  (Gelesen 2401 mal)

l3u

  • Member
Noten in \header { \meter }
« am: Samstag, 3. Oktober 2015, 00:07 »
Hallo :-)

Ich würde gerne in der allgemeinen Tempo-Angabe \meter im Header Noten verwenden. Ich habe es bisher hinbekommen, eine einzelne Note mittels \markup { \note … } zu verwenden, also z. B. ("8tel" = 132 oder sowas). Aber namentlich geht es um das Swing-Tempo, also "Zwei Achtel mit einem Balken verbunden" = "Eine Viertel und eine Achtel als Triole".

Im Notentext, also als \mark habe ich das schon öfters benutzt, und zwar mit dem rhythmMark-Code-Schnipsel: "\rhythmMark #"" \rhyMarkIIEighths \rhyMarkTriplets".

Wie kann ich genau das als \meter einfügen? Vielen Dank für alle Hilfe!

harm6

  • Member
Re: Noten in \header { \meter }
« Antwort #1 am: Samstag, 3. Oktober 2015, 02:23 »
Zitat von: l3u
Im Notentext, also als \mark habe ich das schon öfters benutzt, und zwar mit dem rhythmMark-Code-Schnipsel: "\rhythmMark #"" \rhyMarkIIEighths \rhyMarkTriplets".

Bitte gebe immer den link an ;)
Es ist Lsr-snippet http://lsr.di.unimi.it/LSR/Item?id=204

In diesem snippet wird via `rhythmMark' eine RehearsalMark ausgegeben. Funktioniert in Musik natürlich aber nicht im header wo nur markups akzeptiert werden. Es wäre besser das snippet würde das trennen...

Aber es gibt ja das score-markup-command, welches ja auch im snippet breit verwendet wird:

\version "2.19.28"

\paper {
  markup-system-spacing.padding = 10
}

meter-markup =
\markup {

  \score {
    \new RhythmicStaff { b8[ 8] }
    \layout {
      ragged-right= ##t
      indent = 0
      \context {
        \RhythmicStaff
        fontSize = #-3
        \override StaffSymbol.staff-space = #(magstep -3)
        \remove "Clef_engraver"
        \remove "Time_signature_engraver"
        \override StaffSymbol.line-count = #0
      }
    }
  }
 
  " = "
 
  \score {
    \new RhythmicStaff { \tuplet 3/2 { b4 b8 } }
    \layout {
      ragged-right= ##t
      indent = -1
      \context {
        \RhythmicStaff
        fontSize = #-3
        \override StaffSymbol.staff-space = #(magstep -3)
        \remove "Clef_engraver"
        \remove "Time_signature_engraver"
        \override StaffSymbol.line-count = #0
      }
    }
  }
}

\header {
  title = \markup { "title is: " "TITLE" }
  meter = \markup { "meter is: " \meter-markup }
  composer = \markup { "composer is: " "COMPOSER" }
  piece = \markup { "piece is :" "PIECE" }
}

{ \mark "dummy-score-output:" \tempo "my Tempo" c''1 }


HTH,
  Harm

l3u

  • Member
Re: Noten in \header { \meter }
« Antwort #2 am: Samstag, 3. Oktober 2015, 13:18 »
Der Code funktioniert hier leider nicht, vermutlich hat sich seit Lilypond 2.18.2 (aktuellste hier verfügbare Version) einiges geändert … ich versuche jetzt einfach mal, den relevanten Code-Teil aus dem rhythmMark-Code rauszuziehen (ich wusste gar nicht mehr, wo ich das her hatte, ist schon lang her, deswegen habe ich auch keinen Link gepostet ;-)

Vielen Dank für den Hinweis! Ich hoffe, ich kriege das hin …

harm6

  • Member
Re: Noten in \header { \meter }
« Antwort #3 am: Samstag, 3. Oktober 2015, 13:28 »
Deshalb immer die Version angeben ;)

Wenn Du noch eine Note einfügst:
Zitat
meter-markup =
\markup {

  \score {
    \new RhythmicStaff { b8[ b8] }
[...]
klappt es auch mit 2.18.2, getestet.

"Nackte" Rhythmen sind erst ab 2.19.irgenwas möglich.

Aber die error message:
Zitat
error: syntax error, unexpected UNSIGNED
    \new RhythmicStaff { b8[
                             8] }
gibt eigentlich auch einen klaren Hinweis, wo das Poblem mit 2.18.2 liegt.

Versuche immer solch eine Meldung zu verstehen, bevor Du Dich daran machst das Rad neu zu erfinden ;)


Gruß,
  Harm

l3u

  • Member
Re: Noten in \header { \meter }
« Antwort #4 am: Samstag, 3. Oktober 2015, 13:59 »
Ich hab das schon gelesen, aber nicht kapiert ;-) Das letzte Mal, dass ich Lilypond benutzt habe, ist schon etwas her, ich bin ein bisschen eingerostet … Auf jeden Fall vielen Dank für die Hilfe! Hätt ich selber nicht hinbekommen!

Ich überlege gerade, ob man nicht gleich eine universelle Funktion daraus machen sollte … also eine, der man Noten übergeben kann, und dann Markup bekommt.

Also im Prinzip sowas wie
musicMarkup = #(define-music-function (parser location music) (ly:music?)und dann was auch immer (ich kann einige Programmiersprachen ganz passabel, aber Scheme gehört definitiv nicht dazu :-( )

Damit man dann sowas machen könnte wie:
meter = \markup { "Swing" \musicMarkup { c8 [ c ] } "=" \musicMarkup { \times 2/3 { c4 c8 } } }
Wäre sowas ohne viel Aufwand möglich? Ich bekomm eine solche Funktion nicht hin … aber egal wie, mit dem bisherigen Code ist mir auf jeden Fall sehr geholfen!

harm6

  • Member
Re: Noten in \header { \meter }
« Antwort #5 am: Sonntag, 4. Oktober 2015, 00:48 »
http://lsr.di.unimi.it/LSR/Item?id=204 ist ein altes snippet. Heutzutage kann man manches einfacher und besser coden und eigentlich sollte man es mal neu schreiben ...

Es gibt das score-markup-command, welches allerdings einen score erwartet.
Wenn Du Musik rein und markup raus haben willst, dann ist eine scheme-function das was der Arzt empfiehlt.

Hier habe ich mal angedeutet wie ich mir besagtes snippet in modernerem Gewand vorstelle:

\version "2.18.2"

%% a scheme-function outputting a markup
rhythmMarkup = #(define-scheme-function (parser location label musicI musicII)
  (string? ly:music? ly:music?)
   #{
      \markup {
        \line \general-align #Y #DOWN {
          \italic \fontsize #2 $label
          \score {
            \new RhythmicStaff
              \relative c' { 
                $musicI
                %% adjust the "=", if needed
                %\once \override Score.TextScript.Y-offset = #-0.4
                s4.^\markup{ \halign #-1 \italic "=" }
                $musicII
              }
            \layout {
              ragged-right= ##t
              indent = 0
              \context {
                \RhythmicStaff
                \omit Clef
                \omit TimeSignature
                fontSize = #-4
                \override StaffSymbol.staff-space =
                  #(magstep -4)
                \override StaffSymbol.line-count = #0
              }
            } % layout end
          } % Score end
        } % line end
      } % markup end
   #})

%% a music-function outputting music, here: a RehearsalMark
rhythmMarkMarkup =
#(define-music-function (parser location mrkp)
  (markup?)
#{
  \mark $mrkp
#})

%% predefining a markup
swingTest =
\rhythmMarkup "swing-test" { b'8[ b8] } { \tuplet 3/2 { b'8 ~ b8 b8 } }


%% usage in music
{
  c''1 \rhythmMarkMarkup \swingTest
}

%% usage as toplevel-markup
\swingTest

Es geht noch besser, aber nachher kriegen wir wieder Probleme mit den lily-Versionen ...


HTH,
  Harm

l3u

  • Member
Re: Noten in \header { \meter }
« Antwort #6 am: Sonntag, 4. Oktober 2015, 12:04 »
So ungefähr haben meine Versuche auch ausgesehen … nur dass sie nicht funktioniert haben ;-) Ich denke mal, dass es schon mit define-music-function vs. define-scheme-function angefangen hat … ich muss mich wirklich mal richtig mit dem Zeug auseinandersetzen!

Was ich jetzt für den speziellen Fall benutzt habe, war:
swingMeter = \markup {
    \score {
        \new RhythmicStaff { c8[ c ] }
        \layout {
            ragged-right= ##t
            indent = 0
            \context {
                \RhythmicStaff
                fontSize = #-3
                \override StaffSymbol.staff-space = #(magstep -3)
                \remove "Clef_engraver"
                \remove "Time_signature_engraver"
                \override StaffSymbol.line-count = #0
            }
        }
    }
    " = "
    \score {
        \new RhythmicStaff { \times 2/3 { c4 c8 } }
        \layout {
            ragged-right= ##t
            indent = -1
            \context {
                \RhythmicStaff
                fontSize = #-3
                \override StaffSymbol.staff-space = #(magstep -3)
                \remove "Clef_engraver"
                \remove "Time_signature_engraver"
                \override StaffSymbol.line-count = #0
            }
        }
    }
}
und dann
\header {
    ...
    meter = \markup { "Swing" \swingMeter }
}

Mittels deiner vorgeschlagenen Funktion habe ich dann jetzt folgendes geschrieben:
rhythmMarkup = #(define-scheme-function (parser location music) (ly:music?)
#{
    \markup {
        \score {
            \new RhythmicStaff { $music }
            \layout {
                ragged-right= ##t
                indent = 0
                \context {
                    \RhythmicStaff
                    fontSize = #-3
                    \override StaffSymbol.staff-space = #(magstep -3)
                    \remove "Clef_engraver"
                    \remove "Time_signature_engraver"
                    \override StaffSymbol.line-count = #0
                }
            } % layout
        } % score
    } % markup
#}
)

twoEights = \rhythmMarkup { c'8[ c8 ] }
quarterEighthTriplet = \rhythmMarkup { \times 2/3 { c4 c8 } }
swingRhythm = \markup { \twoEights " =" \quarterEighthTriplet }
Also eine abstrakte Funktion, und ein paar Helfer (zu denen man natürlich weitere hinzufügen kann, wenn nötig).

Zu benutzen dann z. B. so:
\header {
    ...
    meter = \markup { "Showy Swing (" \swingRhythm ")" }
}

Die "neuen"(?) Befehle aus dem Code, den du gepostet hast, haben zu größeren Leerräumen um die Noten geführt, deswegen habe ich einfach die "alten" benutzt.

Also auf jeden Fall ist das jetzt (für mich) die perfekte Lösung, vor allem auch universell einsetzbar. Super :-) Vielen, vielen Dank!
« Letzte Änderung: Sonntag, 4. Oktober 2015, 12:06 von l3u »