def get_notes(): # """ # 从music_midi目录中的所有MIDI文件里读取note,chord # Note样例:B4,chord样例[C3,E4,G5],多个note的集合,统称“note” # """ notes = [] for midi_file in glob.glob("MID/*.mid"): # 读取MID文件夹中所有的mid文件,file表示每一个文件 stream = converter.parse(midi_file) # midi文件的读取,解析,输出stream的流类型 # 获取所有的乐器部分,开始测试的都是单轨的 parts = instrument.partitionByInstrument(stream) if parts: # 如果有乐器部分,取第一个乐器部分 notes_to_parse = parts.parts[0].recurse() # 递归 else: notes_to_parse = stream.flat.notes # 纯音符组成 for element in notes_to_parse: # notes本身不是字符串类型 # 如果是note类型,取它的音高(pitch) if isinstance(element, note.Note): # 格式例如:E6 notes.append(str(element.pitch)) elif isinstance(element, chord.Chord): # 转换后格式:45.21.78(midi_number) notes.append('.'.join(str(n) for n in element.normalOrder)) # 获取D盘根目录的绝对路径 root_path = os.path.abspath("D:/pythonProject") # 拼接要创建的文件夹路径 data_path = os.path.join(root_path, "data04") # 创建文件夹 if not os.path.exists(data_path): os.mkdir(data_path) # 将数据写入data01/notes with open(os.path.join(data_path, "notes"), 'wb') as filepath: pickle.dump(notes, filepath) return notes # 返回提取出来的notes列表
时间: 2024-02-14 21:11:16 浏览: 31
这是一个Python函数,用于从MIDI文件中提取音符和和弦,并将它们保存到一个列表中。该函数首先使用glob.glob()函数获取指定目录下的所有MIDI文件路径,然后使用music21库中的converter.parse()函数解析这些MIDI文件。接着,该函数使用instrument.partitionByInstrument()函数将乐器部分分离出来,然后从每个乐器部分中提取音符和和弦,并将它们保存到一个名为notes的列表中。最后,该函数使用pickle.dump()函数将notes列表保存到一个名为"notes"的二进制文件中,并返回notes列表。
相关问题
def create_music(prediction): # 生成音乐函数,训练不用 """ 用神经网络预测的音乐数据来生成mid文件 """ offset = 0 # 偏移,防止数据覆盖 output_notes = [] # 生成Note或chord对象 for data in prediction: # 如果是chord格式:45.21.78 if ('.' in data) or data.isdigit(): # data中有.或者有数字 note_in_chord = data.split('.') # 用.分隔和弦中的每个音 notes = [] # notes列表接收单音 for current_note in note_in_chord: new_note = note.Note(int(current_note)) # 把当前音符化成整数,在对应midi_number转换成note new_note.storedInstrument = instrument.Piano() # 乐器用钢琴 notes.append(new_note) new_chord = chord.Chord(notes) # 再把notes中的音化成新的和弦 new_chord.offset = offset # 初试定的偏移给和弦的偏移 output_notes.append(new_chord) # 把转化好的和弦传到output_notes中 # 是note格式: else: new_note = note.Note(data) # note直接可以把data变成新的note new_note.offset = offset new_note.storedInstrument = instrument.Piano() # 乐器用钢琴 output_notes.append(new_note) # 把new_note传到output_notes中 # 每次迭代都将偏移增加,防止交叠覆盖 offset += 0.5 # 创建音乐流(stream) midi_stream = stream.Stream(output_notes) # 把上面的循环输出结果传到流 # 写入midi文件 midi_stream.write('midi', fp='output24.mid')
这段代码是用来生成音乐的,输入是一个预测结果(prediction),通过循环遍历每个元素,如果是chord格式(如45.21.78),就把每个音符分离出来,将它们转换成note对象,再把这些note对象转换成一个新的chord对象,然后加入到output_notes列表中;如果是note格式,就直接把它转换成note对象,并加入到output_notes列表中。每次循环都会更新偏移量offset,保证音符不会重叠覆盖。最后把output_notes列表中的所有音符通过Stream对象转换成一个midi文件(output24.mid)。
def create_music(prediction): offset = 0 output_notes = [] for data in prediction: if ('.' in data) or data.isdigit(): note_in_chord = data.split('.') notes = [] for current_note in note_in_chord: new_note = note.Note(int(current_note)) # 把当前音符化成整数,在对应midi_number转换成note new_note.storedInstrument = instrument.Piano() # 乐器用钢琴 notes.append(new_note) new_chord = chord.Chord(notes) # 再把notes中的音化成新的和弦 new_chord.offset = offset # 初试定的偏移给和弦的偏移 output_notes.append(new_chord) # 把转化好的和弦传到output_notes中 # 是note格式: else: new_note = note.Note(data) # note直接可以把data变成新的note new_note.offset = offset new_note.storedInstrument = instrument.Piano() # 乐器用钢琴 output_notes.append(new_note) # 把new_note传到output_notes中 # 每次迭代都将偏移增加,防止交叠覆盖 offset += 0.5 midi_stream = stream.Stream(output_notes) midi_stream.write('midi', fp='output24.mid')
这段代码是一个函数,用于根据输入的prediction生成音乐。首先,它定义了一个偏移量(offset)和一个空列表(output_notes),用于存储生成的音符或和弦。然后,它循环遍历prediction中的每个元素。如果元素中包含'.'或者是数字,说明它是和弦格式,就将其中每个音符分离开来,将它们转换为Note对象,再将这些Note对象转换为Chord对象,并加入到output_notes列表中。如果元素不是和弦格式,说明它是单音符,就将它转换为Note对象,并加入到output_notes列表中。每次循环都会更新偏移量(offset)。最后,将output_notes列表转换为一个midi流(stream)对象,再将这个流对象写入到文件'output24.mid'中。