explainroo
explainroo is a free, open source tool that lets your AI agent make explainer videos with a voice. It runs on your own computer and needs no API key.
手元の音源をレコードの回転数で再生するWebアプリ。音源はブラウザ内だけで処理します。
Translation pending
MediaJavaScript · CSSGitHub @odditymanaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
手元の音源を、ターンテーブルの回転数とピッチで楽しむWebアプリ。33/45回転・ピッチ±8%・スクリュー再生に対応。Bandcampなどで購入した音源(FLAC・AIFF・WAV・MP3など)を、ブラウザ内だけで再生します。
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗手元の音源ファイルを、ピッチコントロール付きのターンテーブルのように、回転数とピッチを切り替えて再生する Web アプリです。
公開ページ: https://odditymana.github.io/test-pressing/
普段はレコードで DJ をしています。Bandcamp で買ったデータ音源も、Technics のターンテーブルみたいにピッチを上げ下げして聴けないかな、と思ったのがきっかけです。
※その曲の盤が33回転か45回転かは、Discogs などで確認できます。
そんな「DJ をしていて欲しかったもの」を形にしたアプリです。
すべての操作をキーボードで行えます。
| 部品 | キー | 動き |
|---|---|---|
| 全体 | Tab / Shift + Tab | 部品を移動する |
| 回転数 | ← → ↑ ↓ | 33/45/スクリューを切り替える |
| ピッチ | ↓ / ↑ | +0.1% / −0.1%(つまみが下 / 上へ動く) |
| ピッチ | PageDown / PageUp | +1% / −1% |
| ピッチ | End / Home | +8% / −8% |
| 再生位置 | ← → | 1秒ずつ戻す / 進める |
| 再生位置 | Home / End | 曲の始め / 終わり |
| 形式 | 対応 |
|---|---|
| MP3・WAV・FLAC・AAC(.m4a)・Ogg | ブラウザがそのまま再生 |
| AIFF・AIFF-C(NONE / sowt) | ブラウザ内で WAV に変換して再生(8〜32bit) |
| ALAC(.m4a) | Safari のみ。ほかのブラウザでは案内メッセージを表示 |
どの形式を再生できるかは、ブラウザによって異なります。
audio 要素の playbackRate(再生速度の倍率)に「基準速度 ×(1 + ピッチ ÷ 100)」を入れています。ブラウザは標準では、速度を変えても音の高さを保とうとします。そこで preservesPitch = false にして、レコードと同じように「速いほど高い音」になるようにしました。古い Safari・Firefox 向けの webkitPreservesPitch・mozPreservesPitch もあわせて設定しています。
最初は CSS アニメーションの animation-duration を速度に合わせて変える案でした。ただ、この方法では速度を変えた瞬間に角度が計算し直され、レコードがワープしてしまいます。そこで requestAnimationFrame を使い、毎フレーム「経過時間 × 回転の速さ」を今の角度に足す形にしました。回転の速さは毎回 playbackRate から読むので、速度との連動に追加のコードは要りません。
AIFF は「チャンク」という箱が並んだ形式です。COMM(音の形式)と SSND(音のデータ)を読み、WAV のヘッダを付けて作り直しています。
針先がレコードの中心から 44(一番外側の溝)と 22(一番内側の溝)の距離に来るアームの角度を計算しました(座標は台座の直径を 100 とした値)。その2つの角度の間を、再生の進み具合(再生位置 ÷ 曲の長さ)で比例させています。比例させた場合の針先の位置のずれは、台座の直径の 0.1%以下です。
ニードルドロップはその逆の計算です。クリックした位置の中心からの距離を、進み具合に変えています。中心は、回転していない台座の位置から求めています。回転している要素の四角い範囲は、角度によって大きさが変わってしまうためです。
display: none ではなく見た目だけ隠し、フォーカスが来たときは label 側に枠を表示しています。prefers-reduced-motion(OS の「動きを減らす」設定)が有効なときは、レコードの回転を止めます。このアプリは Claude Code を使って開発しました。仕組みは、自分で理解して説明できる範囲のものだけを採用しています。
HTML・CSS・JavaScript のみで作っていて、フレームワークやライブラリは使っていません。
test-pressing/
├── index.html 画面の骨組み
├── css/
│ └── style.css 見た目(レイアウト・レコード・操作パネル)
├── js/
│ ├── aiff-to-wav.js AIFF → WAV 変換
│ └── main.js 読み込み・再生・速度・回転・再生位置
├── tests/
│ └── aiff-to-wav.test.js AIFF 変換のテスト
├── docs/
│ └── checklist.md ブラウザごとの確認項目
├── LICENSE
└── README.md
index.html をブラウザで開くだけで動きます(サーバーは不要です)。
Node.js 18 以降で、プロジェクトのフォルダから実行します。
node --test
テスト用の音はテストの中で生成するので、音源ファイルは必要ありません。
ブラウザでの確認項目は docs/checklist.md にまとめています。