ОШИБКА 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

Другие вопросы по тегам