Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure MIDICP在泛音中是如何工作的?_Clojure_Overtone - Fatal编程技术网

Clojure MIDICP在泛音中是如何工作的?

Clojure MIDICP在泛音中是如何工作的?,clojure,overtone,Clojure,Overtone,我试图在泛音中添加一些微音功能,但在处理函数midicps时遇到了问题,这似乎是处理midi输入的一个要求 这就是我想要的: (definst instrument [note 64 amp 0.5 gate 1] (* amp (lpf (lf-tri (foo note) ) 1100) (env-gen (adsr 0.1 0.2 2 2 0.3) gate :action FREE))) foo是一个函数,它接受一个midi值并将其映射到一个以hz为单位的值(有点像midicp

我试图在泛音中添加一些微音功能,但在处理函数midicps时遇到了问题,这似乎是处理midi输入的一个要求

这就是我想要的:

(definst instrument [note 64 amp 0.5 gate 1]
  (* amp (lpf (lf-tri (foo note) ) 1100)
  (env-gen (adsr 0.1 0.2 2 2 0.3) gate :action FREE)))
foo是一个函数,它接受一个midi值并将其映射到一个以hz为单位的值(有点像midicps),但是,上面的代码不能正确运行

为了测试,我将foo定义为:

(defn foo [x] (if (= 64 x) 880 440))
因此,
(乐器64)
应该演奏比任何其他foo都高八度的音符,但事实并非如此

我相信,当我运行
(instrument x)
时,它会将其他内容(midi事件?)传递给foo,而不是整数本身

每当我尝试在
midicps
上运行
midi->hz
时,都会出现错误:

CompilerException java.lang.ClassCastException: overtone.sc.machinery.ugen.sc_ugen.SCUGen 
cannot be cast to java.lang.Number, compiling:(form-init7628662755818333410.clj:1:1)
在没有MIDICP的音符上调用midi->hz会产生相同的错误

如何将此ugen(或midi事件)转换为表示midi音符的整数


注意:我正在使用
midi-poly-player
为我的乐器添加midi处理器。如果我只是在事件处理程序上做一个常规的注释,我就可以让我的音高映射函数正常工作,但我更愿意使用
midi poly player
,这样我就不必重新实现它的所有功能。

像这样调用foo函数时,你在混合使用scsynth ugens和Clojure代码。在definst中,它是一个宏,将Clojure代码转换为超级准直器合成器代码。我不明白为什么代码会这样,但我想我可以告诉你如何让它做你想做的。只需将代码保存在definst宏中即可

这是Clojure中的midi->hz函数。midicps作为ugen-in超级准直器为您提供:

(defn midi->hz
  "Convert a midi note number to a frequency in hz."
  [note]
  (* 440.0 (java.lang.Math/pow 2.0 (/ (- note 69.0) 12.0))))
您只需在您的定义中内联注释->频率转换:

(definst instrument2 [note 64 amp 0.5 gate 1]
  (let [freq (* 440.0 (pow 2.0 (/ (- note 69.0) 12.0)))]
    (* amp (lpf (lf-tri freq) 1100)
       (env-gen (adsr 0.1 0.2 2 2 0.3) gate :action FREE))))
听标准的每音阶12个音符的输出,如:

(def x (instrument2 69))
(ctl x :gate 0)
(def x (instrument2 70))
(ctl x :gate 0)
(def x (instrument2 71))
(ctl x :gate 0)
例如,为了调整每倍频程更多的音调,这将提供24

(definst instrument3 [note 64 amp 0.5 gate 1]
  (let [freq (* 440.0 (pow 2.0 (/ (- note 69.0) 24.0)))]
    (* amp (lpf (lf-tri freq) 1100)
       (env-gen (adsr 0.1 0.2 2 2 0.3) gate :action FREE))))

(def x (instrument3 69))
(ctl x :gate 0)
(def x (instrument3 70))
(ctl x :gate 0)
(def x (instrument3 71))
(ctl x :gate 0)
我听到一系列较小的步骤。我希望你也是

干杯


罗杰(Roger)

在网上问这样的问题可能会得到更快的答案。