使用SuperCollider记录WAV文件



我编写了以下代码,以定义SynthDef,该代码将声音记录到缓冲区中的一个参数之一。

(
SynthDef(recordTone, { |freq, bufnum, duration|
    var w = SinOsc.ar(freq) * XLine.ar(101,1,duration,add: -1) / 100;
    RecordBuf.ar(w!2,bufnum,loop: 0,doneAction: 2);
}).add;
)

我还具有以下代码,该代码调用上述SynthDef的合成器并试图将缓冲区写入文件中。

({
    var recordfn = { |freq, duration, fileName|
        var server = Server.local;
        var buf = Buffer.alloc(server,server.sampleRate * duration,2);
        Synth(recordTone,[freq, 440, bufnum, buf.bufnum, duration, duration]);
        buf.write(
            "/Users/minerva/Temp/snd/" ++ fileName ++ ".wav",
            "WAVE",
            "int16",
            completionMessage: ["b_free", buf.bufnum]
        );
    };
    recordfn.value(440,0.5,"test");
}.value)

正在创建输出文件,但不包含任何可听见的声音。我究竟做错了什么?我仔细研究了所有我能找到的超级收听器文档,但似乎没有什么可用!任何指针都将不胜感激。

基于丹的答案,我做了一些更改以使此操作:

(
SynthDef(playTone, { |freq, duration|
    var w = SinOsc.ar(freq) * XLine.ar(1001,1,duration,add: -1,doneAction:2) / 1000;
    Out.ar(0,w!2);
}).add;
)
(
SynthDef(recordTone, { |buffer|
    RecordBuf.ar(In.ar(0,2), buffer, loop: 0, doneAction: 2);
}).add;
)
(Routine({
    var recordfn = { |freq, duration|
        var server = Server.local;
        var buffer = Buffer.alloc(server, server.sampleRate * duration, 2);
        server.sync;
        server.makeBundle(func: {
            var player = Synth(playTone, [freq, freq, duration, duration]);
            var recorder = Synth.after(player, recordTone, [buffer, buffer]);
        });
        duration.wait;
        buffer.write(
            "/Users/minerva/Temp/snd/test.wav",
            "WAVE",
            "int16",
            completionMessage: ["/b_free", buffer]
        );
    };
    recordfn.value(440,0.1);
}).next)

您的主要问题是,在recordfn功能中,您正在实例化SynthDef(即启动记录)并将缓冲区写入同时磁盘。显然,在您开始录制的那一刻,缓冲区没有声音,因此超级挑选器正按照您的要求,并将空的无声缓冲区作为文件进行。

解决方案:

  • 最基本的解决方案是调用一个函数以开始录制,并且是在写入磁盘时单独的功能。
  • ,或者如果您希望所有这些都一组,请考虑在您的功能中启动任务,以便等待缓冲区准备好写入磁盘。
  • 或不用recordbuf使用直接"启动"到磁盘的磁盘。

次要的事情:我现在不记得了

相关内容

  • 没有找到相关文章

最新更新