Autor Thema: D.C. al Coda  (Gelesen 6110 mal)

Dakuan

  • Gast
D.C. al Coda
« am: Samstag, 24. März 2012, 23:03 »
Hallo,

wie kann man ein solches Konstrukt halbwegs richtig darstellen (siehe Anhang)? Es muss nicht genau so aussehen, soll aber sachlich richtig werden.

Zwischen dem vorhergehendem Coda und dieser Sequenz liegt bereits ein Abschnitt mit einer normalen Wiederholung und 2 alternativen Enden.

Ich habe bereits versucht einige Tricks aus der Dokumentation anzuwenden, aber sowohl \cadenzaOn/Off und \stopStaff / \startStaff enden in Katastrophen. Dabei geht nämlich die Zuordnung der Noten zur Tabulatur und zu den Akkordnamen verloren, es verschiebt sich alles.

Und wenn ich es mit
\mark \markup { \musicglyph #"scripts.coda" }u.s.w. versuche, bekomme ich die Meldung, das nur eine Marke zu einem bestimmten Zeitpunkt gesetzt werden kann.

Gibt es noch weitere Möglichkeiten?

harm6

  • Gast
Re: D.C. al Coda
« Antwort #1 am: Sonntag, 25. März 2012, 03:31 »
Hallo Dakuan,

versuch mal folgenden work-around:

\version "2.14.2"

rochadeAlpha = {
\override Score.BreakAlignment #'break-align-orders =
  #(make-vector 3 '(left-edge
          ambitus
          breathing-sign
          staff-bar
          clef
          key-cancellation   
          key-signature
          time-signature
          custos))
         
\once \override Score.TimeSignature #'space-alist = #'(
(first-note fixed-space . 2.0)
(right-edge extra-space . 0.5)
(staff-bar minimum-space . 2.5))
}

