Tabulatur im Wiki-Score-Pluggin repeat volta 4

Begonnen von Mjchael, Montag, 9. August 2021, 10:25

« vorheriges - nächstes »

Mjchael


%<score midi="1" vorbis="1">
<<
  % Akkordnamen (siehe auch:  \midi)
  \new ChordNames {
    \chordmode {
      c2 c:/b a1:m f g
    }
  }
  % Notensystem
  {
    \new Staff  <<
      \tempo 4 = 120
      %Tempo ausblenden
      \set Score.tempoHideNote = ##t
      \time 4/4
      \key c \major
      \set Staff.midiInstrument = #"acoustic guitar (nylon)"
      \clef "G_8" \repeat volta 4
      % ? Wie zeigt man mehrfache Wiederholungen an, und wie lässt man sie im Midi erklingen?
      % Noten im Diskant
      {
        c8 c' g e'     b, c' g e' | % 1 Basis
        a, c' a e'     e c' a e'  | % 2 Basis
        f c' a f'      a, c' a f' | % 3 Basis
        g, b g g'      b, b g g'  | % 4 Basis
      }
      \\
      % Noten im Bass
      {
        c4 g  b, g a, a  e a f a a, a g, g b, g
      }
    >>
  }
  % Tabulatur
  \new TabStaff {
    \tabFullNotation \repeat volta 4
    <<
      % Tabulatur im Diskant
      {
        c8 c' g e'     b, c' g e' | % 1 Basis
        a, c' a e'     e c' a e'  | % 2 Basis
        f c' a f'      a, c' a f' | % 3 Basis
        g, b g g'      b, b g g'  | % 4 Basis
      }
      \\
      % Tabulatur im Bass
      {
        c4 g  b, g a, a  e a f a a, a g, g b, g
      }
    >>
  }
>>
\layout {}
\midi {
  % Notennamen sollen nicht erklingen
  \context {
    \ChordNames
    \remove "Staff_performer"
  }
}
&</score>

(Code wurde nicht gekürzt, da es eh so gut wie keine Tabulatur-Beispiele gibt. )

sieht folgendermaßen aus:


Das Bild sowie der Code ist auf einer Test-Wikipedia. Sollte das Bild mit der Test-Wikipedia verschwinden, siehe Anhang.

Derzeit könnt ihr meine Versuche incl.  Hörbeispiele auf meiner Testseite (Sandbox) anschauen und hören.
https://test.m.wikipedia.org/wiki/User:Mjchael/sandbox

Meine Frage, die ich in dem Handbuch nicht klären kann:
* Ich habe \repeat volta 4 eingegeben, aber es wird nur eine einfache Wiederholung angezeigt.
Wie kann ich eine mehrfache Wiederholung angezeigt lassen, ohne eine Alternative anzugeben?

* Wie veranlasse ich 'midi' die Wiederholungen mehrfach abzuspielen? Derzeit erklingt alles ohne Wiederholung.

Im Pluggin muss alles in einem Code (ohne includes) und ohne Variablen ablaufen.

Ein Code mit Variablen ginge, jedoch derzeit nur als Din-A4 ( also für eine Beispielgrafik ungeeignet).
Doch das ist ein anderes Problem für ein anderes Thema.
Meine Durchhalteparole:
Das sollst du nicht können!
Das sollst du lernen!

harm6

Zitat* Ich habe \repeat volta 4 eingegeben, aber es wird nur eine einfache Wiederholung angezeigt.
Wie kann ich eine mehrfache Wiederholung angezeigt lassen, ohne eine Alternative anzugeben?

Bei \repeat volta 4 wird immer nur die einfache Wieerholung angezeigt. Die Ziffer 4 dient dazu die Anzahl der alternativen Endungen oder das Expandieren bei Verwendung von \unfoldRepeats einzuregeln.
Du mußt die 4-malige Wiederholung eventuell manuell eingeben, z.B. mit \mark "4x"

