solid-pianoroll 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/helpers.ts","../../src/useViewPortScaler.ts","../../src/PianoRoll.tsx"],"sourcesContent":["export const clamp = (value: number, min: number, max: number) => {\n return Math.max(min, Math.min(max, value));\n};\n","import { createMemo } from \"solid-js\";\nimport { clamp } from \"./helpers\";\n\nexport default function useViewPortScaler(\n getState: () => {\n virtualPosition: number;\n virtualRange: number;\n\n viewPortOffset: number;\n viewPortSize: number;\n\n zoom: number;\n },\n) {\n const state = createMemo(() => getState());\n\n function getScaledValue(position: number) {\n const virtualSize = state().viewPortSize * state().zoom;\n return (position / state().virtualRange) * virtualSize;\n }\n\n function getCoordinates(position: number) {\n return getScaledValue(position) - getScaledValue(state().virtualPosition);\n }\n\n function getPosition(offset: number) {\n const visibleDuration = state().virtualRange / state().zoom;\n const percentX = (offset - state().viewPortOffset) / state().viewPortSize;\n const position = state().virtualPosition + percentX * visibleDuration;\n\n return position;\n }\n\n function getVirtualDimensions(position: number, length: number) {\n const virtualLeft = getCoordinates(position);\n const virtualWidth = getScaledValue(length);\n\n const offset = clamp(virtualLeft, 0, state().viewPortSize);\n const size = clamp(virtualWidth - (offset - virtualLeft), 0, state().viewPortSize - offset);\n\n return { offset, size };\n }\n\n return {\n getScaledValue,\n getCoordinates,\n getPosition,\n getVirtualDimensions,\n };\n}\n","import { Midi } from \"@tonejs/midi\";\n\nimport {\n JSX,\n createMemo,\n splitProps,\n createSignal,\n onMount,\n onCleanup,\n Index,\n createEffect,\n Show,\n} from \"solid-js\";\nimport { clamp } from \"./helpers\";\nimport useViewPortScaler from \"./useViewPortScaler\";\n\ntype Note = Pick<\n ReturnType<Midi[\"tracks\"][number][\"notes\"][number][\"toJSON\"]>,\n \"durationTicks\" | \"midi\" | \"ticks\" | \"velocity\"\n>;\n\ntype PianoRollProps = {\n ppq: number;\n notes: Note[];\n\n verticalPosition: number;\n verticalZoom: number;\n\n position: number;\n duration: number;\n zoom: number;\n\n onVerticalZoomChange?: (zoom: number) => void;\n onVerticalPositionChange?: (zoom: number) => void;\n onZoomChange?: (zoom: number) => void;\n onPositionChange?: (zoom: number) => void;\n\n onNoteChange?: (index: number, note: Note) => void;\n} & JSX.IntrinsicElements[\"div\"];\n\nconst PianoRoll = (allProps: PianoRollProps) => {\n let scrollContainerRef: HTMLDivElement | undefined;\n let scrollContentRef: HTMLDivElement | undefined;\n let notesContainerRef: HTMLDivElement | undefined;\n\n const [props, divProps] = splitProps(allProps, [\n \"ppq\",\n \"notes\",\n \"position\",\n \"duration\",\n \"zoom\",\n \"verticalPosition\",\n \"verticalZoom\",\n \"onVerticalZoomChange\",\n \"onVerticalPositionChange\",\n \"onZoomChange\",\n \"onPositionChange\",\n \"onNoteChange\",\n ]);\n\n const [dimensions, setDimensions] = createSignal<{\n left: number;\n width: number;\n top: number;\n height: number;\n }>({\n left: 0,\n width: 0,\n top: 0,\n height: 0,\n });\n\n const resizeObserver = new ResizeObserver((event) => {\n const { left, top, width, height } = scrollContainerRef?.getBoundingClientRect() ?? {\n left: 0,\n width: 0,\n top: 0,\n height: 0,\n };\n setDimensions({ left, top, width, height });\n });\n\n createEffect(() => {\n console.log(props.notes);\n });\n onMount(() => {\n if (!scrollContainerRef) return;\n resizeObserver.observe(scrollContainerRef);\n });\n\n onCleanup(() => {\n resizeObserver.disconnect();\n });\n\n const horizontalViewPort = useViewPortScaler(() => ({\n viewPortOffset: dimensions().left,\n viewPortSize: dimensions().width,\n virtualPosition: props.position,\n virtualRange: props.duration,\n zoom: props.zoom,\n }));\n\n const verticalViewPort = useViewPortScaler(() => ({\n viewPortOffset: dimensions().top,\n viewPortSize: dimensions().height,\n virtualPosition: props.verticalPosition,\n virtualRange: 128,\n zoom: props.verticalZoom,\n }));\n\n const handleScroll = (event: UIEvent & { currentTarget: Element }) => {\n event.preventDefault();\n\n if (didUpdateScroll) {\n didUpdateScroll = false;\n return;\n }\n const maxVerticalPosition = 128 - 128 / props.verticalZoom;\n const maxPosition = props.duration - props.duration / props.zoom;\n\n const { width, height } = dimensions();\n const { scrollTop, scrollLeft, scrollWidth, scrollHeight } = event.currentTarget;\n\n const scrollTopAmount = scrollTop / (scrollHeight - height);\n const scrollLeftAmount = scrollLeft / (scrollWidth - width);\n\n props.onVerticalPositionChange?.(maxVerticalPosition * scrollTopAmount);\n props.onPositionChange?.(maxPosition * scrollLeftAmount);\n };\n\n let didUpdateScroll = false;\n\n createEffect(() => {\n const maxVerticalPosition = 128 - 128 / props.verticalZoom;\n const maxPosition = props.duration - props.duration / props.zoom;\n\n const scrollTopAmount =\n maxVerticalPosition > 0 ? props.verticalPosition / maxVerticalPosition : 0;\n const scrollLeftAmount = maxPosition > 0 ? props.position / maxPosition : 0;\n\n const { height, width } = dimensions();\n\n if (!scrollContentRef?.parentElement) return;\n\n const scrollDivHeight = clamp(props.verticalZoom * height, height, 10000);\n const scrollTop = scrollTopAmount * (scrollDivHeight - height);\n\n const scrollDivWidth = clamp(props.zoom * width, width, 10000);\n const scrollLeft = scrollLeftAmount * (scrollDivWidth - width);\n\n didUpdateScroll = true;\n\n scrollContentRef.style.height = `${scrollDivHeight}px`;\n scrollContentRef.style.width = `${scrollDivWidth}px`;\n\n scrollContentRef.parentElement.scrollTo({\n left: scrollLeft,\n top: scrollTop,\n });\n });\n\n const forwardEventToNote = (event: MouseEvent | PointerEvent | TouchEvent) => {\n const x = \"clientX\" in event ? event.clientX : event.touches[0]?.clientX;\n const y = \"clientY\" in event ? event.clientY : event.touches[0]?.clientY;\n\n const elementUnderMouse = [...(notesContainerRef?.querySelectorAll?.(\"div\") ?? [])].find(\n (element) => {\n const rect = element.getBoundingClientRect();\n\n return (\n x >= rect.left &&\n rect.left + rect.width > x &&\n y >= rect.top &&\n rect.top + rect.height > y\n );\n },\n );\n\n if (elementUnderMouse) {\n return elementUnderMouse.dispatchEvent(new MouseEvent(event.type, event));\n }\n };\n\n type NoteDragMode = \"trimStart\" | \"move\" | \"trimEnd\";\n const [noteDragMode, setNoteDragMode] = createSignal<NoteDragMode>();\n const [isDragging, setIsDragging] = createSignal(false);\n\n return (\n <div\n {...divProps}\n class=\"PianoRoll\"\n style={{\n \"box-sizing\": \"border-box\",\n display: \"flex\",\n overflow: \"hidden\",\n \"flex-direction\": \"column\",\n padding: \"16px\",\n ...(typeof divProps.style === \"object\" && divProps.style),\n }}\n >\n <div\n style={{\n overflow: \"hidden\",\n height: \"100%\",\n display: \"flex\",\n \"flex-direction\": \"row\",\n }}\n >\n <div\n class=\"PianoRoll-Keys\"\n style={{\n position: \"relative\",\n height: \"100%\",\n width: `${50}px`,\n }}\n >\n <Index each={keys}>\n {(key) => {\n const virtualDimensions = createMemo(() =>\n verticalViewPort.getVirtualDimensions(127 - key().number, 1),\n );\n\n return (\n <Show when={virtualDimensions().size > 0}>\n <div\n class=\"PianoRoll-Key\"\n title={key().name}\n data-index={key().number % 12}\n style={{\n position: \"absolute\",\n \"box-sizing\": \"border-box\",\n left: 0,\n top: `${virtualDimensions().offset}px`,\n height: `${virtualDimensions().size}px`,\n width: \"100%\",\n \"background-color\": key().isBlack ? \"#000\" : \"#fff\",\n \"border-width\": `${\n !key().isBlack && !blackKeys.includes((key().number + 1) % 12) ? \"0.1px\" : 0\n } 1px ${\n !key().isBlack && !blackKeys.includes((key().number - 1) % 12) ? \"0.1px\" : 0\n } 0`,\n \"border-color\": \"#000\",\n\n \"border-style\": \"solid\",\n }}\n ></div>\n </Show>\n );\n }}\n </Index>\n </div>\n\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n overflow: \"hidden\",\n flex: 1,\n }}\n >\n <div\n class=\"PianoRoll-Notes-Container\"\n style={{\n position: \"absolute\",\n width: `${dimensions().width}px`,\n height: `${dimensions().height}px`,\n }}\n >\n <div\n class=\"PianoRoll-Notes\"\n ref={notesContainerRef}\n style={{\n position: \"relative\",\n width: `${dimensions().width}px`,\n height: \"100%\",\n }}\n >\n <Index each={props.notes}>\n {(note, index) => {\n const horizontalVirtualDimensions = createMemo(() =>\n verticalViewPort.getVirtualDimensions(127 - note().midi, 1),\n );\n\n const verticalVirtualDimensions = createMemo(() =>\n horizontalViewPort.getVirtualDimensions(note().ticks, note().durationTicks),\n );\n\n return (\n <Show\n when={\n !!horizontalVirtualDimensions().size && !!verticalVirtualDimensions().size\n }\n >\n <div\n class=\"PianoRoll-Note\"\n onMouseMove={(event) => {\n if (isDragging()) return;\n\n const relativeX = horizontalViewPort.getScaledValue(\n horizontalViewPort.getPosition(event.clientX),\n );\n const noteStartX = horizontalViewPort.getScaledValue(note().ticks);\n const noteEndX = horizontalViewPort.getScaledValue(\n note().ticks + note().durationTicks,\n );\n\n setNoteDragMode(\n relativeX - noteStartX < 3\n ? \"trimStart\"\n : noteEndX - relativeX < 3\n ? \"trimEnd\"\n : \"move\",\n );\n }}\n onMouseDown={(event) => {\n setIsDragging(true);\n const initialPosition = horizontalViewPort.getPosition(event.clientX);\n const diffPosition = initialPosition - note().ticks;\n\n const handleMouseMove = (mouseMoveEvent: MouseEvent) => {\n const ticks = Math.max(\n horizontalViewPort.getPosition(mouseMoveEvent.clientX) - diffPosition,\n 0,\n );\n\n props.onNoteChange?.(index, {\n ...note(),\n midi: Math.round(\n 127 - verticalViewPort.getPosition(mouseMoveEvent.clientY),\n ),\n ...((noteDragMode() === \"move\" || noteDragMode() === \"trimStart\") && {\n ticks,\n }),\n ...(noteDragMode() === \"trimStart\" && {\n durationTicks: note().durationTicks + note().ticks - ticks,\n }),\n ...(noteDragMode() === \"trimEnd\" && {\n durationTicks:\n horizontalViewPort.getPosition(mouseMoveEvent.clientX) -\n note().ticks,\n }),\n });\n };\n const handleMouseUp = () => {\n setIsDragging(false);\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n }}\n style={{\n \"z-index\": 1,\n\n position: \"absolute\",\n \"box-sizing\": \"border-box\",\n top: `${horizontalVirtualDimensions().offset}px`,\n height: `${horizontalVirtualDimensions().size}px`,\n left: `${verticalVirtualDimensions().offset}px`,\n width: `${verticalVirtualDimensions().size}px`,\n \"border-width\": \"0.5px\",\n \"border-style\": \"solid\",\n \"background-color\": \"#f00\",\n \"border-color\": \"#a00\",\n }}\n ></div>\n </Show>\n );\n }}\n </Index>\n </div>\n </div>\n <div\n ref={scrollContainerRef}\n class=\"PianoRoll-Vertical-Scroller\"\n style={{\n flex: 1,\n ...(noteDragMode() && {\n cursor:\n noteDragMode() === \"trimStart\"\n ? \"w-resize\"\n : noteDragMode() === \"trimEnd\"\n ? \"e-resize\"\n : \"pointer\",\n }),\n //\"box-sizing\": \"border-box\",\n \"z-index\": 1,\n overflow: \"scroll\",\n \"pointer-events\": \"auto\",\n }}\n onScroll={handleScroll}\n onMouseDown={forwardEventToNote}\n onMouseMove={(event) => {\n if (forwardEventToNote(event)) return;\n if (isDragging()) return;\n setNoteDragMode(undefined);\n }}\n onClick={forwardEventToNote}\n onDblClick={(event) => {\n if (!forwardEventToNote(event)) {\n //TODO create new note with current gutter length\n }\n }}\n onMouseUp={forwardEventToNote}\n onTouchStart={forwardEventToNote}\n onTouchMove={forwardEventToNote}\n onTouchEnd={forwardEventToNote}\n onTouchCancel={forwardEventToNote}\n onDragStart={forwardEventToNote}\n onDrag={forwardEventToNote}\n onDragEnd={forwardEventToNote}\n >\n <div ref={scrollContentRef}></div>\n </div>\n </div>\n\n <input\n value={props.verticalZoom}\n onInput={(event) => props.onVerticalZoomChange?.(event.currentTarget.valueAsNumber)}\n type=\"range\"\n min=\"1\"\n max=\"11\"\n step={0.01}\n {...{ orient: \"vertical\" }}\n style={{\n width: \"16px\",\n ...({\n \"writing-mode\": \"bt-lr\" /* IE */,\n \"-webkit-appearance\": \"slider-vertical\" /* WebKit */,\n } as any),\n }}\n />\n </div>\n\n <input\n value={props.zoom}\n onInput={(event) => props.onZoomChange?.(event.currentTarget.valueAsNumber)}\n type=\"range\"\n max=\"500\"\n min=\"1\"\n step={0.01}\n style={{\n \"margin-left\": \"50px\",\n \"margin-right\": \"16px\",\n }}\n />\n </div>\n );\n};\n\nconst blackKeys = [1, 3, 6, 8, 10];\nconst keyNames = [\"C\", \"C#\", \"D\", \"D#\", \"E\", \"F\", \"F#\", \"G\", \"G#\", \"A\", \"A#\", \"B\"];\nconst keys = Array.from({ length: 128 }).map((_, index) => ({\n number: index,\n name: `${keyNames[index % 12]} ${Math.floor(index / 12) - 2}`,\n isBlack: blackKeys.includes(index % 12),\n}));\n\nexport default PianoRoll;\n"],"names":["clamp","value","min","max","Math","useViewPortScaler","getState","state","createMemo","getScaledValue","position","virtualSize","viewPortSize","zoom","virtualRange","getCoordinates","virtualPosition","getPosition","offset","visibleDuration","percentX","viewPortOffset","getVirtualDimensions","length","virtualLeft","virtualWidth","size","PianoRoll","allProps","scrollContainerRef","scrollContentRef","notesContainerRef","props","divProps","splitProps","dimensions","setDimensions","createSignal","left","width","top","height","resizeObserver","ResizeObserver","event","getBoundingClientRect","createEffect","console","log","notes","onMount","observe","onCleanup","disconnect","horizontalViewPort","duration","verticalViewPort","verticalPosition","verticalZoom","handleScroll","preventDefault","didUpdateScroll","maxVerticalPosition","maxPosition","scrollTop","scrollLeft","scrollWidth","scrollHeight","currentTarget","scrollTopAmount","scrollLeftAmount","onVerticalPositionChange","onPositionChange","parentElement","scrollDivHeight","scrollDivWidth","style","scrollTo","forwardEventToNote","x","clientX","touches","y","clientY","elementUnderMouse","querySelectorAll","find","element","rect","dispatchEvent","MouseEvent","type","noteDragMode","setNoteDragMode","isDragging","setIsDragging","_$spread","_$mergeProps","display","overflow","padding","_$insert","_$createComponent","keys","key","virtualDimensions","number","_$effect","name","isBlack","blackKeys","includes","_$setAttribute","_$use","note","index","horizontalVirtualDimensions","midi","verticalVirtualDimensions","ticks","durationTicks","_$memo","initialPosition","diffPosition","handleMouseMove","mouseMoveEvent","onNoteChange","round","handleMouseUp","window","removeEventListener","addEventListener","relativeX","noteStartX","noteEndX","undefined","onVerticalZoomChange","valueAsNumber","orient","onZoomChange","flex","cursor","_$style","keyNames","Array","from","map","_","floor","_$delegateEvents"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../node_modules/style-inject/dist/style-inject.es.js","../../src/useBoundingClientRect.ts","../../src/helpers.ts","../../src/useViewPortScaler.ts","../../src/PianoRollContext.tsx","../../src/HorizontalZoomControl.tsx","../../src/PianoRollKeys.tsx","../../src/PianoRollNotes.tsx","../../src/ScrollContainer.tsx","../../src/VerticalZoomControl.tsx","../../src/PianoRollGrid.tsx","../../src/PianoRoll.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { Accessor, createEffect, createSignal, onCleanup, onMount } from \"solid-js\";\n\nexport type ClientRect = Omit<DOMRect, \"toJSON\">;\n\nconst defaultRect: ClientRect = {\n left: 0,\n width: 0,\n top: 0,\n height: 0,\n bottom: 0,\n right: 0,\n x: 0,\n y: 0,\n};\n\nexport default function useBoundingClientRect(containerRef: Accessor<HTMLElement | undefined>) {\n const [boundingClientRect, setBoundingClientRect] = createSignal<ClientRect>(defaultRect);\n\n createEffect(() => {\n const container = containerRef();\n if (!container) return;\n\n const updateBoundingClientRect = () => {\n setBoundingClientRect(container.getBoundingClientRect() ?? defaultRect);\n };\n\n const resizeObserver = new ResizeObserver(updateBoundingClientRect);\n resizeObserver.observe(container);\n\n updateBoundingClientRect();\n\n return () => {\n resizeObserver.disconnect();\n };\n });\n\n return boundingClientRect;\n}\n","export const clamp = (value: number, min: number, max: number) => {\n return Math.max(min, Math.min(max, value));\n};\n","import { createMemo } from \"solid-js\";\nimport { clamp } from \"./helpers\";\n\nexport type ViewPortScaler = ReturnType<typeof useViewPortScaler>;\n\nexport default function useViewPortScaler(\n getState: () => {\n virtualPosition: number;\n virtualRange: number;\n\n viewPortOffset: number;\n viewPortSize: number;\n\n zoom: number;\n },\n) {\n const state = createMemo(() => getState());\n\n function getScaledValue(position: number) {\n const virtualSize = state().viewPortSize * state().zoom;\n return (position / state().virtualRange) * virtualSize;\n }\n\n function getCoordinates(position: number) {\n return getScaledValue(position) - getScaledValue(state().virtualPosition);\n }\n\n function getPosition(offset: number) {\n const visibleDuration = state().virtualRange / state().zoom;\n const percentX = (offset - state().viewPortOffset) / state().viewPortSize;\n const position = state().virtualPosition + percentX * visibleDuration;\n\n return position;\n }\n\n function getVirtualDimensions(position: number, length: number) {\n const virtualLeft = getCoordinates(position);\n const virtualWidth = getScaledValue(length);\n\n const offset = clamp(virtualLeft, 0, state().viewPortSize);\n const size = clamp(virtualWidth - (offset - virtualLeft), 0, state().viewPortSize - offset);\n\n return { offset, size };\n }\n\n return {\n getScaledValue,\n getCoordinates,\n getPosition,\n getVirtualDimensions,\n };\n}\n","import {\n createContext,\n createEffect,\n createMemo,\n createSignal,\n JSX,\n splitProps,\n useContext,\n} from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\n\nimport { PianoRollProps } from \"./PianoRoll\";\nimport useBoundingClientRect, { ClientRect } from \"./useBoundingClientRect\";\nimport useViewPortScaler, { ViewPortScaler } from \"./useViewPortScaler\";\n\nexport type NoteDragMode = \"trimStart\" | \"move\" | \"trimEnd\" | undefined;\ntype PianoRollContext = {\n horizontalViewPort: ViewPortScaler;\n verticalViewPort: ViewPortScaler;\n clientRect: ClientRect;\n\n notesContainer?: HTMLDivElement;\n\n isDragging: boolean;\n onIsDraggingChange: (isDragging: boolean) => void;\n\n noteDragMode: NoteDragMode;\n onNoteDragModeChange: (isDragging: NoteDragMode) => void;\n} & PianoRollProps;\n\nconst PianoRollContext = createContext<PianoRollContext>(undefined!);\n\nexport const PianoRollContextProvider = (\n props: {\n scrollContainer?: HTMLDivElement;\n notesContainer?: HTMLDivElement;\n\n children: JSX.Element;\n } & PianoRollProps,\n) => {\n const [noteDragMode, setNoteDragMode] = createSignal<NoteDragMode>();\n const [isDragging, setIsDragging] = createSignal(false);\n\n const [_ownProps, contextProps] = splitProps(props, [\"children\", \"scrollContainer\"]);\n const clientRect = useBoundingClientRect(() => props.scrollContainer);\n\n const horizontalViewPort = useViewPortScaler(() => ({\n viewPortOffset: clientRect().left,\n viewPortSize: clientRect().width,\n\n virtualPosition: props.position,\n virtualRange: props.duration,\n zoom: props.zoom,\n }));\n\n const verticalViewPort = useViewPortScaler(() => ({\n viewPortOffset: clientRect().top,\n viewPortSize: clientRect().height,\n\n virtualPosition: props.verticalPosition,\n zoom: props.verticalZoom,\n\n virtualRange: 128,\n }));\n\n const getContextValue = () => {\n return {\n ...contextProps,\n horizontalViewPort,\n verticalViewPort,\n clientRect: clientRect(),\n\n isDragging: isDragging(),\n onIsDraggingChange: setIsDragging,\n\n noteDragMode: noteDragMode(),\n onNoteDragModeChange: setNoteDragMode,\n };\n };\n\n const [contextValue, setContextValue] = createStore<PianoRollContext>(getContextValue());\n\n createEffect(() => {\n setContextValue(getContextValue());\n });\n\n return (\n <PianoRollContext.Provider value={contextValue}>{props.children}</PianoRollContext.Provider>\n );\n};\n\nexport const usePianoRollContext = () => {\n const context = useContext(PianoRollContext);\n\n if (!context) throw new Error(\"No PianoRollContext found\");\n\n return context;\n};\n","import { usePianoRollContext } from \"./PianoRollContext\";\n\nconst HorizontalZoomControl = () => {\n const context = usePianoRollContext();\n\n return (\n <input\n value={context.zoom}\n onInput={(event) => context.onZoomChange?.(event.currentTarget.valueAsNumber)}\n type=\"range\"\n max=\"500\"\n min=\"1\"\n step={0.01}\n style={{\n \"margin-left\": \"50px\",\n \"margin-right\": \"16px\",\n }}\n />\n );\n};\n\nexport default HorizontalZoomControl;\n","import styles from \"./PianoRollKeys.module.css\";\nimport { createMemo, Index, Show } from \"solid-js\";\nimport { usePianoRollContext } from \"./PianoRollContext\";\n\nconst PianoRollKeys = () => {\n const context = usePianoRollContext();\n\n return (\n <div class={styles.PianoRollKeys}>\n <Index each={keys}>\n {(key) => {\n const virtualDimensions = createMemo(() =>\n context.verticalViewPort.getVirtualDimensions(127 - key().number, 1),\n );\n\n return (\n <Show when={virtualDimensions().size > 0}>\n <div\n class={styles[\"PianoRollKeys-Key\"]}\n title={key().name}\n data-index={key().number % 12}\n style={{\n top: `${virtualDimensions().offset}px`,\n height: `${virtualDimensions().size}px`,\n \"background-color\": key().isBlack ? \"#000\" : \"#fff\",\n \"border-width\": `${\n !key().isBlack && !blackKeys.includes((key().number + 1) % 12) ? \"0.1px\" : 0\n } 1px ${\n !key().isBlack && !blackKeys.includes((key().number - 1) % 12) ? \"0.1px\" : 0\n } 0`,\n }}\n ></div>\n </Show>\n );\n }}\n </Index>\n </div>\n );\n};\n\nexport const blackKeys = [1, 3, 6, 8, 10];\nexport const keyNames = [\"C\", \"C#\", \"D\", \"D#\", \"E\", \"F\", \"F#\", \"G\", \"G#\", \"A\", \"A#\", \"B\"];\nexport const keys = Array.from({ length: 128 }).map((_, index) => ({\n number: index,\n name: `${keyNames[index % 12]} ${Math.floor(index / 12) - 2}`,\n isBlack: blackKeys.includes(index % 12),\n}));\n\nexport default PianoRollKeys;\n","import { createEffect, createMemo, Index, Ref, Show } from \"solid-js\";\nimport { usePianoRollContext } from \"./PianoRollContext\";\n\nconst PianoRollNotes = (props: { ref: Ref<HTMLDivElement | undefined> }) => {\n const context = usePianoRollContext();\n\n const gridDivisionTicks = createMemo(() => (context.ppq * 4) / context.gridDivision);\n\n const snapValueToGridIfEnabled = (value: number, altKey: boolean) =>\n context.snapToGrid && !altKey\n ? Math.round(value / gridDivisionTicks()) * gridDivisionTicks()\n : value;\n\n return (\n <div\n class=\"PianoRoll-Notes-Container\"\n style={{\n position: \"absolute\",\n width: `${context.clientRect.width}px`,\n height: `${context.clientRect.height}px`,\n }}\n >\n <div\n class=\"PianoRoll-Notes\"\n ref={props.ref}\n style={{\n position: \"relative\",\n width: `${context.clientRect.width}px`,\n height: \"100%\",\n }}\n >\n <Index each={context.notes}>\n {(note, index) => {\n const horizontalVirtualDimensions = createMemo(() =>\n context.verticalViewPort.getVirtualDimensions(127 - note().midi, 1),\n );\n\n const verticalVirtualDimensions = createMemo(() =>\n context.horizontalViewPort.getVirtualDimensions(note().ticks, note().durationTicks),\n );\n\n return (\n <Show\n when={!!horizontalVirtualDimensions().size && !!verticalVirtualDimensions().size}\n >\n <div\n class=\"PianoRoll-Note\"\n onMouseMove={(event) => {\n if (context.isDragging) return;\n\n const relativeX = context.horizontalViewPort.getScaledValue(\n context.horizontalViewPort.getPosition(event.clientX),\n );\n const noteStartX = context.horizontalViewPort.getScaledValue(note().ticks);\n const noteEndX = context.horizontalViewPort.getScaledValue(\n note().ticks + note().durationTicks,\n );\n\n context.onNoteDragModeChange(\n relativeX - noteStartX < 3\n ? \"trimStart\"\n : noteEndX - relativeX < 3\n ? \"trimEnd\"\n : \"move\",\n );\n }}\n onMouseDown={(event) => {\n context.onIsDraggingChange(true);\n const initialPosition = context.horizontalViewPort.getPosition(event.clientX);\n const diffPosition = initialPosition - note().ticks;\n\n const handleMouseMove = (mouseMoveEvent: MouseEvent) => {\n const ticks = snapValueToGridIfEnabled(\n Math.max(\n context.horizontalViewPort.getPosition(mouseMoveEvent.clientX) -\n diffPosition,\n 0,\n ),\n mouseMoveEvent.altKey,\n );\n\n context.onNoteChange?.(index, {\n ...note(),\n ...(context.noteDragMode === \"move\" && {\n midi: Math.round(\n 127 - context.verticalViewPort.getPosition(mouseMoveEvent.clientY),\n ),\n }),\n ...((context.noteDragMode === \"move\" ||\n context.noteDragMode === \"trimStart\") && {\n ticks,\n }),\n ...(context.noteDragMode === \"trimStart\" && {\n durationTicks: note().durationTicks + note().ticks - ticks,\n }),\n ...(context.noteDragMode === \"trimEnd\" && {\n durationTicks: snapValueToGridIfEnabled(\n context.horizontalViewPort.getPosition(mouseMoveEvent.clientX) -\n note().ticks,\n mouseMoveEvent.altKey,\n ),\n }),\n });\n };\n const handleMouseUp = () => {\n context.onIsDraggingChange(false);\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n }}\n style={{\n \"z-index\": 2,\n position: \"absolute\",\n \"box-sizing\": \"border-box\",\n top: `${horizontalVirtualDimensions().offset}px`,\n height: `${horizontalVirtualDimensions().size}px`,\n left: `${verticalVirtualDimensions().offset}px`,\n width: `${verticalVirtualDimensions().size}px`,\n \"border-width\": \"0.5px\",\n \"border-style\": \"solid\",\n \"background-color\": `rgba(255,0,0, ${(128 + note().velocity) / 256})`,\n \"border-color\": \"#a00\",\n }}\n ></div>\n </Show>\n );\n }}\n </Index>\n </div>\n </div>\n );\n};\n\nexport default PianoRollNotes;\n","import { createEffect, Ref } from \"solid-js\";\nimport { clamp } from \"./helpers\";\nimport { usePianoRollContext } from \"./PianoRollContext\";\n\nconst ScrollContainer = (props: { ref: Ref<HTMLDivElement> }) => {\n let scrollContentRef: HTMLDivElement | undefined;\n const context = usePianoRollContext();\n\n const forwardEventToNote = (event: MouseEvent | PointerEvent | TouchEvent) => {\n const x = \"clientX\" in event ? event.clientX : event.touches[0]?.clientX;\n const y = \"clientY\" in event ? event.clientY : event.touches[0]?.clientY;\n\n const elementUnderMouse = [...(context.notesContainer?.querySelectorAll?.(\"div\") ?? [])].find(\n (element) => {\n const rect = element.getBoundingClientRect();\n\n return (\n x >= rect.left &&\n rect.left + rect.width > x &&\n y >= rect.top &&\n rect.top + rect.height > y\n );\n },\n );\n\n if (elementUnderMouse) {\n return elementUnderMouse.dispatchEvent(new MouseEvent(event.type, event));\n }\n };\n\n const handleScroll = (event: UIEvent & { currentTarget: Element }) => {\n event.preventDefault();\n\n if (didUpdateScroll) {\n didUpdateScroll = false;\n return;\n }\n const maxVerticalPosition = 128 - 128 / context.verticalZoom;\n const maxPosition = context.duration - context.duration / context.zoom;\n\n const { width, height } = context.clientRect;\n const { scrollTop, scrollLeft, scrollWidth, scrollHeight } = event.currentTarget;\n\n const scrollTopAmount = scrollTop / (scrollHeight - height);\n const scrollLeftAmount = scrollLeft / (scrollWidth - width);\n\n context.onVerticalPositionChange?.(maxVerticalPosition * scrollTopAmount);\n context.onPositionChange?.(maxPosition * scrollLeftAmount);\n };\n\n let didUpdateScroll = false;\n\n createEffect(() => {\n const maxVerticalPosition = 128 - 128 / context.verticalZoom;\n const maxPosition = context.duration - context.duration / context.zoom;\n\n const scrollTopAmount =\n maxVerticalPosition > 0 ? context.verticalPosition / maxVerticalPosition : 0;\n const scrollLeftAmount = maxPosition > 0 ? context.position / maxPosition : 0;\n\n const { height, width } = context.clientRect;\n\n if (!scrollContentRef?.parentElement) return;\n\n const scrollDivHeight = clamp(context.verticalZoom * height, height, 10000);\n const scrollTop = scrollTopAmount * (scrollDivHeight - height);\n\n const scrollDivWidth = clamp(context.zoom * width, width, 10000);\n const scrollLeft = scrollLeftAmount * (scrollDivWidth - width);\n\n didUpdateScroll = true;\n\n scrollContentRef.style.height = `${scrollDivHeight}px`;\n scrollContentRef.style.width = `${scrollDivWidth}px`;\n\n scrollContentRef.parentElement.scrollTo({\n left: scrollLeft,\n top: scrollTop,\n });\n });\n\n return (\n <div\n ref={props.ref}\n class=\"PianoRoll-Vertical-Scroller\"\n style={{\n flex: 1,\n ...(context.noteDragMode && {\n cursor:\n context.noteDragMode === \"trimStart\"\n ? \"w-resize\"\n : context.noteDragMode === \"trimEnd\"\n ? \"e-resize\"\n : \"pointer\",\n }),\n //\"box-sizing\": \"border-box\",\n \"z-index\": 4,\n overflow: \"scroll\",\n \"pointer-events\": \"auto\",\n }}\n onScroll={handleScroll}\n onMouseDown={forwardEventToNote}\n onMouseMove={(event) => {\n if (forwardEventToNote(event)) return;\n if (context.isDragging) return;\n context.onNoteDragModeChange(undefined);\n }}\n onClick={forwardEventToNote}\n onDblClick={(event) => {\n if (!forwardEventToNote(event)) {\n //TODO create new note with current gutter length\n }\n }}\n onMouseUp={forwardEventToNote}\n onTouchStart={forwardEventToNote}\n onTouchMove={forwardEventToNote}\n onTouchEnd={forwardEventToNote}\n onTouchCancel={forwardEventToNote}\n onDragStart={forwardEventToNote}\n onDrag={forwardEventToNote}\n onDragEnd={forwardEventToNote}\n >\n <div ref={scrollContentRef}></div>\n </div>\n );\n};\n\nexport default ScrollContainer;\n","import { usePianoRollContext } from \"./PianoRollContext\";\n\nconst VerticalZoomControl = () => {\n const context = usePianoRollContext();\n\n return (\n <input\n value={context.verticalZoom}\n onInput={(event) => context.onVerticalZoomChange?.(event.currentTarget.valueAsNumber)}\n type=\"range\"\n min=\"1\"\n max=\"11\"\n step={0.01}\n {...{ orient: \"vertical\" }}\n style={{\n width: \"16px\",\n ...({\n \"writing-mode\": \"bt-lr\" /* IE */,\n \"-webkit-appearance\": \"slider-vertical\" /* WebKit */,\n } as any),\n }}\n />\n );\n};\n\nexport default VerticalZoomControl;\n","import { createEffect, createMemo, Index, Ref, Show } from \"solid-js\";\nimport { usePianoRollContext } from \"./PianoRollContext\";\nimport { blackKeys, keys } from \"./PianoRollKeys\";\n\nconst PianoRollGrid = () => {\n const context = usePianoRollContext();\n\n const gridDivisorTicks = createMemo(() => (context.ppq * 4) / context.gridDivision);\n const gridArray = createMemo(() => {\n const numberOfLines = context.duration / gridDivisorTicks();\n return Array.from({ length: numberOfLines }).map((_, index) => index * gridDivisorTicks());\n });\n\n return (\n <div\n class=\"PianoRoll-Grid-Container\"\n style={{\n position: \"absolute\",\n width: `${context.clientRect.width}px`,\n height: `${context.clientRect.height}px`,\n }}\n >\n <div\n class=\"PianoRoll-Grid\"\n style={{\n position: \"relative\",\n width: `${context.clientRect.width}px`,\n height: \"100%\",\n }}\n >\n <Index each={gridArray()}>\n {(tick, index) => {\n const virtualDimensions = createMemo(() =>\n context.horizontalViewPort.getVirtualDimensions(tick(), gridDivisorTicks()),\n );\n\n return (\n <Show when={virtualDimensions().size > 0}>\n <div\n class=\"PianoRoll-Grid-Time\"\n style={{\n \"z-index\": 1,\n position: \"absolute\",\n \"box-sizing\": \"border-box\",\n background: index % 4 === 0 ? \"#ccc\" : \"#ddd\",\n top: `0px`,\n height: `100%`,\n left: `${virtualDimensions().offset}px`,\n width: `${virtualDimensions().size}px`,\n \"border-left\": \"1px gray solid\",\n }}\n ></div>\n </Show>\n );\n }}\n </Index>\n <Index each={keys}>\n {(key) => {\n const virtualDimensions = createMemo(() =>\n context.verticalViewPort.getVirtualDimensions(127 - key().number, 1),\n );\n\n return (\n <Show when={virtualDimensions().size > 0}>\n <div\n class=\"PianoRoll-Grid-Key\"\n style={{\n position: \"absolute\",\n top: `${virtualDimensions().offset}px`,\n height: `${virtualDimensions().size}px`,\n width: \"100%\",\n \"background-color\": key().isBlack ? \"rgba(0,0,0,0.2)\" : \"none\",\n \"border-style\": \"solid\",\n \"border-color\": \"gray\",\n \"border-width\": `${\n !key().isBlack && !blackKeys.includes((key().number + 1) % 12) ? \"0.1px\" : 0\n } 1px ${\n !key().isBlack && !blackKeys.includes((key().number - 1) % 12) ? \"0.1px\" : 0\n } 0`,\n \"z-index\": 1,\n }}\n ></div>\n </Show>\n );\n }}\n </Index>\n </div>\n </div>\n );\n};\n\nexport default PianoRollGrid;\n","import styles from \"./PianoRoll.module.css\";\nimport { Midi } from \"@tonejs/midi\";\n\nimport { JSX, splitProps, createSignal } from \"solid-js\";\nimport HorizontalZoomControl from \"./HorizontalZoomControl\";\n\nimport { PianoRollContextProvider } from \"./PianoRollContext\";\nimport PianoRollKeys from \"./PianoRollKeys\";\nimport PianoRollNotes from \"./PianoRollNotes\";\nimport ScrollContainer from \"./ScrollContainer\";\nimport VerticalZoomControl from \"./VerticalZoomControl\";\nimport PianoRollGrid from \"./PianoRollGrid\";\n\ntype Note = Pick<\n ReturnType<Midi[\"tracks\"][number][\"notes\"][number][\"toJSON\"]>,\n \"durationTicks\" | \"midi\" | \"ticks\" | \"velocity\"\n>;\n\nexport type GridDivision = 1 | 2 | 4 | 8 | 16 | 32 | 64;\n\nexport type PianoRollProps = {\n ppq: number;\n notes: Note[];\n\n gridDivision: GridDivision;\n snapToGrid: boolean;\n\n verticalPosition: number;\n verticalZoom: number;\n\n position: number;\n duration: number;\n zoom: number;\n\n onVerticalZoomChange?: (zoom: number) => void;\n onVerticalPositionChange?: (zoom: number) => void;\n onZoomChange?: (zoom: number) => void;\n onPositionChange?: (zoom: number) => void;\n\n onNoteChange?: (index: number, note: Note) => void;\n};\n\nconst PianoRoll = (allProps: PianoRollProps & JSX.IntrinsicElements[\"div\"]) => {\n const [contextProps, divProps] = splitProps(allProps, [\n \"ppq\",\n \"notes\",\n \"position\",\n \"duration\",\n \"zoom\",\n \"verticalPosition\",\n \"verticalZoom\",\n \"onVerticalZoomChange\",\n \"onVerticalPositionChange\",\n \"onZoomChange\",\n \"onPositionChange\",\n \"onNoteChange\",\n \"gridDivision\",\n \"snapToGrid\",\n ]);\n\n const [scrollContainer, setScrollContainer] = createSignal<HTMLDivElement>();\n const [notesContainer, setNotesContainer] = createSignal<HTMLDivElement>();\n\n return (\n <PianoRollContextProvider\n {...contextProps}\n scrollContainer={scrollContainer()}\n notesContainer={notesContainer()}\n >\n <div {...divProps} class={styles.PianoRoll}>\n <div class={styles.PianoRollContainer}>\n <PianoRollKeys />\n\n <div class={styles.PianoRollInnerContainer}>\n <PianoRollNotes ref={setNotesContainer} />\n <PianoRollGrid />\n <ScrollContainer ref={setScrollContainer} />\n </div>\n\n <VerticalZoomControl />\n </div>\n\n <HorizontalZoomControl />\n </div>\n </PianoRollContextProvider>\n );\n};\n\nexport default PianoRoll;\n"],"names":["styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","defaultRect","left","width","top","height","bottom","right","x","y","useBoundingClientRect","containerRef","boundingClientRect","setBoundingClientRect","createSignal","createEffect","container","updateBoundingClientRect","getBoundingClientRect","resizeObserver","ResizeObserver","observe","disconnect","clamp","value","min","max","Math","useViewPortScaler","getState","state","createMemo","getScaledValue","position","virtualSize","viewPortSize","zoom","virtualRange","getCoordinates","virtualPosition","getPosition","offset","visibleDuration","percentX","viewPortOffset","getVirtualDimensions","length","virtualLeft","virtualWidth","size","PianoRollContext","createContext","undefined","PianoRollContextProvider","props","noteDragMode","setNoteDragMode","isDragging","setIsDragging","_ownProps","contextProps","splitProps","clientRect","scrollContainer","horizontalViewPort","duration","verticalViewPort","verticalPosition","verticalZoom","getContextValue","onIsDraggingChange","onNoteDragModeChange","contextValue","setContextValue","createStore","_$createComponent","children","usePianoRollContext","context","useContext","Error","HorizontalZoomControl","_tmpl$","event","onZoomChange","currentTarget","valueAsNumber","_$effect","_$delegateEvents","PianoRollKeys","_$insert","keys","key","virtualDimensions","number","styles","name","isBlack","blackKeys","includes","_$className","_$setAttribute","keyNames","Array","from","map","_","index","floor","PianoRollNotes","gridDivisionTicks","ppq","gridDivision","snapValueToGridIfEnabled","altKey","snapToGrid","round","notes","note","horizontalVirtualDimensions","midi","verticalVirtualDimensions","ticks","durationTicks","_$memo","_tmpl$2","initialPosition","clientX","diffPosition","handleMouseMove","mouseMoveEvent","onNoteChange","clientY","handleMouseUp","window","removeEventListener","addEventListener","relativeX","noteStartX","noteEndX","velocity","ScrollContainer","scrollContentRef","forwardEventToNote","touches","elementUnderMouse","notesContainer","querySelectorAll","find","element","rect","dispatchEvent","MouseEvent","handleScroll","preventDefault","didUpdateScroll","maxVerticalPosition","maxPosition","scrollTop","scrollLeft","scrollWidth","scrollHeight","scrollTopAmount","scrollLeftAmount","onVerticalPositionChange","onPositionChange","parentElement","scrollDivHeight","scrollDivWidth","scrollTo","_$use","_$style","flex","cursor","overflow","VerticalZoomControl","onVerticalZoomChange","_$spread","_$mergeProps","orient","PianoRollGrid","gridDivisorTicks","gridArray","numberOfLines","tick","PianoRoll","allProps","divProps","setScrollContainer","setNotesContainer","PianoRollContainer","PianoRollInnerContainer"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { usePianoRollContext } from "./PianoRollContext";
2
+ const HorizontalZoomControl = () => {
3
+ const context = usePianoRollContext();
4
+ return (<input value={context.zoom} onInput={(event) => context.onZoomChange?.(event.currentTarget.valueAsNumber)} type="range" max="500" min="1" step={0.01} style={{
5
+ "margin-left": "50px",
6
+ "margin-right": "16px",
7
+ }}/>);
8
+ };
9
+ export default HorizontalZoomControl;
@@ -1,11 +1,14 @@
1
- import { createMemo, splitProps, createSignal, onMount, onCleanup, Index, createEffect, Show, } from "solid-js";
2
- import { clamp } from "./helpers";
3
- import useViewPortScaler from "./useViewPortScaler";
1
+ import styles from "./PianoRoll.module.css";
2
+ import { splitProps, createSignal } from "solid-js";
3
+ import HorizontalZoomControl from "./HorizontalZoomControl";
4
+ import { PianoRollContextProvider } from "./PianoRollContext";
5
+ import PianoRollKeys from "./PianoRollKeys";
6
+ import PianoRollNotes from "./PianoRollNotes";
7
+ import ScrollContainer from "./ScrollContainer";
8
+ import VerticalZoomControl from "./VerticalZoomControl";
9
+ import PianoRollGrid from "./PianoRollGrid";
4
10
  const PianoRoll = (allProps) => {
5
- let scrollContainerRef;
6
- let scrollContentRef;
7
- let notesContainerRef;
8
- const [props, divProps] = splitProps(allProps, [
11
+ const [contextProps, divProps] = splitProps(allProps, [
9
12
  "ppq",
10
13
  "notes",
11
14
  "position",
@@ -18,265 +21,27 @@ const PianoRoll = (allProps) => {
18
21
  "onZoomChange",
19
22
  "onPositionChange",
20
23
  "onNoteChange",
24
+ "gridDivision",
25
+ "snapToGrid",
21
26
  ]);
22
- const [dimensions, setDimensions] = createSignal({
23
- left: 0,
24
- width: 0,
25
- top: 0,
26
- height: 0,
27
- });
28
- const resizeObserver = new ResizeObserver((event) => {
29
- const { left, top, width, height } = scrollContainerRef?.getBoundingClientRect() ?? {
30
- left: 0,
31
- width: 0,
32
- top: 0,
33
- height: 0,
34
- };
35
- setDimensions({ left, top, width, height });
36
- });
37
- createEffect(() => {
38
- console.log(props.notes);
39
- });
40
- onMount(() => {
41
- if (!scrollContainerRef)
42
- return;
43
- resizeObserver.observe(scrollContainerRef);
44
- });
45
- onCleanup(() => {
46
- resizeObserver.disconnect();
47
- });
48
- const horizontalViewPort = useViewPortScaler(() => ({
49
- viewPortOffset: dimensions().left,
50
- viewPortSize: dimensions().width,
51
- virtualPosition: props.position,
52
- virtualRange: props.duration,
53
- zoom: props.zoom,
54
- }));
55
- const verticalViewPort = useViewPortScaler(() => ({
56
- viewPortOffset: dimensions().top,
57
- viewPortSize: dimensions().height,
58
- virtualPosition: props.verticalPosition,
59
- virtualRange: 128,
60
- zoom: props.verticalZoom,
61
- }));
62
- const handleScroll = (event) => {
63
- event.preventDefault();
64
- if (didUpdateScroll) {
65
- didUpdateScroll = false;
66
- return;
67
- }
68
- const maxVerticalPosition = 128 - 128 / props.verticalZoom;
69
- const maxPosition = props.duration - props.duration / props.zoom;
70
- const { width, height } = dimensions();
71
- const { scrollTop, scrollLeft, scrollWidth, scrollHeight } = event.currentTarget;
72
- const scrollTopAmount = scrollTop / (scrollHeight - height);
73
- const scrollLeftAmount = scrollLeft / (scrollWidth - width);
74
- props.onVerticalPositionChange?.(maxVerticalPosition * scrollTopAmount);
75
- props.onPositionChange?.(maxPosition * scrollLeftAmount);
76
- };
77
- let didUpdateScroll = false;
78
- createEffect(() => {
79
- const maxVerticalPosition = 128 - 128 / props.verticalZoom;
80
- const maxPosition = props.duration - props.duration / props.zoom;
81
- const scrollTopAmount = maxVerticalPosition > 0 ? props.verticalPosition / maxVerticalPosition : 0;
82
- const scrollLeftAmount = maxPosition > 0 ? props.position / maxPosition : 0;
83
- const { height, width } = dimensions();
84
- if (!scrollContentRef?.parentElement)
85
- return;
86
- const scrollDivHeight = clamp(props.verticalZoom * height, height, 10000);
87
- const scrollTop = scrollTopAmount * (scrollDivHeight - height);
88
- const scrollDivWidth = clamp(props.zoom * width, width, 10000);
89
- const scrollLeft = scrollLeftAmount * (scrollDivWidth - width);
90
- didUpdateScroll = true;
91
- scrollContentRef.style.height = `${scrollDivHeight}px`;
92
- scrollContentRef.style.width = `${scrollDivWidth}px`;
93
- scrollContentRef.parentElement.scrollTo({
94
- left: scrollLeft,
95
- top: scrollTop,
96
- });
97
- });
98
- const forwardEventToNote = (event) => {
99
- const x = "clientX" in event ? event.clientX : event.touches[0]?.clientX;
100
- const y = "clientY" in event ? event.clientY : event.touches[0]?.clientY;
101
- const elementUnderMouse = [...(notesContainerRef?.querySelectorAll?.("div") ?? [])].find((element) => {
102
- const rect = element.getBoundingClientRect();
103
- return (x >= rect.left &&
104
- rect.left + rect.width > x &&
105
- y >= rect.top &&
106
- rect.top + rect.height > y);
107
- });
108
- if (elementUnderMouse) {
109
- return elementUnderMouse.dispatchEvent(new MouseEvent(event.type, event));
110
- }
111
- };
112
- const [noteDragMode, setNoteDragMode] = createSignal();
113
- const [isDragging, setIsDragging] = createSignal(false);
114
- return (<div {...divProps} class="PianoRoll" style={{
115
- "box-sizing": "border-box",
116
- display: "flex",
117
- overflow: "hidden",
118
- "flex-direction": "column",
119
- padding: "16px",
120
- ...(typeof divProps.style === "object" && divProps.style),
121
- }}>
122
- <div style={{
123
- overflow: "hidden",
124
- height: "100%",
125
- display: "flex",
126
- "flex-direction": "row",
127
- }}>
128
- <div class="PianoRoll-Keys" style={{
129
- position: "relative",
130
- height: "100%",
131
- width: `${50}px`,
132
- }}>
133
- <Index each={keys}>
134
- {(key) => {
135
- const virtualDimensions = createMemo(() => verticalViewPort.getVirtualDimensions(127 - key().number, 1));
136
- return (<Show when={virtualDimensions().size > 0}>
137
- <div class="PianoRoll-Key" title={key().name} data-index={key().number % 12} style={{
138
- position: "absolute",
139
- "box-sizing": "border-box",
140
- left: 0,
141
- top: `${virtualDimensions().offset}px`,
142
- height: `${virtualDimensions().size}px`,
143
- width: "100%",
144
- "background-color": key().isBlack ? "#000" : "#fff",
145
- "border-width": `${!key().isBlack && !blackKeys.includes((key().number + 1) % 12) ? "0.1px" : 0} 1px ${!key().isBlack && !blackKeys.includes((key().number - 1) % 12) ? "0.1px" : 0} 0`,
146
- "border-color": "#000",
147
- "border-style": "solid",
148
- }}></div>
149
- </Show>);
150
- }}
151
- </Index>
152
- </div>
27
+ const [scrollContainer, setScrollContainer] = createSignal();
28
+ const [notesContainer, setNotesContainer] = createSignal();
29
+ return (<PianoRollContextProvider {...contextProps} scrollContainer={scrollContainer()} notesContainer={notesContainer()}>
30
+ <div {...divProps} class={styles.PianoRoll}>
31
+ <div class={styles.PianoRollContainer}>
32
+ <PianoRollKeys />
153
33
 
154
- <div style={{
155
- position: "relative",
156
- display: "flex",
157
- overflow: "hidden",
158
- flex: 1,
159
- }}>
160
- <div class="PianoRoll-Notes-Container" style={{
161
- position: "absolute",
162
- width: `${dimensions().width}px`,
163
- height: `${dimensions().height}px`,
164
- }}>
165
- <div class="PianoRoll-Notes" ref={notesContainerRef} style={{
166
- position: "relative",
167
- width: `${dimensions().width}px`,
168
- height: "100%",
169
- }}>
170
- <Index each={props.notes}>
171
- {(note, index) => {
172
- const horizontalVirtualDimensions = createMemo(() => verticalViewPort.getVirtualDimensions(127 - note().midi, 1));
173
- const verticalVirtualDimensions = createMemo(() => horizontalViewPort.getVirtualDimensions(note().ticks, note().durationTicks));
174
- return (<Show when={!!horizontalVirtualDimensions().size && !!verticalVirtualDimensions().size}>
175
- <div class="PianoRoll-Note" onMouseMove={(event) => {
176
- if (isDragging())
177
- return;
178
- const relativeX = horizontalViewPort.getScaledValue(horizontalViewPort.getPosition(event.clientX));
179
- const noteStartX = horizontalViewPort.getScaledValue(note().ticks);
180
- const noteEndX = horizontalViewPort.getScaledValue(note().ticks + note().durationTicks);
181
- setNoteDragMode(relativeX - noteStartX < 3
182
- ? "trimStart"
183
- : noteEndX - relativeX < 3
184
- ? "trimEnd"
185
- : "move");
186
- }} onMouseDown={(event) => {
187
- setIsDragging(true);
188
- const initialPosition = horizontalViewPort.getPosition(event.clientX);
189
- const diffPosition = initialPosition - note().ticks;
190
- const handleMouseMove = (mouseMoveEvent) => {
191
- const ticks = Math.max(horizontalViewPort.getPosition(mouseMoveEvent.clientX) - diffPosition, 0);
192
- props.onNoteChange?.(index, {
193
- ...note(),
194
- midi: Math.round(127 - verticalViewPort.getPosition(mouseMoveEvent.clientY)),
195
- ...((noteDragMode() === "move" || noteDragMode() === "trimStart") && {
196
- ticks,
197
- }),
198
- ...(noteDragMode() === "trimStart" && {
199
- durationTicks: note().durationTicks + note().ticks - ticks,
200
- }),
201
- ...(noteDragMode() === "trimEnd" && {
202
- durationTicks: horizontalViewPort.getPosition(mouseMoveEvent.clientX) -
203
- note().ticks,
204
- }),
205
- });
206
- };
207
- const handleMouseUp = () => {
208
- setIsDragging(false);
209
- window.removeEventListener("mousemove", handleMouseMove);
210
- window.removeEventListener("mouseup", handleMouseUp);
211
- };
212
- window.addEventListener("mousemove", handleMouseMove);
213
- window.addEventListener("mouseup", handleMouseUp);
214
- }} style={{
215
- "z-index": 1,
216
- position: "absolute",
217
- "box-sizing": "border-box",
218
- top: `${horizontalVirtualDimensions().offset}px`,
219
- height: `${horizontalVirtualDimensions().size}px`,
220
- left: `${verticalVirtualDimensions().offset}px`,
221
- width: `${verticalVirtualDimensions().size}px`,
222
- "border-width": "0.5px",
223
- "border-style": "solid",
224
- "background-color": "#f00",
225
- "border-color": "#a00",
226
- }}></div>
227
- </Show>);
228
- }}
229
- </Index>
230
- </div>
231
- </div>
232
- <div ref={scrollContainerRef} class="PianoRoll-Vertical-Scroller" style={{
233
- flex: 1,
234
- ...(noteDragMode() && {
235
- cursor: noteDragMode() === "trimStart"
236
- ? "w-resize"
237
- : noteDragMode() === "trimEnd"
238
- ? "e-resize"
239
- : "pointer",
240
- }),
241
- //"box-sizing": "border-box",
242
- "z-index": 1,
243
- overflow: "scroll",
244
- "pointer-events": "auto",
245
- }} onScroll={handleScroll} onMouseDown={forwardEventToNote} onMouseMove={(event) => {
246
- if (forwardEventToNote(event))
247
- return;
248
- if (isDragging())
249
- return;
250
- setNoteDragMode(undefined);
251
- }} onClick={forwardEventToNote} onDblClick={(event) => {
252
- if (!forwardEventToNote(event)) {
253
- //TODO create new note with current gutter length
254
- }
255
- }} onMouseUp={forwardEventToNote} onTouchStart={forwardEventToNote} onTouchMove={forwardEventToNote} onTouchEnd={forwardEventToNote} onTouchCancel={forwardEventToNote} onDragStart={forwardEventToNote} onDrag={forwardEventToNote} onDragEnd={forwardEventToNote}>
256
- <div ref={scrollContentRef}></div>
34
+ <div class={styles.PianoRollInnerContainer}>
35
+ <PianoRollNotes ref={setNotesContainer}/>
36
+ <PianoRollGrid />
37
+ <ScrollContainer ref={setScrollContainer}/>
257
38
  </div>
39
+
40
+ <VerticalZoomControl />
258
41
  </div>
259
42
 
260
- <input value={props.verticalZoom} onInput={(event) => props.onVerticalZoomChange?.(event.currentTarget.valueAsNumber)} type="range" min="1" max="11" step={0.01} {...{ orient: "vertical" }} style={{
261
- width: "16px",
262
- ...{
263
- "writing-mode": "bt-lr" /* IE */,
264
- "-webkit-appearance": "slider-vertical" /* WebKit */,
265
- },
266
- }}/>
43
+ <HorizontalZoomControl />
267
44
  </div>
268
-
269
- <input value={props.zoom} onInput={(event) => props.onZoomChange?.(event.currentTarget.valueAsNumber)} type="range" max="500" min="1" step={0.01} style={{
270
- "margin-left": "50px",
271
- "margin-right": "16px",
272
- }}/>
273
- </div>);
45
+ </PianoRollContextProvider>);
274
46
  };
275
- const blackKeys = [1, 3, 6, 8, 10];
276
- const keyNames = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
277
- const keys = Array.from({ length: 128 }).map((_, index) => ({
278
- number: index,
279
- name: `${keyNames[index % 12]} ${Math.floor(index / 12) - 2}`,
280
- isBlack: blackKeys.includes(index % 12),
281
- }));
282
47
  export default PianoRoll;
@@ -0,0 +1,48 @@
1
+ import { createContext, createEffect, createSignal, splitProps, useContext, } from "solid-js";
2
+ import { createStore } from "solid-js/store";
3
+ import useBoundingClientRect from "./useBoundingClientRect";
4
+ import useViewPortScaler from "./useViewPortScaler";
5
+ const PianoRollContext = createContext(undefined);
6
+ export const PianoRollContextProvider = (props) => {
7
+ const [noteDragMode, setNoteDragMode] = createSignal();
8
+ const [isDragging, setIsDragging] = createSignal(false);
9
+ const [_ownProps, contextProps] = splitProps(props, ["children", "scrollContainer"]);
10
+ const clientRect = useBoundingClientRect(() => props.scrollContainer);
11
+ const horizontalViewPort = useViewPortScaler(() => ({
12
+ viewPortOffset: clientRect().left,
13
+ viewPortSize: clientRect().width,
14
+ virtualPosition: props.position,
15
+ virtualRange: props.duration,
16
+ zoom: props.zoom,
17
+ }));
18
+ const verticalViewPort = useViewPortScaler(() => ({
19
+ viewPortOffset: clientRect().top,
20
+ viewPortSize: clientRect().height,
21
+ virtualPosition: props.verticalPosition,
22
+ zoom: props.verticalZoom,
23
+ virtualRange: 128,
24
+ }));
25
+ const getContextValue = () => {
26
+ return {
27
+ ...contextProps,
28
+ horizontalViewPort,
29
+ verticalViewPort,
30
+ clientRect: clientRect(),
31
+ isDragging: isDragging(),
32
+ onIsDraggingChange: setIsDragging,
33
+ noteDragMode: noteDragMode(),
34
+ onNoteDragModeChange: setNoteDragMode,
35
+ };
36
+ };
37
+ const [contextValue, setContextValue] = createStore(getContextValue());
38
+ createEffect(() => {
39
+ setContextValue(getContextValue());
40
+ });
41
+ return (<PianoRollContext.Provider value={contextValue}>{props.children}</PianoRollContext.Provider>);
42
+ };
43
+ export const usePianoRollContext = () => {
44
+ const context = useContext(PianoRollContext);
45
+ if (!context)
46
+ throw new Error("No PianoRollContext found");
47
+ return context;
48
+ };