Allgemein > Allgemeine Diskussion

\score dynamisch erzeugen

(1/2) > >>

derburn:
Hi zusammen,

sagt mal, gibt es eigentlich eine Möglichkeit, \scores dynamisch zu generieren?
Ich denke an so was wie:


--- Code: ---myDrumScore = #(define-music-function (parser location myMusic) (ly:music?)
    #{
       \score { <<
         \new DrumStaff { $myMusic }
       >>
         \layout {
         \context {
           \DrumStaff
             \remove Clef_engraver
             \remove Time_signature_engraver
                  \remove Bar_engraver
           } } }
    #})

--- Ende Code ---

Aufruf z.B.:

--- Code: ---\myDrumScore { bda4 r16 bda8. bda4 cl4 }

--- Ende Code ---

So wie oben dargestellt geht es nicht: define-music-function ist sicher der falsche Kandidat und beim
Kompilieren beschwert er sich auch, wenn er neue Score anlegen soll:
"syntax error, unexpected \score".

Dass dabei einige Engraver entfernt werden, ist übrigens nur als Platzhalter für beliebige
\context - Aktionen gedacht.

Aber gibt es nicht eine Möglichkeit, eine Funktion zu definieren, die einem z.B. genau den obigen Score
anlegt und der man dann nur noch die Musik übergeben muss?

Hintergrund ist der, dass ich zur Notation von Percussions oft sehr ähnliche Muster notiere, die sich
im Wesentlichen durch die eigentliche Musik unterscheiden - der Aufbau der Score (inkl. Layout- und MIDI-
Anpassungen und diverser overrides) ist meist völlig identisch.

Da kommen dann pro Stück allerdings jedes Mal recht viele Zeilen zusammen.
Wenn man bspw. ein Stück mit 20 Stimmen schreibt und man eine Funktion wie oben angedeutet hätte,
könnte man die ganze Score-Generierung in 20 Zeilen erledigen (bzw. 40, wenn man ebenfalls MIDIs erzeugt)...

Hat da jemand eine Idee?

kilgore:
Warum man so ein Score nicht herstellen kann weiss ich nicht.   Meine Lösung antwortet deine Frage nicht, aber das Resultat ist fast das gleiche.  mit "\include" kann man dein Score-Konstrukt mit einbeziehen, und sich die ganze Zeilen sparen:


--- Code: ---\version "2.12.3"
%\include "file/location"


%hier ist dein simple eingabe

myDrumScore = { c c c c }



%Dieser Teil geht in ein andere Datei, deren Ort oben nach "include"
%eingegeben wird.

\score { <<
         \new DrumStaff { \myDrumScore }
       >>
         \layout {
           \context {
               \DrumStaff
                     \remove Clef_engraver
                     \remove Time_signature_engraver
                  \remove Bar_engraver
                   } } }

--- Ende Code ---

derburn:
Hallo kilgore,

vielen Dank für die Antwort, allerdings löst sie das Problem leider nicht vollständig...
Das Problem ist dabei, dass im include-File die Variable \myDrumScore fest drin steht, d.h.
ein Aufruf wie der folgende ist nicht möglich:


--- Code: ---drumsOne = \drummode { bda4 cglo4 toml4 hh4 }
drumsTwo = \drummode { hh4 bda4 cglo4 toml4 }

\include "includeStuff.ily"

drumsOne   = \drummode { cglo4 toml4 hh4 bda4 }
drumsTwo   = \drummode { toml4 hh4 bda4 cglo4 }
drumsThree = \drummode { toml4 tomml4 cghm4 cglo4 }

\include "includeStuff.ily"

--- Ende Code ---

Klar könnte ich dafür wieder ein Template in Form eines anderen include-Files bauen,
aber im Allgemeinen gibt es zu viele Varianten davon, welche Staves in
den ansonsten immer gleich aussehenden Scores kombiniert werden.
Ergo: zu viele Templates, die ich dann doch wieder ändern müsste, sollte
sich die Score-Vorlage mal ändern.

Um das zu umgehen, müsste ich eine Funktion haben, der ich nur die ly:music mitgebe und die mir den Rest generiert.
Dass dann mehrere Staves in der Score erscheinen, wenn z.B. mehrere ly:musics übergeben werden, ist dann nur noch
ein bischen weitere Kapselungssarbeit.

Trotzdem nochmals vielen Dank!
Bin für weitere Ideen aller Art dankbar...

P.S.: Gibt es eigtl. ein Pendant zu \displayMusic, das einem den generierten Code auch für Scores anzeigt?

kilgore:
...so?


--- Code: ---\version "2.12.3"
%\include "file/location"


%hier ist dein simple eingabe

drumOne = { c c c c }

drumTwo = { c c c c }

drumThree = { c c c c }


myDrumScore = << \new StaffGroup
  \new DrumStaff { \drumOne }
  \new DrumStaff { \drumTwo }
  \new DrumStaff { \drumThree }
>>



%Dieser Teil geht in ein andere Datei, deren Ort oben nach "include"
%eingegeben wird.

\score { <<
          { \myDrumScore }
       >>
         \layout {
           \context {
               \DrumStaff
                     \remove Clef_engraver
                     \remove Time_signature_engraver
                  \remove Bar_engraver
                   } } }

--- Ende Code ---




--- Zitat ---P.S.: Gibt es eigtl. ein Pendant zu \displayMusic, das einem den generierten Code auch für Scores anzeigt?
--- Ende Zitat ---

oh das weiss ich nicht....

derburn:
Hallöchen,

kilgore, Deine Lösung ist tatsächlich ausreichend, vorausgesetzt,
ich bekomme noch das Problem in den Griff, dass ich die Anzahl
DrumStaffs per Listenübergabe generiere.

Siehe folgendes Bsp.: im folgenden Code werden zwar 2 Listen übergeben,
aber daraus wird immer eine StaffGroup mit den 3 gleichen Stimmen gebastelt.


--- Code: ---drumOne   = \drummode { bda4 cglo4 toml4 hh4 }
drumTwo   = \drummode { hh4 bda4 cglo4 toml4 }
drumThree = \drummode { cglo4 toml4 hh4 bda4 }

myDrumStaff = #(define-music-function (parser location iname music) (string? ly:music?)
  #{
      \new DrumStaff {
        \set Staff.instrumentName = \markup { $iname }
        \new DrumVoice { $music }
      }
  #})

myStaffGroup = #(define-music-function (parser location inames music) (list? list?)
  #{
      << \new StaffGroup
         \myDrumStaff #"Drum 1" \drumOne
         \myDrumStaff #"Drum 2" \drumTwo
         \myDrumStaff #"Drum 3" \drumThree
      >>
  #})

--- Ende Code ---

Was ich natürlich brauche, ist eine Idee, wie ich die \myDrumStuff - Zeilen entsprechend ersetze.
Meine bisherigen Versuche, aus einer Liste den obigen Code zu generieren,
scheiterten leider kläglich.

Ich stelle mir den Aufruf so vor:


--- Code: ---myDrumScore = \myStaffGroup #'("Drum 1" "Drum 2" "Drum 3") #'(\drumOne \drumTwo \drumThree)
\include "includeStuff.ily"

--- Ende Code ---

In der Datei "includeStuff.ily" steht dann die eigentliche Score:

--- Code: ---\score { <<
         \myDrumScore
       >>
         \layout {
           \context {
               \DrumStaff
                  \remove Clef_engraver
                  \override Stem #'direction = #UP
                  \override Beam #'positions = #'(3.5 . 3.5)
                   } } }

--- Ende Code ---

Vielen Dank & viele liebe Grüße,
Manuel

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln