问题标签 [mido]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
midi - 从 MIDI 轨道弹出消息
我有类型 0 的 MIDI 文件,包含只有 269 个元消息的轨道,我想保留标题块和文件末尾的最后一个。
上面的代码,没有这样做。事实上,它恰好删除了一半的消息(其中 135 条),它还删除了开头和结尾,我必须运行它几次才能让它接近 10 条元消息!
图书馆说:
pop([index]) → item -- 删除并返回索引处的项目(默认最后一个)。如果列表为空或索引超出范围,则引发 IndexError。
我也尝试了另一种方法,但同样,每次只删除一半。所以我需要多次运行循环以使其接近我想要的大小:
请问我做错了什么?
python - Music21:获取音符的曲目索引
我有一个用music21 阅读的多轨midi 文件:
我想弄清楚这个流中的每个音符属于哪个轨道。例如,当我在 GarageBand 中打开文件时,音符被组织成轨道:
在mido
中,每个MidiFile
都有一个tracks
属性,其中包含每个轨道的一个音符列表。
有没有办法让music21得到同样的结果?任何帮助,将不胜感激!
python - 在 midi 文件中编辑消息而不重新编码
我正在使用 mido 库。我有一个 midi 文件,我想更改它的消息。我不想使用该Message()
函数对消息进行编码,因为我已经将它编码为以下形式:<message note_on channel=0 note=44 velocity=64 time=0>
。我试过把它附加到轨道上,但它把它作为字符串而不是消息读取,所以它不起作用。
python - 无法使用“Set_Tempo”更改 midi 中的速度
我正在尝试使用速度轨道的 MetaMessage('set_tempo', tempo=tempo, time=tiem) 属性来更改 midi 文件中的速度。将初始速度设置为 552528 且时间 = 0 时,bpm 正确设置为 108.59178。但是,当我将速度设置为 552540 时,bpm 保持在 108.59178,而它应该是 108.5894。设置为相似的速度时似乎存在类似的差异,是否有导致这种情况的 midi 设置?我正在加载 midi 进行测试的程序是 Pro Tools。midi ticks_per_beat 为 9600,可在此处获得:https ://ufile.io/jhz771gh
我不知道从这里去哪里或如何进一步测试,因此将不胜感激。
python - 如何从具有元组集和列表的现有字典创建嵌套字典
我已经解析了一个 midi 文件,并且我已经成功地得到了一个按乐器分解的音符字典。下面是一个简短的例子,note_dict
为了这个问题的目的而被截断。
我的最终目标是拥有一个嵌套字典,为我提供曲目名称,然后将每个可能的音符作为键,然后将所有可能的“下一个”音符列表作为值。目的是将其用作Foxdot 中的马尔可夫链,这是一个用于音乐生成的 python 接口。
它应该看起来像:
这是我所拥有的一个例子:
这给了我以下内容,其中第一组是所有不同的音符,元组列表是一对(note, next note)
,最后一个列表只是按顺序排列的原始音符列表。
我希望集合的元素充当键,并且当元组的第一个元素与集合的元素匹配时,它被添加到与键关联的值列表中。
基于note_dict
上述,我想要的最终结果是:
尽管如此,我并没有被锁定在我需要使用的方法中note_dict_updated
。如果有更聪明的方法可以note_dict
达到我想要的最终结果,我很想听听。
编辑:我已经更新了我的问题。第一个答案适用于我的初始示例,但我相信当每个值中的注释列表重叠时会出现问题。希望我更新后的预期最终结果会更有帮助。
python - python mido如何在列表中获取[note,starttime,stoptime,track]?
我需要以下帮助:我正在设计一个新的乐谱。我想读取一个 MIDI 文件并获得一个包含每个音符/开始-停止-时间/曲目的列表。期望的结果:
*更新 1 - 获取 [note, note_on(time), note_off(time), channel]
以下代码创建一个字典,其中增量时间转换为线性时间(但我不确定这是否是正确的方法):
我现在找不到正确的问题,但目标是:
对于每个音符。但问题是有两条消息(音符开/关),我想把它变成一个。如果我找到它,我会发布我的解决方案。(或者也许有人知道 mido 库的一个非常简单的技巧来做到这一点......)
python - 为什么每拍的滴答声很大,而时间却很小?
我的 midifile 看起来像这样:
时间都是非常小的数字,但每拍的滴答声(tpb)是“384”。我在任何地方都读到“时间”数字以“滴答”(midi 中最小的时间单位)表示,所以我希望时间会是更大的数字。我指的是 Mido(readthedocs)。当他们说:
'时间是增量时间(以刻度为单位)'
在这种情况下,第一个音符应该在时间=192(季度=384/2),但它在 0.20833324999999997。我怎么了?
我确实理解增量时间的概念,但我不明白 tpb 与“时间”的关系。
python - Python 中的 MIDI 消息令人困惑?
我目前正在研究 MIDI 数据集 maestro-v2.0.0(请参阅参考资料)。
我在 python 中加载我的文件,from mido import MidiFile
然后我处理数据集中的文件(例如 on 2009/MIDI-Unprocessed_07_R1_2009_04-05_ORIG_MID--AUDIO_07_R1_2009_07_R1_2009_04_WAV.midi
)。
如果我根据时间对事件开启(这里的速度不为零)消息进行排序,那么我得到(对于前 10 条消息):
如您所见,在第一时间播放了多个音符。
同时,我发现这些note_on
事件的音高与velocity=0
. 我在某处读到note_on
了velocity=0
对应于事件关闭标记的地方,即释放了注释。
我只是想知道发生了什么,为什么我的数据看起来如此“丑陋”?当我说丑陋时,我的意思是为什么要包含未播放的 MIDI 文件注释。如果在时间有一个note_on
事件,但同时有一个相同音高的事件,则不会播放一个音符t
velocity>0
note_on
velocity=0
. 这些不必要的消息可以简单地省略,我们不需要说没有播放一个音符。这就是在 midi 文件中发生的事情(关于我的代码)。我希望我的意思很清楚。
我的代码可以在这里检查
我的目标是将数据表示如下。如果对于给定的时间戳t,音高p_1, ..., p_k以速度v_1,...,v_k播放,那么我通过说p_i定义向量- 第条目是播放该音高的持续时间,而2p_i -th 条目是速度,最后一个条目是为时间t保留的。
mido - MIDO:ValueError:变量 int 必须是正整数
在我的代码中,我得到
我想我正在 MIDO 上运行最新版本。
做错了什么?
任何帮助将不胜感激。
python - 如何使用 QFileDialog 打开带有 .mid 后缀的文件
我为打开文件的选项创建了一个子类。除了 PYQT5,我还导入了 python 库 Mido 和 py-midi 以读取 MIDI 文件。如果我的逻辑是正确的。我将使用 PYQT5 的 FileDialog 来检索文件,将其分配给一个变量,然后使用 Mido 读取该 MIDI 文件,然后我将使用 py-midi 编辑这些文件
我已将 OpenedFile 注释掉,因为我计划将其用作链接到打开文件的变量。但是,我不确定如何在 PYQ5 中做到这一点。此外,如何使用特定的文件扩展名执行此操作。