ОШИБКА Supercollider: невозможно установить элемент управления на UGen
Я пытаюсь изменить громкость с помощью Line.kr, но получаю эту ошибку: ОШИБКА: не удается установить элемент управления на UGen
Вот код:
a = {arg freq=440, vol=0; SinOsc.ar(freq)*vol}.play
a.set(\vol,Line.kr(0,1.0,3))
Есть идеи?
2 ответа
На самом деле это такой базовый вопрос / тема, что, возможно, требуется более подробный ответ. В принципе, если вам нужна/хотите «полную гибкость» в том, что
\vol
Конверт, вы должны прочитать его из шины (на стороне сервера) или использовать один из многих приемов оболочки на стороне клиента, которые скрывают эту (шину) сантехнику под некоторым синтаксическим сахаром. Типичным примером последнего может быть JITLib. Пример использования последнего:
a = Ndef(\a, {arg freq=440, vol=0; SinOsc.ar(freq)*vol}).play;
a.set(\vol, Ndef(\v, { Line.kr(0,1.0,3) }))
Если вы сейчас сделаете
a.edit
вы увидите что-то вроде
Без использования этого сахара JITLib вам пришлось бы самостоятельно выделять и отображать шину, например:
a = {arg freq=440, vol=0; SinOsc.ar(freq)*vol}.play;
b = Bus.control(s, 1); // "s" is the default-bound server variable
a.map(\vol, b);
c = { Out.kr(b, Line.kr(0,1.0,3);) }.play;
С JITlib вы можете просто
set
во всем, так как у него есть «ум» для определения типа аргумента, но с базовым SC вам нужно различать сопоставление и настройку ... хотя вы также можете установить что-то в строку номера шины c, чтобы добиться того же эффекта (
map
в основном делает это за вас), т.е. предпоследняя строка выше может быть
a.set(\vol, b.asMap);
Просто
b.asMap
оценивается как, например, «c1», что означает шину управления 1. (Вместо этого аудиошины используют префикс «a», как и следовало ожидать.)
Этот бит может быть несколько более запутанным, но имейте в виду, что
a
а также
~a
- это разные типы переменных (более или менее стек функций по сравнению со стеком среды), ключи (первые аргументы) могут использоваться «напрямую» в «ярлыках» ~ переменных, предоставляемых как в
p = ProxySpace.push(s);
~a = {arg freq=440, vol=0; SinOsc.ar(freq)*vol};
~a.play; // play the NodeProxy, not the Function (Synth) directly
~a.set(\vol, ~v); // ~v is a NodeProxy.nil(localhost, nil) due to ProxySpace
~v = { Line.kr(0,1.0,3) };
Под капотом этот последний пример практически автоматически выдает s, т.е. 2-я строка делает то же самое, что и
Ndef(\a ...
, так что вам не нужно вводить
Ndefs
явно больше. Как это работает, так это
ProxySpace
заменяет (где живут переменные) на тот, в котором
put
, который запускается присваиванием ~переменным, теперь создает или изменяет
Ndef
песок
at
обращается к ним, например, если вы оцениваете
currentEnvironment
теперь он показывает что-то вроде
ProxySpace ( ~a - ar(1) ~v - kr(1) )
(Чтобы вернуться к предыдущей среде, введите
p.pop
в настоящее время.)
Вы не можете использовать UGen для установки аргумента SynthDef, но вы можете установить аргументы Line.kr:
a = {arg freq=440, vol=0; SinOsc.ar(freq)*Line.kr(atk,sus,rel)}.play
a.set(\atk,0,\sus,1,\rel,0)
обратите внимание, что с Line.kr вы не можете перезапустить конверт. Для более конкретного контроля, пожалуйста, смотрите EnvGen UGen: http://doc.sccode.org/Classes/EnvGen.html