Autor Thema: Wiederholungen mit Endzeichen an beiden klammern  (Gelesen 3115 mal)

passdies

  • Member
Wiederholungen mit Endzeichen an beiden klammern
« am: Freitag, 30. August 2013, 09:27 »
Hallo,

ich habe ein lied mit der struktur  intro - verse - bridge - refrain , was insgesamt vier mal wiederholt wird, wobei beim ersten durchgang der refrain wegfällt. d.h. ich brauche zwei klammern, in der ersten steht "1." und ein wiederholungendszeichen nach z.b. 2 Takten, und in der zweiten steht "2. - 4." mit einem wiederholungendszeichen nach z.b. 10 Takten (refrain sei 8 takte lang). ich habe weder in lernbuch, handbuch, online doku noch google was passendes gefunden, aber vielleicht habe ich ja die falschen fragen gestellt.

mfg

harm6

  • Member
Re: Wiederholungen mit Endzeichen an beiden klammern
« Antwort #1 am: Freitag, 30. August 2013, 12:23 »
Hallo passdies,

herzlich willkommen im Forum.

Vorab:
Bitte poste immer ein kurzes, kompilierbares Beispiel mit Angabe von \version "...".
Wenn Du kein Code-Beispiel geben kannst (eben weil Du nicht weißt, wie), gib einen dummy-code, d.h. einen kompilierbaren Code, in den man direkt einfügen kann, was fehlt. Das sollte eigentlich immer gehen.
In seltenen Fällen mag auch das nicht gehen, aber dann poste ein Bild oder einen link zu einem Bild, der zeigt was Du möchtest.
Eine literarische Umschreibung ist die absolut schlechteste Wahl ein Problem darzustellen.
(Ich tendiere dazu, Beiträge ohne Code-Beispiel zurückzustellen, wenn nicht komplett zu ignorieren.)
Siehe auch: http://lilypond.org/website/tiny-examples.de.html


Zum Thema:
Die Lösung findet sich in der Notation Reference 1.4.1 Lange Wiederholungen
http://lilypond.org/doc/v2.16/Documentation/notation/long-repeats.de.html#manual-repeat-marks

Ein Beispiel (mit Anmerkungen) unten. Es ist mir tatsächlich nicht klar, wo Du was haben möchtest. Aber das Beispiel zeigt zumindest wie man die VoltaBrackets setzt.
\version "2.16.2"

% (volta strg): Start a VoltaBracket, with text @var{strg}
% (volta #f)  : End a VoltaBracket
% end-repeat  : Draw a closing repeat-sign

startRepeat = \set Score.repeatCommands = #'((volta "1."))
Repeat = \set Score.repeatCommands = #'((volta #f) (volta "2. - 4.") end-repeat)
endRepeat = \set Score.repeatCommands = #'((volta #f))

m = \relative c'' {
\repeat unfold 8 { c1 }
\break
\startRepeat
\repeat unfold 8 { d1 }
\Repeat
\break
\repeat unfold 8 { e1 }
\break
\endRepeat
\repeat unfold 8 { f1 }
}

annotations = {
s1*8^"Intro"
s1*8^"Verse"
s1*8^"Bridge"
s1*8^"Refrain"
}

\new Staff << \m \annotations >>

Gruß,
  Harm

passdies

  • Member
Re: Wiederholungen mit Endzeichen an beiden klammern
« Antwort #2 am: Samstag, 31. August 2013, 13:25 »
hallo Harm,

nochmal vielen Dank für die tolle unterstützung, nach einer halben stunde über ein kurzes beispiel nachdenken habe ich aufgegeben und prosa geschrieben. aber jetzt geht's präziser weiter.
 
wie man hoffentlich sieht, möchte ich die struktur des stückes mit annotations gerne aus den voice kontexten rausziehen. das klappt auch wunderbar, es hat aber noch ein paar nebenwirkungen. wenn ich \structure im \staff kontext referenziere, tauchen die annotations in der partitur über jeder stimme auf. wenn ich \structure in \score referenziere, was eigentlich zu präferieren wäre, erzeugt mir lilypond einen neuen \staff. gibt's irgendeinen trick, die automatische erzeugung des \structure staffs im \score context zu verhindern?

beide versionen können durch aus/einkommentieren reproduziert werden. eine unschöne möglichkeit sehe ich darin, unterschiedliche \staff 's für die partitur und die einzelstimmen zu erzeugen. oder mit makros. wie würde das dann aussehen? 

cheers

passdies

\version "2.16.2"

startRepeat = \set Score.repeatCommands = #'(start-repeat)
startVolta = \set Score.repeatCommands = #'((volta "1."))
midRepeat = \set Score.repeatCommands = #'((volta #f) (volta "2. - 4.") end-repeat)
endVolta = \set Score.repeatCommands = #'((volta #f))
endRepeat = \set Score.repeatCommands = #'(end-repeat)

KeyTimeTempo = {  \key g \major
  \time 4/4
  \tempo 4=120
}

structure = {
  s1*8^"intro"
  \startRepeat
  s1*8^"verse"
  s1*6^"bridge"
  \startVolta
  s1*2
  \midRepeat
  s1*2
  \endVolta
  s1*8^"refrain"
  \endRepeat
  s1*8^"fading"
  \bar "|."                 
}             

melody = \relative c' { \KeyTimeTempo
R1*8 %intro

        r4 c4 r2
      R1*7 %verse

        r4 d4 r2
        R1*9 %bridge

        r4 e4 r2
        R1*7 %refrain

        r4 f4 r2
        R1*7
}

