我想使用RecordNRT渲染声音序列。 它已经有效,但渲染文件的持续时间太短。
var p;
[\BPM, MasterSequencer.instance.globalBPM].postln;
[\BARS, this.bars].postln;
this.sequenceDuration = ((60 / MasterSequencer.instance.globalBPM) * 4) * this.bars;
[\duration, this.sequenceDuration].postln;
SynthDef(\sampler, { |out, buffer, rate=1, amp|
var snd = PlayBuf.ar(2, buffer, BufRateScale.kr(buffer)*rate, doneAction:2);
Out.ar(0, snd * amp)
}).store;
p = Pbind(
\instrument,\sampler,
\rate, this.slider2.value,
\buffer, this.id,
\dur, (1 / this.steps) * 4,
\amp, Pseq(binarySequence) * this.slider1.value,
).asScore(this.sequenceDuration);
p = p.score.insert(1, [0, ["/b_allocRead", this.id, this.samplePath, 0, -1]]);
p.postln;
Dialog.savePanel({ |path,score|
var header = path.basename.split($.);
if(header.size == 1){
header = "WAV";
path = path ++ ".wav";
}{
header = header.last;
};
if(header == "aif"){ header = "AIFF" };
if(header == "aiff"){ header = "AIFF" };
if(header == "wav"){ header = "WAV" };
Score.recordNRT(
p,
path.dirname +/+ path.basename ++ ".osc", path,
headerFormat:header,
duration: this.sequenceDuration
);
我猜计算this.sequenceDuration=(60/BPM)*4*bars
是对的,
this.sequenceDuration=(4*bars)/(BPM/60)
也会这样做。
因此,输入this.sequenceDuration
与输出文件的持续时间不匹配。
我不知道可能是什么问题。我之前通过发布来检查持续时间以及BPM和条形。我张贴了持续时间,一切似乎都正确。 渲染完成和文件并没有正确的持续时间。
条形码= 8 BPM = 140的文件应为13.71秒,但长度为05.87秒。
条形码= 4 BPM = 120的文件应为08.00秒,但长度为04.00秒。
答案 0 :(得分:0)
您可能会看到在即将发布的3.7版本中修复的错误,其中最后一块音频样本无法写入磁盘。修复时间是2015年3月28日:
https://github.com/supercollider/supercollider/commit/73f779e
3.7还没有结束,但您可以从源代码构建或等待预发布。
一个明显的解决方法是使用比所需更长的文件,然后将其截断。