我正在编写一个 JavaScript 程序,以根据音频数据将颜色流式传输到 Arduino/LED 灯条。具体来说,我正在创建一个 60 条的频率振幅音频频谱,其中每个条映射到我的条带中的一个 LED。我使用每个条的高度来确定 LED 的亮度。为此,我使用了一个混合了 johnny-5、node-pixel 和 p5 的库,名为 p5j5。我的理由是,这似乎是从音频中收集实时 FFT 数据的最简单方法。我用 60 盏灯每秒更新灯 30 次,因此每秒有 1800 个事件发送到我的 Arduino (Arduino Uno)。我无法通过批处理 LED 颜色变化事件来减少这种情况,因为节点像素似乎不支持这一点。传输速率太慢或处理器太慢,但在任何一种情况下都有严重的滞后。如果我只更新 15 个 LED,延迟将不再存在。
下面的代码包含了发送事件的所有逻辑。 'colorMap' 随歌曲更新,但它由我计算机的 CPU 处理并且在我创建音频频谱图时运行良好,所以我怀疑这是一个瓶颈。
function setup() {
p5.j5.events.on('boardReady', () => {
console.log('setting up', p5.j5.board);
strip = new p5.j5.nodePixel.Strip({
board: p5.j5.board,
controller: "FIRMATA",
strips: [ {pin: 6, length: numLeds}, ], // this is preferred form for definition
gamma: 0.9, // set to a gamma that works nicely for WS2812,
});
strip.on("ready", function() {
strip.color('#00ff00');
strip.show();
dynamicSet(30);
});
});
cnv = createCanvas(100, 100);
cnv.mouseClicked(() => {
toggleSong();
})
fft = new p5.FFT(fftSmoothing, fftBands);
}
function dynamicSet( delay ){
var foo = setInterval(async function(){
for(var i = 0; i < numLeds; i++) {
await strip.pixel(i).color(colorMap.get(i));
}
await strip.show();
}, 1000/delay);
}
我想知道有哪些更好的方法。是否有替代库/API 可以轻松地实时流式传输音频的 FFT,也许使用更高效的语言?我假设这最好是在 C++ 中,所以我可以使用这些库来发送事件数据,这可能比它们的 JS 对应物更有效。