该代码主要实现了将json文件转换为字符串和将字符串转换为json文件的功能。
json_to_str()函数首先打开一个名为"a_0.json"的json文件,并使用json.load()函数将文件内容加载为一个字典。然后,将字典中的"data"键对应的值转换为字符串,并进行一系列替换操作,将字符串的格式调整为特定的形式,并返回最终得到的字符串数据。
str_to_json(data)函数首先对输入的字符串数据进行一系列替换操作,将字符串的格式调整为特定的形式。然后,使用re模块的正则表达式进行匹配,找到所有的分数形式,并将其转换为字符串形式。之后,将处理后的字符串数据以json格式保存到名为"a_1.json"的文件中,并返回转换后的字符串数据。
在代码的最后,调用了json_to_str()函数进行测试。
import json
import redef json_to_str():with open('a_0.json', "r", encoding="utf-8") as f:data = json.load(f)data = str(data["data"]).replace(".0", "").replace("'", "").replace("], [[", "#").replace("], [", "*").replace("]*","_").replace("]#", "-").replace("[[", "")return datadef str_to_json(data):data = "[[" + data.replace("-", "]#").replace("_", "]*").replace("*", "], [").replace("#", "], [[").replace("r","'r'")# 检测所有的分数for i in set(re.compile("\d+/\d").findall(data)):data = data.replace(i, "'{}'".format(i))for i in set(re.compile("\d+/\d\d").findall(data)):data = data.replace(i, "'{}'".format(i))for i in set(re.compile("\d+/\d\d\d").findall(data)):data = data.replace(i, "'{}'".format(i))with open("a_1.json", "w", encoding="utf-8") as f:json.dump({"data": eval(data)}, f)return dataif __name__ == '__main__':json_to_str()
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()