首页 > 解决方案 > 如何在扬声器上或保存到输出文件中从终端命令行界面 (CLI) 以非交互方式播放 SuperCollider 文件?

问题描述

我正在尝试使用 SuperCollider 获得一些乐趣,而对我来说,乐趣意味着在 shell 中运行命令!

到目前为止,我已经设法向扬声器播放:

rs.scd

s.waitForBoot({
  // Play scale once.
  x = Pbind(\degree, Pseq([0, 3, 5, 7], 1), \dur, 0.25);
  x.play;
});

和:

sclang rs.scd

并保存到https://doc.sccode.org/Guides/Non-Realtime-Synthesis.html中提到的文件:

nrs.csd

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;

所以为了实现我的目标,我错过了:

我以前在玩 CSound,在那里工作时获得类似的“hello world”要简单得多。

在 SuperCollider 3.10、Ubuntu 20.04 上测试。

标签: supercollider

解决方案


对于你的第一个问题:

x.recordNRT你可以添加一个动作。该函数将在分数结束后执行。

...
x.recordNRT(
...
    duration: x.endTime,
    action: {0.exit}
);

对于你的第二个问题:

这是一个不寻常的用例。我不知道比 argv 和 if 语句更好的方法。(另见https://doc.sccode.org/Classes/Main.html#-argv

您可以在 if 之前放置的内容包括:

构建您的模式并创建您的 synthdef。

If 之后需要做的事情包括将 SynthDefs 发送到服务器,因为 NRT 服务器与本地服务器不同。请参阅您链接的帮助文件以获取有关此的一些警告。


推荐阅读