📜  p5.js |波形()函数(1)

📅  最后修改于: 2023-12-03 15:03:27.304000             🧑  作者: Mango

P5.js 波形函数

P5.js 波形函数是一个用于绘制波形的函数,能够创建出各种形状和类型的波形,并可作为交互式的可视化元素。

语法
waveform(buffer, w, h);

参数说明:

  • buffer: 必须。一个 Float32Array 类型的数组,表示波形数据采样点的值;
  • w: 可选。波形的宽度(像素);
  • h: 可选。波形的高度(像素)。
返回值

该函数没有返回值,直接将波形绘制到画布上。

基本用法

setup() 函数中先创建一个具有固定采样率的 AudioContext:

let audioCtx = new AudioContext();

然后创建一个 AnalyserNode 来分析当前音频:

let analyser = audioCtx.createAnalyser();

接下来,我们需要获取音频文件并读取其中的数据(前提是我们的音频文件需要和我们打算绘制的波形对应):

let xhr = new XMLHttpRequest();
xhr.open('GET', 'audio.ogg', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
  audioCtx.decodeAudioData(xhr.response,
    function(buffer) {
      let data = new Float32Array(buffer.getChannelData(0));
      waveform(data, 500, 200);
    });
}
xhr.send();

这个例子中,我们使用了 XMLHttpRequest 对象来获取音频数据,使用 AudioContext.decodeAudioData() 去解码获得的二进制数据,然后把它加载到 Float32Array 类型的数据中,最后将该数据传递给 waveform() 函数用来生成波形。

参数详解

waveform() 函数的全参数列表如下:

function waveform(buffer, w, h, color, bgcolor, lineColor, lineWidth, orientation, padding) { ... }
  • buffer: 必选。用于生成波形的 Float32Array 类型的数据,因为在大部分情况下,音频数据是在以 Float32 形式进行存储和处理的。
  • w: 可选。波形的宽度(以像素为单位)。
  • h: 可选。波形的高度(以像素为单位)。
  • color: 可选。波形的主颜色。
  • bgcolor: 可选。背景颜色。
  • lineColor: 可选。图线颜色。
  • lineWidth: 可选。波形的线宽。
  • orientation: 可选。波形的方向,该参数可以是 "horizontal" 或 "vertical"。
  • padding: 可选。波形的留白大小。
注意事项
  • waveform() 函数的参数列表中,buffer 是必选参数,其他参数都是可选的。
  • 如果没有设置 orientation 参数,该函数会默认生成一个水平(从左到右)方向的波形。
  • 如果你使用了 p5.js 库(例如上述代码片段),你应该在头部中导入该库:
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.3.0/p5.js"></script>
    
  • 如果你想修改波形的样式(例如,改变波形的颜色或宽度),可以通过修改参数进行调整。
示例
let audioCtx = new AudioContext();
let analyser = audioCtx.createAnalyser();
let xhr = new XMLHttpRequest();
xhr.open('GET', 'audio.ogg', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
  audioCtx.decodeAudioData(xhr.response,
    function(buffer) {
      let data = new Float32Array(buffer.getChannelData(0));
      waveform(data, 500, 200, "blue", "white", "green", 1, "vertical", 20);
    });
}
xhr.send();

该例子中,我们定义了一个采样率为 20Hz 的 AudioContext,并从远程读取音频文件、解码音频数据并创建一个 Float32Array 类型的数据流。最终,我们调用 waveform() 方法,用 blue 为波形设置了主颜色,将波形方向设置为 vertical,并设置波形的留白大小为 20 (以像素为单位)。