如何将数值列表/数组转换为MIDI文件?
将数值列表转换为MIDI文件的实用方案
针对你的需求,推荐用Python的MIDIUtil库来实现,它轻量易用,适合音频领域新手快速生成MIDI文件。
步骤1:安装依赖
先通过pip安装库:
pip install midiutil
步骤2:编写转换代码
你的时长列表以秒为单位,我们可以结合MIDI的速度(BPM)把秒数转换成MIDI的时长单位(四分音符)。下面是完整代码,默认用C大调中音区音符,你可以根据需求修改音高:
from midiutil import MIDIFile # 你的时长列表(单位:秒) note_durations = [0.93, 0.12, 0.84, 0.98, 1.23, 1.04] # 自定义音高列表(MIDI音高范围0-127,60是中央C) note_pitches = [60, 62, 64, 65, 67, 69] # 设置MIDI参数 track = 0 channel = 0 time = 0 # 起始时间(以四分音符为单位) tempo = 120 # 速度,BPM(四分音符每分钟120个) volume = 100 # 音量0-127 # 创建MIDI文件对象 midi = MIDIFile(1) # 1个音轨 midi.addTempo(track, time, tempo) # 遍历时长和音高,添加音符 for pitch, duration_sec in zip(note_pitches, note_durations): # 把秒数转换成四分音符时长:BPM=120时,1四分音符=0.5秒 duration_quarter = duration_sec / (60 / tempo) midi.addNote(track, channel, pitch, time, duration_quarter, volume) # 更新下一个音符的起始时间 time += duration_quarter # 保存MIDI文件 with open("output.mid", "wb") as output_file: midi.writeFile(output_file)
代码说明
- 如果你没有指定音高,可以统一用固定值(比如全用60即中央C),只需要把
note_pitches改成[60]*len(note_durations) tempo(速度)会影响实际播放时长,你可以根据需求调整,比如tempo=60时,1四分音符=1秒- 生成的
output.mid可以用任何MIDI播放器打开验证
备选方案:pretty_midi
如果你需要更复杂的MIDI编辑功能,可以用pretty_midi库,安装命令:
pip install pretty_midi
简单示例代码:
import pretty_midi # 初始化MIDI对象 pm = pretty_midi.PrettyMIDI(initial_tempo=120) # 创建一个乐器轨道 piano = pretty_midi.Instrument(program=pretty_midi.instrument_name_to_program('Acoustic Grand Piano')) time = 0.0 # 遍历时长列表添加音符 for duration_sec in [0.93, 0.12, 0.84, 0.98, 1.23, 1.04]: # 创建音符,音高默认中央C(60),时长秒为单位 note = pretty_midi.Note(velocity=100, pitch=60, start=time, end=time+duration_sec) piano.notes.append(note) time += duration_sec # 添加乐器到MIDI对象 pm.instruments.append(piano) # 保存文件 pm.write("output_pretty.mid")
内容的提问来源于stack exchange,提问作者Megan
相关产品推荐
相关产品推荐

