【问题标题】:How does midicps work in overtone?midicps 如何在泛音中工作?
【发布时间】:2014-08-28 07:01:20
【问题描述】:

我正在尝试为泛音添加一些微调功能,但在处理 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 而不是整数本身。

每当我尝试在 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)

在没有 midicps 的情况下在 note 上调用 midi->hz 会产生相同的错误。

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

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

【问题讨论】:

标签: clojure overtone


【解决方案1】:

当您像这样调用 foo 函数时,您正在混合 scsynth ugens 和 Clojure 代码。在定义中,它是一个宏,将 Clojure 代码转换为 supercollider 合成器代码。我实际上不明白为什么代码的行为如此,但我想我可以向你展示如何让它做你想做的事。只需将代码保留在 definst 宏中即可。

这是 Clojure 中的 midi->hz 函数。 midicps 为您在 supercollider 中作为 ugen 执行此操作:

(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)

我听到一连串更小的脚步声。我希望你也这样做。

干杯,

罗杰

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多