Cadences#

Hide imports
%load_ext autoreload
%autoreload 2
import os
from collections import Counter, defaultdict

import dimcat as dc
import ms3
import pandas as pd
import plotly.express as px
from dimcat import plotting
from dimcat.steps import filters, groupers, slicers

import utils
/usr/lib/python3/dist-packages/requests/__init__.py:106: RequestsDependencyWarning: urllib3 (2.0.7) or chardet (6.0.0.post1)/charset_normalizer (None) doesn't match a supported version!
  warnings.warn(
Hide source
RESULTS_PATH = os.path.abspath(os.path.join(utils.OUTPUT_FOLDER, "cadences"))
os.makedirs(RESULTS_PATH, exist_ok=True)


def make_output_path(
    filename: str,
    extension=None,
    path=RESULTS_PATH,
) -> str:
    return utils.make_output_path(filename=filename, extension=extension, path=path)


def save_figure_as(
    fig, filename, formats=("png", "pdf"), directory=RESULTS_PATH, **kwargs
):
    if formats is not None:
        for fmt in formats:
            plotting.write_image(fig, filename, directory, format=fmt, **kwargs)
    else:
        plotting.write_image(fig, filename, directory, **kwargs)

Loading data

Hide source
D = utils.get_dataset("bach_solo", corpus_release="v2.19")
package = D.inputs.get_package()
package_info = package._package.custom
git_tag = package_info.get("git_tag")
utils.print_heading("Data and software versions")
print("J.S. Bach – Solo Pieces version v2.19")
print(f"Datapackage '{package.package_name}' @ {git_tag}")
print(f"dimcat version {dc.__version__}\n")
D
Data and software versions
--------------------------

J.S. Bach – Solo Pieces version v2.19
Datapackage 'bach_solo' @ v2.19
dimcat version 3.4.1
Dataset
=======
{'inputs': {'basepath': None,
            'packages': {'bach_solo': ["'bach_solo.measures' (MuseScoreFacetName.MuseScoreMeasures)",
                                       "'bach_solo.notes' (MuseScoreFacetName.MuseScoreNotes)",
                                       "'bach_solo.expanded' (MuseScoreFacetName.MuseScoreHarmonies)",
                                       "'bach_solo.chords' (MuseScoreFacetName.MuseScoreChords)",
                                       "'bach_solo.metadata' (FeatureName.Metadata)"]}},
 'outputs': {'basepath': None, 'packages': {}},
 'pipeline': []}
try:
    cadence_labels = D.get_feature("cadencelabels")
except Exception:
    raise ValueError("Corpus has no cadence annotations.")
cadence_labels
mc mn quarterbeats duration_qb mc_onset mn_onset timesig staff voice volta ... globalkey localkey globalkey_is_minor localkey_is_minor globalkey_mode localkey_mode localkey_resolved localkey_and_mode cadence_type cadence
corpus piece i
bach_solo BWV1009_01_Prelude 107 82 82 243 3.00 0 0 3/4 1 1 <NA> ... C I False False major major I I, major PAC PAC
112 87 87 258 6.00 0 0 3/4 1 1 <NA> ... C I False False major major I I, major PAC PAC
BWV1009_02_Allemande 17 5 4 59/4 2.00 1/2 1/2 4/4 1 1 <NA> ... C I False False major major I I, major PAC PAC
57 13 12 187/4 1.25 1/2 1/2 4/4 1 1 <NA> ... C V False False major major V V, major PAC PAC
77 18 17 267/4 2.00 1/2 1/2 4/4 1 1 <NA> ... C vi False True major minor vi vi, major PAC PAC
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
BWV1013_04_BourreeAnglaise 48 35 34 133/2 1.75 0 0 2/4 1 1 <NA> ... a iv True True minor minor iv iv, minor PAC PAC
61 47 46 181/2 1.50 0 0 2/4 1 1 <NA> ... a v True True minor minor v v, minor PAC PAC
71 54 53 209/2 4.00 0 0 2/4 1 1 <NA> ... a i True True minor minor i i, minor HC HC
85 63 62 245/2 2.00 0 0 2/4 1 1 <NA> ... a i True True minor minor i i, minor PAC PAC
97 71 70 277/2 1.50 0 0 2/4 1 1 <NA> ... a i True True minor minor i i, minor PAC PAC

191 rows × 22 columns

cadence_labels.plot_grouped(
    title="Distribution of cadence types over the DLC",
    output=make_output_path("all_cadences_pie"),
    width=1000,
    height=1000,
)

Metadata#

cadence_filter = filters.HasCadenceAnnotationsFilter()
filtered_D = cadence_filter.process(D)
hascadence_metadata = filtered_D.get_metadata()
chronological_corpus_names = hascadence_metadata.get_corpus_names()
cadence_counts = cadence_labels.apply_step("Counter")
cadence_counts.plot_grouped("corpus")
mean_composition_years = (
    hascadence_metadata.groupby(level="corpus").composed_end.mean().astype(int).sort_values()
)
chronological_corpus_names = hascadence_metadata.get_corpus_names()
bar_data = pd.concat(
    [
        mean_composition_years.rename("year"),
        hascadence_metadata.groupby(level="corpus").size().rename("pieces"),
    ],
    axis=1,
).rename_axis("corpus").reset_index()
fig = px.bar(
    bar_data,
    x="year",
    y="pieces",
    color="corpus",
    title="Pieces contained in the dataset",
)
fig.update_traces(width=5)

Overall#

  • PAC: Perfect Authentic Cadence

  • IAC: Imperfect Authentic Cadence

  • HC: Half Cadence

  • DC: Deceptive Cadence

  • EC: Evaded Cadence

  • PC: Plagal Cadence

print(f"{len(cadence_labels)} cadence labels.")
utils.value_count_df(cadence_labels.cadence)
191 cadence labels.
counts %
cadence
PAC 123 64.4
IAC 36 18.85
HC 30 15.71
PC 2 1.05

Per dataset#

all_labels = D.get_feature("harmonylabels")
cadence_count_per_dataset = all_labels.groupby("corpus").cadence.value_counts()
cadence_fraction_per_dataset = (
    cadence_count_per_dataset / cadence_count_per_dataset.groupby(level=0).sum()
)
cadence_fraction_per_dataset = cadence_fraction_per_dataset.rename(
    "fraction"
).reset_index()
cadence_fraction_per_dataset["corpus_name"] = cadence_fraction_per_dataset.corpus.map(
    utils.get_corpus_display_name
)
fig = px.bar(
    cadence_fraction_per_dataset,
    x="corpus_name",
    y="fraction",
    title="Distribution of cadence types per corpus",
    color="cadence",
    color_discrete_map=plotting.CADENCE_COLORS,
    labels=dict(corpus_name="", fraction="Fraction of all cadences"),
    category_orders=dict(corpus_name=chronological_corpus_names),
)
fig.update_layout(**utils.STD_LAYOUT)
save_figure_as(fig, "all_cadences_corpuswise_stacked_bars", height=1000)
fig.show()
fig = px.pie(
    cadence_count_per_dataset.rename("count").reset_index(),
    names="cadence",
    color="cadence",
    values="count",
    facet_col="corpus",
    facet_col_wrap=4,
    height=2000,
    color_discrete_map=plotting.CADENCE_COLORS,
)
fig.for_each_annotation(lambda a: a.update(text=a.text.split("=")[-1]))
fig.update_layout(**utils.STD_LAYOUT)
save_figure_as(fig, "all_cadences_corpuswise_pies")
fig.show()
cadence_count_per_mode = (
    all_labels.groupby("localkey_is_minor").cadence.value_counts().reset_index()
)
cadence_count_per_mode["mode"] = cadence_count_per_mode.localkey_is_minor.map(
    {False: "major", True: "minor"}
)
fig = px.pie(
    cadence_count_per_mode,
    names="cadence",
    color="cadence",
    values="count",
    facet_col="mode",
    height=2000,
    color_discrete_map=plotting.CADENCE_COLORS,
)
fig.for_each_annotation(lambda a: a.update(text=a.text.split("=")[-1]))
fig.update_layout(**utils.STD_LAYOUT)
save_figure_as(fig, "all_cadences_modewise_pies")
fig.show()

Per phrase#

Number of cadences per phrase#

grouped_by_corpus = groupers.CorpusGrouper().process(D)
phrase_slicer = slicers.PhraseSlicer()
segmented = phrase_slicer.process(grouped_by_corpus)
phrases = phrase_slicer.slice_metadata.df
phrase_segments = segmented.get_feature("DcmlAnnotations").df
phrase_index_names = list(phrase_segments.index.names[:3])
if phrases.index.nlevels > 3:
    phrases = phrases.droplevel(list(range(3, phrases.index.nlevels)))
if phrases.index.nlevels != 3:
    raise ValueError("Phrase metadata index must have corpus, piece, and phrase levels.")
phrases.index = phrases.index.set_names(phrase_index_names)
if phrases.index.has_duplicates:
    phrases = phrases[~phrases.index.duplicated(keep="first")]
phrase_gpb = phrase_segments.groupby(level=[0, 1, 2])
local_keys_per_phrase = phrase_gpb.localkey.unique().map(tuple)
n_local_keys_per_phrase = local_keys_per_phrase.map(len)
phrases_with_keys = pd.concat(
    [
        n_local_keys_per_phrase.rename("n_local_keys"),
        local_keys_per_phrase.rename("local_keys"),
        phrases,
    ],
    axis=1,
)
phrases_with_cadences = pd.concat(
    [
        phrase_gpb.cadence.nunique().rename("n_cadences"),
        phrase_gpb.cadence.unique()
        .rename("cadences")
        .map(lambda arr: tuple(e for e in arr if not pd.isnull(e))),
        phrases_with_keys,
    ],
    axis=1,
)
utils.value_count_df(phrases_with_cadences.n_cadences, counts_column="#phrases")
/home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py:320: FutureWarning:

Setting an item of incompatible dtype is deprecated and will raise in a future error of pandas. Value '[<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>]' has dtype incompatible with float64, please explicitly cast to a compatible dtype first.
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 20.0), [18.25, 42.0), [36.25, 78.0), [78.0, 108.0), [108.0, 182.0), [180.25, 215.0), [210.25, 246.0), [244.25, 250.25)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 16.75), [15.75, 48.0), [48.0, 68.75), [67.5, 85.25), [85.25, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.5), [23.0, 120.0), [120.0, 168.5), [167.0, 252.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.0), [24.0, 48.0), [48.0, 60.0), [59.5, 72.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 17.0), [16.0, 32.0), [32.0, 49.0), [48.0, 66.0), [64.0, 80.0), [80.0, 112.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 17.0), [17.0, 33.0), [32.0, 50.0), [48.0, 64.0), [64.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 30.0), [30.0, 72.0), [72.0, 84.0), [84.0, 108.0), [108.0, 120.5), [120.0, 162.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 104.0), [104.0, 204.0), [194.5, 244.0), [244.0, 324.0), [324.0, 364.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.5), [23.75, 68.5), [64.0, 90.5), [88.0, 104.0), [104.0, 113.5), [112.0, 160.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 26.5), [22.5, 71.5), [67.5, 78.0), [78.0, 126.5), [124.5, 192.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 24.0), [24.0, 38.0), [36.0, 48.0), [48.0, 60.0), [60.0, 72.0), [72.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 18.0), [16.0, 32.0), [32.0, 53.0), [48.0, 88.0), [88.0, 106.0), [104.0, 161.0), [160.0, 176.0), [176.0, 192.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 17.0), [16.0, 32.0), [32.0, 48.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.5), [12.0, 62.0), [60.0, 72.0), [72.0, 108.5), [108.5, 126.5), [126.5, 156.0), [156.0, 168.5), [168.0, 252.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 37.25), [37.25, 59.0), [57.0, 84.0), [81.25, 105.5), [105.0, 128.0) ... [228.0, 270.0), [270.0, 299.0), [299.0, 338.0), [338.0, 377.5), [377.5, 399.5)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 54.0), [54.0, 76.25), [72.0, 82.0), [82.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 30.5), [30.5, 72.0), [72.0, 86.5), [86.5, 112.5), [110.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 16.0), [16.0, 50.0), [48.0, 66.0), [64.0, 80.0), [80.0, 98.0), [96.0, 120.0), [120.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 16.0), [16.0, 33.0), [32.0, 52.0), [48.0, 88.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 11.75), [11.75, 21.5), [21.5, 36.5), [36.0, 47.75), [47.75, 60.5), [59.75, 89.75), [89.75, 108.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 55.5), [54.0, 121.5), [120.0, 270.0), [270.0, 306.0), [306.0, 594.0), [594.0, 624.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 9.25), [9.25, 28.25), [28.25, 32.75), [32.0, 38.25), [38.25, 47.25), [47.25, 55.25), [54.625, 76.25), [76.25, 80.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.5), [23.0, 90.5), [84.0, 96.5), [95.0, 126.5), [125.0, 144.5), [144.5, 216.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.0), [24.0, 54.0), [48.0, 72.0), [71.0, 100.0), [95.0, 143.0), [143.0, 192.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 18.0), [16.0, 32.0), [32.0, 49.0), [48.0, 65.0), [64.0, 80.0), [80.0, 96.0), [96.0, 112.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 11.0), [8.0, 16.0), [16.0, 26.0), [25.0, 32.0), [32.0, 43.0), [40.0, 51.0), [48.0, 53.0), [80.0, 91.0), [88.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 48.0), [48.0, 60.5), [60.0, 86.0), [84.0, 96.0), [96.0, 108.0), [108.0, 129.5), [129.5, 156.5), [156.0, 204.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.25, 89.0), [88.25, 100.0), [96.25, 180.0), [178.25, 184.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 54.0), [48.0, 60.0), [60.0, 78.0), [78.0, 102.0), [102.0, 138.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.CadenceLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 42.5), [40.0, 68.25), [68.25, 92.0), [92.0, 108.5), [108.0, 124.5), [124.5, 140.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 7.0), [6.625, 33.125), [33.125, 49.0), [49.0, 52.0), [52.0, 59.0), [58.625, 88.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.5, 19.0), [19.0, 41.0), [41.0, 56.0), [52.5, 96.0), [94.5, 164.0) ... [240.5, 252.0), [252.0, 293.5), [293.5, 317.0), [316.5, 344.0), [344.0, 376.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 13.5), [11.0, 21.0), [21.0, 48.0), [48.0, 72.0), [72.0, 108.0), [108.0, 120.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 81.0), [81.0, 123.0), [121.75, 204.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 25.0), [24.0, 48.0), [48.0, 72.0), [72.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 18.0), [18.0, 40.5), [36.0, 72.0), [72.0, 108.0), [108.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 19.0), [16.0, 81.0), [80.0, 113.0), [112.0, 153.0), [150.0, 217.0), [214.0, 272.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 19.5), [16.0, 81.5), [80.0, 113.5), [112.0, 149.5), [149.5, 213.5), [213.5, 272.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 7.0), [7.0, 26.0), [24.625, 45.25), [45.25, 52.0), [52.0, 64.0), [62.375, 71.5), [70.625, 82.0), [82.0, 92.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 21.0), [21.0, 36.0), [33.0, 55.0), [55.0, 78.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 72.0), [72.0, 101.5), [96.0, 174.0), [174.0, 232.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 82.0), [79.0, 134.0), [134.0, 210.0), [207.0, 270.0), [262.5, 370.0) ... [979.0, 1154.0), [1152.0, 1234.0), [1231.0, 1290.0), [1287.0, 1362.0), [1359.0, 1416.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 13.0), [12.0, 24.0), [24.0, 36.0), [36.0, 54.0), [52.5, 78.0) ... [138.0, 150.0), [150.0, 162.0), [162.0, 174.0), [174.0, 186.0), [186.0, 198.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 17.0), [16.0, 65.0), [64.0, 81.0), [80.0, 113.0), [112.0, 128.0), [128.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.5), [11.75, 51.5), [48.0, 60.5), [60.5, 72.5), [72.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 16.25), [15.0, 68.25), [64.0, 94.25), [93.0, 128.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.5), [23.0, 57.5), [54.0, 84.5), [83.0, 126.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 26.0), [24.0, 36.0), [36.0, 48.0), [46.5, 72.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.5), [12.0, 36.0), [36.0, 60.0), [60.0, 72.0), [72.0, 81.5), [81.5, 102.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 24.0), [24.0, 36.0), [36.0, 48.0), [48.0, 72.0), [70.25, 84.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 26.0), [24.0, 36.0), [36.0, 48.0), [48.0, 61.0), [60.0, 72.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 20.0), [18.25, 42.0), [36.25, 78.0), [78.0, 108.0), [108.0, 182.0), [180.25, 215.0), [210.25, 246.0), [244.25, 250.25)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 16.75), [15.75, 48.0), [48.0, 68.75), [67.5, 85.25), [85.25, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.5), [23.0, 120.0), [120.0, 168.5), [167.0, 252.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.0), [24.0, 48.0), [48.0, 60.0), [59.5, 72.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 17.0), [16.0, 32.0), [32.0, 49.0), [48.0, 66.0), [64.0, 80.0), [80.0, 112.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 17.0), [17.0, 33.0), [32.0, 50.0), [48.0, 64.0), [64.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 30.0), [30.0, 72.0), [72.0, 84.0), [84.0, 108.0), [108.0, 120.5), [120.0, 162.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 104.0), [104.0, 204.0), [194.5, 244.0), [244.0, 324.0), [324.0, 364.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.5), [23.75, 68.5), [64.0, 90.5), [88.0, 104.0), [104.0, 113.5), [112.0, 160.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 26.5), [22.5, 71.5), [67.5, 78.0), [78.0, 126.5), [124.5, 192.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 24.0), [24.0, 38.0), [36.0, 48.0), [48.0, 60.0), [60.0, 72.0), [72.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 18.0), [16.0, 32.0), [32.0, 53.0), [48.0, 88.0), [88.0, 106.0), [104.0, 161.0), [160.0, 176.0), [176.0, 192.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 17.0), [16.0, 32.0), [32.0, 48.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.5), [12.0, 62.0), [60.0, 72.0), [72.0, 108.5), [108.5, 126.5), [126.5, 156.0), [156.0, 168.5), [168.0, 252.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 37.25), [37.25, 59.0), [57.0, 84.0), [81.25, 105.5), [105.0, 128.0) ... [228.0, 270.0), [270.0, 299.0), [299.0, 338.0), [338.0, 377.5), [377.5, 399.5)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 54.0), [54.0, 76.25), [72.0, 82.0), [82.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 30.5), [30.5, 72.0), [72.0, 86.5), [86.5, 112.5), [110.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 16.0), [16.0, 50.0), [48.0, 66.0), [64.0, 80.0), [80.0, 98.0), [96.0, 120.0), [120.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 16.0), [16.0, 33.0), [32.0, 52.0), [48.0, 88.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 11.75), [11.75, 21.5), [21.5, 36.5), [36.0, 47.75), [47.75, 60.5), [59.75, 89.75), [89.75, 108.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 55.5), [54.0, 121.5), [120.0, 270.0), [270.0, 306.0), [306.0, 594.0), [594.0, 624.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 9.25), [9.25, 28.25), [28.25, 32.75), [32.0, 38.25), [38.25, 47.25), [47.25, 55.25), [54.625, 76.25), [76.25, 80.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.5), [23.0, 90.5), [84.0, 96.5), [95.0, 126.5), [125.0, 144.5), [144.5, 216.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.0), [24.0, 54.0), [48.0, 72.0), [71.0, 100.0), [95.0, 143.0), [143.0, 192.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 18.0), [16.0, 32.0), [32.0, 49.0), [48.0, 65.0), [64.0, 80.0), [80.0, 96.0), [96.0, 112.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 11.0), [8.0, 16.0), [16.0, 26.0), [25.0, 32.0), [32.0, 43.0), [40.0, 51.0), [48.0, 53.0), [80.0, 91.0), [88.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 48.0), [48.0, 60.5), [60.0, 86.0), [84.0, 96.0), [96.0, 108.0), [108.0, 129.5), [129.5, 156.5), [156.0, 204.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.25, 89.0), [88.25, 100.0), [96.25, 180.0), [178.25, 184.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 54.0), [48.0, 60.0), [60.0, 78.0), [78.0, 102.0), [102.0, 138.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.HarmonyLabels -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 42.5), [40.0, 68.25), [68.25, 92.0), [92.0, 108.5), [108.0, 124.5), [124.5, 140.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 7.0), [6.625, 33.125), [33.125, 49.0), [49.0, 52.0), [52.0, 59.0), [58.625, 88.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.5, 19.0), [19.0, 41.0), [41.0, 56.0), [52.5, 96.0), [94.5, 164.0) ... [240.5, 252.0), [252.0, 293.5), [293.5, 317.0), [316.5, 344.0), [344.0, 376.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 13.5), [11.0, 21.0), [21.0, 48.0), [48.0, 72.0), [72.0, 108.0), [108.0, 120.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 81.0), [81.0, 123.0), [121.75, 204.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 25.0), [24.0, 48.0), [48.0, 72.0), [72.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 18.0), [18.0, 40.5), [36.0, 72.0), [72.0, 108.0), [108.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 19.0), [16.0, 81.0), [80.0, 113.0), [112.0, 153.0), [150.0, 217.0), [214.0, 272.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 19.5), [16.0, 81.5), [80.0, 113.5), [112.0, 149.5), [149.5, 213.5), [213.5, 272.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 7.0), [7.0, 26.0), [24.625, 45.25), [45.25, 52.0), [52.0, 64.0), [62.375, 71.5), [70.625, 82.0), [82.0, 92.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 21.0), [21.0, 36.0), [33.0, 55.0), [55.0, 78.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 72.0), [72.0, 101.5), [96.0, 174.0), [174.0, 232.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 82.0), [79.0, 134.0), [134.0, 210.0), [207.0, 270.0), [262.5, 370.0) ... [979.0, 1154.0), [1152.0, 1234.0), [1231.0, 1290.0), [1287.0, 1362.0), [1359.0, 1416.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 13.0), [12.0, 24.0), [24.0, 36.0), [36.0, 54.0), [52.5, 78.0) ... [138.0, 150.0), [150.0, 162.0), [162.0, 174.0), [174.0, 186.0), [186.0, 198.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 17.0), [16.0, 65.0), [64.0, 81.0), [80.0, 113.0), [112.0, 128.0), [128.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.5), [11.75, 51.5), [48.0, 60.5), [60.5, 72.5), [72.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 16.25), [15.0, 68.25), [64.0, 94.25), [93.0, 128.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.5), [23.0, 57.5), [54.0, 84.5), [83.0, 126.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 26.0), [24.0, 36.0), [36.0, 48.0), [46.5, 72.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.5), [12.0, 36.0), [36.0, 60.0), [60.0, 72.0), [72.0, 81.5), [81.5, 102.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 24.0), [24.0, 36.0), [36.0, 48.0), [48.0, 72.0), [70.25, 84.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 26.0), [24.0, 36.0), [36.0, 48.0), [48.0, 61.0), [60.0, 72.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 20.0), [18.25, 42.0), [36.25, 78.0), [78.0, 108.0), [108.0, 182.0), [180.25, 215.0), [210.25, 246.0), [244.25, 250.25)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 16.75), [15.75, 48.0), [48.0, 68.75), [67.5, 85.25), [85.25, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.5), [23.0, 120.0), [120.0, 168.5), [167.0, 252.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.0), [24.0, 48.0), [48.0, 60.0), [59.5, 72.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 17.0), [16.0, 32.0), [32.0, 49.0), [48.0, 66.0), [64.0, 80.0), [80.0, 112.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 17.0), [17.0, 33.0), [32.0, 50.0), [48.0, 64.0), [64.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 30.0), [30.0, 72.0), [72.0, 84.0), [84.0, 108.0), [108.0, 120.5), [120.0, 162.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 104.0), [104.0, 204.0), [194.5, 244.0), [244.0, 324.0), [324.0, 364.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.5), [23.75, 68.5), [64.0, 90.5), [88.0, 104.0), [104.0, 113.5), [112.0, 160.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 26.5), [22.5, 71.5), [67.5, 78.0), [78.0, 126.5), [124.5, 192.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 24.0), [24.0, 38.0), [36.0, 48.0), [48.0, 60.0), [60.0, 72.0), [72.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 18.0), [16.0, 32.0), [32.0, 53.0), [48.0, 88.0), [88.0, 106.0), [104.0, 161.0), [160.0, 176.0), [176.0, 192.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 17.0), [16.0, 32.0), [32.0, 48.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.5), [12.0, 62.0), [60.0, 72.0), [72.0, 108.5), [108.5, 126.5), [126.5, 156.0), [156.0, 168.5), [168.0, 252.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 37.25), [37.25, 59.0), [57.0, 84.0), [81.25, 105.5), [105.0, 128.0) ... [228.0, 270.0), [270.0, 299.0), [299.0, 338.0), [338.0, 377.5), [377.5, 399.5)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 54.0), [54.0, 76.25), [72.0, 82.0), [82.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 30.5), [30.5, 72.0), [72.0, 86.5), [86.5, 112.5), [110.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 16.0), [16.0, 50.0), [48.0, 66.0), [64.0, 80.0), [80.0, 98.0), [96.0, 120.0), [120.0, 144.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 16.0), [16.0, 33.0), [32.0, 52.0), [48.0, 88.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 11.75), [11.75, 21.5), [21.5, 36.5), [36.0, 47.75), [47.75, 60.5), [59.75, 89.75), [89.75, 108.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 55.5), [54.0, 121.5), [120.0, 270.0), [270.0, 306.0), [306.0, 594.0), [594.0, 624.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 9.25), [9.25, 28.25), [28.25, 32.75), [32.0, 38.25), [38.25, 47.25), [47.25, 55.25), [54.625, 76.25), [76.25, 80.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.5), [23.0, 90.5), [84.0, 96.5), [95.0, 126.5), [125.0, 144.5), [144.5, 216.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 24.0), [24.0, 54.0), [48.0, 72.0), [71.0, 100.0), [95.0, 143.0), [143.0, 192.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 18.0), [16.0, 32.0), [32.0, 49.0), [48.0, 65.0), [64.0, 80.0), [80.0, 96.0), [96.0, 112.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 11.0), [8.0, 16.0), [16.0, 26.0), [25.0, 32.0), [32.0, 43.0), [40.0, 51.0), [48.0, 53.0), [80.0, 91.0), [88.0, 96.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 48.0), [48.0, 60.5), [60.0, 86.0), [84.0, 96.0), [96.0, 108.0), [108.0, 129.5), [129.5, 156.5), [156.0, 204.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.25, 89.0), [88.25, 100.0), [96.25, 180.0), [178.25, 184.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 12.0), [12.0, 54.0), [48.0, 60.0), [60.0, 78.0), [78.0, 102.0), [102.0, 138.0)], dtype='interval[float64, left]', name='phrase_slice')
WARNING  dimcat.data.resources.features.DcmlAnnotations -- /home/runner/.local/lib/python3.12/site-packages/dimcat/data/resources/utils.py (line 1317) in overlapping_chunk_per_interval_cutoff_direct():
	Intervals are not non-overlapping and/or not monotonically increasing:
