in src/toMidi.ts [289:325]
function getInferredOnsets(
onsets: number[][],
frames: number[][],
nDiff: number = 2,
): number[][] {
const diffs = Array.from(Array(nDiff).keys())
.map(n => n + 1)
.map(n => {
const framesAppended: number[][] = Array(n)
.fill(Array(frames[0].length).fill(0))
.concat(frames);
const nPlus = framesAppended.slice(n);
const minusN = framesAppended.slice(0, -n);
if (nPlus.length !== minusN.length) {
throw new Error(
`nPlus length !== minusN length: ${nPlus.length} !== ${minusN.length}`,
);
}
return nPlus.map((row, r) => row.map((v, c) => v - minusN[r][c]));
});
let frameDiff = min3dForAxis0(diffs);
// frame_diff[frame_diff < 0] = 0
frameDiff = frameDiff.map(row => row.map(v => Math.max(v, 0)));
// frame_diff[:n_diff, :] = 0
frameDiff = frameDiff.map((row, r) => (r < nDiff ? row.fill(0) : row));
// rescale to have the same max as onsets
const onsetMax = globalMax(onsets);
const frameDiffMax = globalMax(frameDiff);
frameDiff = frameDiff.map(row => row.map(v => (onsetMax * v) / frameDiffMax));
// use the max of the predicted onsets and the differences
// max_onsets_diff = np.max([onsets, frame_diff], axis=0)
return max3dForAxis0([onsets, frameDiff]);
}