@onjmin/dtm 0.1.22 → 0.1.23
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.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +73 -16
- package/dist/index.mjs +73 -16
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1106,12 +1106,14 @@ type MmlMeta = {
|
|
|
1106
1106
|
drum?: string;
|
|
1107
1107
|
/** 全体音量(0-100等) */
|
|
1108
1108
|
volume?: number;
|
|
1109
|
+
/** DAWの動作モード(simple | advanced) */
|
|
1110
|
+
mode?: "simple" | "advanced";
|
|
1109
1111
|
};
|
|
1110
1112
|
/** MMLからトップレベル宣言を抽出する */
|
|
1111
1113
|
declare const parseMmlMeta: (mml: string) => MmlMeta;
|
|
1112
1114
|
/** MMLからトップレベル宣言を取り除く(ノート解析が誤解釈しないように) */
|
|
1113
1115
|
declare const stripMmlMeta: (mml: string) => string;
|
|
1114
|
-
/** メタ情報を `#inst=… #drum=… #volume=…` のMML宣言文字列へ直列化する(空なら空文字) */
|
|
1116
|
+
/** メタ情報を `#inst=… #drum=… #volume=… #mode=…` のMML宣言文字列へ直列化する(空なら空文字) */
|
|
1115
1117
|
declare const formatMmlMeta: (meta: MmlMeta) => string;
|
|
1116
1118
|
type MMLNotePlacement = {
|
|
1117
1119
|
/** 0:melody 1:submelody 2:bass 3:chord */
|
package/dist/index.d.ts
CHANGED
|
@@ -1106,12 +1106,14 @@ type MmlMeta = {
|
|
|
1106
1106
|
drum?: string;
|
|
1107
1107
|
/** 全体音量(0-100等) */
|
|
1108
1108
|
volume?: number;
|
|
1109
|
+
/** DAWの動作モード(simple | advanced) */
|
|
1110
|
+
mode?: "simple" | "advanced";
|
|
1109
1111
|
};
|
|
1110
1112
|
/** MMLからトップレベル宣言を抽出する */
|
|
1111
1113
|
declare const parseMmlMeta: (mml: string) => MmlMeta;
|
|
1112
1114
|
/** MMLからトップレベル宣言を取り除く(ノート解析が誤解釈しないように) */
|
|
1113
1115
|
declare const stripMmlMeta: (mml: string) => string;
|
|
1114
|
-
/** メタ情報を `#inst=… #drum=… #volume=…` のMML宣言文字列へ直列化する(空なら空文字) */
|
|
1116
|
+
/** メタ情報を `#inst=… #drum=… #volume=… #mode=…` のMML宣言文字列へ直列化する(空なら空文字) */
|
|
1115
1117
|
declare const formatMmlMeta: (meta: MmlMeta) => string;
|
|
1116
1118
|
type MMLNotePlacement = {
|
|
1117
1119
|
/** 0:melody 1:submelody 2:bass 3:chord */
|
package/dist/index.js
CHANGED
|
@@ -4028,7 +4028,7 @@ var PITCH_MAP2 = {
|
|
|
4028
4028
|
b: 11
|
|
4029
4029
|
};
|
|
4030
4030
|
var clamp2 = (value, lo, hi) => Math.min(hi, Math.max(lo, value));
|
|
4031
|
-
var META_DIRECTIVE = /#(inst|drum|volume)=([\w-]+)/gi;
|
|
4031
|
+
var META_DIRECTIVE = /#(inst|drum|volume|mode)=([\w-]+)/gi;
|
|
4032
4032
|
var parseMmlMeta = (mml) => {
|
|
4033
4033
|
const meta = {};
|
|
4034
4034
|
for (const m of mml.matchAll(META_DIRECTIVE)) {
|
|
@@ -4038,6 +4038,10 @@ var parseMmlMeta = (mml) => {
|
|
|
4038
4038
|
else if (key === "volume") {
|
|
4039
4039
|
const v = Number.parseInt(m[2], 10);
|
|
4040
4040
|
if (!Number.isNaN(v)) meta.volume = v;
|
|
4041
|
+
} else if (key === "mode") {
|
|
4042
|
+
if (m[2] === "simple" || m[2] === "advanced") {
|
|
4043
|
+
meta.mode = m[2];
|
|
4044
|
+
}
|
|
4041
4045
|
}
|
|
4042
4046
|
}
|
|
4043
4047
|
return meta;
|
|
@@ -4048,6 +4052,7 @@ var formatMmlMeta = (meta) => {
|
|
|
4048
4052
|
if (meta.instrument) parts.push(`#inst=${meta.instrument}`);
|
|
4049
4053
|
if (meta.drum) parts.push(`#drum=${meta.drum}`);
|
|
4050
4054
|
if (meta.volume !== void 0) parts.push(`#volume=${meta.volume}`);
|
|
4055
|
+
if (meta.mode) parts.push(`#mode=${meta.mode}`);
|
|
4051
4056
|
return parts.join(" ");
|
|
4052
4057
|
};
|
|
4053
4058
|
var parseMML = (mml, options = {}) => {
|
|
@@ -4083,7 +4088,8 @@ var parseMML = (mml, options = {}) => {
|
|
|
4083
4088
|
const part = rawPart.trim();
|
|
4084
4089
|
if (part.startsWith("@")) {
|
|
4085
4090
|
let idx = Number.parseInt(part.substring(1), 10);
|
|
4086
|
-
if (clampTrackCount !== void 0 && idx >= clampTrackCount)
|
|
4091
|
+
if (clampTrackCount !== void 0 && idx >= clampTrackCount)
|
|
4092
|
+
idx = clampTrackCount - 1;
|
|
4087
4093
|
trackIndex = idx;
|
|
4088
4094
|
octave = 4;
|
|
4089
4095
|
currentStep = 0;
|
|
@@ -7611,7 +7617,8 @@ var mountDAW = (target, options = {}) => {
|
|
|
7611
7617
|
const metaLine = formatMmlMeta({
|
|
7612
7618
|
instrument: currentInstrument || void 0,
|
|
7613
7619
|
drum: currentDrumPattern !== "none" ? currentDrumPattern : void 0,
|
|
7614
|
-
volume: masterVolume
|
|
7620
|
+
volume: masterVolume,
|
|
7621
|
+
mode
|
|
7615
7622
|
});
|
|
7616
7623
|
if (refs.decomposeChordToggle.checked) {
|
|
7617
7624
|
const ignoreHeavy = refs.ignoreChordHeavyToggle.checked;
|
|
@@ -9157,32 +9164,56 @@ var createDtmStudio = async (options = {}) => {
|
|
|
9157
9164
|
return p;
|
|
9158
9165
|
};
|
|
9159
9166
|
const defaultPreset = options.defaultPreset ?? "retro_game";
|
|
9167
|
+
const getRoleForTrackIndex = (idx, mode = "simple") => {
|
|
9168
|
+
if (mode === "simple") {
|
|
9169
|
+
if (idx === 0) return "melody";
|
|
9170
|
+
if (idx === 1) return "submelody";
|
|
9171
|
+
if (idx === 2) return "bass";
|
|
9172
|
+
return "chord";
|
|
9173
|
+
} else {
|
|
9174
|
+
return TRACK_ROLES[idx] ?? `t${idx}`;
|
|
9175
|
+
}
|
|
9176
|
+
};
|
|
9177
|
+
const getRoleFromTrackId = (trackId, mode = "simple") => {
|
|
9178
|
+
if (trackId === "melody" || trackId === "submelody" || trackId === "bass" || trackId === "chord") {
|
|
9179
|
+
return trackId;
|
|
9180
|
+
}
|
|
9181
|
+
if (trackId.startsWith("t")) {
|
|
9182
|
+
const idx = Number(trackId.substring(1));
|
|
9183
|
+
if (!isNaN(idx)) {
|
|
9184
|
+
return getRoleForTrackIndex(idx, mode);
|
|
9185
|
+
}
|
|
9186
|
+
}
|
|
9187
|
+
return trackId;
|
|
9188
|
+
};
|
|
9160
9189
|
const instrumentNameFor = (preset, trackId) => preset[trackId] ?? preset.melody;
|
|
9161
|
-
const resolveSoundFont = (presetKey, trackId) => {
|
|
9190
|
+
const resolveSoundFont = (presetKey, trackId, mode = "simple") => {
|
|
9162
9191
|
const preset = INSTRUMENT_PRESETS[presetKey];
|
|
9163
9192
|
if (!preset) return void 0;
|
|
9164
|
-
const
|
|
9193
|
+
const role = getRoleFromTrackId(trackId, mode);
|
|
9194
|
+
const key = nameToKey[instrumentNameFor(preset, role)];
|
|
9165
9195
|
return key ? soundFonts.get(key) : void 0;
|
|
9166
9196
|
};
|
|
9167
|
-
const loadPreset = async (presetKey, trackIds = [...TRACK_ROLES]) => {
|
|
9197
|
+
const loadPreset = async (presetKey, trackIds = [...TRACK_ROLES], mode = "simple") => {
|
|
9168
9198
|
const preset = INSTRUMENT_PRESETS[presetKey];
|
|
9169
9199
|
if (!preset) return;
|
|
9170
9200
|
await listReady;
|
|
9171
9201
|
const keys = /* @__PURE__ */ new Set();
|
|
9172
9202
|
for (const trackId of trackIds) {
|
|
9173
|
-
const
|
|
9203
|
+
const role = getRoleFromTrackId(trackId, mode);
|
|
9204
|
+
const key = nameToKey[instrumentNameFor(preset, role)];
|
|
9174
9205
|
if (key) keys.add(key);
|
|
9175
9206
|
}
|
|
9176
9207
|
await Promise.all([...keys].map((key) => loadInstrument(key)));
|
|
9177
9208
|
};
|
|
9178
|
-
const applyPreset = async (daw, presetKey, trackIds, loadingTarget) => {
|
|
9209
|
+
const applyPreset = async (daw, presetKey, trackIds, loadingTarget, mode = "simple") => {
|
|
9179
9210
|
const wasPlaying = daw.getPlaybackState() === "playing";
|
|
9180
9211
|
if (wasPlaying) daw.pause();
|
|
9181
9212
|
const overlay = loadingTarget ? showLoadingOverlay(loadingTarget) : null;
|
|
9182
9213
|
daw.setLoading?.(true);
|
|
9183
9214
|
try {
|
|
9184
9215
|
daw.setInstrument(presetKey);
|
|
9185
|
-
await loadPreset(presetKey, trackIds);
|
|
9216
|
+
await loadPreset(presetKey, trackIds, mode);
|
|
9186
9217
|
} finally {
|
|
9187
9218
|
overlay?.remove();
|
|
9188
9219
|
daw.setLoading?.(false);
|
|
@@ -9217,8 +9248,10 @@ var createDtmStudio = async (options = {}) => {
|
|
|
9217
9248
|
const key = select.value;
|
|
9218
9249
|
opts.onChange?.(key);
|
|
9219
9250
|
const trackIds = opts.getTrackIds?.() ?? [...TRACK_ROLES];
|
|
9251
|
+
const isAdvanced = trackIds.includes("t0");
|
|
9252
|
+
const mode = isAdvanced ? "advanced" : "simple";
|
|
9220
9253
|
try {
|
|
9221
|
-
await applyPreset(daw, key, trackIds, opts.loadingTarget);
|
|
9254
|
+
await applyPreset(daw, key, trackIds, opts.loadingTarget, mode);
|
|
9222
9255
|
} finally {
|
|
9223
9256
|
busy = false;
|
|
9224
9257
|
}
|
|
@@ -9264,8 +9297,13 @@ var createDtmStudio = async (options = {}) => {
|
|
|
9264
9297
|
const trackIds = tracks.map((t) => t.id);
|
|
9265
9298
|
const presetKey = preset && INSTRUMENT_PRESETS[preset] ? preset : defaultPreset;
|
|
9266
9299
|
let editorPreset = presetKey;
|
|
9300
|
+
const isAdvancedMode = dawOverrides.mode === "advanced";
|
|
9267
9301
|
const playNote = (e) => {
|
|
9268
|
-
const sf = resolveSoundFont(
|
|
9302
|
+
const sf = resolveSoundFont(
|
|
9303
|
+
editorPreset,
|
|
9304
|
+
e.trackId,
|
|
9305
|
+
isAdvancedMode ? "advanced" : "simple"
|
|
9306
|
+
);
|
|
9269
9307
|
if (!sf) return;
|
|
9270
9308
|
sf.play({
|
|
9271
9309
|
ctx: audioCtx,
|
|
@@ -9308,7 +9346,11 @@ var createDtmStudio = async (options = {}) => {
|
|
|
9308
9346
|
}
|
|
9309
9347
|
daw.setInstrument(presetKey);
|
|
9310
9348
|
daw.setLoading?.(true);
|
|
9311
|
-
void loadPreset(
|
|
9349
|
+
void loadPreset(
|
|
9350
|
+
presetKey,
|
|
9351
|
+
trackIds,
|
|
9352
|
+
isAdvancedMode ? "advanced" : "simple"
|
|
9353
|
+
).finally(() => {
|
|
9312
9354
|
daw.setLoading?.(false);
|
|
9313
9355
|
});
|
|
9314
9356
|
const destroy = () => {
|
|
@@ -9409,15 +9451,30 @@ var createDtmStudio = async (options = {}) => {
|
|
|
9409
9451
|
const parsed = parseMML(mml, {});
|
|
9410
9452
|
const meta = parsed.meta ?? {};
|
|
9411
9453
|
const playerPreset = meta.instrument && INSTRUMENT_PRESETS[meta.instrument] ? meta.instrument : defaultPreset;
|
|
9454
|
+
const isAdvancedMode = meta.mode === "advanced";
|
|
9412
9455
|
const trackIndices = [
|
|
9413
9456
|
...new Set(parsed.placements.map((p) => p.trackIndex))
|
|
9414
9457
|
];
|
|
9415
|
-
const trackIds = trackIndices.map(
|
|
9458
|
+
const trackIds = trackIndices.map(
|
|
9459
|
+
(idx) => getRoleForTrackIndex(idx, isAdvancedMode ? "advanced" : "simple")
|
|
9460
|
+
);
|
|
9416
9461
|
const loadTrackIds = trackIds.length > 0 ? trackIds : [...TRACK_ROLES];
|
|
9417
|
-
void loadPreset(
|
|
9462
|
+
void loadPreset(
|
|
9463
|
+
playerPreset,
|
|
9464
|
+
loadTrackIds,
|
|
9465
|
+
isAdvancedMode ? "advanced" : "simple"
|
|
9466
|
+
);
|
|
9418
9467
|
const playPlayerNote = (e) => {
|
|
9419
|
-
const
|
|
9420
|
-
const
|
|
9468
|
+
const idx = Number(e.trackId);
|
|
9469
|
+
const role = getRoleForTrackIndex(
|
|
9470
|
+
idx,
|
|
9471
|
+
isAdvancedMode ? "advanced" : "simple"
|
|
9472
|
+
);
|
|
9473
|
+
const sf = resolveSoundFont(
|
|
9474
|
+
playerPreset,
|
|
9475
|
+
role,
|
|
9476
|
+
isAdvancedMode ? "advanced" : "simple"
|
|
9477
|
+
);
|
|
9421
9478
|
if (!sf) return;
|
|
9422
9479
|
sf.play({
|
|
9423
9480
|
ctx: audioCtx,
|
package/dist/index.mjs
CHANGED
|
@@ -3919,7 +3919,7 @@ var PITCH_MAP2 = {
|
|
|
3919
3919
|
b: 11
|
|
3920
3920
|
};
|
|
3921
3921
|
var clamp2 = (value, lo, hi) => Math.min(hi, Math.max(lo, value));
|
|
3922
|
-
var META_DIRECTIVE = /#(inst|drum|volume)=([\w-]+)/gi;
|
|
3922
|
+
var META_DIRECTIVE = /#(inst|drum|volume|mode)=([\w-]+)/gi;
|
|
3923
3923
|
var parseMmlMeta = (mml) => {
|
|
3924
3924
|
const meta = {};
|
|
3925
3925
|
for (const m of mml.matchAll(META_DIRECTIVE)) {
|
|
@@ -3929,6 +3929,10 @@ var parseMmlMeta = (mml) => {
|
|
|
3929
3929
|
else if (key === "volume") {
|
|
3930
3930
|
const v = Number.parseInt(m[2], 10);
|
|
3931
3931
|
if (!Number.isNaN(v)) meta.volume = v;
|
|
3932
|
+
} else if (key === "mode") {
|
|
3933
|
+
if (m[2] === "simple" || m[2] === "advanced") {
|
|
3934
|
+
meta.mode = m[2];
|
|
3935
|
+
}
|
|
3932
3936
|
}
|
|
3933
3937
|
}
|
|
3934
3938
|
return meta;
|
|
@@ -3939,6 +3943,7 @@ var formatMmlMeta = (meta) => {
|
|
|
3939
3943
|
if (meta.instrument) parts.push(`#inst=${meta.instrument}`);
|
|
3940
3944
|
if (meta.drum) parts.push(`#drum=${meta.drum}`);
|
|
3941
3945
|
if (meta.volume !== void 0) parts.push(`#volume=${meta.volume}`);
|
|
3946
|
+
if (meta.mode) parts.push(`#mode=${meta.mode}`);
|
|
3942
3947
|
return parts.join(" ");
|
|
3943
3948
|
};
|
|
3944
3949
|
var parseMML = (mml, options = {}) => {
|
|
@@ -3974,7 +3979,8 @@ var parseMML = (mml, options = {}) => {
|
|
|
3974
3979
|
const part = rawPart.trim();
|
|
3975
3980
|
if (part.startsWith("@")) {
|
|
3976
3981
|
let idx = Number.parseInt(part.substring(1), 10);
|
|
3977
|
-
if (clampTrackCount !== void 0 && idx >= clampTrackCount)
|
|
3982
|
+
if (clampTrackCount !== void 0 && idx >= clampTrackCount)
|
|
3983
|
+
idx = clampTrackCount - 1;
|
|
3978
3984
|
trackIndex = idx;
|
|
3979
3985
|
octave = 4;
|
|
3980
3986
|
currentStep = 0;
|
|
@@ -7502,7 +7508,8 @@ var mountDAW = (target, options = {}) => {
|
|
|
7502
7508
|
const metaLine = formatMmlMeta({
|
|
7503
7509
|
instrument: currentInstrument || void 0,
|
|
7504
7510
|
drum: currentDrumPattern !== "none" ? currentDrumPattern : void 0,
|
|
7505
|
-
volume: masterVolume
|
|
7511
|
+
volume: masterVolume,
|
|
7512
|
+
mode
|
|
7506
7513
|
});
|
|
7507
7514
|
if (refs.decomposeChordToggle.checked) {
|
|
7508
7515
|
const ignoreHeavy = refs.ignoreChordHeavyToggle.checked;
|
|
@@ -9047,32 +9054,56 @@ var createDtmStudio = async (options = {}) => {
|
|
|
9047
9054
|
return p;
|
|
9048
9055
|
};
|
|
9049
9056
|
const defaultPreset = options.defaultPreset ?? "retro_game";
|
|
9057
|
+
const getRoleForTrackIndex = (idx, mode = "simple") => {
|
|
9058
|
+
if (mode === "simple") {
|
|
9059
|
+
if (idx === 0) return "melody";
|
|
9060
|
+
if (idx === 1) return "submelody";
|
|
9061
|
+
if (idx === 2) return "bass";
|
|
9062
|
+
return "chord";
|
|
9063
|
+
} else {
|
|
9064
|
+
return TRACK_ROLES[idx] ?? `t${idx}`;
|
|
9065
|
+
}
|
|
9066
|
+
};
|
|
9067
|
+
const getRoleFromTrackId = (trackId, mode = "simple") => {
|
|
9068
|
+
if (trackId === "melody" || trackId === "submelody" || trackId === "bass" || trackId === "chord") {
|
|
9069
|
+
return trackId;
|
|
9070
|
+
}
|
|
9071
|
+
if (trackId.startsWith("t")) {
|
|
9072
|
+
const idx = Number(trackId.substring(1));
|
|
9073
|
+
if (!isNaN(idx)) {
|
|
9074
|
+
return getRoleForTrackIndex(idx, mode);
|
|
9075
|
+
}
|
|
9076
|
+
}
|
|
9077
|
+
return trackId;
|
|
9078
|
+
};
|
|
9050
9079
|
const instrumentNameFor = (preset, trackId) => preset[trackId] ?? preset.melody;
|
|
9051
|
-
const resolveSoundFont = (presetKey, trackId) => {
|
|
9080
|
+
const resolveSoundFont = (presetKey, trackId, mode = "simple") => {
|
|
9052
9081
|
const preset = INSTRUMENT_PRESETS[presetKey];
|
|
9053
9082
|
if (!preset) return void 0;
|
|
9054
|
-
const
|
|
9083
|
+
const role = getRoleFromTrackId(trackId, mode);
|
|
9084
|
+
const key = nameToKey[instrumentNameFor(preset, role)];
|
|
9055
9085
|
return key ? soundFonts.get(key) : void 0;
|
|
9056
9086
|
};
|
|
9057
|
-
const loadPreset = async (presetKey, trackIds = [...TRACK_ROLES]) => {
|
|
9087
|
+
const loadPreset = async (presetKey, trackIds = [...TRACK_ROLES], mode = "simple") => {
|
|
9058
9088
|
const preset = INSTRUMENT_PRESETS[presetKey];
|
|
9059
9089
|
if (!preset) return;
|
|
9060
9090
|
await listReady;
|
|
9061
9091
|
const keys = /* @__PURE__ */ new Set();
|
|
9062
9092
|
for (const trackId of trackIds) {
|
|
9063
|
-
const
|
|
9093
|
+
const role = getRoleFromTrackId(trackId, mode);
|
|
9094
|
+
const key = nameToKey[instrumentNameFor(preset, role)];
|
|
9064
9095
|
if (key) keys.add(key);
|
|
9065
9096
|
}
|
|
9066
9097
|
await Promise.all([...keys].map((key) => loadInstrument(key)));
|
|
9067
9098
|
};
|
|
9068
|
-
const applyPreset = async (daw, presetKey, trackIds, loadingTarget) => {
|
|
9099
|
+
const applyPreset = async (daw, presetKey, trackIds, loadingTarget, mode = "simple") => {
|
|
9069
9100
|
const wasPlaying = daw.getPlaybackState() === "playing";
|
|
9070
9101
|
if (wasPlaying) daw.pause();
|
|
9071
9102
|
const overlay = loadingTarget ? showLoadingOverlay(loadingTarget) : null;
|
|
9072
9103
|
daw.setLoading?.(true);
|
|
9073
9104
|
try {
|
|
9074
9105
|
daw.setInstrument(presetKey);
|
|
9075
|
-
await loadPreset(presetKey, trackIds);
|
|
9106
|
+
await loadPreset(presetKey, trackIds, mode);
|
|
9076
9107
|
} finally {
|
|
9077
9108
|
overlay?.remove();
|
|
9078
9109
|
daw.setLoading?.(false);
|
|
@@ -9107,8 +9138,10 @@ var createDtmStudio = async (options = {}) => {
|
|
|
9107
9138
|
const key = select.value;
|
|
9108
9139
|
opts.onChange?.(key);
|
|
9109
9140
|
const trackIds = opts.getTrackIds?.() ?? [...TRACK_ROLES];
|
|
9141
|
+
const isAdvanced = trackIds.includes("t0");
|
|
9142
|
+
const mode = isAdvanced ? "advanced" : "simple";
|
|
9110
9143
|
try {
|
|
9111
|
-
await applyPreset(daw, key, trackIds, opts.loadingTarget);
|
|
9144
|
+
await applyPreset(daw, key, trackIds, opts.loadingTarget, mode);
|
|
9112
9145
|
} finally {
|
|
9113
9146
|
busy = false;
|
|
9114
9147
|
}
|
|
@@ -9154,8 +9187,13 @@ var createDtmStudio = async (options = {}) => {
|
|
|
9154
9187
|
const trackIds = tracks.map((t) => t.id);
|
|
9155
9188
|
const presetKey = preset && INSTRUMENT_PRESETS[preset] ? preset : defaultPreset;
|
|
9156
9189
|
let editorPreset = presetKey;
|
|
9190
|
+
const isAdvancedMode = dawOverrides.mode === "advanced";
|
|
9157
9191
|
const playNote = (e) => {
|
|
9158
|
-
const sf = resolveSoundFont(
|
|
9192
|
+
const sf = resolveSoundFont(
|
|
9193
|
+
editorPreset,
|
|
9194
|
+
e.trackId,
|
|
9195
|
+
isAdvancedMode ? "advanced" : "simple"
|
|
9196
|
+
);
|
|
9159
9197
|
if (!sf) return;
|
|
9160
9198
|
sf.play({
|
|
9161
9199
|
ctx: audioCtx,
|
|
@@ -9198,7 +9236,11 @@ var createDtmStudio = async (options = {}) => {
|
|
|
9198
9236
|
}
|
|
9199
9237
|
daw.setInstrument(presetKey);
|
|
9200
9238
|
daw.setLoading?.(true);
|
|
9201
|
-
void loadPreset(
|
|
9239
|
+
void loadPreset(
|
|
9240
|
+
presetKey,
|
|
9241
|
+
trackIds,
|
|
9242
|
+
isAdvancedMode ? "advanced" : "simple"
|
|
9243
|
+
).finally(() => {
|
|
9202
9244
|
daw.setLoading?.(false);
|
|
9203
9245
|
});
|
|
9204
9246
|
const destroy = () => {
|
|
@@ -9299,15 +9341,30 @@ var createDtmStudio = async (options = {}) => {
|
|
|
9299
9341
|
const parsed = parseMML(mml, {});
|
|
9300
9342
|
const meta = parsed.meta ?? {};
|
|
9301
9343
|
const playerPreset = meta.instrument && INSTRUMENT_PRESETS[meta.instrument] ? meta.instrument : defaultPreset;
|
|
9344
|
+
const isAdvancedMode = meta.mode === "advanced";
|
|
9302
9345
|
const trackIndices = [
|
|
9303
9346
|
...new Set(parsed.placements.map((p) => p.trackIndex))
|
|
9304
9347
|
];
|
|
9305
|
-
const trackIds = trackIndices.map(
|
|
9348
|
+
const trackIds = trackIndices.map(
|
|
9349
|
+
(idx) => getRoleForTrackIndex(idx, isAdvancedMode ? "advanced" : "simple")
|
|
9350
|
+
);
|
|
9306
9351
|
const loadTrackIds = trackIds.length > 0 ? trackIds : [...TRACK_ROLES];
|
|
9307
|
-
void loadPreset(
|
|
9352
|
+
void loadPreset(
|
|
9353
|
+
playerPreset,
|
|
9354
|
+
loadTrackIds,
|
|
9355
|
+
isAdvancedMode ? "advanced" : "simple"
|
|
9356
|
+
);
|
|
9308
9357
|
const playPlayerNote = (e) => {
|
|
9309
|
-
const
|
|
9310
|
-
const
|
|
9358
|
+
const idx = Number(e.trackId);
|
|
9359
|
+
const role = getRoleForTrackIndex(
|
|
9360
|
+
idx,
|
|
9361
|
+
isAdvancedMode ? "advanced" : "simple"
|
|
9362
|
+
);
|
|
9363
|
+
const sf = resolveSoundFont(
|
|
9364
|
+
playerPreset,
|
|
9365
|
+
role,
|
|
9366
|
+
isAdvancedMode ? "advanced" : "simple"
|
|
9367
|
+
);
|
|
9311
9368
|
if (!sf) return;
|
|
9312
9369
|
sf.play({
|
|
9313
9370
|
ctx: audioCtx,
|
package/package.json
CHANGED