How It Works
SiteTuneは「サイトのURL → HTML取得 → 構造解析 → イベントJSON → WebAudio合成」という4段階のパイプラインで動作します。AIや機械学習を一切使わず、すべて決定論的なルール変換です。
STEP 1: HTMLを取得する
ユーザーが入力したURLに対し、サーバー側のWordPressプラグイン(HTMLSong WP)が wp_remote_get() でHTMLを取得します。これによりCORSの問題を回避し、ブラウザだけでは取得できないクロスオリジンのページも解析できます。
取得時のタイムアウトは10秒、ユーザーエージェントには「HTMLSong/2.0」を名乗ります。
STEP 2: 構造を抽出する
取得したHTMLを DOMDocument でパースし、以下の要素を集計します:
- 見出し(h1〜h6)の階層分布と総数
- 段落(p)数
- リンク(a)数、画像(img)数、リスト(ul/ol/li)数
- meta description / meta keywords / OGP情報の有無
- タイトルの長さ
- HTML全体のサイズ(バイト数)
- サイトの「複雑さスコア」(タグの種類数 × ネストの深さ)
STEP 3: イベントJSONを生成する
STEP 2で得た数値を、音楽パラメータに割り当てます:
- テンポ — ページサイズと段落数から決定(小規模=速い、大規模=遅め)
- キー(調) — ドメイン名のハッシュから12音から1つを決定論的に選択
- スケール — タグ多様性から、メジャー / マイナー / マイナーペンタトニック等を選択
- ジャンル — 構造の複雑さスコアで4ジャンル(Synthwave / Electropop / Techno / Ambient)を分岐
- コード進行 — 見出しh1〜h6の出現パターンから、4小節 × 4のループを構築
- メロディ — リンク数を音価、見出し階層を音高に割り当て
- ベース — 段落数を反映したリズムパターン
- ドラム — リスト要素数からキック・スネア・ハイハットの密度を決定
これらをまとめた軽量なJSON(数十KB)が生成され、ブラウザに返されます。
STEP 4: ブラウザで合成・再生
JavaScript(WebAudio API)が、受け取ったJSONをイベントごとに以下の楽器で合成します:
| 楽器 | 合成方法 |
|---|---|
| ベース | 2オシレータ(saw + square / sine)+ レゾナントフィルタエンベロープ |
| コード | synthPluck(synthwave/electropop)または synthPad(ambient/techno) |
| リード | 2オシレータ + デチューン + ポルタメント + 遅延ビブラート |
| キック | サイン波のピッチスウィープ + サブベース + クリックトランジェント |
| スネア | ピッチドサイン波 + バンドパスフィルタードノイズ |
| ハイハット | 4つの非調和矩形波 + ノイズ + ハイパスフィルタ |
なぜ「決定論的」にこだわるのか
「同じ入力からは同じ出力」というシンプルな性質は、サービスとしての一貫性・予測可能性を生み出します。AIによるランダム生成では、毎回違う曲が生まれてしまい、ユーザーが「あのサイトの曲もう一度聴きたい」と思ったときに同じものを再現できません。SiteTuneはWebサイトと音楽を1対1で対応させたかったため、決定論的アプローチを選びました。
サイトごとの音の違いを聴き比べてみる
サンプルページでは、Yahoo / Google / GitHub / Wikipedia などの代表的サイトの音楽を聴き比べることができます。それぞれのサイトの構造的特徴が、音楽の「違い」として現れます。