我试图用cloio的泛音库制作音乐。为了产生有趣的声音,加法合成是有用的,这意味着我采用几个频率的正弦振荡器并简单地添加它们。在泛音,创建一个合成器,它意识到,我可以这样写:clojure,文字矢量与函数结果不同
(definst myinst [freq 100]
(* 0.2 (reduce + (map sin-osc [101.0 100 99.0]))))
是有点更可重复使用的,我写了一个函数,该函数的频率,并返回一个列表与所有这些频率,可以看到代码片段:
(defn split-freq [freq]
(apply vector (map #(* freq %) [1.01 1 0.99])))
当执行(split-freq 100)
,在REPL给了我下面的:
[101.0 100 99.0]
这是完全一样的投入,我提供了上面的地图功能。事实上,我复制了结果。现在,我试试这个:
(definst myinst [freq 100]
(* 0.2 (reduce + (map sin-osc (split-freq freq)))))
不幸的是,REPL告诉我,我做错了:
CompilerException java.lang.ClassCastException:
overtone.sc.machinery.ugen.sc_ugen.ControlProxy cannot be cast to java.lang.Number,
compiling:(form-init1807789563491679853.clj:1)
但这个代码工作正常:
(definst myinst [freq 100]
(* 0.2 (reduce + (map sin-osc (apply vector (map #(* freq %) [1.01 1 0.99]))))))
虽然,我只需放入函数定义即可。
我觉得我有一个主要的缺乏理解。我想,如果其中一个版本起作用,其他人也必须工作。
我的问题是: 为什么我的'改进'版本不起作用? 为什么第一个代码段工作? 我如何绕过这种行为?
Clojure 1.3.0
Overtone 0.8
(use 'overtone.core)
尝试宏展开调用definst。可能definst是一个复杂的宏,它将通常将函数(如'+')解释为合成一组信号的合成定义,并且您的新的definst形式会破坏宏。 Clojure代码无法在sc合成进程中运行,因此您的表单需要转换为sc合成器定义,实际上并不是真正的clojure代码。首先感谢, – noisesmith