2016-06-16 8 views
0

У меня есть простой SynthDef где я хочу использовать 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 CC на моем MIDI-контроллере, я не могу использовать метод CCIn.kr, как я должен.

Если я однако непосредственно ввести в MIDI CC, когда я определяю SynthDef так:

(
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 при инициализации синтезатора или значение после этого аргумента?

ответ

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 и n) для поиска Bus, из которого он может считывать данные MIDI (см. prGetBus). Он выполняет этот поиск как часть BUILDING SynthDef, а не RUNNING Synth, поэтому, как только он будет построен, автобус, который он читает, в значительной степени исправлен. Кварк CCIn скрывает некоторые довольно сложные вещи под капотом, чтобы вести себя как простой UGen, так что маловероятно, что вы легко сможете получить поведение, которое вы ищете.

Вот несколько альтернатив.

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