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

from typing import List


import numpy as np

from pandas import DataFrame


from musif.common._constants import VOICE_FAMILY

from musif.config import Configuration

from musif.extract.basic_modules.scoring.constants import FAMILY

from musif.extract.common import _filter_parts_data, _part_matches_filter

from musif.extract.constants import (
    DATA_FAMILY,
    DATA_FAMILY_ABBREVIATION,
    DATA_PART_ABBREVIATION,
    DATA_SOUND_ABBREVIATION,
)

from musif.extract.features.core.handler import DATA_NOTES

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

from .constants import *

from musif.extract.features.core.constants import NUM_NOTES


[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) if len(parts_data) == 0: return features = {} for part_data, part_features in zip(parts_data, parts_features): part = part_data[DATA_PART_ABBREVIATION] features[get_part_feature(part, NUM_NOTES)] = part_features[NUM_NOTES] score_features.update(features) notes = {} for j, part in enumerate(parts_data): if part[DATA_PART_ABBREVIATION].startswith("vn"): # capitalization to preserve I and II in Violins notes[ part[DATA_PART_ABBREVIATION][0].upper() + part[DATA_PART_ABBREVIATION][1:] ] = len(part[DATA_NOTES]) elif part[DATA_FAMILY] == VOICE_FAMILY: notes[part[DATA_FAMILY_ABBREVIATION].capitalize()] = int( score_features[ FAMILY + part[DATA_FAMILY_ABBREVIATION].capitalize() + "_NotesMean" ] ) else: abbreviation = ( part[DATA_SOUND_ABBREVIATION][0].upper() + part[DATA_SOUND_ABBREVIATION][1:] ) notes[part[DATA_SOUND_ABBREVIATION].capitalize()] = int( score_features["Sound" + abbreviation + "_NotesMean"] ) for i, (key, value) in enumerate(notes.items()): texture = value / np.asarray(list(notes.values())[i + 1 :]) for j, t in enumerate(texture): part1 = key part2 = list(notes.keys())[j + i + 1] part1_prefix = get_part_prefix(part1).replace("_", "") part2_prefix = get_part_prefix(part2).replace("_", "") score_features[f"{part1_prefix}|{part2_prefix}_{TEXTURE}"] = t
[docs]def update_part_objects( score_data: dict, part_data: dict, cfg: Configuration, part_features: dict ): if not _part_matches_filter(part_data[DATA_PART_ABBREVIATION], cfg.parts_filter): return {} notes = part_data[DATA_NOTES] part_features.update({DATA_NOTES: len(notes)})