尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证手元の音源を、ターンテーブルの回転数とピッチで楽しむWebアプリ。33/45回転・ピッチ±8%・スクリュー再生に対応。Bandcampなどで購入した音源(FLAC・AIFF・WAV・MP3など)を、ブラウザ内だけで再生します。
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 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 にまとめています。