Spaces:
Sleeping
Sleeping
import pretty_midi | |
import librosa | |
import copy | |
import mido | |
import configparser | |
import os | |
import random | |
from mergeoggs import merge | |
def post_process(song_path, midi_path, output_dir): | |
song_name = song_path.split("/")[-1] | |
song_name = ".".join(song_name.split(".")[0:-1]) | |
if not os.path.exists(f"{output_dir}/{song_name}"): | |
os.makedirs(f"{output_dir}/{song_name}") | |
merge(f"{output_dir}/{song_name}/song.ogg", song_path) | |
notes = pretty_midi.PrettyMIDI(midi_path) | |
output = copy.deepcopy(notes) | |
output.instruments = [] | |
output.instruments.append(pretty_midi.Instrument(0, name="PART GUITAR")) | |
note_times = [note.start for note in notes.instruments[0].notes if note.pitch != 78] | |
for index,note in enumerate(notes.instruments[0].notes): | |
if note.pitch not in [72,73,74,75, 78]: | |
continue | |
new_pitch = note.pitch | |
duration = note.end - note.start | |
end = note.start + duration if duration > 0.5 else note.start + 0.1 | |
new_note = pretty_midi.Note(velocity=100, pitch=new_pitch, start=note.start, end=end) | |
# add random note if solo strum | |
if note.pitch == 78 and note.start not in note_times: | |
extra_note = pretty_midi.Note(velocity=100, pitch=random.randint(72,75), start=note.start, end=end) | |
output.instruments[0].notes.append(extra_note) | |
output.instruments[0].notes.append(new_note) | |
output.write(f"{output_dir}/{song_name}/notes.mid") | |
output = mido.MidiFile(f"{output_dir}/{song_name}/notes.mid") | |
output.tracks[1].pop(1) | |
output.save(f"{output_dir}/{song_name}/notes.mid") | |
# write ini file | |
config = configparser.ConfigParser() | |
config.read('./song.ini') | |
config.set("song", "name", song_name.split(" - ")[1]) | |
config.set("song", "artist", song_name.split(" - ")[0]) | |
config.set("song", "charter", "Tim and Matthew") | |
with open(f"{output_dir}/{song_name}/song.ini", 'w') as configfile: # save | |
config.write(configfile) | |
# output_dir = "./clonehero" | |
# # for file in os.listdir("./processed/piano_midi"): | |
# # song_name = ".".join(file.split(".")[0:-1]) | |
# song_name = "Dire Straits - Sultans of Swing" | |
# # song_name = "Aerosmith - Same Old Song & Dance" | |
# print(song_name) | |
# if not os.path.exists(f"{output_dir}/{song_name}"): | |
# os.makedirs(f"{output_dir}/{song_name}") | |
# # copy over song | |
# # shutil.copy(f"./processed/audio/{song_name}.ogg", f"{output_dir}/{song_name}/song.ogg") | |
# shutil.copy(f"./{song_name}.ogg", f"{output_dir}/{song_name}/song.ogg") | |
# # notes = pretty_midi.PrettyMIDI(f"./processed/piano_midi/{file}") | |
# notes = pretty_midi.PrettyMIDI(f"./sultans_ada.mid") | |
# # notes = pretty_midi.PrettyMIDI(f"./{song_name}.mid") | |
# output = copy.deepcopy(notes) | |
# output.instruments = [] | |
# output.instruments.append(pretty_midi.Instrument(0, name="PART GUITAR")) | |
# last_start = 0 | |
# note_times = [note.start for note in notes.instruments[0].notes if note.pitch != 78] | |
# total = 0 | |
# outofrange = 0 | |
# for index,note in enumerate(notes.instruments[0].notes): | |
# time_start = note.start | |
# # if time_start == last_start: | |
# # continue | |
# # if index % 2 != 0: | |
# # continue | |
# total+=1 | |
# if note.pitch not in [71,72,73,74,75, 78]: | |
# outofrange+=1 | |
# last_start = time_start | |
# # new_pitch = 71 + note.pitch % 5 | |
# new_pitch = note.pitch | |
# duration = note.end - note.start | |
# end = note.start + duration if duration > 0.5 else note.start + 0.1 | |
# new_note = pretty_midi.Note(velocity=100, pitch=new_pitch, start=note.start, end=end) | |
# # if strum | |
# if note.pitch == 78 and note.start not in note_times: | |
# extra_note = pretty_midi.Note(velocity=100, pitch=random.randint(71,75), start=note.start, end=end) | |
# output.instruments[0].notes.append(extra_note) | |
# # strum = pretty_midi.Note(velocity=100, pitch=78, start=note.start, end=end) | |
# output.instruments[0].notes.append(new_note) | |
# # output.instruments[0].notes.append(strum) | |
# print(f"Total notes: {total}") | |
# print(f"Out of range notes: {outofrange}") | |
# output.write(f"{output_dir}/{song_name}/notes.mid") | |
# output = mido.MidiFile(f"{output_dir}/{song_name}/notes.mid") | |
# output.tracks[1].pop(1) | |
# output.save(f"{output_dir}/{song_name}/notes.mid") | |
# # write ini file | |
# config = configparser.ConfigParser() | |
# config.read('./song.ini') | |
# config.set("song", "name", song_name.split(" - ")[1]) | |
# config.set("song", "artist", song_name.split(" - ")[0]) | |
# config.set("song", "charter", "Tim and Matthew") | |
# with open(f"{output_dir}/{song_name}/song.ini", 'w') as configfile: # save | |
# config.write(configfile) | |