function getInferredOnsets()

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]);
}