Simple monitor for displaying MIDI status for digital pianos.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

69 行
1.5 KiB

  1. import * as React from 'react'
  2. import {DeviceChannelActive} from '../../hooks/midi';
  3. export interface ActivityProps {
  4. device?: MIDIInput
  5. currentDeviceActive?: DeviceChannelActive
  6. }
  7. const getDeviceDisplayName = (device?: MIDIInput): string | undefined => {
  8. if (typeof device === 'undefined') {
  9. return undefined
  10. }
  11. return [device.name, device.version ? `v${device.version}` : null]
  12. .filter((s) => Boolean(s))
  13. .join(' ')
  14. }
  15. export const Activity: React.FC<ActivityProps> = ({
  16. device,
  17. currentDeviceActive = [
  18. false,
  19. false,
  20. false,
  21. false,
  22. false,
  23. false,
  24. false,
  25. false,
  26. false,
  27. false,
  28. false,
  29. false,
  30. false,
  31. false,
  32. false,
  33. false
  34. ]
  35. }) => {
  36. const deviceDisplayName = getDeviceDisplayName(device)
  37. return (
  38. <div>
  39. <div className="text-xs">
  40. Input device:{' '}
  41. {typeof deviceDisplayName === 'undefined' && <span className="opacity-50">(None)</span>}
  42. {typeof deviceDisplayName !== 'undefined' && deviceDisplayName}
  43. </div>
  44. <div className="h-1.5 flex gap-1 items-center">
  45. <div
  46. className="rounded-full w-1.5 h-1.5 bg-yellow-400"
  47. style={{
  48. opacity: device?.state === 'connected' ? 1 : 0.25
  49. }}
  50. />
  51. {currentDeviceActive.map((a, i) => (
  52. <div
  53. className="rounded-full w-1.5 h-1.5 bg-green-400"
  54. key={i}
  55. style={{
  56. opacity: a ? 1 : 0.25
  57. }}
  58. />
  59. ))}
  60. </div>
  61. </div>
  62. )
  63. }