rox

住在播放器里的可视化效果

大多数播放器给一个频谱分析器就到此为止。rox 有那些面板,有一个能跑二十年预设的 Milkdrop 引擎,而在它们下面还铺了一层调制:从音频里取出的具名信号,路由进你自己写的着色器输入,跟主题的其余部分存在同一个文件里。

先说普通面板

频谱面板有柱状和方块两种样式,还有渐变、带自己重力的峰值帽、频率标签,以及分区功能:在你选的频率上下用不同的窗口大小分析,让频率范围的两端各自决定要反应快还是分辨细。波形画的是整首曲目,按声道分开,点哪儿就跳到哪儿。还有一个 VU 表,和一个用真正 3D 转封面的封面架。这些全都不用写一个字的代码,也是大多数人真正会用的。

暂停会把柱子冻在原处,而不是让它们落到地板上。听起来是小事,直到你想看清刚才暂停的到底是哪一瞬间。

Milkdrop,在面板里,也在一切的背后

Milkdrop 面板在自己的线程里通过 libprojectM 渲染预设,再把结果走跟其他东西一样的着色器链画出来,所以它像任何面板一样能停靠、成标签页、弹出成窗口,表面着色器也照样能盖在上面。把预设包放进“预设”页面写明的文件夹里,Cream of the Crop 或者原版 MilkDrop 那一套都行,然后点重新扫描。包里自带的贴图会自己被找到。

“选择预设”在单独的窗口里打开浏览器:文件夹树或缩略图网格、筛选、收藏开关和键盘导航。点一个预设,它马上就在窗口背后加载,所以你看到的是真实渲染,不是预览。轮换决定“下一个”“上一个”和定时切换在哪一组里转,锁定则跨曲目守住一个预设。

同一个引擎也当作背景跑在每个窗口后面,按你设定的强度合成在模糊的封面上。预设可以保留自己的颜色、为浅色主题翻转、用调色板来画,或者取正在播放的封面的颜色而留下预设自己的细节,专辑染色还会把色相往封面那边推。队列停下时它会淡出,渲染线程也停掉,所以闲着的画面不花任何东西。

着色器,四块表面

rox 的着色器就是一个 WGSL 片元阶段。它可以跑在单个面板的主体上,可以自己占一个着色器面板,可以铺成盖住整个窗口的覆盖层,也可以画在所有面板之下、封面之后当背景。覆盖层和背景各带一个开关,能扩展到 rox 打开的每一个窗口。四者的语言、uniform 块和路由都一样。

每个着色器都拿得到时钟、分辨率、指针,还有八个描述当下的元浮点数:音量、播放头在曲目里的位置、音频是不是真的在动、曲目的长度,以及当前调色板渲染得有多暗,这样着色器能自己适配浅色和深色,而不是只服务它写出来时对着的那个主题。

面板着色器还能读到面板实际画了什么。遮罩绑定会把面板自己的绘制重放到透明底上交给它,面板也会公布自己内容的形状,所以阴影或者辉光跟着那张加了黑边的封面走,而不是跟着它两侧的空白走。

一个阶段不够用时,一条 // @pass 注释会把文本拆成一条链,最多八个阶段,每个阶段都能按名字读取它之前的阶段。模糊金字塔或者两级泛光要的就是这个。一行 // @asset 指定一张要采样的图片,而 // @asset art: @cover 绑定的是正在播放曲目自己的封面,换曲时重新绑定。应用随附九个示例,各自演示这套约定的不同部分,而不是九种等离子变体。

把面板指向硬盘上的一个文件,rox 会盯着它。在编辑器里一保存,窗口就拿到了。保存后编译不过,屏幕上留着上一个能用的版本,错误显示在面板里,因为让画面整个消失是发现自己敲错一个分号的糟糕方式。

信号才是不一样的那部分

里面只有时钟的着色器是屏保。让它变成可视化效果的是你喂给它什么,而在 rox 里那是一池全应用共享的具名信号。信号在一个独立窗口里搭,位置在“应用”下面、均衡器旁边,窗口带着一个频谱和一套播放控制,理由和均衡器一样:挑频段得对着真正在放的东西,眼睛耳朵一起用。

来源有五种。频段是两个频率之间的能量,一次渐强靠的就是这个信号。电平是整个混音。起音在某个频段跳过它自己最近的均值时脉冲一下,一次击打走的就是这个信号。触发在某个频段越过你画的那条线时脉冲,适合那种移动均值一直降不下来、起音过了第一小节就没声了的素材。累加把另一个信号随时间加起来并在 1 处回绕,这样着色器可以把它读作一个相位:音乐响时往前走,不响时停住。

每一种都带响应平滑和一个门限。门限是那个真正对得起自己位置的设置:频段要是贴着房间底噪,挂在它上面的每个旋钮就永远稍稍偏离静止位置,而带曲线的阈值会在击打之间交出真正的静默。表盘画的是没过门的值,阈值横标在上面,因为柱子一旦在自己门限下面消失掉,对摆放这个门限就毫无帮助了。

一条路由把一个信号接到一个参数上,再带一个输出区间:这个信号、这个目标、从这儿到那儿。每个着色器通十六个槽位,没有路由的槽位在设置页上就是一个普通滑块,所以一套外观可以一半是演出、一半是手动摆好的。

Critters,作为论据

盒子里有一套工作区,是把整个播放器渲染成 1 位印刷品:每一块表面上的有序抖动、跟着超低频压碎的色调,还有面板后面一面随歌移动的噪点墙。它就是一个文件,里面五个信号加四个着色器,没有任何一处是应用里的特例。

Critters 这套 rox 工作区:整个窗口用黑白有序抖动渲染,一排弧形排列的专辑封面压在进度条、播放控件行、波形条和曲目表格上方,全都坐在一片流动的噪点上。

从欢迎窗口加载它,然后打开设置,把它拆开看。其余那些

跑陌生人的着色器

着色器是装在工作区文件里流通的,也就是说导入进来的一套外观带着别人的代码。

在你点头之前什么都不会跑。每个着色器的源码都会做指纹,批准列表只在本机,而且只有直接操作才写得进去:选了文件、点了重新加载、选了预设、按了“批准”。随包裹到来的那套外观就停在那儿,下面挂个按钮,直到那一刻为止。rox 随附的示例天生受信任,因为它们是编译进可执行文件的。

打开它会弹一个确认窗口,等你回答,不倒计时,而这个窗口本身永远不会被着色。不管着色器把屏幕其余部分弄成什么样,退出去的那条路一直看得清。

没有处理的部分

  • 路由通到着色器槽位和粒子面板的旋钮。其他面板的设置还是手动调的旋钮。
  • 是 Milkdrop 预设,不是 AVS。Winamp 的 AVS 没有导入器。而且预设是你磁盘上的文件,所以加载了哪一个只留在这台机器上,不会跟着工作区走。
  • 没有 MIDI 或 OSC 控制器支持。存在的就是覆盖层通道和面板通道,由音频和指针驱动。
  • 一次整窗通道就是每一帧一次真正的 GPU 通道。笔记本用电池时,这是你自己做的选择。

从“我想让整个播放器跟着底鼓闪”到真的做到,中间是一个频段、一个门限和一条路由,三样都不需要重新编译。

拿你自己的媒体库试试

这里没有任何东西往外打电话:分析的就是已经在过播放器的那段音频。更多内容见一套工作区都装了什么

下载 rox

用 Arch 或 NixOS?那就从 AUR 或 Nix flake 装吧。

v1.26.4 · Linux、macOS、Windows · 全部下载