Autor Thema: vom Strophentext das letzte Wort abschneiden?  (Gelesen 774 mal)

stefanhuglfing

  • Gast
vom Strophentext das letzte Wort abschneiden?
« am: Montag, 27. Februar 2017, 11:01 »
Ich möchte die zweite Strophe eines Liedes mit assocoatedVoice an einer anderen Melodie ausrichten.
Den Text habe ich in Variablen. assocoatedVoice muss man aber eine Silbe früher platzieren.

In meinem Beispiel habe ich deshalb den Text entsprechend gestückelt auf drei Variablen:

\version "2.19.54"

Melodie =
 \relative
  { g' e e2     f4
     << { \voiceOne d4 } \new Voice = "Zusatz" { \voiceTwo b8. \noBeam c16 }  >>
    d2
  }
 
Anfang   = \lyricmode { Häns -- chen klein }
Einschub = \lyricmode { ging ganz }
Ende     = \lyricmode { al -- lein }

\score
 {
  \new Staff
   <<
    \new Voice = "Stimme" { \Melodie } 
    \new Lyrics \lyricsto "Stimme" { \Anfang "ging"  \Ende }
    \new Lyrics \lyricsto "Stimme" { \Anfang \set associatedVoice = "Zusatz" \Einschub
                                             \set associatedVoice = "Stimme" \Ende }
   >>       
 }

Schöner würde ich finden, wenn die Variablen wären:
Anfang   = \lyricmode { Häns -- chen klein ging al --  }
Einschub = \lyricmode { ganz al -- }
Ende     = \lyricmode { lein }

dann müsste ich von der zweiten und dritten Variable jeweils hinten ein Wort abschneiden und an die erste und zweite Variable anhängen.
Strings verbinden geht mit #(string-append ...), aber ob es innerhalb von \lyricmode{...} geht?
Und ein Wort abschneiden erscheint mir noch schwieriger.

harm6

  • Gast
Re: vom Strophentext das letzte Wort abschneiden?
« Antwort #1 am: Dienstag, 28. Februar 2017, 14:09 »
Zitat
Schöner würde ich finden, wenn die Variablen wären:

Anfang   = \lyricmode { Häns -- chen klein ging al --  }
Einschub = \lyricmode { ganz al -- }
Ende     = \lyricmode { lein }

dann müsste ich von der zweiten und dritten Variable jeweils hinten ein Wort abschneiden und an die erste und zweite Variable anhängen.

Bist Du Dir sicher, daß diese Beschreibung richtig ist?

Ich hab' jetzt eine Funktion geschrieben die associatedVoice einfügt und optional den letzten Eintrag in den lyrics rausnimmt.
Falls dieser letzte Eintrag keine Silbe ist, sondern etwas anderes z.B. ein override, wird es natürlich nicht funktionieren...

Auch habe ich so meine Zweifel, daß dieser Weg wirklich komfortabler ist. Aber hier der Code:

\version "2.19.54"

Melodie = \relative {
  g' e e2 f4
  <<
    { \voiceOne d4 }
    \new Voice = "Zusatz" { \voiceTwo b8. \noBeam c16 } 
  >>
  d2
  \break
  c4 d
}

Anfang = \lyricmode { Häns -- chen klein ging al -- }

Einschub = \lyricmode { ganz al -- }

Ende = \lyricmode { lein in die }


insert =
#(define-music-function (cut? strg m)((boolean? #f) string? ly:music?)
"Inserts @code{associatedVoice}, set to @var{strg}.
If the optional boolean @var{cut?} is set @code{#t} the last item of the
elements-property of @var{m} is dropped."
  (if (music-is-of-type? m 'sequential-music)
      (ly:music-set-property! m 'elements
        (append
          (drop-right (ly:music-property m 'elements) 1)
          (cons
            #{ \set associatedVoice = $strg #}
            (if (not cut?)
                (last-pair (ly:music-property m 'elements))
                '())))))
  m)

\score {
  \new Staff
   <<
    \new Voice = "Stimme" { \Melodie }
    \new Lyrics \lyricsto "Stimme" { \Anfang \Ende }
    \new Lyrics \lyricsto "Stimme" {
      \insert ##t "Zusatz"
      \Anfang
      \insert "Stimme"
      \Einschub
      \Ende
    }
   >> 
}

Gruß,
  Harm

stefanhuglfing

  • Gast
Re: vom Strophentext das letzte Wort abschneiden?
« Antwort #2 am: Donnerstag, 2. März 2017, 15:54 »
Hallo Harm,

Bist Du Dir sicher, daß diese Beschreibung richtig ist?

Nein, das habe ich verkehrt rum geschrieben. Und es ist doch komplizierter, als ich dachte.

Deine Funktion macht viel mehr, als ich mir vorgestellt habe. sie verbindet die entsprechenden Stellen mit den richtigen Stimmen.

Ich wollte eine Funktion, die nur die Texte bearbeitet, damit ich sie anschließend den Stimmen zuordnen kann.

Ich habe es selbst probiert, bekomme aber nur Fehlermeldungen.

Verwendet man dafür (also nur für die Veränderung von Strings)
#(define-music-function ....
oder
#(define-scheme-function ...
?