for i in range(generate_length): output = model.predict(inputs[np.newaxis,:,:])[0] offsets = np.argmax(output[-len(offsets_vocab):]) offsets = Fraction(offsets_vocab[offsets]) n_notes = np.reshape(output[:len(offsets_vocab)*len(durations_vocab)],(len(offsets_vocab),len(durations_vocab))) n_notes = np.argmax(n_notes,axis=-1) for idx,note_durations in enumerate(n_notes): duration = Fraction(durations_vocab[note_durations]) cur_step = offsets + last_step if duration != 0: note = NoteClass.Note(notes_vocab[idx]) note.offset = cur_step note.duration = Duration(quarterLength=duration) #print(idx, note.offset,note.duration) notes_list.append(note) last_step = cur_step stream = Stream(notes_list) stream.write("midi","output_midi01.mid")
时间: 2024-03-30 22:33:27 浏览: 241
这段代码是一个用于生成 MIDI 音乐的函数。它的输入参数包括一个训练好的模型、输入序列和生成长度。函数通过输入序列生成一段长度为 generate_length 的 MIDI 音乐。具体实现过程如下:
1. 使用模型预测输出,得到一个形状为 (1,seq_length,feature_dim) 的输出张量 output。
2. 从 output 中提取出偏移量 offsets,偏移量用于计算每个音符的起始时间。
3. 从 output 中提取出音符数和持续时间数,得到一个形状为 (n_notes,n_durations) 的张量 n_notes。
4. 对 n_notes 进行 argmax 操作,得到每个音符的索引值。
5. 遍历每个索引值,根据偏移量和持续时间计算该音符的起始时间和持续时间,并将音符加入到音符列表 notes_list 中。
6. 生成一个 MIDI 流 stream,并将 notes_list 写入到 stream 中。
7. 将 stream 输出为 MIDI 文件。
相关问题
def generate_music(fp,seq_len,generate_length =128,gate_split = 0.2): inputs,notes_list = convert_midi(fp,seq_len) if inputs is None: return last_step = Fraction(notes_list[-1].offset) for i in range(generate_length): output = model.predict(inputs[np.newaxis,:,:])[0] offsets = np.argmax(output[-len(offsets_vocab):]) offsets = Fraction(offsets_vocab[offsets]) n_notes = np.reshape(output[:len(offsets_vocab)*len(durations_vocab)],(len(offsets_vocab),len(durations_vocab))) n_notes = np.argmax(n_notes,axis=-1) for idx,note_durations in enumerate(n_notes): duration = Fraction(durations_vocab[note_durations]) cur_step = offsets + last_step if duration != 0: note = NoteClass.Note(notes_vocab[idx]) note.offset = cur_step note.duration = Duration(quarterLength=duration) #print(idx, note.offset,note.duration) notes_list.append(note) last_step = cur_step stream = Stream(notes_list) stream.write("midi","output_midi01.mid")
这段代码是用来生成乐曲的,其中的`fp`参数是midi文件路径,`seq_len`是序列长度,`generate_length`是生成的音符数,`gate_split`是一个门限用于控制生成的音符是否被添加到乐曲中。它首先调用了`convert_midi`函数将midi文件转化为神经网络模型的输入,并将最后一个时间步赋值给`last_step`。然后,它使用神经网络模型对输入进行预测,并根据预测结果生成新的音符。最后,将生成的音符添加到原有的音符列表中,并将整个乐曲写入midi文件。
阅读全文
相关推荐

















