|
| 1 | +import os |
| 2 | +import magenta.music as mm |
| 3 | +from magenta.models.melody_rnn import melody_rnn_sequence_generator |
| 4 | + |
| 5 | +# Set the directory to save the generated MIDI files |
| 6 | +output_dir = 'generated_music' |
| 7 | +os.makedirs(output_dir, exist_ok=True) |
| 8 | + |
| 9 | +# Initialize the Melody RNN model |
| 10 | +model_name = 'attention_rnn' |
| 11 | +melody_rnn = melody_rnn_sequence_generator.MelodyRnnSequenceGenerator(model_name=model_name) |
| 12 | + |
| 13 | +# Set the temperature for music generation (higher values lead to more randomness) |
| 14 | +temperature = 1.0 |
| 15 | + |
| 16 | +# Set the number of music pieces to generate |
| 17 | +num_music_pieces = 3 |
| 18 | + |
| 19 | +# Set the number of steps per music piece |
| 20 | +steps_per_music_piece = 128 |
| 21 | + |
| 22 | +# User input for preferred genre and tempo |
| 23 | +preferred_genre = input("Enter your preferred genre (e.g., classical, jazz, rock): ") |
| 24 | +preferred_tempo = int(input("Enter your preferred tempo (BPM): ")) |
| 25 | + |
| 26 | +# Chord progression for the chosen genre (you can add more genres and progressions) |
| 27 | +chord_progressions = { |
| 28 | + "classical": ["C", "Am", "F", "G"], |
| 29 | + "jazz": ["Cmaj7", "Dm7", "Em7", "A7"], |
| 30 | + "rock": ["C", "G", "Am", "F"], |
| 31 | +} |
| 32 | + |
| 33 | +# Basic drum pattern for accompaniment |
| 34 | +drum_pattern = mm.DrumTrack( |
| 35 | + [36, 0, 42, 0, 36, 0, 42, 0], # Kick drum and Hi-hat pattern (adjust as needed) |
| 36 | + start_step=0, |
| 37 | + steps_per_bar=steps_per_music_piece // 4, |
| 38 | + steps_per_quarter=4, |
| 39 | +) |
| 40 | + |
| 41 | +# Generate music pieces |
| 42 | +for i in range(num_music_pieces): |
| 43 | + # Generate a melody sequence |
| 44 | + melody_sequence = melody_rnn.generate( |
| 45 | + temperature=temperature, |
| 46 | + steps=steps_per_music_piece, |
| 47 | + primer_sequence=None |
| 48 | + ) |
| 49 | + |
| 50 | + # Add chords to the melody sequence based on the preferred genre |
| 51 | + chords = [chord_progressions.get(preferred_genre, ["C"])[i % len(chord_progressions.get(preferred_genre, ["C"]))] for i in range(steps_per_music_piece)] |
| 52 | + chord_sequence = mm.ChordSequence(chords) |
| 53 | + melody_with_chords_sequence = mm.sequences_lib.concatenate_sequences(melody_sequence, chord_sequence) |
| 54 | + |
| 55 | + # Create a MIDI file from the melody with chords sequence and drum pattern |
| 56 | + music_sequence = mm.sequences_lib.concatenate_sequences(melody_with_chords_sequence, drum_pattern) |
| 57 | + music_sequence.tempos[0].qpm = preferred_tempo |
| 58 | + |
| 59 | + midi_file = os.path.join(output_dir, f'music_piece_{i + 1}.mid') |
| 60 | + mm.sequence_proto_to_midi_file(music_sequence, midi_file) |
| 61 | + print(f'Music piece {i + 1} generated and saved as {midi_file}') |
| 62 | + |
| 63 | +print('Music generation complete!') |
0 commit comments