J'essaie de faire de la musique avec la bibliothèque d'overtones de clojure. Pour produire des sons intéressants, la synthèse additive est utile, c'est-à-dire que je prends des oscillateurs sinusoïdaux de plusieurs fréquences et que je les ajoute simplement. En diphonique, pour créer un synthétiseur, qui se rend compte que, je peux écrire:clojure, le vecteur littéral diffère du résultat de la fonction
(definst myinst [freq 100]
(* 0.2 (reduce + (map sin-osc [101.0 100 99.0]))))
Pour être un peu plus réutilisable, j'écrire une fonction qui prend une fréquence et retourne une liste avec toutes ces fréquences, vous pouvez voir dans l'extrait de code:
(defn split-freq [freq]
(apply vector (map #(* freq %) [1.01 1 0.99])))
Lors de l'exécution (split-freq 100)
, le REPL me donne ce qui suit:
[101.0 100 99.0]
qui est exactement la même que l'entrée, je fourni la fonction de carte ci-dessus. En fait, j'ai copié le résultat. Maintenant, j'essaie ceci:
(definst myinst [freq 100]
(* 0.2 (reduce + (map sin-osc (split-freq freq)))))
Malheureusement, le REPL me dit que je fais mal:
CompilerException java.lang.ClassCastException:
overtone.sc.machinery.ugen.sc_ugen.ControlProxy cannot be cast to java.lang.Number,
compiling:(form-init1807789563491679853.clj:1)
Mais ce code fonctionne très bien:
(definst myinst [freq 100]
(* 0.2 (reduce + (map sin-osc (apply vector (map #(* freq %) [1.01 1 0.99]))))))
bien, je il suffit de mettre dans la définition de la fonction.
Je pense que j'ai un principal manque de compréhension. Je pensais que si l'une de ces versions fonctionnait, les autres devaient aussi fonctionner.
Mes questions sont: Pourquoi ma version 'améliorée' ne fonctionne-t-elle pas? Pourquoi le premier extrait fonctionne-t-il? Comment contourner ce problème?
Clojure 1.3.0
Overtone 0.8
(use 'overtone.core)
Essayez de macroexpanding l'appel à definst. Probablement definst est une macro complexe qui interprète cela et qui est normalement des fonctions (comme '+') dans des définitions de synthé qui additionnent un groupe de signaux, et votre nouvelle forme definst casse la macro. Le code Clojure ne peut pas être exécuté dans le processus du synthétiseur sc, de sorte que vos formulaires doivent être traduits dans des définitions de synthétiseur sc et ne peuvent pas réellement être du vrai code de clojure. – noisesmith