sonolus-pjsekai-js 1.1.12 → 1.2.0
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/EnginePlayData +0 -0
- package/dist/EnginePreviewData +0 -0
- package/dist/EngineWatchData +0 -0
- package/dist/index.cjs +32 -30
- package/dist/index.d.cts +5 -4
- package/dist/sus/analyze.cjs +23 -25
- package/dist/sus/convert.cjs +19 -22
- package/dist/sus/convert.d.cts +1 -1
- package/dist/sus/decode.cjs +318 -0
- package/dist/sus/decode.d.cts +1 -0
- package/dist/sus/index.cjs +18 -0
- package/dist/{usc/index.d.ts → sus/index.d.cts} +19 -19
- package/dist/sus/revert.cjs +339 -0
- package/dist/sus/revert.d.cts +1 -0
- package/dist/usc/ccIndex.cjs +18 -0
- package/dist/usc/ccIndex.d.cts +91 -0
- package/dist/usc/convert.cjs +56 -142
- package/dist/usc/convert.d.cts +2 -2
- package/dist/usc/index.cjs +0 -16
- package/dist/usc/index.d.cts +16 -42
- package/dist/usc/revert.cjs +169 -0
- package/dist/usc/revert.d.cts +8 -0
- package/package.json +39 -39
- package/dist/sus/analyze.d.ts +0 -29
- package/dist/sus/analyze.js +0 -262
- package/dist/sus/convert.d.ts +0 -5
- package/dist/sus/convert.js +0 -301
- package/dist/usc/convert.d.ts +0 -3
- package/dist/usc/convert.js +0 -542
- package/dist/usc/index.js +0 -15
@@ -0,0 +1,318 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.uscToSUS = void 0;
|
4
|
+
const TICKS_PER_BEAT = 480;
|
5
|
+
const uscToSUS = (uscData) => {
|
6
|
+
const usc = uscData.usc ? uscData.usc : uscData;
|
7
|
+
const susLines = [];
|
8
|
+
const noteData = new Map();
|
9
|
+
let slideChannelCounter = 0;
|
10
|
+
// (메타데이터 및 전역 정의 생성은 이전과 동일)
|
11
|
+
susLines.push(`#TITLE ""`, `#ARTIST ""`, `#DESIGNER ""`, `#WAVEOFFSET ${-usc.offset}`, `#REQUEST "ticks_per_beat ${TICKS_PER_BEAT}"`, ``);
|
12
|
+
const ticksPerMeasure = TICKS_PER_BEAT * 4;
|
13
|
+
const bpmObjects = usc.objects.filter((obj) => obj.type === "bpm");
|
14
|
+
const bpmDefinitions = new Map();
|
15
|
+
let bpmCounter = 1;
|
16
|
+
for (const bpmObject of bpmObjects) {
|
17
|
+
if (!bpmDefinitions.has(bpmObject.bpm)) {
|
18
|
+
const bpmId = bpmCounter.toString().padStart(2, "0");
|
19
|
+
bpmDefinitions.set(bpmObject.bpm, bpmId);
|
20
|
+
susLines.push(`#BPM${bpmId}: ${bpmObject.bpm}`);
|
21
|
+
bpmCounter++;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
susLines.push(``);
|
25
|
+
const timeScaleGroups = usc.objects.filter((obj) => obj.type === "timeScaleGroup");
|
26
|
+
const tilIdMap = new Map();
|
27
|
+
timeScaleGroups.forEach((group, index) => {
|
28
|
+
const tilId = index.toString().padStart(2, "0");
|
29
|
+
tilIdMap.set(index, tilId);
|
30
|
+
const changesString = group.changes
|
31
|
+
.map(change => {
|
32
|
+
const totalTicks = change.beat * TICKS_PER_BEAT;
|
33
|
+
const measure = Math.floor(totalTicks / ticksPerMeasure);
|
34
|
+
const tickInMeasure = totalTicks % ticksPerMeasure;
|
35
|
+
return `${measure}'${tickInMeasure}:${change.timeScale}`;
|
36
|
+
})
|
37
|
+
.join(", ");
|
38
|
+
susLines.push(`#TIL${tilId}: "${changesString}"`);
|
39
|
+
});
|
40
|
+
susLines.push(``);
|
41
|
+
addNoteData(0, "00002", 0, "4", 0);
|
42
|
+
for (const bpmObject of bpmObjects) {
|
43
|
+
const tick = bpmObject.beat * TICKS_PER_BEAT;
|
44
|
+
const measure = Math.floor(tick / ticksPerMeasure);
|
45
|
+
const tickInMeasure = tick % ticksPerMeasure;
|
46
|
+
const bpmId = bpmDefinitions.get(bpmObject.bpm);
|
47
|
+
if (bpmId) {
|
48
|
+
addNoteData(measure, `${measure.toString().padStart(3, "0")}08`, tickInMeasure, bpmId, 0);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
for (const obj of usc.objects) {
|
52
|
+
switch (obj.type) {
|
53
|
+
case "single":
|
54
|
+
case "damage":
|
55
|
+
processSingleOrDamage(obj);
|
56
|
+
break;
|
57
|
+
case "slide":
|
58
|
+
processSlide(obj);
|
59
|
+
slideChannelCounter++;
|
60
|
+
break;
|
61
|
+
case "guide":
|
62
|
+
processGuide(obj);
|
63
|
+
slideChannelCounter++;
|
64
|
+
break;
|
65
|
+
case "timeScaleGroup":
|
66
|
+
case "bpm":
|
67
|
+
break;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
const sortedMeasures = Array.from(noteData.keys()).sort((a, b) => a - b);
|
71
|
+
let activeTimeScaleGroup = -1;
|
72
|
+
for (const measure of sortedMeasures) {
|
73
|
+
const headerMap = noteData.get(measure);
|
74
|
+
const sortedHeaders = Array.from(headerMap.keys()).sort();
|
75
|
+
for (const header of sortedHeaders) {
|
76
|
+
const notes = headerMap.get(header);
|
77
|
+
if (!notes || notes.length === 0)
|
78
|
+
continue;
|
79
|
+
const noteTimeScaleGroup = notes[0].timeScaleGroup;
|
80
|
+
const tilId = tilIdMap.get(noteTimeScaleGroup);
|
81
|
+
if (noteTimeScaleGroup !== activeTimeScaleGroup && tilId !== undefined) {
|
82
|
+
susLines.push(`#HISPEED ${tilId}`);
|
83
|
+
activeTimeScaleGroup = noteTimeScaleGroup;
|
84
|
+
}
|
85
|
+
if (header.endsWith("02") || header.endsWith("08")) {
|
86
|
+
susLines.push(`#${header}: ${notes[0].value}`);
|
87
|
+
continue;
|
88
|
+
}
|
89
|
+
const granularity = 1920;
|
90
|
+
const data = Array(granularity).fill("00");
|
91
|
+
for (const note of notes) {
|
92
|
+
const index = Math.floor((note.tick / ticksPerMeasure) * granularity);
|
93
|
+
if (index < granularity) {
|
94
|
+
data[index] = note.value;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
susLines.push(`#${header}: ${data.join("")}`);
|
98
|
+
}
|
99
|
+
}
|
100
|
+
return susLines.join("\r\n");
|
101
|
+
// --- Helper Functions ---
|
102
|
+
function addNoteData(measure, header, tickInMeasure, value, timeScaleGroup) {
|
103
|
+
if (!noteData.has(measure))
|
104
|
+
noteData.set(measure, new Map());
|
105
|
+
const headerMap = noteData.get(measure);
|
106
|
+
if (!headerMap.has(header))
|
107
|
+
headerMap.set(header, []);
|
108
|
+
headerMap.get(header).push({ tick: tickInMeasure, value, timeScaleGroup });
|
109
|
+
}
|
110
|
+
function getSusLaneAndWidth(uscLane, uscSize) {
|
111
|
+
const susWidth = Math.round(uscSize * 2);
|
112
|
+
const susLane = Math.round(uscLane - uscSize + 8);
|
113
|
+
return [Math.max(0, susLane), Math.max(1, susWidth)];
|
114
|
+
}
|
115
|
+
function addTapNote(beat, lane, width, noteType, timeScaleGroup) {
|
116
|
+
const tick = beat * TICKS_PER_BEAT;
|
117
|
+
const measure = Math.floor(tick / ticksPerMeasure);
|
118
|
+
const tickInMeasure = tick % ticksPerMeasure;
|
119
|
+
const laneHex = lane.toString(36);
|
120
|
+
const widthHex = width.toString(36);
|
121
|
+
const header = `${measure.toString().padStart(3, "0")}1${laneHex}`;
|
122
|
+
const value = `${noteType}${widthHex}`;
|
123
|
+
addNoteData(measure, header, tickInMeasure, value, timeScaleGroup);
|
124
|
+
}
|
125
|
+
function processSingleOrDamage(note) {
|
126
|
+
if (note.type === 'damage') {
|
127
|
+
const [lane, width] = getSusLaneAndWidth(note.lane, note.size);
|
128
|
+
addTapNote(note.beat, lane, width, "4", note.timeScaleGroup);
|
129
|
+
return;
|
130
|
+
}
|
131
|
+
const [lane, width] = getSusLaneAndWidth(note.lane, note.size);
|
132
|
+
let susNoteType = "1";
|
133
|
+
if (note.critical && note.trace)
|
134
|
+
susNoteType = "6";
|
135
|
+
else if (note.critical)
|
136
|
+
susNoteType = "2";
|
137
|
+
else if (note.trace)
|
138
|
+
susNoteType = "5";
|
139
|
+
addTapNote(note.beat, lane, width, susNoteType, note.timeScaleGroup);
|
140
|
+
if (note.direction && note.direction !== "none") {
|
141
|
+
let directionalType;
|
142
|
+
switch (note.direction) {
|
143
|
+
case "up":
|
144
|
+
directionalType = "1";
|
145
|
+
break;
|
146
|
+
case "left":
|
147
|
+
directionalType = "3";
|
148
|
+
break;
|
149
|
+
case "right":
|
150
|
+
directionalType = "4";
|
151
|
+
break;
|
152
|
+
default: return;
|
153
|
+
}
|
154
|
+
const [dirLane, dirWidth] = getSusLaneAndWidth(note.lane, note.size);
|
155
|
+
const tick = note.beat * TICKS_PER_BEAT;
|
156
|
+
const measure = Math.floor(tick / ticksPerMeasure);
|
157
|
+
const tickInMeasure = tick % ticksPerMeasure;
|
158
|
+
const dirHeader = `${measure.toString().padStart(3, "0")}5${dirLane.toString(36)}`;
|
159
|
+
const dirValue = `${directionalType}${dirWidth.toString(36)}`;
|
160
|
+
addNoteData(measure, dirHeader, tickInMeasure, dirValue, note.timeScaleGroup);
|
161
|
+
}
|
162
|
+
}
|
163
|
+
// ▼▼▼ 'tick', 'hidden', 'skip' 개념을 최종적으로 수정한 `processSlide` 함수 ▼▼▼
|
164
|
+
function processSlide(slide) {
|
165
|
+
const channel = (slideChannelCounter % 36).toString(36);
|
166
|
+
const sortedConnections = [...slide.connections].sort((a, b) => a.beat - b.beat);
|
167
|
+
let lastKnownLane = 0;
|
168
|
+
let lastKnownWidth = 0;
|
169
|
+
for (const conn of sortedConnections) {
|
170
|
+
const tick = conn.beat * TICKS_PER_BEAT;
|
171
|
+
const measure = Math.floor(tick / ticksPerMeasure);
|
172
|
+
const tickInMeasure = tick % ticksPerMeasure;
|
173
|
+
const timeScaleGroup = conn.timeScaleGroup ?? 0;
|
174
|
+
// --- 3가지 규칙에 따른 분기 처리 ---
|
175
|
+
if (conn.type === "tick") {
|
176
|
+
// `critical` 속성 존재 여부로 '일반 Tick'과 'Hidden'을 구분합니다.
|
177
|
+
if (conn.critical !== undefined) {
|
178
|
+
// --- 일반 Tick 처리 ---
|
179
|
+
// 경로에 영향을 주는 보이는 경유점(타입 3)을 생성합니다.
|
180
|
+
const [lane, width] = getSusLaneAndWidth(conn.lane, conn.size);
|
181
|
+
lastKnownLane = lane;
|
182
|
+
lastKnownWidth = width;
|
183
|
+
const laneHex = lane.toString(36);
|
184
|
+
const header = `${measure.toString().padStart(3, "0")}3${laneHex}${channel}`;
|
185
|
+
const value = `3${width.toString(36)}`;
|
186
|
+
addNoteData(measure, header, tickInMeasure, value, timeScaleGroup);
|
187
|
+
}
|
188
|
+
else {
|
189
|
+
// --- Hidden 노트 처리 ---
|
190
|
+
// 경로에 영향을 주는 보이지 않는 경유점(타입 5)을 생성합니다.
|
191
|
+
// 위치는 직전 노트의 것을 그대로 사용합니다.
|
192
|
+
const laneHex = lastKnownLane.toString(36);
|
193
|
+
const widthHex = lastKnownWidth.toString(36);
|
194
|
+
const header = `${measure.toString().padStart(3, "0")}3${laneHex}${channel}`;
|
195
|
+
const value = `5${widthHex}`;
|
196
|
+
addNoteData(measure, header, tickInMeasure, value, timeScaleGroup);
|
197
|
+
}
|
198
|
+
}
|
199
|
+
else if (conn.type === "attach") {
|
200
|
+
// --- Skip 노트 처리 ---
|
201
|
+
// 경로에 영향을 주지 않으므로 아무것도 생성하지 않고 건너뜁니다.
|
202
|
+
continue;
|
203
|
+
}
|
204
|
+
else {
|
205
|
+
// --- Start, End 노트 처리 ---
|
206
|
+
const [lane, width] = getSusLaneAndWidth(conn.lane, conn.size);
|
207
|
+
lastKnownLane = lane;
|
208
|
+
lastKnownWidth = width;
|
209
|
+
const isCritical = slide.critical || conn.critical;
|
210
|
+
let markerType = null;
|
211
|
+
if ("judgeType" in conn) {
|
212
|
+
if (conn.judgeType === "none")
|
213
|
+
markerType = isCritical ? "8" : "7";
|
214
|
+
else if (conn.judgeType === "trace")
|
215
|
+
markerType = isCritical ? "6" : "5";
|
216
|
+
}
|
217
|
+
if (conn.type === "start" && isCritical && markerType === null) {
|
218
|
+
markerType = "2";
|
219
|
+
}
|
220
|
+
if (markerType) {
|
221
|
+
addTapNote(conn.beat, lane, width, markerType, timeScaleGroup);
|
222
|
+
}
|
223
|
+
if ("ease" in conn && conn.ease) {
|
224
|
+
let easeType = conn.ease;
|
225
|
+
if (easeType === 'inout')
|
226
|
+
easeType = 'in';
|
227
|
+
if (easeType === 'outin')
|
228
|
+
easeType = 'out';
|
229
|
+
let directionalType = null;
|
230
|
+
if (easeType === 'in')
|
231
|
+
directionalType = '2';
|
232
|
+
else if (easeType === 'out')
|
233
|
+
directionalType = '5';
|
234
|
+
if (directionalType) {
|
235
|
+
const laneHex = lane.toString(36);
|
236
|
+
const widthHex = width.toString(36);
|
237
|
+
const dirHeader = `${measure.toString().padStart(3, "0")}5${laneHex}`;
|
238
|
+
const dirValue = `${directionalType}${widthHex}`;
|
239
|
+
addNoteData(measure, dirHeader, tickInMeasure, dirValue, timeScaleGroup);
|
240
|
+
}
|
241
|
+
}
|
242
|
+
const noteType = conn.type === "start" ? "1" : "2";
|
243
|
+
const laneHex = lane.toString(36);
|
244
|
+
const header = `${measure.toString().padStart(3, "0")}3${laneHex}${channel}`;
|
245
|
+
const value = `${noteType}${width.toString(36)}`;
|
246
|
+
addNoteData(measure, header, tickInMeasure, value, timeScaleGroup);
|
247
|
+
if (conn.type === "end" && conn.direction) {
|
248
|
+
let directionalType;
|
249
|
+
switch (conn.direction) {
|
250
|
+
case "up":
|
251
|
+
directionalType = "1";
|
252
|
+
break;
|
253
|
+
case "left":
|
254
|
+
directionalType = "3";
|
255
|
+
break;
|
256
|
+
case "right":
|
257
|
+
directionalType = "4";
|
258
|
+
break;
|
259
|
+
default: continue;
|
260
|
+
}
|
261
|
+
const dirHeader = `${measure.toString().padStart(3, "0")}5${laneHex}`;
|
262
|
+
const dirValue = `${directionalType}${width.toString(36)}`;
|
263
|
+
addNoteData(measure, dirHeader, tickInMeasure, dirValue, timeScaleGroup);
|
264
|
+
}
|
265
|
+
}
|
266
|
+
}
|
267
|
+
}
|
268
|
+
function processGuide(guide) {
|
269
|
+
const channel = (slideChannelCounter % 36).toString(36);
|
270
|
+
const sortedMidpoints = [...guide.midpoints].sort((a, b) => a.beat - b.beat);
|
271
|
+
sortedMidpoints.forEach((midpoint, index) => {
|
272
|
+
const tick = midpoint.beat * TICKS_PER_BEAT;
|
273
|
+
const measure = Math.floor(tick / ticksPerMeasure);
|
274
|
+
const tickInMeasure = tick % ticksPerMeasure;
|
275
|
+
let noteType;
|
276
|
+
if (index === 0)
|
277
|
+
noteType = "1";
|
278
|
+
else if (index === sortedMidpoints.length - 1)
|
279
|
+
noteType = "2";
|
280
|
+
else
|
281
|
+
noteType = "3";
|
282
|
+
const [lane, width] = getSusLaneAndWidth(midpoint.lane, midpoint.size);
|
283
|
+
const laneHex = lane.toString(36);
|
284
|
+
const widthHex = width.toString(36);
|
285
|
+
if (guide.fade === "in" && index === 0) {
|
286
|
+
const dirHeader = `${measure.toString().padStart(3, "0")}5${laneHex}`;
|
287
|
+
const dirValue = `2${widthHex}`;
|
288
|
+
addNoteData(measure, dirHeader, tickInMeasure, dirValue, midpoint.timeScaleGroup);
|
289
|
+
}
|
290
|
+
if (guide.fade === "out" && index === sortedMidpoints.length - 1) {
|
291
|
+
const dirHeader = `${measure.toString().padStart(3, "0")}5${laneHex}`;
|
292
|
+
const dirValue = `5${widthHex}`;
|
293
|
+
addNoteData(measure, dirHeader, tickInMeasure, dirValue, midpoint.timeScaleGroup);
|
294
|
+
}
|
295
|
+
if (midpoint.ease) {
|
296
|
+
let easeType = midpoint.ease;
|
297
|
+
if (easeType === 'inout')
|
298
|
+
easeType = 'in';
|
299
|
+
if (easeType === 'outin')
|
300
|
+
easeType = 'out';
|
301
|
+
let directionalType = null;
|
302
|
+
if (easeType === 'in')
|
303
|
+
directionalType = '2';
|
304
|
+
else if (easeType === 'out')
|
305
|
+
directionalType = '5';
|
306
|
+
if (directionalType) {
|
307
|
+
const dirHeader = `${measure.toString().padStart(3, "0")}5${laneHex}`;
|
308
|
+
const dirValue = `${directionalType}${widthHex}`;
|
309
|
+
addNoteData(measure, dirHeader, tickInMeasure, dirValue, midpoint.timeScaleGroup);
|
310
|
+
}
|
311
|
+
}
|
312
|
+
const header = `${measure.toString().padStart(3, "0")}9${laneHex}${channel}`;
|
313
|
+
const value = `${noteType}${widthHex}`;
|
314
|
+
addNoteData(measure, header, tickInMeasure, value, midpoint.timeScaleGroup);
|
315
|
+
});
|
316
|
+
}
|
317
|
+
};
|
318
|
+
exports.uscToSUS = uscToSUS;
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare const uscToSUS: (uscData: any) => string;
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.USCFade = exports.USCColor = void 0;
|
4
|
+
exports.USCColor = {
|
5
|
+
neutral: 0,
|
6
|
+
red: 1,
|
7
|
+
green: 2,
|
8
|
+
blue: 3,
|
9
|
+
yellow: 4,
|
10
|
+
purple: 5,
|
11
|
+
cyan: 6,
|
12
|
+
black: 7,
|
13
|
+
};
|
14
|
+
exports.USCFade = {
|
15
|
+
in: 2,
|
16
|
+
out: 0,
|
17
|
+
none: 1,
|
18
|
+
};
|
@@ -7,12 +7,12 @@ type BaseUSCObject = {
|
|
7
7
|
beat: number;
|
8
8
|
timeScaleGroup: number;
|
9
9
|
};
|
10
|
-
export type USCBpmChange = Omit<BaseUSCObject,
|
11
|
-
type:
|
10
|
+
export type USCBpmChange = Omit<BaseUSCObject, 'timeScaleGroup'> & {
|
11
|
+
type: 'bpm';
|
12
12
|
bpm: number;
|
13
13
|
};
|
14
14
|
export type USCTimeScaleChange = {
|
15
|
-
type:
|
15
|
+
type: 'timeScaleGroup';
|
16
16
|
changes: {
|
17
17
|
beat: number;
|
18
18
|
timeScale: number;
|
@@ -23,38 +23,38 @@ type BaseUSCNote = BaseUSCObject & {
|
|
23
23
|
size: number;
|
24
24
|
};
|
25
25
|
export type USCSingleNote = BaseUSCNote & {
|
26
|
-
type:
|
26
|
+
type: 'single';
|
27
27
|
critical: boolean;
|
28
28
|
trace: boolean;
|
29
|
-
direction?:
|
29
|
+
direction?: 'left' | 'up' | 'right' | 'none';
|
30
30
|
};
|
31
31
|
export type USCDamageNote = BaseUSCNote & {
|
32
|
-
type:
|
32
|
+
type: 'damage';
|
33
33
|
};
|
34
34
|
export type USCConnectionStartNote = BaseUSCNote & {
|
35
|
-
type:
|
35
|
+
type: 'start';
|
36
36
|
critical: boolean;
|
37
|
-
ease:
|
38
|
-
judgeType:
|
37
|
+
ease: 'out' | 'linear' | 'in' | 'inout' | 'outin';
|
38
|
+
judgeType: 'normal' | 'trace' | 'none';
|
39
39
|
};
|
40
40
|
export type USCConnectionTickNote = BaseUSCNote & {
|
41
|
-
type:
|
41
|
+
type: 'tick';
|
42
42
|
critical?: boolean;
|
43
|
-
ease:
|
43
|
+
ease: 'out' | 'linear' | 'in' | 'inout' | 'outin';
|
44
44
|
};
|
45
|
-
export type USCConnectionAttachNote = Omit<BaseUSCObject,
|
46
|
-
type:
|
45
|
+
export type USCConnectionAttachNote = Omit<BaseUSCObject, 'timeScaleGroup'> & {
|
46
|
+
type: 'attach';
|
47
47
|
critical?: boolean;
|
48
48
|
timeScaleGroup?: number;
|
49
49
|
};
|
50
50
|
export type USCConnectionEndNote = BaseUSCNote & {
|
51
|
-
type:
|
51
|
+
type: 'end';
|
52
52
|
critical: boolean;
|
53
|
-
direction?:
|
54
|
-
judgeType:
|
53
|
+
direction?: 'left' | 'up' | 'right';
|
54
|
+
judgeType: 'normal' | 'trace' | 'none';
|
55
55
|
};
|
56
56
|
export type USCSlideNote = {
|
57
|
-
type:
|
57
|
+
type: 'slide';
|
58
58
|
critical: boolean;
|
59
59
|
connections: [
|
60
60
|
USCConnectionStartNote,
|
@@ -74,7 +74,7 @@ export declare const USCColor: {
|
|
74
74
|
};
|
75
75
|
export type USCColor = keyof typeof USCColor;
|
76
76
|
export type USCGuideMidpointNote = BaseUSCNote & {
|
77
|
-
ease:
|
77
|
+
ease: 'out' | 'linear' | 'in' | 'inout' | 'outin';
|
78
78
|
};
|
79
79
|
export declare const USCFade: {
|
80
80
|
in: number;
|
@@ -83,7 +83,7 @@ export declare const USCFade: {
|
|
83
83
|
};
|
84
84
|
export type USCFade = keyof typeof USCFade;
|
85
85
|
export type USCGuideNote = {
|
86
|
-
type:
|
86
|
+
type: 'guide';
|
87
87
|
color: USCColor;
|
88
88
|
fade: USCFade;
|
89
89
|
midpoints: USCGuideMidpointNote[];
|