import os import glob import warnings import random procid = int(os.environ.get("SLURM_PROCID", 0)) localid = int(os.environ.get("SLURM_LOCALID", 0)) world_size = int(os.environ.get("SLURM_JOB_NUM_NODES", 1)) * int( os.environ.get("SLURM_NTASKS_PER_NODE", 1) ) assert world_size > 0, "WORLD_SIZE is 0" print(f"PROCID: {procid}, LOCALID: {localid}, WORLD_SIZE: {world_size}") dir = "/app2/suno/data/victor/gmd/MIDIs" output_dir = "/app2/suno/data/sara/gmd/synth_v6" soundfonts = [ "/home/victor/neon/sunoData/src/sunodata/midi/soundfonts/FatBoy-v0.786.sf2", "/home/victor/neon/sunoData/src/sunodata/midi/soundfonts/Touhou.sf2", "/home/sara/soundfonts/good/RLNDGM.sf2", "/home/sara/soundfonts/good/arachno.sf2", "/home/sara/soundfonts/good/musescore_general.sf2", ] def process_midi_file(midi_file, sf_path): from suno_utils.audio.midi import Midi try: outpath = midi_file.replace(dir, output_dir).replace(".mid", ".opus") os.makedirs(os.path.dirname(outpath), exist_ok=True) if not os.path.exists(outpath): midi = Midi.from_path(midi_file) midi.pmidi.remove_invalid_notes() if midi.duration_s() < 30: return f"Skipped {midi_file}: too short" if midi.duration_s() > 300: return f"Skipped {midi_file}: too long" note_density = midi.num_notes / midi.duration_s() if note_density > 20: return f"Skipped {midi_file}: note density too high" try: audio = midi.to_audio(sf_path=sf_path) except Exception as e: try: audio = midi.to_audio(sf_path=random.randint(0, len(soundfonts) - 1)) except Exception as e: audio = midi.to_audio(sf_path=random.randint(0, len(soundfonts) - 1)) audio.write_opus(outpath) return f"Processed {midi_file}" except Exception as e: # print(e) return f"Error loading {midi_file}: {e}" def main(): print("main!") from tqdm import tqdm midi_files = list(glob.iglob(os.path.join(dir, "**", "*.mid"), recursive=True)) midi_files = midi_files[procid::world_size] print(len(midi_files)) skipped = 0 for i, midi_file in tqdm(enumerate(midi_files)): sf_path = soundfonts[i % len(soundfonts)] # Cycle through available soundfonts result = process_midi_file(midi_file, sf_path) if "Error" in result or "Skipped" in result: skipped += 1 print("SKIPPED", skipped) main()