Autor Thema: Akkordbibliothek  (Gelesen 3660 mal)

Chrisipond

  • Member
Akkordbibliothek
« am: Mittwoch, 30. Dezember 2009, 20:09 »
Hallo,
Ich habe ein großes Problem

Da ich viele Begleitungen (Gitarre) schreiben muss, wollte ich folgendes realisieren.
In einer externen Includedatei wollte ich alle wichtigen Gitarrenakkorde als Variablen speichern.

Z.B. :
adur={
<a, a c' e'>
}
 
Damit ich dann den A-Dur Akkord nicht mehr eingeben brauche in einer Partitur, wollte ich einfach dann
ihn mit dem Befehl \adur einfügen.

Das funktionert auch ganz gut.

ABER: Ich bekomme nur den A-Dur Akkord als Viertel ausgegeben. Oft braucht man ja andere Längen.
Versuche wie \adur 2 , um den A-Dur-Akkord als Halbe auszugeben, scheitern.
Ich müsste dann für jede Länge eine eigene Variable definieren. Das ist dann doch zu umständlich.
Gibt es eine Möglichkeit, die Tondauer nachträglich mit einem Befehl abzuändern?
Oder gibt es eine Möglichkeit , eine Variable mit einer Tondauer zu versehen??
Das wäre sehr wichtig zu wissen, es würde mir eine Menge Tipparbeit ersparen.

Danke für Eure Antworten
Christian aus München
« Letzte Änderung: Freitag, 1. Januar 2010, 05:07 von Chrisipond »

derHindemith

  • Member
Re:Akkordbibliothek
« Antwort #1 am: Mittwoch, 30. Dezember 2009, 20:19 »
Mit LilyPond ist alles möglich. Für sowas brauchst du das eigentlich nur in Scheme kodieren. Für Hilfe, siehe in dem Notationsreferenz Kapitel 6.

Chrisipond

  • Member
Re:Akkordbibliothek
« Antwort #2 am: Donnerstag, 31. Dezember 2009, 02:33 »
Hmm, ich will eigentlich nicht erst eine Programmiersprache lernen, um sowas zu realisieren. Da bin ich mit Copy and Paste schneller  :'(

Chrisipond

  • Member
Re:Akkordbibliothek
« Antwort #3 am: Donnerstag, 31. Dezember 2009, 12:43 »
Vielleicht könnt Ihr mir diese Frage beantworten:

Wenn ich eine Note eingebe wie z.B. c2.
dann haben alle anderen weiteren Noten automatisch die gleiche Tonlänge 2. ausgegeben, solange ich keine neue Dauerangabe eingebe. Lilypond speichert als intern die letzte ausgeschrieben Notenlänge und überträgt sie an alle anderen Noten.
Das macht Lilipond mit auch mit Variablen, Akkorden
Die Lösung meines Problem wäre folgende: Ich brauche einen Befehl, um die intern gespeicherte letzte Notenlänge zu ändern. Diesen Befehl würde ich vor meine Variable schreiben: Ich könnte einem Akkord, der in einer Variable gespeichert ist, jede Länge zuweisen, die ich will. Ich finde leider keinen solchen Befehl in der Anleitung, aber ich wüsste auch nicht, wie der im Englischen heißen könnte.

Vielleicht weiß jemand darauf eine Antwort

Danke
Christian

comper

  • Member
Re:Akkordbibliothek
« Antwort #4 am: Donnerstag, 31. Dezember 2009, 15:44 »
Zitat
Das macht Lilipond mit auch mit Variablen
Bei mir nicht. ( Ich denke, Lilypond belegt die Länge während der Definition mit Voreinstellung 4)   
Trotzdem:

