@onjmin/dtm 0.1.69 → 0.1.71

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 CHANGED
@@ -13949,6 +13949,23 @@ var TRACK_ROLES = [
13949
13949
  "t13",
13950
13950
  "t14"
13951
13951
  ];
13952
+ var resolveTrackIdxAndRole = (trackId) => {
13953
+ const roleIdx = TRACK_ROLES.indexOf(trackId);
13954
+ if (roleIdx >= 0) {
13955
+ return { trackIdx: roleIdx, role: trackId };
13956
+ }
13957
+ if (trackId.startsWith("t")) {
13958
+ const parsed2 = Number(trackId.slice(1));
13959
+ const validIdx2 = Number.isNaN(parsed2) ? 0 : parsed2;
13960
+ return {
13961
+ trackIdx: validIdx2,
13962
+ role: TRACK_ROLES[validIdx2] ?? `t${validIdx2}`
13963
+ };
13964
+ }
13965
+ const parsed = Number(trackId);
13966
+ const validIdx = Number.isNaN(parsed) ? 0 : parsed;
13967
+ return { trackIdx: validIdx, role: TRACK_ROLES[validIdx] ?? `t${validIdx}` };
13968
+ };
13952
13969
  var resolveDefaultVoiceWorkerUrl = () => {
13953
13970
  try {
13954
13971
  return new URL("./voice-worker.js", import_meta.url).href;
@@ -14205,7 +14222,7 @@ var createDtmStudio = async (options = {}) => {
14205
14222
  }
14206
14223
  }
14207
14224
  const playNote4 = (e) => {
14208
- const trackIdx = tracks.findIndex((t) => t.id === e.trackId);
14225
+ const { trackIdx, role } = resolveTrackIdxAndRole(e.trackId);
14209
14226
  const overrideKey = trackIdx >= 0 ? trackInstOverrides.get(trackIdx) : void 0;
14210
14227
  let sfInst;
14211
14228
  if (overrideKey) {
@@ -14213,7 +14230,7 @@ var createDtmStudio = async (options = {}) => {
14213
14230
  } else {
14214
14231
  sfInst = resolveSoundFont(
14215
14232
  editorPreset,
14216
- e.trackId,
14233
+ role,
14217
14234
  isAdvancedMode ? "advanced" : "simple"
14218
14235
  );
14219
14236
  }
@@ -14512,19 +14529,19 @@ var createDtmStudio = async (options = {}) => {
14512
14529
  loadPlayerTrackInstruments()
14513
14530
  ]);
14514
14531
  const playPlayerNote = (e) => {
14515
- const idx = Number(e.trackId);
14516
- const overrideKey = playerTrackInstKeys.get(idx);
14532
+ const { trackIdx, role } = resolveTrackIdxAndRole(e.trackId);
14533
+ const overrideKey = playerTrackInstKeys.get(trackIdx);
14517
14534
  let sfInst;
14518
14535
  if (overrideKey) {
14519
14536
  sfInst = soundFonts.get(overrideKey);
14520
14537
  } else {
14521
- const role = getRoleForTrackIndex(
14522
- idx,
14538
+ const roleFromIdx = getRoleForTrackIndex(
14539
+ trackIdx,
14523
14540
  isAdvancedMode ? "advanced" : "simple"
14524
14541
  );
14525
14542
  sfInst = resolveSoundFont(
14526
14543
  playerPreset,
14527
- role,
14544
+ roleFromIdx,
14528
14545
  isAdvancedMode ? "advanced" : "simple"
14529
14546
  );
14530
14547
  }
@@ -14549,34 +14566,50 @@ var createDtmStudio = async (options = {}) => {
14549
14566
  });
14550
14567
  };
14551
14568
  const playSingingMMLInstance = (mml, opts = {}) => {
14552
- const { placements } = parseMML(mml);
14553
- const trackIndices = [...new Set(placements.map((p) => p.trackIndex))].sort(
14554
- (a, b) => a - b
14555
- );
14556
- const isAdvancedMode = trackIndices.some((idx) => idx >= 4);
14557
- const playerPreset = defaultPreset;
14558
- void loadPreset(
14559
- playerPreset,
14560
- trackIndices.map(String),
14561
- isAdvancedMode ? "advanced" : "simple"
14569
+ const parsed = parseMML(mml, {});
14570
+ const meta = parsed.meta ?? {};
14571
+ const playerPreset = meta.instrument && INSTRUMENT_PRESETS[meta.instrument] ? meta.instrument : defaultPreset;
14572
+ const isAdvancedMode = meta.mode === "advanced" || parsed.placements.some((p) => p.trackIndex >= 4);
14573
+ const trackIndices = [
14574
+ ...new Set(parsed.placements.map((p) => p.trackIndex))
14575
+ ];
14576
+ const trackIds = trackIndices.map(
14577
+ (idx) => getRoleForTrackIndex(idx, isAdvancedMode ? "advanced" : "simple")
14562
14578
  );
14563
- const playPlayerNote = (e) => {
14564
- const trackIdx = Number(e.trackId);
14565
- const role = TRACK_ROLES[trackIdx] ?? "melody";
14566
- let sfInst = resolveSoundFont(
14579
+ const loadTrackIds = trackIds.length > 0 ? trackIds : [...TRACK_ROLES];
14580
+ const playerTrackInstKeys = /* @__PURE__ */ new Map();
14581
+ const loadPlayerTrackInstruments = async () => {
14582
+ if (!meta.trackInstruments) return;
14583
+ await listReady;
14584
+ for (const [idxStr, name] of Object.entries(meta.trackInstruments)) {
14585
+ const key = resolveNameToKey(name);
14586
+ if (!key) continue;
14587
+ playerTrackInstKeys.set(Number(idxStr), key);
14588
+ await loadInstrument(key);
14589
+ }
14590
+ };
14591
+ void Promise.all([
14592
+ loadPreset(
14567
14593
  playerPreset,
14568
- role,
14594
+ loadTrackIds,
14569
14595
  isAdvancedMode ? "advanced" : "simple"
14570
- );
14571
- if (!sfInst) {
14572
- void loadPreset(
14573
- playerPreset,
14574
- [role],
14596
+ ),
14597
+ loadPlayerTrackInstruments()
14598
+ ]);
14599
+ const playPlayerNote = (e) => {
14600
+ const { trackIdx, role } = resolveTrackIdxAndRole(e.trackId);
14601
+ const overrideKey = playerTrackInstKeys.get(trackIdx);
14602
+ let sfInst;
14603
+ if (overrideKey) {
14604
+ sfInst = soundFonts.get(overrideKey);
14605
+ } else {
14606
+ const roleFromIdx = getRoleForTrackIndex(
14607
+ trackIdx,
14575
14608
  isAdvancedMode ? "advanced" : "simple"
14576
14609
  );
14577
14610
  sfInst = resolveSoundFont(
14578
14611
  playerPreset,
14579
- role,
14612
+ roleFromIdx,
14580
14613
  isAdvancedMode ? "advanced" : "simple"
14581
14614
  );
14582
14615
  }
@@ -14602,8 +14635,7 @@ var createDtmStudio = async (options = {}) => {
14602
14635
  });
14603
14636
  };
14604
14637
  const playNoteEvent = (e) => {
14605
- const idx = Number(e.trackId);
14606
- const role = TRACK_ROLES[idx] ?? "melody";
14638
+ const { role } = resolveTrackIdxAndRole(e.trackId);
14607
14639
  let sfInst = resolveSoundFont(defaultPreset, role, "simple");
14608
14640
  if (!sfInst) {
14609
14641
  void loadPreset(defaultPreset, [role], "simple");
package/dist/index.mjs CHANGED
@@ -13825,6 +13825,23 @@ var TRACK_ROLES = [
13825
13825
  "t13",
13826
13826
  "t14"
13827
13827
  ];
13828
+ var resolveTrackIdxAndRole = (trackId) => {
13829
+ const roleIdx = TRACK_ROLES.indexOf(trackId);
13830
+ if (roleIdx >= 0) {
13831
+ return { trackIdx: roleIdx, role: trackId };
13832
+ }
13833
+ if (trackId.startsWith("t")) {
13834
+ const parsed2 = Number(trackId.slice(1));
13835
+ const validIdx2 = Number.isNaN(parsed2) ? 0 : parsed2;
13836
+ return {
13837
+ trackIdx: validIdx2,
13838
+ role: TRACK_ROLES[validIdx2] ?? `t${validIdx2}`
13839
+ };
13840
+ }
13841
+ const parsed = Number(trackId);
13842
+ const validIdx = Number.isNaN(parsed) ? 0 : parsed;
13843
+ return { trackIdx: validIdx, role: TRACK_ROLES[validIdx] ?? `t${validIdx}` };
13844
+ };
13828
13845
  var resolveDefaultVoiceWorkerUrl = () => {
13829
13846
  try {
13830
13847
  return new URL("./voice-worker.js", import.meta.url).href;
@@ -14081,7 +14098,7 @@ var createDtmStudio = async (options = {}) => {
14081
14098
  }
14082
14099
  }
14083
14100
  const playNote4 = (e) => {
14084
- const trackIdx = tracks.findIndex((t) => t.id === e.trackId);
14101
+ const { trackIdx, role } = resolveTrackIdxAndRole(e.trackId);
14085
14102
  const overrideKey = trackIdx >= 0 ? trackInstOverrides.get(trackIdx) : void 0;
14086
14103
  let sfInst;
14087
14104
  if (overrideKey) {
@@ -14089,7 +14106,7 @@ var createDtmStudio = async (options = {}) => {
14089
14106
  } else {
14090
14107
  sfInst = resolveSoundFont(
14091
14108
  editorPreset,
14092
- e.trackId,
14109
+ role,
14093
14110
  isAdvancedMode ? "advanced" : "simple"
14094
14111
  );
14095
14112
  }
@@ -14388,19 +14405,19 @@ var createDtmStudio = async (options = {}) => {
14388
14405
  loadPlayerTrackInstruments()
14389
14406
  ]);
14390
14407
  const playPlayerNote = (e) => {
14391
- const idx = Number(e.trackId);
14392
- const overrideKey = playerTrackInstKeys.get(idx);
14408
+ const { trackIdx, role } = resolveTrackIdxAndRole(e.trackId);
14409
+ const overrideKey = playerTrackInstKeys.get(trackIdx);
14393
14410
  let sfInst;
14394
14411
  if (overrideKey) {
14395
14412
  sfInst = soundFonts.get(overrideKey);
14396
14413
  } else {
14397
- const role = getRoleForTrackIndex(
14398
- idx,
14414
+ const roleFromIdx = getRoleForTrackIndex(
14415
+ trackIdx,
14399
14416
  isAdvancedMode ? "advanced" : "simple"
14400
14417
  );
14401
14418
  sfInst = resolveSoundFont(
14402
14419
  playerPreset,
14403
- role,
14420
+ roleFromIdx,
14404
14421
  isAdvancedMode ? "advanced" : "simple"
14405
14422
  );
14406
14423
  }
@@ -14425,34 +14442,50 @@ var createDtmStudio = async (options = {}) => {
14425
14442
  });
14426
14443
  };
14427
14444
  const playSingingMMLInstance = (mml, opts = {}) => {
14428
- const { placements } = parseMML(mml);
14429
- const trackIndices = [...new Set(placements.map((p) => p.trackIndex))].sort(
14430
- (a, b) => a - b
14431
- );
14432
- const isAdvancedMode = trackIndices.some((idx) => idx >= 4);
14433
- const playerPreset = defaultPreset;
14434
- void loadPreset(
14435
- playerPreset,
14436
- trackIndices.map(String),
14437
- isAdvancedMode ? "advanced" : "simple"
14445
+ const parsed = parseMML(mml, {});
14446
+ const meta = parsed.meta ?? {};
14447
+ const playerPreset = meta.instrument && INSTRUMENT_PRESETS[meta.instrument] ? meta.instrument : defaultPreset;
14448
+ const isAdvancedMode = meta.mode === "advanced" || parsed.placements.some((p) => p.trackIndex >= 4);
14449
+ const trackIndices = [
14450
+ ...new Set(parsed.placements.map((p) => p.trackIndex))
14451
+ ];
14452
+ const trackIds = trackIndices.map(
14453
+ (idx) => getRoleForTrackIndex(idx, isAdvancedMode ? "advanced" : "simple")
14438
14454
  );
14439
- const playPlayerNote = (e) => {
14440
- const trackIdx = Number(e.trackId);
14441
- const role = TRACK_ROLES[trackIdx] ?? "melody";
14442
- let sfInst = resolveSoundFont(
14455
+ const loadTrackIds = trackIds.length > 0 ? trackIds : [...TRACK_ROLES];
14456
+ const playerTrackInstKeys = /* @__PURE__ */ new Map();
14457
+ const loadPlayerTrackInstruments = async () => {
14458
+ if (!meta.trackInstruments) return;
14459
+ await listReady;
14460
+ for (const [idxStr, name] of Object.entries(meta.trackInstruments)) {
14461
+ const key = resolveNameToKey(name);
14462
+ if (!key) continue;
14463
+ playerTrackInstKeys.set(Number(idxStr), key);
14464
+ await loadInstrument(key);
14465
+ }
14466
+ };
14467
+ void Promise.all([
14468
+ loadPreset(
14443
14469
  playerPreset,
14444
- role,
14470
+ loadTrackIds,
14445
14471
  isAdvancedMode ? "advanced" : "simple"
14446
- );
14447
- if (!sfInst) {
14448
- void loadPreset(
14449
- playerPreset,
14450
- [role],
14472
+ ),
14473
+ loadPlayerTrackInstruments()
14474
+ ]);
14475
+ const playPlayerNote = (e) => {
14476
+ const { trackIdx, role } = resolveTrackIdxAndRole(e.trackId);
14477
+ const overrideKey = playerTrackInstKeys.get(trackIdx);
14478
+ let sfInst;
14479
+ if (overrideKey) {
14480
+ sfInst = soundFonts.get(overrideKey);
14481
+ } else {
14482
+ const roleFromIdx = getRoleForTrackIndex(
14483
+ trackIdx,
14451
14484
  isAdvancedMode ? "advanced" : "simple"
14452
14485
  );
14453
14486
  sfInst = resolveSoundFont(
14454
14487
  playerPreset,
14455
- role,
14488
+ roleFromIdx,
14456
14489
  isAdvancedMode ? "advanced" : "simple"
14457
14490
  );
14458
14491
  }
@@ -14478,8 +14511,7 @@ var createDtmStudio = async (options = {}) => {
14478
14511
  });
14479
14512
  };
14480
14513
  const playNoteEvent = (e) => {
14481
- const idx = Number(e.trackId);
14482
- const role = TRACK_ROLES[idx] ?? "melody";
14514
+ const { role } = resolveTrackIdxAndRole(e.trackId);
14483
14515
  let sfInst = resolveSoundFont(defaultPreset, role, "simple");
14484
14516
  if (!sfInst) {
14485
14517
  void loadPreset(defaultPreset, [role], "simple");
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.69",
5
+ "version": "0.1.71",
6
6
  "description": "MMLを中間言語に用いた、モバイルファーストなDAW / ピアノロール打ち込みコンポーネント",
7
7
  "homepage": "https://onjmin.github.io/dtm",
8
8
  "repository": {