@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 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) idx = 2;
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 key = nameToKey[instrumentNameFor(preset, trackId)];
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 key = nameToKey[instrumentNameFor(preset, trackId)];
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(editorPreset, e.trackId);
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(presetKey, trackIds).finally(() => {
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((idx) => TRACK_ROLES[idx] ?? `t${idx}`);
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(playerPreset, loadTrackIds);
9462
+ void loadPreset(
9463
+ playerPreset,
9464
+ loadTrackIds,
9465
+ isAdvancedMode ? "advanced" : "simple"
9466
+ );
9418
9467
  const playPlayerNote = (e) => {
9419
- const role = TRACK_ROLES[Number(e.trackId)] ?? `t${e.trackId}`;
9420
- const sf = resolveSoundFont(playerPreset, role);
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) idx = 2;
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 key = nameToKey[instrumentNameFor(preset, trackId)];
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 key = nameToKey[instrumentNameFor(preset, trackId)];
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(editorPreset, e.trackId);
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(presetKey, trackIds).finally(() => {
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((idx) => TRACK_ROLES[idx] ?? `t${idx}`);
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(playerPreset, loadTrackIds);
9352
+ void loadPreset(
9353
+ playerPreset,
9354
+ loadTrackIds,
9355
+ isAdvancedMode ? "advanced" : "simple"
9356
+ );
9308
9357
  const playPlayerNote = (e) => {
9309
- const role = TRACK_ROLES[Number(e.trackId)] ?? `t${e.trackId}`;
9310
- const sf = resolveSoundFont(playerPreset, role);
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
@@ -2,7 +2,7 @@
2
2
  "author": "onjmin",
3
3
  "license": "MIT",
4
4
  "name": "@onjmin/dtm",
5
- "version": "0.1.22",
5
+ "version": "0.1.23",
6
6
  "description": "MMLを中間言語に用いた、モバイルファーストなDAW / ピアノロール打ち込みコンポーネント",
7
7
  "homepage": "https://onjmin.github.io/dtm",
8
8
  "repository": {