move = {
        \rochadeAlpha
        \once \override Score.BarLine #'extra-offset = #'(-1 . 0)
        \once \override TabStaff.BarLine #'extra-offset = #'(-0.666 . 0)
        \once \override Score.SpanBar #'X-offset = #'-1
        \once \override Score.Clef #'extra-offset = #'(-1 . 0)
        \once \override Score.OctavateEight #'extra-offset = #'(-1 . 0)
        \once \override Score.KeyCancellation #'extra-offset = #'(-1 . 0)
        \once \override Score.KeySignature #'extra-offset = #'(-1 . 0)
        \once \override Score.TimeSignature #'extra-offset = #'(-1 . 0)

 
trickery = {
        \once \override Score.BarLine #'hair-thickness = #'1.6
        \once \override Score.Clef #'(space-alist next-note) = #'(extra-space . 0)
        \bar "|"
        \move
}

onceTextLengthOn = {
        \once\override TextScript #'extra-spacing-width = #'(0 . 0)
        \once\override TextScript #'extra-spacing-height = #'(-inf.0 . +inf.0)
}

staffStop = {
        \onceTextLengthOn
        \stopStaff
        \cadenzaOn
}

staffStart = {
        \once\override Score.BarNumber #'break-visibility = #'#(#f #t #t)
        \startStaff
        \cadenzaOff
        \set Staff.forceClef = ##t
        \autoBeamOn
}

space =
#(define-music-function (parser location) ()
                #{
                   \staffStop
                   \onceTextLengthOn
                   s1*1/1000000-\markup \with-dimensions #(cons 0 spaceWidth) #'(0 . 0) \null
                   \once \override Score.Clef #'font-size = #'2
                   \staffStart
                   \trickery
                #})
               
%--------------------------- Test ----------------------------------------------

spaceWidth = 8

markDCalCoda = {
        \once \override Score.RehearsalMark #'self-alignment-X = #RIGHT
        \once \override Score.RehearsalMark #'font-size = #0
        \once \override Score.RehearsalMark #'baseline-skip = #3
        \mark \markup { \center-column \italic  { "D.C." "al Coda" } }
}

markCoda = {
        \once \override Score.RehearsalMark #'self-alignment-X = #LEFT
        \once \override Score.RehearsalMark #'font-size = #0
        \once \override Score.RehearsalMark #'extra-offset = #'(-3.66 . 2)
        \once \override Score.RehearsalMark #'baseline-skip = #3
        \mark \markup { \center-column \italic  { "Coda" \fontsize #3 \musicglyph #"scripts.coda" } }
}

chrds = \chordmode {
        d1:7
        \markDCalCoda
        \space
        \markCoda
        d2 g d g
}

mus = \relative c {
       
        \key g\major
        <d d'>4 c? b a
        \bar "||"
        \markDCalCoda
        \space
        \markCoda
        \key g\major
        <fis a'>8 b' <fis, a'>4 <g g'> b
        <fis a'>8 b' <fis, a'>4 <g g'> b
}

\score {
        \new StaffGroup
        <<
        \new ChordNames \chrds
        \new Staff { \clef "G_8" \mus }
        \new TabStaff { \mus }
        >>             
}       

Anmerkungen
Mit spaceWidth = 8 bestimmst Du die Länge des leeren Zwischenraums.
Die \mark-Zeichen habe ich vordefiniert, kann man natürlich auch direkt im Code machen. Möglicherweise mußt Du in
\once \override Score.RehearsalMark #'extra-offset = #'(-3.66 . 2)
die Werte anpassen.
Die \space-Funktion ist der zentrale Baustein. Sie benötigt kein weiteres Argument (das kommt von spaceWidth) muß aber in jede Stimme gesetzt werden.

HTH,
  Harm

Dakuan

  • Gast
Re: D.C. al Coda
« Antwort #2 am: Sonntag, 25. März 2012, 17:09 »
Danke für die Mühe,

das sieht schon sehr vielversprechend aus. Ich werde das mal in das Gesamtwerk einbauen und mal sehen was dabei passiert.
Wie lange braucht man eigentlich für sowas?

Einen schönen Sonntag noch
Dakuan

harm6

  • Gast
Re: D.C. al Coda
« Antwort #3 am: Montag, 26. März 2012, 00:31 »
Zitat
Wie lange braucht man eigentlich für sowas?

Ich bin zwar noch nicht sooo lange Mitglied in diesem Forum, aber ich hatte vorher schon ein paar Jahre LilyPond-Erfahrung.
Das hilft schon mal.
Im konkreten Fall hatte ich schon mal etwas ähnliches gemacht (auf der Basis der Arbeit anderer, u.a. hier im Forum). Das hatte damals trotzdem viele Stunden gedauert.
Für Deine Frage jetzt habe ich diese frühere Arbeit angepaßt, verbessert und vereinfacht. Das hat ungefähr 1-2 Stunden gedauert (gestoppt habe ich die Zeit jetzt allerdings nicht).

Der Zeitaufwand kann aber, je nach Thema, auch erheblich mehr sein: für grow-direction in beide Richtungen... habe ich mehrere Wochen gebraucht.


Gruß,
  Harm

Dakuan

  • Gast
Re: D.C. al Coda
« Antwort #4 am: Montag, 26. März 2012, 22:14 »
Hallo harm6,

ich habe mir schon gedacht, das hier teilweise Code Recycling im Spiel ist. Als C Programmierer mache ich sowas auch gerne.

Ich habe deinen Vorschlag gestern noch eingebaut und ich werde das jetzt auch so drinne lassen, aber es gibt da schon einige kleine Probleme, die umgangen werden müssen.

Erstmal hat Lilypond die unangenehme Eigenschaft Umbrüche immer an ungünstigen Stellen einzufügen. Das führt dann dazu das am Ende der Zeile, nach der Unterbrechung, noch 2 versetzte (!) Taktstriche zu sehen sind, die dann natürlich in der nächsten Zeile fehlen.

Da Lilypond auch noch versucht, die Noten auf möglichst wenig Blätter unterzubringen, führt das dazu, das im aktuellen Fall am Schluss alle Griffdiagramme übereinander gestapelt werden. Um das zu umgehen hatte ich ursprüglich
  \override Score.SpacingSpanner #'strict-note-spacing = ##t
  \set Score.proportionalNotationDuration = #(ly:make-moment 1 16)
eingebaut, was dann jedoch dazu führt, das sich die Takte in der Darstellung überlappen.

Ich habe das jetzt dadurch gelöst, das ich Lilypond angewiesen habe, das ganze Stück auf 10 Systeme zu verteilen. Das ergibt dann eine Darstellung mit der ich leben kann, obwohl der Taktstrich dabei etwa 3 Pixels später anfangen als Liniensystem.

Damit kann ich erstmal leben. Falls dich die Details  interessieren, kann ich noch Screenshots liefern. Den gesamten Quelltext möchte ich jedoch nicht öffentlich posten, da das möglicherweise Copyright Probleme nach sich ziehen könnte. Aber als PN oder e-mail ginge das.

Im übrigen habe ich das komplette Buch in einer eingescannten Version samt den dazugehörigen mp3 Dateien inzwischen im Netz gefunden. Einfach mal nach Richard Saslow suchen. Den ersten Titel (Ragtime Ramble) konnte ich früher mal spielen (vor 20 Jahren!), jetzt bin ich dabei den wieder zu lernen. Das gepostete Problem stammt jedoch aus den zweiten Stück "Dadalada".

Gruß
Dakuan

harm6

  • Gast
Re: D.C. al Coda
« Antwort #5 am: Montag, 26. März 2012, 23:42 »
Hallo Dakuan,

Zitat
Erstmal hat Lilypond die unangenehme Eigenschaft Umbrüche immer an ungünstigen Stellen einzufügen. Das führt dann dazu das am Ende der Zeile, nach der Unterbrechung, noch 2 versetzte (!) Taktstriche zu sehen sind, die dann natürlich in der nächsten Zeile fehlen.

Die Taktstrich-Versetzungen kann ich nicht reproduzieren, insoweit würde mich Dein Code schon interessieren. Denn wenn es in meinem Vorschlag eine Schwäche gibt kann ich die ja vielleicht beheben.

Zitat
Damit kann ich erstmal leben. Falls dich die Details  interessieren, kann ich noch Screenshots liefern. Den gesamten Quelltext möchte ich jedoch nicht öffentlich posten, da das möglicherweise Copyright Probleme nach sich ziehen könnte. Aber als PN oder e-mail ginge das.

BTW, copyright-Probleme kann man meist dadurch umgehen, daß man die eigentliche Musik durch \repeat unfold 120 { c1 } o.ä. ersetzt.

Ich werde meine mail-Adresse mal als PN schicken. Würd' mich freuen, falls Du mir den Quelltext zukommen läßt.


Gruß,
  Harm

Dakuan

  • Gast
Re: D.C. al Coda
« Antwort #6 am: Dienstag, 27. März 2012, 22:14 »
Hallo harm,

die Taktstrichversetzung habe ich mal fotografiert, damit andere Leser nachvollziehen können, worüber wir uns unterhalten. Den Quelltext schicke ich gleich los.
Gruß
Dakuan

harm6

  • Gast
Re: D.C. al Coda
« Antwort #7 am: Mittwoch, 28. März 2012, 12:58 »
Hallo Dakuan,

Zitat
Den Quelltext schicke ich gleich los.

Ist angekommen. Vielen Dank!

Ich habe mich noch nicht eingehend damit beschäftigen können. Aber ein paar Eindrücke:
Mein work-around war nie dafür gedacht bei einem Zeilenumbruch eingesetzt zu werden, dann entstehen tatsächlich diese unschönen Artefakte. Tatsächlich hätte ich den Zeilenumbruch bei Verwendung dieses Snippets im Code ausschließen sollen. In der verbesserten Fassung habe ich das jetzt gemacht.
Allerdings ist mir eine weitere Schwäche aufgefallen, für die ich noch keine Lösung habe, deshalb poste ich die verbesserte Fassung auch noch nicht. Insoweit war die Anwendung in einem Beispiel aus dem "wahren" Leben sehr aufschlußreich.

Apropos Zeilenumbruch: Falls die Coda in einer neuen Zeile auftaucht hat man das Problem der gleichzeitigen RehearsalMaks.
Da mag Dir dieser Thread helfen.

Falls mir noch mehr einfällt laß ich es Dich wissen.


Nochmals vielen Dank,
  Harm

Dakuan

  • Gast
Re: D.C. al Coda
« Antwort #8 am: Mittwoch, 28. März 2012, 20:41 »
Hallo Harm,

Zitat
Ich habe mich noch nicht eingehend damit beschäftigen können.
Es eilt auch nicht. Ich habe ja noch genug zu üben.

Zitat
Insoweit war die Anwendung in einem Beispiel aus dem "wahren" Leben sehr aufschlußreich.
Ob dieses Beispiel jetzt wirklich repräsentativ für das wahre Leben ist, kann ich nicht sagen. Alle Beispiele die nur halbwegs ähnlich sind, sind ohne Tabulatur. Aber in meinem Buch sind, bis auf das erste Stück, alle so aufgebaut. Ich werde aber nicht alle mit Lilypond bearbeiten, da bei einigen Stücken Griffwechsel auftreten, die mit meinen kurzen Wurstfingern unmöglich sind  :(

Das Problem mit den gleichzeitigen RehearsalMarks wurde auch schon in der Doku erwähnt (allerdings ohne TAB) und ist wohl das größere Problem. In einer frühen Version meiner Datei hatte ich einfach den Text "D.C. al Coda" als Markup an die letzte Note dranngehängt und danach einen doppelten Taktstrich eingefügt. Das sieht allerdings doof aus.

Gruß
Dakuan