Autor Thema: Schlagzeug und Tonhöhen auf einem System?  (Gelesen 3837 mal)

jo

  • Gast
Schlagzeug und Tonhöhen auf einem System?
« am: Mittwoch, 10. August 2011, 01:11 »
Hallo Lilypond-Fans,

im Akkordeonbereich wird üblicherweise mit nur wenigen (einem) Schlagzeuger komponiert und in der Schlagzeugstimme / Partitur nur ein System benutzt (der Schlagzeuger spielt z.B. Pauken/Schlagzeug etc. aber auch Xylophon).
D.h. Schlagzeugnoten \drummode { .... } und Noten für Xylophon \relative c' { ...  } abwechselnd.
Im Fall von parallelem Spiel werden natürlich mehrere Systeme benutzt.

Mein Problem ist, daß ich die beiden Kontexte nicht auf EIN System bekommen. Sobald ich einen Instrumentenwechsel vornehme, wird ein neues System erstellt.
Ich habe es mit \partcombine versucht (1st voice drummode gefolgt von S1, 2nd voice S1 dann Noten) und auch \instrumentswitch (siehe Beispiel) - erfolglos :(

Beispiel:
\version "2.12.3"
\addInstrumentDefinition #"Xylophon"
  #`((instrumentTransposition . ,(ly:make-pitch -1 0 0))
     (shortInstrumentName . "Xyl.")
     (clefGlyph . "clefs.F")
     (middleCPosition . 6)
     (clefPosition . 2)
    )

\new DrumStaff { \drummode { bd2 sn2 r1 } } 
\instrumentSwitch "Xylophon"
\relative c' { c4 d e f }

Im Netz - speziell auch in der Lilypond-Doku - habe ich kein Snippet gefunden- Hat jemand eine Lösung oder Idee?

Gruß
Jo
« Letzte Änderung: Freitag, 26. August 2011, 22:17 von jo »

kilgore

  • Gast
Re: Schlagzeug und Tonhöhen auf einem System?
« Antwort #1 am: Mittwoch, 10. August 2011, 11:13 »
Hallo Jo!

Ja, Lilypond macht ein neues System, weil du es so befohlen hast :) Das neue Instrument lag außerhalb des Drum Staffs, also Lily denk du willst ein ganz neues System anfangen. 

\version "2.12.3"
\addInstrumentDefinition #"Xylophon"
  #`((instrumentTransposition . ,(ly:make-pitch -1 0 0))
     (shortInstrumentName . "Xyl.")
     (clefGlyph . "clefs.F")
     (middleCPosition . 6)
     (clefPosition . 2)
    )

