如何将相位和幅度的 FFT 信息发送到 SuperCollider 中的振荡器组?似乎我误解了一些东西,但无法弄清楚我的代码有什么问题:
msg = osc_message_builder.OscMessageBuilder(address = "/s_new 100 1 1 oscBank512")
msg.add_arg(" amplitude ", amplitudes)
msg.add_arg(" phase ",phases)
msg.add_arg(" attackSynth ", 0.1)
msg.add_arg(" releaseSynth", 0.5)
msg = msg.build()
client.send(msg)
所以我的振荡器库有 256 个 SinOsc,我想为它们发送幅度和相位信息,它们在那些数组中(幅度,相位)。但是 python-osc 不允许我这样做。它说:
ValueError:arg_type 必须是('f'、'i'、'b'、's'、'T'、'F')之一
那么我将如何正确构建该 OSC 消息呢?Python-osc 教程真的很小,在网上找不到任何帮助。我会使用 pyOSC 或 OSC,但 pip 无法安装它们,所以我坚持使用 python-osc。
振荡器组的 SuperCollider 代码:
SynthDef.new(\oscBank512, {
arg attackSynth=0.1, releaseSynth=0.1;
var dmplitudeReceive = \dmplitudeReceive.kr( 0.0!256 );
var phaseReceive = \phaseReceive.kr( 0.0!256 );
var osc1, envelopeSynth, sig, amp, freq, phases, amps,out;
freq = Array.fill(256, {
arg i, j=(22050/256), k=(j/2);
if(i==0){i*j}{(i*j)-k};
});
amp = EnvGen.kr(
envelope: Env.perc(
attackTime: attackSynth,
releaseTime: releaseSynth,
level: 1,
curve: -4),
doneAction: 2);
sig = SinOsc.ar(freq:freq, mul: dmplitudeReceive, phase: phaseReceive);
sig = sig*amp;
sig = Limiter.ar(in:Mix.new(sig), level:1);
Out.ar(0, Pan2.ar(sig));
}).add;
dmplitudeReceive 故意用 d 命名。