Spaces:
Running
on
Zero
Running
on
Zero
#! /usr/bin/env python3 | |
# this executes the chord extractor from polyffusion on a list of midi files | |
import sys | |
import os | |
import sys | |
import pretty_midi | |
from multiprocessing import Pool, cpu_count, set_start_method | |
from tqdm import tqdm | |
from control_toys.data import fast_scandir | |
from functools import partial | |
import argparse | |
chord_extractor_path = '/Users/shawley/github/polyffusion/polyffusion/chord_extractor' | |
# add chord extract path to python sys | |
sys.path.append(chord_extractor_path) | |
from chord_class import ChordClass | |
#try: | |
from chord_extractor.main import transcribe_cb1000_midi | |
chord_extractor_available = True | |
#except: | |
# chord_extractor_available = False | |
def extract_chords(args, midi_file): | |
"this will read in one midi file and estimate the chords" | |
chords_path = midi_file.replace('.mid', '_chords.txt') | |
try: | |
transcribe_cb1000_midi(midi_file, chords_path) | |
except Exception as e: | |
print(f"\nError processing {midi_file}: {e}. Skipping") | |
if __name__ == '__main__': | |
p = argparse.ArgumentParser(description=__doc__, | |
formatter_class=argparse.ArgumentDefaultsHelpFormatter) | |
p.add_argument('--start-method', type=str, default='fork', | |
choices=['fork', 'forkserver', 'spawn'], | |
help='the multiprocessing start method') | |
p.add_argument('--skip-versions', default=True, help='skip extra versions of the same song') | |
p.add_argument("midi_dirs", nargs='+', help="directories containing MIDI files") | |
args = p.parse_args() | |
print("args = ",args) | |
if not chord_extractor_available: | |
print("Error: chord_extractor not available. Please install it, e.g. via 'ln -s ~/diffusion/polyffusion/polyffusion/chord_extractor .'") | |
sys.exit(1) | |
set_start_method(args.start_method) | |
midi_dirs = args.midi_dirs | |
if os.path.isdir(midi_dirs[0]): | |
midi_files = [] | |
for mdir in midi_dirs: | |
m_subdirs, mf = fast_scandir(mdir, ['mid', 'midi']) | |
if mf != []: midi_files = midi_files + mf | |
elif os.path.isfile(midi_dirs[0]): | |
midi_files = midi_dirs | |
if args.skip_versions: | |
midi_files = [f for f in midi_files if '/versions/' not in f] | |
#print("midi_files = ",midi_files) # just a check for debugging | |
extract_one = partial(extract_chords, args) | |
with Pool(cpu_count()) as p: | |
# TODO: how to get functions called from p.imap to return values? | |
list(tqdm(p.imap(extract_one, midi_files), total=len(midi_files), desc='Extracting chords from MIDI files')) | |
print("Finished") |