\new DrumStaff { \drummode { bd2 sn2 r1 }
\instrumentSwitch "Xylophon" 
\relative c' { c4 d e f }


Gruß
kil

harm6

  • Gast
Re: Schlagzeug und Tonhöhen auf einem System?
« Antwort #2 am: Mittwoch, 10. August 2011, 12:01 »
Hallo zusammen,

@kilgore:
Wenn ich Deine Lösung kompiliere, werden die Xylophon-Noten nicht korrekt dargestellt: Es wird viermal d ausgegeben. Ich habe allerdings mit 2.14.2 kompiliert. Ist das mit 2.12.3 anders?

Insofern habe ich dem DrumStaff im \layout erstmal beigebracht Noten zu akzeptieren und bin dann mit 2.14.2 zu folgendem gelangt:

\version "2.14.2"

\score {   
        \new DrumStaff \with { instrumentName = #"Percussion " }
{
\new DrumVoice \with { instrumentCueName = #(make-bold-markup "perc.") }
  \drummode { bd2 sn2 r1}

\new Voice \with { instrumentCueName = #(make-bold-markup "xyl.") }
  \relative c' { \clef bass c,4 d e f }

\new DrumVoice \with { instrumentCueName = #(make-bold-markup "perc.") }
  \drummode { \clef percussion bd2 sn2 r1}

\new Voice \with { instrumentCueName = #(make-bold-markup "xyl.") }
  \relative c' { \clef bass c,4 d e f }
}

        \layout {
        \context {
                \DrumStaff
                \accepts "Voice"
        }
        }
       
        \midi { }
}

Das kann allerdings auch noch nicht das gelbe vom Ei sein, denn \instrumentSwitch führt zu einer Fehldarstellung (instrumentCueName wird doppelt ausgegeben), deshalb immer der \with-workaround (in 2.14.2 könnte man den auch als Variable setzen).
Und im MIDI sind keine Tonhöhen dargestellt.

Ich hab's trotzdem mal gepostet, vielleicht weiß jemand anders weiter.

Gruß,
  Harm

jo

  • Gast
Re: Schlagzeug und Tonhöhen auf einem System?
« Antwort #3 am: Donnerstag, 11. August 2011, 04:00 »
Vielen Dank an Harm und kil - bin echt beeindruckt und begeistert!

Die Lösungen mit \accept und \with waren DER Schlüssel, und für mich ist das absolut ausreichend.

Mit MIDI habe ich noch gar nichts probiert, wenn noch jemand hierzu war ergänzen will, gerne... sonst setze ich das Thema nächste Woche auf "fixed" (ich hoffe, das geht mit dem Button "THEMA SCHLIESSEN").

Ich habe noch ein wenig "optimiert" und fasse die Lösung zusammen:
  • Das System wird  als Drumstaff-Kontext aufgesetzt, der neben Drumvoices jetzt auch noch Voices haben kann (\accepts Voice). Mit "\new Drumvoice" wird das System eröffnet und ab da für die Schlagzeugabschnitte  \drummode genutzt.
  • Die Xylophon-Noten werden innerhalb der Drumvoice durch  \new Voice { ... } angegeben, d.h. der Ausdruck innerhalb der Klammern wird im Voice Kontext, also mit Tonhöhen interpretiert.
  • Der instrumentCueName wird beim "\new DrumVoice \with..." als Blank mitgegeben. Dies ist sinnvoll, denn a) diese Bezeichnung ist nur für den ersten Takt da und das System ist ja schon als Percussion benannt. Nach dem Xylophon-Zwischenspiel wird der CueName aus der addInstrumentDefinition geholt. Und b) wird man den von Harm genannten Fehler  mit der doppelten Ausgabe der CueNames nur durch Nutzung der \with Anweisung los.
Und so sieht das Endergebnis aus:

\version "2.12.3"
\addInstrumentDefinition #"Xylophon"
  #`((instrumentTransposition . ,(ly:make-pitch 0 0 0))
     (shortInstrumentName . "Xylo.")
     (clefGlyph . "clefs.G")
     (middleCPosition . 1)
     (clefPosition . -2)
     (instrumentCueName . ,(make-bold-markup "Xyl."))
     (midiInstrument . "xylophone")
    )
\addInstrumentDefinition #"Percussion"
  #`((shortInstrumentName . "Perc.")
     (instrumentName . "Percussion")
     (clefGlyph . "clefs.percussion")
     (clefPosition . 0)
     (instrumentCueName . ,(make-bold-markup "Perc."))
    )

\new DrumStaff
  \with { \accepts Voice }
  { \instrumentSwitch "Percussion"
    \new DrumVoice \with { instrumentCueName = #(make-bold-markup " ") } {
      \drummode { bd2 sn2 R1 }      
   
      \instrumentSwitch "Xylophon"
      \new Voice {
        \relative c' { c4 d e f R1 }
      }
   
      \instrumentSwitch "Percussion"
      {
        \drummode { bd2 sn R1 }      
      }
     
      \instrumentSwitch "Xylophon"
      \new Voice {
        \relative c' { f4 e d c R1 }   
      }   
    } 
  }

Gruß und Danke
Jo

kilgore

  • Gast
Re: Schlagzeug und Tonhöhen auf einem System?
« Antwort #4 am: Donnerstag, 11. August 2011, 13:24 »
Wow cool!  Da habe ich auch einiges gelernt!

harm6

  • Gast
Re: Schlagzeug und Tonhöhen auf einem System?
« Antwort #5 am: Donnerstag, 11. August 2011, 17:49 »
Hallo jo,

hervorragende Optimierung !!

Mir ging allerdings durch den Kopf, daß man auch mal die Mehrstimmigkeit probieren sollte. Das könnte dann so aussehen:

\version "2.12.3"

\addInstrumentDefinition #"Xylophon"
  #`((instrumentTransposition . ,(ly:make-pitch 0 0 0))
     (shortInstrumentName . "Xylo.")
     (clefGlyph . "clefs.G")
     (middleCPosition . 1)
     (clefPosition . -2)
     (instrumentCueName . ,(make-bold-markup "Xyl."))
     (midiInstrument . "xylophone")
    )
   
\addInstrumentDefinition #"Percussion"
  #`((shortInstrumentName . "Perc.")
     (instrumentName . "Percussion")
     (clefGlyph . "clefs.percussion")
     (clefPosition . 0)
     (instrumentCueName . ,(make-bold-markup "Perc."))
    )

