import mem from 'mem' import getKeyXOffsetUnmemoized from './getKeyXOffset' import getOctaveCountUnmemoized from './getOctaveCount' import getFractionalOctaveCountUnmemoized from './getFractionalOctaveCount' import getKeyOctaveUnmemoized from './getKeyOctave' import * as caches from './caches' const getKeyXOffset = mem(getKeyXOffsetUnmemoized, { cache: caches.getKeyXOffset }) const getOctaveCount = mem(getOctaveCountUnmemoized, { cacheKey: (args) => args.join(':') }) const getFractionalOctaveCount = mem(getFractionalOctaveCountUnmemoized, { cacheKey: (args) => args.join(':') }) const getKeyOctave = mem(getKeyOctaveUnmemoized, { cache: caches.getKeyOctave }) type GetKeyLeft = (startKey: number, endKey: number) => (k: number) => number const getKeyLeft: GetKeyLeft = (startKey, endKey) => (k) => { const fractionalOctaveCount = getFractionalOctaveCount(startKey, endKey) const octaveCount = getOctaveCount(startKey, endKey) const startOctave = getKeyOctave(startKey) const octave = getKeyOctave(k) const octaveOffset = ((100 * octaveCount) / fractionalOctaveCount / octaveCount) * (octave - startOctave) const theKeyOffset = octaveOffset + ((100 * octaveCount) / fractionalOctaveCount / octaveCount) * getKeyXOffset(k) const firstKeyOffset = ((100 * octaveCount) / fractionalOctaveCount / octaveCount) * getKeyXOffset(startKey + 12) return theKeyOffset - firstKeyOffset } export default getKeyLeft