solid-pianoroll 0.0.9 → 0.0.10
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.
- package/dist/cjs/index.js +458 -456
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +460 -458
- package/dist/esm/index.js.map +1 -1
- package/dist/source/PianoRoll.jsx +53 -27
- package/dist/source/PianoRollContext.jsx +3 -42
- package/dist/source/PianoRollGrid.jsx +18 -33
- package/dist/source/PianoRollKeys.jsx +10 -6
- package/dist/source/PianoRollNotes.jsx +91 -46
- package/dist/source/usePianoRoll.js +6 -3
- package/dist/source/viewport/HorizontalZoomControl.jsx +9 -0
- package/dist/source/viewport/ScrollContainer.jsx +87 -0
- package/dist/source/viewport/ScrollZoomViewPort.jsx +19 -0
- package/dist/source/viewport/VerticalZoomControl.jsx +12 -0
- package/dist/source/viewport/createViewPortDimension.js +39 -0
- package/dist/types/PianoRoll.d.ts +1 -1
- package/dist/types/PianoRollContext.d.ts +2 -22
- package/dist/types/PianoRollNotes.d.ts +1 -1
- package/dist/types/usePianoRoll.d.ts +1 -0
- package/dist/types/viewport/HorizontalZoomControl.d.ts +3 -0
- package/dist/types/viewport/ScrollContainer.d.ts +5 -0
- package/dist/types/viewport/ScrollZoomViewPort.d.ts +23 -0
- package/dist/types/viewport/VerticalZoomControl.d.ts +3 -0
- package/dist/types/viewport/createViewPortDimension.d.ts +31 -0
- package/package.json +7 -1
- package/dist/source/HorizontalZoomControl.jsx +0 -9
- package/dist/source/ScrollContainer.jsx +0 -138
- package/dist/source/VerticalZoomControl.jsx +0 -12
- package/dist/source/useViewPortScaler.js +0 -44
- package/dist/types/HorizontalZoomControl.d.ts +0 -2
- package/dist/types/ScrollContainer.d.ts +0 -5
- package/dist/types/VerticalZoomControl.d.ts +0 -2
- package/dist/types/useViewPortScaler.d.ts +0 -20
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../node_modules/style-inject/dist/style-inject.es.js","../../src/useBoundingClientRect.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","../../src/usePianoRoll.ts"],"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","import { createMemo } from \"solid-js\";\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 getVisibleRange() {\n return state().virtualRange / state().zoom;\n }\n\n function getPosition(offset: number) {\n const percentX = (offset - state().viewPortOffset) / state().viewPortSize;\n const position = state().virtualPosition + percentX * getVisibleRange();\n\n return position;\n }\n\n function getMaxPosition() {\n return state().virtualRange - state().virtualRange / state().zoom;\n }\n\n function getScrollSize() {\n return clamp(state().zoom * state().viewPortSize, state().viewPortSize, 100000);\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 getVisibleRange,\n getMaxPosition,\n getScrollSize,\n };\n}\n\nexport const clamp = (value: number, min: number, max: number) => {\n return Math.max(min, Math.min(max, value));\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 * (500 / clientRect().width),\n }));\n\n const verticalViewPort = useViewPortScaler(() => ({\n viewPortOffset: clientRect().top,\n viewPortSize: clientRect().height,\n\n virtualPosition: props.verticalPosition,\n zoom: props.verticalZoom * (500 / clientRect().height),\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 { 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 onDblClick={() => {\n context.onRemoveNote?.(index);\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, createMemo, createSignal, Ref } from \"solid-js\";\n\nimport { usePianoRollContext } from \"./PianoRollContext\";\n\nconst ScrollContainer = (props: { ref: Ref<HTMLDivElement> }) => {\n let scrollContentRef: HTMLDivElement | undefined;\n const context = usePianoRollContext();\n\n const gridDivisorTicks = createMemo(() => (context.ppq * 4) / context.gridDivision);\n\n const forwardEventToNote = (event: MouseEvent | PointerEvent | TouchEvent) => {\n const x = \"clientX\" in event ? event.clientX : event.touches[0]?.clientX ?? 0;\n const y = \"clientY\" in event ? event.clientY : event.touches[0]?.clientY ?? 0;\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 = context.verticalViewPort.getMaxPosition();\n const maxPosition = context.horizontalViewPort.getMaxPosition();\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 = context.verticalViewPort.getMaxPosition();\n const maxPosition = context.horizontalViewPort.getMaxPosition();\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 = context.verticalViewPort.getScrollSize();\n const scrollTop = scrollTopAmount * (scrollDivHeight - height);\n\n const scrollDivWidth = context.horizontalViewPort.getScrollSize();\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 insertOrUpdateNote = (event: MouseEvent) => {\n const position = context.horizontalViewPort.getPosition(event.clientX);\n const midi = 127 - Math.floor(context.verticalViewPort.getPosition(event.clientY));\n const eventPositionTicks = Math.floor(position / gridDivisorTicks()) * gridDivisorTicks();\n const velocity = 127;\n\n const existingNote = newNote();\n\n const ticks = existingNote?.ticks ?? eventPositionTicks;\n const durationTicks = existingNote?.ticks\n ? eventPositionTicks - existingNote?.ticks\n : gridDivisorTicks();\n\n const note = { midi, ticks, durationTicks, velocity };\n\n if (existingNote) {\n context.onNoteChange?.(newNoteIndex(), note);\n return newNoteIndex();\n } else {\n return context.onInsertNote?.(note) ?? -1;\n }\n };\n\n const [newNoteIndex, setNewNoteIndex] = createSignal(-1);\n const newNote = createMemo(() => context.notes[newNoteIndex()]);\n const [isMouseDown, setIsMouseDown] = createSignal(false);\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 \"z-index\": 4,\n overflow: \"scroll\",\n \"pointer-events\": \"auto\",\n }}\n onScroll={handleScroll}\n onMouseDown={(event) => {\n if (forwardEventToNote(event)) return;\n\n setIsMouseDown(true);\n }}\n onMouseMove={(event) => {\n event.preventDefault();\n\n if (forwardEventToNote(event)) return;\n if (context.isDragging) return;\n\n if (!isMouseDown()) {\n context.onNoteDragModeChange(undefined);\n return;\n }\n\n const index = insertOrUpdateNote(event);\n\n setNewNoteIndex(index);\n }}\n onDblClick={(event) => {\n if (newNote()) return;\n if (context.isDragging) return;\n if (forwardEventToNote(event)) return;\n\n insertOrUpdateNote(event);\n }}\n onClick={(event) => {\n if (newNote()) {\n setNewNoteIndex(-1);\n return;\n }\n\n if (forwardEventToNote(event)) return;\n if (!event.altKey) return;\n\n insertOrUpdateNote(event);\n }}\n onMouseUp={(event) => {\n setIsMouseDown(false);\n if (newNote()) return;\n if (forwardEventToNote(event)) return;\n if (!event.altKey) return;\n\n insertOrUpdateNote(event);\n }}\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 { createMemo, Index, Show } from \"solid-js\";\nimport { usePianoRollContext } from \"./PianoRollContext\";\nimport { blackKeys, keys } from \"./PianoRollKeys\";\n\nconst PianoRollGrid = () => {\n const context = usePianoRollContext();\n\n const measureTicks = createMemo(() => context.ppq * 4);\n const selectedGridDivisorTicks = createMemo(() => measureTicks() / context.gridDivision);\n\n function calculateVisibleGridDivisorTicks(value: number): number {\n if (context.horizontalViewPort.getVisibleRange() / value > 100) {\n return calculateVisibleGridDivisorTicks(value * 2);\n }\n if (context.horizontalViewPort.getVisibleRange() / value < 30) {\n return calculateVisibleGridDivisorTicks(value / 2);\n }\n return value;\n }\n\n const gridDivisorTicks = createMemo(() =>\n calculateVisibleGridDivisorTicks(selectedGridDivisorTicks()),\n );\n\n const gridArray = createMemo(() => {\n const numberOfLines = Math.ceil(\n context.horizontalViewPort.getVisibleRange() / gridDivisorTicks(),\n );\n const startIndex = Math.floor(context.position / gridDivisorTicks());\n\n return Array.from({ length: numberOfLines }).map((_, index) => ({\n index: index + startIndex,\n ticks: (index + startIndex) * gridDivisorTicks(),\n }));\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 {(entry) => {\n const virtualDimensions = createMemo(() =>\n context.horizontalViewPort.getVirtualDimensions(entry().ticks, 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:\n Math.ceil((entry().index + 1 * selectedGridDivisorTicks()) / measureTicks()) %\n 2 ===\n 0\n ? \"#ddd\"\n : \"#ccc\",\n top: `0px`,\n height: `100%`,\n left: `${virtualDimensions().offset}px`,\n width: `${virtualDimensions().size}px`,\n \"border-left-style\": \"solid\",\n \"border-left-width\": \"0.5px\",\n \"border-left-color\":\n (entry().index * gridDivisorTicks()) % selectedGridDivisorTicks() === 0\n ? \"gray\"\n : \"#bbb\",\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, Show } 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\";\nimport { Note } from \"./types\";\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 condenseKeys: boolean;\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 onInsertNote?: (note: Note) => number;\n onRemoveNote?: (index: number) => void;\n};\n\nconst PianoRoll = (allProps: PianoRollProps & JSX.IntrinsicElements[\"div\"]) => {\n const [contextProps, divProps] = splitProps(allProps, [\n \"condenseKeys\",\n \"duration\",\n \"gridDivision\",\n \"notes\",\n \"position\",\n \"ppq\",\n \"snapToGrid\",\n \"verticalPosition\",\n \"verticalZoom\",\n \"zoom\",\n \"onInsertNote\",\n \"onNoteChange\",\n \"onPositionChange\",\n \"onRemoveNote\",\n \"onVerticalPositionChange\",\n \"onVerticalZoomChange\",\n \"onZoomChange\",\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","import { createEffect, createSignal } from \"solid-js\";\nimport { GridDivision } from \"./PianoRoll\";\nimport { Note } from \"./types\";\n\nconst usePianoRoll = () => {\n const [ppq, onPpqChange] = createSignal(120);\n\n const [position, onPositionChange] = createSignal(0);\n\n const [zoom, onZoomChange] = createSignal(10);\n const [verticalZoom, onVerticalZoomChange] = createSignal(5);\n const [verticalPosition, onVerticalPositionChange] = createSignal(64);\n\n const [gridDivision, onGridDivisionChange] = createSignal<GridDivision>(16);\n const [snapToGrid, onSnapToGridChange] = createSignal(true);\n\n const [notes, onNotesChange] = createSignal<Note[]>([]);\n const [duration, setDuration] = createSignal(0);\n\n const onNoteChange = (index: number, note: Note) => {\n onNotesChange([...notes().slice(0, index), note, ...notes().splice(index + 1)]);\n };\n\n const onInsertNote = (note: Note) => {\n const index = Math.max(\n notes().findIndex(({ ticks }) => ticks > note.ticks),\n 0,\n );\n onNotesChange([...notes().slice(0, index), note, ...notes().splice(index)]);\n return index;\n };\n\n const onRemoveNote = (index: number) => {\n onNotesChange([...notes().slice(0, index), ...notes().splice(index + 1)]);\n };\n\n createEffect(() => {\n setDuration(\n Math.max(\n (notes()[notes().length - 1]?.ticks ?? 0) +\n (notes()[notes().length - 1]?.durationTicks ?? 0),\n ppq() * 4 * 4,\n ),\n );\n });\n\n return {\n ppq,\n onPpqChange,\n\n position,\n onPositionChange,\n\n zoom,\n onZoomChange,\n\n verticalPosition,\n onVerticalPositionChange,\n\n verticalZoom,\n onVerticalZoomChange,\n\n gridDivision,\n onGridDivisionChange,\n\n snapToGrid,\n onSnapToGridChange,\n\n notes,\n onNotesChange,\n onNoteChange,\n onInsertNote,\n onRemoveNote,\n\n duration,\n };\n};\n\nexport default usePianoRoll;\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","useViewPortScaler","getState","state","createMemo","getScaledValue","position","virtualSize","viewPortSize","zoom","virtualRange","getCoordinates","virtualPosition","getVisibleRange","getPosition","offset","percentX","viewPortOffset","getMaxPosition","getScrollSize","clamp","getVirtualDimensions","length","virtualLeft","virtualWidth","size","value","min","max","Math","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","onRemoveNote","relativeX","noteStartX","noteEndX","velocity","ScrollContainer","scrollContentRef","gridDivisorTicks","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","insertOrUpdateNote","eventPositionTicks","existingNote","newNote","newNoteIndex","onInsertNote","setNewNoteIndex","isMouseDown","setIsMouseDown","_$use","_$style","flex","cursor","overflow","VerticalZoomControl","onVerticalZoomChange","_$spread","_$mergeProps","orient","PianoRollGrid","measureTicks","selectedGridDivisorTicks","calculateVisibleGridDivisorTicks","gridArray","numberOfLines","ceil","startIndex","entry","PianoRoll","allProps","divProps","setScrollContainer","setNotesContainer","PianoRollContainer","PianoRollInnerContainer","usePianoRoll","onPpqChange","onGridDivisionChange","onSnapToGridChange","onNotesChange","setDuration","slice","splice","findIndex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../node_modules/style-inject/dist/style-inject.es.js","../../src/PianoRollContext.tsx","../../src/viewport/createViewPortDimension.ts","../../src/viewport/ScrollZoomViewPort.tsx","../../src/PianoRollKeys.tsx","../../src/PianoRollNotes.tsx","../../src/viewport/ScrollContainer.tsx","../../src/PianoRollGrid.tsx","../../src/useBoundingClientRect.ts","../../src/viewport/VerticalZoomControl.tsx","../../src/viewport/HorizontalZoomControl.tsx","../../src/PianoRoll.tsx","../../src/usePianoRoll.ts"],"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 { createContext, useContext } from \"solid-js\";\n\nimport { PianoRollProps } from \"./PianoRoll\";\n\nconst PianoRollContext = createContext<PianoRollProps>();\n\nexport const PianoRollContextProvider = PianoRollContext.Provider;\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 { createEffect } from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\n\nexport type ViewPortDimension = ReturnType<typeof createViewPortDimension>;\nexport type ViewPortDimensionName = \"horizontal\" | \"vertical\";\nexport type ViewPortDimensionState = {\n position: number;\n range: number;\n\n pixelOffset: number;\n pixelSize: number;\n\n name: ViewPortDimensionName;\n\n onZoomChange?: (zoom: number) => void;\n onPositionChange?: (zoom: number) => void;\n\n zoom: number;\n};\n\nexport default function createViewPortDimension(getState: () => ViewPortDimensionState) {\n const getStateWithFunctions = () => ({\n ...getState(),\n calculatePixelValue,\n calculatePosition,\n calculatePixelDimensions,\n calculateVisibleRange,\n calculateMaxPosition,\n });\n\n const [state, setState] = createStore(getStateWithFunctions());\n\n createEffect(() => setState(getStateWithFunctions()));\n\n function calculatePixelValue(position: number = state.position) {\n const virtualSize = state.pixelSize * state.zoom;\n return (position / state.range) * virtualSize;\n }\n\n function calculatePixelOffset(position: number) {\n return calculatePixelValue(position) - calculatePixelValue(state.position);\n }\n\n function calculatePosition(offset: number) {\n const percentX = (offset - state.pixelOffset) / state.pixelSize;\n const position = state.position + percentX * calculateVisibleRange();\n\n return position;\n }\n\n function calculateVisibleRange() {\n return state.range / state.zoom;\n }\n\n function calculateMaxPosition() {\n return state.range - state.range / state.zoom;\n }\n\n function calculatePixelDimensions(position: number, length: number) {\n const offset = calculatePixelOffset(position);\n const size = calculatePixelValue(length);\n\n return { offset, size };\n }\n\n return state;\n}\n\nexport const clamp = (value: number, min: number, max: number) =>\n Math.max(min, Math.min(max, value));\n","import { createContext, ParentProps, useContext } from \"solid-js\";\nimport createViewPortDimension, {\n ViewPortDimension,\n ViewPortDimensionName,\n ViewPortDimensionState,\n} from \"./createViewPortDimension\";\n\nexport const ScrollZoomViewPort = (\n props: ParentProps<{\n dimensions: Record<ViewPortDimensionName, () => Omit<ViewPortDimensionState, \"name\">>;\n }>,\n) => {\n const viewPorts = Object.entries(props.dimensions).map(([name, viewPortProps]) =>\n createViewPortDimension(() => ({ name: name as ViewPortDimensionName, ...viewPortProps() })),\n );\n\n const parentViewPorts = useContext(ScrollZoomViewPortContext);\n\n return (\n <ScrollZoomViewPortContext.Provider value={[...parentViewPorts, ...viewPorts]}>\n {props.children}\n </ScrollZoomViewPortContext.Provider>\n );\n};\n\nconst ScrollZoomViewPortContext = createContext<ViewPortDimension[]>([]);\n\nexport const useViewPortDimension = (name: ViewPortDimensionName) => {\n const viewPorts = useContext(ScrollZoomViewPortContext);\n\n const viewPort = name\n ? viewPorts.find((viewPort) => viewPort.name === name)\n : viewPorts[viewPorts.length - 1];\n\n if (!viewPort) throw new Error(`ViewPort dimension \"${name}\" not found.`);\n\n return viewPort;\n};\n","import styles from \"./PianoRollKeys.module.css\";\nimport { createMemo, Index, Show } from \"solid-js\";\nimport { useViewPortDimension } from \"./viewport/ScrollZoomViewPort\";\n\nconst PianoRollKeys = () => {\n const viewPort = createMemo(() => useViewPortDimension(\"vertical\"));\n\n return (\n <div class={styles.PianoRollKeys}>\n <Index each={keys}>\n {(key) => {\n const virtualDimensions = createMemo(() =>\n viewPort().calculatePixelDimensions(127 - key().number, 1),\n );\n\n return (\n <Show when={virtualDimensions().size > 0}>\n <div\n classList={{\n [styles[\"Key\"]]: true,\n [styles[\"black\"]]: key().isBlack,\n [styles[\"white\"]]: !key().isBlack,\n [styles[\"whiteAndNextIsWhite\"]]:\n !key().isBlack && !blackKeys.includes((key().number + 1) % 12),\n [styles[\"whiteAndPreviousIsWhite\"]]:\n !key().isBlack && !blackKeys.includes((key().number - 1) % 12),\n }}\n title={key().name}\n data-index={key().number % 12}\n style={{\n top: `${virtualDimensions().offset}px`,\n height: `${virtualDimensions().size}px`,\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 { createMemo, createSignal, Index, Ref, Show } from \"solid-js\";\nimport { usePianoRollContext } from \"./PianoRollContext\";\nimport { useViewPortDimension } from \"./viewport/ScrollZoomViewPort\";\nimport styles from \"./PianoRollNotes.module.scss\";\n\ntype NoteDragMode = \"trimStart\" | \"move\" | \"trimEnd\" | undefined;\n\nconst PianoRollNotes = (props: { ref?: Ref<HTMLDivElement | undefined> }) => {\n const context = usePianoRollContext();\n\n const verticalViewPort = createMemo(() => useViewPortDimension(\"vertical\"));\n const horizontalViewPort = createMemo(() => useViewPortDimension(\"horizontal\"));\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 const insertOrUpdateNote = (event: MouseEvent) => {\n const position = horizontalViewPort().calculatePosition(event.clientX);\n const midi = 127 - Math.floor(verticalViewPort().calculatePosition(event.clientY));\n const eventPositionTicks = Math.floor(position / gridDivisionTicks()) * gridDivisionTicks();\n const velocity = 127;\n\n const existingNote = newNote();\n\n const ticks = existingNote?.ticks ?? eventPositionTicks;\n const durationTicks = existingNote?.ticks\n ? eventPositionTicks - existingNote?.ticks\n : gridDivisionTicks();\n\n const note = { midi, ticks, durationTicks, velocity };\n\n if (existingNote) {\n context.onNoteChange?.(newNoteIndex(), note);\n return newNoteIndex();\n } else {\n return context.onInsertNote?.(note) ?? -1;\n }\n };\n\n const [isDragging, setIsDragging] = createSignal(false);\n const [noteDragMode, setNoteDragMode] = createSignal<NoteDragMode>();\n const [newNoteIndex, setNewNoteIndex] = createSignal(-1);\n const [isMouseDown, setIsMouseDown] = createSignal(false);\n\n const newNote = createMemo(() => context.notes[newNoteIndex()]);\n\n const getClasses = (noteDragMode: NoteDragMode) => {\n return noteDragMode ? [styles.Note, styles[noteDragMode]] : [styles.Note];\n };\n\n return (\n <div\n class={styles.PianoRollNotes}\n ref={props.ref}\n onMouseDown={() => {\n console.log(\"down\");\n setIsMouseDown(true);\n }}\n onMouseMove={(event) => {\n if (isDragging()) return;\n\n if (!isMouseDown()) {\n setNoteDragMode(undefined);\n return;\n }\n\n const index = insertOrUpdateNote(event);\n\n console.log({ index });\n\n setNewNoteIndex(index);\n }}\n onMouseUp={(event) => {\n setIsMouseDown(false);\n if (!event.altKey) return;\n insertOrUpdateNote(event);\n }}\n onDblClick={(event) => {\n insertOrUpdateNote(event);\n }}\n onClick={(event) => {\n if (newNote()) {\n setNewNoteIndex(-1);\n return;\n }\n if (!event.altKey) return;\n insertOrUpdateNote(event);\n }}\n >\n <Index each={context.notes}>\n {(note, index) => {\n const verticalVirtualDimensionss = createMemo(() =>\n verticalViewPort().calculatePixelDimensions(127 - note().midi, 1),\n );\n\n const horizontalDimensions = createMemo(() =>\n horizontalViewPort().calculatePixelDimensions(note().ticks, note().durationTicks),\n );\n\n return (\n <Show when={!!verticalVirtualDimensionss().size && !!horizontalDimensions().size}>\n <div\n class={getClasses(noteDragMode()).join(\" \")}\n onMouseMove={(event) => {\n if (isDragging()) return;\n event.stopPropagation();\n\n const relativeX = horizontalViewPort().calculatePixelValue(\n horizontalViewPort().calculatePosition(event.clientX),\n );\n const noteStartX = horizontalViewPort().calculatePixelValue(note().ticks);\n const noteEndX = horizontalViewPort().calculatePixelValue(\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 onDblClick={(event) => {\n event.stopPropagation();\n context.onRemoveNote?.(index);\n }}\n onMouseDown={(event) => {\n event.stopPropagation();\n\n setIsDragging(true);\n const initialPosition = horizontalViewPort().calculatePosition(event.clientX);\n const diffPosition = initialPosition - note().ticks;\n\n const handleMouseMove = (mouseMoveEvent: MouseEvent) => {\n const ticks = snapValueToGridIfEnabled(\n Math.max(\n horizontalViewPort().calculatePosition(mouseMoveEvent.clientX) -\n diffPosition,\n 0,\n ),\n mouseMoveEvent.altKey,\n );\n\n context.onNoteChange?.(index, {\n ...note(),\n ...(noteDragMode() === \"move\" && {\n midi: Math.round(\n 127 - verticalViewPort().calculatePosition(mouseMoveEvent.clientY),\n ),\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: snapValueToGridIfEnabled(\n horizontalViewPort().calculatePosition(mouseMoveEvent.clientX) -\n note().ticks,\n mouseMoveEvent.altKey,\n ),\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 \"background-color\": `rgba(255,0,0, ${(128 + note().velocity) / 256})`,\n top: `${verticalVirtualDimensionss().offset}px`,\n height: `${verticalVirtualDimensionss().size}px`,\n left: `${horizontalDimensions().offset}px`,\n width: `${horizontalDimensions().size}px`,\n }}\n ></div>\n </Show>\n );\n }}\n </Index>\n </div>\n );\n};\n\nexport default PianoRollNotes;\n","import { createEffect, createMemo, ParentProps, Ref } from \"solid-js\";\n\nimport { useViewPortDimension } from \"./ScrollZoomViewPort\";\n\nconst ScrollContainer = (props: ParentProps<{ ref?: Ref<HTMLDivElement> }>) => {\n let scrollContentRef: HTMLDivElement | undefined;\n\n const verticalViewPort = createMemo(() => useViewPortDimension(\"vertical\"));\n const horizontalViewPort = createMemo(() => useViewPortDimension(\"horizontal\"));\n\n const handleScroll = (event: UIEvent & { currentTarget: Element }) => {\n event.preventDefault();\n\n if (didUpdateScroll) {\n didUpdateScroll = false;\n return;\n }\n\n const maxVerticalPosition = verticalViewPort().calculateMaxPosition();\n const maxPosition = horizontalViewPort().calculateMaxPosition();\n\n const height = verticalViewPort().pixelSize;\n const width = horizontalViewPort().pixelSize;\n const { scrollTop, scrollLeft, scrollWidth, scrollHeight } = event.currentTarget;\n\n const scrollTopAmount = scrollTop / (scrollHeight - height);\n const scrollLeftAmount = scrollLeft / (scrollWidth - width);\n\n verticalViewPort().onPositionChange?.(maxVerticalPosition * scrollTopAmount);\n horizontalViewPort().onPositionChange?.(maxPosition * scrollLeftAmount);\n };\n\n const handleWheel = (event: WheelEvent) => {\n if (event.altKey) {\n event.preventDefault();\n\n if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) {\n horizontalViewPort()?.onZoomChange?.(\n horizontalViewPort().zoom * (1 + event.deltaX / horizontalViewPort().pixelSize),\n );\n const maxPosition = horizontalViewPort().calculateMaxPosition();\n\n horizontalViewPort()?.onPositionChange?.(\n Math.min(maxPosition, horizontalViewPort()?.position),\n );\n } else {\n verticalViewPort()?.onZoomChange?.(\n verticalViewPort().zoom * (1 + event.deltaY / verticalViewPort().pixelSize),\n );\n const maxVerticalPosition = verticalViewPort().calculateMaxPosition();\n\n verticalViewPort()?.onPositionChange?.(\n Math.min(maxVerticalPosition, verticalViewPort()?.position),\n );\n }\n }\n };\n\n let didUpdateScroll = false;\n\n createEffect(() => {\n const maxVerticalPosition = verticalViewPort().calculateMaxPosition();\n const maxPosition = horizontalViewPort().calculateMaxPosition();\n\n const scrollTopAmount =\n maxVerticalPosition > 0 ? verticalViewPort().position / maxVerticalPosition : 0;\n const scrollLeftAmount = maxPosition > 0 ? horizontalViewPort().position / maxPosition : 0;\n\n const height = verticalViewPort().pixelSize;\n const width = horizontalViewPort().pixelSize;\n\n if (!scrollContentRef?.parentElement) return;\n\n const scrollDivHeight = verticalViewPort().zoom * verticalViewPort().pixelSize;\n const scrollTop = scrollTopAmount * (scrollDivHeight - height);\n\n const scrollDivWidth = horizontalViewPort().zoom * horizontalViewPort().pixelSize;\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-Scroller\"\n style={{\n height: \"100%\",\n width: \"100%\",\n \"z-index\": 4,\n overflow: \"scroll\",\n \"pointer-events\": \"auto\",\n }}\n onScroll={handleScroll}\n onWheel={handleWheel}\n >\n <div ref={scrollContentRef}>\n <div\n style={{\n top: 0,\n left: 0,\n height: `${verticalViewPort().pixelSize}px`,\n width: `${horizontalViewPort().pixelSize}px`,\n position: \"sticky\",\n display: \"flex\",\n }}\n >\n <div\n style={{\n position: \"relative\",\n height: `${verticalViewPort().pixelSize}px`,\n width: `${horizontalViewPort().pixelSize}px`,\n }}\n >\n {props.children}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ScrollContainer;\n","import { createMemo, Index, Show } from \"solid-js\";\nimport { usePianoRollContext } from \"./PianoRollContext\";\nimport { blackKeys, keys } from \"./PianoRollKeys\";\nimport { useViewPortDimension } from \"./viewport/ScrollZoomViewPort\";\nimport styles from \"./PianoRollGrid.module.css\";\n\nconst PianoRollGrid = () => {\n const context = usePianoRollContext();\n\n const verticalViewPort = createMemo(() => useViewPortDimension(\"vertical\"));\n const horizontalViewPort = createMemo(() => useViewPortDimension(\"horizontal\"));\n\n const measureTicks = createMemo(() => context.ppq * 4);\n const selectedGridDivisorTicks = createMemo(() => measureTicks() / context.gridDivision);\n\n function calculateVisibleGridDivisorTicks(value: number): number {\n if (horizontalViewPort().calculateVisibleRange() / value > 100) {\n return calculateVisibleGridDivisorTicks(value * 2);\n }\n if (horizontalViewPort().calculateVisibleRange() / value < 30) {\n return calculateVisibleGridDivisorTicks(value / 2);\n }\n return value;\n }\n\n const gridDivisorTicks = createMemo(() =>\n calculateVisibleGridDivisorTicks(selectedGridDivisorTicks()),\n );\n\n const gridArray = createMemo(() => {\n const numberOfLines = Math.ceil(\n horizontalViewPort().calculateVisibleRange() / gridDivisorTicks() + 1,\n );\n const startIndex = Math.floor(context.position / gridDivisorTicks());\n\n return Array.from({ length: numberOfLines }).map((_, index) => ({\n index: index + startIndex,\n ticks: (index + startIndex) * gridDivisorTicks(),\n }));\n });\n\n return (\n <div class={styles.PianoRollGrid}>\n <Index each={gridArray()}>\n {(entry) => {\n const virtualDimensions = createMemo(() =>\n horizontalViewPort().calculatePixelDimensions(entry().ticks, gridDivisorTicks()),\n );\n\n return (\n <Show when={virtualDimensions().size > 0}>\n <div\n class={styles[\"PianoRollGrid-Time\"]}\n style={{\n background:\n Math.ceil((entry().index + 1 * selectedGridDivisorTicks()) / measureTicks()) %\n 2 ===\n 0\n ? \"#ddd\"\n : \"#ccc\",\n left: `${virtualDimensions().offset}px`,\n width: `${virtualDimensions().size}px`,\n \"border-left-color\":\n (entry().index * gridDivisorTicks()) % selectedGridDivisorTicks() === 0\n ? \"gray\"\n : \"#bbb\",\n }}\n ></div>\n </Show>\n );\n }}\n </Index>\n <Show when={!context.condensed}>\n <Index each={keys}>\n {(key) => {\n const virtualDimensions = createMemo(() =>\n verticalViewPort().calculatePixelDimensions(127 - key().number, 1),\n );\n\n return (\n <Show when={virtualDimensions().size > 0}>\n <div\n class={styles[\"PianoRollGrid-Key\"]}\n style={{\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-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 </Show>\n </div>\n );\n};\n\nexport default PianoRollGrid;\n","import { Accessor, createEffect, createSignal } 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","import { JSX } from \"solid-js/jsx-runtime\";\nimport { usePianoRollContext } from \"../PianoRollContext\";\n\nconst VerticalZoomControl = (props: JSX.IntrinsicElements[\"input\"]) => {\n const context = usePianoRollContext();\n\n return (\n <input\n min=\"1\"\n max=\"11\"\n step={0.01}\n {...props}\n value={context.verticalZoom}\n onInput={(event) => context.onVerticalZoomChange?.(event.currentTarget.valueAsNumber)}\n type=\"range\"\n {...{ orient: \"vertical\" }}\n style={{\n width: \"16px\",\n ...({\n \"writing-mode\": \"bt-lr\" /* IE */,\n \"-webkit-appearance\": \"slider-vertical\" /* WebKit */,\n } as unknown as JSX.CSSProperties),\n }}\n />\n );\n};\n\nexport default VerticalZoomControl;\n","import { JSX } from \"solid-js/jsx-runtime\";\n\nimport { usePianoRollContext } from \"../PianoRollContext\";\n\nconst HorizontalZoomControl = (props: JSX.IntrinsicElements[\"input\"]) => {\n const context = usePianoRollContext();\n\n return (\n <input\n max=\"500\"\n min=\"1\"\n step={0.01}\n {...props}\n value={context.zoom}\n onInput={(event) => context.onZoomChange?.(event.currentTarget.valueAsNumber)}\n type=\"range\"\n style={{\n \"margin-left\": \"50px\",\n \"margin-right\": \"16px\",\n }}\n />\n );\n};\n\nexport default HorizontalZoomControl;\n","import styles from \"./PianoRoll.module.css\";\n\nimport { JSX, splitProps, createSignal, createMemo } from \"solid-js\";\n\nimport { PianoRollContextProvider } from \"./PianoRollContext\";\nimport PianoRollKeys from \"./PianoRollKeys\";\nimport PianoRollNotes from \"./PianoRollNotes\";\nimport ScrollContainer from \"./viewport/ScrollContainer\";\nimport PianoRollGrid from \"./PianoRollGrid\";\nimport { Note } from \"./types\";\nimport { ScrollZoomViewPort as ScrollZoomViewPort } from \"./viewport/ScrollZoomViewPort\";\nimport useBoundingClientRect from \"./useBoundingClientRect\";\nimport { clamp } from \"./viewport/createViewPortDimension\";\nimport VerticalZoomControl from \"./viewport/VerticalZoomControl\";\nimport HorizontalZoomControl from \"./viewport/HorizontalZoomControl\";\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 condensed?: 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 onInsertNote?: (note: Note) => number;\n onRemoveNote?: (index: number) => 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 \"onInsertNote\",\n \"onRemoveNote\",\n ]);\n\n const [scrollerRef, setScrollerRef] = createSignal<HTMLDivElement>();\n const clientRect = useBoundingClientRect(scrollerRef);\n\n const zoomFactor = 500;\n\n const minZoom = createMemo(() => 1 / (zoomFactor / clientRect().width));\n const maxZoom = createMemo(() => 500 * (zoomFactor / clientRect().width));\n\n const minVerticalZoom = createMemo(() => 1 / (zoomFactor / clientRect().height));\n const maxVerticalZoom = createMemo(() => 10 * (zoomFactor / clientRect().height));\n\n return (\n <PianoRollContextProvider value={contextProps}>\n <div {...divProps} class={styles.PianoRoll}>\n <div class={styles.PianoRollContainer}>\n <ScrollZoomViewPort\n dimensions={{\n horizontal: () => ({\n pixelOffset: clientRect().left,\n pixelSize: clientRect().width,\n position: contextProps.position,\n range: contextProps.duration,\n zoom: contextProps.zoom * (zoomFactor / clientRect().width),\n onPositionChange: contextProps.onPositionChange,\n onZoomChange: (zoom) =>\n contextProps.onZoomChange?.(\n clamp(zoom / (zoomFactor / clientRect().width), minZoom(), maxZoom()),\n ),\n }),\n vertical: () => ({\n pixelOffset: clientRect().top,\n pixelSize: clientRect().height,\n position: contextProps.verticalPosition,\n range: 128,\n zoom: contextProps.verticalZoom * (zoomFactor / clientRect().height),\n onPositionChange: contextProps.onVerticalPositionChange,\n onZoomChange: (verticalZoom) =>\n contextProps.onVerticalZoomChange?.(\n clamp(\n verticalZoom / (zoomFactor / clientRect().height),\n minVerticalZoom(),\n maxVerticalZoom(),\n ),\n ),\n }),\n }}\n >\n <PianoRollKeys />\n\n <ScrollContainer ref={setScrollerRef}>\n <PianoRollGrid />\n <PianoRollNotes />\n </ScrollContainer>\n\n <VerticalZoomControl min={minVerticalZoom()} max={maxVerticalZoom()} />\n </ScrollZoomViewPort>\n </div>\n <HorizontalZoomControl min={minZoom()} max={maxZoom()} />\n </div>\n </PianoRollContextProvider>\n );\n};\n\nexport default PianoRoll;\n","import { createEffect, createSignal } from \"solid-js\";\nimport { GridDivision } from \"./PianoRoll\";\nimport { Note } from \"./types\";\n\nconst usePianoRoll = () => {\n const [ppq, onPpqChange] = createSignal(120);\n\n const [position, onPositionChange] = createSignal(0);\n\n const [zoom, onZoomChange] = createSignal(10);\n const [verticalZoom, onVerticalZoomChange] = createSignal(5);\n const [verticalPosition, onVerticalPositionChange] = createSignal(64);\n\n const [gridDivision, onGridDivisionChange] = createSignal<GridDivision>(16);\n const [snapToGrid, onSnapToGridChange] = createSignal(true);\n\n const [notes, onNotesChange] = createSignal<Note[]>([]);\n const [duration, onDurationChange] = createSignal(0);\n\n const onNoteChange = (index: number, note: Note) => {\n onNotesChange([...notes().slice(0, index), note, ...notes().splice(index + 1)]);\n };\n\n const onInsertNote = (note: Note) => {\n const index = Math.max(\n notes().findIndex(({ ticks }) => ticks > note.ticks),\n 0,\n );\n onNotesChange([...notes().slice(0, index), note, ...notes().splice(index)]);\n return index;\n };\n\n const onRemoveNote = (index: number) => {\n onNotesChange([...notes().slice(0, index), ...notes().splice(index + 1)]);\n };\n\n createEffect(() => {\n const minDuration = Math.max(\n (notes()[notes().length - 1]?.ticks ?? 0) + (notes()[notes().length - 1]?.durationTicks ?? 0),\n ppq() * 4 * 4,\n );\n\n if (duration() < minDuration) {\n onDurationChange(minDuration);\n }\n });\n\n return {\n ppq,\n onPpqChange,\n\n position,\n onPositionChange,\n\n zoom,\n onZoomChange,\n\n verticalPosition,\n onVerticalPositionChange,\n\n verticalZoom,\n onVerticalZoomChange,\n\n gridDivision,\n onGridDivisionChange,\n\n snapToGrid,\n onSnapToGridChange,\n\n notes,\n onNotesChange,\n onNoteChange,\n onInsertNote,\n onRemoveNote,\n\n duration,\n onDurationChange,\n };\n};\n\nexport default usePianoRoll;\n"],"names":["styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","PianoRollContext","createContext","PianoRollContextProvider","Provider","usePianoRollContext","context","useContext","Error","createViewPortDimension","getState","getStateWithFunctions","calculatePixelValue","calculatePosition","calculatePixelDimensions","calculateVisibleRange","calculateMaxPosition","state","setState","createStore","createEffect","position","virtualSize","pixelSize","zoom","range","calculatePixelOffset","offset","percentX","pixelOffset","length","size","clamp","value","min","max","Math","ScrollZoomViewPort","props","viewPorts","Object","entries","dimensions","map","name","viewPortProps","parentViewPorts","ScrollZoomViewPortContext","_$createComponent","children","useViewPortDimension","viewPort","find","PianoRollKeys","createMemo","_tmpl$","_$insert","keys","key","virtualDimensions","number","_$effect","styles","isBlack","blackKeys","includes","_$classList","_$setAttribute","keyNames","Array","from","_","index","floor","PianoRollNotes","verticalViewPort","horizontalViewPort","gridDivisionTicks","ppq","gridDivision","snapValueToGridIfEnabled","altKey","snapToGrid","round","insertOrUpdateNote","event","clientX","midi","clientY","eventPositionTicks","velocity","existingNote","newNote","ticks","durationTicks","note","onNoteChange","newNoteIndex","onInsertNote","isDragging","setIsDragging","createSignal","noteDragMode","setNoteDragMode","setNewNoteIndex","isMouseDown","setIsMouseDown","notes","getClasses","Note","undefined","console","log","verticalVirtualDimensionss","horizontalDimensions","_$memo","stopPropagation","initialPosition","diffPosition","handleMouseMove","mouseMoveEvent","handleMouseUp","window","removeEventListener","addEventListener","onRemoveNote","relativeX","noteStartX","noteEndX","join","_$className","_$delegateEvents","ScrollContainer","scrollContentRef","handleScroll","preventDefault","didUpdateScroll","maxVerticalPosition","maxPosition","height","width","scrollTop","scrollLeft","scrollWidth","scrollHeight","currentTarget","scrollTopAmount","scrollLeftAmount","onPositionChange","handleWheel","abs","deltaX","deltaY","onZoomChange","parentElement","scrollDivHeight","scrollDivWidth","scrollTo","left","top","_$use","PianoRollGrid","measureTicks","selectedGridDivisorTicks","calculateVisibleGridDivisorTicks","gridDivisorTicks","gridArray","numberOfLines","ceil","startIndex","entry","condensed","defaultRect","bottom","right","x","y","useBoundingClientRect","containerRef","boundingClientRect","setBoundingClientRect","container","updateBoundingClientRect","getBoundingClientRect","resizeObserver","ResizeObserver","observe","disconnect","VerticalZoomControl","_$spread","_$mergeProps","verticalZoom","onVerticalZoomChange","valueAsNumber","orient","HorizontalZoomControl","PianoRoll","allProps","contextProps","divProps","splitProps","scrollerRef","setScrollerRef","clientRect","zoomFactor","minZoom","maxZoom","minVerticalZoom","maxVerticalZoom","horizontal","duration","vertical","verticalPosition","onVerticalPositionChange","PianoRollContainer","usePianoRoll","onPpqChange","onGridDivisionChange","onSnapToGridChange","onNotesChange","onDurationChange","slice","splice","findIndex","minDuration"],"mappings":"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"}
|
|
@@ -1,49 +1,75 @@
|
|
|
1
1
|
import styles from "./PianoRoll.module.css";
|
|
2
|
-
import { splitProps, createSignal } from "solid-js";
|
|
3
|
-
import HorizontalZoomControl from "./HorizontalZoomControl";
|
|
2
|
+
import { splitProps, createSignal, createMemo } from "solid-js";
|
|
4
3
|
import { PianoRollContextProvider } from "./PianoRollContext";
|
|
5
4
|
import PianoRollKeys from "./PianoRollKeys";
|
|
6
5
|
import PianoRollNotes from "./PianoRollNotes";
|
|
7
|
-
import ScrollContainer from "./ScrollContainer";
|
|
8
|
-
import VerticalZoomControl from "./VerticalZoomControl";
|
|
6
|
+
import ScrollContainer from "./viewport/ScrollContainer";
|
|
9
7
|
import PianoRollGrid from "./PianoRollGrid";
|
|
8
|
+
import { ScrollZoomViewPort as ScrollZoomViewPort } from "./viewport/ScrollZoomViewPort";
|
|
9
|
+
import useBoundingClientRect from "./useBoundingClientRect";
|
|
10
|
+
import { clamp } from "./viewport/createViewPortDimension";
|
|
11
|
+
import VerticalZoomControl from "./viewport/VerticalZoomControl";
|
|
12
|
+
import HorizontalZoomControl from "./viewport/HorizontalZoomControl";
|
|
10
13
|
const PianoRoll = (allProps) => {
|
|
11
14
|
const [contextProps, divProps] = splitProps(allProps, [
|
|
12
|
-
"
|
|
13
|
-
"duration",
|
|
14
|
-
"gridDivision",
|
|
15
|
+
"ppq",
|
|
15
16
|
"notes",
|
|
16
17
|
"position",
|
|
17
|
-
"
|
|
18
|
-
"
|
|
18
|
+
"duration",
|
|
19
|
+
"zoom",
|
|
19
20
|
"verticalPosition",
|
|
20
21
|
"verticalZoom",
|
|
21
|
-
"zoom",
|
|
22
|
-
"onInsertNote",
|
|
23
|
-
"onNoteChange",
|
|
24
|
-
"onPositionChange",
|
|
25
|
-
"onRemoveNote",
|
|
26
|
-
"onVerticalPositionChange",
|
|
27
22
|
"onVerticalZoomChange",
|
|
23
|
+
"onVerticalPositionChange",
|
|
28
24
|
"onZoomChange",
|
|
25
|
+
"onPositionChange",
|
|
26
|
+
"onNoteChange",
|
|
27
|
+
"gridDivision",
|
|
28
|
+
"snapToGrid",
|
|
29
|
+
"onInsertNote",
|
|
30
|
+
"onRemoveNote",
|
|
29
31
|
]);
|
|
30
|
-
const [
|
|
31
|
-
const
|
|
32
|
-
|
|
32
|
+
const [scrollerRef, setScrollerRef] = createSignal();
|
|
33
|
+
const clientRect = useBoundingClientRect(scrollerRef);
|
|
34
|
+
const zoomFactor = 500;
|
|
35
|
+
const minZoom = createMemo(() => 1 / (zoomFactor / clientRect().width));
|
|
36
|
+
const maxZoom = createMemo(() => 500 * (zoomFactor / clientRect().width));
|
|
37
|
+
const minVerticalZoom = createMemo(() => 1 / (zoomFactor / clientRect().height));
|
|
38
|
+
const maxVerticalZoom = createMemo(() => 10 * (zoomFactor / clientRect().height));
|
|
39
|
+
return (<PianoRollContextProvider value={contextProps}>
|
|
33
40
|
<div {...divProps} class={styles.PianoRoll}>
|
|
34
41
|
<div class={styles.PianoRollContainer}>
|
|
35
|
-
<
|
|
42
|
+
<ScrollZoomViewPort dimensions={{
|
|
43
|
+
horizontal: () => ({
|
|
44
|
+
pixelOffset: clientRect().left,
|
|
45
|
+
pixelSize: clientRect().width,
|
|
46
|
+
position: contextProps.position,
|
|
47
|
+
range: contextProps.duration,
|
|
48
|
+
zoom: contextProps.zoom * (zoomFactor / clientRect().width),
|
|
49
|
+
onPositionChange: contextProps.onPositionChange,
|
|
50
|
+
onZoomChange: (zoom) => contextProps.onZoomChange?.(clamp(zoom / (zoomFactor / clientRect().width), minZoom(), maxZoom())),
|
|
51
|
+
}),
|
|
52
|
+
vertical: () => ({
|
|
53
|
+
pixelOffset: clientRect().top,
|
|
54
|
+
pixelSize: clientRect().height,
|
|
55
|
+
position: contextProps.verticalPosition,
|
|
56
|
+
range: 128,
|
|
57
|
+
zoom: contextProps.verticalZoom * (zoomFactor / clientRect().height),
|
|
58
|
+
onPositionChange: contextProps.onVerticalPositionChange,
|
|
59
|
+
onZoomChange: (verticalZoom) => contextProps.onVerticalZoomChange?.(clamp(verticalZoom / (zoomFactor / clientRect().height), minVerticalZoom(), maxVerticalZoom())),
|
|
60
|
+
}),
|
|
61
|
+
}}>
|
|
62
|
+
<PianoRollKeys />
|
|
36
63
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
</div>
|
|
64
|
+
<ScrollContainer ref={setScrollerRef}>
|
|
65
|
+
<PianoRollGrid />
|
|
66
|
+
<PianoRollNotes />
|
|
67
|
+
</ScrollContainer>
|
|
42
68
|
|
|
43
|
-
|
|
69
|
+
<VerticalZoomControl min={minVerticalZoom()} max={maxVerticalZoom()}/>
|
|
70
|
+
</ScrollZoomViewPort>
|
|
44
71
|
</div>
|
|
45
|
-
|
|
46
|
-
<HorizontalZoomControl />
|
|
72
|
+
<HorizontalZoomControl min={minZoom()} max={maxZoom()}/>
|
|
47
73
|
</div>
|
|
48
74
|
</PianoRollContextProvider>);
|
|
49
75
|
};
|
|
@@ -1,45 +1,6 @@
|
|
|
1
|
-
import { createContext,
|
|
2
|
-
|
|
3
|
-
|
|
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 * (500 / clientRect().width),
|
|
17
|
-
}));
|
|
18
|
-
const verticalViewPort = useViewPortScaler(() => ({
|
|
19
|
-
viewPortOffset: clientRect().top,
|
|
20
|
-
viewPortSize: clientRect().height,
|
|
21
|
-
virtualPosition: props.verticalPosition,
|
|
22
|
-
zoom: props.verticalZoom * (500 / clientRect().height),
|
|
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
|
-
};
|
|
1
|
+
import { createContext, useContext } from "solid-js";
|
|
2
|
+
const PianoRollContext = createContext();
|
|
3
|
+
export const PianoRollContextProvider = PianoRollContext.Provider;
|
|
43
4
|
export const usePianoRollContext = () => {
|
|
44
5
|
const context = useContext(PianoRollContext);
|
|
45
6
|
if (!context)
|
|
@@ -1,83 +1,68 @@
|
|
|
1
1
|
import { createMemo, Index, Show } from "solid-js";
|
|
2
2
|
import { usePianoRollContext } from "./PianoRollContext";
|
|
3
3
|
import { blackKeys, keys } from "./PianoRollKeys";
|
|
4
|
+
import { useViewPortDimension } from "./viewport/ScrollZoomViewPort";
|
|
5
|
+
import styles from "./PianoRollGrid.module.css";
|
|
4
6
|
const PianoRollGrid = () => {
|
|
5
7
|
const context = usePianoRollContext();
|
|
8
|
+
const verticalViewPort = createMemo(() => useViewPortDimension("vertical"));
|
|
9
|
+
const horizontalViewPort = createMemo(() => useViewPortDimension("horizontal"));
|
|
6
10
|
const measureTicks = createMemo(() => context.ppq * 4);
|
|
7
11
|
const selectedGridDivisorTicks = createMemo(() => measureTicks() / context.gridDivision);
|
|
8
12
|
function calculateVisibleGridDivisorTicks(value) {
|
|
9
|
-
if (
|
|
13
|
+
if (horizontalViewPort().calculateVisibleRange() / value > 100) {
|
|
10
14
|
return calculateVisibleGridDivisorTicks(value * 2);
|
|
11
15
|
}
|
|
12
|
-
if (
|
|
16
|
+
if (horizontalViewPort().calculateVisibleRange() / value < 30) {
|
|
13
17
|
return calculateVisibleGridDivisorTicks(value / 2);
|
|
14
18
|
}
|
|
15
19
|
return value;
|
|
16
20
|
}
|
|
17
21
|
const gridDivisorTicks = createMemo(() => calculateVisibleGridDivisorTicks(selectedGridDivisorTicks()));
|
|
18
22
|
const gridArray = createMemo(() => {
|
|
19
|
-
const numberOfLines = Math.ceil(
|
|
23
|
+
const numberOfLines = Math.ceil(horizontalViewPort().calculateVisibleRange() / gridDivisorTicks() + 1);
|
|
20
24
|
const startIndex = Math.floor(context.position / gridDivisorTicks());
|
|
21
25
|
return Array.from({ length: numberOfLines }).map((_, index) => ({
|
|
22
26
|
index: index + startIndex,
|
|
23
27
|
ticks: (index + startIndex) * gridDivisorTicks(),
|
|
24
28
|
}));
|
|
25
29
|
});
|
|
26
|
-
return (<div class=
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}}>
|
|
31
|
-
<div class="PianoRoll-Grid" style={{
|
|
32
|
-
position: "relative",
|
|
33
|
-
width: `${context.clientRect.width}px`,
|
|
34
|
-
height: "100%",
|
|
35
|
-
}}>
|
|
36
|
-
<Index each={gridArray()}>
|
|
37
|
-
{(entry) => {
|
|
38
|
-
const virtualDimensions = createMemo(() => context.horizontalViewPort.getVirtualDimensions(entry().ticks, gridDivisorTicks()));
|
|
30
|
+
return (<div class={styles.PianoRollGrid}>
|
|
31
|
+
<Index each={gridArray()}>
|
|
32
|
+
{(entry) => {
|
|
33
|
+
const virtualDimensions = createMemo(() => horizontalViewPort().calculatePixelDimensions(entry().ticks, gridDivisorTicks()));
|
|
39
34
|
return (<Show when={virtualDimensions().size > 0}>
|
|
40
|
-
|
|
41
|
-
"z-index": 1,
|
|
42
|
-
position: "absolute",
|
|
43
|
-
"box-sizing": "border-box",
|
|
35
|
+
<div class={styles["PianoRollGrid-Time"]} style={{
|
|
44
36
|
background: Math.ceil((entry().index + 1 * selectedGridDivisorTicks()) / measureTicks()) %
|
|
45
37
|
2 ===
|
|
46
38
|
0
|
|
47
39
|
? "#ddd"
|
|
48
40
|
: "#ccc",
|
|
49
|
-
top: `0px`,
|
|
50
|
-
height: `100%`,
|
|
51
41
|
left: `${virtualDimensions().offset}px`,
|
|
52
42
|
width: `${virtualDimensions().size}px`,
|
|
53
|
-
"border-left-style": "solid",
|
|
54
|
-
"border-left-width": "0.5px",
|
|
55
43
|
"border-left-color": (entry().index * gridDivisorTicks()) % selectedGridDivisorTicks() === 0
|
|
56
44
|
? "gray"
|
|
57
45
|
: "#bbb",
|
|
58
46
|
}}></div>
|
|
59
|
-
|
|
47
|
+
</Show>);
|
|
60
48
|
}}
|
|
61
|
-
|
|
49
|
+
</Index>
|
|
50
|
+
<Show when={!context.condensed}>
|
|
62
51
|
<Index each={keys}>
|
|
63
52
|
{(key) => {
|
|
64
|
-
const virtualDimensions = createMemo(() =>
|
|
53
|
+
const virtualDimensions = createMemo(() => verticalViewPort().calculatePixelDimensions(127 - key().number, 1));
|
|
65
54
|
return (<Show when={virtualDimensions().size > 0}>
|
|
66
|
-
<div class="
|
|
67
|
-
position: "absolute",
|
|
55
|
+
<div class={styles["PianoRollGrid-Key"]} style={{
|
|
68
56
|
top: `${virtualDimensions().offset}px`,
|
|
69
57
|
height: `${virtualDimensions().size}px`,
|
|
70
58
|
width: "100%",
|
|
71
59
|
"background-color": key().isBlack ? "rgba(0,0,0,0.2)" : "none",
|
|
72
|
-
"border-style": "solid",
|
|
73
|
-
"border-color": "gray",
|
|
74
60
|
"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`,
|
|
75
|
-
"z-index": 1,
|
|
76
61
|
}}></div>
|
|
77
62
|
</Show>);
|
|
78
63
|
}}
|
|
79
64
|
</Index>
|
|
80
|
-
</
|
|
65
|
+
</Show>
|
|
81
66
|
</div>);
|
|
82
67
|
};
|
|
83
68
|
export default PianoRollGrid;
|