Musical keyboard component written in React.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

27 lignes
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