我在纯Lua中制作了一个Midi文件阅读器,我决定在love2d中制作一个可视化器,所以我先做了一下,然后通过循环显示当前正在播放的音符并决定哪些音符正在播放。< / p>
这很好用,我经常得到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...
}
答案 0 :(得分: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属性分组到自己的表中来减少内存使用量。此可能会获得轻微的性能提升。例如
note_table = {
t0 = { ... },
t1 = { ... },
note = { ... },
-- etc...
}
尽管如此,如果您正在寻找更多参与的内容,您应该查看interval trees。