solid-pianoroll 0.0.23 → 0.0.25
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 → dev.cjs} +446 -426
- package/dist/dev.css +212 -0
- package/dist/dev.js +1330 -0
- package/dist/dev.jsx +1130 -0
- package/dist/index.cjs +1330 -0
- package/dist/index.css +212 -0
- package/dist/index.d.ts +105 -0
- package/dist/{esm/index.js → index.js} +450 -425
- package/dist/index.jsx +1130 -0
- package/package.json +43 -34
- package/dist/cjs/index.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/source/PianoRoll.jsx +0 -78
- package/dist/source/PianoRollContext.jsx +0 -11
- package/dist/source/PianoRollGrid.jsx +0 -64
- package/dist/source/PianoRollKeys.jsx +0 -72
- package/dist/source/PianoRollNotes.jsx +0 -162
- package/dist/source/PianoRollNotesScroller.jsx +0 -16
- package/dist/source/PianoRollScale.jsx +0 -29
- package/dist/source/PianoRollScrollZoomViewPort.jsx +0 -49
- package/dist/source/PianoRollTrackList.jsx +0 -27
- package/dist/source/PianoRollTrackListScroller.jsx +0 -16
- package/dist/source/index.jsx +0 -5
- package/dist/source/types.js +0 -1
- package/dist/source/useBoundingClientRect.js +0 -29
- package/dist/source/useNotes.js +0 -23
- package/dist/source/usePianoRollGrid.js +0 -45
- package/dist/source/usePianoRollState.js +0 -106
- package/dist/source/viewport/PlayHead.jsx +0 -43
- package/dist/source/viewport/ScrollZoomContainer.jsx +0 -104
- package/dist/source/viewport/ScrollZoomViewPort.jsx +0 -31
- package/dist/source/viewport/ZoomSliderControl.jsx +0 -29
- package/dist/source/viewport/createViewPortDimension.js +0 -51
- package/dist/types/PianoRoll.d.ts +0 -9
- package/dist/types/PianoRollContext.d.ts +0 -122
- package/dist/types/PianoRollGrid.d.ts +0 -2
- package/dist/types/PianoRollKeys.d.ts +0 -9
- package/dist/types/PianoRollNotes.d.ts +0 -5
- package/dist/types/PianoRollNotesScroller.d.ts +0 -3
- package/dist/types/PianoRollScale.d.ts +0 -2
- package/dist/types/PianoRollScrollZoomViewPort.d.ts +0 -3
- package/dist/types/PianoRollTrackList.d.ts +0 -2
- package/dist/types/PianoRollTrackListScroller.d.ts +0 -3
- package/dist/types/index.d.ts +0 -5
- package/dist/types/types.d.ts +0 -6
- package/dist/types/useBoundingClientRect.d.ts +0 -3
- package/dist/types/useNotes.d.ts +0 -9
- package/dist/types/usePianoRollGrid.d.ts +0 -13
- package/dist/types/usePianoRollState.d.ts +0 -63
- package/dist/types/viewport/PlayHead.d.ts +0 -8
- package/dist/types/viewport/ScrollZoomContainer.d.ts +0 -8
- package/dist/types/viewport/ScrollZoomViewPort.d.ts +0 -39
- package/dist/types/viewport/ZoomSliderControl.d.ts +0 -6
- package/dist/types/viewport/createViewPortDimension.d.ts +0 -40
|
@@ -1,37 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { delegateEvents, createComponent, spread, mergeProps as mergeProps$1, insert, effect, setAttribute, memo, className, classList, template, use } from 'solid-js/web';
|
|
2
|
+
import { createContext, createEffect, createSignal, mergeProps, Show, splitProps, createMemo, useContext, Index, For } from 'solid-js';
|
|
3
3
|
import { createStore } from 'solid-js/store';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var insertAt = ref.insertAt;
|
|
8
|
-
if (!css || typeof document === 'undefined') {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
var head = document.head || document.getElementsByTagName('head')[0];
|
|
12
|
-
var style = document.createElement('style');
|
|
13
|
-
style.type = 'text/css';
|
|
14
|
-
if (insertAt === 'top') {
|
|
15
|
-
if (head.firstChild) {
|
|
16
|
-
head.insertBefore(style, head.firstChild);
|
|
17
|
-
} else {
|
|
18
|
-
head.appendChild(style);
|
|
19
|
-
}
|
|
20
|
-
} else {
|
|
21
|
-
head.appendChild(style);
|
|
22
|
-
}
|
|
23
|
-
if (style.styleSheet) {
|
|
24
|
-
style.styleSheet.cssText = css;
|
|
25
|
-
} else {
|
|
26
|
-
style.appendChild(document.createTextNode(css));
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
var css_248z$6 = ".PianoRoll-module_PianoRoll__rkRYx {\n box-sizing: border-box;\n display: flex;\n overflow: hidden;\n flex-direction: column;\n height: 100%;\n user-select: none;\n}\n\n.PianoRoll-module_PianoRollContainer__Oyxr7 {\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: row;\n}\n\n.PianoRoll-module_PianoRollLeftColumn__S6SZQ {\n display: flex;\n overflow: hidden;\n flex-direction: column;\n max-width: 250px;\n margin-top: 30px;\n}\n.PianoRoll-module_PianoRollLeftColumn__S6SZQ.PianoRoll-module_showTrackList__mqsrT {\n width: 30%;\n margin-top: 0;\n}\n\n.PianoRoll-module_PianoRollRightColumn__V98HV {\n display: flex;\n position: relative;\n flex-direction: column;\n flex: 1;\n height: 100%;\n}\n";
|
|
31
|
-
var styles$6 = {"PianoRoll":"PianoRoll-module_PianoRoll__rkRYx","PianoRollContainer":"PianoRoll-module_PianoRollContainer__Oyxr7","PianoRollLeftColumn":"PianoRoll-module_PianoRollLeftColumn__S6SZQ","showTrackList":"PianoRoll-module_showTrackList__mqsrT","PianoRollRightColumn":"PianoRoll-module_PianoRollRightColumn__V98HV"};
|
|
32
|
-
styleInject(css_248z$6);
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
33
7
|
|
|
34
|
-
|
|
8
|
+
// src/PianoRoll.module.css
|
|
9
|
+
var _default = {};
|
|
10
|
+
var defaultState = {
|
|
35
11
|
ppq: 0,
|
|
36
12
|
mode: "keys",
|
|
37
13
|
position: 0,
|
|
@@ -40,61 +16,94 @@ const defaultState = {
|
|
|
40
16
|
verticalPosition: 44,
|
|
41
17
|
verticalTrackZoom: 0.5,
|
|
42
18
|
verticalTrackPosition: 0,
|
|
19
|
+
playHeadPosition: 0,
|
|
43
20
|
gridDivision: 4,
|
|
44
21
|
snapToGrid: true,
|
|
45
22
|
duration: 0,
|
|
46
23
|
tracks: [],
|
|
47
24
|
selectedTrackIndex: 0,
|
|
48
25
|
pressedKeys: {},
|
|
49
|
-
notesScrollerClientRect: {
|
|
50
|
-
|
|
51
|
-
width: 0,
|
|
52
|
-
top: 0,
|
|
53
|
-
height: 0
|
|
54
|
-
},
|
|
55
|
-
tracksScrollerClientRect: {
|
|
56
|
-
left: 0,
|
|
57
|
-
width: 0,
|
|
58
|
-
top: 0,
|
|
59
|
-
height: 0
|
|
60
|
-
}
|
|
26
|
+
notesScrollerClientRect: { left: 0, width: 0, top: 0, height: 0 },
|
|
27
|
+
tracksScrollerClientRect: { left: 0, width: 0, top: 0, height: 0 }
|
|
61
28
|
};
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
29
|
+
var propNameToHandlerName = /* @__PURE__ */ __name((name) => `on${name[0]?.toUpperCase()}${name.slice(1)}Change`, "propNameToHandlerName");
|
|
30
|
+
var pianoRollStatePropNames = [
|
|
31
|
+
...Object.keys(defaultState),
|
|
32
|
+
...Object.keys(defaultState).map(propNameToHandlerName),
|
|
33
|
+
"onNoteChange",
|
|
34
|
+
"onInsertNote",
|
|
35
|
+
"onRemoveNote",
|
|
36
|
+
"onNoteDown",
|
|
37
|
+
"onNoteUp",
|
|
38
|
+
"isKeyDown",
|
|
39
|
+
"snapValueToGridIfEnabled"
|
|
40
|
+
];
|
|
41
|
+
var createPianoRollstate = /* @__PURE__ */ __name((initialState) => {
|
|
65
42
|
const [state, setState] = createStore({
|
|
66
43
|
...defaultState,
|
|
67
44
|
...initialState
|
|
68
45
|
});
|
|
69
|
-
const handlers = Object.fromEntries(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
46
|
+
const handlers = Object.fromEntries(
|
|
47
|
+
Object.entries(state).map((entry) => {
|
|
48
|
+
const handlerName = propNameToHandlerName(entry[0]);
|
|
49
|
+
return [
|
|
50
|
+
handlerName,
|
|
51
|
+
(value, originalEvent) => {
|
|
52
|
+
const handler = initialState?.[handlerName];
|
|
53
|
+
setState(entry[0], value);
|
|
54
|
+
if (handler) {
|
|
55
|
+
handler(value, originalEvent);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
];
|
|
59
|
+
})
|
|
60
|
+
);
|
|
61
|
+
const onPlayheadPositionChange = /* @__PURE__ */ __name((playheadPosition, originalEvent) => {
|
|
62
|
+
handlers.onPlayHeadPositionChange(
|
|
63
|
+
snapValueToGridIfEnabled(playheadPosition, !!originalEvent?.altKey)
|
|
64
|
+
);
|
|
65
|
+
}, "onPlayheadPositionChange");
|
|
66
|
+
const updateNotes = /* @__PURE__ */ __name(async (trackIndex, getNotes) => {
|
|
73
67
|
const track = state.tracks[trackIndex];
|
|
74
|
-
if (!track)
|
|
68
|
+
if (!track)
|
|
69
|
+
return;
|
|
75
70
|
const notes = track.notes;
|
|
76
|
-
handlers.onTracksChange([
|
|
77
|
-
...
|
|
78
|
-
notes: getNotes(notes)
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
71
|
+
handlers.onTracksChange([
|
|
72
|
+
...state.tracks.slice(0, trackIndex),
|
|
73
|
+
{ ...track, notes: getNotes(notes) },
|
|
74
|
+
...state.tracks.slice(trackIndex + 1)
|
|
75
|
+
]);
|
|
76
|
+
}, "updateNotes");
|
|
77
|
+
const onNoteChange = /* @__PURE__ */ __name((trackIndex, noteIndex, note) => {
|
|
78
|
+
updateNotes(trackIndex, (notes) => [
|
|
79
|
+
...notes.slice(0, noteIndex),
|
|
80
|
+
note,
|
|
81
|
+
...notes.slice(noteIndex + 1)
|
|
82
|
+
]);
|
|
83
|
+
}, "onNoteChange");
|
|
84
|
+
const onInsertNote = /* @__PURE__ */ __name((trackIndex, note) => {
|
|
85
85
|
const track = state.tracks[trackIndex];
|
|
86
|
-
if (!track)
|
|
86
|
+
if (!track)
|
|
87
|
+
return -1;
|
|
87
88
|
const notes = track.notes;
|
|
88
|
-
const newNoteIndex = Math.max(
|
|
89
|
-
ticks
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
const newNoteIndex = Math.max(
|
|
90
|
+
notes.findIndex(({ ticks }) => ticks > note.ticks),
|
|
91
|
+
0
|
|
92
|
+
);
|
|
93
|
+
updateNotes(trackIndex, (notes2) => [
|
|
94
|
+
...notes2.slice(0, newNoteIndex),
|
|
95
|
+
note,
|
|
96
|
+
...notes2.slice(newNoteIndex)
|
|
97
|
+
]);
|
|
92
98
|
return newNoteIndex;
|
|
93
|
-
};
|
|
94
|
-
const onRemoveNote = (trackIndex, noteIndex) => {
|
|
95
|
-
updateNotes(trackIndex, notes => [
|
|
96
|
-
|
|
97
|
-
|
|
99
|
+
}, "onInsertNote");
|
|
100
|
+
const onRemoveNote = /* @__PURE__ */ __name((trackIndex, noteIndex) => {
|
|
101
|
+
updateNotes(trackIndex, (notes) => [
|
|
102
|
+
...notes.slice(0, noteIndex),
|
|
103
|
+
...notes.slice(noteIndex + 1)
|
|
104
|
+
]);
|
|
105
|
+
}, "onRemoveNote");
|
|
106
|
+
const updateKeyPressedState = /* @__PURE__ */ __name((trackIndex, keyNumber, value) => {
|
|
98
107
|
handlers.onPressedKeysChange?.({
|
|
99
108
|
...state.pressedKeys,
|
|
100
109
|
[trackIndex]: {
|
|
@@ -102,14 +111,18 @@ const createPianoRollstate = initialState => {
|
|
|
102
111
|
[keyNumber]: value
|
|
103
112
|
}
|
|
104
113
|
});
|
|
105
|
-
};
|
|
106
|
-
const onNoteDown = (trackIndex, keyNumber) => {
|
|
114
|
+
}, "updateKeyPressedState");
|
|
115
|
+
const onNoteDown = /* @__PURE__ */ __name((trackIndex, keyNumber) => {
|
|
107
116
|
updateKeyPressedState(trackIndex, keyNumber, true);
|
|
108
|
-
};
|
|
109
|
-
const onNoteUp = (trackIndex, keyNumber) => {
|
|
117
|
+
}, "onNoteDown");
|
|
118
|
+
const onNoteUp = /* @__PURE__ */ __name((trackIndex, keyNumber) => {
|
|
110
119
|
updateKeyPressedState(trackIndex, keyNumber, false);
|
|
111
|
-
};
|
|
112
|
-
const isKeyDown = (trackIndex, keyNumber) => !!state.pressedKeys[trackIndex]?.[keyNumber];
|
|
120
|
+
}, "onNoteUp");
|
|
121
|
+
const isKeyDown = /* @__PURE__ */ __name((trackIndex, keyNumber) => !!state.pressedKeys[trackIndex]?.[keyNumber], "isKeyDown");
|
|
122
|
+
const snapValueToGridIfEnabled = /* @__PURE__ */ __name((value, altKey) => {
|
|
123
|
+
const gridDivisionTicks = state.ppq * 4 / state.gridDivision;
|
|
124
|
+
return state.snapToGrid && !altKey ? Math.round(value / gridDivisionTicks) * gridDivisionTicks : value;
|
|
125
|
+
}, "snapValueToGridIfEnabled");
|
|
113
126
|
return mergeProps(state, {
|
|
114
127
|
...handlers,
|
|
115
128
|
onNoteChange,
|
|
@@ -117,30 +130,33 @@ const createPianoRollstate = initialState => {
|
|
|
117
130
|
onRemoveNote,
|
|
118
131
|
onNoteDown,
|
|
119
132
|
onNoteUp,
|
|
120
|
-
isKeyDown
|
|
133
|
+
isKeyDown,
|
|
134
|
+
snapValueToGridIfEnabled,
|
|
135
|
+
onPlayheadPositionChange
|
|
121
136
|
});
|
|
122
|
-
};
|
|
137
|
+
}, "createPianoRollstate");
|
|
138
|
+
var usePianoRollState_default = createPianoRollstate;
|
|
123
139
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
140
|
+
// src/PianoRollContext.tsx
|
|
141
|
+
var PianoRollContext = createContext();
|
|
142
|
+
var PianoRollContextProvider = PianoRollContext.Provider;
|
|
143
|
+
var usePianoRollContext = /* @__PURE__ */ __name(() => {
|
|
127
144
|
const context = useContext(PianoRollContext);
|
|
128
|
-
if (!context)
|
|
145
|
+
if (!context)
|
|
146
|
+
throw new Error("No PianoRollContext found");
|
|
129
147
|
return context;
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
var css_248z$5 = ".PianoRollKeys-module_PianoRollKeys__5vnQ0 {\n position: relative;\n height: 100%;\n border-width: 0;\n border-color: #000;\n border-style: solid;\n border-right-width: 1px;\n border-left-width: 1px;\n background: white;\n cursor: pointer;\n}\n\n.PianoRollKeys-module_Key__jybNC {\n transition-property: background-color, box-shadow;\n transition-duration: 200ms;\n transition-timing-function: ease-out;\n border-width: 0px;\n position: absolute;\n box-sizing: border-box;\n width: 120%;\n left: -20%;\n border-color: #000;\n border-style: solid;\n transform: rotateX(0deg);\n perspective: 100px;\n}\n\n.PianoRollKeys-module_black__7rncB {\n background: black;\n border-top-right-radius: 12%;\n border-bottom-right-radius: 12%;\n margin-left: -20%;\n z-index: 1;\n border: 1px black outset;\n}\n\n.PianoRollKeys-module_white__fR2Lm {\n background: white;\n border-top-width: 0.5px;\n border-bottom-width: 0.5px;\n border-top-right-radius: 4%;\n border-bottom-right-radius: 4%;\n}\n\n.PianoRollKeys-module_down__GcNeZ {\n transition: none;\n background: red;\n transform: rotateX(0deg) rotateY(20deg);\n}\n";
|
|
134
|
-
var styles$5 = {"PianoRollKeys":"PianoRollKeys-module_PianoRollKeys__5vnQ0","Key":"PianoRollKeys-module_Key__jybNC","black":"PianoRollKeys-module_black__7rncB","white":"PianoRollKeys-module_white__fR2Lm","down":"PianoRollKeys-module_down__GcNeZ"};
|
|
135
|
-
styleInject(css_248z$5);
|
|
148
|
+
}, "usePianoRollContext");
|
|
149
|
+
var splitContextProps = /* @__PURE__ */ __name((allProps) => splitProps(allProps, [...pianoRollStatePropNames, "showAllTracks", "showTrackList"]), "splitContextProps");
|
|
136
150
|
|
|
151
|
+
// src/PianoRollKeys.module.css
|
|
152
|
+
var _default2 = {};
|
|
137
153
|
function createViewPortDimension(getState) {
|
|
138
|
-
const getStateWithFunctions = () => {
|
|
139
|
-
const
|
|
140
|
-
const onZoomChange = zoom =>
|
|
141
|
-
const onPositionChange = position =>
|
|
154
|
+
const getStateWithFunctions = /* @__PURE__ */ __name(() => {
|
|
155
|
+
const state2 = getState();
|
|
156
|
+
const onZoomChange = /* @__PURE__ */ __name((zoom) => state2.onZoomChange?.(clamp(zoom, state2.minZoom, state2.maxZoom)), "onZoomChange");
|
|
157
|
+
const onPositionChange = /* @__PURE__ */ __name((position) => state2.onPositionChange?.(position), "onPositionChange");
|
|
142
158
|
return {
|
|
143
|
-
...
|
|
159
|
+
...state2,
|
|
144
160
|
onZoomChange,
|
|
145
161
|
onPositionChange,
|
|
146
162
|
calculatePixelOffset,
|
|
@@ -151,46 +167,49 @@ function createViewPortDimension(getState) {
|
|
|
151
167
|
calculateMaxPosition,
|
|
152
168
|
isVisible
|
|
153
169
|
};
|
|
154
|
-
};
|
|
170
|
+
}, "getStateWithFunctions");
|
|
155
171
|
const [state, setState] = createStore(getStateWithFunctions());
|
|
156
172
|
createEffect(() => setState(getStateWithFunctions()));
|
|
157
173
|
function calculatePixelValue(position = state.position) {
|
|
158
174
|
const virtualSize = state.pixelSize * state.zoom;
|
|
159
175
|
return position / state.range * virtualSize;
|
|
160
176
|
}
|
|
177
|
+
__name(calculatePixelValue, "calculatePixelValue");
|
|
161
178
|
function calculatePixelOffset(position) {
|
|
162
179
|
return calculatePixelValue(position) - calculatePixelValue(state.position);
|
|
163
180
|
}
|
|
181
|
+
__name(calculatePixelOffset, "calculatePixelOffset");
|
|
164
182
|
function calculatePosition(offset) {
|
|
165
183
|
const percentX = (offset - state.pixelOffset) / state.pixelSize;
|
|
166
184
|
const position = state.position + percentX * calculateVisibleRange();
|
|
167
185
|
return position;
|
|
168
186
|
}
|
|
187
|
+
__name(calculatePosition, "calculatePosition");
|
|
169
188
|
function calculateVisibleRange() {
|
|
170
189
|
return state.range / state.zoom;
|
|
171
190
|
}
|
|
191
|
+
__name(calculateVisibleRange, "calculateVisibleRange");
|
|
172
192
|
function calculateMaxPosition() {
|
|
173
193
|
return state.range - state.range / state.zoom;
|
|
174
194
|
}
|
|
195
|
+
__name(calculateMaxPosition, "calculateMaxPosition");
|
|
175
196
|
function calculatePixelDimensions(position, length) {
|
|
176
197
|
const offset = calculatePixelOffset(position);
|
|
177
198
|
const size = calculatePixelValue(length);
|
|
178
|
-
return {
|
|
179
|
-
offset,
|
|
180
|
-
size
|
|
181
|
-
};
|
|
199
|
+
return { offset, size };
|
|
182
200
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
size
|
|
186
|
-
}) {
|
|
201
|
+
__name(calculatePixelDimensions, "calculatePixelDimensions");
|
|
202
|
+
function isVisible({ offset, size }) {
|
|
187
203
|
return offset + size > 0 && offset < state.pixelSize;
|
|
188
204
|
}
|
|
205
|
+
__name(isVisible, "isVisible");
|
|
189
206
|
return state;
|
|
190
207
|
}
|
|
191
|
-
|
|
208
|
+
__name(createViewPortDimension, "createViewPortDimension");
|
|
209
|
+
var clamp = /* @__PURE__ */ __name((value, min, max) => Math.max(min, Math.min(max, value)), "clamp");
|
|
192
210
|
|
|
193
|
-
|
|
211
|
+
// src/viewport/ScrollZoomViewPort.tsx
|
|
212
|
+
var defaultViewPortProps = {
|
|
194
213
|
pixelOffset: 0,
|
|
195
214
|
position: 0,
|
|
196
215
|
range: 1,
|
|
@@ -198,9 +217,9 @@ const defaultViewPortProps = {
|
|
|
198
217
|
minZoom: 1,
|
|
199
218
|
maxZoom: Infinity
|
|
200
219
|
};
|
|
201
|
-
|
|
220
|
+
var ScrollZoomViewPort = /* @__PURE__ */ __name((props) => {
|
|
202
221
|
const viewPorts = Object.entries(props.dimensions).map(([name, viewPortProps]) => createViewPortDimension(() => ({
|
|
203
|
-
name
|
|
222
|
+
name,
|
|
204
223
|
...defaultViewPortProps,
|
|
205
224
|
...viewPortProps()
|
|
206
225
|
})));
|
|
@@ -213,21 +232,22 @@ const ScrollZoomViewPort = props => {
|
|
|
213
232
|
return props.children;
|
|
214
233
|
}
|
|
215
234
|
});
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
|
|
235
|
+
}, "ScrollZoomViewPort");
|
|
236
|
+
var ScrollZoomViewPortContext = createContext([]);
|
|
237
|
+
var useViewPortDimension = /* @__PURE__ */ __name((name) => {
|
|
219
238
|
const viewPorts = useContext(ScrollZoomViewPortContext);
|
|
220
|
-
const viewPort = name ? viewPorts.find(
|
|
221
|
-
if (!viewPort)
|
|
239
|
+
const viewPort = name ? viewPorts.find((viewPort2) => viewPort2.name === name) : viewPorts[viewPorts.length - 1];
|
|
240
|
+
if (!viewPort)
|
|
241
|
+
throw new Error(`ViewPort dimension "${name}" not found.`);
|
|
222
242
|
return viewPort;
|
|
223
|
-
};
|
|
243
|
+
}, "useViewPortDimension");
|
|
224
244
|
|
|
225
|
-
|
|
226
|
-
var
|
|
227
|
-
styleInject(css_248z$4);
|
|
245
|
+
// src/viewport/ScrollZoomContainer.module.css
|
|
246
|
+
var _default3 = {};
|
|
228
247
|
|
|
229
|
-
|
|
230
|
-
|
|
248
|
+
// src/viewport/ScrollZoomContainer.tsx
|
|
249
|
+
var _tmpl$ = /* @__PURE__ */ template(`<div><div><div><div></div></div></div></div>`, 8);
|
|
250
|
+
var ScrollZoomContainer = /* @__PURE__ */ __name((props) => {
|
|
231
251
|
let scrollContentRef;
|
|
232
252
|
const [ownProps, divProps] = splitProps(props, ["ref", "verticalDimensionName", "horizontalDimensionName", "showScrollbar"]);
|
|
233
253
|
const propsWithDefaults = mergeProps({
|
|
@@ -237,7 +257,7 @@ const ScrollZoomContainer = props => {
|
|
|
237
257
|
}, ownProps);
|
|
238
258
|
const verticalViewPort = createMemo(() => useViewPortDimension(propsWithDefaults.verticalDimensionName));
|
|
239
259
|
const horizontalViewPort = createMemo(() => useViewPortDimension(propsWithDefaults.horizontalDimensionName));
|
|
240
|
-
const handleScroll = event => {
|
|
260
|
+
const handleScroll = /* @__PURE__ */ __name((event) => {
|
|
241
261
|
event.preventDefault();
|
|
242
262
|
if (didUpdateScroll) {
|
|
243
263
|
didUpdateScroll = false;
|
|
@@ -257,8 +277,8 @@ const ScrollZoomContainer = props => {
|
|
|
257
277
|
const scrollLeftAmount = scrollLeft / (scrollWidth - width);
|
|
258
278
|
verticalViewPort().onPositionChange?.(maxVerticalPosition * scrollTopAmount);
|
|
259
279
|
horizontalViewPort().onPositionChange?.(maxPosition * scrollLeftAmount);
|
|
260
|
-
};
|
|
261
|
-
const handleWheel = event => {
|
|
280
|
+
}, "handleScroll");
|
|
281
|
+
const handleWheel = /* @__PURE__ */ __name((event) => {
|
|
262
282
|
if (event.altKey) {
|
|
263
283
|
event.preventDefault();
|
|
264
284
|
if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) {
|
|
@@ -275,7 +295,7 @@ const ScrollZoomContainer = props => {
|
|
|
275
295
|
event.currentTarget.scrollLeft += event.deltaX;
|
|
276
296
|
event.currentTarget.scrollTop += event.deltaY;
|
|
277
297
|
}
|
|
278
|
-
};
|
|
298
|
+
}, "handleWheel");
|
|
279
299
|
let didUpdateScroll = false;
|
|
280
300
|
createEffect(() => {
|
|
281
301
|
const maxVerticalPosition = verticalViewPort().calculateMaxPosition();
|
|
@@ -284,7 +304,8 @@ const ScrollZoomContainer = props => {
|
|
|
284
304
|
const scrollLeftAmount = maxPosition > 0 ? horizontalViewPort().position / maxPosition : 0;
|
|
285
305
|
const height = verticalViewPort().pixelSize;
|
|
286
306
|
const width = horizontalViewPort().pixelSize;
|
|
287
|
-
if (!scrollContentRef?.parentElement)
|
|
307
|
+
if (!scrollContentRef?.parentElement)
|
|
308
|
+
return;
|
|
288
309
|
const scrollDivHeight = verticalViewPort().zoom * verticalViewPort().pixelSize;
|
|
289
310
|
const scrollTop = scrollTopAmount * (scrollDivHeight - height);
|
|
290
311
|
const scrollDivWidth = horizontalViewPort().zoom * horizontalViewPort().pixelSize;
|
|
@@ -298,10 +319,7 @@ const ScrollZoomContainer = props => {
|
|
|
298
319
|
});
|
|
299
320
|
});
|
|
300
321
|
return (() => {
|
|
301
|
-
const _el$ = _tmpl
|
|
302
|
-
_el$2 = _el$.firstChild,
|
|
303
|
-
_el$3 = _el$2.firstChild,
|
|
304
|
-
_el$4 = _el$3.firstChild;
|
|
322
|
+
const _el$ = _tmpl$.cloneNode(true), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild;
|
|
305
323
|
_el$.addEventListener("wheel", handleWheel);
|
|
306
324
|
_el$.addEventListener("scroll", handleScroll);
|
|
307
325
|
const _ref$ = props.ref;
|
|
@@ -310,12 +328,12 @@ const ScrollZoomContainer = props => {
|
|
|
310
328
|
get style() {
|
|
311
329
|
return {
|
|
312
330
|
overflow: propsWithDefaults.showScrollbar ? "scroll" : "hidden",
|
|
313
|
-
...
|
|
331
|
+
...typeof divProps.style === "object" && divProps.style
|
|
314
332
|
};
|
|
315
333
|
},
|
|
316
334
|
get classList() {
|
|
317
335
|
return {
|
|
318
|
-
[
|
|
336
|
+
[_default3.ScrollZoomContainer]: true,
|
|
319
337
|
...divProps.classList
|
|
320
338
|
};
|
|
321
339
|
}
|
|
@@ -328,35 +346,34 @@ const ScrollZoomContainer = props => {
|
|
|
328
346
|
_el$3.style.setProperty("display", "flex");
|
|
329
347
|
_el$4.style.setProperty("position", "relative");
|
|
330
348
|
insert(_el$4, () => props.children);
|
|
331
|
-
effect(_p$ => {
|
|
332
|
-
const _v$ = `${verticalViewPort().pixelSize}px`,
|
|
333
|
-
_v$2 = `${horizontalViewPort().pixelSize}px`,
|
|
334
|
-
_v$3 = `${verticalViewPort().pixelSize}px`,
|
|
335
|
-
_v$4 = `${horizontalViewPort().pixelSize}px`;
|
|
349
|
+
effect((_p$) => {
|
|
350
|
+
const _v$ = `${verticalViewPort().pixelSize}px`, _v$2 = `${horizontalViewPort().pixelSize}px`, _v$3 = `${verticalViewPort().pixelSize}px`, _v$4 = `${horizontalViewPort().pixelSize}px`;
|
|
336
351
|
_v$ !== _p$._v$ && _el$3.style.setProperty("height", _p$._v$ = _v$);
|
|
337
352
|
_v$2 !== _p$._v$2 && _el$3.style.setProperty("width", _p$._v$2 = _v$2);
|
|
338
353
|
_v$3 !== _p$._v$3 && _el$4.style.setProperty("height", _p$._v$3 = _v$3);
|
|
339
354
|
_v$4 !== _p$._v$4 && _el$4.style.setProperty("width", _p$._v$4 = _v$4);
|
|
340
355
|
return _p$;
|
|
341
356
|
}, {
|
|
342
|
-
_v$:
|
|
343
|
-
_v$2:
|
|
344
|
-
_v$3:
|
|
345
|
-
_v$4:
|
|
357
|
+
_v$: void 0,
|
|
358
|
+
_v$2: void 0,
|
|
359
|
+
_v$3: void 0,
|
|
360
|
+
_v$4: void 0
|
|
346
361
|
});
|
|
347
362
|
return _el$;
|
|
348
363
|
})();
|
|
349
|
-
};
|
|
364
|
+
}, "ScrollZoomContainer");
|
|
365
|
+
var ScrollZoomContainer_default = ScrollZoomContainer;
|
|
350
366
|
|
|
351
|
-
|
|
352
|
-
|
|
367
|
+
// src/PianoRollKeys.tsx
|
|
368
|
+
var _tmpl$2 = /* @__PURE__ */ template(`<div></div>`, 2);
|
|
369
|
+
var PianoRollKeys = /* @__PURE__ */ __name(() => {
|
|
353
370
|
const verticalViewPort = createMemo(() => useViewPortDimension("vertical"));
|
|
354
371
|
const horizontalViewPort = createMemo(() => useViewPortDimension("horizontalKeys"));
|
|
355
372
|
const [isMouseDown, setIsMouseDown] = createSignal(false);
|
|
356
373
|
const context = usePianoRollContext();
|
|
357
|
-
const handleMouseUp = () => {
|
|
374
|
+
const handleMouseUp = /* @__PURE__ */ __name(() => {
|
|
358
375
|
setIsMouseDown(false);
|
|
359
|
-
};
|
|
376
|
+
}, "handleMouseUp");
|
|
360
377
|
createEffect(() => {
|
|
361
378
|
if (isMouseDown()) {
|
|
362
379
|
window.addEventListener("mouseup", handleMouseUp);
|
|
@@ -365,14 +382,14 @@ const PianoRollKeys = () => {
|
|
|
365
382
|
}
|
|
366
383
|
});
|
|
367
384
|
return (() => {
|
|
368
|
-
const _el$ = _tmpl
|
|
369
|
-
insert(_el$, createComponent(
|
|
385
|
+
const _el$ = _tmpl$2.cloneNode(true);
|
|
386
|
+
insert(_el$, createComponent(ScrollZoomContainer_default, {
|
|
370
387
|
horizontalDimensionName: "horizontalKeys",
|
|
371
388
|
showScrollbar: false,
|
|
372
389
|
get children() {
|
|
373
390
|
return createComponent(Index, {
|
|
374
391
|
each: keys,
|
|
375
|
-
children: key => {
|
|
392
|
+
children: (key) => {
|
|
376
393
|
const isDown = createMemo(() => context.isKeyDown(context.selectedTrackIndex, key().number));
|
|
377
394
|
const virtualDimensions = createMemo(() => verticalViewPort().calculatePixelDimensions(127 - key().number, 1));
|
|
378
395
|
const previousIsBlack = blackKeys.includes((key().number - 1) % 12);
|
|
@@ -382,7 +399,7 @@ const PianoRollKeys = () => {
|
|
|
382
399
|
return verticalViewPort().isVisible(virtualDimensions());
|
|
383
400
|
},
|
|
384
401
|
get children() {
|
|
385
|
-
const _el$2 = _tmpl
|
|
402
|
+
const _el$2 = _tmpl$2.cloneNode(true);
|
|
386
403
|
_el$2.addEventListener("mouseleave", () => {
|
|
387
404
|
if (isMouseDown()) {
|
|
388
405
|
context.onNoteUp(context.selectedTrackIndex, key().number);
|
|
@@ -400,18 +417,13 @@ const PianoRollKeys = () => {
|
|
|
400
417
|
setIsMouseDown(true);
|
|
401
418
|
context.onNoteDown(context.selectedTrackIndex, key().number);
|
|
402
419
|
};
|
|
403
|
-
effect(_p$ => {
|
|
420
|
+
effect((_p$) => {
|
|
404
421
|
const _v$3 = {
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
_v$4 = key().name,
|
|
411
|
-
_v$5 = key().number % 12,
|
|
412
|
-
_v$6 = `${virtualDimensions().offset - virtualDimensions().size * (!key().isBlack ? nextIsBlack ? 1 / 2 : 0 : 0)}px`,
|
|
413
|
-
_v$7 = `${virtualDimensions().size + (!key().isBlack && nextIsBlack ? virtualDimensions().size / 2 : 0) + (!key().isBlack && previousIsBlack ? virtualDimensions().size / 2 : 0)}px`,
|
|
414
|
-
_v$8 = `0px 0px ${Math.min(virtualDimensions().size / 20, 1)}px ${Math.min(virtualDimensions().size / 50, 1)}px rgba(0, 0, 0, 0.5) ${key().isBlack ? "" : "inset"}` + isDown() ? `0px 0px ${Math.min(virtualDimensions().size / 8, 2)}px ${Math.min(virtualDimensions().size / 20, 2)}px rgba(0, 0, 0, 0.5) inset` : "";
|
|
422
|
+
[_default2["Key"]]: true,
|
|
423
|
+
[_default2["black"]]: key().isBlack,
|
|
424
|
+
[_default2["white"]]: !key().isBlack,
|
|
425
|
+
[_default2["down"]]: isDown()
|
|
426
|
+
}, _v$4 = key().name, _v$5 = key().number % 12, _v$6 = `${virtualDimensions().offset - virtualDimensions().size * (!key().isBlack ? nextIsBlack ? 1 / 2 : 0 : 0)}px`, _v$7 = `${virtualDimensions().size + (!key().isBlack && nextIsBlack ? virtualDimensions().size / 2 : 0) + (!key().isBlack && previousIsBlack ? virtualDimensions().size / 2 : 0)}px`, _v$8 = `0px 0px ${Math.min(virtualDimensions().size / 20, 1)}px ${Math.min(virtualDimensions().size / 50, 1)}px rgba(0, 0, 0, 0.5) ${key().isBlack ? "" : "inset"}` + isDown() ? `0px 0px ${Math.min(virtualDimensions().size / 8, 2)}px ${Math.min(virtualDimensions().size / 20, 2)}px rgba(0, 0, 0, 0.5) inset` : "";
|
|
415
427
|
_p$._v$3 = classList(_el$2, _v$3, _p$._v$3);
|
|
416
428
|
_v$4 !== _p$._v$4 && setAttribute(_el$2, "title", _p$._v$4 = _v$4);
|
|
417
429
|
_v$5 !== _p$._v$5 && setAttribute(_el$2, "data-index", _p$._v$5 = _v$5);
|
|
@@ -420,12 +432,12 @@ const PianoRollKeys = () => {
|
|
|
420
432
|
_v$8 !== _p$._v$8 && _el$2.style.setProperty("box-shadow", _p$._v$8 = _v$8);
|
|
421
433
|
return _p$;
|
|
422
434
|
}, {
|
|
423
|
-
_v$3:
|
|
424
|
-
_v$4:
|
|
425
|
-
_v$5:
|
|
426
|
-
_v$6:
|
|
427
|
-
_v$7:
|
|
428
|
-
_v$8:
|
|
435
|
+
_v$3: void 0,
|
|
436
|
+
_v$4: void 0,
|
|
437
|
+
_v$5: void 0,
|
|
438
|
+
_v$6: void 0,
|
|
439
|
+
_v$7: void 0,
|
|
440
|
+
_v$8: void 0
|
|
429
441
|
});
|
|
430
442
|
return _el$2;
|
|
431
443
|
}
|
|
@@ -434,36 +446,36 @@ const PianoRollKeys = () => {
|
|
|
434
446
|
});
|
|
435
447
|
}
|
|
436
448
|
}));
|
|
437
|
-
effect(_p$ => {
|
|
438
|
-
const _v$ =
|
|
439
|
-
_v$2 = `${horizontalViewPort().pixelSize}px`;
|
|
449
|
+
effect((_p$) => {
|
|
450
|
+
const _v$ = _default2.PianoRollKeys, _v$2 = `${horizontalViewPort().pixelSize}px`;
|
|
440
451
|
_v$ !== _p$._v$ && className(_el$, _p$._v$ = _v$);
|
|
441
452
|
_v$2 !== _p$._v$2 && _el$.style.setProperty("width", _p$._v$2 = _v$2);
|
|
442
453
|
return _p$;
|
|
443
454
|
}, {
|
|
444
|
-
_v$:
|
|
445
|
-
_v$2:
|
|
455
|
+
_v$: void 0,
|
|
456
|
+
_v$2: void 0
|
|
446
457
|
});
|
|
447
458
|
return _el$;
|
|
448
459
|
})();
|
|
449
|
-
};
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
460
|
+
}, "PianoRollKeys");
|
|
461
|
+
var blackKeys = [1, 3, 6, 8, 10];
|
|
462
|
+
var keyNames = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
|
|
463
|
+
var keys = Array.from({
|
|
453
464
|
length: 128
|
|
454
465
|
}).map((_, index) => ({
|
|
455
466
|
number: index,
|
|
456
467
|
name: `${keyNames[index % 12]} ${Math.floor(index / 12) - 2}`,
|
|
457
468
|
isBlack: blackKeys.includes(index % 12)
|
|
458
469
|
}));
|
|
470
|
+
var PianoRollKeys_default = PianoRollKeys;
|
|
459
471
|
delegateEvents(["mousedown", "mouseup"]);
|
|
460
472
|
|
|
461
|
-
|
|
462
|
-
var
|
|
463
|
-
styleInject(css_248z$3);
|
|
473
|
+
// src/PianoRollNotes.module.css
|
|
474
|
+
var _default4 = {};
|
|
464
475
|
|
|
465
|
-
|
|
466
|
-
|
|
476
|
+
// src/PianoRollNotes.tsx
|
|
477
|
+
var _tmpl$3 = /* @__PURE__ */ template(`<div></div>`, 2);
|
|
478
|
+
var PianoRollNotes = /* @__PURE__ */ __name((props) => {
|
|
467
479
|
const context = usePianoRollContext();
|
|
468
480
|
const verticalViewPort = createMemo(() => useViewPortDimension(context.mode === "keys" ? "vertical" : "verticalTracks"));
|
|
469
481
|
const horizontalViewPort = createMemo(() => useViewPortDimension("horizontal"));
|
|
@@ -474,8 +486,7 @@ const PianoRollNotes = props => {
|
|
|
474
486
|
const [currentNoteTrackIndex, setCurrentNoteTrackIndex] = createSignal(-1);
|
|
475
487
|
const [diffPosition, setDiffPosition] = createSignal(0);
|
|
476
488
|
const [getInitialNote, setInitialNote] = createSignal();
|
|
477
|
-
const
|
|
478
|
-
const calculateNoteDragValues = event => {
|
|
489
|
+
const calculateNoteDragValues = /* @__PURE__ */ __name((event) => {
|
|
479
490
|
const targetTrackIndex = context.mode === "tracks" ? clamp(Math.floor(verticalViewPort().calculatePosition(event.clientY)), 0, context.tracks.length - 1) : currentNoteTrackIndex() > -1 ? currentNoteTrackIndex() : context.selectedTrackIndex;
|
|
480
491
|
const midi = context.mode === "keys" ? Math.floor(128 - verticalViewPort().calculatePosition(event.clientY)) : getInitialNote()?.midi ?? 60;
|
|
481
492
|
const horiontalPosition = horizontalViewPort().calculatePosition(event.clientX);
|
|
@@ -484,32 +495,33 @@ const PianoRollNotes = props => {
|
|
|
484
495
|
midi,
|
|
485
496
|
horiontalPosition
|
|
486
497
|
};
|
|
487
|
-
};
|
|
488
|
-
const handleMouseMove = mouseMoveEvent => {
|
|
498
|
+
}, "calculateNoteDragValues");
|
|
499
|
+
const handleMouseMove = /* @__PURE__ */ __name((mouseMoveEvent) => {
|
|
489
500
|
mouseMoveEvent.preventDefault();
|
|
490
501
|
mouseMoveEvent.stopPropagation();
|
|
491
502
|
const note = getInitialNote();
|
|
492
|
-
if (!note)
|
|
503
|
+
if (!note)
|
|
504
|
+
return;
|
|
493
505
|
const {
|
|
494
506
|
targetTrackIndex,
|
|
495
507
|
midi,
|
|
496
508
|
horiontalPosition
|
|
497
509
|
} = calculateNoteDragValues(mouseMoveEvent);
|
|
498
|
-
const ticks = snapValueToGridIfEnabled(horiontalPosition - diffPosition(), mouseMoveEvent.altKey);
|
|
510
|
+
const ticks = context.snapValueToGridIfEnabled(horiontalPosition - diffPosition(), mouseMoveEvent.altKey);
|
|
499
511
|
const updatedNote = {
|
|
500
512
|
...note,
|
|
501
513
|
midi,
|
|
502
|
-
...
|
|
514
|
+
...noteDragMode() === "move" && {
|
|
503
515
|
ticks
|
|
504
|
-
}
|
|
505
|
-
...
|
|
516
|
+
},
|
|
517
|
+
...noteDragMode() === "trimStart" && {
|
|
506
518
|
ticks: ticks < note.ticks + note.durationTicks ? ticks : note.ticks + note.durationTicks,
|
|
507
|
-
durationTicks: ticks < note.ticks + note.durationTicks ? note.ticks + note.durationTicks - ticks : snapValueToGridIfEnabled(horiontalPosition - note.ticks, mouseMoveEvent.altKey)
|
|
508
|
-
}
|
|
509
|
-
...
|
|
519
|
+
durationTicks: ticks < note.ticks + note.durationTicks ? note.ticks + note.durationTicks - ticks : context.snapValueToGridIfEnabled(horiontalPosition - note.ticks, mouseMoveEvent.altKey)
|
|
520
|
+
},
|
|
521
|
+
...noteDragMode() === "trimEnd" && {
|
|
510
522
|
ticks: ticks < note.ticks ? ticks : note.ticks,
|
|
511
|
-
durationTicks: ticks < note.ticks ? note.ticks - ticks : snapValueToGridIfEnabled(horiontalPosition - note.ticks, mouseMoveEvent.altKey)
|
|
512
|
-
}
|
|
523
|
+
durationTicks: ticks < note.ticks ? note.ticks - ticks : context.snapValueToGridIfEnabled(horiontalPosition - note.ticks, mouseMoveEvent.altKey)
|
|
524
|
+
}
|
|
513
525
|
};
|
|
514
526
|
const previousTrackIndex = currentNoteTrackIndex();
|
|
515
527
|
const previousNoteIndex = currentNoteIndex();
|
|
@@ -523,24 +535,24 @@ const PianoRollNotes = props => {
|
|
|
523
535
|
setCurrentNoteIndex(newNoteIndex);
|
|
524
536
|
}
|
|
525
537
|
}
|
|
526
|
-
};
|
|
527
|
-
const stopDragging = () => {
|
|
538
|
+
}, "handleMouseMove");
|
|
539
|
+
const stopDragging = /* @__PURE__ */ __name(() => {
|
|
528
540
|
window.removeEventListener("mousemove", handleMouseMove);
|
|
529
541
|
window.removeEventListener("mouseup", stopDragging);
|
|
530
542
|
setIsDragging(false);
|
|
531
543
|
setCurrentNoteIndex(-1);
|
|
532
544
|
setCurrentNoteTrackIndex(-1);
|
|
533
|
-
};
|
|
534
|
-
const startDragging = () => {
|
|
545
|
+
}, "stopDragging");
|
|
546
|
+
const startDragging = /* @__PURE__ */ __name(() => {
|
|
535
547
|
window.addEventListener("mousemove", handleMouseMove);
|
|
536
548
|
window.addEventListener("mouseup", stopDragging);
|
|
537
|
-
};
|
|
538
|
-
const getClasses =
|
|
539
|
-
return
|
|
540
|
-
};
|
|
549
|
+
}, "startDragging");
|
|
550
|
+
const getClasses = /* @__PURE__ */ __name((noteDragMode2) => {
|
|
551
|
+
return noteDragMode2 ? [_default4.Note, _default4[noteDragMode2]] : [_default4.Note];
|
|
552
|
+
}, "getClasses");
|
|
541
553
|
return (() => {
|
|
542
|
-
const _el$ = _tmpl
|
|
543
|
-
_el$.$$mousedown = mouseDownEvent => {
|
|
554
|
+
const _el$ = _tmpl$3.cloneNode(true);
|
|
555
|
+
_el$.$$mousedown = (mouseDownEvent) => {
|
|
544
556
|
mouseDownEvent.preventDefault();
|
|
545
557
|
mouseDownEvent.stopPropagation();
|
|
546
558
|
const {
|
|
@@ -548,7 +560,7 @@ const PianoRollNotes = props => {
|
|
|
548
560
|
midi,
|
|
549
561
|
horiontalPosition
|
|
550
562
|
} = calculateNoteDragValues(mouseDownEvent);
|
|
551
|
-
const ticks = snapValueToGridIfEnabled(horiontalPosition, mouseDownEvent.altKey);
|
|
563
|
+
const ticks = context.snapValueToGridIfEnabled(horiontalPosition, mouseDownEvent.altKey, context);
|
|
552
564
|
const durationTicks = gridDivisionTicks();
|
|
553
565
|
const newNote = {
|
|
554
566
|
midi,
|
|
@@ -589,8 +601,8 @@ const PianoRollNotes = props => {
|
|
|
589
601
|
return memo(() => !!verticalViewPort().isVisible(verticalVirtualDimensions()))() && horizontalViewPort().isVisible(horizontalDimensions());
|
|
590
602
|
},
|
|
591
603
|
get children() {
|
|
592
|
-
const _el$2 = _tmpl
|
|
593
|
-
_el$2.$$mousedown = event => {
|
|
604
|
+
const _el$2 = _tmpl$3.cloneNode(true);
|
|
605
|
+
_el$2.$$mousedown = (event) => {
|
|
594
606
|
event.stopPropagation();
|
|
595
607
|
const initialPosition = horizontalViewPort().calculatePosition(event.clientX);
|
|
596
608
|
setDiffPosition(noteDragMode() === "trimEnd" ? -(note.ticks + note.durationTicks - initialPosition) : initialPosition - note.ticks);
|
|
@@ -600,12 +612,13 @@ const PianoRollNotes = props => {
|
|
|
600
612
|
setInitialNote(note);
|
|
601
613
|
startDragging();
|
|
602
614
|
};
|
|
603
|
-
_el$2.$$dblclick = event => {
|
|
615
|
+
_el$2.$$dblclick = (event) => {
|
|
604
616
|
event.stopPropagation();
|
|
605
617
|
context.onRemoveNote?.(trackIndex(), noteIndex());
|
|
606
618
|
};
|
|
607
|
-
_el$2.$$mousemove = event => {
|
|
608
|
-
if (isDragging())
|
|
619
|
+
_el$2.$$mousemove = (event) => {
|
|
620
|
+
if (isDragging())
|
|
621
|
+
return;
|
|
609
622
|
event.stopPropagation();
|
|
610
623
|
const relativeX = horizontalViewPort().calculatePixelValue(horizontalViewPort().calculatePosition(event.clientX));
|
|
611
624
|
const noteStartX = horizontalViewPort().calculatePixelValue(note.ticks);
|
|
@@ -613,27 +626,24 @@ const PianoRollNotes = props => {
|
|
|
613
626
|
setNoteDragMode(relativeX - noteStartX < 3 ? "trimStart" : noteEndX - relativeX < 3 ? "trimEnd" : "move");
|
|
614
627
|
};
|
|
615
628
|
setAttribute(_el$2, "draggable", false);
|
|
616
|
-
effect(_p$ => {
|
|
617
|
-
const _v$ = getClasses(noteDragMode()).join(" "),
|
|
618
|
-
_v$2 = `rgba(255,0,0, ${(128 + note.velocity) / 256})`,
|
|
619
|
-
_v$3 = `${verticalVirtualDimensions().offset}px`,
|
|
620
|
-
_v$4 = `${verticalVirtualDimensions().size}px`,
|
|
621
|
-
_v$5 = `${horizontalDimensions().offset}px`,
|
|
622
|
-
_v$6 = `${horizontalDimensions().size}px`;
|
|
629
|
+
effect((_p$) => {
|
|
630
|
+
const _v$ = getClasses(noteDragMode()).join(" "), _v$2 = `${track.color}`, _v$3 = (note.velocity / 128 + 2) / 3, _v$4 = `${verticalVirtualDimensions().offset}px`, _v$5 = `${verticalVirtualDimensions().size}px`, _v$6 = `${horizontalDimensions().offset}px`, _v$7 = `${horizontalDimensions().size}px`;
|
|
623
631
|
_v$ !== _p$._v$ && className(_el$2, _p$._v$ = _v$);
|
|
624
632
|
_v$2 !== _p$._v$2 && _el$2.style.setProperty("background-color", _p$._v$2 = _v$2);
|
|
625
|
-
_v$3 !== _p$._v$3 && _el$2.style.setProperty("
|
|
626
|
-
_v$4 !== _p$._v$4 && _el$2.style.setProperty("
|
|
627
|
-
_v$5 !== _p$._v$5 && _el$2.style.setProperty("
|
|
628
|
-
_v$6 !== _p$._v$6 && _el$2.style.setProperty("
|
|
633
|
+
_v$3 !== _p$._v$3 && _el$2.style.setProperty("opacity", _p$._v$3 = _v$3);
|
|
634
|
+
_v$4 !== _p$._v$4 && _el$2.style.setProperty("top", _p$._v$4 = _v$4);
|
|
635
|
+
_v$5 !== _p$._v$5 && _el$2.style.setProperty("height", _p$._v$5 = _v$5);
|
|
636
|
+
_v$6 !== _p$._v$6 && _el$2.style.setProperty("left", _p$._v$6 = _v$6);
|
|
637
|
+
_v$7 !== _p$._v$7 && _el$2.style.setProperty("width", _p$._v$7 = _v$7);
|
|
629
638
|
return _p$;
|
|
630
639
|
}, {
|
|
631
|
-
_v$:
|
|
632
|
-
_v$2:
|
|
633
|
-
_v$3:
|
|
634
|
-
_v$4:
|
|
635
|
-
_v$5:
|
|
636
|
-
_v$6:
|
|
640
|
+
_v$: void 0,
|
|
641
|
+
_v$2: void 0,
|
|
642
|
+
_v$3: void 0,
|
|
643
|
+
_v$4: void 0,
|
|
644
|
+
_v$5: void 0,
|
|
645
|
+
_v$6: void 0,
|
|
646
|
+
_v$7: void 0
|
|
637
647
|
});
|
|
638
648
|
return _el$2;
|
|
639
649
|
}
|
|
@@ -644,26 +654,26 @@ const PianoRollNotes = props => {
|
|
|
644
654
|
});
|
|
645
655
|
}
|
|
646
656
|
}));
|
|
647
|
-
effect(_$p => classList(_el$, {
|
|
648
|
-
[
|
|
657
|
+
effect((_$p) => classList(_el$, {
|
|
658
|
+
[_default4.PianoRollNotes]: true
|
|
649
659
|
}, _$p));
|
|
650
660
|
return _el$;
|
|
651
661
|
})();
|
|
652
|
-
};
|
|
662
|
+
}, "PianoRollNotes");
|
|
663
|
+
var PianoRollNotes_default = PianoRollNotes;
|
|
653
664
|
delegateEvents(["mousedown", "mousemove", "dblclick"]);
|
|
654
665
|
|
|
655
|
-
|
|
656
|
-
var
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
const usePianoRollGrid = () => {
|
|
666
|
+
// src/PianoRollGrid.module.css
|
|
667
|
+
var _default5 = {};
|
|
668
|
+
var usePianoRollGrid = /* @__PURE__ */ __name(() => {
|
|
660
669
|
const context = usePianoRollContext();
|
|
661
670
|
const horizontalViewPort = createMemo(() => useViewPortDimension("horizontal"));
|
|
662
671
|
const measureTicks = createMemo(() => context.ppq * 4);
|
|
663
672
|
const selectedGridDivisorTicks = createMemo(() => measureTicks() / context.gridDivision);
|
|
664
673
|
function calculateVisibleGridDivisorTicks(value) {
|
|
665
674
|
const visibleRange = horizontalViewPort().calculateVisibleRange();
|
|
666
|
-
if (visibleRange <= 0)
|
|
675
|
+
if (visibleRange <= 0)
|
|
676
|
+
return 0;
|
|
667
677
|
if (visibleRange / value > 100) {
|
|
668
678
|
return calculateVisibleGridDivisorTicks(value * 2);
|
|
669
679
|
}
|
|
@@ -672,13 +682,16 @@ const usePianoRollGrid = () => {
|
|
|
672
682
|
}
|
|
673
683
|
return value;
|
|
674
684
|
}
|
|
675
|
-
|
|
685
|
+
__name(calculateVisibleGridDivisorTicks, "calculateVisibleGridDivisorTicks");
|
|
686
|
+
const gridDivisorTicks = createMemo(
|
|
687
|
+
() => calculateVisibleGridDivisorTicks(selectedGridDivisorTicks())
|
|
688
|
+
);
|
|
676
689
|
const gridArray = createMemo(() => {
|
|
677
|
-
const numberOfLines = Math.ceil(
|
|
690
|
+
const numberOfLines = Math.ceil(
|
|
691
|
+
horizontalViewPort().calculateVisibleRange() / gridDivisorTicks() + 1
|
|
692
|
+
);
|
|
678
693
|
const startIndex = Math.floor(context.position / gridDivisorTicks());
|
|
679
|
-
return Array.from({
|
|
680
|
-
length: numberOfLines
|
|
681
|
-
}).map((_, i) => {
|
|
694
|
+
return Array.from({ length: numberOfLines }).map((_, i) => {
|
|
682
695
|
const index = i + startIndex;
|
|
683
696
|
const ticks = index * gridDivisorTicks();
|
|
684
697
|
const measurePosition = ticks / context.ppq / 4 + 1;
|
|
@@ -697,43 +710,43 @@ const usePianoRollGrid = () => {
|
|
|
697
710
|
});
|
|
698
711
|
});
|
|
699
712
|
return gridArray;
|
|
700
|
-
};
|
|
713
|
+
}, "usePianoRollGrid");
|
|
714
|
+
var usePianoRollGrid_default = usePianoRollGrid;
|
|
701
715
|
|
|
702
|
-
|
|
703
|
-
|
|
716
|
+
// src/PianoRollGrid.tsx
|
|
717
|
+
var _tmpl$4 = /* @__PURE__ */ template(`<div></div>`, 2);
|
|
718
|
+
var PianoRollGrid = /* @__PURE__ */ __name(() => {
|
|
704
719
|
const context = usePianoRollContext();
|
|
705
720
|
const verticalViewPort = createMemo(() => useViewPortDimension(context.mode === "keys" ? "vertical" : "verticalTracks"));
|
|
706
721
|
const horizontalViewPort = createMemo(() => useViewPortDimension("horizontal"));
|
|
707
|
-
const gridArray =
|
|
722
|
+
const gridArray = usePianoRollGrid_default();
|
|
708
723
|
return (() => {
|
|
709
|
-
const _el$ = _tmpl
|
|
724
|
+
const _el$ = _tmpl$4.cloneNode(true);
|
|
710
725
|
insert(_el$, createComponent(Index, {
|
|
711
726
|
get each() {
|
|
712
727
|
return gridArray();
|
|
713
728
|
},
|
|
714
|
-
children: entry => {
|
|
729
|
+
children: (entry) => {
|
|
715
730
|
return createComponent(Show, {
|
|
716
731
|
get when() {
|
|
717
732
|
return horizontalViewPort().isVisible(entry().virtualDimensions);
|
|
718
733
|
},
|
|
719
734
|
get children() {
|
|
720
|
-
const _el$2 = _tmpl
|
|
721
|
-
effect(_p$ => {
|
|
735
|
+
const _el$2 = _tmpl$4.cloneNode(true);
|
|
736
|
+
effect((_p$) => {
|
|
722
737
|
const _v$ = {
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
_v$2 = `${entry().virtualDimensions.offset}px`,
|
|
728
|
-
_v$3 = `${entry().virtualDimensions.size}px`;
|
|
738
|
+
[_default5["PianoRollGrid-Time"]]: true,
|
|
739
|
+
[_default5["Highlighted"]]: entry().isHighlighted,
|
|
740
|
+
[_default5["HighlightedBorder"]]: entry().hasHighlightedBorder
|
|
741
|
+
}, _v$2 = `${entry().virtualDimensions.offset}px`, _v$3 = `${entry().virtualDimensions.size}px`;
|
|
729
742
|
_p$._v$ = classList(_el$2, _v$, _p$._v$);
|
|
730
743
|
_v$2 !== _p$._v$2 && _el$2.style.setProperty("left", _p$._v$2 = _v$2);
|
|
731
744
|
_v$3 !== _p$._v$3 && _el$2.style.setProperty("width", _p$._v$3 = _v$3);
|
|
732
745
|
return _p$;
|
|
733
746
|
}, {
|
|
734
|
-
_v$:
|
|
735
|
-
_v$2:
|
|
736
|
-
_v$3:
|
|
747
|
+
_v$: void 0,
|
|
748
|
+
_v$2: void 0,
|
|
749
|
+
_v$3: void 0
|
|
737
750
|
});
|
|
738
751
|
return _el$2;
|
|
739
752
|
}
|
|
@@ -747,31 +760,29 @@ const PianoRollGrid = () => {
|
|
|
747
760
|
get children() {
|
|
748
761
|
return createComponent(Index, {
|
|
749
762
|
each: keys,
|
|
750
|
-
children: key => {
|
|
763
|
+
children: (key) => {
|
|
751
764
|
const virtualDimensions = createMemo(() => verticalViewPort().calculatePixelDimensions(127 - key().number, 1));
|
|
752
765
|
return createComponent(Show, {
|
|
753
766
|
get when() {
|
|
754
767
|
return verticalViewPort().isVisible(virtualDimensions());
|
|
755
768
|
},
|
|
756
769
|
get children() {
|
|
757
|
-
const _el$3 = _tmpl
|
|
758
|
-
effect(_p$ => {
|
|
770
|
+
const _el$3 = _tmpl$4.cloneNode(true);
|
|
771
|
+
effect((_p$) => {
|
|
759
772
|
const _v$4 = {
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
_v$5 = `${virtualDimensions().offset}px`,
|
|
766
|
-
_v$6 = `${virtualDimensions().size}px`;
|
|
773
|
+
[_default5["PianoRollGrid-Row"]]: true,
|
|
774
|
+
[_default5["Key"]]: true,
|
|
775
|
+
[_default5["IsDark"]]: key().isBlack,
|
|
776
|
+
[_default5["IsBlackAndNextIsWhite"]]: !key().isBlack && !blackKeys.includes((key().number + 1) % 12)
|
|
777
|
+
}, _v$5 = `${virtualDimensions().offset}px`, _v$6 = `${virtualDimensions().size}px`;
|
|
767
778
|
_p$._v$4 = classList(_el$3, _v$4, _p$._v$4);
|
|
768
779
|
_v$5 !== _p$._v$5 && _el$3.style.setProperty("top", _p$._v$5 = _v$5);
|
|
769
780
|
_v$6 !== _p$._v$6 && _el$3.style.setProperty("height", _p$._v$6 = _v$6);
|
|
770
781
|
return _p$;
|
|
771
782
|
}, {
|
|
772
|
-
_v$4:
|
|
773
|
-
_v$5:
|
|
774
|
-
_v$6:
|
|
783
|
+
_v$4: void 0,
|
|
784
|
+
_v$5: void 0,
|
|
785
|
+
_v$6: void 0
|
|
775
786
|
});
|
|
776
787
|
return _el$3;
|
|
777
788
|
}
|
|
@@ -796,22 +807,20 @@ const PianoRollGrid = () => {
|
|
|
796
807
|
return verticalViewPort().isVisible(virtualDimensions());
|
|
797
808
|
},
|
|
798
809
|
get children() {
|
|
799
|
-
const _el$4 = _tmpl
|
|
800
|
-
effect(_p$ => {
|
|
810
|
+
const _el$4 = _tmpl$4.cloneNode(true);
|
|
811
|
+
effect((_p$) => {
|
|
801
812
|
const _v$7 = {
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
_v$8 = `${virtualDimensions().offset}px`,
|
|
806
|
-
_v$9 = `${virtualDimensions().size}px`;
|
|
813
|
+
[_default5["PianoRollGrid-Row"]]: true,
|
|
814
|
+
[_default5["IsDark"]]: index() % 2 === 0
|
|
815
|
+
}, _v$8 = `${virtualDimensions().offset}px`, _v$9 = `${virtualDimensions().size}px`;
|
|
807
816
|
_p$._v$7 = classList(_el$4, _v$7, _p$._v$7);
|
|
808
817
|
_v$8 !== _p$._v$8 && _el$4.style.setProperty("top", _p$._v$8 = _v$8);
|
|
809
818
|
_v$9 !== _p$._v$9 && _el$4.style.setProperty("height", _p$._v$9 = _v$9);
|
|
810
819
|
return _p$;
|
|
811
820
|
}, {
|
|
812
|
-
_v$7:
|
|
813
|
-
_v$8:
|
|
814
|
-
_v$9:
|
|
821
|
+
_v$7: void 0,
|
|
822
|
+
_v$8: void 0,
|
|
823
|
+
_v$9: void 0
|
|
815
824
|
});
|
|
816
825
|
return _el$4;
|
|
817
826
|
}
|
|
@@ -820,19 +829,19 @@ const PianoRollGrid = () => {
|
|
|
820
829
|
});
|
|
821
830
|
}
|
|
822
831
|
}), null);
|
|
823
|
-
effect(() => className(_el$,
|
|
832
|
+
effect(() => className(_el$, _default5.PianoRollGrid));
|
|
824
833
|
return _el$;
|
|
825
834
|
})();
|
|
826
|
-
};
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
835
|
+
}, "PianoRollGrid");
|
|
836
|
+
var PianoRollGrid_default = PianoRollGrid;
|
|
837
|
+
var _tmpl$5 = /* @__PURE__ */ template(`<input step="0.01">`, 1);
|
|
838
|
+
var ZoomSliderControl = /* @__PURE__ */ __name((props) => {
|
|
830
839
|
const propsWithDefaults = mergeProps({
|
|
831
840
|
orientation: "horizontal"
|
|
832
841
|
}, props);
|
|
833
842
|
const dimension = createMemo(() => useViewPortDimension(props.dimensionName ?? propsWithDefaults.orientation));
|
|
834
843
|
return (() => {
|
|
835
|
-
const _el$ = _tmpl
|
|
844
|
+
const _el$ = _tmpl$5.cloneNode(true);
|
|
836
845
|
spread(_el$, mergeProps$1({
|
|
837
846
|
get min() {
|
|
838
847
|
return dimension().minZoom;
|
|
@@ -844,7 +853,7 @@ const ZoomSliderControl = props => {
|
|
|
844
853
|
get value() {
|
|
845
854
|
return dimension().zoom;
|
|
846
855
|
},
|
|
847
|
-
"onInput": event => {
|
|
856
|
+
"onInput": (event) => {
|
|
848
857
|
const value = event.currentTarget.valueAsNumber;
|
|
849
858
|
dimension().onZoomChange?.(value);
|
|
850
859
|
},
|
|
@@ -860,34 +869,32 @@ const ZoomSliderControl = props => {
|
|
|
860
869
|
width: "16px",
|
|
861
870
|
transform: "rotate(180deg)",
|
|
862
871
|
...{
|
|
863
|
-
"writing-mode": "bt-lr"
|
|
864
|
-
"-webkit-appearance": "slider-vertical"
|
|
872
|
+
"writing-mode": "bt-lr",
|
|
873
|
+
"-webkit-appearance": "slider-vertical"
|
|
865
874
|
},
|
|
866
|
-
|
|
867
|
-
...(typeof props.style === "object" && props.style)
|
|
875
|
+
...typeof props.style === "object" && props.style
|
|
868
876
|
} : {
|
|
869
877
|
margin: 0,
|
|
870
878
|
"margin-top": "4px",
|
|
871
879
|
"margin-bottom": "4px",
|
|
872
|
-
...
|
|
880
|
+
...typeof props.style === "object" && props.style
|
|
873
881
|
};
|
|
874
882
|
}
|
|
875
883
|
}), false, false);
|
|
876
884
|
return _el$;
|
|
877
885
|
})();
|
|
878
|
-
};
|
|
879
|
-
|
|
880
|
-
var css_248z$1 = ".PianoRollTrackList-module_PianoRollTrackList__-sDf0 {\n position: relative;\n height: 100%;\n flex: 1;\n}\n\n.PianoRollTrackList-module_Track__mZP1K {\n border-width: 0px;\n position: absolute;\n box-sizing: border-box;\n width: 100%;\n border-color: #000;\n border-style: solid;\n border-right-width: 1px;\n border-bottom-width: 1px;\n padding: 2px;\n cursor: pointer;\n background: lightgrey;\n}\n.PianoRollTrackList-module_Track__mZP1K.PianoRollTrackList-module_selected__0b-mf {\n background: gray;\n}";
|
|
881
|
-
var styles$1 = {"PianoRollTrackList":"PianoRollTrackList-module_PianoRollTrackList__-sDf0","Track":"PianoRollTrackList-module_Track__mZP1K","selected":"PianoRollTrackList-module_selected__0b-mf"};
|
|
882
|
-
styleInject(css_248z$1);
|
|
886
|
+
}, "ZoomSliderControl");
|
|
887
|
+
var ZoomSliderControl_default = ZoomSliderControl;
|
|
883
888
|
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
889
|
+
// src/PianoRollTrackList.module.css
|
|
890
|
+
var _default6 = {};
|
|
891
|
+
var _tmpl$6 = /* @__PURE__ */ template(`<div></div>`, 2);
|
|
892
|
+
var _tmpl$22 = /* @__PURE__ */ template(`<div> </div>`, 2);
|
|
893
|
+
var PianoRollTrackList = /* @__PURE__ */ __name(() => {
|
|
887
894
|
const viewPort = createMemo(() => useViewPortDimension("verticalTracks"));
|
|
888
895
|
const context = usePianoRollContext();
|
|
889
896
|
return (() => {
|
|
890
|
-
const _el$ = _tmpl
|
|
897
|
+
const _el$ = _tmpl$6.cloneNode(true);
|
|
891
898
|
insert(_el$, createComponent(Index, {
|
|
892
899
|
get each() {
|
|
893
900
|
return context.tracks;
|
|
@@ -899,42 +906,38 @@ const PianoRollTrackList = () => {
|
|
|
899
906
|
return virtualDimensions().size > 0;
|
|
900
907
|
},
|
|
901
908
|
get children() {
|
|
902
|
-
const _el$2 = _tmpl$
|
|
903
|
-
_el$3 = _el$2.firstChild;
|
|
909
|
+
const _el$2 = _tmpl$22.cloneNode(true), _el$3 = _el$2.firstChild;
|
|
904
910
|
_el$2.$$click = () => context.onSelectedTrackIndexChange?.(index);
|
|
905
911
|
insert(_el$2, index, _el$3);
|
|
906
912
|
insert(_el$2, () => track().name || "[unnamed track]", null);
|
|
907
|
-
effect(_p$ => {
|
|
913
|
+
effect((_p$) => {
|
|
908
914
|
const _v$ = {
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
_v$2 = track().name,
|
|
913
|
-
_v$3 = `${virtualDimensions().offset}px`,
|
|
914
|
-
_v$4 = `${virtualDimensions().size}px`;
|
|
915
|
+
[_default6["Track"]]: true,
|
|
916
|
+
[_default6["selected"]]: index === context.selectedTrackIndex
|
|
917
|
+
}, _v$2 = track().name, _v$3 = `${virtualDimensions().offset}px`, _v$4 = `${virtualDimensions().size}px`;
|
|
915
918
|
_p$._v$ = classList(_el$2, _v$, _p$._v$);
|
|
916
919
|
_v$2 !== _p$._v$2 && setAttribute(_el$2, "title", _p$._v$2 = _v$2);
|
|
917
920
|
_v$3 !== _p$._v$3 && _el$2.style.setProperty("top", _p$._v$3 = _v$3);
|
|
918
921
|
_v$4 !== _p$._v$4 && _el$2.style.setProperty("height", _p$._v$4 = _v$4);
|
|
919
922
|
return _p$;
|
|
920
923
|
}, {
|
|
921
|
-
_v$:
|
|
922
|
-
_v$2:
|
|
923
|
-
_v$3:
|
|
924
|
-
_v$4:
|
|
924
|
+
_v$: void 0,
|
|
925
|
+
_v$2: void 0,
|
|
926
|
+
_v$3: void 0,
|
|
927
|
+
_v$4: void 0
|
|
925
928
|
});
|
|
926
929
|
return _el$2;
|
|
927
930
|
}
|
|
928
931
|
});
|
|
929
932
|
}
|
|
930
933
|
}));
|
|
931
|
-
effect(() => className(_el$,
|
|
934
|
+
effect(() => className(_el$, _default6.PianoRollTrackList));
|
|
932
935
|
return _el$;
|
|
933
936
|
})();
|
|
934
|
-
};
|
|
937
|
+
}, "PianoRollTrackList");
|
|
938
|
+
var PianoRollTrackList_default = PianoRollTrackList;
|
|
935
939
|
delegateEvents(["click"]);
|
|
936
|
-
|
|
937
|
-
const PianoRollScrollZoomViewPort = props => {
|
|
940
|
+
var PianoRollScrollZoomViewPort = /* @__PURE__ */ __name((props) => {
|
|
938
941
|
const zoomFactor = 500;
|
|
939
942
|
const context = usePianoRollContext();
|
|
940
943
|
return createComponent(ScrollZoomViewPort, {
|
|
@@ -946,7 +949,7 @@ const PianoRollScrollZoomViewPort = props => {
|
|
|
946
949
|
range: context.duration,
|
|
947
950
|
zoom: context.zoom * (zoomFactor / context.notesScrollerClientRect.width),
|
|
948
951
|
onPositionChange: context.onPositionChange,
|
|
949
|
-
onZoomChange: zoom => context.onZoomChange?.(zoom / (zoomFactor / context.notesScrollerClientRect.width)),
|
|
952
|
+
onZoomChange: (zoom) => context.onZoomChange?.(zoom / (zoomFactor / context.notesScrollerClientRect.width)),
|
|
950
953
|
minZoom: 1,
|
|
951
954
|
maxZoom: 500
|
|
952
955
|
}),
|
|
@@ -957,7 +960,7 @@ const PianoRollScrollZoomViewPort = props => {
|
|
|
957
960
|
range: 128,
|
|
958
961
|
zoom: context.verticalZoom * (zoomFactor / context.notesScrollerClientRect.height),
|
|
959
962
|
onPositionChange: context.onVerticalPositionChange,
|
|
960
|
-
onZoomChange: verticalZoom => context.onVerticalZoomChange?.(verticalZoom / (zoomFactor / context.notesScrollerClientRect.height)),
|
|
963
|
+
onZoomChange: (verticalZoom) => context.onVerticalZoomChange?.(verticalZoom / (zoomFactor / context.notesScrollerClientRect.height)),
|
|
961
964
|
minZoom: 1,
|
|
962
965
|
maxZoom: 10
|
|
963
966
|
}),
|
|
@@ -972,7 +975,7 @@ const PianoRollScrollZoomViewPort = props => {
|
|
|
972
975
|
range: context.tracks.length,
|
|
973
976
|
zoom: context.verticalTrackZoom * (zoomFactor / context.tracksScrollerClientRect.height),
|
|
974
977
|
onPositionChange: context.onVerticalTrackPositionChange,
|
|
975
|
-
onZoomChange: verticalTrackZoom => context.onVerticalTrackZoomChange?.(verticalTrackZoom / (zoomFactor / context.tracksScrollerClientRect.height)),
|
|
978
|
+
onZoomChange: (verticalTrackZoom) => context.onVerticalTrackZoomChange?.(verticalTrackZoom / (zoomFactor / context.tracksScrollerClientRect.height)),
|
|
976
979
|
minZoom: 0.8,
|
|
977
980
|
maxZoom: 3
|
|
978
981
|
}),
|
|
@@ -984,9 +987,9 @@ const PianoRollScrollZoomViewPort = props => {
|
|
|
984
987
|
return props.children;
|
|
985
988
|
}
|
|
986
989
|
});
|
|
987
|
-
};
|
|
988
|
-
|
|
989
|
-
|
|
990
|
+
}, "PianoRollScrollZoomViewPort");
|
|
991
|
+
var PianoRollScrollZoomViewPort_default = PianoRollScrollZoomViewPort;
|
|
992
|
+
var defaultRect = {
|
|
990
993
|
left: 0,
|
|
991
994
|
width: 0,
|
|
992
995
|
top: 0,
|
|
@@ -1000,10 +1003,11 @@ function useBoundingClientRect(containerRef) {
|
|
|
1000
1003
|
const [boundingClientRect, setBoundingClientRect] = createSignal(defaultRect);
|
|
1001
1004
|
createEffect(() => {
|
|
1002
1005
|
const container = containerRef();
|
|
1003
|
-
if (!container)
|
|
1004
|
-
|
|
1006
|
+
if (!container)
|
|
1007
|
+
return;
|
|
1008
|
+
const updateBoundingClientRect = /* @__PURE__ */ __name(() => {
|
|
1005
1009
|
setBoundingClientRect(container.getBoundingClientRect() ?? defaultRect);
|
|
1006
|
-
};
|
|
1010
|
+
}, "updateBoundingClientRect");
|
|
1007
1011
|
const resizeObserver = new ResizeObserver(updateBoundingClientRect);
|
|
1008
1012
|
resizeObserver.observe(container);
|
|
1009
1013
|
updateBoundingClientRect();
|
|
@@ -1013,15 +1017,17 @@ function useBoundingClientRect(containerRef) {
|
|
|
1013
1017
|
});
|
|
1014
1018
|
return boundingClientRect;
|
|
1015
1019
|
}
|
|
1020
|
+
__name(useBoundingClientRect, "useBoundingClientRect");
|
|
1016
1021
|
|
|
1017
|
-
|
|
1022
|
+
// src/PianoRollNotesScroller.tsx
|
|
1023
|
+
var PianoRollNotesScroller = /* @__PURE__ */ __name((props) => {
|
|
1018
1024
|
const context = usePianoRollContext();
|
|
1019
1025
|
const [ref, setRef] = createSignal();
|
|
1020
1026
|
const clientRect = useBoundingClientRect(ref);
|
|
1021
1027
|
createEffect(() => {
|
|
1022
1028
|
context.onNotesScrollerClientRectChange(clientRect());
|
|
1023
1029
|
});
|
|
1024
|
-
return createComponent(
|
|
1030
|
+
return createComponent(ScrollZoomContainer_default, {
|
|
1025
1031
|
ref: setRef,
|
|
1026
1032
|
get verticalDimensionName() {
|
|
1027
1033
|
return context.mode === "keys" ? "vertical" : "verticalTracks";
|
|
@@ -1030,16 +1036,16 @@ const PianoRollNotesScroller = props => {
|
|
|
1030
1036
|
return props.children;
|
|
1031
1037
|
}
|
|
1032
1038
|
});
|
|
1033
|
-
};
|
|
1034
|
-
|
|
1035
|
-
|
|
1039
|
+
}, "PianoRollNotesScroller");
|
|
1040
|
+
var PianoRollNotesScroller_default = PianoRollNotesScroller;
|
|
1041
|
+
var PianoRollTrackListScroller = /* @__PURE__ */ __name((props) => {
|
|
1036
1042
|
const context = usePianoRollContext();
|
|
1037
1043
|
const [ref, setRef] = createSignal();
|
|
1038
1044
|
const clientRect = useBoundingClientRect(ref);
|
|
1039
1045
|
createEffect(() => {
|
|
1040
1046
|
context.onTracksScrollerClientRectChange(clientRect());
|
|
1041
1047
|
});
|
|
1042
|
-
return createComponent(
|
|
1048
|
+
return createComponent(ScrollZoomContainer_default, {
|
|
1043
1049
|
ref: setRef,
|
|
1044
1050
|
horizontalDimensionName: "horizontalTracks",
|
|
1045
1051
|
verticalDimensionName: "verticalTracks",
|
|
@@ -1050,71 +1056,88 @@ const PianoRollTrackListScroller = props => {
|
|
|
1050
1056
|
return props.children;
|
|
1051
1057
|
}
|
|
1052
1058
|
});
|
|
1053
|
-
};
|
|
1059
|
+
}, "PianoRollTrackListScroller");
|
|
1060
|
+
var PianoRollTrackListScroller_default = PianoRollTrackListScroller;
|
|
1054
1061
|
|
|
1055
|
-
|
|
1056
|
-
var
|
|
1057
|
-
styleInject(css_248z);
|
|
1062
|
+
// src/PianoRollScale.module.css
|
|
1063
|
+
var _default7 = {};
|
|
1058
1064
|
|
|
1059
|
-
|
|
1060
|
-
|
|
1065
|
+
// src/PianoRollScale.tsx
|
|
1066
|
+
var _tmpl$7 = /* @__PURE__ */ template(`<div></div>`, 2);
|
|
1067
|
+
var PianoRollScale = /* @__PURE__ */ __name(() => {
|
|
1061
1068
|
const horizontalViewPort = createMemo(() => useViewPortDimension("horizontal"));
|
|
1062
|
-
const grid =
|
|
1069
|
+
const grid = usePianoRollGrid_default();
|
|
1070
|
+
const context = usePianoRollContext();
|
|
1071
|
+
const updatePlayheadPosition = /* @__PURE__ */ __name((event) => {
|
|
1072
|
+
const position = horizontalViewPort().calculatePosition(event.clientX);
|
|
1073
|
+
context.onPlayHeadPositionChange(position, event);
|
|
1074
|
+
}, "updatePlayheadPosition");
|
|
1063
1075
|
return (() => {
|
|
1064
|
-
const _el$ = _tmpl
|
|
1076
|
+
const _el$ = _tmpl$7.cloneNode(true);
|
|
1077
|
+
_el$.$$mousedown = (event) => {
|
|
1078
|
+
updatePlayheadPosition(event);
|
|
1079
|
+
const handleMouseUp = /* @__PURE__ */ __name(() => {
|
|
1080
|
+
window.removeEventListener("mousemove", updatePlayheadPosition);
|
|
1081
|
+
window.removeEventListener("mouseup", handleMouseUp);
|
|
1082
|
+
}, "handleMouseUp");
|
|
1083
|
+
window.addEventListener("mousemove", updatePlayheadPosition);
|
|
1084
|
+
window.addEventListener("mouseup", handleMouseUp);
|
|
1085
|
+
};
|
|
1065
1086
|
insert(_el$, createComponent(Index, {
|
|
1066
1087
|
get each() {
|
|
1067
1088
|
return grid();
|
|
1068
1089
|
},
|
|
1069
|
-
children: entry => {
|
|
1090
|
+
children: (entry) => {
|
|
1070
1091
|
return createComponent(Show, {
|
|
1071
1092
|
get when() {
|
|
1072
1093
|
return horizontalViewPort().isVisible(entry().virtualDimensions);
|
|
1073
1094
|
},
|
|
1074
1095
|
get children() {
|
|
1075
|
-
const _el$2 = _tmpl
|
|
1096
|
+
const _el$2 = _tmpl$7.cloneNode(true);
|
|
1076
1097
|
insert(_el$2, createComponent(Show, {
|
|
1077
1098
|
get when() {
|
|
1078
1099
|
return entry().showLabel;
|
|
1079
1100
|
},
|
|
1080
1101
|
get children() {
|
|
1081
|
-
const _el$3 = _tmpl
|
|
1102
|
+
const _el$3 = _tmpl$7.cloneNode(true);
|
|
1082
1103
|
insert(_el$3, () => entry().label);
|
|
1083
|
-
effect(() => className(_el$3,
|
|
1104
|
+
effect(() => className(_el$3, _default7["PianoRollScale-Label"]));
|
|
1084
1105
|
return _el$3;
|
|
1085
1106
|
}
|
|
1086
1107
|
}));
|
|
1087
|
-
effect(_p$ => {
|
|
1108
|
+
effect((_p$) => {
|
|
1088
1109
|
const _v$ = {
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
_v$2 = `${entry().virtualDimensions.offset}px`,
|
|
1094
|
-
_v$3 = `${entry().virtualDimensions.size}px`;
|
|
1110
|
+
[_default7["PianoRollScale-Time"]]: true,
|
|
1111
|
+
[_default7["Highlighted"]]: entry().isHighlighted,
|
|
1112
|
+
[_default7["HighlightedBorder"]]: entry().hasHighlightedBorder
|
|
1113
|
+
}, _v$2 = `${entry().virtualDimensions.offset}px`, _v$3 = `${entry().virtualDimensions.size}px`;
|
|
1095
1114
|
_p$._v$ = classList(_el$2, _v$, _p$._v$);
|
|
1096
1115
|
_v$2 !== _p$._v$2 && _el$2.style.setProperty("left", _p$._v$2 = _v$2);
|
|
1097
1116
|
_v$3 !== _p$._v$3 && _el$2.style.setProperty("width", _p$._v$3 = _v$3);
|
|
1098
1117
|
return _p$;
|
|
1099
1118
|
}, {
|
|
1100
|
-
_v$:
|
|
1101
|
-
_v$2:
|
|
1102
|
-
_v$3:
|
|
1119
|
+
_v$: void 0,
|
|
1120
|
+
_v$2: void 0,
|
|
1121
|
+
_v$3: void 0
|
|
1103
1122
|
});
|
|
1104
1123
|
return _el$2;
|
|
1105
1124
|
}
|
|
1106
1125
|
});
|
|
1107
1126
|
}
|
|
1108
1127
|
}));
|
|
1109
|
-
effect(() => className(_el$,
|
|
1128
|
+
effect(() => className(_el$, _default7.PianoRollScale));
|
|
1110
1129
|
return _el$;
|
|
1111
1130
|
})();
|
|
1112
|
-
};
|
|
1131
|
+
}, "PianoRollScale");
|
|
1132
|
+
var PianoRollScale_default = PianoRollScale;
|
|
1133
|
+
delegateEvents(["mousedown"]);
|
|
1113
1134
|
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1135
|
+
// src/PianoRoll.tsx
|
|
1136
|
+
var _tmpl$8 = /* @__PURE__ */ template(`<div><button><div></div></button></div>`, 6);
|
|
1137
|
+
var _tmpl$23 = /* @__PURE__ */ template(`<div><div></div><div></div></div>`, 6);
|
|
1138
|
+
var _tmpl$32 = /* @__PURE__ */ template(`<div><div><div></div></div></div>`, 6);
|
|
1139
|
+
var _tmpl$42 = /* @__PURE__ */ template(`<div></div>`, 2);
|
|
1140
|
+
var PianoRoll = /* @__PURE__ */ __name((allProps) => {
|
|
1118
1141
|
const propsWithDefaults = mergeProps({
|
|
1119
1142
|
showAllTracks: false
|
|
1120
1143
|
}, allProps);
|
|
@@ -1122,21 +1145,17 @@ const PianoRoll = allProps => {
|
|
|
1122
1145
|
return createComponent(PianoRollContextProvider, {
|
|
1123
1146
|
value: context,
|
|
1124
1147
|
get children() {
|
|
1125
|
-
const _el$ = _tmpl$
|
|
1148
|
+
const _el$ = _tmpl$42.cloneNode(true);
|
|
1126
1149
|
spread(_el$, mergeProps$1(divProps, {
|
|
1127
1150
|
get ["class"]() {
|
|
1128
|
-
return
|
|
1151
|
+
return _default.PianoRoll;
|
|
1129
1152
|
}
|
|
1130
1153
|
}), false, true);
|
|
1131
|
-
insert(_el$, createComponent(
|
|
1154
|
+
insert(_el$, createComponent(PianoRollScrollZoomViewPort_default, {
|
|
1132
1155
|
get children() {
|
|
1133
1156
|
return [(() => {
|
|
1134
|
-
const _el$2 = _tmpl$
|
|
1135
|
-
|
|
1136
|
-
_el$7 = _el$3.firstChild,
|
|
1137
|
-
_el$8 = _el$3.nextSibling,
|
|
1138
|
-
_el$9 = _el$8.firstChild;
|
|
1139
|
-
insert(_el$2, createComponent(ZoomSliderControl, {
|
|
1157
|
+
const _el$2 = _tmpl$32.cloneNode(true), _el$3 = _el$2.firstChild, _el$7 = _el$3.firstChild;
|
|
1158
|
+
insert(_el$2, createComponent(ZoomSliderControl_default, {
|
|
1140
1159
|
orientation: "vertical",
|
|
1141
1160
|
dimensionName: "verticalTracks"
|
|
1142
1161
|
}), _el$3);
|
|
@@ -1145,16 +1164,15 @@ const PianoRoll = allProps => {
|
|
|
1145
1164
|
return context.showTrackList;
|
|
1146
1165
|
},
|
|
1147
1166
|
get children() {
|
|
1148
|
-
const _el$4 = _tmpl
|
|
1149
|
-
_el$5 = _el$4.firstChild,
|
|
1150
|
-
_el$6 = _el$5.firstChild;
|
|
1167
|
+
const _el$4 = _tmpl$8.cloneNode(true), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild;
|
|
1151
1168
|
_el$4.style.setProperty("height", "30px");
|
|
1169
|
+
_el$4.style.setProperty("border-right", "1px black solid");
|
|
1152
1170
|
_el$5.$$click = () => context.onModeChange(context.mode === "keys" ? "tracks" : "keys");
|
|
1153
1171
|
_el$5.style.setProperty("font-size", "16px");
|
|
1154
1172
|
_el$5.style.setProperty("line-height", "16px");
|
|
1155
1173
|
_el$5.style.setProperty("cursor", "pointer");
|
|
1156
1174
|
_el$5.style.setProperty("overflow", "hidden");
|
|
1157
|
-
insert(_el$6, () => context.mode === "keys" ? "
|
|
1175
|
+
insert(_el$6, () => context.mode === "keys" ? "\u2261" : "\u{1F3B9}");
|
|
1158
1176
|
effect(() => setAttribute(_el$5, "title", context.mode === "keys" ? "Tracks Mode" : "Keys Mode"));
|
|
1159
1177
|
return _el$4;
|
|
1160
1178
|
}
|
|
@@ -1167,9 +1185,9 @@ const PianoRoll = allProps => {
|
|
|
1167
1185
|
return context.showTrackList;
|
|
1168
1186
|
},
|
|
1169
1187
|
get children() {
|
|
1170
|
-
return createComponent(
|
|
1188
|
+
return createComponent(PianoRollTrackListScroller_default, {
|
|
1171
1189
|
get children() {
|
|
1172
|
-
return createComponent(
|
|
1190
|
+
return createComponent(PianoRollTrackList_default, {});
|
|
1173
1191
|
}
|
|
1174
1192
|
});
|
|
1175
1193
|
}
|
|
@@ -1179,42 +1197,49 @@ const PianoRoll = allProps => {
|
|
|
1179
1197
|
return context.mode === "keys";
|
|
1180
1198
|
},
|
|
1181
1199
|
get children() {
|
|
1182
|
-
return createComponent(
|
|
1200
|
+
return createComponent(PianoRollKeys_default, {});
|
|
1183
1201
|
}
|
|
1184
1202
|
}), null);
|
|
1185
|
-
_el$
|
|
1186
|
-
_el$8.style.setProperty("display", "flex");
|
|
1187
|
-
_el$8.style.setProperty("height", "100%");
|
|
1188
|
-
_el$8.style.setProperty("flex-direction", "column");
|
|
1189
|
-
_el$8.style.setProperty("overflow", "hidden");
|
|
1190
|
-
_el$9.style.setProperty("height", "30px");
|
|
1191
|
-
insert(_el$9, createComponent(PianoRollScale, {}));
|
|
1192
|
-
insert(_el$8, createComponent(PianoRollNotesScroller, {
|
|
1203
|
+
insert(_el$2, createComponent(PianoRollNotesScroller_default, {
|
|
1193
1204
|
get children() {
|
|
1194
|
-
return [memo(() => allProps.children),
|
|
1205
|
+
return [memo(() => allProps.children), (() => {
|
|
1206
|
+
const _el$8 = _tmpl$23.cloneNode(true), _el$9 = _el$8.firstChild, _el$10 = _el$9.nextSibling;
|
|
1207
|
+
_el$8.style.setProperty("width", "100%");
|
|
1208
|
+
_el$8.style.setProperty("display", "flex");
|
|
1209
|
+
_el$8.style.setProperty("height", "100%");
|
|
1210
|
+
_el$8.style.setProperty("flex-direction", "column");
|
|
1211
|
+
_el$8.style.setProperty("overflow", "hidden");
|
|
1212
|
+
_el$9.style.setProperty("height", "30px");
|
|
1213
|
+
insert(_el$9, createComponent(PianoRollScale_default, {}));
|
|
1214
|
+
_el$10.style.setProperty("flex", "1");
|
|
1215
|
+
_el$10.style.setProperty("position", "relative");
|
|
1216
|
+
_el$10.style.setProperty("overflow", "hidden");
|
|
1217
|
+
insert(_el$10, createComponent(PianoRollGrid_default, {}), null);
|
|
1218
|
+
insert(_el$10, createComponent(PianoRollNotes_default, {}), null);
|
|
1219
|
+
return _el$8;
|
|
1220
|
+
})()];
|
|
1195
1221
|
}
|
|
1196
1222
|
}), null);
|
|
1197
|
-
insert(_el$2, createComponent(
|
|
1223
|
+
insert(_el$2, createComponent(ZoomSliderControl_default, {
|
|
1198
1224
|
orientation: "vertical",
|
|
1199
1225
|
get disabled() {
|
|
1200
1226
|
return context.mode !== "keys";
|
|
1201
1227
|
}
|
|
1202
1228
|
}), null);
|
|
1203
|
-
effect(_p$ => {
|
|
1204
|
-
const _v$ =
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
};
|
|
1229
|
+
effect((_p$) => {
|
|
1230
|
+
const _v$ = _default.PianoRollContainer, _v$2 = {
|
|
1231
|
+
[_default.PianoRollLeftColumn]: true,
|
|
1232
|
+
[_default.showTrackList]: context.showTrackList
|
|
1233
|
+
};
|
|
1209
1234
|
_v$ !== _p$._v$ && className(_el$2, _p$._v$ = _v$);
|
|
1210
1235
|
_p$._v$2 = classList(_el$3, _v$2, _p$._v$2);
|
|
1211
1236
|
return _p$;
|
|
1212
1237
|
}, {
|
|
1213
|
-
_v$:
|
|
1214
|
-
_v$2:
|
|
1238
|
+
_v$: void 0,
|
|
1239
|
+
_v$2: void 0
|
|
1215
1240
|
});
|
|
1216
1241
|
return _el$2;
|
|
1217
|
-
})(), createComponent(
|
|
1242
|
+
})(), createComponent(ZoomSliderControl_default, {
|
|
1218
1243
|
orientation: "horizontal",
|
|
1219
1244
|
get style() {
|
|
1220
1245
|
return {
|
|
@@ -1228,22 +1253,23 @@ const PianoRoll = allProps => {
|
|
|
1228
1253
|
return _el$;
|
|
1229
1254
|
}
|
|
1230
1255
|
});
|
|
1231
|
-
};
|
|
1256
|
+
}, "PianoRoll");
|
|
1257
|
+
var PianoRoll_default = PianoRoll;
|
|
1232
1258
|
delegateEvents(["click"]);
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
const PlayHead = allProps => {
|
|
1259
|
+
var _tmpl$9 = /* @__PURE__ */ template(`<div class="PlayHead"></div>`, 2);
|
|
1260
|
+
var PlayHead = /* @__PURE__ */ __name((allProps) => {
|
|
1236
1261
|
const [props, divProps] = splitProps(allProps, ["position", "sync", "onPositionChange", "dimensionName"]);
|
|
1237
1262
|
const viewPort = useViewPortDimension(props.dimensionName ?? "horizontal");
|
|
1238
1263
|
createEffect(() => {
|
|
1239
|
-
if (!props.sync)
|
|
1264
|
+
if (!props.sync)
|
|
1265
|
+
return;
|
|
1240
1266
|
const maxPosition = viewPort.range;
|
|
1241
1267
|
const newPosition = clamp(props.position - viewPort.range / viewPort.zoom / 2, 0, maxPosition);
|
|
1242
1268
|
viewPort.onPositionChange?.(newPosition);
|
|
1243
1269
|
});
|
|
1244
1270
|
const leftPosition = createMemo(() => viewPort.calculatePixelOffset(props.position));
|
|
1245
1271
|
return (() => {
|
|
1246
|
-
const _el$ = _tmpl
|
|
1272
|
+
const _el$ = _tmpl$9.cloneNode(true);
|
|
1247
1273
|
spread(_el$, mergeProps$1(divProps, {
|
|
1248
1274
|
get style() {
|
|
1249
1275
|
return {
|
|
@@ -1253,45 +1279,44 @@ const PlayHead = allProps => {
|
|
|
1253
1279
|
left: `${leftPosition()}px`,
|
|
1254
1280
|
"background-color": "green",
|
|
1255
1281
|
cursor: "pointer",
|
|
1256
|
-
...
|
|
1282
|
+
...typeof divProps.style === "object" && divProps.style
|
|
1257
1283
|
};
|
|
1258
1284
|
},
|
|
1259
|
-
"onMouseDown": event => {
|
|
1285
|
+
"onMouseDown": (event) => {
|
|
1260
1286
|
event.preventDefault();
|
|
1261
1287
|
event.stopPropagation();
|
|
1262
|
-
const handleMouseMove = ({
|
|
1263
|
-
clientX
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
};
|
|
1268
|
-
const handleMouseUp = () => {
|
|
1288
|
+
const handleMouseMove = /* @__PURE__ */ __name((event2) => {
|
|
1289
|
+
const newPosition = viewPort.calculatePosition(event2.clientX);
|
|
1290
|
+
props.onPositionChange?.(newPosition, event2);
|
|
1291
|
+
}, "handleMouseMove");
|
|
1292
|
+
const handleMouseUp = /* @__PURE__ */ __name(() => {
|
|
1269
1293
|
window.removeEventListener("mousemove", handleMouseMove);
|
|
1270
1294
|
window.removeEventListener("mouseup", handleMouseUp);
|
|
1271
|
-
};
|
|
1295
|
+
}, "handleMouseUp");
|
|
1272
1296
|
window.addEventListener("mousemove", handleMouseMove);
|
|
1273
1297
|
window.addEventListener("mouseup", handleMouseUp);
|
|
1274
1298
|
}
|
|
1275
1299
|
}), false, false);
|
|
1276
1300
|
return _el$;
|
|
1277
1301
|
})();
|
|
1278
|
-
};
|
|
1279
|
-
|
|
1280
|
-
|
|
1302
|
+
}, "PlayHead");
|
|
1303
|
+
var PlayHead_default = PlayHead;
|
|
1304
|
+
var useNotes = /* @__PURE__ */ __name(() => {
|
|
1281
1305
|
const [notes, onNotesChange] = createSignal([]);
|
|
1282
|
-
const onNoteChange = (index, note) => {
|
|
1306
|
+
const onNoteChange = /* @__PURE__ */ __name((index, note) => {
|
|
1283
1307
|
onNotesChange([...notes().slice(0, index), note, ...notes().splice(index + 1)]);
|
|
1284
|
-
};
|
|
1285
|
-
const onInsertNote = note => {
|
|
1286
|
-
const index = Math.max(
|
|
1287
|
-
ticks
|
|
1288
|
-
|
|
1308
|
+
}, "onNoteChange");
|
|
1309
|
+
const onInsertNote = /* @__PURE__ */ __name((note) => {
|
|
1310
|
+
const index = Math.max(
|
|
1311
|
+
notes().findIndex(({ ticks }) => ticks > note.ticks),
|
|
1312
|
+
0
|
|
1313
|
+
);
|
|
1289
1314
|
onNotesChange([...notes().slice(0, index), note, ...notes().splice(index)]);
|
|
1290
1315
|
return index;
|
|
1291
|
-
};
|
|
1292
|
-
const onRemoveNote = index => {
|
|
1316
|
+
}, "onInsertNote");
|
|
1317
|
+
const onRemoveNote = /* @__PURE__ */ __name((index) => {
|
|
1293
1318
|
onNotesChange([...notes().slice(0, index), ...notes().splice(index + 1)]);
|
|
1294
|
-
};
|
|
1319
|
+
}, "onRemoveNote");
|
|
1295
1320
|
return {
|
|
1296
1321
|
notes,
|
|
1297
1322
|
onNotesChange,
|
|
@@ -1299,7 +1324,7 @@ const useNotes = () => {
|
|
|
1299
1324
|
onInsertNote,
|
|
1300
1325
|
onRemoveNote
|
|
1301
1326
|
};
|
|
1302
|
-
};
|
|
1327
|
+
}, "useNotes");
|
|
1328
|
+
var useNotes_default = useNotes;
|
|
1303
1329
|
|
|
1304
|
-
export { PianoRoll, PlayHead, createPianoRollstate, useNotes };
|
|
1305
|
-
//# sourceMappingURL=index.js.map
|
|
1330
|
+
export { PianoRoll_default as PianoRoll, PlayHead_default as PlayHead, usePianoRollState_default as createPianoRollstate, useNotes_default as useNotes };
|