Skip to content

Repository files navigation

Elevator Three

自動生成のエレクトロを鳴らし続けるシングルファイルの楽器。 elevator-two から分岐し、音楽的な判断を TypeSafe の Jev に文脈つきで任せて、 展開と即興を豊かにすることを目指す。

最新版: v0.5 — 変更点は下の変更履歴を参照。

https://elevator-noise.com/three/ をブラウザで開き、中央にある大きな再生ボタンを押すと鳴りはじめる。 Webブラウザの一般的な仕様の制限のため、開いただけでは音は出ないため、再生ボタンを押す必要がある。音と操作は elevator-two v0.6 を引き継いでいる。 次のシーン・遷移の方式・キーと進行・フレーズ・イベント・ダブ・リフの旋律は、数小節先に Jev へ問い合わせ、 返った確率分布から引く。control の jev はその割合で、0 にすると elevator-two と同じく Jev を用いた AI 判断は用いず乱数を用いた判断で演奏する。 問い合わせは中継の Worker (worker/) を通す。繋がらないときは手元の判断で鳴り続ける。

設計の議論と決定は docs/DESIGN.md に集約している。D-1 から振り直した。 elevator-two から引き継いだコードや文書に残る two:D-n は、two の決定 (docs/two-DESIGN.md) を指す。 シーンの定義は docs/SCENES.md、実装の構造は docs/ARCHITECTURE.md、 テストは docs/TESTING.md に分けてある。

elevator-two との関係

elevator-two elevator-three
音楽 エレクトロ (minimal techno を土台に electro funk / dub techno / グリッチを混ぜる) 同左を引き継ぐ
判断 手元の乱数と種 Jev に文脈つきで問い合わせる。応答が無いときは two と同じ判断に戻る
通信 ネットワークに一切繋がらない 判断の問い合わせだけ、自前の中継に繋がる
実装 単一 index.html、ビルド工程なし 同左を踏襲

コードは外の elevator シリーズとは共有せず、elevator-two から土台をコピーして分岐させた。共通化のための仕組みは持たない。

Jev の中継 (worker/)

CORS制限のためブラウザから直接 api.typesafe.ai は呼べないので、Cloudflare Worker elevator-three-api を挟む (D-3)。

cd worker
npx wrangler secret put TYPESAFE_API_KEY   # 初回だけ
npx wrangler deploy                        # three-api.elevator-noise.com

ローカルでテストするときは worker/.dev.vars に TYPESAFE_API_KEY=... を書いて npx wrangler dev (ポート 8787) を立てる。 localhost / 127.0.0.1 で開いた index.html は、既定でこちらに問い合わせる。 Worker の試験は npm run test:worker。

変更履歴

v0.5 (2026-09-21)

Jev に渡す演奏履歴を、生の JSON 配列から1本の英文 (story) に変えた。 長く鳴らしても送る量が増えず、セット全体の経緯は数として残る。

操作と見た目

  • JEV 欄の query に履歴を出すようにした。ナラティブな英語文になったため、大きなJSON配列のように表示領域を過剰に消費することなく表示できる (D-21。D-16 の除外を解除)

開発

  • 履歴は narrateHistory() が英文に畳んで渡す。節は固定 (経過・シーン・キー・フレーズ・イベント・リフ・ダブ) で、 各節の具体例は2〜4件までなので文の長さが増えない。実測 174〜508字 (生の配列は 1108字、伸び続けると約1600字) (D-21)
  • 小節は絶対値ではなく「6 bars ago」の相対表現にした。8件の履歴からあふれた分は histTotal の累計として残るので、 「12 parallel shifts」「10 ornament events so far」のようにセット全体の積み上がりは数で伝わる (D-21)
  • 履歴を直近16小節で切る案は、入れたあと取り消した。リフが0件・シーンが1件になり、長期の判断の根拠が消えるため (D-20 → D-21)
  • 試験を足した。文の長さが伸びないこと、転調が8件の履歴からあふれても問い合わせが止まらないこと、 リフの累計といまのモチーフの回数を混ぜないこと

v0.4 (2026-09-19)

音色と細部の判断も Jev に任せ、Jev の確率に掛ける温度をスライダーで決められるようにした。 Jev の判断は、右カラムの新しい DECISION 欄に出す。配色を青紫とクリームにした。

