Musical keyboard component written in React.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

27 lines
1.4 KiB

  1. import mem from 'mem'
  2. import getKeyXOffsetUnmemoized from './getKeyXOffset'
  3. import getOctaveCountUnmemoized from './getOctaveCount'
  4. import getFractionalOctaveCountUnmemoized from './getFractionalOctaveCount'
  5. import getKeyOctaveUnmemoized from './getKeyOctave'
  6. import * as caches from './caches'
  7. const getKeyXOffset = mem(getKeyXOffsetUnmemoized, { cache: caches.getKeyXOffset })
  8. const getOctaveCount = mem(getOctaveCountUnmemoized, { cacheKey: (args) => args.join(':') })
  9. const getFractionalOctaveCount = mem(getFractionalOctaveCountUnmemoized, { cacheKey: (args) => args.join(':') })
  10. const getKeyOctave = mem(getKeyOctaveUnmemoized, { cache: caches.getKeyOctave })
  11. type GetKeyLeft = (startKey: number, endKey: number) => (k: number) => number
  12. const getKeyLeft: GetKeyLeft = (startKey, endKey) => (k) => {
  13. const fractionalOctaveCount = getFractionalOctaveCount(startKey, endKey)
  14. const octaveCount = getOctaveCount(startKey, endKey)
  15. const startOctave = getKeyOctave(startKey)
  16. const octave = getKeyOctave(k)
  17. const octaveOffset = ((100 * octaveCount) / fractionalOctaveCount / octaveCount) * (octave - startOctave)
  18. const theKeyOffset = octaveOffset + ((100 * octaveCount) / fractionalOctaveCount / octaveCount) * getKeyXOffset(k)
  19. const firstKeyOffset = ((100 * octaveCount) / fractionalOctaveCount / octaveCount) * getKeyXOffset(startKey + 12)
  20. return theKeyOffset - firstKeyOffset
  21. }
  22. export default getKeyLeft