微分音の機能を倍音に追加しようとしていますが、関数 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 よりも 1 オクターブ高い音を演奏する必要がありますが、そうではありません。
何が起こっているかというと、 を実行する(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 を使用せずに note で midi->hz を呼び出すと、同じエラーが発生します。
この ugen (または MIDI イベント) を MIDI ノートを表す整数に変換するにはどうすればよいですか?
注: を使用midi-poly-player
して、楽器の midi ハンドラーを追加しています。通常のノートオン イベント ハンドラーを作成するだけで、ピッチ マッピング関数を機能させることができますが、midi-poly-player
すべての機能を再実装する必要がないように、むしろ使用したいと考えています。