Autor Thema: Tabulatur nur partiell ausgeben  (Gelesen 1959 mal)

hurrlipurr

  • Newbie
  • *
  • Beiträge: 37
Tabulatur nur partiell ausgeben
« am: Samstag, 2. November 2019, 08:44 »
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

  • Hero Member
  • *****
  • Beiträge: 550
Antw:Tabulatur nur partiell ausgeben
« Antwort #1 am: Samstag, 2. November 2019, 09:41 »
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

  • Hero Member
  • *****
  • Beiträge: 667
Antw:Tabulatur nur partiell ausgeben
« Antwort #2 am: Samstag, 2. November 2019, 15:04 »

hurrlipurr

  • Newbie
  • *
  • Beiträge: 37
Antw:Tabulatur nur partiell ausgeben
« Antwort #3 am: Samstag, 2. November 2019, 19:57 »
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

  • Newbie
  • *
  • Beiträge: 37
Antw:Tabulatur nur partiell ausgeben
« Antwort #4 am: Samstag, 15. Februar 2020, 10:07 »
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

  • Hero Member
  • *****
  • Beiträge: 667
Antw:Tabulatur nur partiell ausgeben
« Antwort #5 am: Samstag, 15. Februar 2020, 13:04 »
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

  • Newbie
  • *
  • Beiträge: 37
Antw:Tabulatur nur partiell ausgeben
« Antwort #6 am: Samstag, 15. Februar 2020, 15:14 »
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.

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

LG Oliver

harm6

  • Hero Member
  • *****
  • Beiträge: 667
Antw:Tabulatur nur partiell ausgeben
« Antwort #7 am: Samstag, 15. Februar 2020, 23:08 »
Zitat
Dummerweise 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
Allerdings 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

  • Newbie
  • *
  • Beiträge: 37
Antw:Tabulatur nur partiell ausgeben
« Antwort #8 am: Montag, 17. Februar 2020, 21:28 »
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

  • Hero Member
  • *****
  • Beiträge: 667
Antw:Tabulatur nur partiell ausgeben
« Antwort #9 am: Montag, 17. Februar 2020, 23: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