在这篇文章中,我们将一起了解两个强大的Python库:midiutil和orjson。midiutil用于轻松地生成MIDI文件,使音乐创作变得简单和直观,而orjson则是一个快速且高效的JSON序列化库。通过将这两个库结合,我们能够创造出音乐数据的结构化表示,进行更为复杂的音乐应用,例如生成MIDI文件中的音符信息并将其以JSON格式存储、加载并处理音乐文件等。
了解这两个库的基本功能后,我们可以看看它们如何结合使用,以实现一些有趣的项目。首先,我们可以生成一个包含和弦的MIDI文件,并将这些和弦的信息保存成JSON格式;接下来,我们可以从JSON文件中读取和弦信息并创建一个MIDI文件;最后,还可以对MIDI文件中的音符数据进行修改,并将其更新回JSON文件中。这几个项目听起来很有趣吧?
让我们先来看看第一个示例:使用midiutil生成一个MIDI文件,并保存和弦信息为JSON格式。我们需要首先安装这两个库,如果还没有安装,可以用下面的命令来安装:
pip install midiutil orjson
好,我们开始代码吧!看这种生成及保存的方式。
import jsonfrom midiutil import MIDIFileimport orjsondef create_midi_with_chords(filename): midi = MIDIFile(1) midi.addTrackName(0, 0, "Chords") midi.addTimeSignature(0, 0, 4, 2, 24) chords = [ [60, 64, 67], # C大三和弦 [62, 65, 69], # D大三和弦 [64, 67, 71] # E大三和弦 ] times = [0, 1, 2] # 和弦演奏的时间点 for time, chord in zip(times, chords): for pitch in chord: midi.addNote(0, 0, pitch, time, 1, 100) # 1秒的音符 with open(filename, "wb") as output_file: midi.writeFile(output_file) # 保存和弦信息为JSON with open("chords.json", "wb") as json_file: chord_data = {"chords": chords} json_file.write(orjson.dumps(chord_data))create_midi_with_chords("output.mid")
这里我们创建了一个MIDI文件,并生成了三个和弦(C大三和弦、D大三和弦和E大三和弦)。接着,和弦信息被保存为JSON格式,方便后续处理。这种方式的好处在于,可以使我们清晰明了的知道音符的信息。
接下来,我们来看看第二个示例:从JSON文件读取和弦信息,然后根据这些信息生成MIDI文件。我们可以用简单的代码示例来实现。
import jsonfrom midiutil import MIDIFileimport orjsondef read_chords_from_json(filename): with open(filename, "rb") as json_file: data = orjson.loads(json_file.read()) return data['chords']def create_midi_from_json(json_filename, midi_filename): chords = read_chords_from_json(json_filename) midi = MIDIFile(1) midi.addTrackName(0, 0, "Chords") midi.addTimeSignature(0, 0, 4, 2, 24) times = [0, 1, 2] for time, chord in zip(times, chords): for pitch in chord: midi.addNote(0, 0, pitch, time, 1, 100) with open(midi_filename, "wb") as output_file: midi.writeFile(output_file)create_midi_from_json("chords.json", "output_from_json.mid")
这个例子中,我们先从JSON文件中读取和弦信息,然后创建一个MIDI文件。所用的逻辑和之前类似,只不过这里我们借助了orjson来高效地读取数据。这种处理方式让我们把音乐与数据结合得更加方便,让编程与音乐创作互相辉映。
最后,让我们看看如何修改一定的MIDI文件中的音符数据,并将其结果返回为更新后的JSON文件。这个示例将演示如何读取MIDI文件的音符信息,将其格式化输出为JSON格式。
from midiutil import MIDIFileimport orjsondef extract_notes_to_json(midi_filename, json_filename): midi = MIDIFile() midi.read(midi_filename) notes_list = [] for track in range(midi.getNumTracks()): for msg in midi.getTrack(track): if msg.type == 'note': notes_list.append({ "note": msg.note, "time": msg.time, "duration": msg.duration }) notes_data = {"notes": notes_list} with open(json_filename, "wb") as json_file: json_file.write(orjson.dumps(notes_data))extract_notes_to_json("output.mid", "notes.json")
如果在输出中发现音符表现不正常或者数据有误,可能是因为MIDI文件格式的不匹配或解析问题,可以尝试更新库版本,或查阅相关文档进行更深的理解。总而言之,要准确有效地提取和处理MIDI数据。
整合这三个示例我们对midiutil和orjson的组合使用得到了更深入的体验。从生成MIDI文件,存取和弦信息到从MIDI中提取信息,再保存为JSON格式。
随着时间的推移,音乐技术的不断发展,上述代码示例展现了如何利用Python构建音乐相关数据的基础。同时,结合使用midiutil与orjson的功能,可以让音乐创作与数据交换变得更高效便捷。
如果这篇文章引发了你的兴趣,有什么问题想讨论,或者对某个部分有疑问,欢迎留言与我交流。你的一句话就是我不断创作的动力哦!希望本次学习你能收获满满,期待下次见面,加油!