setDuration =
#(define-music-function (parser location mus) (ly:music?)
  (make-music 'SequentialMusic 'void #t))


anzuwenden mit skip, wie z.B.
  \setDuration s2.

Gruss

comper

  • Member
Re:Akkordbibliothek
« Antwort #5 am: Donnerstag, 31. Dezember 2009, 16:19 »
Nicht das Gewünschte, aber eventuell von Interesse:
es gibt seit 2.13.8 Unterstützung für Akkordwiederholungen (mit q)
Siehe englische NR 1.5.1

Gruss

Chrisipond

  • Member
Re:Akkordbibliothek
« Antwort #6 am: Freitag, 1. Januar 2010, 05:06 »
Ich hab ein bisschen im englischsprachigen Forum gesucht.
Ich bin fündig geworden, und habe die Funktion ErzeugeRhythmus ein Tick angepasst.
Jetzt kann ich nachträglich Akkorde ändern.
Die Code ist wahnsinnig lang, ich verstehe auch fast gar nichts davon.
Aber es funktioniert.
Danke für Eure Hilfe.
Wenn Ihr eine "elegantere" Methode kennt, schreibt sie mir doch bitte.
Bis bald
Christai

\version "2.12.1"

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Here begins the scheme functions definitions
%% You can put all this section in a separate file (rhythm.ly for example)

#(define rhythmVectorIndex 0)

#(define (transformEachNote chordElt rhythmVector)
   (begin
     (if (or (eq? 'NoteEvent (ly:music-property chordElt 'name))
             (eq? 'RestEvent (ly:music-property chordElt 'name)))
         (set! (ly:music-property chordElt 'duration) (vector-ref rhythmVector rhythmVectorIndex)))
     chordElt))

#(define (getChords musicElt rhythmVector)
   (begin
     (if (eq? 'EventChord (ly:music-property musicElt 'name))
         (begin
           (map
            (lambda (x) (transformEachNote x rhythmVector))
            (ly:music-property musicElt 'elements))
           (set! rhythmVectorIndex (1+ rhythmVectorIndex))
           (if (= rhythmVectorIndex (vector-length rhythmVector)) (set! rhythmVectorIndex 0))))
     musicElt))

%%%%%%%%%%%%%%%% string functions %%%%%%%%%%%%%%%%%%%%%

#(define (string->duration strElt)
   (let*((ptindex (string-index strElt #\. ))
         ;; position of "." in "4." for exemple. #f if no ".".
         (ptnumber 0)
         (val (string->number (if ptindex (substring strElt 0 ptindex) strElt)))
         ;; val = 1 2 4 8 ... (without the ".")
         (dur (ly:intlog2 val))
         ;; dur = 0 1 2 3 ... (need for ly:make-duration)
         )
     ;; find the number of "." in Duration
     (while ptindex (
                     begin
                      (set! ptnumber (1+ ptnumber))
                      (set! ptindex (string-index strElt #\.  (1+ ptindex)))))
     (ly:make-duration dur ptnumber 1 1)))



#(define (string->vectorDuration str)
   (let* ((i 0)
          (strList (string-split str #\space ))
          (len (length strList))
          (v (make-vector len)))
     (map
      (lambda (x)
        (begin
          (vector-set! v i (string->duration x))
          (set! i (1+ i)))
        x)
      strList)
     v))

%%%%%%%%%%%%%%%%%% the main function %%%%%%%%%%%%%%%%%%%%

makeRhythm =
#(define-music-function (parser location m str) (ly:music? string?)
   (let* ((prevWasSpace #t)
          (trimmedStr
           (string-delete
            (string-trim-right str)
            (lambda (c)
              (let* ((currentIsSpace (char=? c #\space))
                     (res (and prevWasSpace currentIsSpace)))
                (if (not res) (set! prevWasSpace currentIsSpace))
                res)))))
     (set! rhythmVectorIndex 0)
     (music-map
      (lambda (x)
        (getChords x (string->vectorDuration trimmedStr)))
      m)))
%% End of the scheme functions definitions
%% (end of rhythm.ly if you use this separate file for them)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% here begins YOUR job

%% \include rhythm.ly



ErzeugeRhythmus =
#(define-music-function (parser location music rhythmus) (ly:music? string?)
  #{
    \makeRhythm $music $rhythmus
#})

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% And your music
cdur =<c e g>

{
  \new Staff{
  \ErzeugeRhythmus \cdur "2" 
  \ErzeugeRhythmus \cdur "4"
  \ErzeugeRhythmus \cdur "8."
  \ErzeugeRhythmus \cdur "16"
 
 
 
}
\new Staff{
  \ErzeugeRhythmus {\cdur \cdur \cdur \cdur \cdur \cdur \cdur \cdur} "8. 16 4"

}