IntervalIndex([[0.0, 42.5), [40.0, 68.25), [68.25, 92.0), [92.0, 108.5), [108.0, 124.5), [124.5, 140.0)], dtype='interval[float64, left]', name='phrase_slice')
#phrases %
n_cadences
0 209 53.32
1 147 37.50
2 36 9.18
n_cad = (
    phrases_with_cadences.groupby(level="corpus")
    .n_cadences.value_counts()
    .rename("counts")
    .reset_index()
    .sort_values("n_cadences")
)
n_cad.n_cadences = n_cad.n_cadences.astype(str)
fig = px.bar(
    n_cad,
    x="corpus",
    y="counts",
    color="n_cadences",
    height=800,
    barmode="group",
    labels=dict(n_cadences="#cadences in a phrase"),
    category_orders=dict(dataset=chronological_corpus_names),
)
save_figure_as(fig, "n_cadences_per_phrase_corpuswise_absolute_grouped_bars")
fig.show()

Combinations of cadence types for phrases with more than one cadence#

utils.value_count_df(
    phrases_with_cadences[phrases_with_cadences.n_cadences > 1].cadences
)
counts %
cadences
(PAC, HC) 10 27.78
(IAC, PAC) 9 25.00
(HC, PAC) 6 16.67
(PAC, IAC) 6 16.67
(IAC, HC) 3 8.33
(PAC, PC) 1 2.78
(PC, HC) 1 2.78

