我如何储存midi文件的音符,以便快速可视化?

我用纯Lua制作了一个Midi文件阅读器,然后我决定在love2d中制作一个可视化程序,所以我做了。首先我让它显示当前正在播放的音符,通过循环它们并决定哪些是打开的,效果还不错,我不停地得到约300fps。但是然后我决定我想要预览,就像synthesia程序一样,但是我很难想到一种好的方法来存储它们,这样我就不必为了决定哪些打开了而每个像素循环一次(这种方法让它以约15-30fps的速度运行)在未来(或过去)的时间内。我已经尝试过制作一个带有秒数索引和当前打开音符的值表的表格,但我似乎无法使其工作。如果有人有关于如何快速存储和访问这些音符的建议,你的帮助将不胜感激(我知道我可以使用C或C ++或库,但我想用纯Lua制作一个)。音符目前存储在只按轨道顺序而不按时间顺序的音符表中,如track1note1,track1note2,track1note3,track2note2等...表格结构如下:

点赞
用户3080396
用户3080396

我很难想出一个好的方法来存储它们,以便我不必为每个像素循环遍历每个注释。

如果按照每个音符循环每个像素怎么样?您的第一个解决方案看起来很好,例如:

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

    - 在此处绘制音符编号“i”,
    - 强调相应的钢琴键等。

    -- 如果当前音符完全不在屏幕上,就中断循环
end

由于您提到表按时间顺序排序,通过仔细选择“开始”索引,您将仅绘制所需的注释。

针对原始问题,您可以通过将每个音符属性分组到其自己的表中来减少内存使用量。这_可能_会节省一些性能。例如。

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

尽管如此,如果您正在寻找更深入的内容,应该看一下区间树

2014-02-11 19:13:26