Dauer-Fortsetzungslinie [gelöst]

Begonnen von Benutzer3322, Montag, 2. Oktober 2017, 21:12

« vorheriges - nächstes »

Benutzer3322

Hallo zusammen,

ich bin Komponist und neuer Benutzer von Lilypond.
Ich hätte eine Frage, die ich bis jetzt keine Antwort gefunden habe; ist es möglich eine Art von Linie zu schreiben, die die Dauer von einem Ton darstellt? (siehe Anhang)

Vielen Dank im Voraus!
Beste Grüße,
Camilo


harm6

Hallo Camilo,

willkommen im Forum.

Hilft Dir mein alter Code hier schon?:
https://archiv.lilypondforum.de/index.php/topic,1717.msg9510.html#msg9510
(Eventuell mußt Du convert-ly drüber laufen lassen.)

Falls nicht, so mag er vielleicht dazu dienen genauer darzustellen was Du willst bzw nicht willst und was davon der alte Code schon leistet und was nicht.

Bitte versuche ein kleines code-Beispiel zu posten (auch ohne Linien oder mittels Grafikprogram eingefügt ...).
Mich interessiert vor allem wie es am Zeilenumbruch aussehen soll. Dein Bild ist schon hilfreich zeigt aber eben nicht die neue Zeile.

Gruß,
  Harm

Benutzer3322

Hallo Harm,

ich danke Dir für die presto Antwort! Dein alter Code wird mir in bestimmten Passagen helfen, aber manche Linien enden in Pausen.
Ich habe kleines code-Beispiel geschrieben (vielleicht könnte man es besser schreiben, aber aufgrund meines prekärem Lilypond-Wissens habe ich es so geschafft). Absichtlich habe ich es geändert damit es in einer Pause endet.
Gäbe es eine Lösung?

\version "2.19.59"

stimFlöte = \relative c' { r1^\markup \box {\bold 0'' }   r4
r1^\markup \box {\bold 5'' }   r4
r1^\markup \box {\bold 10'' }   r4 }

stimKlarinette = \relative c' { r1 }

stimPosaune = \relative c' { r1}

stimFagott = \relative c' { r1}

stimGeige = \relative c' { r1 }

stimBratsche = \relative c' { \clef alto \hide Stem e4^\markup { \teeny "IV"} \cresc
                             \hider2.\hider2.\hide r4^\markup {\teeny "8''"}
                             \hider4 \pp r4

}

stimVioloncelo = \relative c' { r1 }

stimKontrabass = \relative c' { r1 }




\header {
  title = "Test"
  composer = ""
}