Positioning of cadences within phrases#

df_rows = []
y_position = 0
for ix in (
    phrases_with_cadences[phrases_with_cadences.n_cadences > 0]
    .sort_values("duration_qb")
    .index
):
    df = phrase_segments.loc[ix]
    description = str(ix)
    if df.cadence.notna().any():
        interval = ix[2]
        df_rows.append((y_position, interval.length, "end of phrase", description))
        start_pos = interval.left
        cadences = df.loc[df.cadence.notna(), ["quarterbeats", "cadence"]]
        cadences.quarterbeats = cadences.quarterbeats.map(float) - start_pos
        for cadence_x, cadence_type in cadences.itertuples(index=False, name=None):
            df_rows.append((y_position, cadence_x, cadence_type, description))
        y_position += 1
    # else:
    #    df_rows.append((y_position, pd.NA, pd.NA, description))

data = pd.DataFrame(df_rows, columns=["phrase_ix", "x", "marker", "description"])
fig = px.scatter(
    data[data.x.notna()],
    x="x",
    y="phrase_ix",
    color="marker",
    hover_name="description",
    height=3000,
    labels=dict(marker="legend"),
    color_discrete_map=plotting.CADENCE_COLORS,
)
fig.update_traces(marker_size=5)
fig.update_yaxes(autorange="reversed")
save_figure_as(fig, "cadence_positions_within_all_phrases")
fig.show()

