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

Cir*_*四事件 6 supercollider

我想从 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 上测试。

Les*_*s_h 1

对于你的第一个问题:

您可以在其中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 服务器与本地服务器不同。请参阅您链接的帮助文件以获取有关此内容的一些警告。