@onjmin/dtm 0.1.82 → 0.1.84
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/README.md +1 -1
- package/dist/index.d.mts +160 -36
- package/dist/index.d.ts +160 -36
- package/dist/index.js +3554 -505
- package/dist/index.mjs +3547 -505
- package/dist/voice-worker.js +175 -13
- package/package.json +2 -2
package/dist/voice-worker.js
CHANGED
|
@@ -1,6 +1,135 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
(() => {
|
|
3
|
-
// node_modules/.pnpm/@onjmin+koe@1.0.
|
|
3
|
+
// node_modules/.pnpm/@onjmin+koe@1.0.5/node_modules/@onjmin/koe/dist/index.js
|
|
4
|
+
var u8 = Uint8Array;
|
|
5
|
+
var u16 = Uint16Array;
|
|
6
|
+
var i32 = Int32Array;
|
|
7
|
+
var fleb = new u8([
|
|
8
|
+
0,
|
|
9
|
+
0,
|
|
10
|
+
0,
|
|
11
|
+
0,
|
|
12
|
+
0,
|
|
13
|
+
0,
|
|
14
|
+
0,
|
|
15
|
+
0,
|
|
16
|
+
1,
|
|
17
|
+
1,
|
|
18
|
+
1,
|
|
19
|
+
1,
|
|
20
|
+
2,
|
|
21
|
+
2,
|
|
22
|
+
2,
|
|
23
|
+
2,
|
|
24
|
+
3,
|
|
25
|
+
3,
|
|
26
|
+
3,
|
|
27
|
+
3,
|
|
28
|
+
4,
|
|
29
|
+
4,
|
|
30
|
+
4,
|
|
31
|
+
4,
|
|
32
|
+
5,
|
|
33
|
+
5,
|
|
34
|
+
5,
|
|
35
|
+
5,
|
|
36
|
+
0,
|
|
37
|
+
/* unused */
|
|
38
|
+
0,
|
|
39
|
+
0,
|
|
40
|
+
/* impossible */
|
|
41
|
+
0
|
|
42
|
+
]);
|
|
43
|
+
var fdeb = new u8([
|
|
44
|
+
0,
|
|
45
|
+
0,
|
|
46
|
+
0,
|
|
47
|
+
0,
|
|
48
|
+
1,
|
|
49
|
+
1,
|
|
50
|
+
2,
|
|
51
|
+
2,
|
|
52
|
+
3,
|
|
53
|
+
3,
|
|
54
|
+
4,
|
|
55
|
+
4,
|
|
56
|
+
5,
|
|
57
|
+
5,
|
|
58
|
+
6,
|
|
59
|
+
6,
|
|
60
|
+
7,
|
|
61
|
+
7,
|
|
62
|
+
8,
|
|
63
|
+
8,
|
|
64
|
+
9,
|
|
65
|
+
9,
|
|
66
|
+
10,
|
|
67
|
+
10,
|
|
68
|
+
11,
|
|
69
|
+
11,
|
|
70
|
+
12,
|
|
71
|
+
12,
|
|
72
|
+
13,
|
|
73
|
+
13,
|
|
74
|
+
/* unused */
|
|
75
|
+
0,
|
|
76
|
+
0
|
|
77
|
+
]);
|
|
78
|
+
var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
|
|
79
|
+
var freb = function(eb, start) {
|
|
80
|
+
var b = new u16(31);
|
|
81
|
+
for (var i2 = 0; i2 < 31; ++i2) {
|
|
82
|
+
b[i2] = start += 1 << eb[i2 - 1];
|
|
83
|
+
}
|
|
84
|
+
var r = new i32(b[30]);
|
|
85
|
+
for (var i2 = 1; i2 < 30; ++i2) {
|
|
86
|
+
for (var j = b[i2]; j < b[i2 + 1]; ++j) {
|
|
87
|
+
r[j] = j - b[i2] << 5 | i2;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { b, r };
|
|
91
|
+
};
|
|
92
|
+
var _a = freb(fleb, 2);
|
|
93
|
+
var fl = _a.b;
|
|
94
|
+
var revfl = _a.r;
|
|
95
|
+
fl[28] = 258, revfl[258] = 28;
|
|
96
|
+
var _b = freb(fdeb, 0);
|
|
97
|
+
var fd = _b.b;
|
|
98
|
+
var revfd = _b.r;
|
|
99
|
+
var rev = new u16(32768);
|
|
100
|
+
for (i = 0; i < 32768; ++i) {
|
|
101
|
+
x = (i & 43690) >> 1 | (i & 21845) << 1;
|
|
102
|
+
x = (x & 52428) >> 2 | (x & 13107) << 2;
|
|
103
|
+
x = (x & 61680) >> 4 | (x & 3855) << 4;
|
|
104
|
+
rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
|
|
105
|
+
}
|
|
106
|
+
var x;
|
|
107
|
+
var i;
|
|
108
|
+
var flt = new u8(288);
|
|
109
|
+
for (i = 0; i < 144; ++i)
|
|
110
|
+
flt[i] = 8;
|
|
111
|
+
var i;
|
|
112
|
+
for (i = 144; i < 256; ++i)
|
|
113
|
+
flt[i] = 9;
|
|
114
|
+
var i;
|
|
115
|
+
for (i = 256; i < 280; ++i)
|
|
116
|
+
flt[i] = 7;
|
|
117
|
+
var i;
|
|
118
|
+
for (i = 280; i < 288; ++i)
|
|
119
|
+
flt[i] = 8;
|
|
120
|
+
var i;
|
|
121
|
+
var fdt = new u8(32);
|
|
122
|
+
for (i = 0; i < 32; ++i)
|
|
123
|
+
fdt[i] = 5;
|
|
124
|
+
var i;
|
|
125
|
+
var et = /* @__PURE__ */ new u8(0);
|
|
126
|
+
var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
|
|
127
|
+
var tds = 0;
|
|
128
|
+
try {
|
|
129
|
+
td.decode(et, { stream: true });
|
|
130
|
+
tds = 1;
|
|
131
|
+
} catch (e) {
|
|
132
|
+
}
|
|
4
133
|
var MAGIC = 1263486208;
|
|
5
134
|
function parseKoeHeader(headerBytes) {
|
|
6
135
|
const view = new DataView(headerBytes);
|
|
@@ -166,7 +295,7 @@
|
|
|
166
295
|
if (!buf) return null;
|
|
167
296
|
const int16 = new Int16Array(buf, 0, Math.floor(buf.byteLength / 2));
|
|
168
297
|
const f64 = new Float64Array(int16.length);
|
|
169
|
-
for (let
|
|
298
|
+
for (let i2 = 0; i2 < int16.length; i2++) f64[i2] = int16[i2] / 32768;
|
|
170
299
|
return f64;
|
|
171
300
|
}
|
|
172
301
|
};
|
|
@@ -174,6 +303,7 @@
|
|
|
174
303
|
var MIN_WORLDLINE_SAMPLES = 4096;
|
|
175
304
|
var SYNTH_REQ_SIZE = 120;
|
|
176
305
|
var WL_FRAME_MS = 10;
|
|
306
|
+
var sampleCurve = (input, curve, totalMs) => typeof curve === "function" ? curve(input, totalMs) : curve;
|
|
177
307
|
var samplesToMs = (samples) => samples / WORLDLINE_SAMPLE_RATE * 1e3;
|
|
178
308
|
function leadInFromEntry(entry) {
|
|
179
309
|
return {
|
|
@@ -259,11 +389,23 @@
|
|
|
259
389
|
* {@link MIN_WORLDLINE_SAMPLES} (too short for stable F0 analysis).
|
|
260
390
|
*/
|
|
261
391
|
renderNote(params) {
|
|
262
|
-
const {
|
|
392
|
+
const {
|
|
393
|
+
pcm,
|
|
394
|
+
pitch,
|
|
395
|
+
durationMs,
|
|
396
|
+
preMs,
|
|
397
|
+
consonantMs,
|
|
398
|
+
tempo = 120,
|
|
399
|
+
gender = 0.5,
|
|
400
|
+
tension = 0.5,
|
|
401
|
+
breathiness = 0.5,
|
|
402
|
+
voicing = 1
|
|
403
|
+
} = params;
|
|
263
404
|
if (!pcm || pcm.length < MIN_WORLDLINE_SAMPLES) return null;
|
|
264
405
|
const WL = this.wasm;
|
|
265
406
|
const FS = WORLDLINE_SAMPLE_RATE;
|
|
266
|
-
const
|
|
407
|
+
const basePitch = sampleCurve(preMs + durationMs / 2, pitch, preMs + durationMs);
|
|
408
|
+
const midiNote = Math.round(69 + 12 * Math.log2(basePitch / 440));
|
|
267
409
|
const posMs = 0;
|
|
268
410
|
const reqLen = preMs + durationMs;
|
|
269
411
|
const cutMs = WL_FRAME_MS * 2;
|
|
@@ -309,11 +451,19 @@
|
|
|
309
451
|
WL._free(reqPtr);
|
|
310
452
|
const totalMs = posMs + reqLen + WL_FRAME_MS * 2;
|
|
311
453
|
const nFrames = Math.ceil(totalMs / WL_FRAME_MS) + 4;
|
|
312
|
-
const f0Arr = new Float64Array(nFrames)
|
|
313
|
-
const gArr = new Float64Array(nFrames)
|
|
314
|
-
const tArr = new Float64Array(nFrames)
|
|
315
|
-
const bArr = new Float64Array(nFrames)
|
|
316
|
-
const vArr = new Float64Array(nFrames)
|
|
454
|
+
const f0Arr = new Float64Array(nFrames);
|
|
455
|
+
const gArr = new Float64Array(nFrames);
|
|
456
|
+
const tArr = new Float64Array(nFrames);
|
|
457
|
+
const bArr = new Float64Array(nFrames);
|
|
458
|
+
const vArr = new Float64Array(nFrames);
|
|
459
|
+
for (let i2 = 0; i2 < nFrames; i2++) {
|
|
460
|
+
const tMs = i2 * WL_FRAME_MS;
|
|
461
|
+
f0Arr[i2] = sampleCurve(tMs, pitch, totalMs);
|
|
462
|
+
gArr[i2] = sampleCurve(tMs, gender, totalMs);
|
|
463
|
+
tArr[i2] = sampleCurve(tMs, tension, totalMs);
|
|
464
|
+
bArr[i2] = sampleCurve(tMs, breathiness, totalMs);
|
|
465
|
+
vArr[i2] = sampleCurve(tMs, voicing, totalMs);
|
|
466
|
+
}
|
|
317
467
|
const f0Ptr = WL._malloc(nFrames * 8);
|
|
318
468
|
const gPtr = WL._malloc(nFrames * 8);
|
|
319
469
|
const tPtr = WL._malloc(nFrames * 8);
|
|
@@ -363,6 +513,18 @@
|
|
|
363
513
|
}
|
|
364
514
|
};
|
|
365
515
|
|
|
516
|
+
// src/vibrato.ts
|
|
517
|
+
var VIBRATO_RATE_HZ = 5.5;
|
|
518
|
+
var VIBRATO_DEPTH_CENTS = 35;
|
|
519
|
+
var VIBRATO_FADE_MS = 150;
|
|
520
|
+
var vibratoPitchCurve = (baseHz, preMs) => (tMs) => {
|
|
521
|
+
const sinceOnset = tMs - preMs;
|
|
522
|
+
if (sinceOnset <= 0) return baseHz;
|
|
523
|
+
const depth = VIBRATO_DEPTH_CENTS * Math.min(1, sinceOnset / VIBRATO_FADE_MS);
|
|
524
|
+
const cents = depth * Math.sin(2 * Math.PI * VIBRATO_RATE_HZ * sinceOnset / 1e3);
|
|
525
|
+
return baseHz * 2 ** (cents / 1200);
|
|
526
|
+
};
|
|
527
|
+
|
|
366
528
|
// src/voice-worker.ts
|
|
367
529
|
var KOE_SAMPLE_RATE = 48e3;
|
|
368
530
|
var midiToFreq = (m) => 440 * 2 ** ((m - 69) / 12);
|
|
@@ -378,7 +540,7 @@
|
|
|
378
540
|
}
|
|
379
541
|
return p;
|
|
380
542
|
};
|
|
381
|
-
var renderAlias = async (alias, pitch, durationMs) => {
|
|
543
|
+
var renderAlias = async (alias, pitch, durationMs, vibrato) => {
|
|
382
544
|
if (!bank) return null;
|
|
383
545
|
const pcm = await getPcm(alias);
|
|
384
546
|
if (!pcm || pcm.length === 0) return null;
|
|
@@ -388,7 +550,7 @@
|
|
|
388
550
|
if (worldline) {
|
|
389
551
|
const audio = worldline.renderNote({
|
|
390
552
|
pcm,
|
|
391
|
-
pitch: targetHz,
|
|
553
|
+
pitch: vibrato ? vibratoPitchCurve(targetHz, lead.preMs) : targetHz,
|
|
392
554
|
durationMs,
|
|
393
555
|
...lead
|
|
394
556
|
});
|
|
@@ -422,9 +584,9 @@
|
|
|
422
584
|
return;
|
|
423
585
|
}
|
|
424
586
|
if (msg.type === "render") {
|
|
425
|
-
const { id, alias, pitch, durationMs } = msg;
|
|
587
|
+
const { id, alias, pitch, durationMs, vibrato } = msg;
|
|
426
588
|
try {
|
|
427
|
-
const out = await renderAlias(alias, pitch, durationMs);
|
|
589
|
+
const out = await renderAlias(alias, pitch, durationMs, vibrato);
|
|
428
590
|
if (out) {
|
|
429
591
|
wself.postMessage(
|
|
430
592
|
{
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"author": "onjmin",
|
|
3
3
|
"license": "MIT",
|
|
4
4
|
"name": "@onjmin/dtm",
|
|
5
|
-
"version": "0.1.
|
|
5
|
+
"version": "0.1.84",
|
|
6
6
|
"description": "MMLを中間言語に用いた、モバイルファーストなDAW / ピアノロール打ち込みコンポーネント",
|
|
7
7
|
"homepage": "https://onjmin.github.io/dtm",
|
|
8
8
|
"repository": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@onjmin/chord-parser": "1.0.4",
|
|
58
|
-
"@onjmin/koe": "1.0.
|
|
58
|
+
"@onjmin/koe": "1.0.5",
|
|
59
59
|
"midi-json-parser": "8.1.74"
|
|
60
60
|
},
|
|
61
61
|
"scripts": {
|