Cadence ultima#

phrase_segments = phrase_segments.copy()
cadence_selector = phrase_segments.cadence.notna()
missing_chord_selector = phrase_segments.chord.isna()
cadence_with_missing_chord_selector = cadence_selector & missing_chord_selector
missing = phrase_segments[cadence_with_missing_chord_selector]
if cadence_with_missing_chord_selector.any():
    expanded = ms3.expand_dcml.expand_labels(
        phrase_segments[cadence_with_missing_chord_selector],
        propagate=False,
        chord_tones=True,
        skip_checks=True,
    )
    phrase_segments.loc[cadence_with_missing_chord_selector] = expanded
print(
    f"Ultima harmony missing for {(phrase_segments.cadence.notna() & phrase_segments.bass_note.isna()).sum()} cadence "
    f"labels."
)
Ultima harmony missing for 0 cadence labels.

Ultimae as Roman numeral#

def highlight(row, color="#ffffb3"):
    if row.counts < 10:
        return [None, None, None, None]
    else:
        return ["background-color: {color};"] * 4


cadence_counts = all_labels.cadence.value_counts()
ultima_root = (
    phrase_segments.groupby(["localkey_is_minor", "cadence"])
    .numeral.value_counts()
    .rename("counts")
    .to_frame()
    .reset_index()
)
ultima_root.localkey_is_minor = ultima_root.localkey_is_minor.map(
    {False: "in major", True: "in minor"}
)
# ultima_root.style.apply(highlight, axis=1)
fig = px.pie(
    ultima_root,
    names="numeral",
    values="counts",
    facet_row="cadence",
    facet_col="localkey_is_minor",
    height=1500,
    category_orders={"cadence": cadence_counts.index},
)
fig.for_each_annotation(lambda a: a.update(text=a.text.split("=")[-1]))
fig.update_traces(textposition="inside", textinfo="percent+label")
fig.update_layout(**utils.STD_LAYOUT)
save_figure_as(fig, "ultima_root_distributions_over_cadence_types_maj_min_pies")
fig.show()
# phrase_segments.groupby(level=[0,1,2], group_keys=False).apply(lambda df: df if ((df.cadence == 'PAC') &
# (df.numeral == 'V')).any() else None)

