3

微分音の機能を倍音に追加しようとしていますが、関数 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すべての機能を再実装する必要がないように、むしろ使用したいと考えています。

4

1 に答える 1