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と小節は事前に投稿して確認しています。私は期間を投稿します、すべてが正しいようです。レンダリングが終了し、ファイルの持続時間が正しくありません。
- バーが 4 のファイル BPM=70 _13.71 秒のはずですが、11.71 秒の長さです。
- バーが 8 のファイル BPM=70 _本来は 27.42 秒ですが、長さは 23.43 秒です。
- バーが 4 のファイル BPM=140 は 06.85 秒のはずですが、長さは 02.94 秒です。
バーが 8 のファイル BPM=140 は 13.71 秒のはずですが、長さは 05.87 秒です。
バーが 4 のファイル BPM=120 は 08.00 秒のはずですが、長さは 04.00 秒です。
- バーが 8 のファイル BPM=120 は 16.00 秒のはずですが、長さは 08.00 秒です。
- バーが 4 のファイル BPM=150 は 06.40 秒のはずですが、長さは 02.56 秒です。
- バーが 8 のファイル BPM=150 は 12.80 秒のはずですが、長さは 05.12 秒です。