Module music_df.scripts.search_for_feature

Functions

def main()
Expand source code
def main():
    args, remaining = parse_args()
    get_config = partial(Config, input_files=args.input_files)
    config = read_config_oc(args.config_file, remaining, get_config)

    for input_file in args.input_files:
        music_df = read(input_file)
        result = find_simultaneous_feature(
            music_df, config.feature_name, config.feature_values
        )
        result = merge_contiguous_durations(result)
        result = [
            tuple(((x, *time_to_bar_number_and_offset(music_df, x)) for x in t))
            for t in result
        ]
        if not result:
            continue
        print(input_file)
        for r in result:
            print_result(r, indent=4)
def parse_args()
Expand source code
def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("--config-file")
    parser.add_argument("--input-files", nargs="+")
    # remaining passed through to omegaconf

    args, remaining = parser.parse_known_args()
    return args, remaining
def print_result(result: tuple[tuple[float, int, float], ...], indent: int = 0)
Expand source code
def print_result(result: tuple[tuple[float, int, float], ...], indent: int = 0):
    def _format(t: tuple[float, int, float]) -> str:
        return f"m{t[1]}.{t[2] + 1:.3} (offset={t[0]})"

    print(f"{' ' * indent}From {_format(result[0])} to {_format(result[1])}")

Classes

class Config (feature_name: str, feature_values: Iterable[Any], input_files: Iterable[str])
Expand source code
@dataclass
class Config:
    feature_name: str
    feature_values: Iterable[Any]
    input_files: Iterable[str]

Config(feature_name: str, feature_values: Iterable[Any], input_files: Iterable[str])

Instance variables

var feature_name : str
var feature_values : Iterable[Any]
var input_files : Iterable[str]