Autor Thema: Funktion um Noten auf Systeme zu verteilen  (Gelesen 1266 mal)

Jonathan

  • Member
Funktion um Noten auf Systeme zu verteilen
« am: Sonntag, 20. Oktober 2013, 14:39 »
Zur Übersichtlichkeit möchte ich mein Stück in mehrere Teile aufteilen und für jeden Teil 4 Variablen für meine 4 Stimmen anlegen.
Jetzt habe ich versucht, folgende selbstgeschriebene Funktion dafür zu benutzen:
FourStaffes =
#(define-music-function
     (parser location voice1 voice2 voice3 voice4)
     (ly:music? ly:music? ly:music? ly:music?)
   #{
    <<
    \new Staff  \with {midiInstrument = #"trumpet"} {
    <<
       \new Voice {\voiceTwo #voice1}
    >>
    }
   
    <<
    \new Staff  \with {midiInstrument = #"trumpet"} {
    <<
       \new Voice {\voiceTwo #voice2}
    >>
    }
   
    \new Staff   \with {midiInstrument = #"trombone"}  {
      \clef bass
    <<
       \new Voice {\voiceThree #voice3}
    >>
    }
   
    \new Staff   \with {midiInstrument = #"tuba"}  {
      \clef bass
    <<
       \new Voice {\voiceFour #voice4}
    >>
    }
   
    >>
   #})

Benutzen möchte ich das ganze dann ungefähr so:
\FourVoice(\IntroSopran \IntroAlt \IntroTenor \IntroBass)

\FourVoice(\MainSopran \MainAlt \MainTenor \MainBass)

Allerdings komme ich mit der Syntax überhaupt nicht klar und das Handbuch ist in diesem Bereich auch ziemlich knapp. Es hört sich im Grunde nach keinem schwierigen Problem aber ich kriege es trotzdem irgendwie nicht hin. Ich könnte natürlich auch jedes mal den Text kopieren und entsprechend anpassen, aber ich habe das Gefühl, mit Lilypond müsste das auch eleganter gehen (eben mit Funktionen).

harm6

  • Member
Re: Funktion um Noten auf Systeme zu verteilen
« Antwort #1 am: Sonntag, 20. Oktober 2013, 17:08 »
Hallo Jonathan,

im Prinzip warst Du eigentlich schon am Ziel!

Ich habe lediglich haufenweise Klammern entfernt (die verwirren nur), sowie die notwendigen Klammern belassen/ergänzt.

\version "2.16.2"

frstIntro = \relative c'' { b1^"Trumpet" }
scndIntro = \relative c' { f1^"Trumpet" }
thrdIntro = \relative c' { g^"Trombone" }
frthIntro = \relative c { g1^"Truba" }

frst = \relative c'' { c1^"Trumpet" }
scnd = \relative c' { e1^"Trumpet" }
thrd = \relative c' { g^"Trombone" }
frth = \relative c { c1^"Truba" }

fourStaves =
#(define-music-function (parser location voice1 voice2 voice3 voice4)
     (ly:music? ly:music? ly:music? ly:music?)
   #{
    <<
    \new Staff  \with { midiInstrument = #"trumpet" }
      \new Voice { \voiceTwo #voice1 }
     
    \new Staff  \with { midiInstrument = #"trumpet" }
      \new Voice { \voiceTwo #voice2 }
   
    \new Staff  \with { midiInstrument = #"trombone" } 
      \new Voice { \clef bass \voiceThree #voice3 }
   
    \new Staff  \with { midiInstrument = #"tuba" } 
      \new Voice { \clef bass \voiceFour #voice4 }
    >>
   #})

\fourStaves
  \frstIntro
  \scndIntro
  \thrdIntro
  \frthIntro

\fourStaves
  \frst
  \scnd
  \thrd
  \frth
 
 
%% or:

\score {
  \fourStaves
    \frstIntro
    \scndIntro
    \thrdIntro
    \frthIntro
  \header { piece = "Intro" }
}

\score {
  \fourStaves
    \frst
    \scnd
    \thrd
    \frth
  \header { piece = "piece" }
}

Ich habe die \voiceXxx-commands drin gelassen, aber sind sie wirklich nötig?
Darüberhinaus: Ist es jetzt wirklich übersichtlicher? ;)

Gruß,
  Harm

Jonathan

  • Member
Re: Funktion um Noten auf Systeme zu verteilen
« Antwort #2 am: Donnerstag, 24. Oktober 2013, 14:22 »
Hi,

vielen dank :)

Allerdings wäre da noch eine "Kleinigkeit": Ich hätte gerne, dass die Noten an einem Stück sind, d.h. dass keine neue Zeile anfängt. Ich glaube, "\new Staff" macht genau das, also bräuchte man vermutlich einen anderen Befehl. Die alten Systeme sollten fortgesetzt werden, vielleicht sogar ohne dass man im Notenbild sieht, dass es überhaupt unterschiedliche Teile sind.

Was ich mir von dem ganzen erhoffe: Einerseits halte ich es für wesentlich robuster, nicht einzelne Stimmen, sondern Abschnitte mit mehreren Systemen zu editieren. Wenn ich beispielsweise eine Stimme ändere und dadurch aus versehen die Noten länger oder kürzer werden, verschiebt sich alles durch das komplette Stück durch. Mit meiner Lösung hoffe ich, dass damit nur der aktuelle Teil betroffen wäre und danach wieder alles stimmt. Ich möchte einfach die Gewissheit haben, bei Notenänderungen nur den aktuellen Teil überprüfen zu müssen und zu wissen, dass der ganze Rest nach wie vor noch stimmt, eben weil sich Änderungen nicht weiter auswirken.
Ein weitere Grund (auch wenn er vermutlich nicht ganz so sinnvoll ist) ist, dass ich Frescobaldi als Editor benutze und das Midi-Dateien immer nur ab dem Anfang spielen kann (Spulen funktioniert nie richtig, ansonsten kann man nur die Abspielgeschwindigkeit ändern, was aber auch nervt). Wenn ich mehrere Teile habe, kann ich sehr einfach ein paar davon auskommentieren und habe in der Midi und den Noten dann nur den Teil stehen, der mich aktuell interessiert.


Ansonsten: Ich bin natürlich auch für jeden Tipp dankbar, wie man sonst am besten komplexe Stücke aufbaut und gliedert, so dass es übersichtlich ist und möglichst robust gegen Fehler.

harm6

  • Member
Re: Funktion um Noten auf Systeme zu verteilen
« Antwort #3 am: Donnerstag, 24. Oktober 2013, 23:16 »
Vielleicht:

\version "2.16.2"

frstIntro = \relative c'' { b1^"Trumpet" }
scndIntro = \relative c' { f1^"Trumpet" }
thrdIntro = \relative c' { g^"Trombone" }
frthIntro = \relative c { g1^"Truba" }

frst = \relative c'' { c1 }
scnd = \relative c' { e1 }
thrd = \relative c' { g }
frth = \relative c { c1 }

fourStaves =
#(define-music-function (parser location voice1 voice2 voice3 voice4)
     (ly:music? ly:music? ly:music? ly:music?)
   #{
    <<
    \new Staff  \with { midiInstrument = #"trumpet" }
      \new Voice $voice1
     
    \new Staff  \with { midiInstrument = #"trumpet" }
      \new Voice $voice2
   
    \new Staff  \with { midiInstrument = #"trombone" } 
      \new Voice { \clef bass $voice3 }
   
    \new Staff  \with { midiInstrument = #"tuba" } 
      \new Voice { \clef bass $voice4 }
    >>
   #})


\score {
  \fourStaves
  {
    \mark "INTRO"
    \frstIntro
    \break
    \mark "MAIN"
    \frst
  }
  { \scndIntro \scnd }
  { \thrdIntro \thrd }
  { \frthIntro \frth }
 
  \header { piece = "Piece" }
  \layout {
    \override Score.RehearsalMark #'color = #red
  }
}

Aber ich habe meine Zweifel, daß es wirklich so viel hilft, wie Du Dir wünschst.

Gruß,
  Harm

Jonathan

  • Member
Re: Funktion um Noten auf Systeme zu verteilen
« Antwort #4 am: Sonntag, 27. Oktober 2013, 13:18 »
Nein, das ist leider auch nicht das, was ich möchte.

Aaaaber:
Nach reichlich Nachlesen in der Dokumentation habe ich den Unterschied zwischen \new und \context gelernt. Ich hatte schon die Vermutung, dass es irgendwie so etwas geben MUSS, ich hatte bloß keine Ahnung in welcher Form oder unter welchem Namen. Ich mache es jetzt so:

\version "2.16.2"

frstIntro = \relative c'' { b1^"Trumpet" }
scndIntro = \relative c' { f1^"Trumpet" }
thrdIntro = \relative c' { g^"Trombone" }
frthIntro = \relative c { g1^"Truba" }

frst = \relative c'' {c1 }
scnd = \relative c' { e1 }
thrd = \relative c' { g }
frth = \relative c { c1 }

fourStaves =
#(define-music-function (parser location voice1 voice2 voice3 voice4)
     (ly:music? ly:music? ly:music? ly:music?)
   #{
    <<
    \context Staff = sFs \with { midiInstrument = #"trumpet" }
      \context Voice = vFs $voice1
     
    \context Staff =sSc \with { midiInstrument = #"trumpet" }
      \context Voice  =vSc $voice2
   
    \context Staff = sTh \with { midiInstrument = #"trombone" } 
      \context Voice =vTh { \clef bass $voice3 }
   
    \context Staff =sFth \with { midiInstrument = #"tuba" } 
      \context Voice =vSc { \clef bass $voice4 }
    >>
   #})


Intro =
  \fourStaves
    \frstIntro
    \scndIntro
    \thrdIntro
    \frthIntro

Main =
  \fourStaves
    \frst
    \scnd
    \thrd
    \frth

\score {
 
  {
    \Intro
    \Main
  }
 
  \header { piece = "Piece" }
  \layout {
    \override Score.RehearsalMark #'color = #red
  }
}

Im Grunde habe ich in der Funktion bloß \new durch \context ersetzt, und dann im unteren Teil die Variablen neu angeordnet. Dadurch kann ich jetzt ganz einfach meine Teile hintereinander schreiben und sie erscheinen trotzdem durchgehend im Notenbild :)