我编写了一个简单的 ADSR 合成器,允许用户输入仪器的参数,然后将其合成,使其数据可用于可视化或回放。我也使用了 44100 赫兹。
获得好看图像的关键是要意识到您不想为每个水平像素只绘制一次,而是为每个样本绘制一次。对于 0.2 秒的样本和 256 像素宽的画布,您需要将 8,820 个样本放入 256 像素中 - 每像素约 34 个样本。这似乎有点矫枉过正,但这是获得不会丢失数据的可视化的唯一方法。这也是获得类似于声音编辑程序中的图像的方法,例如 Audacity、Milkytracker 等。
这是一个踩镲鼓,Fmax > 10,000 Hz
编辑:添加图像以显示调用 closePath 不会添加从端点回到起点的线。
这是我使用的可视化代码:
function drawFloatArray(samples, canvas)
{
var i, n = samples.length;
var dur = (n / 44100 * 1000)>>0;
canvas.title = 'Duration: ' + dur / 1000.0 + 's';
var width=canvas.width,height=canvas.height;
var ctx = canvas.getContext('2d');
ctx.strokeStyle = 'yellow';
ctx.fillStyle = '#303030';
ctx.fillRect(0,0,width,height);
ctx.beginPath();
ctx.moveTo(0,height/2);
for (i=0; i<n; i++)
{
x = ( (i*width) / n);
y = ((samples[i]*height/2)+height/2);
ctx.lineTo(x, y);
}
ctx.stroke();
ctx.closePath();
canvas.mBuffer = samples;
canvas.onclick = function() { playSound(this.mBuffer, 44100, 50); };
}