String-Bending Frage (Tabulatur)

Begonnen von phb, Samstag, 10. Februar 2018, 12:37

« vorheriges - nächstes »

phb

Ich spiele 5-saitiges Banjo und benutze lilypond 2.18.2 mit Frescobaldi zum Setzen von Tabulaturen. Jetzt habe ich eine eher seltene Technik, die ich einfach nicht gesetzt bekomme:

Ein String-Bending einer Saite während gleichzeitig eine andere Saite gezupft (aber nicht ge-bend-et) wird. Eine solche Technik gibt es gelegentlich bei bluesigen Stücken, häufiger auf der Gitarre als beim Banjo, weshalb ich hier auf eine Lösung hoffe, die ich nicht finden konnte. Zur Veranschaulichung hänge ich einen kleinen Ausschnitt als Grafik an. Die beiden Noten möchte ich übereinander, also gleichzeitig gespielt, setzen. Ich nehme dafür bei der einzelnen Note ein \bendAfter #4, aber das Bending verschwindet und die Noten werden ganz ohne das Bending gezeigt. Mein Code-Schnipsel:

<d'' bes' -\bendAfter #4 >4 \1 \2

Kein Bending zu sehen... :(

Ideen?

harm6

#1
\bendAfter funktioniert nicht mit Akkorden, iirc

Du könntest meinen bend-engraver verwenden.

Artikel dazu:
http://lilypondblog.org/2017/03/the-story-of-string-bending-in-lilypond/

Direkter link zum repository wo er momentan gehostet wird:
https://pagure.io/lilypond-bend-spanner/tree/master

Gruß,
  Harm

phb

Hallo und vielen Dank für Deine Antwort und erst recht für Deine Arbeit an dem Bending-engraver!

Ich musste erst einmal eine neuere Lilypond-Version installieren, weil das Bending-Paket nicht mit 2.18.2 wollte, habe mir dabei zwischenzeitlich meine alte zerschossen, aber jetzt habe ich die bei Ubuntu mitgelieferte und die 2.19.80 sauber nebeneinander installiert. Frescobaldi ist auch konfiguriert und die bending-Dateien liegen in ~/lilypond/include, wo sie auch gefunden werden. So weit, so gut. Aber dennoch komme ich damit noch nicht so ganz zurecht. Der bisherige Code für den oben gezeigten String-Bend sieht so aus:

d''4 \1 bes'4 -\bendAfter #4 \2

Tatsächlich ist das in dem Musikstück, das ich transkribiere, etwa ein ¼-Ton-Bending, weshalb ich mich an dem Beispiel für ein solches orientiert habe. Ich habe mit etwas Herumprobieren jetzt diesen Code:

  d''4 \1 ais'4 \2\startBend aisih'\stopBend \2

(mit dem ursprünglichen "bes" anstelle von "ais" ging es nicht). Das liefert das gezeigte Ergebnis, das mir gut gefällt. Nur leider reserviert lilypond nun für die Endnote des Bendings ebenfalls eine Viertelnote, so dass die Dauer des gesamten Bendings jetzt eine halbe Note beträgt. Setze ich daher die Länge der Note von 4 auf 8, dann passt es rhythmisch, aber die ge-bend-ete Note erhält einen Achtelnotenbalken, was ich unschön finde. Ich hätte gern das gezeigte optische Ergebnis mit dem "richtigen" Rhythmus hätte. Geht das?

harm6

Hallo,

eine Bitte, wenn Du Code postest, so achte darauf ein kompilierbares Minimalbeispiel zu erstellen, welches auch das Problem zeigt.
Z.B. zeigt der default-TabStaff ja gar keine Notenhälse, Fähnchen, Balken, etc.

Zum Thema.
Die bendings sind so implementiert, daß sowohl der Ausgangston als auch der Zielton angegeben werden muss. Meistens wird statt des Zielton allerdings der bending-amount gedruckt.
Das funktioniert soweit auch alles, gibt aber das von Dir beobachtete Problem, sobald Balken ins Spiel kommen.
Ist auch irgendwo in der test-suite thematisiert.
Es sind auch andere Vorgehensweisen theoretisch möglich gewesen, bei denen dann aber das Problem gelöst werden muß, denselben input auch in einer normalen Voice zu verwenden.
Um des Balkens Herr zu werden ist es wahrscheinlich am einfachsten den Notenwert zu skalieren. Siehe unten.

Warum es mit bes nicht klappen soll erschließt sich mir nicht, bei mir gehts. Hast Du die Eingabesprache korrekt gewählt?

Hier der Code, die includes habe ich mir gespart.

<<
  \new Staff
  {
    \clef "G_8"
    d''4 \1 ais'4*1/2\2\startBend aisih'\stopBend\2
    d''4 \1 bes'4*1/2\2\startBend beh'\stopBend\2
   
  }
  \new TabStaff \with { \tabFullNotation }
  {
    d''4 \1 ais'4*1/2\2\startBend aisih'\stopBend\2
    d''4 \1 bes'4*1/2\2\startBend beh'\stopBend\2
  }
>>


Gruß,
  Harm



phb

Hallo und nochmal danke!

Mit "bes" und "beh" anstelle von "ais" und "aisih" funktioniert es. Ich muss zugeben, dass ich schlicht das "ais" durch "bes" ersetzt hatte, so dass sich eben "bes" und "besih" ergaben. Weshalb es "aisih" und "beh" heißt, verstehe ich gar nicht, dazu kenne ich mich leider zu schlecht aus mit lilypond. Ich bastel mir aus verschiedenen Vorlagen etwas zusammen (z.B. habe ich gerade auf "moderntab" umgestellt, was ich bei Deinem Codebeispiel abgeguckt habe) und recycle das dann für weitere Tabulaturen. Damit komme ich ganz gut zurecht, aber manchmal mangelt es mir dann wohl an den soliden Grundlagen...

Ganz am Ziel bin ich aber noch nicht. Das möglichst reduzierte Ergebnis hänge ich an, der Code dazu, der sich sicherlich noch weiter reduzieren ließe, wenn ich denn wüsste, was noch weg kann:



\version "2.19.80"
\include "bending.ily"

#(set-global-staff-size 20.0750126457)
\paper {
  paper-width = 21.01\cm
  paper-height = 29.69\cm
  top-margin = 1.0\cm
  bottom-margin = 2.0\cm
  left-margin = 1.0\cm
  right-margin = 1.0\cm
}
\layout {
  \context {
    \Score
    autoBeaming = ##f
  }
}
PartPOneVoiceOne =  {
  \clef "moderntab" \stopStaff \override Staff.StaffSymbol #'line-count = #5
  \startStaff \stemDown \tabFullNotation \key g \major \numericTimeSignature\time 4/4
  \override Beam.concaveness = #10000
  \override Beam.thickness = 0.12

%  d''4 \1 bes'4 -\bendAfter #4 \2 g'8 \5 [ g'8 \2 ] e'8 ( \3 [ d'8 ) \3 ] | % 2
  d''4 \1 bes'4*1/2 \2\startBend beh'\stopBend \2 <\tweak bend-me ##f d'' \1 bes' \2>4*1/2\startBend <d'' \1 beh' \2>4*1/2\stopBend d''4 bes'4 \2
  \bar "|." }

\score {
  <<
    \new TabStaff \with {
      stringTunings = #`( ,(ly:make-pitch 0 1 0)
                          ,(ly:make-pitch -1 6 0) ,(ly:make-pitch -1 4 0)
                          ,(ly:make-pitch -1 1 0) ,(ly:make-pitch 0 4 0) )
    } <<
      \context TabStaff <<
        \context TabVoice = "PartPOneVoiceOne" { \PartPOneVoiceOne }
      >>
    >>

  >>

  \layout {}
}


Mich verwundert nun die "2" beim zweiten Bending. Eigentlich sollte da doch auch wieder nur "¼" stehen? Und gibt es eigentlich auch einen Bending-Pfeil ohne Angabe des Intervals? Das Stück hat ziemlich genau 240bpm, so dass die ge-bend-ete Note gerade einmal eine Viertelsekunde lang ist. So genau kann man gar nicht sagen, ob das denn nun ein Viertelton-Bending ist oder nicht. Dennoch ist da definitiv ein Bending, auch andere Tabulaturen zeigen es (üblicherweise ohne Angabe des Intervals).

harm6

#5
(1) Da die beiden ersten LilyPond-Entwickler Niederländer sind, ist die default-Eingabesprache für Notennamen niederländisch.
(2) Bei der Erstellung eines Minimalbeispiels konzentriere Dich auf das Problem, welches Du darstellen willst.
Brauchst Du dafür
\paper? Nein, also streichen
\layout? Nein, also ...
Takt? Nein, ...
\override ? Nein ...
etc
(3)
Um den korrekten bend-amount zu erhalten, schließe sowohl den nicht zu dehnenden Akkordton aus dem Anfangs- als auch dem Zielakkord aus:


\version "2.19.80"

\new TabStaff  {
  \override BendSpanner.details.head-text-break-visibility = ##(#f #f #f)
  < \tweak bend-me ##f d'' bes' >\startBend
  < \tweak bend-me ##f d'' beh' >\stopBend
}


Gruß,
  Harm

harm6

Hier ein besseres Beispiel. Es zeigt sowohl wie man den korrekten bend-amount bekommt, als auch wie man den Darstellung desselben ausschließen kann.

\version "2.19.80"

\new TabStaff  {
  < \tweak bend-me ##f d'' bes' >\startBend
  < \tweak bend-me ##f d'' beh' >\stopBend
  \override BendSpanner.details.head-text-break-visibility = ##(#f #f #f)
  < \tweak bend-me ##f d'' bes' >\startBend
  < \tweak bend-me ##f d'' beh' >\stopBend
}


Gruß,
Harm

phb

Perfekt, jetzt habe ich eigentlich alles, was ich brauche! Etwas weiter reduziert, aber sicherlich noch nicht minimal:


\version "2.19.80"
\include "bending.ily"

PartPOneVoiceOne =  {
  \clef "moderntab" \stopStaff \override Staff.StaffSymbol #'line-count = #5
  \startStaff \stemDown \tabFullNotation

  d''4 \1 bes'4*1/2 \2\startBend beh'\stopBend \2
  \override BendSpanner.details.head-text-break-visibility = ##(#f #f #f)
  <\tweak bend-me ##f d'' \1 bes' \2>4*1/2\startBend <\tweak bend-me ##f d'' \1 beh' \2>4*1/2\stopBend
  d''4 \1 bes'4*1/2 \2\startBend beh'\stopBend \2
  \override BendSpanner.details.head-text-break-visibility = ##(#t #t #t)
  <\tweak bend-me ##f d'' \1 bes' \2>4*1/2\startBend <\tweak bend-me ##f d'' \1 beh' \2>4*1/2\stopBend

\bar "|." }

\score {
  <<
    \new TabStaff \with {
      stringTunings = #`( ,(ly:make-pitch 0 1 0)
                          ,(ly:make-pitch -1 6 0) ,(ly:make-pitch -1 4 0)
                          ,(ly:make-pitch -1 1 0) ,(ly:make-pitch 0 4 0) )
    } <<
      \context TabStaff <<
        \context TabVoice = "PartPOneVoiceOne" { \PartPOneVoiceOne }
      >>
    >>

  >>

  \layout {}
}


Ergebnis anbei. Allerdings scheint nur die zweite Boolsche Variable in BendSpanner.details.head-text-break-visibility Pfeilkopf und Bend-Weite auszuschalten, die anderen beiden schienen mir keinen Effekt zu haben. Ich hoffe, alle drei auf true zu setzen, ist korrekt?

harm6

Zitat von: php
Allerdings scheint nur die zweite Boolsche Variable in BendSpanner.details.head-text-break-visibility Pfeilkopf und Bend-Weite auszuschalten, die anderen beiden schienen mir keinen Effekt zu haben. Ich hoffe, alle drei auf true zu setzen, ist korrekt?

Nope.
head-text-break-visibility erwartet einen vector mit Setzungen für end-of-line, middle-of-line und begin-of-line.
Je nach Setzung wird die Spitze+Zahl gedruckt oder nicht. Der erste und der dritte boolsche Wert sind also vor allem bei einem BendSpanner über einen Zeilenumbruch hinweg von Bedeutung.

Spiel mal rum mit den verschiedenen Setzungsmöglichkeiten, anhand von:

\new TabStaff  {
  \override BendSpanner.details.head-text-break-visibility = ##(#t #t #t)
  d''1\startBend
  ees''\stopBend
  d''1\startBend
  \break
  ees''\stopBend
}


Der default ist übrigens #(#f #t #t). Einsehbar in bend-grob-defs.ly (vorausgesetzt das file wurde nicht umbenannt). Ebenso wie diverse andere defaults, suche nach `bend-details' und `bend-spanner-poperties-alist'.

Ich habe bislang keine Doku zum BendSpanner geschrieben. Einerseits hatte ich geplant den Code noch zu überarbeiten (z.B. gibt er im Voice-context nichts wirklich brauchbares aus), andererseits bin ich auch kein guter Doku-Schreiber. Ein kleines bißchen Faulheit meinerseits mag auch im Spiel sein, aber wirklich nur ein kleines bißchen ;)

Insofern solltest Du die test-suite mal kompilieren und sorgfältig durchschauen. Die meisten Fragen (wenn auch nicht alle) sind dort problematisiert.

Gruß,
  Harm