我正在尝试添加一些微调功能来泛音,但是在处理 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))
因此,(instrument 64)
应该播放一个比任何其他 foo 高八度的音符,但事实并非如此。
我相信正在发生的事情是,当我运行时(instrument x)
,它会将其他东西(midi 事件?)传递给 foo 而不是整数本身。
每当我尝试运行midi->hz
时midicps
,我都会收到错误消息:
CompilerException java.lang.ClassCastException: overtone.sc.machinery.ugen.sc_ugen.SCUGen
cannot be cast to java.lang.Number, compiling:(form-init7628662755818333410.clj:1:1)
在没有 midicps 的情况下调用 midi->hz 会产生相同的错误。
如何将此 ugen(或 midi 事件)转换为代表 midi 音符的整数?
注意:我midi-poly-player
用来为我的乐器添加 midi 处理程序。如果我只是制作一个常规的 note-on 事件处理程序,我可以让我的音高映射函数工作,但我更愿意使用midi-poly-player
,所以我不必重新实现它的所有功能。