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 などの代表的サイトの音楽を聴き比べることができます。それぞれのサイトの構造的特徴が、音楽の「違い」として現れます。
解析スコアの見方
SiteTune の音楽生成は、HTMLをそのまま音に置き換えているわけではありません。ページから得られる複数の特徴量をスコア化し、それぞれをテンポ、スケール、ジャンル、パート密度、フレーズの変化量へ割り当てています。たとえば、タグ数が多いページは情報量が多いページとして扱われ、深さがあるページは階層的な展開を持つページとして扱われます。
| 解析項目 | 見ているもの | 音への影響 |
|---|---|---|
| tag_count | HTML要素の総数 | 音数、展開量、リズム密度の基礎になる |
| depth_avg / depth_max | DOM階層の平均と最大値 | 低音やコードの動き、曲全体の重さに影響する |
| semantic_ratio | article、section、nav など意味を持つ要素の比率 | ジャンル判定やフレーズの整理感に影響する |
| heading_count | h1〜h6 の数 | フレーズの区切り、リード音の入り方に影響する |
| structured_data_score | JSON-LD や meta 情報の整備度 | 曲の安定感や構造の明瞭さに反映する |
同じURLで同じ曲になる理由
SiteTune はランダムに音を鳴らしているのではなく、URLと解析結果からシード値を作り、そこから音楽イベントを決定します。そのため、ページ構造が変わらなければ同じURLからは同じ曲が生成されます。逆に、見出しの追加、ナビゲーションの整理、構造化データの追加などでHTMLが変化すると、生成される曲にも変化が出ます。
音が単調になるケース
本文が極端に少ないページ、見出しがないページ、ほとんどの要素が同じタグで構成されているページは、解析結果の変化幅が小さくなります。その場合、リズムやフレーズも単調になりやすくなります。これは「悪いページ」という意味ではありませんが、SiteTuneでは構造の差が音の差として出るため、ページの情報設計を見直すきっかけになります。