def generate_notes(model, network_input, pitch_names, num_pitch): """ 基于序列音符,用神经网络来生成新的音符 """ # 从输入里随机选择一个序列,作为“预测”/生成的音乐的起始点 start = np.random.randint(0, len(network_input) - 1) # 从0到神经网络输入-1中随机选择一个整数 # 创建一个字典用于映射 整数 和 音调,和训练相反的操作 int_to_pitch = dict((num, pitch) for num, pitch in enumerate(pitch_names)) pattern = network_input[start] # 随机选择的序列起点 # 神经网络实际生成的音符 prediction_output = [] # 生成700个音符 for note_index in range(1000): prediction_input = np.reshape(pattern, (1, len(pattern), 1)) # 输入,归一化 prediction_input = prediction_input / float(num_pitch) # 读取参数文件,载入训练所得最佳参数文件的神经网络来预测新的音符 prediction = model.predict(prediction_input, verbose=0) # 根据输入预测结果 # argmax取最大的那个维度(类似One-hot编码) index = np.argmax(prediction) result = int_to_pitch[index] prediction_output.append(result) # start往后移动 pattern.append(index) pattern = pattern[1:len(pattern)] return prediction_output
时间: 2024-02-15 17:27:27 浏览: 97
这段代码是用来生成新的音符,其中模型是神经网络模型,输入是一个序列音符,输出是一个新的音符序列。具体来说,该函数会随机选择一个序列作为起始点,然后根据输入的序列预测下一个音符,继续预测下一个音符,直至生成700个音符。这个函数的实现过程中,会读取参数文件并载入训练所得最佳参数文件的神经网络来预测新的音符。最终,返回一个新的音符序列。
相关问题
def generate_midi(generator, output_file, start_sequence): # 加载模型参数 generator.load_weights('weights.hdf5') # 计算音符和和弦的数量 notes = load_midi(start_sequence) pitchnames = sorted(set(notes)) n_vocab = len(set(notes)) # 准备输入序列 sequence_length = 100 note_to_int = dict((note, number) for number, note in enumerate(pitchnames)) network_input = [] for i in range(0, len(notes) - sequence_length, 1): sequence_in = notes[i:i + sequence_length] network_input.append([note_to_int[char] for char in sequence_in]) # 生成 MIDI 文件 start = np.random.randint(0, len(network_input)-1) int_to_note = dict((number, note) for number, note in enumerate(pitchnames)) pattern = network_input[start] prediction_output = [] for note_index in range(500): prediction_input = np.reshape(pattern, (1, len(pattern), 1)) prediction_input = prediction_input / float(n_vocab) prediction = generator.predict(prediction_input, verbose=0) index = np.argmax(prediction) result = int_to_note[index] prediction_output.append(result) pattern.append(index) pattern = pattern[1:len(pattern)] offset = 0 output_notes = [] # 创建音符和和弦对象 for pattern in prediction_output: # 如果是和弦 if ('.' in pattern) or pattern.isdigit(): notes_in_chord = pattern.split('.') notes = [] for current_note in notes_in_chord: new_note = note.Note(int(current_note)) new_note.storedInstrument = instrument.Piano() notes.append(new_note) new_chord = chord.Chord(notes) new_chord.offset = offset output_notes.append(new_chord) # 如果是音符 else: new_note = note.Note(pattern) new_note.offset = offset new_note.storedInstrument = instrument.Piano() output_notes.append(new_note) # 增加偏移量 offset += 0.5 # 创建 MIDI 流对象 midi_stream = stream.Stream(output_notes) # 保存 MIDI 文件 midi_stream.write('midi', fp=output_file)
这段代码是用来生成 MIDI 音乐的,其中使用了一个生成器模型来生成音乐。在生成 MIDI 音乐之前,先加载模型参数,并准备输入序列。接下来,从输入序列中随机选择一个起始点,然后使用生成器模型来预测下一个音符或和弦。生成的音符或和弦会被添加到预测输出列表中,同时也会更新当前输入序列,以便用于下一个预测。最后,将预测输出转换成音符和和弦对象,并将它们添加到 MIDI 流对象中,最终生成 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)
这段代码定义了一个名为`generate_music()`的函数,用于生成音乐。函数的参数包括输入文件路径`fp`、序列长度`seq_len`、生成长度`generate_length`和`gate_split`。
在函数中,首先调用`convert_midi()`函数将输入文件转换为可用于模型输入的格式。如果转换失败,则直接返回。`notes_list`是转换后的音符列表,`last_step`是最后一个音符的偏移量。
接着,代码使用`generate_length`和`seq_len`计算出需要生成的音符数量,并将其保存在变量`steps_left`中。同时,定义一个空列表`generated_notes`用于保存生成的音符。接下来的循环中,每次从输入序列中获取最后`seq_len`个音符,并使用生成器生成下一个音符。新生成的音符将添加到`generated_notes`列表中,循环直到生成指定数量的音符为止。
在生成每个音符时,代码还使用了`gate_split`参数来生成一个随机数,用于控制生成的音符是否为休止符。具体来说,如果生成的随机数小于等于`gate_split`,则生成的音符为休止符,否则为正常音符。
最后,代码使用`music21`库将生成的音符列表转换为`music21.stream.Stream`对象,并将其保存为MIDI文件。
阅读全文