Ultimae bass note as scale degree#

ultima_bass = (
    phrase_segments.groupby(["localkey_is_minor", "cadence"])
    .bass_note.value_counts()
    .rename("counts")
    .reset_index()
)
ultima_bass.bass_note = ms3.transform(
    ultima_bass, ms3.fifths2sd, dict(fifths="bass_note", minor="localkey_is_minor")
)
ultima_bass.localkey_is_minor = ultima_bass.localkey_is_minor.map(
    {False: "in major", True: "in minor"}
)
# ultima_bass.style.apply(highlight, axis=1)
fig = px.pie(
    ultima_bass,
    names="bass_note",
    values="counts",
    facet_row="cadence",
    facet_col="localkey_is_minor",
    height=1500,
    category_orders={"cadence": cadence_counts.index},
)
fig.for_each_annotation(lambda a: a.update(text=a.text.split("=")[-1]))
fig.update_traces(textposition="inside", textinfo="percent+label")
fig.update_layout(**utils.STD_LAYOUT)
save_figure_as(fig, "ultima_degree_distributions_over_cadence_types_maj_min_pies")
fig.show()

Chord progressions#

PACs with ultima I/i#

def remove_immediate_duplicates(lst):
    return tuple(a for a, b in zip(lst, (None,) + lst) if a != b)


