Audio 使用超级准直器记录WAV文件
我编写了以下代码来定义一个SynthDef,它将声音记录到作为参数之一传递的缓冲区中Audio 使用超级准直器记录WAV文件,audio,wav,audio-recording,sound-synthesis,supercollider,Audio,Wav,Audio Recording,Sound Synthesis,Supercollider,我编写了以下代码来定义一个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调用
(
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调用Synth,并尝试将缓冲区写入文件
({
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)
正在创建输出文件,但不包含任何声音。我做错了什么?我已经查阅了所有我能找到的超级对撞机文档,但似乎什么都不起作用!非常感谢任何指针。您的主要问题是,在
recordfn
函数中,您正在实例化SynthDef(即开始录制),同时将缓冲区写入磁盘。显然,在您开始录制时,缓冲区中没有声音,因此Supercellider完全按照您的要求执行,并将空的静默缓冲区作为文件写入
解决方案:
- 最基本的解决方案是调用一个函数来开始录制,在写入磁盘时调用一个单独的函数
- 或者如果你想把它全部放在一起,考虑在你的函数内启动一个缓冲区,等待缓冲器准备好写入磁盘。
- 或者代替RecordBuf使用,它用于直接“假脱机”到磁盘
第二件事:我现在记不起来了,但我想可能是“WAV”而不是“WAVE”。您的主要问题是,在
recordfn
函数中,您正在实例化SynthDef(即开始录制)并同时将缓冲区写入磁盘。显然,在您开始录制时,缓冲区中没有声音,因此Supercellider完全按照您的要求执行,并将空的静默缓冲区作为文件写入
解决方案:
- 最基本的解决方案是调用一个函数来开始录制,在写入磁盘时调用一个单独的函数
- 或者如果你想把它全部放在一起,考虑在你的函数内启动一个缓冲区,等待缓冲器准备好写入磁盘。
- 或者代替RecordBuf使用,它用于直接“假脱机”到磁盘
第二件事:我现在记不起来了,但我想可能是“WAV”而不是“WAVE”。根据Dan的回答,我做了一些更改以使其正常工作:
(
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)
根据Dan的回答,我做了一些更改以使其正常工作:
(
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)