from glob import glob from argparse import ArgumentParser from os import system, path import csv parser = ArgumentParser(description="Prepare dataset from midi files for later use in onsets and frames.") parser.add_argument('--dry', '-d', dest='dry', action='store_true', help="Dry run, print commands instead of executing them") parser.add_argument('--no-convert', '-m', dest='no_convert', action='store_true', help="Only create manifest.") parser.add_argument('--soundfont', '-f', default='/usr/share/sounds/sf2/FluidR3_GM.sf2', help="Path to soundfont.") parser.add_argument('-n', type=int, help="Max midi files to process") args = parser.parse_args() execute = print if args.dry else system processed = 0 if not args.no_convert: for midi in glob("dataset/midi/*.mid"): wav = midi.replace('.mid', '.wav').replace('/midi/', '/wav/') processed = processed + 1 if args.n is not None and processed > args.n: break if path.isfile(wav): continue print(f"Converting {midi} to {wav}") execute(f"fluidsynth -nli -r 48000 -T wav -F {wav} {args.soundfont} {midi} > /dev/null") manifest = [] for wav in glob("dataset/wav/*.wav"): midi = wav.replace('.wav', '.mid').replace('/wav/', '/midi/') if path.isfile(midi): manifest.append((path.basename(wav), path.basename(midi), 'test')) with open('dataset/manifest.csv', 'w') as manifest_file: writer = csv.writer(manifest_file) writer.writerow(('audio_filename', 'midi_filename', 'split')) writer.writerows(manifest)