\score {
    <<
      \cadenzaOn
     
  \new StaffGroup = "StaffGroup_woodwinds"
  <<
    \new Staff = "Flöte" \with { instrumentName = # "Flöte" }
    \stimFlöte
   
    \new Staff = "Klarinette" \with { instrumentName = # "Klarinette" }
    \stimKlarinette
   
    \new Staff = "Posaune" \with { instrumentName = # "Posaune" }
    \stimPosaune
   
    \new Staff = "Fagott" \with { instrumentName = # "Fagott" }
    \stimFagott
  >>
 
 
 
  \new StaffGroup = "StaffGroup_strings"
  <<
    \new Staff = "Geige" \with { instrumentName = # "Geige" }
    \stimGeige
   
    \new Staff = "Bratsche" \with { instrumentName = # "Bratsche" }
    \stimBratsche
   
    \new Staff = "Violoncelo" \with { instrumentName = # "Violoncelo" }
    \stimVioloncelo
   
    \new Staff = "Kontrabass" \with { instrumentName = # "Kontrabass" }
    \stimKontrabass
   
   
  >>

  >>
}


Beste Grüße,
Camilo

harm6

Schau mal wie weit Du mit dem Code unten kommst.
Es gibt bestimmt noch Haken und Ösen....

Gruß,
  Harm


\version "2.19.65"

%% TODO
%% same start is currently commented
%% implement options to switch on/off desired behaviour.
#(define same-gliss-start-end
  ;; All glissandi between chords should start at the same X-coordinate, same
  ;; for glissando-endings.
  (lambda (grob)
    (let* ((left-bound (ly:spanner-bound grob LEFT))
           (parent-nc (ly:grob-parent left-bound X))
           (vertical-axis-group-elts
             (ly:grob-object (ly:grob-parent grob Y) 'elements))
           ;; Filter VerticalAxisGroup-elements for Glissandi, restricted to
           ;; those starting at the NoteHeads from same NoteColumn.
           ;; Return their 'X-value for start/end
           (relevant-gliss-Xs
             (if (ly:grob-array? vertical-axis-group-elts)
                 (filter-map
                   (lambda (elt)
                     (and
                       (grob::has-interface elt 'glissando-interface)
                       (equal?
                         (ly:grob-parent (ly:spanner-bound elt LEFT) X)
                         parent-nc)
                       (cons
                         (assoc-get 'X
                                    (ly:grob-property elt 'left-bound-info))
                         (assoc-get 'X
                                    (ly:grob-property elt 'right-bound-info)))))
                   (ly:grob-array->list vertical-axis-group-elts))
                 '()))
           ;; Get the most left 'X for the final 'X-value of the end.
           ;; Get the most right 'X for the final 'X-value of the start.
           ;; Override left/right-bound-info with those values.
           (min-x-right (apply min (map cdr relevant-gliss-Xs)))
           (max-x-left (apply max (map car relevant-gliss-Xs))))
;      (ly:grob-set-nested-property! grob '(left-bound-info X) max-x-left)
      (ly:grob-set-nested-property! grob '(right-bound-info X) min-x-right))))

at =
#(define-music-function (time event music)
  (ly:duration? ly:music? ly:music?)
"Place @var{event} at a relative duration @var{time} in relation
to @var{music}."
  #{ \context Bottom << { \skip $time <>$event } $music >> #})

durLine =
#(define-music-function (mus)(ly:music?)
  (let* ((notes (extract-typed-music mus 'note-event))
         (dur (ly:music-property (last notes)'duration #f)))
    (if (ly:duration? dur)
        #{
          \at $dur
              \grace {
                \override NoteHead.stencil = #point-stencil
                \override Accidental.stencil = ##f
                \override Flag.stencil = ##f
                \override Dots.stencil = ##f
                \override Stem.stencil = ##f
                \withMusicProperty #'articulations #'()
                $mus
                \revert NoteHead.stencil
                \revert Accidental.stencil
                \revert Flag.stencil
                \revert Dots.stencil
                \revert Stem.stencil
              }
          {
            \once \override Score.GraceSpacing.spacing-increment = 0
            \once \override Glissando.breakable = ##t
            \once \override Glissando.thickness = 3
            \once \override Glissando.bound-details.right.padding = -0.4
            \once \override Glissando.bound-details.right-broken.padding = 0.5
            \once \override Glissando.bound-details.left-broken.padding = 1
            \once \override Glissando.bound-details.left.padding = 0
            \once \override Glissando.after-line-breaking =
              #same-gliss-start-end
            <>\glissando $mus
          }
        #}
        (ly:music-deep-copy mus))))
       
%% Automatic breaks are generally forbidden   
%% Manual breaks are allowed everywhere
\layout {
  \context {
    \Score
    \override NonMusicalPaperColumn.line-break-permission = ##f
  }
  \context {
    \Voice
    \remove "Forbid_line_break_engraver"
    \override NoteHead.duration-log = #2
    \override Stem.stencil = ##f
  }
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\paper {
  line-width = 80
  ragged-right = ##f
  indent = 0
}
\new Staff <<
  \relative c' {
  \cadenzaOn
    \clef alto
    \durLine
    e4*9
    r4
  }
  {
    s4^\markup { \teeny "IV"} \cresc
    s4*6
    s4^\markup {\teeny "8''"}
    s4\pp
  }
>>

\new Staff
<<
  {
  \cadenzaOn
  \durLine
  <c'' d''>1*4 r
  \durLine
  cis'' d''
  }
  {
  s1*2 \bar "" \break
  }
>>

Benutzer3322

Hallo Harm,

es hat geklappt.
Sehr vielen Dank!

Beste Grüße,
Camilo

Benutzer3322

Hallo Harm,

ich hätte noch eine Frage. Ich konnte es nicht herausfinden, warum die Oktaven, wenn man den "\durLine" Code verwendet, nicht mehr entsprechen.
D.h. wenn ich ein a oder ein a, schreibe, ist der Oktave-Sprung verdoppelt. Hättest Du eine Ahnung, warum das geschieht ?

Vielen Dank im Voraus,
Beste Brüße,
Camilo

\version "2.19.59"
\language "deutsch"
\include "durline.ly"

\relative c'' {
  \cadenzaOn
 
\hide Stem \durLine gis4*8 gis4--\glissando s2. s2. \durLine a4*8
}


\version "2.19.59"
\language "deutsch"
\include "durline.ly"

\relative c'' {
  \cadenzaOn
 
\hide Stem \durLine gis4*8 gis4--\glissando s2. s2. \durLine a,4*8
}

harm6

\durLine wurde für die Benutzung im absolute-mode entworfen und funktioniert im relative-mode nur mit work-arounds:

\relative c''
{
  \cadenzaOn
\hide Stem \durLine gis4*8 gis4--\glissando s2. s2.
\fixed a \durLine a4*8
}


Ich bin mir momentan nicht sicher, ob es möglich ist auf Basis von \durLine ein Coding zu entwerfen welches out-of-the-box für absolute und relative funktioniert.

Ich denk mal drüber nach...

Gruß,
  Harm

Benutzer3322

Hallo Harm,

ich hätte noch eine Frage hinsichtlich Deines Codes.
Ich habe den Befehl \RemoveEmptyStaves geschrieben, damit nicht alle Instrumente immer gezeigt werden. Das Problem ist das Lilypond versteht, dass eine lange \durLine Linie auch eine Art von Pause (oder Empty) ist und verbirgt das und ich hätte sehr gern, die Linie noch noch da zu haben. Hättest Du eine Idee wie ich das am besten machen könnte?

Vielen Dank noch einmal,
Beste Grüße,
Camilo


\version "2.19.59"
\language "deutsch"
\include "Durline.ly"

sekunden = {
  \stopStaff

s1^\markup \box {\bold 0'' } s4
s1^\markup \box {\bold 5'' } s4
s4^\markup \box {\bold 10'' } s1\bar "'" \break
s1^\markup \box {\bold 15'' } s4
s1^\markup \box {\bold 20'' } s4
s4^\markup \box {\bold 25'' } s1\bar "'" \break
s1^\markup \box {\bold 30'' } s4
s1^\markup \box {\bold 35'' } s4
s4^\markup \box {\bold 40'' } s1\bar "'" \break
}

stimBratsche = \relative c'  {\clef alto
  \durLine  e4*40  }


\score {
    \layout {
      indent = 2\cm
      short-indent = 0.7\cm
      \context {
        \Score
        \remove "Bar_number_engraver"}
       \context {
    \Voice
    \override TextScript.padding = #1
    \override Glissando.thickness = #4
    \override Glissando.breakable = ##t
    \override Glissando.minimum-length = #4
    \override Glissando.springs-and-rods = #ly:spanner::set-spacing-rods
  }
    \context {
      \Staff
      \RemoveEmptyStaves
           \override VerticalAxisGroup #'remove-first = ##t
           \override BarLine.stencil = ##f
           \override BarLine.allow-span-bar = ##f
    } }
   
   <<
     \new Staff = Sekunden \with {\remove "Time_signature_engraver" \hide Clef
\override VerticalAxisGroup #'remove-empty = ##f }
\sekunden 

   \new Staff = "Bratsche" \with { instrumentName = # "Viola" shortInstrumentName = #"Vla."
    \remove "Time_signature_engraver"}
    \stimBratsche
   
   >>

    }

Malte

Hab grad nicht viel Zeit, in den Code reinzuschauen, aber such mal in der Dokumentation nach ,,keepAliveInterfaces".

harm6

#9
Wie Malte schon schrieb muß das context-property keepAliveInterfaces im Score-context modifiziert werden.
Geht programmatisch aber auch manuell:


\layout {
  \context {
    \Score
    \applyContext
      #(lambda (ctx)
        (ly:context-set-property! ctx 'keepAliveInterfaces
          (cons 'glissando-interface
                (ly:context-property ctx 'keepAliveInterfaces))))
    %% or manually (for default-settings see IR)
    keepAliveInterfaces =
      #'(glissando-interface
         bass-figure-interface
         chord-name-interface
         cluster-beacon-interface
         fret-diagram-interface
         lyric-syllable-interface
         note-head-interface
         tab-note-head-interface
         lyric-interface
         percent-repeat-item-interface
         percent-repeat-interface
         stanza-number-interface)
  }
}


HTH,
  Harm

EDIT code korrigiert, es muß natürlich ly:context-set-property! heißen.

Benutzer3322

Hallo,
super. Problem erledigt.

Sehr vielen Dank noch einmal!
Beste Grüße,
Camilo

Benutzer3322

Hallo Harm,

Noch eine Frage im Bezug auf Deinen Code ist entstanden. Es ist relativ schwierig, den Code hier zu schreiben (außer wenn ich fast die ganze Partitur hier kopiere), aber ich vermute mal, dass einfach bei gucken, kannst Du vielleicht das Problem erkennen.
Alle Instrumente hören im gleichen Moment auf (wo die Pause ganz oben zeigt 8:09) und kommt die nächste Akkolade, aber einige die Linie von einigen Instrumenten gehen einfach weiter (auch wenn in dieser Akkolade nicht mehr geschieht).
\set Score.proportionalNotationDuration = #(ly:make-moment 1/8) ändert es ein bisschen, aber löste das Problem nicht.

Hättest Du eine Ahnung warum?

Vielen Dank,
Beste Grüße,
Camilo



ingmar

Off-Topic: Das Quartflageolett im Kontrabass ist schwer zu finden, und spricht dann nicht an. Vorschlag: Nimm doch einfach den 5. Teilton der D-Saite!

--ingmar

harm6

Zitateinfach bei gucken, kannst Du vielleicht das Problem erkennen.
Nein, kann ich nicht... Höchstens vermuten, daß mit den Tondauern irgendwas nicht stimmt.

Versuch doch bitte ein minimal example zu erstellen.
Was passiert denn, wenn Du nur eine Stimme kompilierst?

Gruß,
  Harm

Malte

Zitat von: ingmar am Freitag, 20. Oktober 2017, 17:35
Off-Topic: Das Quartflageolett im Kontrabass ist schwer zu finden, und spricht dann nicht an. Vorschlag: Nimm doch einfach den 5. Teilton der D-Saite!

--ingmar
Den kriegt man übrigens, indem man auf der leeren D-Saite wahlweise das kleine fis oder das kleine h greift ;)