Autor Thema: Automatisiert Arpeggios erstellen  (Gelesen 2893 mal)

woanix

  • Member
Automatisiert Arpeggios erstellen
« am: Mittwoch, 18. Juli 2012, 21:11 »
Hallo,

für mein Stimmtraining schreibe ich mir sehr häufig Arpeggios. Diese erhöhen sich jeweils um ein gleiches Intervall, bis die höchste gewünschte Stufe erreicht ist und vermindern sich dann jeweils um das gleiche Intervall bis zum Ausgangston. Das ist langweilige Tipparbeit und sehr zeitintensiv!

Frage: Lässt ich das automatisieren? Auf Schönheit kommt es mir nicht an, ich benötige letzlich nur die Midi-Datei.

Gekürztes Beispiel:

\version "2.14.2"
\header {
  title = "3-Ton Arpeggio mit Pausen"
  }
\score {
  {
  \numericTimeSignature
  \time 4/4
  \relative c' {
| f4   g    a    g    | f    r4 r2 | r1 | f4    g    a    g    | f    r4 r2 | \break
| fis4 gis  ais  gis  | fis  r4 r2 | r1 | fis4  gis  ais  gis  | fis  r4 r2 | \break
| g4   a    b    a    | g    r4 r2 | r1 | g4    a    b    a    | g    r4 r2 | \break
| gis4 ais  c    ais  | gis  r4 r2 | r1 | gis4  ais  c    ais  | gis  r4 r2 | \break
% und wieder runter
| g4   a    b    a    | g    r4 r2 | r1 | g4    a    b    a    | g    r4 r2 | \break
| ges4 aes  bes  aes  | ges  r4 r2 | r1 | ges4  aes  bes  aes  | ges  r4 r2 | \break
| f4   g    a    g    | f    r4 r2 | r1 | f4    g    a    g    | f    r4 r2 | \break
}
 }

  \midi {
   \context {
      \Score
      tempoWholesPerMinute = #(ly:make-moment 96 4)
    }
 }
  \layout {
   indent = #0
   }
}


Arnold

  • Member
Re: Automatisiert Arpeggios erstellen
« Antwort #1 am: Donnerstag, 19. Juli 2012, 09:13 »
Hallo,

da sieht zu allererst nach einem einfachen \transpose aus.
Und dann würde ich das ein kleines bischen verschachteln.

Erster 'Lauf':
Eins = { \relative c' { f4 g a g | f r4 r2 } }Laufpaar:
PaarEins = { \Eins | R1 | \Eins | \break }Stufung:
Stufung = {
  \PaarEins
  \transpose c cis \PaarEins
  \transpose c d \PaarEins
  \transpose c es \PaarEins
  \transpose c e \PaarEins
  \transpose c es \PaarEins
  \transpose c d \PaarEins
  \transpose c cis \PaarEins
  \transpose c c \PaarEins
}
Und dann seht nur noch \Stufung nach \time 4/4 im \score-Block.

Man könnte sich das ganze auch ineinandergeschachtelt vorstellen: eine Music-Funktion definieren, welche das 'Argument' einen Halbton höher transponiert, vorne und hinten das \PaarEins anstückelt. Das wäre auch gleich ein Test, wieviele Kreuze vor einer Note die Midi-Ausgabe von Lilypond versteht.

Mehr Automatisierung ist natürlich möglich, damit steigt aber meist auch der Aufwand wieder an (z. Bsp. Scheme-Prozeduren).

Arnold

harm6

  • Member
Re: Automatisiert Arpeggios erstellen
« Antwort #2 am: Donnerstag, 19. Juli 2012, 13:57 »
Hallo woanix,

Arnold hat ja schon die gängigen Proceduren zur Minimierung der Tipparbeit aufgelistet.

Ich habe noch eine Funktion dafür geschrieben.
- Eine der neueren devel-Versionen ist erforderlich.
- Ich habe sie chromatisch fortschreitend geschrieben.
- Maximale Transposition erfolgt durch zwei Oktaven.

Verbleibendes Problem:
Falls man nicht mit { f } anfängt erfolgt die Transposition nicht immer sinnvoll. Z.B. will man natürlich eigentlich F-Dur haben und nicht Eis-Dur (-> Beispiel 2). Für den midi-output ist das aber nebensächlich.

Zur Anwendung:
\score {
        \chromaticExercises #8 \exercise¹
        \layout {}
        \midi { \tempo 4= 160 }
}
Die Zahl (hier #8) bestimmt auf wievielen (chromatisch ansteigenden) Stufen die Funktion ausgeführt wird, bevor die Musik wieder zu ihrem Ausgangspunkt zurückkehrt.

Der Code:
\version "2.15.39"

#(set-global-staff-size 17)

chromaticExercises =
#(define-music-function (parser location nmbr music)(integer? ly:music?)
  (let ((number (if (> nmbr 25) 25 nmbr)))

  (define (del l1 l2)
    (if (null? l1)
      l2
      (if (member (car l1) l2)
        (begin
          (set! l2 (delete (car l1) l2))
          (del (cdr l1) l2)))))
         
  (if (< number 1)
    music
    #{
       \new Staff {
        $(make-sequential-music
           (map
              (lambda (x y)
                 #{
                         \transpose c $(ly:make-pitch -1 x y) $music 
                 #})
           (sort (append (del '(3 6 10 13) (iota 21)) (iota 21)) <)
           (list-head '(0 1/2 0 1/2 0 1/2 1/2 0 1/2 0 1/2 0 0 1/2 0 1/2 0 1/2 1/2 0 1/2 0 1/2 0 0)
           number)))
       
        $(make-sequential-music
           (map
              (lambda (x y)
                 #{ 
                         \transpose c $(ly:make-pitch -2 x y) $music 
                 #})
           (list-tail (sort (append (del '(7 11 14 18) (iota 21)) (iota 21)) >) (- 25 number))
           (map
             (lambda (x) (* x -1))   
               (list-tail '(0 1/2 0 1/2 0 -1/2 0 0 1/2 0 1/2 0 0 1/2 0 1/2 0 -1/2 0 0 1/2 0 1/2 0)
                 (- 25 number)))))
        \bar "|."
        }
#})))

%--- test

theme¹ = \relative c' { f4 g a g | f r4 r2 | }
exercise¹ = { \theme¹ R1 \theme¹ \bar "||" \break }

\markup \column {
           \fill-line {
\general-align #Y #CENTER \fontsize #4 \bold "Exercise 1"
\general-align #Y #CENTER \score { \theme¹ \layout {} }
\null
           }
           \vspace #2
}

\score {
        \chromaticExercises #8 \exercise¹
        \layout {}
        \midi { \tempo 4= 160 }
}

%%%

theme² = \relative c' { f4 a c a | f r4 r2 | }
exercise² = { \theme² R1 \theme² \break }

\markup \column {
           \fill-line {
\general-align #Y #CENTER \fontsize #4 \bold "Exercise 2"
\general-align #Y #CENTER \score { \theme² \layout {} }
\null
           }
           \vspace #2
}

\score {
        \transpose f c \chromaticExercises #8 \exercise²
        \layout {}
        \midi { \tempo 4= 160 }
}

HTH,
  Harm