@onjmin/dtm 0.1.93 → 0.1.95
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/index.js +52 -4
- package/dist/index.mjs +52 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2368,7 +2368,7 @@ var kanaTable = {
|
|
|
2368
2368
|
\u307D: ["p", "o"],
|
|
2369
2369
|
\u3093: ["N", "N"]
|
|
2370
2370
|
};
|
|
2371
|
-
var SMALL_KANA = "\u3041\u3043\u3045\u3047\u3049\u3083\u3085\u3087
|
|
2371
|
+
var SMALL_KANA = "\u3041\u3043\u3045\u3047\u3049\u3083\u3085\u3087";
|
|
2372
2372
|
var VOWEL_KANA = {
|
|
2373
2373
|
a: "\u3042",
|
|
2374
2374
|
i: "\u3044",
|
|
@@ -2376,7 +2376,7 @@ var VOWEL_KANA = {
|
|
|
2376
2376
|
e: "\u3048",
|
|
2377
2377
|
o: "\u304A"
|
|
2378
2378
|
};
|
|
2379
|
-
var sanitizeText = (text) => text.normalize("NFKC").replace(/[ァ-ヶ]/g, (c) => String.fromCharCode(c.charCodeAt(0) - 96)).replace(/[
|
|
2379
|
+
var sanitizeText = (text) => text.normalize("NFKC").replace(/[ァ-ヶ]/g, (c) => String.fromCharCode(c.charCodeAt(0) - 96)).replace(/[っー]/g, "").replace(/[^ぁ-ゖ]/g, "");
|
|
2380
2380
|
var splitSyllables = (text) => {
|
|
2381
2381
|
const result = [];
|
|
2382
2382
|
for (const ch of text) {
|
|
@@ -2408,7 +2408,7 @@ var analyzeSyllable = (syllable) => {
|
|
|
2408
2408
|
const row = kanaTable[head];
|
|
2409
2409
|
const consonant = row ? row[0] : "";
|
|
2410
2410
|
let vowel = row ? row[1] : kanaToVowel(head);
|
|
2411
|
-
if (syllable.length === 2
|
|
2411
|
+
if (syllable.length === 2) {
|
|
2412
2412
|
const v = kanaToVowel(syllable[1]);
|
|
2413
2413
|
if (v) vowel = v;
|
|
2414
2414
|
}
|
|
@@ -11534,7 +11534,7 @@ var buildUI = (target, options) => {
|
|
|
11534
11534
|
<span class="dtm-label" data-dtm="master-volume-label">50%</span>
|
|
11535
11535
|
</div>
|
|
11536
11536
|
<div class="dtm-row">
|
|
11537
|
-
<button class="dtm-btn dtm-btn--ghost dtm-btn--xs" data-dtm="auto-master" title="\u97F3\u5727\u30FB\u30B9\u30C6\u30EC\u30AA\u5E45\u30FB\u30EA\u30D0\u30FC\u30D6\
|
|
11537
|
+
<button class="dtm-btn dtm-btn--ghost dtm-btn--xs" data-dtm="auto-master" title="\u97F3\u5727\u30FB\u30B9\u30C6\u30EC\u30AA\u5E45\u30FB\u30EA\u30D0\u30FC\u30D6\u306B\u52A0\u3048\u3001\u5404\u30C8\u30E9\u30C3\u30AF\u306E\u697D\u5668\u30FB\u97F3\u91CF\u3082\u81EA\u52D5\u63A8\u5B9A\u3057\u3066\u4E00\u62EC\u8A2D\u5B9A\u3057\u307E\u3059">\u304A\u307E\u304B\u305B\u30DE\u30B9\u30BF\u30EA\u30F3\u30B0</button>
|
|
11538
11538
|
<button class="dtm-infobtn" data-dtm="auto-master-info" title="\u304A\u307E\u304B\u305B\u30DE\u30B9\u30BF\u30EA\u30F3\u30B0\u306E\u89E3\u8AAC">${icon("info", 12)}</button>
|
|
11539
11539
|
<span class="dtm-grow"></span>
|
|
11540
11540
|
</div>
|
|
@@ -13655,6 +13655,15 @@ var AUTO_MASTER_INFO_HTML = `
|
|
|
13655
13655
|
<li>\u5168\u30C8\u30E9\u30C3\u30AF\u306E\u30B9\u30C6\u30EC\u30AA\u5E45: 115%\uFF08\u308F\u305A\u304B\u306B\u5E83\u3052\u308B\uFF09</li>
|
|
13656
13656
|
<li>\u6B4C\u8A5E\u306E\u3042\u308B\u30C8\u30E9\u30C3\u30AF: \u81EA\u52D5\u30D3\u30D6\u30E9\u30FC\u30C8ON</li>
|
|
13657
13657
|
</ul>
|
|
13658
|
+
<h4>\u697D\u5668\u30FB\u97F3\u91CF\u306E\u81EA\u52D5\u5272\u308A\u5F53\u3066</h4>
|
|
13659
|
+
<p>\u6B4C\u8A5E\u306E\u306A\u3044\u30C8\u30E9\u30C3\u30AF\u306F\u3001\u7F6E\u304B\u308C\u3066\u3044\u308B\u30CE\u30FC\u30C8\u306E\u97F3\u9AD8\u30FB\u30BF\u30A4\u30DF\u30F3\u30B0\u30FB\u548C\u97F3\u306E\u539A\u307F\u304B\u3089\u5F79\u5272\u3092\u63A8\u5B9A\u3057\u3001\u697D\u5668\u3068\u97F3\u91CF\u3092\u81EA\u52D5\u3067\u5F53\u3066\u307E\u3059\u3002</p>
|
|
13660
|
+
<ul>
|
|
13661
|
+
<li><strong>\u4F4E\u97F3\u57DF\uFF08C3\u672A\u6E80\uFF09\u304C\u4E2D\u5FC3</strong> \u2192 \u30D9\u30FC\u30B9\u697D\u5668\u30FB\u97F3\u91CF85</li>
|
|
13662
|
+
<li><strong>\u548C\u97F3\uFF08\u540C\u6642\u767A\u97F3\uFF09\u304C\u591A\u304F\u97F3\u4FA1\u3082\u9577\u3044</strong> \u2192 \u4F34\u594F\uFF08\u30B3\u30FC\u30C9/\u30D1\u30C3\u30C9\uFF09\u697D\u5668\u30FB\u97F3\u91CF72</li>
|
|
13663
|
+
<li><strong>\u5358\u97F3\u3067\u97F3\u6570\u304C\u5C11\u306A\u304F\u97F3\u4FA1\u304C\u9577\u3044</strong> \u2192 \u30B5\u30D6\u30E1\u30ED\uFF08\u30AA\u30D6\u30EA\u30AC\u30FC\u30C8\u5BC4\u308A\uFF09\u697D\u5668\u30FB\u97F3\u91CF92</li>
|
|
13664
|
+
<li><strong>\u305D\u308C\u4EE5\u5916\uFF08\u5358\u97F3\u3067\u52D5\u304D\u304C\u591A\u3044\uFF09</strong> \u2192 \u30E1\u30ED\u30C7\u30A3\u697D\u5668\u30FB\u97F3\u91CF100</li>
|
|
13665
|
+
</ul>
|
|
13666
|
+
<p style="margin-top:4px;"><small>\u697D\u5668\u540D\u306F\u73FE\u5728\u9078\u629E\u4E2D\u306E\u697D\u5668\u30D7\u30EA\u30BB\u30C3\u30C8\uFF08\u672A\u9078\u629E\u306A\u3089\u30B0\u30E9\u30F3\u30C9\u30D4\u30A2\u30CE\uFF09\u304B\u3089\u5F79\u5272\u306B\u5BFE\u5FDC\u3059\u308B\u3082\u306E\u3092\u5F15\u304D\u307E\u3059\u3002\u97F3\u306E\u5C11\u306A\u3044\u30C8\u30E9\u30C3\u30AF\uFF08\u7121\u97F3\uFF09\u306F\u5224\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u5BFE\u8C61\u5916\u3067\u3059\u3002\u3042\u304F\u307E\u3067\u81EA\u52D5\u63A8\u5B9A\u306A\u306E\u3067\u3001\u610F\u56F3\u3068\u9055\u3046\u5834\u5408\u306F\u5404\u30C8\u30E9\u30C3\u30AF\u306E\u300C\u697D\u5668\u300D\u6B04\u304B\u3089\u500B\u5225\u306B\u9078\u3073\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002</small></p>
|
|
13658
13667
|
<h4>\u30E1\u30A4\u30F3\u30DC\u30FC\u30AB\u30EB\u306E\u81EA\u52D5\u5224\u5B9A</h4>
|
|
13659
13668
|
<p>\u6B4C\u8A5E\u306E\u3042\u308B\u30C8\u30E9\u30C3\u30AF\u304C\u8907\u6570\u3042\u308B\u5834\u5408\uFF08\u30CF\u30E2\u30EA\u30FB\u30B3\u30FC\u30E9\u30B9\u30FB\u639B\u3051\u58F0\u7B49\uFF09\u3001\u767A\u97F3\u6642\u9593\u304C\u6700\u3082\u9577\u3044\u30C8\u30E9\u30C3\u30AF\u3092\u300C\u30E1\u30A4\u30F3\u30DC\u30FC\u30AB\u30EB\u300D\u3068\u307F\u306A\u3057\u3001\u4ED6\u3068\u306F\u9055\u3046\u6271\u3044\u306B\u3057\u307E\u3059\u3002</p>
|
|
13660
13669
|
<ul>
|
|
@@ -13905,6 +13914,31 @@ var normalizeInstrumentName = (name) => {
|
|
|
13905
13914
|
(n) => n.replace(/\s+/g, "").toLowerCase() === stripped
|
|
13906
13915
|
) ?? name;
|
|
13907
13916
|
};
|
|
13917
|
+
var AUTO_ROLE_STEPS_PER_BEAT = 48;
|
|
13918
|
+
var AUTO_ROLE_VOLUME = {
|
|
13919
|
+
melody: 100,
|
|
13920
|
+
submelody: 92,
|
|
13921
|
+
bass: 85,
|
|
13922
|
+
chord: 72
|
|
13923
|
+
};
|
|
13924
|
+
var classifyTrackRole = (notes) => {
|
|
13925
|
+
const avgPitch = notes.reduce((s, n) => s + n.pitch, 0) / notes.length;
|
|
13926
|
+
if (avgPitch < 48) return "bass";
|
|
13927
|
+
const avgDur = notes.reduce((s, n) => s + n.durationSteps, 0) / notes.length;
|
|
13928
|
+
const byStart = /* @__PURE__ */ new Map();
|
|
13929
|
+
for (const n of notes)
|
|
13930
|
+
byStart.set(n.startStep, (byStart.get(n.startStep) ?? 0) + 1);
|
|
13931
|
+
let maxPoly = 0;
|
|
13932
|
+
for (const c of byStart.values()) if (c > maxPoly) maxPoly = c;
|
|
13933
|
+
if (maxPoly >= 2 && avgDur >= AUTO_ROLE_STEPS_PER_BEAT) return "chord";
|
|
13934
|
+
const minStart = Math.min(...notes.map((n) => n.startStep));
|
|
13935
|
+
const maxEnd = Math.max(...notes.map((n) => n.startStep + n.durationSteps));
|
|
13936
|
+
const spanBeats = Math.max(1, (maxEnd - minStart) / AUTO_ROLE_STEPS_PER_BEAT);
|
|
13937
|
+
const notesPerBeat = notes.length / spanBeats;
|
|
13938
|
+
if (notesPerBeat < 1.2 && avgDur >= AUTO_ROLE_STEPS_PER_BEAT * 1.5)
|
|
13939
|
+
return "submelody";
|
|
13940
|
+
return "melody";
|
|
13941
|
+
};
|
|
13908
13942
|
var mountDAW = (target, options = {}) => {
|
|
13909
13943
|
injectStyles();
|
|
13910
13944
|
const getAudioTime = options.getAudioTime ?? (() => performance.now() / 1e3);
|
|
@@ -16681,6 +16715,20 @@ var mountDAW = (target, options = {}) => {
|
|
|
16681
16715
|
mainVocalId = t.config.id;
|
|
16682
16716
|
}
|
|
16683
16717
|
}
|
|
16718
|
+
const autoPreset = INSTRUMENT_PRESETS[currentInstrument] ?? INSTRUMENT_PRESETS.piano;
|
|
16719
|
+
for (const t of trackStates) {
|
|
16720
|
+
if (t.lyricModel) continue;
|
|
16721
|
+
const notes = t.core.getNotes();
|
|
16722
|
+
if (notes.length === 0) continue;
|
|
16723
|
+
const role = classifyTrackRole(notes);
|
|
16724
|
+
const instName = autoPreset[role];
|
|
16725
|
+
t.trackInstrument = instName;
|
|
16726
|
+
const trackIndex = trackStates.indexOf(t);
|
|
16727
|
+
options.onTrackInstrumentChange?.(trackIndex, instName);
|
|
16728
|
+
const vol = AUTO_ROLE_VOLUME[role];
|
|
16729
|
+
t.volume = vol;
|
|
16730
|
+
t.core.setVolume(vol);
|
|
16731
|
+
}
|
|
16684
16732
|
for (const t of trackStates) {
|
|
16685
16733
|
const isMainVocal = !!t.lyricModel && t.config.id === mainVocalId;
|
|
16686
16734
|
const comp = !t.lyricModel ? 35 : isMainVocal ? 30 : 25;
|
package/dist/index.mjs
CHANGED
|
@@ -2237,7 +2237,7 @@ var kanaTable = {
|
|
|
2237
2237
|
\u307D: ["p", "o"],
|
|
2238
2238
|
\u3093: ["N", "N"]
|
|
2239
2239
|
};
|
|
2240
|
-
var SMALL_KANA = "\u3041\u3043\u3045\u3047\u3049\u3083\u3085\u3087
|
|
2240
|
+
var SMALL_KANA = "\u3041\u3043\u3045\u3047\u3049\u3083\u3085\u3087";
|
|
2241
2241
|
var VOWEL_KANA = {
|
|
2242
2242
|
a: "\u3042",
|
|
2243
2243
|
i: "\u3044",
|
|
@@ -2245,7 +2245,7 @@ var VOWEL_KANA = {
|
|
|
2245
2245
|
e: "\u3048",
|
|
2246
2246
|
o: "\u304A"
|
|
2247
2247
|
};
|
|
2248
|
-
var sanitizeText = (text) => text.normalize("NFKC").replace(/[ァ-ヶ]/g, (c) => String.fromCharCode(c.charCodeAt(0) - 96)).replace(/[
|
|
2248
|
+
var sanitizeText = (text) => text.normalize("NFKC").replace(/[ァ-ヶ]/g, (c) => String.fromCharCode(c.charCodeAt(0) - 96)).replace(/[っー]/g, "").replace(/[^ぁ-ゖ]/g, "");
|
|
2249
2249
|
var splitSyllables = (text) => {
|
|
2250
2250
|
const result = [];
|
|
2251
2251
|
for (const ch of text) {
|
|
@@ -2277,7 +2277,7 @@ var analyzeSyllable = (syllable) => {
|
|
|
2277
2277
|
const row = kanaTable[head];
|
|
2278
2278
|
const consonant = row ? row[0] : "";
|
|
2279
2279
|
let vowel = row ? row[1] : kanaToVowel(head);
|
|
2280
|
-
if (syllable.length === 2
|
|
2280
|
+
if (syllable.length === 2) {
|
|
2281
2281
|
const v = kanaToVowel(syllable[1]);
|
|
2282
2282
|
if (v) vowel = v;
|
|
2283
2283
|
}
|
|
@@ -11403,7 +11403,7 @@ var buildUI = (target, options) => {
|
|
|
11403
11403
|
<span class="dtm-label" data-dtm="master-volume-label">50%</span>
|
|
11404
11404
|
</div>
|
|
11405
11405
|
<div class="dtm-row">
|
|
11406
|
-
<button class="dtm-btn dtm-btn--ghost dtm-btn--xs" data-dtm="auto-master" title="\u97F3\u5727\u30FB\u30B9\u30C6\u30EC\u30AA\u5E45\u30FB\u30EA\u30D0\u30FC\u30D6\
|
|
11406
|
+
<button class="dtm-btn dtm-btn--ghost dtm-btn--xs" data-dtm="auto-master" title="\u97F3\u5727\u30FB\u30B9\u30C6\u30EC\u30AA\u5E45\u30FB\u30EA\u30D0\u30FC\u30D6\u306B\u52A0\u3048\u3001\u5404\u30C8\u30E9\u30C3\u30AF\u306E\u697D\u5668\u30FB\u97F3\u91CF\u3082\u81EA\u52D5\u63A8\u5B9A\u3057\u3066\u4E00\u62EC\u8A2D\u5B9A\u3057\u307E\u3059">\u304A\u307E\u304B\u305B\u30DE\u30B9\u30BF\u30EA\u30F3\u30B0</button>
|
|
11407
11407
|
<button class="dtm-infobtn" data-dtm="auto-master-info" title="\u304A\u307E\u304B\u305B\u30DE\u30B9\u30BF\u30EA\u30F3\u30B0\u306E\u89E3\u8AAC">${icon("info", 12)}</button>
|
|
11408
11408
|
<span class="dtm-grow"></span>
|
|
11409
11409
|
</div>
|
|
@@ -13524,6 +13524,15 @@ var AUTO_MASTER_INFO_HTML = `
|
|
|
13524
13524
|
<li>\u5168\u30C8\u30E9\u30C3\u30AF\u306E\u30B9\u30C6\u30EC\u30AA\u5E45: 115%\uFF08\u308F\u305A\u304B\u306B\u5E83\u3052\u308B\uFF09</li>
|
|
13525
13525
|
<li>\u6B4C\u8A5E\u306E\u3042\u308B\u30C8\u30E9\u30C3\u30AF: \u81EA\u52D5\u30D3\u30D6\u30E9\u30FC\u30C8ON</li>
|
|
13526
13526
|
</ul>
|
|
13527
|
+
<h4>\u697D\u5668\u30FB\u97F3\u91CF\u306E\u81EA\u52D5\u5272\u308A\u5F53\u3066</h4>
|
|
13528
|
+
<p>\u6B4C\u8A5E\u306E\u306A\u3044\u30C8\u30E9\u30C3\u30AF\u306F\u3001\u7F6E\u304B\u308C\u3066\u3044\u308B\u30CE\u30FC\u30C8\u306E\u97F3\u9AD8\u30FB\u30BF\u30A4\u30DF\u30F3\u30B0\u30FB\u548C\u97F3\u306E\u539A\u307F\u304B\u3089\u5F79\u5272\u3092\u63A8\u5B9A\u3057\u3001\u697D\u5668\u3068\u97F3\u91CF\u3092\u81EA\u52D5\u3067\u5F53\u3066\u307E\u3059\u3002</p>
|
|
13529
|
+
<ul>
|
|
13530
|
+
<li><strong>\u4F4E\u97F3\u57DF\uFF08C3\u672A\u6E80\uFF09\u304C\u4E2D\u5FC3</strong> \u2192 \u30D9\u30FC\u30B9\u697D\u5668\u30FB\u97F3\u91CF85</li>
|
|
13531
|
+
<li><strong>\u548C\u97F3\uFF08\u540C\u6642\u767A\u97F3\uFF09\u304C\u591A\u304F\u97F3\u4FA1\u3082\u9577\u3044</strong> \u2192 \u4F34\u594F\uFF08\u30B3\u30FC\u30C9/\u30D1\u30C3\u30C9\uFF09\u697D\u5668\u30FB\u97F3\u91CF72</li>
|
|
13532
|
+
<li><strong>\u5358\u97F3\u3067\u97F3\u6570\u304C\u5C11\u306A\u304F\u97F3\u4FA1\u304C\u9577\u3044</strong> \u2192 \u30B5\u30D6\u30E1\u30ED\uFF08\u30AA\u30D6\u30EA\u30AC\u30FC\u30C8\u5BC4\u308A\uFF09\u697D\u5668\u30FB\u97F3\u91CF92</li>
|
|
13533
|
+
<li><strong>\u305D\u308C\u4EE5\u5916\uFF08\u5358\u97F3\u3067\u52D5\u304D\u304C\u591A\u3044\uFF09</strong> \u2192 \u30E1\u30ED\u30C7\u30A3\u697D\u5668\u30FB\u97F3\u91CF100</li>
|
|
13534
|
+
</ul>
|
|
13535
|
+
<p style="margin-top:4px;"><small>\u697D\u5668\u540D\u306F\u73FE\u5728\u9078\u629E\u4E2D\u306E\u697D\u5668\u30D7\u30EA\u30BB\u30C3\u30C8\uFF08\u672A\u9078\u629E\u306A\u3089\u30B0\u30E9\u30F3\u30C9\u30D4\u30A2\u30CE\uFF09\u304B\u3089\u5F79\u5272\u306B\u5BFE\u5FDC\u3059\u308B\u3082\u306E\u3092\u5F15\u304D\u307E\u3059\u3002\u97F3\u306E\u5C11\u306A\u3044\u30C8\u30E9\u30C3\u30AF\uFF08\u7121\u97F3\uFF09\u306F\u5224\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u5BFE\u8C61\u5916\u3067\u3059\u3002\u3042\u304F\u307E\u3067\u81EA\u52D5\u63A8\u5B9A\u306A\u306E\u3067\u3001\u610F\u56F3\u3068\u9055\u3046\u5834\u5408\u306F\u5404\u30C8\u30E9\u30C3\u30AF\u306E\u300C\u697D\u5668\u300D\u6B04\u304B\u3089\u500B\u5225\u306B\u9078\u3073\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002</small></p>
|
|
13527
13536
|
<h4>\u30E1\u30A4\u30F3\u30DC\u30FC\u30AB\u30EB\u306E\u81EA\u52D5\u5224\u5B9A</h4>
|
|
13528
13537
|
<p>\u6B4C\u8A5E\u306E\u3042\u308B\u30C8\u30E9\u30C3\u30AF\u304C\u8907\u6570\u3042\u308B\u5834\u5408\uFF08\u30CF\u30E2\u30EA\u30FB\u30B3\u30FC\u30E9\u30B9\u30FB\u639B\u3051\u58F0\u7B49\uFF09\u3001\u767A\u97F3\u6642\u9593\u304C\u6700\u3082\u9577\u3044\u30C8\u30E9\u30C3\u30AF\u3092\u300C\u30E1\u30A4\u30F3\u30DC\u30FC\u30AB\u30EB\u300D\u3068\u307F\u306A\u3057\u3001\u4ED6\u3068\u306F\u9055\u3046\u6271\u3044\u306B\u3057\u307E\u3059\u3002</p>
|
|
13529
13538
|
<ul>
|
|
@@ -13774,6 +13783,31 @@ var normalizeInstrumentName = (name) => {
|
|
|
13774
13783
|
(n) => n.replace(/\s+/g, "").toLowerCase() === stripped
|
|
13775
13784
|
) ?? name;
|
|
13776
13785
|
};
|
|
13786
|
+
var AUTO_ROLE_STEPS_PER_BEAT = 48;
|
|
13787
|
+
var AUTO_ROLE_VOLUME = {
|
|
13788
|
+
melody: 100,
|
|
13789
|
+
submelody: 92,
|
|
13790
|
+
bass: 85,
|
|
13791
|
+
chord: 72
|
|
13792
|
+
};
|
|
13793
|
+
var classifyTrackRole = (notes) => {
|
|
13794
|
+
const avgPitch = notes.reduce((s, n) => s + n.pitch, 0) / notes.length;
|
|
13795
|
+
if (avgPitch < 48) return "bass";
|
|
13796
|
+
const avgDur = notes.reduce((s, n) => s + n.durationSteps, 0) / notes.length;
|
|
13797
|
+
const byStart = /* @__PURE__ */ new Map();
|
|
13798
|
+
for (const n of notes)
|
|
13799
|
+
byStart.set(n.startStep, (byStart.get(n.startStep) ?? 0) + 1);
|
|
13800
|
+
let maxPoly = 0;
|
|
13801
|
+
for (const c of byStart.values()) if (c > maxPoly) maxPoly = c;
|
|
13802
|
+
if (maxPoly >= 2 && avgDur >= AUTO_ROLE_STEPS_PER_BEAT) return "chord";
|
|
13803
|
+
const minStart = Math.min(...notes.map((n) => n.startStep));
|
|
13804
|
+
const maxEnd = Math.max(...notes.map((n) => n.startStep + n.durationSteps));
|
|
13805
|
+
const spanBeats = Math.max(1, (maxEnd - minStart) / AUTO_ROLE_STEPS_PER_BEAT);
|
|
13806
|
+
const notesPerBeat = notes.length / spanBeats;
|
|
13807
|
+
if (notesPerBeat < 1.2 && avgDur >= AUTO_ROLE_STEPS_PER_BEAT * 1.5)
|
|
13808
|
+
return "submelody";
|
|
13809
|
+
return "melody";
|
|
13810
|
+
};
|
|
13777
13811
|
var mountDAW = (target, options = {}) => {
|
|
13778
13812
|
injectStyles();
|
|
13779
13813
|
const getAudioTime = options.getAudioTime ?? (() => performance.now() / 1e3);
|
|
@@ -16550,6 +16584,20 @@ var mountDAW = (target, options = {}) => {
|
|
|
16550
16584
|
mainVocalId = t.config.id;
|
|
16551
16585
|
}
|
|
16552
16586
|
}
|
|
16587
|
+
const autoPreset = INSTRUMENT_PRESETS[currentInstrument] ?? INSTRUMENT_PRESETS.piano;
|
|
16588
|
+
for (const t of trackStates) {
|
|
16589
|
+
if (t.lyricModel) continue;
|
|
16590
|
+
const notes = t.core.getNotes();
|
|
16591
|
+
if (notes.length === 0) continue;
|
|
16592
|
+
const role = classifyTrackRole(notes);
|
|
16593
|
+
const instName = autoPreset[role];
|
|
16594
|
+
t.trackInstrument = instName;
|
|
16595
|
+
const trackIndex = trackStates.indexOf(t);
|
|
16596
|
+
options.onTrackInstrumentChange?.(trackIndex, instName);
|
|
16597
|
+
const vol = AUTO_ROLE_VOLUME[role];
|
|
16598
|
+
t.volume = vol;
|
|
16599
|
+
t.core.setVolume(vol);
|
|
16600
|
+
}
|
|
16553
16601
|
for (const t of trackStates) {
|
|
16554
16602
|
const isMainVocal = !!t.lyricModel && t.config.id === mainVocalId;
|
|
16555
16603
|
const comp = !t.lyricModel ? 35 : isMainVocal ? 30 : 25;
|
package/package.json
CHANGED