方法だけメモ。考察とかはブログの方で。
ローカル変数bufに音声データのテーブルが、sizeに実際に取得した配列のサイズが入る。
local buf = {} local size = 32 size = obj.getaudio(buf, "audiobuffer", "spectrum", size)
[レイヤー][いくつ前のデータか]を添え字としたグローバルな多次元配列を作り、波形データを記録する。
レイヤーを添え字としているのは複数同時に使用した場合に別々にデータを保持するため。オブジェクトごとに被らない数字を使うのであればレイヤーでなくてもよい。
「いくつ前のデータか」と同時にフレーム数も記録しているのは、動画作成時の再生チェックなどではコマ飛びが発生し、1つ前のデータが1フレーム前のデータとは限らないため。記録しておけば何フレーム飛んだか分かるため、描画にも生かせる。
--引き継ぎ用テーブル local ol = obj.layer inheritWaveform = obj.time~=0 and inheritWaveform or {} inheritWaveform[ol] = obj.time~=0 and inheritWaveform[ol] or {} local ibuf = inheritWaveform[ol] --音声データを取得 local buf = {} local size = 32 size = obj.getaudio(buf, "audiobuffer", "spectrum", size) --保持するデータ数 local limit = 10 --配列の一番最初に現フレームのデータを入れ、残りを後ろに1つずつずらす table.insert(ibuf, 1, {obj.frame, buf}) --ibuf の長さが limit より大きければ、後ろから削除していく for i=1, #ibuf-limit do table.remove(ibuf) end --使い方 --ibuf[いくつ前のデータか][1:データのフレーム番号, 2:データ] ibuf[1][1] --最新のデータのフレーム番号(=obj.frame) ibuf[4][1] --3つ前に処理したデータのフレーム番号 ibuf[1][2] --最新の音声データの配列 ibuf[5][2][32] --4つ前の音声データ配列の32番目の周波数帯域の音量
整数値を、その整数値が文字コードとなる文字列に変換した方が容量を節約できるが、少々面倒。