我们想建立一个wav文件与多个频率为指定的持续时间为每个频率。
我将尝试解释使用情形
假设我们需要构建一个wav文件,前5秒的频率范围为150 MHz到200 MHz(从频率150 MHz、150.1MHz、150.2MHz、最高200 MHz应在5秒内结束)接下来的10秒应该从200 MHz到300 MHz接下来的15秒应该从300 MHz到400 MHz一旦生成了所有3个wav文件,我们需要合并/concat所有这些3到一个30秒的单一wav文件(5+10+15)
任何人都可以让我们知道我们如何才能实现这一点。
我的代码:
var tone = require('tonegenerator');
var header = require('waveheader');
var fs = require('fs');
let startFrequency = 2000000;
let stopFrequency = 6000000;
let totalsteps = (stopFrequency- startFrequency) * 10;
let start_freq_1 = startFrequency * 1 + 0.1;
start_sec = 0;
stop_sec = 10;
let secdiff = stopFrequency - startFrequency;
let timediff = Math.round((secdiff / totalsteps) * 10000) / 10000;
var file = fs.createWriteStream('hello_2.wav')
var t =[];
var cycle = Math.floor(44100000/stopFrequency);
var samplesLeft = 0.01 * 44100000;
var cycles = samplesLeft/cycle;
var first = tone({ freq: startFrequency, lengthInSecs: 0.01, volume: tone.MAX_16, rate: 44100000, shape: 'square' })
for(var i = start_freq_1; i < cycles; i+=0.1) {
var j = tone({ freq: i.toFixed(1), lengthInSecs: timediff, volume: tone.MAX_16, rate: 44100000, shape: 'square' })
t.push(j)
}
res = first.concat(...t);
file.write(header(res.length * 2, {
bitDepth: 32
}))
var data = Int32Array.from(res)
var size = data.length * 2 // 2 bytes per sample
if (Buffer.allocUnsafe) {
buffer = Buffer.allocUnsafe(size)
} else {
buffer = new Buffer(size)
}
data.forEach(function (value, index) {
buffer.writeInt16LE(value, index * 2)
})
file.write(buffer)
file.end()
1条答案
按热度按时间gblwokeq1#
问题与发送到音调函数的速率值有关,在tonegenerator index.js file中,我们可以看到
由于与频率相比,速率较低,当调用Math.floor()函数时,周期变为零。无法计算周期,因此程序挂起。
根据频率调整速率,使周期变量不为零,而是为正值。