Source code for musif.extract.features.harmony.handler
from typing import List
from pandas import DataFrame
from musif.config import Configuration
from musif.extract.features.core.handler import DATA_MODE
from musif.logs import perr
from .constants import *
from .utils import (
get_additions,
get_chord_types,
get_chords,
get_harmonic_rhythm,
get_keyareas,
get_numerals,
)
from ...constants import DATA_MUSESCORE_SCORE
[docs]def get_harmony_data(score_features: dict, harmonic_analysis: DataFrame) -> dict:
harmonic_rhythm = get_harmonic_rhythm(harmonic_analysis)
numerals = get_numerals(harmonic_analysis)
chord_types = get_chord_types(harmonic_analysis)
additions = get_additions(harmonic_analysis)
return dict(**harmonic_rhythm, **numerals, **chord_types, **additions)
[docs]def update_score_objects(
score_data: dict,
parts_data: List[dict],
cfg: Configuration,
parts_features: List[dict],
score_features: dict,
):
features = {}
try:
harmonic_analysis = score_data.get(DATA_MUSESCORE_SCORE)
if harmonic_analysis is None:
features[HARMONY_AVAILABLE] = 0
return features
else:
features[HARMONY_AVAILABLE] = 1
all_harmonic_info = get_harmony_data(score_features, harmonic_analysis)
keyareas = get_keyareas(
harmonic_analysis, major=score_data[DATA_MODE] == "major"
)
chords, chords_grouping1, chords_grouping2 = get_chords(harmonic_analysis)
features[f"{HARMONIC_RHYTHM}"] = all_harmonic_info[HARMONIC_RHYTHM]
features[f"{HARMONIC_RHYTHM_BEATS}"] = all_harmonic_info[HARMONIC_RHYTHM_BEATS]
features.update(
{
k: v
for (k, v) in all_harmonic_info.items()
if k.startswith(NUMERALS_prefix)
}
)
features.update({k: v for (k, v) in keyareas.items()})
features.update(
{
k: v
for (k, v) in all_harmonic_info.items()
if k.startswith(CHORD_TYPES_prefix)
}
)
features.update(
{k: v for (k, v) in chords.items() if k.startswith(CHORD_prefix)}
)
features.update({k: v for (k, v) in chords_grouping1.items()})
features.update({k: v for (k, v) in chords_grouping2.items()})
features.update(
{
k: v
for (k, v) in all_harmonic_info.items()
if k.startswith(ADDITIONS_prefix)
}
)
except Exception as e:
perr(f"Harmony problem found: {str(e)}")
finally:
score_features.update(features)
[docs]def update_part_objects(score_data, part_data, cfg, part_features):
pass