ゲーム用のSEを作成するツールです。コードエージェントで作成しています。音がでます。
操作

① スライダーを移動させると音が作成されて鳴ります。(自動再生)
② 再生ボタンと音量調整できます。
③ wavなどの形式に出力できます。
LIBRARY MANAGER
LIBRARY COMMANDSをクリックするとLIBRARY MANAGERが表示されます。
LIBRARYは、ゲームごとに、使用目的別に管理することを想定した構造にしています。


presetsのデータは消えず、また操作できないようになっています。
LIBRARY MANAGER とは
メイン画面の 「LIBRARY COMMANDS」 から開くモーダルで、ライブラリの JSON の入出力 と Game / Subtab の整理、一括オーディオ書き出し(ZIP) をまとめて行う画面です。
データの階層は次のとおりです。
ライブラリ全体(IndexedDB 等に保存)→ Game(ゲーム単位)→ Subtab(サブタブ)→ 個別 SE(プリセット項目)
内蔵の 「PRESETS (Fixed library)」 は 読み取り専用 で、ユーザー Game のように追加・削除・リネームはできません。
画面の構成
1. JSON(上部2行)
| 操作 | 内容 |
|---|---|
| 全てエクスポート (.json) / Export All | モーダルで選んでいる Game(ユーザーゲーム) を1本の JSON にまとめてダウンロード。中身は version / type: 'game' / game.name / 各 Subtab とその items(name, params, updatedAt)。アイテムが0件だとエクスポートされません。 |
| インポート (.json) | JSON を読み込み、新しいユーザーゲームとして取り込む(インポート時に ID は付け直される)。 |
| 名前を付けて保存 (.json) | 同じく 対象は1つのユーザーゲーム。Chromium 系では保存先を選ぶと 上書き用にファイルと紐づけ できる。 |
| 上書き保存 (.json) | 事前に「名前を付けて保存」で紐づけたファイルに上書き。File System Access API が使えない環境では使えず、トーストで案内される。 |
注意: ドロップダウンが PRESETS(固定) のままだと、エクスポート系は app.activeUserGameId にフォールバックしますが、PRESETS だけを見ていると ゲーム未選択 になり失敗することがあります。JSON の出し入れの主対象はユーザーゲームです。
2. Selection(Game / Subtab)
- Game
- PRESETS (Fixed library) … 内蔵カテゴリのみ。
- それ以外 … ユーザーが作成した Game。
- Subtab
- PRESETS 選び中は 8BIT / REAL / UI / ENV(メインのカテゴリと対応)。
- ユーザーゲーム選び中は、その Game 内の Subtab 一覧。
このドロップダウンは、エクスポートや Copy/Delete/Rename の「どの Game / Subtab を対象にするか」 の指定に使われます。モーダルが開いているとき、一部操作の前に モーダルの選択が app に同期されます(se-library-ui.js の _syncAppSelectionFromModalIfOpen)。
3. Game 行のボタン
| ボタン | 動き |
|---|---|
| Copy / Delete / Rename Game | ユーザーゲームのみ。PRESETS 中は「Fixed library is read-only」等でブロック。 |
| WAV ZIP / OGG ZIP / MP3 ZIP | 選んでいるユーザーゲーム全体を ZIP にまとめる。Subtab ごとにフォルダ分けし、ルートに _manifest.md(各 SE のパラメータ要約)。 |
4. Subtab 行のボタン
| ボタン | 動き |
|---|---|
| Copy / Delete / Rename Subtab | ユーザーゲーム+対象 Subtab が必要。PRESETS では編集不可。 |
| WAV ZIP / OGG ZIP / MP3 ZIP | 現在モーダルで解決した1つの Subtab 内の SE だけを ZIP 化(_manifest.md 付き)。 |
ZIP 共通: ブラウザに JSZip が読み込まれている必要があります。未読込時はトーストで通知されます。
メイン画面との関係(モーダル外)
モーダル以外でも、Game タブ / Subtab タブ で同じ階層を切り替えられます。
- + Game / + Subtab で追加(ユーザーゲーム時)。
- タブは ドラッグ&ドロップで並べ替え可能(Game 同士、Subtab 同士)。
「ライブラリに追加」など 個別プリセットの保存は、アクティブなユーザーゲームと Subtab が決まっている必要があります(未選択だとトーストで案内)。
利用の流れ(例)
- バックアップ: 対象 Game をドロップダウンで選ぶ → 全てエクスポート (.json)。
- 別環境へ: インポート (.json) でゲームを復元。
- 音声だけ大量出力: ゲーム全体なら Game 行の WAV/OGG/MP3 ZIP、1カテゴリだけなら Subtab 行の ZIP。
- 構成の複製・整理: ユーザーゲームを選び Copy Game / Copy Subtab、不要なら Delete、名前変更は Rename。
- 固定プリセット閲覧: Game を PRESETS にし、Subtab でカテゴリ切替(編集はできない)。
補足(仕様上のポイント)
- **「全てエクスポート」**は DB 内の全ゲームを1ファイルにまとめる のではなく、選択(またはアクティブ)のユーザーゲーム1つを JSON にしたものです。
- PRESETS は固定ライブラリのため、JSON の書き出し・ZIP・Game/Subtab の CRUD は ユーザーゲーム向けの動きが中心です。
- ゲーム削除時は、そのゲームに紐づく JSON ファイルハンドルも解除されます(
se-json-fs.js)。
以上が、現在のコードベースに基づく LIBRARY MANAGER の仕様と使い方の整理です。
AI生成
概要
✦ AI SE GENERATOR は、自然言語の説明から Web Audio 合成用パラメータ(単一レイヤーまたは複数レイヤー) を LLM に生成させ、メインの シンセエディタの状態 に載せる機能です。ヘッダーの 「✦ AI 生成」 でモーダルを開きます。
仕様
入出力の形
- 入力: ユーザーが書いた プロンプト(日本語・英語どちらでも可。UI言語に応じてシステムプロンプト側で「テキストフィールドは英語で」等が付く)。
- 出力: LLM は JSON のみ(マークダウンやコードフェンスなし)を返すよう指示されているが、実装は コードブロック内の JSON や 先頭の
{...}も抽出してパースする(_extractJsonRaw)。
単一レイヤー(デフォルト)wave, frequency, attack, decay, sustain, release, sweep, cutoff, resonance, distortion, reverb, vibrato, duration に加え、メタとして name, nameEn, desc。
パース後、数値は _clampSynthFields で 許容レンジにクランプ(例: frequency 20–2000、duration 50–5000 ms など)。
レイヤーモードlayers 配列。各要素に mix(0–1)、delayMs(0–5000)、muted、上記と同系の合成パラメータ。
最大レイヤー数は UI で 2〜4(プロンプトの {{MAX_LAYERS}} に反映)。実際に採用するのは 先頭から最大 N 件(slice(0, cap))。
対応プロバイダ(PROVIDER_CONFIG)
| Provider | 接続先の考え方 |
|---|---|
| Google (Gemini) | OpenAI 互換エンドポイント generativelanguage.googleapis.com/v1beta/openai に Bearer で chat/completions。 |
| Groq | api.groq.com/openai/v1。 |
| OpenAI | api.openai.com/v1。 |
| Anthropic | api.anthropic.com/v1/messages(専用形式)。ブラウザから叩くため anthropic-dangerous-direct-browser-access: true ヘッダーを付与。 |
| OpenRouter | openrouter.ai/api/v1。HTTP-Referer に現在ページ URL を付与。 |
モデル一覧は 組み込みリスト か、/models を API キー付きで取得した結果をキャッシュ(24 時間 TTL)。「— カスタム入力 —」 でモデル ID を直接指定可能。
Groq とサーバープロキシ(重要)
独自の Groq キーを入力すると、そのキーで直接 Groq API に送る(プロキシより優先)。
トークン上限
- OpenAI 互換: 単一 4096、レイヤー 6144。
- Anthropic: 単一 1024、レイヤー 4096。
ローカル保存
localStorage に プロバイダ、API キー(プロバイダ別)、モデル選択、モデル一覧キャッシュ、レイヤーモード、最大レイヤー数 を保存。
ヘルプ文言では 「当アプリのサーバーにはキーを送らない」 と説明されているが、実際の推論は各クラウド API(および Groq プロキシ利用時はその PHP サーバー)にリクエストとして届く点は利用者が理解しておく必要がある。
プレビューと適用
- プレビュー: 直近の生成結果を
stateに反映しplaySE()(モーダルは開いたまま)。 - エディタに適用: 同様に反映したうえで モーダルを閉じるし、トーストで名前を表示。
単一レイヤー時はreplaceLayersWithSingleFromFlat()でレイヤー UI を単一に揃える。レイヤー時はapplyLayersFromAiParsed。
ライブラリへの自動保存はしない。 適用後、通常どおり 「ライブラリに追加」 等で保存する。
使い方(手順)
- 「✦ AI 生成」 をクリックしてモーダルを開く。
- 「API 設定」 を開き、Provider と API キー(Groq でプロキシ利用なら空でも可)、モデルを選ぶ。必要なら ↻ でモデル一覧を更新。
- テキストエリアに 作りたい SE を具体的に書く。下の 例文チップ を押すとプロンプトに流し込める。
- 複雑な音にしたいときは 「レイヤーで生成」 をオンにし、最大 2〜4 レイヤーを指定。
- 「✦ 生成する」 を押す。成功すると結果カードに名前・説明・タグ(またはレイヤー一覧)が出る。
- 「プレビュー」 で試聴、問題なければ 「エディタに適用」 でメイン画面のパラメータに反映。
- 以降はエディタで微調整し、WAV/OGG 書き出しやライブラリ保存へ。
トラブル時の目安
- レイヤーモードで
layersが返ってこない → エラーメッセージどおり、再生成するかレイヤーをオフにする。 - Groq + キーなしで「サーバー起動中」 → プロキシの起動待ち。しばらく待って再試行。
- CORS / ブラウザ直叩き → Google・Groq・OpenAI・OpenRouter はブラウザから各 API に
fetch。Anthropic は公式がブラウザ利用を許容する設定とヘッダー前提。環境・ポリシーによってはブロックされる場合がある。
まとめ
| 項目 | 内容 |
|---|---|
| 目的 | 自然言語 → シンセパラメータ(単一 or 多層) |
| 開き方 | ヘッダー「✦ AI 生成」 |
| 必須 | プロンプト。多くの組み合わせでは 各社 API キー(Groq はプロキシ経由でキー省略可) |
| 生成後 | プレビュー/エディタ適用。ライブラリ保存は別操作 |
| 設定の保存場所 | localStorage(キー含む) |
以上が、現在のコードベースに沿った AI 生成の仕様と使い方 です。
コメント