json和midi 文件互相转换
将MIDI文件转换为JSON格式的乐谱数据并保存到文件中。然后将JSON格式的乐谱数据解析为MIDI文件。
首先,导入所需的库。包括music21用于处理音乐数据,json用于读取和写入JSON文件,以及Fraction用于处理音符的持续时间。
import music21 as ms21
import json
from fractions import Fraction
接下来,编写一个函数将JSON格式的乐谱数据转换为MIDI文件。
def json_to_midi():# 从JSON文件中读取乐谱数据with open('a_0.json', "r", encoding="utf-8") as f:data = json.load(f)# 创建一个乐谱流s = ms21.stream.Stream()for one_midi in data["data"]:# 如果是休止符,添加一个休止符到乐谱流if type(one_midi[0]) == str:s.append(ms21.note.Rest())# 如果是单个音符,添加一个音符到乐谱流elif type(one_midi[0]) == int:s.append(ms21.note.Note(one_midi[0], duration=ms21.duration.Duration(Fraction(one_midi[1]))))# 如果是和弦,添加一个和弦到乐谱流else:note_list = []total_duration = Fraction("0")for i in one_midi:total_duration += Fraction(i[1])one_note = ms21.note.Note(i[0], duration=ms21.duration.Duration(Fraction(i[1])))note_list.append(one_note)s.append(ms21.chord.Chord(notes=note_list, duration=ms21.duration.Duration(total_duration)))# 将乐谱流写入MIDI文件s.write("midi", "s.mid")
然后,编写一个函数将MIDI文件转换为JSON格式的乐谱数据并保存到文件中。
def midi_to_json(file_name="s.mid"):# 解析MIDI文件s = ms21.converter.parse(file_name)# 获取每个音符的持续时间和音高note_list = []for note in s.flat.notesAndRests:# 如果是休止符,将"r"添加到乐谱数据中if isinstance(note, ms21.note.Rest):note_list.append(["r"])# 如果是单个音符,将音高和持续时间添加到乐谱数据中elif isinstance(note, ms21.note.Note):note_list.append([note.pitch.midi, str(note.duration.quarterLength)])# 如果是和弦,将和弦中每个音符的音高和持续时间添加到乐谱数据中else:chord_list = []for c_note in note.notes:chord_list.append([c_note.pitch.midi, str(c_note.duration.quarterLength)])note_list.append(chord_list)# 将乐谱数据写入JSON文件with open("a_1.json", "w", encoding="utf-8") as f:json.dump({"data": note_list}, f)
最后,调用函数将MIDI文件转换为JSON格式的乐谱数据并保存到文件中。
if __name__ == '__main__':midi_to_json()
以上是将MIDI文件转换为JSON格式的乐谱数据以及将JSON格式的乐谱数据解析为MIDI文件的代码实现。 您可以根据需要修改文件名和路径。
import music21 as ms21
import json
from fractions import Fraction
def json_to_midi():with open('a_0.json', "r", encoding="utf-8") as f:data = json.load(f)# 创建一个乐谱流s = ms21.stream.Stream()for one_midi in data["data"]:if type(one_midi[0]) == str:s.append(ms21.note.Rest())elif type(one_midi[0]) == int:s.append(ms21.note.Note(one_midi[0], duration=ms21.duration.Duration(Fraction(one_midi[1]))))else:note_list = []total_duration = Fraction("0")for i in one_midi:total_duration += Fraction(i[1])one_note = ms21.note.Note(i[0], duration=ms21.duration.Duration(Fraction(i[1])))note_list.append(one_note)s.append(ms21.chord.Chord(notes=note_list, duration=ms21.duration.Duration(total_duration)))s.write("midi", "s.mid")
def midi_to_json(file_name="s.mid"):s=ms21.converter.parse(file_name)# 获取持续的时间每个音符note_list=[]for note in s.flat.notesAndRests :if isinstance(note, ms21.note.Rest):note_list.append(["r"])elif isinstance(note,ms21.note.Note):note_list.append([note.pitch.midi,str(note.duration.quarterLength)])# 取和弦else:chord_list=[]for c_note in note.notes:chord_list.append([c_note.pitch.midi,str(c_note.duration.quarterLength)])note_list.append(chord_list)with open("a_1.json","w",encoding="utf-8") as f:json.dump({"data": note_list}, f)if __name__ == '__main__':midi_to_json()
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