Zitat* Wie veranlasse ich 'midi' die Wiederholungen mehrfach abzuspielen? Derzeit erklingt alles ohne Wiederholung.

Dazu gibt es das schon erwähnte \unfoldRepeats.
Jedoch brauchst Du um die print-Fassung und die midi-Fassung unterschiedlich auszugeben zwei scores.

Minimal:

\score { { \repeat volta 4 { b1 } \mark "4x" } }
\score { \unfoldRepeats { \repeat volta 4 { b1 } \mark "4x" } \midi {} }


Allerdings könnte es dann diese Bedingung verletzen:
ZitatIm Pluggin muss alles in einem Code (ohne includes) und ohne Variablen ablaufen.

In diesem Fall versuch einen \bookpart:

\bookpart {
  \score { { \repeat volta 4 { b1 } \mark "4x" } }
  \score { \unfoldRepeats { \repeat volta 4 { b1 } \mark "4x" } \midi {} }
}

Das ist ja nur ein Ausdruck.

Oder geh komplett in den scheme-interpreter (dann wären auch lokale Variablen machbar):

#(let*
  ((diskant
    #{
       {
        \time 4/4
        \key c \major
    \repeat volta 4 {
          c8 c' g e'     b, c' g e' | % 1 Basis
          a, c' a e'     e c' a e'  | % 2 Basis
          f c' a f'      a, c' a f' | % 3 Basis
          g, b g g'      b, b g g'  | % 4 Basis
          \mark "4x"
        }
       }
    #})
   (bass
    #{
      {
       \repeat volta 4 {
         c4 g  b, g a, a  e a f a a, a g, g b, g
       }
      }
    #})
   (simultaneous-music #{ << $diskant \\ $bass >> #})
   (music
    #{
      <<
        % Akkordnamen (siehe auch:  \midi)
        \new ChordNames
        {
          \chordmode {
            c2 c:/b a1:m f g
          }
        }
        % Notensystem
        \new Staff 
          \with { midiInstrument = #"acoustic guitar (nylon)" }
          {
            \tempo 4 = 120
            %Tempo ausblenden
            \set Score.tempoHideNote = ##t
            \clef "G_8"
            $simultaneous-music
          }
        % Tabulatur
        \new TabStaff {
          \tabFullNotation
          $simultaneous-music
        }
      >>
    #}))
  (ly:book-process
    (ly:make-book
      $defaultpaper
      $defaultheader
      (scorify-music (ly:music-deep-copy music)))
    $defaultpaper
    #{ \layout { } #}
    (ly:parser-output-name))
   
  (ly:book-process
    (ly:make-book
      $defaultpaper
      $defaultheader
      (scorify-music (unfoldRepeats music)))
    $defaultpaper
    #{ \midi { \context { \ChordNames \remove "Staff_performer" } } #}
    (ly:parser-output-name)))

Das ist ebenfalls nur ein Ausdruck.

HTH,
  Harm


Mjchael

@Harm6
Danke für die vielen Hinweise.

Das Anzeigen der 4fachen Wiederholung klappt.

Mit den \unfoldRepeats muss ich schauen, wo diese genau plaziert werden muss, und wie oft ich die volta im Code wiederholen muss.

Bei meinem ersten Versuch, deiner Kurzform zu folgen, wurde die Melodie im Diskant 4x ausgeschrieben, was den Sinn des Wiederholungszeichen zunichte macht.
Die Melodie im Bass wurde nur einmal wiederholt. Das Wirft natürlich Fragen auf.

Muss ich die Volta bei jeder Stimme angeben?

Kann ich die \unfoldRepeats auch im Midiblock unterbringen,
ohne alle Noten wiederholen zu müssen?

Mit Variablen könnte ich zwar arbeiten, müsste das jedoch im raw-Modus (Plugin-spezifisch) machen, und jedes Notenbeispiel hätte die Ausmaße einer DinA4-Grafik. Wie ich das umgehe, steht auf einem anderen Platz.
Zu der Lektion gehören 9 Notenbeispiele, die dann mit Erklärungen auf mindestens 10 Seiten verteilt wäre.
Die quick and dirty Methode wäre ein Midi-Upload. Doch die Arbeit möchte ich mir eigentlich ersparen.

Sobald das Score-Plugin auf den Wiki-Projekten wieder aktiviert ist, werde ich dermaleinst ein Tutorial für Wiki-Autoren schreiben (wo das Lilypond-Forum lobend erwähnt wird). Man erkennt dass Bestreben schon an den Kommentaren im Code.  Ich habe noch kein Tutorial für eine etwas anspruchsvollere Tabulatur  im Netz gefunden.

Daher muss ich erst mal alles recherchieren.

Meine Durchhalteparole:
Das sollst du nicht können!
Das sollst du lernen!

harm6

Ad \unfoldRepeats
ZitatMit den \unfoldRepeats muss ich schauen, wo diese genau plaziert werden muss, und wie oft ich die volta im Code wiederholen muss.
Wenn Du alle Wiederholungen entfaltet haben willst, dann reicht eine einzige Setzung von \unfoldRepeats (pseudo-code):
\score {
  \unfoldRepeats
  <music>
}
Alle Wiederholungen meint auch z.B. \repeat percent bzw \repeat tremolo etc. Man kann allerdings auch einschränken welche Wiederholungstypen (percent, tremolo, ...) angesprochen werden sollen.
ZitatMuss ich die Volta bei jeder Stimme angeben?
Natürlich wird nur entfaltet was so (d.h. mit \repeat ...) angegeben ist. Deshalb, ja, Du mußt die Wiederholungsstruktur in jeder Stimme angeben.

ZitatKann ich die \unfoldRepeats auch im Midiblock unterbringen,
ohne alle Noten wiederholen zu müssen?
Nein.
\unfoldRepeats ist eine music-function die auf ihr music-Argument wirkt.
Du mußt alle Noten in einem eigenen score wiederholen.
Ohne Variablen ist das sehr unpraktisch.

Ganz generell ist \unfoldRepeats nur im midi sinnvoll und nicht im pdf.
Deshalb die Notwendigkeit zwei scores verwenden zu müssen.

ad Variablen

Normalerweise würde man z.B. diskant und bass in eigene Variable setzen und diese dann wie nötig aufrufen. Z.B.:
Code (pseudo-code) Auswählen

diskant = ...
bass = ...
music = << \diskant \\ \bass >>
\score { \music }
\score { \unfoldRepeats \music \midi { } }

diskant, bass und music sind hier Variablen gesetzt auf toplevel Niveau.
Nun sagst Du, daß die Verwendung von Variablen in Deinem Anwendungsfall problematisch ist.
Deshalb meine Idee mit #(let* ...), mein letztes Codebeispiel aus meinem vorherigen Post.
Dort gibt es keine toplevel-Variablen, sondern nur lokale.
Bitte probier das doch mal aus, möglicherweise kann man die Problematik damit umgehen.

Gruß,
  Harm

Mjchael

Ich werde alles ausprobieren und mich melden,
sobald ich Erfolg habe.

Vielen Dank für deine Unterstützung!
:D
Meine Durchhalteparole:
Das sollst du nicht können!
Das sollst du lernen!


Mjchael

@harm6 Das wurde mir schon mitgeteilt.  :D

Ich habe mit einigem Versuch und Irrtum all das umgesetzt, was ich von euch gelernt habe.

Mein Code sieht wie folgt aus:

%<score sound="1" raw="1">
\version "2.20.0"
\header {
  title="Travis & Basis"
  encoder="mjchael"
}
%Diskant- bzw. Melodiesaiten
Diskant = {
  e'8 c' g e'   b, c' g4   | % 1 Travis
  a,8 c' a e'   e c' a e'  | % 2 Basis
  f'8 c' a f'   a, c' a4   | % 3 Travis
  g,8 b g g'    b, b g g'  | % 4 Basis
  \mark "4x"
}
%Basssaiten, die hier nur mit dem Daumen gespielt werden.
Bass = {
  c4 g  b, g a, a  e a f a a, a g, g b, g
}
% Layout- bzw. Bildausgabe
\score {
  <<
    \new ChordNames {
      \chordmode {
        c2 c:/b a1:m f g
      }
    }
    {
      %Noten
      \new Staff  <<
        \tempo 4 = 120
        %Tempo ausblenden
        \set Score.tempoHideNote = ##t
        \time 4/4
        \key c \major
        \set Staff.midiInstrument = #"acoustic guitar (nylon)"
        \clef "G_8" \repeat volta 4
        % Balken nur über viertel Noten,  nicht über halbe Noten
        \set Timing.beamExceptions = #'()
        \set Timing.baseMoment = #(ly:make-moment 1/4)
        \set Timing.beatStructure = #'(1 1 1 1)
        % Noten im Diskant
        \Diskant
        \\
        % Noten im Bass - beachte: Wiederholungszeichen ist für Midi notwendig!
        \repeat volta 4
        \Bass
      >>
    }
    % Tabulatur
    \new TabStaff {
      \tabFullNotation \repeat volta 4
      <<
        % Tabulatur im Diskant
        \Diskant
        \\
        % Tabulatur im Bass
        \Bass
      >>
    }
  >>
  \layout {}
}
% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
  <<
    \unfoldRepeats {
      \new Staff  <<
        \tempo 4 = 120
        \time 4/4
        \key c \major
        \set Staff.midiInstrument = #"acoustic guitar (nylon)"
        \clef "G_8" \repeat volta 4
        \Diskant
        \\
        \repeat volta 4
        \Bass
      >>
    }
  >>
  \midi {}
}
% unterdrückt im raw="1"-Modus das DinA4-Format.
\paper {
  indent=0\mm
  % DinA4 0 210mm - 10mm Rand - 20mm Lochrand = 180mm
  line-width=180\mm
  oddFooterMarkup=##f
  oddHeaderMarkup=##f
  % bookTitleMarkup=##f
  scoreTitleMarkup=##f
}
%</score>

Die auskommentierten Score-Tags sind Homepage bzw. Wiki-spezifisch.

Der Code funktioniert im sogenannten raw-Modus sowohl bei Frescobaldi als auch in den Wikibooks bzw. in der Wikipedia. Es gibt einen vereinfachten Code, der aber lange nicht so komplex ist, und nicht einfach übertragbar. Die Kurzform ist nur für kleine einfache Beispiele gedacht.
Der \paper-Zusatz verhindert, dass die Grafiken im raw-Modus als DinA4 angezeigt werden.

Die Midiausgabe ist vom Ausdruck unterschiedlich. Ich muss die Akkordnamen also nicht in der Midiausgabe unterdrücken. Und die Wiederholungen werden im Midi abgespielt.
Bis jetzt klappt alles so wie es soll.

Anschauen und anhören könnt ihr es euch hier, wo ich gleich 9 Übungen für eine Gitarrenlektion geschrieben habe.

https://de.wikibooks.org/wiki/Gitarre:_Picking-Pattern_kombinieren
(Sind noch ein paar Fehler auf der Seite, was den Lilypond-Beispielen keinen Abbruch tut.

In der Form könnte es ein Novum sein. (Lektionen für Gitarristen in Lilypond auf einer Homepage.)

Kann mich aber täuschen. Auf den Wikibooks bin ich aber der erste, der sich da ran wagt.

Auf alle Fälle Danke für eure Unterstützung und Hilfe.

Gruß Mjchael
Meine Durchhalteparole:
Das sollst du nicht können!
Das sollst du lernen!