【问题标题】:How would I store notes from a midi file so that I can visualize them quickly?我将如何存储来自 midi 文件的笔记,以便我可以快速将它们可视化?
【发布时间】:2014-02-12 09:56:07
【问题描述】:

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

效果很好,我一直在 300 fps 左右,但后来我决定我想要一个有点像合成程序的预览,但我很难想出一种存储它们的好方法,这样我就不必循环了通过每个像素的每个音符来决定在未来(或过去)的时间哪些是打开的(这种方法使其以大约 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...
}

【问题讨论】:

  • 如果你愿意,我可以提供代码或部分代码。

标签: lua love2d


【解决方案1】:

我很难想出一种存储它们的好方法,这样我就不必循环遍历每个音符每个像素

每个音符循环遍历每个像素怎么样?你的第一个解决方案对我来说很好:

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...
}

不过,如果您正在寻找更多相关内容,您应该查看interval trees

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多