组合音符与数据:探寻midiutil与orjson的奇妙之旅

西西学代码 2025-03-18 14:44:02

在这篇文章中,我们将一起了解两个强大的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的功能,可以让音乐创作与数据交换变得更高效便捷。

如果这篇文章引发了你的兴趣,有什么问题想讨论,或者对某个部分有疑问,欢迎留言与我交流。你的一句话就是我不断创作的动力哦!希望本次学习你能收获满满,期待下次见面,加油!

0 阅读:0