Module music_df.humdrum_export.df_to_homo_df

Functions

def df_to_homo_df(df: pandas.DataFrame) ‑> Tuple[pandas.DataFrame, ...]
Expand source code
def df_to_homo_df(df: pd.DataFrame) -> t.Tuple[pd.DataFrame, ...]:
    """
    Returns a tuple of dataframes where all notes are "homophonic" (meaning each unique
    onset is paired with a unique release and all onsets are >= to the release paired
    with the previous onset).
    >>> df = pd.DataFrame(
    ...     {
    ...         "pitch": [0, 60, 64, 60, 64, 60],
    ...         "onset": [0, 0, 0, 1, 1, 1.5],
    ...         "release": [0, 1, 1, 1.5, 3.0, 3.0],
    ...         "type": ["bar"] + ["note"] * 5,
    ...     }
    ... )
    >>> df
       pitch  onset  release  type
    0      0    0.0      0.0   bar
    1     60    0.0      1.0  note
    2     64    0.0      1.0  note
    3     60    1.0      1.5  note
    4     64    1.0      3.0  note
    5     60    1.5      3.0  note
    >>> df1, df2 = df_to_homo_df(df)
    >>> df1
       pitch  onset  release  type
    0      0    0.0      0.0   bar
    1     60    0.0      1.0  note
    2     64    0.0      1.0  note
    3     60    1.0      1.5  note
    4     60    1.5      3.0  note
    >>> df2
       pitch  onset  release  type
    0      0    0.0      0.0   bar
    1     64    1.0      3.0  note
    """
    out = []
    note_mask = df.type == "note"
    i = None
    for _, note in df[note_mask].iterrows():
        for i in it.count():
            if i == len(out):
                out.append([])
                break
            prev_note = out[i][-1]
            if note.onset >= prev_note.release or (
                note.onset == prev_note.onset and note.release == prev_note.release
            ):
                break
        assert i is not None
        out[i].append(note)
    nonnote_df = df[~note_mask]
    return tuple(_merge_nonnotes(pd.DataFrame(x), nonnote_df) for x in out)

Returns a tuple of dataframes where all notes are "homophonic" (meaning each unique onset is paired with a unique release and all onsets are >= to the release paired with the previous onset).

>>> df = pd.DataFrame(
...     {
...         "pitch": [0, 60, 64, 60, 64, 60],
...         "onset": [0, 0, 0, 1, 1, 1.5],
...         "release": [0, 1, 1, 1.5, 3.0, 3.0],
...         "type": ["bar"] + ["note"] * 5,
...     }
... )
>>> df
   pitch  onset  release  type
0      0    0.0      0.0   bar
1     60    0.0      1.0  note
2     64    0.0      1.0  note
3     60    1.0      1.5  note
4     64    1.0      3.0  note
5     60    1.5      3.0  note
>>> df1, df2 = df_to_homo_df(df)
>>> df1
   pitch  onset  release  type
0      0    0.0      0.0   bar
1     60    0.0      1.0  note
2     64    0.0      1.0  note
3     60    1.0      1.5  note
4     60    1.5      3.0  note
>>> df2
   pitch  onset  release  type
0      0    0.0      0.0   bar
1     64    1.0      3.0  note