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.
 
 
 
 

30 lines
1.1 KiB

  1. import mem from 'mem'
  2. import generateKeys from './generateKeys'
  3. import groupKeysIntoOctaves from './groupKeysIntoOctaves'
  4. import getOctaveCompletenessUnmemoized from './getOctaveCompleteness'
  5. import * as caches from './caches'
  6. const getOctaveCompleteness = mem(getOctaveCompletenessUnmemoized, { cache: caches.getOctaveCompleteness })
  7. interface GetFractionalOctaveCount {
  8. (startKey: number, endKey: number): number
  9. }
  10. const getFractionalOctaveCount: GetFractionalOctaveCount = (startKey, endKey) => {
  11. const dummyKeys = generateKeys(startKey, endKey)
  12. const keysGroupedIntoOctaves = groupKeysIntoOctaves(dummyKeys)
  13. const octaveCompleteness = Object.entries(keysGroupedIntoOctaves)
  14. .map<number[]>(([octave, keys]) => [(octave as unknown) as number, keys[0], keys.slice(-1)[0]])
  15. .reduce<Record<number, number>>(
  16. (theOctaveCompleteness, [octave, firstKey, lastKey]) => ({
  17. ...theOctaveCompleteness,
  18. [octave]: getOctaveCompleteness(firstKey, lastKey),
  19. }),
  20. {},
  21. )
  22. return Object.values(octaveCompleteness).reduce((a, b) => a + b, 0)
  23. }
  24. export default getFractionalOctaveCount