accompI = \relative c'' { \KeyTimeTempo
R1*8 %intro

        r4 c4 r2
      R1*7 %verse

        r4 d4 r2
        R1*9 %bridge

        r4 e4 r2
        R1*7 %refrain

        r4 f4 r2
        R1*7
}

melodyPart = \new Staff \with {
  instrumentName = "LeadVocals"
} <<
%  \structure
  \new Voice = "melody" { \melody }
>>

accompIPart = \new Staff \with {
  instrumentName = "AccVocals"
} <<
%  \structure
  \new Voice = "acompI" { \accompI }
>>

\paper {
  print-all-headers = ##t
  ragged-bottom = ##t
  ragged-last-bottom = ##t
}

\header {
  title = "Combo Template"
  meter = "medium shuffle"
  arranger = "passdies"
}

% partitur
\score { <<
%    \compressFullBarRests
   \structure
    \melodyPart
    \accompIPart
  >>
}
\pageBreak

% melody einzelstimme
\score { <<
   \structure
    \melodyPart
  >>
}
\pageBreak

% accompi einzelstimme
\score { <<
   \structure
    \accompIPart
  >>
}




harm6

  • Member
Re: Wiederholungen mit Endzeichen an beiden klammern
« Antwort #3 am: Samstag, 31. August 2013, 15:11 »
Hallo,

um "annotations" immer über dem obersten Staff zu haben, benutze \mark nicht \markup (^"xy" ist eine Kurzschreibweise für ^\markup "xy".
Also RehearsalMark nicht TextScript

Mir kam dann die Idee man könne ja einen geeigneten Context benutzen, um diese Anmerkungen aufzunehmen (da Du das ja gerne aus der Stimme raushaben möchtest): MarkLine
Woher ich die Definition für MarkLine habe weiß ich im Moment nicht mehr.

Darüberhinaus habe ich ein \book gemacht. Mit dem Vorteil, daß der Seitenumbruch automatisch am Ende eines \bookpart erfolgt.
Durch geeignete Setzungen ist es auch möglich das Titelproblem aus dem anderen Thread zu lösen.
Ich werde mich aber noch mal damt beschäftigen (ohne \book) und eventuell dann dort etwas dazu schreiben, allerdings frühestens heute abend.

Schau mal, ob Dir das Ganze zusagt.
Falls etwas unklar ist, melde Dich.

\version "2.16.2"

%%%%%%%%%%%%%%%%%%%
% MarkLine-context
%%%%%%%%%%%%%%%%%%%

%% Also possible: putting MetronomeMark into MarkLine.
%% For now commented.
myLayout = \layout {
 \context {
   \name "MarkLine"
   \type "Engraver_group"
   \consists Output_property_engraver
   \consists Axis_group_engraver
   \consists Mark_engraver
%   \consists Metronome_mark_engraver
   \override RehearsalMark #'extra-spacing-width = #'(0 . 0)
   \override RehearsalMark #'self-alignment-X = #LEFT
%   \override MetronomeMark #'extra-spacing-width = #'(0 . 0)
   \override RehearsalMark #'Y-offset = #0
%   \override MetronomeMark #'Y-offset = #0
   \override VerticalAxisGroup #'minimum-Y-extent = #'(-2 . 2 )
   \override VerticalAxisGroup #'staff-staff-spacing =
      #'((basic-distance . 1)
         (minimum-distance . 1)
         (padding . 1)
         (stretchability . 3))
 }
 \context {
   \Score
%   \override MultiMeasureRest #'expand-limit = #1
   \remove Mark_engraver
%   \remove Metronome_mark_engraver
   \accepts MarkLine
 }
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% predefined repeatCommands
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

startRepeat = \set Score.repeatCommands = #'(start-repeat)
startVolta = \set Score.repeatCommands = #'((volta "1."))
midRepeat = \set Score.repeatCommands = #'((volta #f) (volta "2. - 4.") end-repeat)
endVolta = \set Score.repeatCommands = #'((volta #f))
endRepeat = \set Score.repeatCommands = #'(end-repeat)

%%%%%%%%
% music
%%%%%%%%

keyTimeTempo = {  \key g \major
  \time 4/4
  \tempo 4=120
}

annotations = {
  \mark "intro"
  s1*8
  \startRepeat
  \mark "verse"
  s1*8
  \mark "bridge"
  s1*6
  \startVolta
  s1*2
  \midRepeat
  s1*2
  \endVolta
  \mark "refrain"
  s1*8
  \endRepeat
  \mark "fading"
  s1*8
  \bar "|."                 
}             

melody = \relative c' {
\keyTimeTempo
R1*8 %intro

        r4 c4 r2
      R1*7 %verse

        r4 d4 r2
        R1*9 %bridge

        r4 e4 r2
        R1*7 %refrain

        r4 f4 r2
        R1*7
}

