当前位置: 首页 > 知识库问答 >
问题:

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

幸鸿轩
2023-03-14

我想获取一个MIDI文件,读取它,然后将数据存储在某种数据结构中。通过这个网站,我找到了一种阅读该文件的简单方法,它就像一个符咒:

读取MIDI文件

现在我需要找到一种方法来获取输出并存储它。哈希映射似乎并不理想,因为键需要是唯一的,而类型对象列表似乎并不理想。我最好的选择是什么。我想我可能会把它输出到文本或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

现在我只需要找到存储这些信息的最佳方法。我可能应该解释一下“为什么”我也想这么做。我正在与另一位开发人员合作,他将获取这些数据,并使用蜡染(我对蜡染一无所知)将其显示在屏幕上。

谢谢大家的回复。。。今晚我会仔细看他们每个人。。。

共有1个答案

蒋骏
2023-03-14

阅读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的实现)。

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

 类似资料:
  • Hashmaps通常使用桶的内部数组(表)来实现。在通过键访问hashmap时,我们使用键类型特定(逻辑类型特定)的hash函数获得键的hashcode。然后我们需要将hashcode映射到实际的内部桶表索引。 有时,内部表可能会收缩和扩展,这取决于hashmap填充率。那么可能是散列码- 例如,我们的哈希函数返回32位无符号整数值 时刻A:内表容量为10000 时刻B:内工作台容量为100000

  • 哈希表(Hash Table,也叫散列表),是根据关键码值 (Key-Value) 而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。哈希表的实现主要需要解决两个问题,哈希函数和冲突解决。 哈希函数 哈希函数也叫散列函数,它对不同的输出值得到一个固定长度的消息摘要。理想的哈希函数对于不同的输入应该产生不同的结构,同时散列结果应当具有同一性(输出值尽

  • 哈希表也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术核心就是在内存中维护着一张巨大的哈希表。 学过Java对这个应该很熟悉,Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是 HashMap 、 Hashtable 、 LinkedHashMap 和 TreeMap ,类继承关系如下图所示: HashMap是Java程序员

  • 问题内容: 我想计算的不是字符串,而是整个数据结构的md5哈希。我了解执行此操作的方法的机制(调度值的类型,规范化字典键顺序和其他随机性,递归为子值等)。但这似乎是一种通常有用的操作,所以令我惊讶的是我需要自己动手操作。 Python中有一些更简单的方法来实现这一目标吗? 更新:建议使用酸洗,这是一个好主意,但是酸洗不能规范化字典的键顺序: 问题答案: bencode对字典进行排序,因此: 印刷品

  • 本文向大家介绍数据结构中的Robin-Hood哈希,包括了数据结构中的Robin-Hood哈希的使用技巧和注意事项,需要的朋友参考一下 在本节中,我们将了解什么是Robin-Hood哈希方案。这种散列是开放寻址的技术之一。这试图通过使用更公平的冲突解决策略来均衡元素的搜索时间。在尝试插入时,如果要在位置xi处插入元素x,并且已经在y j = x i处放置了元素y ,则两个元素中的较小者必须继续前进

  • 寻找将此C#代码转换为Java的帮助 我有字节数组,但需要帮助编码到BigInteger的转换。希望为Hadoop创建一个UDF; ////////////////////////////// 我的最后一段代码与SQL Server中的哈希字节匹配: