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