我正在尝试用tone.js绘制我的音频波形
// setup
const wave = new Tone.Waveform()
Tone.Master.connect(wave)
// later
wave.getValue() // returns an array (length 1024) of numbers between -1 and 1这很好,只是我很难理解这些数字代表的是什么。我假设它们是随着时间的推移波动的振幅,但如果是这样的话,它们到过去有多远呢?
或者我完全误解了一些事情,无论是哪种情况,如果你能给我一些解释,我会很感激!
文档非常简短,可以找到这里,它的内容如下:
获取音频源的波形。将长度大小的波形数据作为Float32Array返回,其值介于-1和1之间。
发布于 2022-10-27 13:37:55
这真的很有趣!由于我对音频API不太熟悉,所以我遵循了Tone.js的源代码来揭示它的含义。
代码中的Tone.Waveform属性是new Tone().Waveform,它包含.getValue()的实现。
// https://github.com/Tonejs/Tone.js/blob/053b5d4397b595ea804b5d6baf6108158c8e0696/Tone/component/analysis/Waveform.ts#L43-L45
// Waveform.ts
class Waveform extends MeterBase {
// ...
/**
* Return the waveform for the current time as a Float32Array where each value in the array
* represents a sample in the waveform.
*/
getValue(): Float32Array {
return this._analyser.getValue() as Float32Array;
}
}Waveform._analyser属性来自MeterBase。用分析器实现._analyser属性
// https://github.com/Tonejs/Tone.js/blob/053b5d4397b595ea804b5d6baf6108158c8e0696/Tone/component/analysis/MeterBase.ts
// MeterBase.ts
class MeterBase {
// ...
protected _analyser: Analyser;
}看看Analyser.ts,就会发现getValue()来自analysers[x].getFloatTimeDomainData()。现在我们有了一条线索,getValue()似乎是一些浮点信号的时间序列数据。
// https://github.com/Tonejs/Tone.js/blob/b1526c357854d8017765328bd1278a91d1e14e50/Tone/component/analysis/Analyser.ts#L17-L21
// Analyser.ts
/**
* Wrapper around the native Web Audio's [AnalyserNode](http://webaudio.github.io/web-audio-api/#idl-def-AnalyserNode).
* Extracts FFT or Waveform data from the incoming signal.
* @category Component
*/
class Analyser {
// ...
private _analysers: AnalyserNode[] = [];
}analysers是AnalyserNode数组的包装器,如注释中所述。
链接的W3C官方AnalyserNode文档结果表明,.getFloatTimeDomainData()是分贝(DB)时间序列数据的blackman窗口和傅里叶变换的结果。这份文件有更详细的内容。如果你对它感兴趣,请检查一下。
简单地说,这是一个关于分贝(DB)随时间变化的规范化数据。我相信dB使用1024和-1 ~1的规范化时间框架来节省内存。在本质上,波形有曲线形式,可以用数学表达式优雅地压缩。因此,在理论上,它没有明确的界限,因为一切都可以归一化,但它可能会失去一些质量的归一化率(平滑)。
我个人认为,Tone.js的文档作者在简化getValues()含义方面做得很好。它只是解释了它是什么,它可以是什么在一个简短的句子,而不是做不必要的讲座。对于一些人来说,它可能需要更详细的说明,但我认为任何使用WebAudio的人都可能理解它是什么。
感谢霍夫带来了这么棒的问题。
https://stackoverflow.com/questions/74131456
复制相似问题