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