Co-accentuation¶
Whether motion accents land on sound accents, judged against a chance baseline.
Co-accentuation: do motion accents land on sound accents?
From Serdar and Jensenius, Mixed Method Audio-Video Analyses of Felt Togetherness in a Networked Music-Dance Performance, MOCO '26. Each motion peak is tested for an audio onset within a tolerance; the fraction that coincide is the Global Co-Accentuation Index, and a curve over short windows shows whether synchrony came in bursts or was sustained.
This is the measure for the question underneath a project like this one: not whether motion and sound rise together on average, which a correlation answers, but whether the moments line up.
Why the chance baseline is not optional. The index is a raw fraction, and fractions of coincidence rise with density: sprinkle enough onsets over a recording and every motion peak has one within 150 ms whether or not anything is coordinated. An index of 0.8 means nothing until you know what 0.8 would have been by accident. The null here is a circular shift of the onsets, which preserves how many there are and their internal timing, and destroys only their relationship to the motion. Both the observed index and what the null gives are returned, and a claim rests on the difference rather than on the index alone.
The measure is asymmetric, deliberately. It asks what fraction of MOTION peaks found a sound, not the reverse. A dancer moving twice to one sound is a different thing from a musician playing twice to one movement, and a symmetric measure would hide which happened. Swap the arguments to ask the other question.
CoAccentuation
dataclass
¶
CoAccentuation(gci, n_peaks, n_matched, expected_gci, z, p, tolerance_s)
The result of a co-accentuation test.
Attributes:
| Name | Type | Description |
|---|---|---|
gci |
float
|
Global Co-Accentuation Index --- the fraction of motion peaks with an onset within the tolerance. NaN when there were no peaks, because "nothing was coordinated" and "nothing was asked" are different answers. |
n_peaks |
int
|
How many motion peaks were tested. |
n_matched |
int
|
How many found an onset. |
expected_gci |
float
|
The mean index over the circular-shift null. What this recording's density buys by accident. |
z |
float
|
How many null standard deviations the observed index sits above the null mean. |
p |
float
|
Fraction of null draws reaching the observed index. This is the number a claim rests on. |
tolerance_s |
float
|
The window used, echoed back so a figure can state it. |
co_accentuation ¶
co_accentuation(motion_peaks, audio_onsets, duration_s, tolerance_s=0.15, n_null=200, seed=0)
Test whether motion peaks coincide with audio onsets more than by chance.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
motion_peaks
|
Times of motion accents, in seconds. |
required | |
audio_onsets
|
Times of audio onsets, in seconds. |
required | |
duration_s
|
float
|
Length of the recording, needed to wrap the null's shifts. |
required |
tolerance_s
|
float
|
How close counts as coincident. Defaults to 0.15, the value used in the paper this comes from. |
0.15
|
n_null
|
int
|
Circular-shift draws for the null. Defaults to 200. |
200
|
seed
|
int
|
For the shifts, so a reported p-value can be reproduced. |
0
|
Returns:
| Name | Type | Description |
|---|---|---|
CoAccentuation |
CoAccentuation
|
The index, the null it is judged against, and the p-value. |
Source code in musicalgestures/_coaccentuation.py
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | |
co_accentuation_curve ¶
co_accentuation_curve(motion_peaks, audio_onsets, duration_s, window_s=5.0, step_s=1.0, tolerance_s=0.15)
The index over sliding windows, to see whether synchrony was sustained or bursty.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
motion_peaks
|
Times of motion accents, in seconds. |
required | |
audio_onsets
|
Times of audio onsets, in seconds. |
required | |
duration_s
|
float
|
Length of the recording. |
required |
window_s
|
float
|
Window length. Defaults to 5.0, as in the paper. |
5.0
|
step_s
|
float
|
Step between windows. Defaults to 1.0. |
1.0
|
tolerance_s
|
float
|
How close counts as coincident. Defaults to 0.15. |
0.15
|
Returns:
| Name | Type | Description |
|---|---|---|
tuple |
Window start times, and the index in each. A window containing no motion |
|
|
peaks is NaN, not zero: it has no synchrony to report, which is not the same as |
||
|
having looked and found none. |
Source code in musicalgestures/_coaccentuation.py
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | |