From 7c9bdc2bf762a0365aa0ef96c9809c07404fc8fb Mon Sep 17 00:00:00 2001 From: Louis Couturier Date: Thu, 23 Feb 2023 14:14:29 +0100 Subject: [PATCH 1/3] add 'origin' argument to handle 'layers' attributes in Dezrann labels --- src/ms3/dezrann.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/ms3/dezrann.py b/src/ms3/dezrann.py index 3265a8de..a7e68f22 100644 --- a/src/ms3/dezrann.py +++ b/src/ms3/dezrann.py @@ -120,6 +120,7 @@ class DezrannLabel(TypedDict): duration: float line: str #= "top.3" #Literal? tag: str + layers: List[str] class DezrannDict(TypedDict): labels: List[DezrannLabel] @@ -157,23 +158,32 @@ def transform_df(labels: pd.DataFrame, transformed_df = pd.concat([quarterbeats.rename('quarterbeats'), labels.duration_qb.rename('duration'), labels[label_column].rename('label')], axis=1) return transformed_df.to_dict(orient='records') -def make_dezrann_label(quarterbeats: float, duration: float, label: str) -> DezrannLabel: - return DezrannLabel(type="Harmony", start=quarterbeats, duration=duration, line="top.3", tag=label) +def make_dezrann_label( + quarterbeats: float, duration: float, label: str, origin: List[str]) -> DezrannLabel: + return DezrannLabel( + type="Harmony", + start=quarterbeats, + duration=duration, + line="top.3", + tag=label, + layers=origin + ) -def convert_dcml_list_to_dezrann_list(values_dict: List[DcmlLabel]) -> List[DezrannDict]: +def convert_dcml_list_to_dezrann_list(values_dict: List[DcmlLabel], origin: List[str]) -> List[DezrannDict]: label_list = [] for e in values_dict: label_list.append( make_dezrann_label( quarterbeats=e["quarterbeats"], duration=e["duration"], - label=e["label"] + label=e["label"], + origin=origin ) ) return DezrannDict(labels=label_list, meta={"layout": []}) -def generate_dez(path_measures, path_labels, output_path="labels.dez"): # need paths for harmony.TSV + paths for measures.TSV +def generate_dez(path_measures, path_labels, output_path="labels.dez", origin: List[str] = ["DCML"]): """ path_measures : :obj:`str` Path to a TSV file as output by format_data(). @@ -181,6 +191,8 @@ def generate_dez(path_measures, path_labels, output_path="labels.dez"): # need p Path to a TSV file as output by format_data(). output_labels : :obj:`str` Path to a TSV file as output by format_data(). + origin : :obj:`list` + List of source(s) from which the labels originate. Defaults to ["DCML"]. """ harmonies = pd.read_csv( path_labels, sep='\t', @@ -193,7 +205,7 @@ def generate_dez(path_measures, path_labels, output_path="labels.dez"): # need p converters={'quarterbeats_all_endings': safe_frac} ) dcml_labels = transform_df(labels=harmonies, measures=measures) - dezrann_content = convert_dcml_list_to_dezrann_list(dcml_labels) + dezrann_content = convert_dcml_list_to_dezrann_list(dcml_labels, origin=origin) # Manual post-processing #TODO: improve these cases # 1) Avoid NaN values in "duration" (happens in second endings) From 716740ad4ee538b450e7b75ac00e2065543dd166 Mon Sep 17 00:00:00 2001 From: johentsch Date: Thu, 23 Feb 2023 17:03:09 +0100 Subject: [PATCH 2/3] makes the new argument 'origin' a str|Tuple[str] (lists should be avoided as default arguments) --- src/ms3/dezrann.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/ms3/dezrann.py b/src/ms3/dezrann.py index a7e68f22..53470225 100644 --- a/src/ms3/dezrann.py +++ b/src/ms3/dezrann.py @@ -101,7 +101,7 @@ import json import os -from typing import Dict, List, TypedDict, Any, Union +from typing import Dict, List, TypedDict, Union, Tuple from fractions import Fraction import pandas as pd @@ -123,6 +123,7 @@ class DezrannLabel(TypedDict): layers: List[str] class DezrannDict(TypedDict): + """Represents one .dez file.""" labels: List[DezrannLabel] meta: Dict @@ -159,17 +160,22 @@ def transform_df(labels: pd.DataFrame, return transformed_df.to_dict(orient='records') def make_dezrann_label( - quarterbeats: float, duration: float, label: str, origin: List[str]) -> DezrannLabel: + quarterbeats: float, duration: float, label: str, origin: Union[str, Tuple[str]]) -> DezrannLabel: + if isinstance(origin, str): + layers = [origin] + else: + layers = list(origin) return DezrannLabel( type="Harmony", start=quarterbeats, duration=duration, line="top.3", tag=label, - layers=origin + layers=layers ) -def convert_dcml_list_to_dezrann_list(values_dict: List[DcmlLabel], origin: List[str]) -> List[DezrannDict]: +def convert_dcml_list_to_dezrann_list(values_dict: List[DcmlLabel], + origin: Union[str, Tuple[str]] = "DCML") -> List[DezrannDict]: label_list = [] for e in values_dict: label_list.append( @@ -183,7 +189,10 @@ def convert_dcml_list_to_dezrann_list(values_dict: List[DcmlLabel], origin: List return DezrannDict(labels=label_list, meta={"layout": []}) -def generate_dez(path_measures, path_labels, output_path="labels.dez", origin: List[str] = ["DCML"]): +def generate_dez(path_measures: str, + path_labels: str, + output_path: str = "labels.dez", + origin: Union[str, Tuple[str]] = "DCML"): """ path_measures : :obj:`str` Path to a TSV file as output by format_data(). From 5752a9914f5e1b6b8fa29a3cc87bb3e7da3ac414 Mon Sep 17 00:00:00 2001 From: johentsch Date: Thu, 23 Feb 2023 17:03:43 +0100 Subject: [PATCH 3/3] corrects output annotation --- src/ms3/dezrann.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ms3/dezrann.py b/src/ms3/dezrann.py index 53470225..b34bb648 100644 --- a/src/ms3/dezrann.py +++ b/src/ms3/dezrann.py @@ -175,7 +175,7 @@ def make_dezrann_label( ) def convert_dcml_list_to_dezrann_list(values_dict: List[DcmlLabel], - origin: Union[str, Tuple[str]] = "DCML") -> List[DezrannDict]: + origin: Union[str, Tuple[str]] = "DCML") -> DezrannDict: label_list = [] for e in values_dict: label_list.append(