0

私は純粋なLuaでMidiファイルリーダーを作成し、love2dでビジュアライザーを作成することにしました。そのため、最初に、現在再生中のノートをループして表示し、どのノートがオンになっているかを判断しました。

それはうまくいき、私は常に約300fpsを達成しましたが、合成プログラムのようなプレビューが必要だと決めましたが、各ノートをループする必要がないようにそれらを保存する良い方法を考えるのに苦労しています.ピクセルごとに、将来 (または過去) の時点でオンになっているものを決定します (この方法では、約 15 ~ 30 fps になります)。

秒単位の時間としてインデックスを持つテーブルと、現在オンになっているメモを含む値テーブルを作成しようとしましたが、うまくいかないようです。変数からこれらのメモをすばやく保存してアクセスする方法について誰か提案があれば、本当に助かります。(また、CまたはC ++またはライブラリを使用できることは知っていますが、純粋なLuaで作成したいです)

メモは現在、track1note1、track1note2、track1note3、track2note2 などのように、トラックごとに時系列順にのみあるメモのテーブルに保存されています。

テーブルはこのように構成されています

    table = {
--{start time(in seconds),end time(in seconds),note,track,velocity}, note1
{0.00043,1.387289,44,1,127},--note2
--etc...
}
4

1 に答える 1

0

ピクセルごとに各メモをループする必要がないように、それらを保存する良い方法を考えるのに苦労しています

ノートごとに各ピクセルをループするのはどうですか? あなたの最初の解決策は私にはうまく見えます:

for i = start, #note_table do
    local t0, t1, note, track, vel = unpack(note_table[i])

    -- break the loop if the current note is fully off-screen

    -- draw the note number 'i' in here,
    -- highlight the corresponding piano key, etc.
end

表は時系列でソートされているとおっしゃっていたので、startインデックスを慎重に選択することで、必要なメモだけを描画できます。

元の質問に対処すると、各メモ属性を独自のテーブルにグループ化することでメモリ使用量を減らすことができます。これにより、パフォーマンスがわずかに向上する可能性があります。例えば。

note_table = {
    t0   = { ... },
    t1   = { ... },
    note = { ... },
    -- etc...
}

それにもかかわらず、より複雑なものを探している場合は、インターバル ツリーを参照してください。

于 2014-02-11T19:13:26.723 に答える