Source code for musif.extract.features.scale_relative.handler

from typing import List


from musif.config import Configuration

from musif.extract.common import _filter_parts_data

from musif.extract.constants import DATA_PART_ABBREVIATION

from musif.extract.features.prefix import get_part_prefix, get_score_feature

from .utils import get_emphasised_scale_degrees_relative

from .constants import *

from musif.extract.features.core.constants import DATA_KEY, DATA_NOTES


[docs]def update_part_objects( score_data: dict, part_data: dict, cfg: Configuration, part_features: dict ): if score_data: notes_per_degree_relative = get_emphasised_scale_degrees_relative( part_data[DATA_NOTES], score_data ) all_degrees = sum(value for value in notes_per_degree_relative.values()) for key, value in notes_per_degree_relative.items(): part_features[DEGREE_RELATIVE_COUNT.format(key=key)] = value part_features[DEGREE_RELATIVE_PER.format(key=key)] = ( value / all_degrees if all_degrees != 0 else 0 )
[docs]def update_score_objects( score_data: dict, parts_data: List[dict], cfg: Configuration, parts_features: List[dict], score_features: dict, ): parts_data = _filter_parts_data(parts_data, cfg.parts_filter) features = {} if len(parts_data) == 0: return degree = score_data[DATA_KEY] score_notes_per_degree = {} for part_data in parts_data: notes = part_data[DATA_NOTES] notes_per_degree_relative = get_emphasised_scale_degrees_relative( part_data[DATA_NOTES], score_data ) for degree, notes in notes_per_degree_relative.items(): if degree not in score_notes_per_degree: score_notes_per_degree[degree] = 0 score_notes_per_degree[degree] += notes all_score_degrees = sum(value for value in score_notes_per_degree.values()) for degree, value in score_notes_per_degree.items(): features[get_score_feature(DEGREE_RELATIVE_COUNT.format(key=degree))] = value features[get_score_feature(DEGREE_RELATIVE_PER.format(key=degree))] = ( value / all_score_degrees if all_score_degrees != 0 else 0 ) for part_data, parts_features in zip(parts_data, parts_features): part_prefix = get_part_prefix(part_data[DATA_PART_ABBREVIATION]) for feature in parts_features: if "Degree" and "relative" in feature: features[f"{part_prefix}{feature}"] = parts_features[feature] score_features.update(features)