def get_progressions(
    selected="PAC",
    last_row={},
    feature="chord",
    dataset=None,
    as_series=True,
    remove_duplicates=False,
):
    """Uses the nonlocal variable phrase_segments."""
    last_row = {k: v if isinstance(v, tuple) else (v,) for k, v in last_row.items()}
    progressions = []

    for (corp, fname, *_), df in phrase_segments[
        phrase_segments[feature].notna()
    ].groupby(level=[0, 1, 2]):
        if dataset is not None and dataset not in corp:
            continue
        if (df.cadence == selected).fillna(False).any():
            # remove chords after the last cadence label
            df = df[df.cadence.bfill().notna()]
            # group segments leading up to a cadence label
            cadence_groups = df.cadence.notna().shift().fillna(False).cumsum()
            for i, cadence in df.groupby(cadence_groups):
                last_r = cadence.iloc[-1]
                typ = last_r.cadence
                if typ != selected:
                    continue
                if any(last_r[feat] not in values for feat, values in last_row.items()):
                    continue
                if remove_duplicates:
                    progressions.append(
                        remove_immediate_duplicates(cadence[feature].to_list())
                    )
                else:
                    progressions.append(tuple(cadence[feature]))
    if as_series:
        return pd.Series(progressions, dtype="object")
    return progressions