one = {
      \drummode { sn2 sn2 R1 }     
   
      \instrumentSwitch "Xylophon"
      \new Voice { \relative c' { \voiceOne c4 d e f R1 } }
   
      \instrumentSwitch "Percussion"
      { \drummode { sn2 sn R1 }     }
     
      \instrumentSwitch "Xylophon"
      \new Voice { \relative c' { \voiceOne f4 e d c R1 } }   
    }
   
two = {
      \drummode { bd2 bd  R1 }
   
      \new Voice \with { instrumentCueName = " " } { \relative c' { \voiceTwo c,4 d e f R1 } }
   
      { \drummode { bd2 bd R1 }     }
     
      \new Voice \with { instrumentCueName = " " } { \relative c' { \voiceTwo f,4 e d c R1 } }   
    }
   
\new DrumStaff \with { \accepts Voice } {
     <<
    \instrumentSwitch "Percussion"
    \new DrumVoice \with { instrumentCueName = " " }
    {\voiceOne \one }
    \new DrumVoice \with { instrumentCueName = " " }
    {\voiceTwo \two }
    >>
  }

Aber ich finde den Code unübersichtlich! Deshalb hab' ich mir noch ein paar Sachen aus den Fingern gesaugt:

\version "2.12.3"

withCue =
#(define-music-function (parser location stringCue music)(string? ly:music?)
#{
        \new Voice \with { instrumentCueName = \markup\bold $stringCue }
        $music
#})

withOutCue =
#(define-music-function (parser location music)(ly:music?)
#{
        \new Voice $music
#})

xyl =
#(define-music-function (parser location arg music)(integer? ly:music?)
#{
        #(define voiceDir   
          (if (<= $arg 3)
              (context-spec-music (make-voice-props-set $arg)  'Voice)
              (context-spec-music (make-voice-props-revert) 'Voice)
              ))
             
        \addInstrumentDefinition #"Xylophon"
          #`((instrumentTransposition . ,(ly:make-pitch 0 0 0))
             (shortInstrumentName . "Xylo.")
             (clefGlyph . "clefs.G")
             (middleCPosition . 1)
             (clefPosition . -2)
             (instrumentCueName . ,(make-bold-markup "Xyl."))
             (midiInstrument . "xylophone")
            )
       
        \instrumentSwitch "Xylophon"   
        \relative c' { \voiceDir $music }   
#})

perc =
#(define-music-function (parser location arg music)(integer? ly:music?)
#{
        #(define voiceDir   
          (if (<= $arg 3)
              (context-spec-music (make-voice-props-set $arg)  'Voice)
              (context-spec-music (make-voice-props-revert) 'Voice)
              ))
             
        \addInstrumentDefinition #"Percussion"
          #`((shortInstrumentName . "Perc.")
             (instrumentName . "Percussion ")
             (clefGlyph . "clefs.percussion")
             (clefPosition . 0)
             (instrumentCueName . ,(make-bold-markup "Perc."))
            )
       
        \instrumentSwitch "Percussion"   
         { \voiceDir $music }   
#})

%--------------------------- Test ----------------------------------------------

three = {
      \perc #0 \drummode { sn2 sn2 R1 }     
   
      \withCue #" " \xyl #0  { c4 d e f R1 }
   
      \perc #0 \drummode { sn2 sn R1 }
     
      \withCue #" " \xyl #0  { f4 e d c R1 } 
    }
   
four = {
      \perc #1 \drummode { bd2 bd  R1 }
   
      \withOutCue \xyl #1  { c,4 d e f R1 }
   
      \perc #1 \drummode { bd2 bd R1 }
     
      \withOutCue \xyl #1  { f,4 e d c R1 } 
    }

\new DrumStaff \with { \accepts Voice } {
     <<
    \new DrumVoice \with { instrumentCueName = " " }
    \three
    \new DrumVoice \with { instrumentCueName = " " }
    \four
    >>
     
  }

\withCue #" "  und \withOutCue sind dazu da ganz nach belieben \new voice \with { instrumentCueName = " " } zu setzen oder nur \new voice .
\xyl macht dann den \instrumentSwitch zum Xylophon. \perc entsprechend. In beiden Funktionen gibt es eine Definition für voiceDir, damit spart man sich die Angabe von \voiceOne etc.
In \xyl #0 bedeutet die 0 also \voiceOne. 1 2 3 also \voiceTwo \voiceThree \voiceFour . Höhere Zahlen führen zu \oneVoice.

Gruß,
  Harm

P.S. Ich würde einen Thread, von Ausnahmefällen mal abgesehen, nie schließen, denn allein schon durch die Versionswechseleien gibt es immer wieder neues zu beachten und zu entdecken. (z.B.: 2.14.2 bietet die Möglichkeit \with-Ausdrücke in Variablen zu speichern)