Пример #1
0
    def generate_basic_notes(self, qpm=160, failsafe=False):
        """
        Requires melody conditioned model.
        """
        if not self.conditioned:
            raise ValueError("Model should be conditioned!")

        if failsafe:
            self.failsafe()

        else:
            melody_ns = copy.deepcopy(self.sequence)
            try:
                melody_instrument = mm.infer_melody_for_sequence(melody_ns)
                notes = [note for note in melody_ns.notes
                        if note.instrument == melody_instrument]

                melody_ns.notes.extend(
                    sorted(notes, key=lambda note: note.start_time))
                for i in range(len(melody_ns.notes) - 1):
                    melody_ns.notes[i].end_time = melody_ns.notes[i + 1].start_time

                # sequence can only be one min to save time during inference.
                melody_ns = mm.extract_subsequence(melody_ns, 0, 60)
                self.inputs = self.encoders['inputs'].encode_note_sequence(
                            melody_ns)
                print("Melody successfully parsed and encoded!")
            except Exception as e:
                print(f"Error in encoding stage {e}")
                print("Resorting to a basic melody")
                self.failsafe()

        self.decode_length = 4096
        sample_ids = next(self.samples)['outputs']

        # Decode to NoteSequence.
        midi_filename = self.decode(
            sample_ids,
            encoder=self.encoders['targets'])
        accompaniment_ns = mm.midi_file_to_note_sequence(midi_filename)

        request_dict = self.put_request_dict
        generated_sequence_2_mp3(accompaniment_ns, f"{self.unique_id}", use_salamander=True,
                                 request_dict=request_dict)
Пример #2
0
def get_melody_ns(filename):
    """
    Convert melody Midi file to note sequence.
    :param filename: Midi file name.
    :return:
        Melody note sequences.
    """
    melody_ns = mm.midi_file_to_note_sequence(filename)
    melody_instrument = mm.infer_melody_for_sequence(melody_ns)
    # pylint: disable=no-member
    notes = [
        note for note in melody_ns.notes
        if note.instrument == melody_instrument
    ]
    del melody_ns.notes[:]
    melody_ns.notes.extend(sorted(notes, key=lambda note: note.start_time))
    for i in range(len(melody_ns.notes) - 1):
        melody_ns.notes[i].end_time = melody_ns.notes[i + 1].start_time

    # pylint: disable=no-member

    return melody_ns
Пример #3
0
def render_sequence_to_music_dict(midi_file,
                                  music_dict,
                                  model_string="melody_rnn"):
    sequence = mm.midi_file_to_note_sequence(midi_file)
    # scale to num steps.
    music_dict['num_steps'] = 1024 * music_dict['length']
    backup_sequence = None
    basic_models = [
        "melody_rnn", "performance_rnn", "polyphony_rnn", "pianoroll_rnn_nade"
    ]
    if model_string in basic_models:
        subsequence = mm.extract_subsequence(sequence, 0.0, C.SUBSEQUENCE_TIME)
        for note in subsequence.notes:
            # rnns can work with piano data.
            note.program = 0
            note.instrument = 1
        music_dict['sequence'] = subsequence
        if model_string == "performance_rnn":
            music_dict['num_steps'] = music_dict['num_steps'] * 4

    elif model_string == "improv_rnn" or model_string == "music_vae":
        subsequence = mm.extract_subsequence(sequence, 0.0, C.SUBSEQUENCE_TIME)
        melody = mm.infer_melody_for_sequence(subsequence)

        new_sequence = music_pb2.NoteSequence()
        backup_sequence = music_pb2.NoteSequence()
        new_val = 0.
        backup_val = 0.
        for note in subsequence.notes:
            # rnns can work with piano data.
            if note.instrument == melody:
                start = note.start_time
                end = note.end_time
                diff = end - start

                new_sequence.notes.add(pitch=note.pitch,
                                       start_time=new_val,
                                       end_time=new_val + diff,
                                       velocity=160)
                backup_sequence.notes.add(pitch=note.pitch,
                                          start_time=backup_val,
                                          end_time=backup_val + 0.5,
                                          velocity=160)

                new_val += diff
                backup_val += 0.5
            if model_string == "improv_rnn":
                note.program = 0
                note.instrument = 1
        new_sequence.total_time = new_val
        new_sequence.tempos.add(qpm=subsequence.tempos[0].qpm)
        backup_sequence.total_time = backup_val
        backup_sequence.tempos.add(qpm=60)
        music_dict['sequence'] = subsequence
        music_dict['backup_sequence'] = backup_sequence

    elif model_string == "music_transformer":
        # model generate will take care of things
        music_dict['sequence'] = sequence

    return music_dict
Пример #4
0
    'Twinkle Twinkle Little Star': [
        60, 60, 67, 67, 69, 69, 67, mm.MELODY_NO_EVENT,
        65, 65, 64, 64, 62, 62, 60, mm.MELODY_NO_EVENT,
        67, 67, 65, 65, 64, 64, 62, mm.MELODY_NO_EVENT,
        67, 67, 65, 65, 64, 64, 62, mm.MELODY_NO_EVENT,
        60, 60, 67, 67, 69, 69, 67, mm.MELODY_NO_EVENT,
        65, 65, 64, 64, 62, 62, 60, mm.MELODY_NO_EVENT        
    ]
}

melody = 'Twinkle Twinkle Little Star'  #@param ['Mary Had a Little Lamb', 'Row Row Row Your Boat', 'Twinkle Twinkle Little Star', 'Upload your own!']

if melody == 'Upload your own!':
  # Extract melody from user-uploaded MIDI file.
  melody_ns = upload_midi()
  melody_instrument = mm.infer_melody_for_sequence(melody_ns)
  notes = [note for note in melody_ns.notes
           if note.instrument == melody_instrument]
  del melody_ns.notes[:]
  melody_ns.notes.extend(
      sorted(notes, key=lambda note: note.start_time))
  for i in range(len(melody_ns.notes) - 1):
    melody_ns.notes[i].end_time = melody_ns.notes[i + 1].start_time
  inputs = melody_conditioned_encoders['inputs'].encode_note_sequence(
      melody_ns)
else:
  # Use one of the provided melodies.
  events = [event + 12 if event != mm.MELODY_NO_EVENT else event
            for e in melodies[melody]
            for event in [e] + event_padding]
  inputs = melody_conditioned_encoders['inputs'].encode(