@onjmin/dtm 0.1.14 → 0.1.16

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 CHANGED
@@ -38,7 +38,7 @@ studio.mountPlayer(document.getElementById("player"), daw.getMML().full);
38
38
  | モード | トラック | MIDI 取り込み | 伴奏(コード進行)UI |
39
39
  | --- | --- | --- | --- |
40
40
  | `simple` | メロディー / サブメロ / ベース / 伴奏 の 4 本 | 各トラックの特徴から役割へ**自動分類** | `chord` トラックに表示(歌詞欄の代わり) |
41
- | `advanced` | TRACK 01〜1616 | MIDI トラックを**1:1 マッピング** | なし(全トラックが通常のノート+歌詞トラック) |
41
+ | `advanced` | TRACK 01〜1515 本(フラットな連番) | MIDI トラックを**1:1 マッピング** | なし(全トラックが通常のノート+歌詞トラック) |
42
42
 
43
43
  ```ts
44
44
  import {
@@ -62,6 +62,26 @@ studio.mountEditor(editorEl, { mode: "advanced", tracks: TRACKS_ADVANCED });
62
62
  - MIDI のドラム(ch10)はピアノロールで編集できないため、取り込み時の**トラック選択 UI には出ません**。
63
63
  - `mode` / `tracks` は低レベル API の `mountDAW` でも同じく指定できます。
64
64
 
65
+ ### 備考: トラック採番と MIDI チャンネルの対応(暫定仕様)
66
+
67
+ `advanced` の `@n` / タブ名は **MML 仕様に合わせたフラットな連番**(`@0`〜`@14` / TRACK 01〜15、欠番なし)です。
68
+ 「ch10 = ドラム」という MIDI の慣習は内部モデルには持ち込まず、**MIDI 入出力の変換時にだけ**扱います。
69
+
70
+ - **出力**: レーン index → MIDI チャンネルに変換する際、打楽器ch(内部 `channel 9` = 1始まり ch10)を避けます。
71
+ 結果、TRACK 01〜09 → ch1〜9 / **TRACK 10〜15 → ch11〜16** に書き出されます(タブ番号と MIDI ch は
72
+ 10 番以降ズレますが、これは出力時の変換詳細です)。15 レーン ⇄ 15 個の非打楽器ch がちょうど 1:1 で、
73
+ チャンネル衝突は起きません。
74
+ - **入力**: `channel 9`(ドラム)のノートは取り込まず、ドラムだけのトラックは選択 UI にも出しません。
75
+ 選択したトラックは**選択順に上から**レーンへ詰めます(MIDI の実トラック番号やテンポトラックの有無に
76
+ 左右されません)。
77
+ - ドラム自体はノートレーンではなく、別系統の**ドラム設定**で編集します。
78
+
79
+ > 経緯: 当初は「タブ番号 = MIDI チャンネル番号」に揃え、ドラムの ch10 をタブの欠番にする案も検討しましたが、
80
+ > このアプリの正規フォーマットは MML(0 始まり・フラット・ドラムch非依存)であり、MIDI は境界の交換
81
+ > フォーマットに過ぎません。MIDI の慣習を内部採番に漏らすと MML の一貫性が崩れる(モード間で採番が割れる、
82
+ > 永続化される MML に欠番が残る等)ため、**内部は MML 仕様に寄せ、ch10=ドラムの面倒は変換層に閉じ込める**
83
+ > 方針に決めました。
84
+
65
85
  ## 低レベル API(`mountDAW` / 注入式)
66
86
 
67
87
  本体は音を持たない設計で、`onPlayNote` / `onPlayDrum` に自前のシンセを繋ぐ
package/dist/index.d.mts CHANGED
@@ -522,7 +522,7 @@ type PlayDrumEvent = {
522
522
  /** 秒 */
523
523
  duration: number;
524
524
  };
525
- type ParseMidiFn = (bytes: Uint8Array) => unknown;
525
+ type ParseMidiFn = (bytes: Uint8Array) => unknown | Promise<unknown>;
526
526
  /**
527
527
  * 永続化対象の表示・出力設定。利用側がブラウザ再訪時に復元する用途に使う。
528
528
  * (ノートやMML本体ではなく、エディタの見え方/出力の挙動の設定)
@@ -604,7 +604,7 @@ type DawInstance = {
604
604
  /** 表示・出力設定を復元する(指定したキーのみ反映。UIにも反映する)。 */
605
605
  setViewState: (state: Partial<DawViewState>) => void;
606
606
  loadMML: (mml: string) => void;
607
- loadMIDI: (bytes: Uint8Array) => void;
607
+ loadMIDI: (bytes: Uint8Array) => void | Promise<void>;
608
608
  exportMIDI: () => Blob;
609
609
  setBpm: (bpm: number) => void;
610
610
  getPlaybackState: () => PlaybackState;
@@ -621,7 +621,13 @@ type DawInstance = {
621
621
 
622
622
  /** シンプルモード(4トラック)— 役割別に自動分類してMIDIを読み込む */
623
623
  declare const TRACKS_SIMPLE: TrackConfig[];
624
- /** 上級者モード(16トラック)— MIDIトラックを1:1で扱う */
624
+ /**
625
+ * advancedモード(15トラック)— MIDIトラックを1:1で扱う。
626
+ * 採番はMML仕様に合わせてフラットな連番(@0〜@14 / TRACK 01〜15、欠番なし)。
627
+ * MIDIの「ch10=ドラム」の慣習は内部モデルに持ち込まず、MIDI入出力の変換時にだけ扱う:
628
+ * 出力は打楽器ch(内部 channel 9)を避けて割り当て(TRACK 10以降は ch11〜16 へ)、
629
+ * 入力は channel 9 のドラムを除外する。ドラム自体は別系統の「ドラム設定」で編集する。
630
+ */
625
631
  declare const TRACKS_ADVANCED: TrackConfig[];
626
632
  /**
627
633
  * DAWコンポーネントをマウントする。
@@ -1212,7 +1218,6 @@ declare const DEFAULT_CDN: {
1212
1218
  readonly soundFont: "https://rpgen3.github.io/soundfont/mjs/surikov/SoundFont.mjs";
1213
1219
  readonly soundFontDrum: "https://rpgen3.github.io/soundfont/mjs/surikov/SoundFont_drum.mjs";
1214
1220
  readonly soundFontList: "https://rpgen3.github.io/soundfont/mjs/surikov/SoundFont_list.mjs";
1215
- readonly midiParser: "https://cdn.jsdelivr.net/npm/midi-parser-js@4.0.4/+esm";
1216
1221
  };
1217
1222
  type DtmStudioOptions = {
1218
1223
  /** 既存の AudioContext を使う(未指定なら内部生成)。 */
package/dist/index.d.ts CHANGED
@@ -522,7 +522,7 @@ type PlayDrumEvent = {
522
522
  /** 秒 */
523
523
  duration: number;
524
524
  };
525
- type ParseMidiFn = (bytes: Uint8Array) => unknown;
525
+ type ParseMidiFn = (bytes: Uint8Array) => unknown | Promise<unknown>;
526
526
  /**
527
527
  * 永続化対象の表示・出力設定。利用側がブラウザ再訪時に復元する用途に使う。
528
528
  * (ノートやMML本体ではなく、エディタの見え方/出力の挙動の設定)
@@ -604,7 +604,7 @@ type DawInstance = {
604
604
  /** 表示・出力設定を復元する(指定したキーのみ反映。UIにも反映する)。 */
605
605
  setViewState: (state: Partial<DawViewState>) => void;
606
606
  loadMML: (mml: string) => void;
607
- loadMIDI: (bytes: Uint8Array) => void;
607
+ loadMIDI: (bytes: Uint8Array) => void | Promise<void>;
608
608
  exportMIDI: () => Blob;
609
609
  setBpm: (bpm: number) => void;
610
610
  getPlaybackState: () => PlaybackState;
@@ -621,7 +621,13 @@ type DawInstance = {
621
621
 
622
622
  /** シンプルモード(4トラック)— 役割別に自動分類してMIDIを読み込む */
623
623
  declare const TRACKS_SIMPLE: TrackConfig[];
624
- /** 上級者モード(16トラック)— MIDIトラックを1:1で扱う */
624
+ /**
625
+ * advancedモード(15トラック)— MIDIトラックを1:1で扱う。
626
+ * 採番はMML仕様に合わせてフラットな連番(@0〜@14 / TRACK 01〜15、欠番なし)。
627
+ * MIDIの「ch10=ドラム」の慣習は内部モデルに持ち込まず、MIDI入出力の変換時にだけ扱う:
628
+ * 出力は打楽器ch(内部 channel 9)を避けて割り当て(TRACK 10以降は ch11〜16 へ)、
629
+ * 入力は channel 9 のドラムを除外する。ドラム自体は別系統の「ドラム設定」で編集する。
630
+ */
625
631
  declare const TRACKS_ADVANCED: TrackConfig[];
626
632
  /**
627
633
  * DAWコンポーネントをマウントする。
@@ -1212,7 +1218,6 @@ declare const DEFAULT_CDN: {
1212
1218
  readonly soundFont: "https://rpgen3.github.io/soundfont/mjs/surikov/SoundFont.mjs";
1213
1219
  readonly soundFontDrum: "https://rpgen3.github.io/soundfont/mjs/surikov/SoundFont_drum.mjs";
1214
1220
  readonly soundFontList: "https://rpgen3.github.io/soundfont/mjs/surikov/SoundFont_list.mjs";
1215
- readonly midiParser: "https://cdn.jsdelivr.net/npm/midi-parser-js@4.0.4/+esm";
1216
1221
  };
1217
1222
  type DtmStudioOptions = {
1218
1223
  /** 既存の AudioContext を使う(未指定なら内部生成)。 */