我想从 SuperCollider 中获得一些乐趣,对我来说乐趣意味着在 shell 中运行命令!
到目前为止,我已经成功地用以下扬声器播放:
RS.scd
s.waitForBoot({
// Play scale once.
x = Pbind(\degree, Pseq([0, 3, 5, 7], 1), \dur, 0.25);
x.play;
});
Run Code Online (Sandbox Code Playgroud)
和:
sclang rs.scd
Run Code Online (Sandbox Code Playgroud)
并保存到https://doc.sccode.org/Guides/Non-Realtime-Synthesis.html中提到的文件中:
惩教署
x = Pbind(\degree, Pseq([0, 3, 5, 7], 1), \dur, 0.25).asScore(1, timeOffset: 0.001);
x.add([0.0, [\d_recv, SynthDescLib.global[\default].def.asBytes]]);
x.sort;
x.recordNRT(
outputFilePath: "nrt.aiff",
sampleRate: 44100,
headerFormat: "AIFF",
sampleFormat: "int16",
options: ServerOptions.new.numOutputBusChannels_(2),
duration: x.endTime
);
0.exit;
Run Code Online (Sandbox Code Playgroud)
因此,为了实现我的目标,我缺少:
rs.scd玩完后如何自动退出?我可以这样做1.wait; 0.exit;,但这迫使我对 进行硬编码1,这是正在播放的 4 个 0.25s 音符的长度(以秒为单位)。这1也是硬编码在 中的nrs.csd,如果能够将其分解出来那就太好了。thisProcess.argv和 来管理if,但是有更简单的方法吗?我以前玩过 CSound,在那里使用类似的“hello world”要简单得多。
在 SuperCollider 3.10、Ubuntu 20.04 上测试。
对于你的第一个问题:
您可以在其中x.recordNRT添加一个操作。该函数将在评分结束后执行。
...
x.recordNRT(
...
duration: x.endTime,
action: {0.exit}
);
Run Code Online (Sandbox Code Playgroud)
对于你的第二个问题:
这是一个不寻常的用例。我不知道比 argv 和 if 语句更好的方法。(另请参阅https://doc.sccode.org/Classes/Main.html#-argv)
可以放在 if 之前的内容包括:
构建您的模式并创建您的合成定义。
If 之后需要做的事情包括将 SynthDefs 发送到服务器,因为 NRT 服务器与本地服务器不同。请参阅您链接的帮助文件以获取有关此内容的一些警告。