accomp-I = \relative c'' {
\keyTimeTempo
R1*8 %intro

        r4 c4 r2
      R1*7 %verse

        r4 d4 r2
        R1*9 %bridge

        r4 e4 r2
        R1*7 %refrain

        r4 f4 r2
        R1*7
}

%%%%%%%%%
% Staffs
%%%%%%%%%

structure =
\new MarkLine \annotations

melodyPart = \new Staff \with {
  instrumentName = "LeadVocals"
} <<
  \new Voice = "melody" { \melody }
  >>

accompIPart = \new Staff \with {
  instrumentName = "AccVocals"
} <<
  \new Voice = "acompI" { \accomp-I }
  >>
 
%%%%%%%%%
% Scores
%%%%%%%%%

score-one = {
  \new Score {
     <<
       \structure
       \melodyPart
       \accompIPart
     >>
  }
}

score-two = {
  \new Score {
     <<
       \structure
       \melodyPart
     >>
  }
}

score-three = {
  \new Score {
     <<
       \structure
       \accompIPart
     >>
  }
}

%%%%%%%%%
% book
%%%%%%%%%

%% book-paper
\paper {
  bookTitleMarkup = ##f
  print-all-headers = ##t
  ragged-bottom = ##t
  ragged-last-bottom = ##t
}

%% book-header
\header {
  title = "Combo Template"
  meter = "medium shuffle"
  arranger = "passdies"
}

%% book-layout
%% calls @code{myLayout} containing the MarkLine-context
\layout { \myLayout }

\book {
  % partitur
  \bookpart { \score { \score-one } }
 
  % melody einzelstimme
  \bookpart { \score { \score-two } }
 
  % accompi einzelstimme
  \bookpart { \score { \score-three } }
}


HTH,
  Harm


EDIT:  c/p-error im code korrigiert.
« Letzte Änderung: Samstag, 31. August 2013, 16:19 von harm6 »

passdies

  • Member
Re: Wiederholungen mit Endzeichen an beiden klammern
« Antwort #4 am: Samstag, 31. August 2013, 19:40 »
Hallo Harm,

das ist schon ziemlich genau das,was ich bräuchte. wenn ich jetzt den \markline block, die repeat makros und die instrumenten makros in ein .include verpacke, habe ich ein perfektes template für praktisch alle anwendungen.

verstanden habe ich natürlich nur einen bruchteil. Du hast eine context definition erzeugt, die nur einen bruchteil dessen an output erzeugt, was ein normaler staff ausgeben würde.

mit dem metronomemark in der markline hast Du mir natürlich einen floh ins ohr gesetzt. simples einklammern hat nicht geholfen, da wars weg. über den instrumentennamen wäre nämlich perfekt platz dafür.

ach ja, noch eine kleinigkeit. wie kann ich z.b. das \startVolta Makro so umschreiben, daß ich den text ("1.") als übergabeparameter angeben kann? ich habe sowas schon mal in der doku gefunden, finde es aber jetzt nicht mehr.

vielen, vielen dank und cheers

passdies

harm6

  • Member
Re: Wiederholungen mit Endzeichen an beiden klammern
« Antwort #5 am: Samstag, 31. August 2013, 23:41 »
Hallo,

