将MIDI转换为Java数据结构(列表,哈希映射,???)

5
我想获取一个MIDI文件,读取它,然后将数据存储在某种数据结构中。使用这个网站我找到了一种读取文件的简单方法,非常好用:Reading MIDI Files。现在我需要想办法获取该输出并存储它。哈希映射似乎不是理想的选择,因为键需要唯一,并且对象类型列表也不太好。有什么想法吗?我想可能会将其输出到文本或csv文件中...有何想法吗?
更新:以下是我已经得到的输出(通过System.out.println):
@0 Channel: 1 Note on, E5 key=76 velocity: 127
@192 Channel: 1 Note off, E5 key=76 velocity: 64
@192 Channel: 1 Note on, D#5 key=75 velocity: 127
@384 Channel: 1 Note off, D#5 key=75 velocity: 64
@384 Channel: 1 Note on, E5 key=76 velocity: 127

现在我只需要找到最好的存储这些信息的方法。我应该明确“为什么”我正在尝试做这件事。我正在与另一位开发人员合作,他将获取这些数据并使用我不了解的Batik在屏幕上显示它。
感谢所有回复...今晚我会仔细查看每一个回复...

1
首先,你需要考虑所需的对象和方法,我认为,在考虑数据结构之前。你的问题中有哪些名词和动词? - Hovercraft Full Of Eels
如果你只是想输出 CSV,那就直接输出 CSV 吧。为什么要先将它放入数据结构,然后再输出 CSV 呢? - BillRobertson42
气垫船,我编辑了我的问题以展示更多细节。我猜我的问题的名词和动词会是MIDI事件(Note On,Note Off,Velocity,Track等)和“存储”或“写入”。关于名词,我已经生成了所需的输出...我只是不确定在实现动词方面最好的选择是什么... - user2745258
1个回答

4

阅读MIDI文件规范,我认为您可以开始创建任何内容

public class MIDIFile {
    enum FileFormat {
        single_track,
        syncronous_multiple_tracks,
        assyncronous_multiple_tracks;
    }

    FileFormat file_format;
    short numberOfTracks;
    short deltaTimeTicks;

    //Create Class for tracks, events, put some collection for storing the tracks, 
    //some collection for storing the events inside the tracks, etc

    //Collection<Integer, MIDITrack> the type of Collection depends on application

}

public class MIDITrack {
    int length;
    //Collection<MIDIEvent> the type of Collection depends on application
}

public class MIDIEvent {
    int delta_time;
    int event_type;    //Use of enum or final variables is interesting
    int key;
    int velocity;
}

如果您只想存储MIDI消息(而不是MIDI文件),您可以为消息创建一个类。
public class MIDIEvent {
    int delta_time;
    int channel;
    int event_type;    //Use of enum or final variables is interesting

    //two bytes, interpret according the message type
    byte byte0;
    byte byte1;

    //or more memory consuming
    byte key;
    byte pressure;
    byte controller;
    short bend;
}

您所使用的集合类型将根据应用程序具体情况而定,取决于您如何访问列表中的元素以及其他因素。

如果您只想将MIDIMessages插入到集合中并从头到尾读取,则可以使用LinkedList(这是List的一种实现)。 但如果您想修改消息并通过索引访问元素,则应使用ArrayList(也是List的一种实现)。

MIDI文件结构的信息来自http://faydoc.tripod.com/formats/mid.htm


迭戈,除非我在未来看到其他更好的选择,否则我想我会选择ArrayList选项。当我把这个东西搞定了,我会发布我的代码。感谢你在回答中额外付出的努力...非常详细和有帮助。 - user2745258

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接