chord_progressions = get_progressions("PAC", dict(numeral=("I", "i")), "chord")
print(f"Progressions for {len(chord_progressions)} cadences:")
utils.value_count_df(chord_progressions, "chord progressions")
Progressions for 170 cadences:
counts %
chord progressions
(I,) 36 21.18
(i,) 19 11.18
(I6, IV, viio6, I) 4 2.35
(i/vi,) 2 1.18
(I6, IV, ii6, V, vi, I6, ii6, V, I) 2 1.18
... ... ...
(viio, I, V, IV6, viio, I, IV6/IV, viio/IV, IV, viio, iii, vi, ii, V, V65/IV, IV(4), IV, vii%7, iii(4), iii, I, ii, V7, I, viio7/V, vii%7, I, V, I) 1 0.59
(iio/iii, V65/iii, III/iii, VI/iii, iio/iii, V/iii, i/iii, V6/iii, i/iii) 1 0.59
(I6, viio, I, #viio7/vi, V/vi, i/vi, #viio7/vi, V2/vi, i6/vi, V/vi, i/vi) 1 0.59
(V, V7, I, ii, ii7, V, iii7, IVM65, V7, vi65, vii%7, I, ii, vii%7, I, V6, I, viio6, I6, V7/IV, IV(4), IV, ii7, V6, I, V6, I) 1 0.59
(iv, #viio/iv, #vio64, iio, V, #viio, iio, #viio43, V, i, V6, i) 1 0.59

109 rows × 2 columns

numeral_progressions = get_progressions("PAC", dict(numeral=("I", "i")), "numeral")
utils.value_count_df(numeral_progressions, "numeral progressions")
counts %
numeral progressions
(I,) 39 22.94
(i,) 23 13.53
(I, IV, vii, I) 4 2.35
(V, IV, vii, I) 3 1.76
(I, V, I, V, I) 2 1.18
... ... ...
(I, vii, I, #vii, V, i, #vii, V, i, V, i) 1 0.59
(V, V, I, ii, ii, V, iii, IV, V, vi, vii, I, ii, vii, I, V, I, vii, I, V, IV, IV, ii, V, I, V, I) 1 0.59
(I, IV, V, V, IV, vii, iii, vi, vii, I, V, I) 1 0.59
(V, IV, V, I) 1 0.59
(iv, #vii, #vi, ii, V, #vii, ii, #vii, V, i, V, i) 1 0.59

101 rows × 2 columns

numeral_prog_no_dups = numeral_progressions.map(remove_immediate_duplicates)
utils.value_count_df(numeral_prog_no_dups)
counts %
(I,) 39 22.94
(i,) 23 13.53
(I, IV, vii, I) 6 3.53
(V, IV, vii, I) 3 1.76
(I, V, I, V, I) 3 1.76
... ... ...
(ii, V, III, VI, ii, V, i, V, i) 1 0.59
(I, vii, I, #vii, V, i, #vii, V, i, V, i) 1 0.59
(V, I, ii, V, iii, IV, V, vi, vii, I, ii, vii, I, V, I, vii, I, V, IV, ii, V, I, V, I) 1 0.59
(I, IV, V, IV, vii, iii, vi, vii, I, V, I) 1 0.59
(iv, #vii, #vi, ii, V, #vii, ii, #vii, V, i, V, i) 1 0.59

99 rows × 2 columns

PACs ending on scale degree 1#

Scale degrees expressed w.r.t. major scale, regardless of actual key.

bass_progressions = get_progressions("PAC", dict(bass_note=0), "bass_note")
bass_prog = bass_progressions.map(ms3.fifths2sd)
print(f"Progressions for {len(bass_progressions)} cadences:")
utils.value_count_df(bass_prog, "bass progressions")
Progressions for 151 cadences:
counts %
bass progressions
(1,) 55 36.42
(3, 4, 2, 1) 4 2.65
(1, 5, 1, 5, 1) 2 1.32
(3, 4, 4, 5, 6, 3, 4, 5, 1) 2 1.32
(1, 3, 4, 2, 1) 2 1.32
... ... ...
(1, 6, 5, 3, 4, 2, 3, 1, 2, 1, 7, 1) 1 0.66
(1, 4, 5, 1) 1 0.66
(5, 3, 2, 2, 2, 2, 2, 5, 5, 5, 1, 5, 1, 5, 5, 5, 1, 1, 2, 2, 3, 6, 5, 4, 2, 5, 3, 2, 1) 1 0.66
(5, 4, b7, 4, b3, b6, 4, 4, 1, 2, 1, 7, 1) 1 0.66
(4, 3, b3, 2, 5, 7, 2, 4, 5, 1, 7, 1) 1 0.66

90 rows × 2 columns

bass_prog_no_dups = bass_prog.map(remove_immediate_duplicates)
utils.value_count_df(bass_prog_no_dups)
counts %
(1,) 55 36.42
(3, 4, 2, 1) 4 2.65
(1, 5, 1, 5, 1) 2 1.32
(3, 4, 5, 6, 3, 4, 5, 1) 2 1.32
(1, 7, 1) 2 1.32
... ... ...
(5, 1, 2, 5, 3, 6, 5, 1, 7, 1, 2, 7, 1, 7, 1, 2, 3, 1, 4, 2, 7, 1, 7, 1) 1 0.66
(1, 6, 5, 3, 4, 2, 3, 1, 2, 1, 7, 1) 1 0.66
(1, 4, 5, 1) 1 0.66
(5, 3, 2, 5, 1, 5, 1, 5, 1, 2, 3, 6, 5, 4, 2, 5, 3, 2, 1) 1 0.66
(4, 3, b3, 2, 5, 7, 2, 4, 5, 1, 7, 1) 1 0.66

89 rows × 2 columns

def progressions2graph_data(progressions, cut_at_stage=None):
    stage_nodes = defaultdict(dict)
    edge_weights = Counter()
    node_counter = 0
    for progression in progressions:
        previous_node = None
        for stage, current in enumerate(reversed(progression)):
            if cut_at_stage and stage > cut_at_stage:
                break
            if current in stage_nodes[stage]:
                current_node = stage_nodes[stage][current]
            else:
                stage_nodes[stage][current] = node_counter
                current_node = node_counter
                node_counter += 1
            if previous_node is not None:
                edge_weights.update([(current_node, previous_node)])
            previous_node = current_node
    return stage_nodes, edge_weights


def plot_progressions(progressions, cut_at_stage=None, **kwargs):
    stage_nodes, edge_weights = progressions2graph_data(
        progressions, cut_at_stage=cut_at_stage
    )
    if not stage_nodes:
        fig = px.scatter(pd.DataFrame({"x": [], "y": []}), x="x", y="y")
        fig.update_layout(
            title="No matching progressions",
            xaxis=dict(visible=False),
            yaxis=dict(visible=False),
            annotations=[dict(text="No matching progressions", x=0.5, y=0.5, xref="paper", yref="paper", showarrow=False)],
        )
        return fig
    return utils.graph_data2sankey(stage_nodes, edge_weights, **kwargs)

Chordal roots for the 3 last stages#

fig = plot_progressions(
    numeral_prog_no_dups,
    cut_at_stage=3,
    font=dict(size=30),
)
save_figure_as(fig, "last_3_roots_before_pacs_ending_on_1_sankey", height=800)
fig.show()

Complete chords for the last four stages in major#

pac_major = get_progressions("PAC", dict(numeral="I", localkey_is_minor=False), "chord")
fig = plot_progressions(pac_major, cut_at_stage=4)
save_figure_as(fig, "last_4_stages_before_pacs_in_major_sankey")
fig.show()

Bass degrees for the last 6 stages.#

fig = plot_progressions(bass_prog_no_dups, cut_at_stage=7)
save_figure_as(fig, "last_7_degrees_before_pacs_ending_on_1_sankey")
fig.show()

Bass degrees without accidentals#

def remove_sd_accidentals(t):
    return tuple(map(lambda sd: sd[-1], t))


bass_prog_no_acc_no_dup = bass_prog.map(remove_sd_accidentals).map(
    remove_immediate_duplicates
)
fig = plot_progressions(bass_prog_no_acc_no_dup, cut_at_stage=7)
save_figure_as(fig, "last_7_degrees_before_pacs_ending_on_1_without_accdentals_sankey")
fig.show()

HCs ending on V#

half = get_progressions("HC", dict(numeral="V"), "bass_note").map(ms3.fifths2sd)
print(f"Progressions for {len(half)} cadences:")
fig = plot_progressions(half.map(remove_immediate_duplicates), cut_at_stage=5)
save_figure_as(fig, "last_7_degrees_before_hcs_ending_on_V_sankey")
fig.show()
Progressions for 34 cadences: