搜索你想找的开源项目

输入名称、用途或关键词,也可粘贴 GitHub 仓库链接

分享到微信

当前解读页的微信分享二维码

用微信扫一扫打开,点击右上角「···」分享给朋友或朋友圈。

手机上可截屏后,在微信扫一扫中从相册识别二维码。

rauchg/vinyl

多媒体与设计

在浏览器中从沟槽开始物理模拟黑胶唱片的刻录、压制与播放。

104
26
JavaScript
MIT
创建于 4 天前

项目介绍

vinyl 是一个在浏览器里模拟黑胶唱机的项目:它播放的不是解码后的音频文件,而是把音乐刻成 45/45 立体声沟槽的形状,再用模拟的唱针、悬臂、唱臂和唱头在音频线程上读取。你听到的声音,是这种运动在唱头中感应出的电压经过 RIAA 去加重后的结果。

项目面向对音频、Web Audio、WebGL2 和物理模拟感兴趣的读者。它提供预先刻好的公有领域唱片,也支持把用户拖入的音频在 worker 里现场刻录。沟槽粗糙度、灰尘、划痕、翘曲、偏心孔和沟槽回声都作用在几何本身,而不是作为音频效果叠加 README。

快速使用

直接使用托管版本:用支持 WebGL2 和 Web Audio 的现代浏览器打开 vinyl-gl.vercel.app,无需安装。

本地运行需要 Node.js 22 或更高版本。README 给出的启动命令是 vercel dev README,它会构建一次并在 localhost:3000 提供服务;修改文件后需要重启。

如果不想用 Vercel,构建本身是普通 Node 脚本,可以直接运行:

npm run build   # 写入 dist/:index.html、src/、assets/、records/
npm test        # 离线检查物理模拟:响应、失真、表面噪声、cue、跳针
npm run bench   # 引擎每秒音频的 CPU 开销

新增唱片或改动刻录器后需要重新刻录,这一步依赖 ffmpeg。npm run lathe 会处理所有过期的唱片,node lathe.mjs <名称> 只处理指定的一张,之后提交 assets/ README。构建会拒绝部署从未刻录过的架上唱片。

工作原理

处理流程分四步,每步对应独立源码文件 README:

  1. 刻录 — src/cut.js 把音频转换成 33⅓ rpm 的两道沟槽壁,应用 RIAA 预加重、加速度限制器,并把螺旋间距安排到能容纳在一张 12 英寸唱片上。
  2. 压制 — src/press.js 改变唱片几何:壁面粗糙度、灰尘、划痕、翘曲、偏心孔、沟槽回声。它带种子,同一张唱片每次压制结果一致。
  3. 播放 — src/engine.js、src/engine-core.js 和 src/groove.js 让唱针沿沟槽壁运动。有限半径的针尖无法完全跟随沟槽壁,由此产生 tracing distortion、pinch effect 和内圈高频损失,而不是作为效果加进去。
  4. 绘制 — src/render.js 和 src/shaders.js 直接根据刻录结果绘制真实螺旋,并按每一圈的调制强度打光。

使用约束

项目运行在浏览器中,依赖 WebGL2 和 Web Audio,物理模拟跑在 AudioWorklet 里。构建和测试需要 Node.js 22 或更高版本;没有第三方依赖,也没有 bundler,构建只是复制文件。重新刻录唱片需要 ffmpeg,而完整刻一面耗时较长,所以架上的唱片是预先刻好并提交到 assets/ 的。

代码采用 MIT 许可证 LICENSE。随仓库附带的录音保留各自许可证,其中 Summer: Presto 为 CC BY-SA 4.0,因此由它刻出的唱片也沿用该许可证。源音频放在 records/,清单在 src/records.js。

HotRepo 点评

该仓库在 2026-11-10 进入 HotRepo 新项目榜的 JavaScript 榜,记录为 104 stars、26 forks,在 2026-11-09T23:15Z 开始的约 1.5 小时窗口内新增 4 stars。这只是单条短窗口记录,还不足以判断趋势。技术上值得注意的地方在于它的出发点:不把黑胶噪声当作效果叠加,而是从模拟的沟槽几何和接触力学中推导播放失真,同时提供预先刻好的唱片,让浏览器端加载不至于太慢 README。

本文由 AI 根据项目 README 生成,更新于 ,以项目官方文档为准。

相关推荐

  1. guzhezao/needle可交互的 3D 黑胶唱机展示,通过拖拽、换盘和变速探索四个章节,声音可选。JavaScript109