x
или 2x
. Примерно как азбука Морзе, только музыкально, в темпе. В итоге получен массив длительностей нот в миллисекундах, например:[145,160,112,170,281,292,258,305,257]
x
и на "2" для длинных 2x
, чтобы для примера выше получилось[1,1,1,1,2,2,2,2,2]
const a = [145,160,112,170,281,292,258,305,257];
const min = Math.min(...a); // 112
a.map(n => Math.round(n / min)) // [ 1, 1, 1, 2, 3, 3, 2, 3, 2 ]
x || 2x
. 2x
и 3x
. Или ещё сложнее – полиритмия с рациональными дробями: 4/4 затем в этом же темпе 6/4 или 5/4. Но это не сейчас.const AB = data => {
const A = [Math.min(...data)];
const B = [Math.max(...data)];
const mean = arr => arr.reduce((a,b) => a + b, 0) / arr.length;
data.forEach(n => {
if (Math.abs(mean(A) - n) <= Math.abs(mean(B) - n))
A.push(n);
else B.push(n);
});
return [A.slice(1), B.slice(1)];
}
AB([145,160,112,170,281,292,258,305,257])
/*
[[145,160,112,170],[281,292,258,305,257]]
*/
>>> import numpy as np
>>> from sklearn.cluster import KMeans
>>> notes = [145, 160, 112, 170, 281, 292, 258, 305, 257]
>>> notes = np.array(notes).reshape(-1, 1)
>>> KMeans(n_clusters=2).fit_predict(notes)
array([0, 0, 0, 0, 1, 1, 1, 1, 1], dtype=int32)
>>> KMeans(n_clusters=2).fit_predict(notes)
array([1, 1, 1, 1, 0, 0, 0, 0, 0], dtype=int32)