Allgemein > Allgemeine Diskussion

Kleine Scheme-Etüde

<< < (2/2)

jps:
Danke. Meine Frage zielte nur darauf ab, wie man es macht, dass sichtbarer Text und Link unterschiedlich sind. Aber das ist durch das Codebeispiel jetzt klar geworden. Hätte man auch selber drauf kommen können ;)

harm6:
Hallo Jost,

Du verwendest häufig (list-ref ...) und (substring ...).
Meiner Erfahrung nach ist das häufig nicht robust genug.
Bei "#<Pitch a,, >" ist es noch am wenigsten wahrscheinlich, daß Probleme mit substring auftauchen.

Aber list-ref auf 'satzbausteine' dauernd anzuwenden halte ich für problematisch. Nun gut, die Listen-Einträge werden hart codiert angesteuert. Aber was wenn Du 'satzbausteine' mal grundsätzlich anders gestalten möchtest. Dann hast Du viel Arbeit...

Statt (cdr (assoc ...)) kannst Du einfach assoc-get gebrauchen.


Ich hab' mich auch mal an ein coding versucht.
Die Notennamen werden aus 'language-pitch-names' ausgelesen. Allerdings mit dem Nachteil, daß man die Oktave erst richten muß und die Oktavierungszeichen müssen dann neu geschaffen werden.
Ist auch nicht das Gelbe vom Ei, aber der Vollständigkeit halber poste ich es.

Der finale Output wird durch eine void-function geregelt, die (format ...) benutzt.


--- Code: ---\version "2.19.36"

#(define intervalltabelle '((0 . "Prim")
                            (1 . "Sekund")
                            (2 . "Terz")
                            (3 . "Quart")
                            (4 . "Quint")
                            (5 . "Sext")
                            (6 . "Sept")
                            (7 . "Oktav")))
                           
#(define (get-german-pitch-name p)
  (let ((normalize-pitch
          (lambda (pitch)
            (ly:make-pitch
              -1
              (ly:pitch-notename pitch)
              (ly:pitch-alteration pitch)))))
    (assoc-get
      (normalize-pitch p)
        (map
          reverse-interval
          (assoc-get 'deutsch language-pitch-names)))))
         
#(define (out-put-text p1 p2 interval)
  (let* ((p-oct (lambda (p) (1+ (ly:pitch-octave p))))
         (oct-insert
           (lambda (p) 
             (make-string (abs (p-oct p)) (if (negative? (p-oct p)) #\, #\')))))
  (format #t
    "Das Intervall von ~a~a nach ~a~a ist eine ~a (ggf. + Oktavversetzungen)"
    (get-german-pitch-name p1)
    (oct-insert p1)
    (get-german-pitch-name p2)
    (oct-insert p2)
    interval)))
       
variante_harm =
#(define-void-function (p q) (ly:pitch? ly:pitch?)
  (out-put-text
    p
    q
    (assoc-get
      (modulo (abs (- (ly:pitch-steps p) (ly:pitch-steps q))) 7)
      intervalltabelle)))

\variante_harm a,, fis

--- Ende Code ---

Gruß,
  Harm

harm6:

--- Zitat ---#(display "\n\nScheme macht Spass!\n")

--- Ende Zitat ---

:D

jps:
Dann werde ich assoc-get mal in meinen Wortschatz aufnehmen, und auch das mit den germanischen Pitchnamen werde ich mir merken. Vielen Dank auch für diese Tipps.

harm6:
Falls es jemand interessiert, hier noch eine Fassung für Chromatik, Vierteltöne hab ich mir aber gespart:


--- Code: ---\version "2.19.36"
     
#(define intervalltabelleII
  '((ceses . "d. v. Prim")
    (ces . "v. Prim")
    (c . "r. Prim")
    (cis . "ü. Prim")
    (cisis . "d. ü. Prim")
   
    (deses . "v. Sekund")
    (des . "kl. Sekund")
    (d . "gr. Sekund")
    (dis . "ü. Sekund")
    (disis . "d. ü. Sekund")
   
    (eses . "v. Terz")
    (es . "kl. Terz")
    (e . "gr. Terz")
    (eis . "ü. Terz")
    (eisis . "d. ü. Terz")
   
    (feses . "d. v. Quart")
    (fes . "v. Quart")
    (f . "r. Quart")
    (fis . "ü. Quart")
    (fisis . "d. ü. Quart")
   
    (geses . "d v. Quint")
    (ges . "v. Quint")
    (g . "r. Quint")
    (gis . "ü. Quint")
    (gisis . "d. ü. Quint")
   
    (asas . "v. Sext")
    (as . "kl. Sext")
    (a . "gr. Sext")
    (ais . "ü. Sext")
    (aisis . "d. ü.. Sext")
   
    (heses . "v. Septim")
    (b . "kl. Septim")
    (h . "gr. Septime")
    (his . "ü. Septim")
    (hisis . "d. ü. Septim")))
   
#(define (get-german-pitch-name p)
  (let* ((normalize-pitch
           (lambda (pitch)
             (ly:make-pitch
               -1
               (ly:pitch-notename pitch)
               (ly:pitch-alteration pitch)))))
    (assoc-get
      (normalize-pitch p)
      (map reverse-interval (assoc-get 'deutsch language-pitch-names)))))
         
#(define (out-put-text p1 p2)
  (let* ((oct-insert
           (lambda (p) 
             (make-string
               (abs (1+ (ly:pitch-octave p)))
               (if (negative? (1+ (ly:pitch-octave p))) #\, #\'))))
         (pitch-diff 
           (if (ly:pitch<? p1 p2)
               (ly:pitch-diff p2 p1)
               (ly:pitch-diff p1 p2)))
         (interval
           (assoc-get (get-german-pitch-name pitch-diff) intervalltabelleII)))
   (format #t
     "\nDas Intervall von ~a~a nach ~a~a ist eine ~a (ggf. + Oktavversetzungen)"
     (get-german-pitch-name p1)
     (oct-insert p1)
     (get-german-pitch-name p2)
     (oct-insert p2)
     interval)))
       
variante-harm =
#(define-void-function (p q) (ly:pitch? ly:pitch?) (out-put-text p q))

\variante-harm a aeses,     
\variante-harm a aes,
\variante-harm a a,
\variante-harm a ais,

\variante-harm a bes,
\variante-harm a b,
\variante-harm a bis,

\variante-harm a ces,
\variante-harm a c,
\variante-harm a cis,

\variante-harm a des,
\variante-harm a d,
\variante-harm a dis,

\variante-harm a ees,
\variante-harm a e,
\variante-harm a eis,

\variante-harm a fes,
\variante-harm a f,
\variante-harm a fis,

\variante-harm a ges,
\variante-harm a g,
\variante-harm a gis,

#(display "\n\nScheme macht Spass!\n")

--- Ende Code ---

Gruß,
  Harm

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln