0

我已经用纯 Lua 制作了一个 Midi 文件阅读器,我决定在 love2d 中制作一个可视化器,所以我首先通过循环播放音符并确定打开哪些音符,让它显示当前播放的音符。

效果很好,我一直在 300fps 左右,但后来我决定我想要一个有点像合成程序的预览,但我很难想出一种存储它们的好方法,这样我就不必循环遍历每个音符每个像素决定在未来(或过去)的时间哪些是开启的(这种方法使其以大约 15-30fps 的速度运行)。

我已经尝试制作一个以秒为单位的索引表和带有当前注释的值表,但我似乎无法使其工作。如果有人对我如何快速存储和访问变量中的这些注释有任何建议,我们将非常感谢您的帮助。(我也知道我可以使用 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 回答