0

CCIn次のように、クラスを使用する単純な SynthDef があります。

(
SynthDef(\lfo_sin, {|bus, amp, myArg|
    var m = CCIn.new;
    var v = [300, 700, \exp].asSpec;
    var sig = SinOsc.ar(m.kr(0, myArg, v), mul:amp);
    Out.ar(bus, sig);
}).add;
)

そのようにインスタンス化するとy = Synth(\lfo_sin, [\bus, 0, \amp, 1, \myArg, 71]);、MIDI コントローラーの MIDI CC と一致するCCIn.krようになりますが、必要な方法を使用できません。

ただし、SynthDef を次のように定義するときに MIDI CC を直接入力すると、次のようになります。

(
SynthDef(\lfo_sin2, {|bus, amp|
    var m = CCIn.new;
    var v = [300, 700, \exp].asSpec;
    var sig = SinOsc.ar(m.kr(0, 71, v), mul:amp);
    Out.ar(bus, sig);
}).add;
)

すべてが正常に動作し、MIDI コントローラーを使用して周波数を制御できます。

この動作はなぜ発生し、シンセの初期化時または後で引数を設定するときに MIDI CC を渡すことができるようにコードを変更するにはどうすればよいですか?

4

1 に答える 1

0

CCIn のソースを見ると、通常の UGen よりも少し複雑なことを行っていることがわかります。

    kr { |chan = 0, num = 0, spec = \amp, lag = 0.05|
        var outArray = [chan, num, spec, lag].flop.collect{ |args| 
            var ch, n, sp, lg;
            # ch, n, sp, lg = args;
            (sp.asSpec.map( In.kr(this.prGetBus(ch, n).index) ).lag3(lg))
            };
        if (outArray.size>1) {^outArray} {^(outArray[0])} //fix to work with muliout

具体的には、これ...

this.prGetBus(ch, n)

は、提供されたチャネルと番号 (chおよび) を使用して、MIDI データを読み取ることができるnを検索します ( を参照)。このルックアップは、Synth の実行ではなく、SynthDef の構築の一部として実行されるため、構築が完了すると、読み取り元のバスはほとんど修正されます。CCIn クォークは、単純な UGen として動作するために内部のかなり複雑なものを隠しているため、探している動作を簡単に取得できる可能性は低いです。BusprGetBus

ここにいくつかの選択肢があります。

1. 自分で MIDI データをバスに書き込む

// One for each cc number
~ccBusses = 127.collect({
    Bus.control(s, 1);
}); 

// A midi responder that sets the value of the right bus
MIDIdef.cc(\cc, {
    |value, cc|
    ~ccBusses[cc].set(value);
}, ccNum: (0..127) )   // meaning: all cc values

// Once those are set up, to map a cc to a new synth use:
Synth(\mySynth, args:[\freq, ~ccBusses[10].asMap]);

2. コネクションクォークの利用

// Create a value between 100..2400, controlled by MIDI
~freq = MIDIControlValue(spec:ControlSpec(100, 2400));
~freq.cc_(10); // cc number 10

// Run your synth
~note = Synth(\mySynth, args:[\freq, ~freq]);

// Connect the value of ~freq to the \freq argument of your synth. Now, MIDI changes will be broadcast to your synth.
~freq.signal(\value).connectTo(~note.argSlot(\freq));
于 2016-07-04T23:31:00.670 に答える