2013-09-22 28 views
3

我试图用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) 
+3

尝试宏展开调用definst。可能definst是一个复杂的宏,它将通常将函数(如'+')解释为合成一组信号的合成定义,并且您的新的definst形式会破坏宏。 Clojure代码无法在sc合成进程中运行,因此您的表单需要转换为sc合成器定义,实际上并不是真正的clojure代码。首先感谢, – noisesmith

回答

1

ups,你是对的,我还没有听懂noisesmith的评论。确实,你不能直接在你的函数中使用这个值“freq”,因为这个值在你的函数需要它的时候没有被绑定(在宏执行之前)

所以这是一个解决这个问题的方法,还使用let形式,它不是那么优雅,以使自己的宏,但工程

(defn myinst [inst-name] 
    (let [the-freq 100] 
    (definst inst-name [freq the-freq] (* 0.2 (reduce + (map sin-osc (split-freq the-freq))))))) 

,你可以执行作为一个正常的功能

((myinst "my-instrument")) 

我希望帮助你

胡安


一条评论,

也许你正在使用你的参数值声明一个错误在你的改进版

那是你的代码现在没有有效的响应

(definst myinst [freq 100] 
    (* 0.2 (reduce + (map sin-osc (split-freq freq))))) 

而且,和clojure一样,你不能将默认值赋给参数函数,如果你使用let形式来作为你的改进版本,签署默认值

(definst myinst [] 
    (let [freq 100] 
    (* 0.2 (reduce + (map sin-osc (split-freq freq)))))) 
+0

。正如noisesmith指出的那样,definst是一个宏。它期望偶数个参数,每秒都表示一个默认值。有趣的是,你的版本编译,但我无法再用一个参数调用'myinst'。我遵循,definst将它的论点转化为上面提到的这些奇怪的类型。我需要将它们转换... – spiehr

+0

此解决方案是否解决您的问题? – tangrammer

+0

嗯。不是真的。我想'实例化'一台仪器(definst)并以不同的频率使用它。如果我正确理解您的解决方案,我需要为每个频率实例化一个仪器。我应该在我的问题中澄清这一点。另外,我认为这个问题更多地与泛音相关,而不是泛化。我感谢你的努力! – spiehr