@onjmin/dtm
    Preparing search index...

    @onjmin/dtm

    @onjmin/dtm

    MML を中間言語に用いた、モバイルファーストな DAW / ピアノロール打ち込みコンポーネント。 楽器・ドラムに加え、UTAU 音源(@onjmin/koe)による歌声合成にも対応しています。 利用者が手元に入れた VOICEVOX・NEUTRINO・OpenUtau(DiffSinger・ENUNU)・Sinsy で歌わせることもできます(試作。下の「手元の歌声エンジン」)。

    歌詞トラックの音源に、手元で動かした歌声エンジンの声を選べます(試作)。dtm はどのエンジンも歌声ライブラリも同梱しないので、各自が公式の配布元から入れます。

    エンジン 声の例 詳しく
    VOICEVOX vv_zundamon・vv_metan など歌える30人 voicevox-sing.md
    NEUTRINO nt_reina・東北きりたん nt_kiritan など v3 の17種 neutrino-sing.md
    OpenUtau(DiffSinger・ENUNU) 波音リツ ou_ritsu_ds・ou_ritsu_enunu openutau-sing.md
    Sinsy(pysinsy) ss_f001 sinsy-sing.md
    1. 入れる: docs/guide/local-engines-setup.md の手順で、使いたいエンジンだけ入れる。
    2. 起動する: 置き場所を engines.local.json に書いておくと、pnpm engines でエンジン・中継サーバー・デモの DAW をまとめて起動できる(Ctrl+C でまとめて止まる)。
    3. 選ぶ: デモの DAW を手元(http://localhost:40298/ など)で開き、歌詞トラックの音源から声を選ぶ。これらの声は、ページを手元(localhost・127.0.0.1・file:)で開いたときだけ選べます。
    npm i @onjmin/dtm
    

    createDtmStudio は SoundFont(実行時に CDN から読む)・歌声合成(同梱の dist/voice-worker.js)・録音を内包した一番簡単な入口です。

    import { createDtmStudio } from "@onjmin/dtm";

    const studio = await createDtmStudio();

    // 編集 UI(ピアノロール・音・歌声込み)
    const daw = studio.mountEditor(document.getElementById("editor"), {
    initialMML: "@0 t120 o5 l8 ccggaag4 ffeeddc4",
    });

    // 再生専用 UI
    studio.mountPlayer(document.getElementById("player"), daw.getMML().full);

    // コード進行プレイヤー UI
    studio.mountChordPlayer(document.getElementById("chord-player"), "| C | G | Am | F |");

    オプションと戻り値の詳細は型定義(JSDoc)と API リファレンスにあります。

    API 説明
    createDtmStudio(options) 全部入りの入口。mountEditor / mountPlayer / mountChordPlayer / playSingingMML / speak / setMasterVolume(聴く人の音量)/ getAudioStreamTrack(録画用)を持つ
    mountDAW(target, options) 音を持たない編集 UI。onPlayNote / onPlayDrum に自前のシンセを繋ぐ低レベル版
    mountMmlPlayer(target, mml, options) 再生専用 UI(トークンのハイライト・歌声・#audio= の同時再生)
    mountChordPlayer(target, chords, options) コード進行の再生 UI
    playMML(mml, options) 画面なし再生(ゲーム BGM 向け)。ループ範囲・キュー(onCue)に対応
    playSingingMML(mml, options) 歌声トラック入り MML の画面なし再生
    playChords(chords, options) コード進行の画面なし再生(patternType で弾き方を選ぶ)
    playNote(options) 単音の発音(SE・音高確認)
    TRACKS_SIMPLE / TRACKS_ADVANCED 4 トラックの初心者モード/15 トラックの上級者モードの構成(mode と組で渡す)
    startTour(options) ガイドツアー(スポットライト型の案内)。DAW と独立して使える
    createSingingVoices(...) 歌声合成エンジン(低レベル API で singingVoices に渡す)
    createBackingAudio(...) オーディオ同時再生(低レベル API で backingAudio に渡す)
    parseUst / buildUst UST(UTAU)の読み込み・書き出し
    exportMIDI / parseMusicXML / exportMusicXML MIDI・MusicXML の入出力
    pitchV1ToUnits / unitsToHz / units など ピッチ単位の変換(下記)

    ノートのピッチ pitchUnits は 1/372 オクターブの整数(ブランド型 Units)です。12 平均律の 1 半音 = 31 units、31 平均律の 1 度 = 12 units、A4 = 2139 units。 MIDI ノート番号(MidiNote)とは型で区別され、変換は pitchV1ToUnits / unitsToPitchV1 / unitsToMidiDetune、素の数値からは units() / midiNote() を使います。 ドラム(PlayDrumEvent.pitch・DRUM_KEYS)は GM 打楽器のキー番号のままです。

    1.x からの移行: Note.pitch → Note.pitchUnits、init(...) → createRenderer(...)、new MMLCore は第 3 引数 getConfig が必須、transposeNotes は格子ステップ単位。

    宣言 意味
    #inst= / #t<n>inst= 曲全体の楽器プリセット(INSTRUMENT_PRESETS)/トラック n の GM 楽器
    #t<n>font= トラック n の音源バンク: FluidR3(既定)・GeneralUserGS・Aspirin・SoundBlasterOld・JCLive・Chaos・SBLive・Inc(淫ク☆。バンク 0「淫ク☆」の 0-80 YMN「るぅ^~」・0-81 UDK「あーっ」・0-82 野獣シンセ・0-83 MUR「ゾ~」の4音色だけ。楽器の GM 番号 80〜83 で選び、DAW では「音色」欄に出る。ほかの番号は 0-80 で鳴る。配信は onjmin/inc-sf2)・Niji(虹.のレ淫棒 20171022)・Otenkiame(お天気雨のレ淫棒 2020年版 20200424)。レ淫棒の2つはキャラやシリーズごとにバンクを分けた作りで、Niji_33_0 のようにバンクとプログラムを付けて音色を決める(楽器の GM 番号は使わない。DAW では音源の右の「音色」欄で「33-0 「バン」ホーテン_P」のように選ぶ。配信は inc-sf2 の作者ごとのフォルダ)
    #reverb= / #reverbdecay= / #reverbpredelay= マスタリバーブの量(0-100)/長さ(3-40、×0.1 秒)/遅れ(0-150 ms)
    #delay= / #delaydiv= テンポ同期ディレイの量(0-100)/音価(4 8 8d 16)
    #t<n>rev= / #t<n>dly= トラック n からリバーブ/ディレイへの送り(戻りが 0 だと鳴らない)
    #drum= ドラムパターン名。none と省略はドラム無し
    #edo=31 31 平均律(省略時 12 平均律)
    #audio= / #audiostart= / #audioend= 同時に鳴らす音源の URL(mp3 / wav / YouTube)と使う範囲(秒)
    #sf2= / #t<n>font=ExtSF2 外部のサウンドフォント(.sf2)の URL と、それで鳴らすトラック(ローカルの .sf2 は DAW の画面から読み込む)。ExtSF2_<バンク>(0〜127)でプリセットのバンクも決める
    #audio2= 〜 #audio8= / #audio2offset= / #audio2vol= 2本目以降に重ねる音源の URL(mp3 / wav。外の歌声ソフトで作った歌や別の伴奏など)と、開始のずれ(秒)・音量
    #audiooffset= / #audiovol= 開始のずれ(秒。正=音源が先)/音源の音量(0-100、既定 80)

    曲に書かれていない宣言は、読み込み・再生のたびに既定値へ戻ります。

    #inst=retro_game #reverb=30 #delay=15 #delaydiv=8d #t0font=GeneralUserGS #t0rev=40 #drum=none;
    @0 t140 o5 l8 cdeg a4g4;
    
    記号 31 平均律 12 平均律
    # / - ±2 度(クロマチック半音) ±1 半音
    + / _ ±1 度(微分音) ±1 半音

    幹音は c=0 d=5 e=10 f=13 g=18 a=23 b=28 度。記号は累積します(c## は +4 度)。

    @@<トラックID> <モデル> [v<声量>] [q<ゲート>] [p<定位>] [o<オクターブ>] <かな歌詞>
    @0 t120 v100 o4g8 g8 e8 e8 f8 e8 d8 c8 g8 g8 e8 e8 d4.;
    @@0 tsukuyomi どんぐりころころどんぐりこ;

    モデルは klatt(内蔵合成)と UTAU 音源 tsukuyomi / rino / roze / uc / ruko_male / ruko_female / teto / shiyo / rei / mgroid / motroid / nynroid。 歌詞は 1 文字(拗音は 2 文字)=ノート 1 つで対応します。

    記号 意味
    ー / 〜 継続(言い直さずにピッチだけ変える/ポルタメント)
    っ 促音(ノートを消費して無音の閉鎖)
    _ 休符(ノートを消費して歌わない)
    、 ブレス(ノートを消費しない)
    「…」 語り。中身を話し声で読み上げ、ノートを 1 つ消費(UTAU 音源のみ)

    UST(UTAU)ファイルは「MIDI / UST / MML 入力」から音符と歌詞をまとめて読み込め、選択中のトラックを UST で書き出せます。

    GNU Affero General Public License v3.0 以降(AGPL-3.0-or-later)

    Copyright (c) 2025 おんJ民

    v2.1.37 までに公開した版は MIT ライセンスのままです。それより後の版から AGPL-3.0 になります。 改変した dtm をネットワーク越しに使わせる場合(Web サイトへの組み込みなど)は、利用者にその改変後のソースコードを提供する必要があります。