Skip to content

Commit

Permalink
Project initilization
Browse files Browse the repository at this point in the history
  • Loading branch information
zunaidhasan committed Jan 27, 2025
1 parent 3819e95 commit 126c599
Show file tree
Hide file tree
Showing 19 changed files with 120 additions and 0 deletions.
5 changes: 5 additions & 0 deletions config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Configuration for the music generation model
BATCH_SIZE = 64
EPOCHS = 100
LEARNING_RATE = 0.001
MAX_SEQUENCE_LENGTH = 50
Binary file added dataset/Adson_John_-_Courtly_Masquing_Ayres.mid
Binary file not shown.
Binary file added dataset/Albinoni_Tommaso_-_Adagio_in_G_min.mid
Binary file not shown.
Binary file not shown.
Binary file added dataset/Allwood_Richard_-_In_Nomine.mid
Binary file not shown.
Binary file added dataset/AshesToAshes.mid
Binary file not shown.
Binary file added dataset/Blues_Image_-_Ride_Captain_Ride.mid
Binary file not shown.
Binary file added dataset/Bomfunk_MCs_-_B-Boys_And_Fly-Girls.mid
Binary file not shown.
Binary file added dataset/Disney_Themes_-_Fantasmic.mid
Binary file not shown.
Binary file not shown.
Binary file added dataset/Movie_Themes_-_Air_Force_One.mid
Binary file not shown.
Binary file added dataset/Robbie_Williams_-_Rock_DJ.mid
Binary file not shown.
Binary file added dataset/TV_Themes_-_Dallas.mid
Binary file not shown.
25 changes: 25 additions & 0 deletions dataset/midi_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import music21
from midiutil import MIDIFile

def midi_to_notes(midi_file):
notes = []
midi = music21.converter.parse(midi_file)
for element in midi.flat.notes:
if isinstance(element, music21.note.Note):
notes.append(str(element.pitch)) # could convert to MIDI number here if needed
return notes

def create_midi_file(notes, filename):
midi = MIDIFile(1)
track = 0
time = 0

midi.addTrackName(track, time, "Generated Music")
midi.addTempo(track, time, 60)

for note in notes:
midi.addNote(track, 0, int(note), time, 1, 100) # Ensure notes are in int format
time += 1

with open(filename, "wb") as f:
midi.writeFile(f)
18 changes: 18 additions & 0 deletions generate_music.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import numpy as np
from keras.models import load_model
from midi_utils import create_midi_file

def generate_music(model, start_seed, num_notes=100):
generated = start_seed
for _ in range(num_notes):
input_sequence = np.array(generated[-50:]).reshape(1, 50)
predicted = model.predict(input_sequence, verbose=0)
next_note = np.argmax(predicted)
generated.append(next_note)
return generated

if __name__ == "__main__":
model = load_model('music_model.h5')
start_seed = [60, 62, 64] # Example seed (MIDI note values)
generated_notes = generate_music(model, start_seed)
create_midi_file(generated_notes, 'generated_music.mid')
25 changes: 25 additions & 0 deletions midi_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import music21
from midiutil import MIDIFile

def midi_to_notes(midi_file):
notes = []
midi = music21.converter.parse(midi_file)
for element in midi.flat.notes:
if isinstance(element, music21.note.Note):
notes.append(str(element.pitch)) # could convert to MIDI number here if needed
return notes

def create_midi_file(notes, filename):
midi = MIDIFile(1)
track = 0
time = 0

midi.addTrackName(track, time, "Generated Music")
midi.addTempo(track, time, 60)

for note in notes:
midi.addNote(track, 0, int(note), time, 1, 100) # Ensure notes are in int format
time += 1

with open(filename, "wb") as f:
midi.writeFile(f)
12 changes: 12 additions & 0 deletions models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from keras.models import Sequential
from keras.layers import LSTM, Dense, Embedding

def create_model(vocab_size, max_sequence_length):
model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim=256, input_length=max_sequence_length))
model.add(LSTM(256, return_sequences=True))
model.add(LSTM(256))
model.add(Dense(vocab_size, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam')
return model
5 changes: 5 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
numpy
tensorflow>=2.0.0
keras
music21
midiutil
30 changes: 30 additions & 0 deletions train_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Dense, Embedding
from keras.utils import to_categorical
from midi_utils import midi_to_notes

def prepare_data(notes):
# Convert notes to integers or one-hot encoding
# This function must be implemented.
# Placeholder: Assume we return X, y from preprocessing
pass

def create_model(vocab_size, max_sequence_length):
model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim=256, input_length=max_sequence_length))
model.add(LSTM(256, return_sequences=True))
model.add(LSTM(256))
model.add(Dense(vocab_size, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')
return model

def train_model():
notes = midi_to_notes('dataset/your_midi_file1.mid') # Load your dataset
X, y = prepare_data(notes) # Process your data
model = create_model(vocab_size=len(set(notes)), max_sequence_length=50) # Adjust variables as needed
model.fit(X, to_categorical(y), epochs=100, batch_size=64)
model.save('music_model.h5')

if __name__ == "__main__":
train_model()

0 comments on commit 126c599

Please sign in to comment.