Zitat
mit dem metronomemark in der markline hast Du mir natürlich einen floh ins ohr gesetzt. simples einklammern hat nicht geholfen, da wars weg. über den instrumentennamen wäre nämlich perfekt platz dafür.

Hier weiß ich nicht was Du meinst.

Auf jeden Fall ist die MetronomeMark nicht so einfach versetzbar. Man kann natürlich über 'extra-offset gehen oder vielleicht 'X-offset o.ä.. Das habe ich aber nicht getestet.
Ich habe die Setzungen für die MetronomeMark jatzt mal in den MarkLine-context reingenommen. Persönlich finde ich, daß es gut aussieht und ich würde es dabei belassen.

Zitat
ach ja, noch eine kleinigkeit. wie kann ich z.b. das \startVolta Makro so umschreiben, daß ich den text ("1.") als übergabeparameter angeben kann?

Das Problem ist, daß 'repeatCommands' ein context-property ist, welches eine Liste als Argument braucht. Diese Liste ist jedoch von ungewisser Länge, sie kann Prädikate vom Typ symbol? enthalten und/oder weitere Listen.

Ich perönlich finde wiederum, daß das Vordefinieren wie in meinem letzten post die beste Möglichkeit ist.
Tatsächlich ist es aber durchaus möglich eine Funktion zu schreiben die eine solche Liste erstellt.

Das habe ich unten mit setRepeatCommands mal gemacht.
Sie benötigt die Variablen/Argumente:
(end-volta? boolean?) um ein volta-Ende anzuzeigen
(start-end pair?) um ein öffnendes/schließendes Wiederholungszeichen anzugeben
(text scheme?) um den zu druckenden Text anzuzeigen.
Immer wenn man etwas nicht haben will, sollte man #f angeben.

Alledings habe ich Schwierigkeiten mir zu merken was was ist vor lauter ##f #'(#f . #t) #'(#f . #f) #'(#t . #f) #'(#t . #t)
Falls Du verstehst was ich meine  ;)

Nichtsdestotrotz hier Dein Beispiel:

\version "2.16.2"

%%%%%%%%%%%%%%%%%%%
% MarkLine-context
%%%%%%%%%%%%%%%%%%%

%% Also possible: putting MetronomeMark into MarkLine.
%% For now commented.
myLayout = \layout {
 \context {
   \name "MarkLine"
   \type "Engraver_group"
   \consists Output_property_engraver
   \consists Axis_group_engraver
   \consists Mark_engraver
   \consists Metronome_mark_engraver
   \override RehearsalMark #'extra-spacing-width = #'(0 . 0)
   \override RehearsalMark #'self-alignment-X = #LEFT
   \override MetronomeMark #'extra-spacing-width = #'(0 . 0)
   \override RehearsalMark #'Y-offset = #0
   \override MetronomeMark #'Y-offset = #0
   \override VerticalAxisGroup #'minimum-Y-extent = #'(-2 . 2 )
   \override VerticalAxisGroup #'staff-staff-spacing =
      #'((basic-distance . 1)
         (minimum-distance . 1)
         (padding . 1)
         (stretchability . 3))
 }
 \context {
   \Score
   \override MultiMeasureRest #'expand-limit = #1
   \override MetronomeMark #'break-align-symbols = #'(clef)
   \override BarNumber #'break-align-symbols = #'(clef)
   \remove Mark_engraver
   \remove Metronome_mark_engraver
   \accepts MarkLine
 }
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% predefined repeatCommands
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

setRepeatCommands =
#(define-music-function (parser location end-volta? start-end text)
  (boolean? pair? scheme?)
