import * as React from 'react' import * as PropTypes from 'prop-types' import StyledAccidentalKey from '../StyledAccidentalKey/StyledAccidentalKey' import StyledNaturalKey from '../StyledNaturalKey/StyledNaturalKey' import Keyboard, { propTypes } from './Keyboard' import KeyboardMap from '../KeyboardMap/KeyboardMap' const Wrapper: React.FC = (props) => (
) export default { title: 'Keyboard', } type Props = PropTypes.InferProps // By passing optional props to this story, you can control the props of the component when // you consume the story in a test. export const Default = (props?: Partial) => ( ) export const WithActiveKeys = (props?: Partial) => ( ) export const WithDifferentKeyRange = (props?: Partial) => ( ) export const Styled = (props?: Partial) => ( ) export const AnotherStyled = (props?: Partial) => (
) const HasMapComponent = () => { const [keyChannels, setKeyChannels] = React.useState<{ key: number; velocity: number; channel: number }[]>([]) const midiAccess = React.useRef(undefined) const handleKeyOn = (newKeys: { key: number; velocity: number; channel: number; id: number }[]) => { setKeyChannels((oldKeys) => { const oldKeysKeys = oldKeys.map((k) => k.key) const newKeysKeys = newKeys.map((k) => k.key) const keysOff = oldKeys .filter((ok) => !newKeysKeys.includes(ok.key)) .map((k) => ({ ...k, velocity: k.velocity > 1 ? 1 : k.velocity < 0 ? 0 : k.velocity, })) const keysOn = newKeys .filter((nk) => !oldKeysKeys.includes(nk.key)) .map((k) => ({ ...k, velocity: k.velocity > 1 ? 1 : k.velocity < 0 ? 0 : k.velocity, })) keysOn.forEach((k) => { midiAccess.current?.send([0b10010000 + k.channel, k.key, Math.floor(k.velocity * 127)]) }) keysOff.forEach((k) => { midiAccess.current?.send([0b10000000 + k.channel, k.key, Math.floor(k.velocity * 127)]) }) return newKeys }) } React.useEffect(() => { const { navigator: maybeNavigator } = window const navigator = maybeNavigator as Navigator & { requestMIDIAccess: () => Promise<{ outputs: Map }> } if ('requestMIDIAccess' in navigator) { navigator.requestMIDIAccess().then((m) => { midiAccess.current = Array.from(m.outputs.values())[0] }) } }, []) return ( ) } export const HasMap = () =>