Tabulatur nur partiell ausgeben

Begonnen von hurrlipurr, Samstag, 2. November 2019, 08:44

« vorheriges - nächstes »

hurrlipurr

Ist es möglich nur teilweise eine zusätzliche Zeile mit Tabulatur einzufügen?

Ich habe größere BigBand-Scores, bei denen ich zum Einstudieren nur für kompliziertere Single Lines eine zusätzliche Tabulatur sehr nützlich finde. Auf das ganze Stück bläht die zusätzliche Zeile die Partitur sehr auf.

Viele Grüße
Oliver

Malte

Hallo Oliver,

bitte poste immer mit Versionsangabe und Minimalbeispiel. Folgendes sollte eigentlich gehen, es scheint aber einen Bug zu geben, der das Verstecken der ersten Zeile nicht so richtig gut funktionieren läßt:\version "2.19.83"

bla = { \repeat unfold 400 e'4 }
git = {
  \set TabStaff.keepAliveInterfaces = #'()
  \repeat unfold 40 c'4
  \repeat unfold 40 c'4
  \repeat unfold 40 c'4
  \unset TabStaff.keepAliveInterfaces
  \repeat unfold 10 { c'4 d' e' f' }
  \set TabStaff.keepAliveInterfaces = #'()
  \repeat unfold 40 c'4
  \repeat unfold 40 c'4
  \repeat unfold 40 c'4
  \repeat unfold 40 c'4
  \repeat unfold 40 c'4
  \repeat unfold 40 c'4
}

<<
  \new Staff \bla
  \new Staff \bla
  \new Staff \bla
  \new Staff \bla
  \new Staff \bla
  \new Staff \bla
  \new Staff \git
  \new TabStaff \with { \RemoveEmptyStaves } \git
  \new Staff \bla
  \new Staff \bla
  \new Staff \bla
  \new Staff \bla
>>


Ich bin dran, herauszufinden, was da schief läuft.

Viele Grüße
Malte

harm6


hurrlipurr

Hi ihr beiden,

bei Maltes Vorschlag werden bei mir nur die vier Noten (c d e f) ausgegeben und die auch nur einmal. Leider verstehe ich auch den Code nicht und was ich zu keepAliveInterfaces finden konnte (http://lilypond.org/doc/v2.19/Documentation/notation/context-modification-identifiers.de.html) hilft mir beim Verständnis auch nicht weiter.

Ich versuche mal ein Beispiel zu basteln, das ist halt nicht so einfach, wenn man gar nicht weiß, wie es gehen könnte.

Grundsätzlich sieht mein Aufbau so aus:

sheet =
  <<
    \new ChordNames {
      \set chordChanges = ##t
      \harmonies
    }
    \new Voice = "one" { \clef "treble_8" \omit Staff.StringNumber \melody }
    \new TabStaff \melody
  >>


Ich habe also Akkordiagramme und Noten, wobei die Noten größtenteils nur Rhythmusangaben (mit Hilfe von \improvisationOn/Off) darstellen. Dort macht die Tabulatur keinen Sinn, nimmt halt nur Platz weg.

Dazwischen kommen dann ab und zu richtige Single Lines, die ich dann gerne parallel noch als Tab drunter hätte.

Vielleicht denke ich auch wieder mal viel zu kompliziert...

Ich benutze übrigens Version 2.19.82

VG Oliver

hurrlipurr

Hi,

ich komme zurück zu meiner Frage vom letzten Jahr. Inzwischen habe ich versucht, das Problem mit Ossia-Systemen zu lösen. Am folgenden Beispiel wird hoffentlich auch das Problem klarer.


\version "2.19.83"
\pointAndClickOff
\header { title = "Partielle Tabs" composer = "" tagline = ""}
\paper {
  ragged-right = ##f
  markup-system-spacing.basic-distance = #20    % Abstand Titel usw. von Noten
  indent = #0             % Einrückung der ersten Zeile
}

fourq = {\relative c' {\improvisationOn \omit Stem b4 b b b \improvisationOff \undo \omit Stem}}

harmonies = \chordmode {
  c1 f g c
}

melody = \new Voice = main {
  \relative c' {
  \compressFullBarRests
  % \set minimumFret = #5
  % \set TabStaff.restrainOpenStrings = ##f
  \key c \major

  \repeat unfold 2 \fourq
  <<
    { f4 d' b, d }
    \new TabStaff \with {
      \remove "Time_signature_engraver"
      alignBelowContext = "main"
      fontSize = #-1
      \override StaffSymbol.staff-space = #(magstep -1)
      \override StaffSymbol.thickness = #(magstep -1)
      firstClef = ##f
    }
    { f4 d' b, d }
  >>
  \fourq
}
}
sheet =
  <<
    \new ChordNames {
      \set chordChanges = ##t
      \harmonies
    }
    \new Staff = "one" { \clef "treble_8" \omit Staff.StringNumber \melody }
  >>

\book { \bookOutputName $(string-append "PDF/" (ly:parser-output-name)) \bookOutputSuffix "C" \sheet}


Zwei Probleme habe ich aber noch:

  • Die Angaben für minimumFret und restrainOpenStrings funktionieren hier nicht wie gewünscht: wenn ich die beiden Zeilen (im Code auskommentiert) einfüge, passiert leider nicht das Gewünschte.
  • Es ist ziemlich mühsam, das an verschiedenen Stellen jedesmal alles neu einzufügen. Leider habe ich keine Ahnung, ob und wie man das in eine Funktion packen könnte.

harm6

Hier meine Gedanken zum Thema:


\version "2.19.83"

\pointAndClickOff

\header { title = "Partielle Tabs" composer = "" tagline = ""}

\paper {
  ragged-right = ##f
  markup-system-spacing.basic-distance = #20    % Abstand Titel usw. von Noten
  indent = #0             % Einrückung der ersten Zeile
}


myTabProperties =
  \with {
    \remove "Time_signature_engraver"
    \omit Clef
    alignBelowContext = "one"
    fontSize = #-1
    \override StaffSymbol.staff-space = #(magstep -1)
    \override StaffSymbol.thickness = #(magstep -1)
  }

sendOssiaTabsToTabStaff =
#(define-music-function (mus)(ly:music?)
(make-music
  'SimultaneousMusic
  'elements
  (list
    ;; Original 'mus', disable improvisation, enable printing Stems
    ;; Revert those settings at the end of 'mus'
    #{
      \improvisationOff 
      \undo \omit Stem
      $mus
      \omit Stem
      \improvisationOn
    #}
    ;; mus sent to TabStaff named "tabs"
    (make-music
      'ContextSpeccedMusic
      'property-operations
      '()
      'context-id
      ;; TODO should the name be configurable?
      "tabs"
      'context-type
      'TabStaff
      'element
      #{
        \startStaff
        #mus
        \stopStaff
      #}))))

fourq = \relative c' {
\improvisationOn
\omit Stem
b4 b b b
}

harmonies = \chordmode {
  c1 f g c g c
}

melody = \new Voice = "main"
  \relative c' {
  \compressFullBarRests
  \key c \major

  \repeat unfold 2 \fourq
  \sendOssiaTabsToTabStaff
    {
      \set minimumFret = #5
      \set restrainOpenStrings = ##f
      f4 d' b, d
    }
  \fourq
  \break
  %% Manually remove unwished BarLines in TabStaff at line-end
  %% No clue how to do this automagically in all thinkable cases
  %% The effect is visible if this command and next \fourq is commented
  \once \set TabStaff.whichBar = ""
  \fourq
  \sendOssiaTabsToTabStaff
    {
      \set minimumFret = #5
      \set restrainOpenStrings = ##f
      f4 d' b, d
    }
  \fourq
}


<<
  \new ChordNames \with { chordChanges = ##t }
    \harmonies
   
  \new Staff = "one" \with { \omit StringNumber }
    { \clef "treble_8" \melody }
 
  %% Create TabStaff as target for 'sendOssiaTabsToTabStaff', apply \stopStaff,
  %% keep it alive
  \new TabStaff = "tabs" \with \myTabProperties
    { \stopStaff $(skip-of-length melody) }
>>


Allerdings fusst manches auf Deinen Angaben, die sich in wirklichen Codings möglicherweise ändern werden.

Aber hier hast Du zumindest einen Anfang.
Beachte auch die inline Kommentare.


Gruß,
  Harm

hurrlipurr

Hallo Harm,

prima, deine Lösung hilft mir schon erheblich weiter. Dummerweise verbraucht aber nun die 'permanente' TabStaff immer Platz, auch wenn sie nicht ausgegeben wird, was die Partitur sehr aufbläht.

ZitatAllerdings fusst manches auf Deinen Angaben, die sich in wirklichen Codings möglicherweise ändern werden.
Das habe ich nicht recht verstanden.

LG Oliver

harm6

ZitatDummerweise verbraucht aber nun die 'permanente' TabStaff immer Platz, auch wenn sie nicht ausgegeben wird, was die Partitur sehr aufbläht.

Hilft:
  %% Create TabStaff as target for 'sendOssiaTabsToTabStaff', apply \stopStaff,
  %% keep it alive
  \new TabStaff = "tabs" \with { \myTabProperties \RemoveEmptyStaves }
    { \stopStaff $(skip-of-length melody) }
?

Zitat von: hurrlipurr am Samstag, 15. Februar 2020, 15:14
ZitatAllerdings fusst manches auf Deinen Angaben, die sich in wirklichen Codings möglicherweise ändern werden.
Das habe ich nicht recht verstanden.

Z.B. Ist der Name des TabStaff hardcoded, siehe TODO
Aber nur in sendOssiaTabsToTabStaff nicht bei der TabStaff-"Erschaffung"

Auch ist die Frage, ob Setzungen wie
      \set minimumFret = #5
      \set restrainOpenStrings = ##f
lokal oder global gelten sollen.
Genauso \improvisationOn/off und \omit Stem etc

Ich hab' zum Teil geraten, was für Dich am besten passen mag...

Gruß,
  Harm

hurrlipurr

Ja, das hilft sehr.  :D

minimumFret und restrainOpenStrings müssten aber in der Tat veränderlich sein - so weit war ich noch gar nicht durchgestiegen...  :-[

Ich werde mir in den nächsten Tagen mal den "Extending" Guide zu Gemüte führen, mal schauen, ob ich das verstehe. Lisp habe ich vor vielen Jahren an der Uni gelernt, vielleicht ist ja noch etwas hängengeblieben.

harm6

Zitat von: hurrlipurr am Montag, 17. Februar 2020, 21:28
Ich werde mir in den nächsten Tagen mal den "Extending" Guide zu Gemüte führen, mal schauen, ob ich das verstehe. Lisp habe ich vor vielen Jahren an der Uni gelernt, vielleicht ist ja noch etwas hängengeblieben.

Für LilyPond hilft es immer sich in Lisp/scheme/guile auszukennen.
Als Einführung für scheme in LilyPond ist das Extending Manual gar nicht so übel...

Allerdings ist in meinem Coding hier kaum natives scheme vorhanden. Tatsächlich bin ich nur nach scheme gewechselt, weil ich im ersten Versuch es nicht geschafft hatte, die Limitierungen, die #{...#} zum Einbetten in scheme hat, zu umgehen.

Tatsächlich kann man 'sendOssiaTabsToTabStaff' aber auch so schreiben:


sendOssiaTabsToTabStaff =
#(define-music-function (mus)(ly:music?)
#{
  <<
    { \improvisationOff \undo \omit Stem $mus \omit Stem \improvisationOn }
    \context TabStaff = "tabs" { \startStaff $mus \stopStaff }
  >>
#})


Denke ich jedenfalls. Die Tests überlasse ich Dir ;)

Gruß,
  Harm