(let* ((txt (if (markup? text)
                (list 'volta text)
                '()))
       (end-volta (if end-volta?
                      (list 'volta #f)
                      '()))
       (start? (if (car start-end) 'start-repeat '()))
       (end? (if (cdr start-end) 'end-repeat '()))
       (new-settings (list end-volta start? txt end?)))
#{
\set Score.repeatCommands = #new-settings
#}))

startRepeat =
\setRepeatCommands ##f #'(#t . #f) ##f

startVolta =
\setRepeatCommands ##f #'(#f . #f) "1."

midRepeat =
\setRepeatCommands ##t #'(#f . #t) \markup { \with-color #red "2. - 6." }


endVolta =
\setRepeatCommands ##t #'(#f . #f) ##f

endRepeat =
\setRepeatCommands ##f #'(#f . #t) ##f

%%%%%%%%
% music
%%%%%%%%

keyTimeTempo = {  \key g \major
  \time 4/4
}

annotations = {
  \tempo 4=120
  \mark "intro"
  s1*8
  \startRepeat
  \mark "verse"
  s1*8
  \mark "bridge"
  s1*6
  \startVolta
  s1*2

 
  \midRepeat
  s1*2
  \endVolta
  \mark "refrain"
  s1*8
  \endRepeat
  \mark "fading"
  s1*8
  \bar "|."                 
}             

melody = \relative c' {
\keyTimeTempo
R1*8 %intro

        r4 c4 r2
      R1*7 %verse

        r4 d4 r2
        R1*9 %bridge

        r4 e4 r2
        R1*7 %refrain

        r4 f4 r2
        R1*7
}

accomp-I = \relative c'' {
\keyTimeTempo
R1*8 %intro

        r4 c4 r2
      R1*7 %verse

        r4 d4 r2
        R1*9 %bridge

        r4 e4 r2
        R1*7 %refrain

        r4 f4 r2
        R1*7
}

%%%%%%%%%
% Staffs
%%%%%%%%%

structure =
\new MarkLine \annotations

melodyPart = \new Staff \with {
  instrumentName = "LeadVocals"
} <<
  \new Voice = "melody" { \melody }
  >>

accompIPart = \new Staff \with {
  instrumentName = "AccVocals"
} <<
  \new Voice = "acompI" { \accomp-I }
  >>
 
%%%%%%%%%
% Scores
%%%%%%%%%

score-one = {
  \new Score {
     <<
       \structure
       \melodyPart
       \accompIPart
     >>
  }
}

score-two = {
  \new Score {
     <<
       \structure
       \melodyPart
     >>
  }
}

score-three = {
  \new Score {
     <<
       \structure
       \accompIPart
     >>
  }
}

%%%%%%%%%
% book
%%%%%%%%%

%% book-paper
\paper {
  bookTitleMarkup = ##f
  print-all-headers = ##t
  ragged-bottom = ##t
  ragged-last-bottom = ##t
}

%% book-header
\header {
  title = "Combo Template"
  meter = "medium shuffle"
  arranger = "passdies"
}

%% book-layout
%% calls @code{myLayout} containing the MarkLine-context
\layout { \myLayout }

\book {
  % partitur
  \bookpart { \score { \score-one } }
 
  % melody einzelstimme
  \bookpart { \score { \score-two } }
 
  % accompi einzelstimme
  \bookpart { \score { \score-three } }
}

Gruß,
  Harm

passdies

  • Member
Re: Wiederholungen mit Endzeichen an beiden klammern
« Antwort #6 am: Sonntag, 1. September 2013, 13:09 »
Hallo Harm

das MetronomeMark ist perfekt. ich hatte es auch mal probiert, habe aber übersehen, daß ich es im annotation part angeben muss, wenn es aus dem normalen \score context rausgenommen wird.

bei dem volta makro dachte ich eigentlich an eine viel einfachere lösung. ich brauche die parameterübergabe ja eigentlich nur für startVolta, weil alle anderen funktionen (endVolta, startRepeat und endRepeat) ja gar keine parameter brauchen. deswegen habe ich da die normalen makros wieder reingeschrieben.

daß ich statt midrepeat mal \endVolta \endRepeat \startVolta "xxx" hinschreiben muß, stört mich nicht, im gegenteil, das ist viel vielseitiger. das war unüberlegt von mir, daß ich das als eine funktion angegeben hatte (war aus der online doku kopiert), sorry.

ich habe die annotations mal wie gewünscht geändert. die function "startVolta" habe ich mal in den code auskommentiert reingeschrieben. sie funktioniert natürlich nicht, und Du weißt auch sicher, warum. liegt vielleicht daran, daß der parser den #input in einem string nicht erkennt? aber ich bekomme schon in der ersten zeile eine fehlermeldung...

\version "2.16.2"

%%%%%%%%%%%%%%%%%%%
% MarkLine-context
%%%%%%%%%%%%%%%%%%%

%% Also possible: putting MetronomeMark into MarkLine.
%% For now commented.
myLayout = \layout {
 \context {
   \name "MarkLine"
   \type "Engraver_group"
   \consists Output_property_engraver
   \consists Axis_group_engraver
   \consists Mark_engraver
   \consists Metronome_mark_engraver
   \override RehearsalMark #'extra-spacing-width = #'(0 . 0)
   \override RehearsalMark #'self-alignment-X = #LEFT
   \override MetronomeMark #'extra-spacing-width = #'(0 . 0)
   \override RehearsalMark #'Y-offset = #0
   \override MetronomeMark #'Y-offset = #0
   \override VerticalAxisGroup #'minimum-Y-extent = #'(-2 . 2 )
   \override VerticalAxisGroup #'staff-staff-spacing =
      #'((basic-distance . 1)
         (minimum-distance . 1)
         (padding . 1)
         (stretchability . 3))
 }
 \context {
   \Score
   \override MultiMeasureRest #'expand-limit = #1
   \override MetronomeMark #'break-align-symbols = #'(clef)
   \override BarNumber #'break-align-symbols = #'(clef)
   \remove Mark_engraver
   \remove Metronome_mark_engraver
   \accepts MarkLine
 }
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% predefined repeatCommands
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

setRepeatCommands =
#(define-music-function (parser location end-volta? start-end text)
  (boolean? pair? scheme?)
(let* ((txt (if (markup? text)
                (list 'volta text)
                '()))
       (end-volta (if end-volta?
                      (list 'volta #f)
                      '()))
       (start? (if (car start-end) 'start-repeat '()))
       (end? (if (cdr start-end) 'end-repeat '()))
       (new-settings (list end-volta start? txt end?)))
#{
\set Score.repeatCommands = #new-settings
#}))

%{
startRepeat =
\setRepeatCommands ##f #'(#t . #f) ##f

midRepeat =
\setRepeatCommands ##t #'(#f . #t) \markup { \with-color #red "2. - 6." }


endVolta =
\setRepeatCommands ##t #'(#f . #f) ##f

endRepeat =
\setRepeatCommands ##f #'(#f . #t) ##f
%}

startVoltaA =
\setRepeatCommands ##f #'(#f . #f) "1."

startVoltaB =
\setRepeatCommands ##f #'(#f . #f) "2.-4."

endVolta = \set Score.repeatCommands = #'((volta #f))
startRepeat = \set Score.repeatCommands = #'(start-repeat)
endRepeat = \set Score.repeatCommands = #'(end-repeat)

%{
startVolta = #(define-music-function
  (parser location input )
  (string?)
#{
  \set Score.repeatCommands = #'((volta #input ))
#}
)
%}


%%%%%%%%
% music
%%%%%%%%

keyTimeTempo = {  \key g \major
  \time 4/4
}

annotations = {
  \tempo 4=120
  \mark "intro"
  s1*8
  \startRepeat
  \mark "verse"
  s1*8
  \mark "bridge"
  s1*6
  \startVoltaA   % da hätte ich jetzt gerne startVolta "1."
  s1*2 
  \endVolta
  \endRepeat
  \startVoltaB   % da hätte ich jetzt gerne startVolta "2.-4."
  s1*2
  \endVolta
  \mark "refrain"
  s1*8
  \endRepeat
  \mark "fading"
  s1*8
  \bar "|."                 
}             

melody = \relative c' {
\keyTimeTempo
R1*8 %intro

        r4 c4 r2
      R1*7 %verse

        r4 d4 r2
        R1*9 %bridge

        r4 e4 r2
        R1*7 %refrain

        r4 f4 r2
        R1*7
}

accomp-I = \relative c'' {
\keyTimeTempo
R1*8 %intro

        r4 c4 r2
      R1*7 %verse

        r4 d4 r2
        R1*9 %bridge

        r4 e4 r2
        R1*7 %refrain

        r4 f4 r2
        R1*7
}

%%%%%%%%%
% Staffs
%%%%%%%%%

structure =
\new MarkLine \annotations

melodyPart = \new Staff \with {
  instrumentName = "LeadVocals"
} <<
  \new Voice = "melody" { \melody }
  >>

accompIPart = \new Staff \with {
  instrumentName = "AccVocals"
} <<
  \new Voice = "acompI" { \accomp-I }
  >>
 
%%%%%%%%%
% Scores
%%%%%%%%%

score-one = {
  \new Score {
     <<
       \structure
       \melodyPart
       \accompIPart
     >>
  }
}

score-two = {
  \new Score {
     <<
       \structure
       \melodyPart
     >>
  }
}

score-three = {
  \new Score {
     <<
       \structure
       \accompIPart
     >>
  }
}

%%%%%%%%%
% book
%%%%%%%%%

%% book-paper
\paper {
  bookTitleMarkup = ##f
  print-all-headers = ##t
  ragged-bottom = ##t
  ragged-last-bottom = ##t
}

%% book-header
\header {
  title = "Combo Template"
  meter = "medium shuffle"
  arranger = "passdies"
}

%% book-layout
%% calls @code{myLayout} containing the MarkLine-context
\layout { \myLayout }

\book {
  % partitur
  \bookpart { \score { \score-one } }
 
  % melody einzelstimme
  \bookpart { \score { \score-two } }
 
  % accompi einzelstimme
  \bookpart { \score { \score-three } }
}


vielen Dank und cheers

passdies

harm6

  • Member
Re: Wiederholungen mit Endzeichen an beiden klammern
« Antwort #7 am: Sonntag, 1. September 2013, 14:59 »
Hallo,

Zitat
die function "startVolta" habe ich mal in den code auskommentiert reingeschrieben. sie funktioniert natürlich nicht, und Du weißt auch sicher, warum. liegt vielleicht daran, daß der parser den #input in einem string nicht erkennt? aber ich bekomme schon in der ersten zeile eine fehlermeldung...

Es hat eigentlich nichts mit dem parser zu tun, sodern es handelt sich um scheme-Probleme.

Im einzelnen:

Die Fehlermeldung fängt an mit (den springenden Punkt habe ich eingefärbt):

Zitat
GNU LilyPond 2.16.2
»atest-22.ly« wird verarbeitet
Analysieren...
atest-22.ly:2933:1: Fehler: GUILE signalisierte einen Fehler für den hier beginnenden Ausdruck
#
 (define-music-function (parser location input)
atest-22.ly:2944:47: unknown # object

In LilyPond-Syntax kann man "#" benutzen um Variablen in music-functions aufzurufen.
Mit der Zeile
\set Score.repeatCommands = #'((volta #input ))
bist Du ab # aber in scheme.
Dort hat "#" aber besondere Bedeutungen.
1. Empfehlung "#" löschen!

Nächstes Problem:
Du wirst merken, daß das immer noch nicht den gewünschten Erfolg zeitigt.
Wieder ein scheme-Problem:
Das Argument von \set Score.repeatCommands ist eine Liste.
Diese Liste wird durch das '-Zeichen angezeigt.
Allerdings führt das das dazu das alles "wörtlich" genommen wird, d.h. der Wert für "volta" ist ein "symbol", vereinfacht gesagt ein Wort mit fünf Buchstaben.

Zitat
guile> (define input "x")
guile> '((volta input))
((volta input))
guile>

Du willst aber kein Wort haben sondern einen Wert aufrufen.
Dazu muß man
1. der Liste ermöglichen das zu tun und
2. den Wert für input evaluieren.

Die Kurzschreibweise für 1. ist: ` im Unterschied zu '
In groß: ` im Unterschied zu '
Also `((volta input))
input muß jetzt noch evaluiert werden mit dem ,-Zeichen (auch das ist eine Kurzschreibweise)
D.h.: `((volta ,input)):

Zitat
guile> (define input "x")
guile> `((volta ,input))
((volta "x"))
guile>

(Eine scheme-sandbox kann man mit
  lilypond scheme-sandbox
im Terminal aufrufen.
Ob das mit jedem Betriebssystem geht weiß ich allerdings nicht.
Ich selber, auf LINUX, benutze guile direkt und nicht über den Umweg via LilyPond)


Die Funktion arbeitet jetzt wie gewünscht.

Ich habe noch die type-Abfrage für input auf das allgemeinere markup? geändert. Das hat den Vorteil, daß man input besser formatieren kann, fallls gewünscht.

Darüberhinaus sind die vielfältigen Möglichkeiten sich Werte und Ausdrücke im Terminal zeigen zu lassen unermeßlich wertvolle Werkzeuge. Einige Beispiel dafür im Code. Nur zu Demonstration, solltest Du wieder löschen.
Anmerkung: \void ... führt dazu, daß kein print-output erzeugt wird, sondern nur eine Terminal-Ausgabe.

\version "2.16.2"

startRepeat = \set Score.repeatCommands = #'(start-repeat)
endVolta = \set Score.repeatCommands = #'((volta #f))

startVolta =
#(define-music-function (parser location input)
  (markup?)
 
  ;; delete me start
  (let ((ls '((volta input))))
    (display "\n\t\tls\t\t\t")(display ls)
    (display "\n\t\t(cadar ls)\t\t")(display (cadar ls))
    (display "\n\t\t(symbol? (cadar ls))\t")(write (symbol? (cadar ls)))
    (newline))
  ;; delete me end
 
#{
  \set Score.repeatCommands = #`((volta ,input))
#})

\void \displayLilyMusic \startVolta "1."

\relative c' {

a1
\startRepeat
b
        \startVolta \markup \fontsize #6 "1."
c
\endVolta
d
}

Noch eine Sache:
Reihungen wie:
  \endVolta
  \endRepeat
werden nicht funktionieren, da die jeweils spätere die frühere Setzungen überschreibt. Sie addieren sich nicht!


HTH,
  Harm

« Letzte Änderung: Sonntag, 1. September 2013, 15:02 von harm6 »

passdies

  • Member
Re: Wiederholungen mit Endzeichen an beiden klammern
« Antwort #8 am: Sonntag, 1. September 2013, 18:31 »
hallo Harm,

sehr viel sehr guter unterricht, der nebel lichtet sich (leicht!) da muss ich mich erst mal durchwursteln. aber ich sehe eine gewisse chance, es hinzukriegen (die midfunktion mit der liste, wegen der nicht funktionierenden Reihungen).

jetzt habe ich mein erstes book mal umgestellt, macht wirklich richtig laune. außer ein paar sektionen wie

 
melodyPart = \new Staff \with {
  instrumentName = "LeadVocals"
} <<
  \new Voice = "melody" { \melody }
  \new Lyrics \lyricsto "melody" \verseOne
  \new Lyrics \lyricsto "melody" \verseTwo
  \new Lyrics \lyricsto "melody" \verseFour
>>


(kopplungen von musik und lyrik) steht jetzt in meinem primären quellfile nur noch musik und text drin. alle normalen instrumente habe ich in ein include ausgelagert, was für alle projekte gleich ist. wie sieht eine funktion aus, die mir einen solchen block in abhängigkeit von der anzahl der verse generiert, also deren aufruf etwa so erfolgt (pseudocodemässig):

createMusicTextPart ( "melody", verseOne, verseTwo, verseFour)?

das gehört jetzt zwar wahrscheinlich nicht hierher, ich habe auch schon mal ein paar begriffe wie variable argument liste in allen permutationen in die suche geworfen, war aber maximal unerfolgreich. kannst Du mir da noch auf die sprünge helfen?

cheers

passdies


harm6

  • Member
Re: Wiederholungen mit Endzeichen an beiden klammern
« Antwort #9 am: Sonntag, 1. September 2013, 23:24 »
Zitat
ich sehe eine gewisse chance, es hinzukriegen (die midfunktion mit der liste, wegen der nicht funktionierenden Reihungen).

Ich eher nicht, deshalb bin ich das Problem mal von anderer Seite angegangen.
Sich aufaddierende Reihungen sind mit der neuen Funktion jetzt möglich. Allerdings ist sie nur minimal getestet.
Das mußt Du übernehmen. ;)
Falls es irgendwo hakt, melde Dich.

\version "2.16.2"

setRepeatCommand =
#(define-music-function (parser location arg)(scheme?)
#{
  \applyContext #(lambda (ctx)
   (let* ((where (ly:context-property-where-defined ctx 'repeatCommands))
          (repeat-commands (ly:context-property where 'repeatCommands))
          (to-append
            (cond ((symbol? arg)
                   (list arg))
                  ((or (boolean? arg) (markup? arg))
                   (list (list 'volta arg)))
                  (else '()))) 
          (appended-settings (append repeat-commands to-append)))
         
    ;(newline)
    ;(display appended-settings)
    ;(newline)
   
    (ly:context-set-property! where 'repeatCommands appended-settings)))
#})

startRepeat = \setRepeatCommand #'start-repeat
endRepeat = \setRepeatCommand #'end-repeat
startVolta-I = \setRepeatCommand #"1."
startVolta-II-IV = \setRepeatCommand \markup \fontsize #3 "2. - 4."
endVolta = \setRepeatCommand ##f

\relative c' {

a1
\startRepeat
b
        \startVolta-I
c
\endRepeat
\endVolta
\startVolta-II-IV
d
\endVolta
e
}


Zitat
[...] steht jetzt in meinem primären quellfile nur noch musik und text drin. alle normalen instrumente habe ich in ein include ausgelagert, was für alle projekte gleich ist. wie sieht eine funktion aus, die mir einen solchen block in abhängigkeit von der anzahl der verse generiert, also deren aufruf etwa so erfolgt (pseudocodemässig):

createMusicTextPart ( "melody", verseOne, verseTwo, verseFour)?


Das ist jetzt zu sehr offtopic.
Bitte mach einen neuen Thread auf.
Mit einem Beispiel!!
Hier wäre es durchaus  sinnvoll ganze files zu posten, damit man sehen kann, was in den files drin ist und was nicht, sowie welches file wo inkludiert wird etc.
Ganz generell wird das Arbeit auf der toplevel-Ebene, d.h. ganze Staffs, scores und books müssen eventuel manipuliert werden.
Das habe ich auch noch nicht so häufig gemacht. Aber mal schauen ...


Gruß,
  Harm