Module music_df.scripts.csvs_to_midi

Functions

def custom_excepthook(exc_type, exc_value, exc_traceback)
Expand source code
def custom_excepthook(exc_type, exc_value, exc_traceback):
    if exc_type != KeyboardInterrupt:
        traceback.print_exception(exc_type, exc_value, exc_traceback, file=sys.stdout)
        pdb.post_mortem(exc_traceback)
def do_csv_file(inputf: str,
config: Config,
output_list: list | multiprocessing.managers.ListProxy,
error_file_list: list | multiprocessing.managers.ListProxy)
Expand source code
def do_csv_file(
    inputf: str,
    config: Config,
    output_list: list | ListProxy,
    error_file_list: list | ListProxy,
):
    # try:
    out_path = os.path.join(
        config.output_folder, os.path.splitext(os.path.basename(inputf))[0] + ".mid"
    )
    music_df = read_csv(inputf)
    assert music_df is not None
    df_to_midi(music_df, out_path)
    print(f"Wrote {out_path}")

    output_list.append(out_path)
    # except Exception as exc:
    #     error_file_list.append((inputf, repr(exc)))
def main()
Expand source code
def main():
    args = parse_args()
    config = Config(**vars(args))

    input_files = glob.glob(f"{config.input_folder}/*.csv")
    if config.max_files is not None:
        input_files = input_files[: config.max_files]

    os.makedirs(config.output_folder, exist_ok=True)
    if config.num_workers > 1:
        manager = Manager()
        output_files = manager.list()
        error_files = manager.list()
        with Pool(config.num_workers) as pool:
            list(
                pool.imap_unordered(
                    partial(
                        do_csv_file,
                        config=config,
                        output_list=output_files,
                        error_file_list=error_files,
                    ),
                    input_files,
                )
            )
    else:
        output_files = []
        error_files = []
        for inputf in input_files:
            do_csv_file(inputf, config, output_files, error_files)

    if error_files:
        print("Errors:")
        for xml_file, exception_str in error_files:
            print(f"{xml_file}: {exception_str}")
        print(f"{len(error_files)} total error files")
def parse_args()
Expand source code
def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("input_folder")
    parser.add_argument("output_folder")
    parser.add_argument("--debug", action="store_true")
    parser.add_argument("--num-workers", type=int, default=0)
    args = parser.parse_args()
    return args

Classes

class Config (input_folder: str,
output_folder: str,
debug: bool = False,
num_workers: int = 0,
max_files: int | None = None)
Expand source code
@dataclass
class Config:
    input_folder: str
    output_folder: str
    debug: bool = False
    num_workers: int = 0
    max_files: None | int = None

Config(input_folder: str, output_folder: str, debug: bool = False, num_workers: int = 0, max_files: None | int = None)

Instance variables

var debug : bool
var input_folder : str
var max_files : int | None
var num_workers : int
var output_folder : str