function trBy (i, p) { var t = pType(p) if (!t) return null var f = fifths(i) + fifths(p) if (isPC(p)) return ['tnlp', [f]] var o = focts(i) + focts(p) if (t === 'note') return ['tnlp', [f, o]] var d = height(i) + height(p) < 0 ? -1 : 1 return ['tnlp', [d * f, d * o], d] }
// a custom height function that // - returns -Infinity for non-pitch objects // - assumes pitch classes has octave -100 (so are sorted before that notes) function objHeight (p) { if (!p) return -Infinity var f = fifths(p) * 7 var o = focts(p) || -Math.floor(f / 12) - 100 return f + o * 12 }