操作と見た目

  • 配色を青紫の地、白い文字、淡いクリームの差し色にした。about と docs の解説 html も同じ (D-16)
  • 既定値を上げた。shift / lush を 0.8、jev を 1、mixer の funk bass / other bass を 0.5 (D-16)
  • 長大な JSON 配列が表示領域を過剰に消費するため、jev 欄の JSON から history を外した。送る state には含む (D-16)
  • 右カラムの jev 欄の下に decision 欄を足し、Jev の答えで音楽的に何が起こるかをそこへ移した。高さは3行で、新しい順に1件1行。 jev 欄のやり取りが長くなり、スクロールしないと見えなくなったため (D-19)
  • decision 群に temperature (0〜2、既定 1) を足した。Jev の確率に掛ける温度で、下げるほど Jev のいちばんの答えに寄り、0 では必ずそれを取る。上げるほど均す (D-18)

音

  • 音色と細部の判断も Jev に問い合わせる。行き先のシーンのベースの音色・コードの連打・インダストリアル・ノイズ、 ep の差し込み、16分シーケンスの音色、並びの書き換え、8小節の終わりのキックの変形、平行移動の幅、ペダル。 問い合わせの回数は増やさず、既存の問い合わせに質問を足した (D-17)

開発

  • 中継の Worker に質問を9つ足した。index.html より先に Worker をデプロイすること (古い Worker は知らない質問を 400 で弾く)
  • 毎小節使う判断のため、届いた答えを次の答えまで jevHold に持つ (D-17)
  • 試験を足した。上の判断が Jev の答えどおりになること、temperature 0 でいちばん確率の高い答えだけを取ること

v0.3 (2026-09-19)

画面を3カラムにし、Jev とのやり取りを専用の欄に出すようにした。配色を紫にした。

操作と見た目

  • 3カラムにした。左は scene、中央は control と mixer、右は monitor と jev。狭い画面のタブは scene / param / monitor (D-14)
  • jev 欄に、Jev とのやり取りを新しい順に出す。送った query の JSON (グレー)、返った result の JSON (白)、 その結果音楽的に何が起こるか (強調)。やり取りが増えても、伸びるのは jev 欄の中だけ (D-15)
  • 配色を #d8b2ff / #b266ff / #4500e2 / #3100a2 / #4c0099 の5色にした。about と docs の解説 html も同じ (D-13)

開発

  • 真偽の問いの jevP() を、引いた結果を返す jevRoll() にした (D-15)
  • 試験を足した。やり取りが20回を超えても mixer と jev 欄の位置と大きさが変わらないこと、3色が読み分けられること

v0.2 (2026-09-19)

音楽的な判断を Jev に任せるようにした (D-3〜D-9)。

音

  • 次のシーン、遷移の方式、シーンの長さを Jev に問い合わせる。候補は two と同じく陰陽の波に近いものに限る
  • 行き先のキーと和音の進行、平行移動の転調、開いた和声を Jev に問い合わせる
  • 次のフレーズ型、第3層イベント (起こさないことも含む)、ダブを出すかを Jev に問い合わせる
  • リフを新しく引く回は、候補を6通り作って Jev に選ばせる
  • どれも最大確率ではなく、返った分布から引く。応答が間に合わなければ two と同じ判断に戻る

操作と見た目

  • control に decision 群を足し、jev スライダー (既定 0.8) を置いた。判断のうち Jev に任せる割合
  • monitor に Jev の状態・応答時間・Jev と手元で決めた数・直近の判断を出す
  • monitor の最下段に Jev とのやり取りを出す。何を問い、何が返り、何を使ったか (D-11)

開発

  • 中継の Worker を worker/ に置いた。質問文は Worker 側だけが持ち、形とサイズ、オリジン、回数を絞る
  • ?jev=0 / ?jevurl= / ?jevlog / ?scenebars= を足した
  • tests/jev.spec.js を足した。Worker の応答を差し替えて、答えどおりに鳴ること、遅れた答えを捨てること、 繋がらなくても止まらないことを見る

v0.1 (2026-09-19)

elevator-two v0.6 から分岐した (D-1 / D-2)。音と操作は v0.6 と同じ。

ライセンス

MIT

About

Jev に判断を任せる自動生成のエレクトロの楽器

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages