我第一次看到示波器音乐是在一个满屏波形的深夜工作间隙,刷到一支视频:屏幕上一条光滑的蓝色曲线正随着音乐节奏扭动,鼓点一到就迸成一个旋转的多面体。当时我以为是后期特效,后来才确认,这是真实信号驱动下,示波器 X-Y 模式直接“画”出来的画面。这就是 Oscilloscope Music(示波器音乐):不是拿示波器当波形监视器看信号,而是把立体声的左右声道分别接进示波器的 X 轴和 Y 轴,让音频信号本身变成一支矢量画笔。
它能做什么?对硬件工程师来说,这是理解李萨如曲线、相位关系、信号调制最直观的玩法学具;对音乐人和视觉创作者来说,这是低成本又能输出特色画面的矢量视觉方案;对喜欢硬核折腾的玩家来说,这是把数学、音频、测量仪器串在一起的高级玩具。这篇内容适合完全没有示波器使用经验的新手,也适合想做出成熟作品的进阶折腾党。下面我按“原理 → 工具选型 → 实操 → 问题排查 → 扩展”的顺序,把我自己从零折腾一圈的经验完整写出来。
1. 示波器音乐的核心原理:从波形到画面
1.1 普通示波模式与 X-Y 模式的本质区别
常规情况下,大家用示波器看信号,时基电路会按照时间从左到右扫描,X 轴固定是时间,Y 轴显示电压幅度。你看到的是一段波形随时间被“铺开”的样子。这种模式下,示波器本质上是一台“电压-时间记录仪”。
示波器音乐的关键在于切换工作模式。X-Y 模式彻底关闭了内部时基扫描,把 X 轴也变成外部信号的输入通道。双通道示波器里,一路信号驱动 X 轴偏转,另一路信号驱动 Y 轴偏转。此时显示不再表示“电压随时间变化”,而是表示“Y 电压相对 X 电压的关系曲线”。这套机制最初是为了看两个信号的相位关系而设计的,李萨如曲线就是最典型的产物。
打个比方:普通模式像一个人在纸上从左往右匀速写字,X-Y 模式则像是在纸上任意方向移动笔尖,笔尖能画圈、画弧线、画任何二维轨迹。只要你能让两路信号精确控制笔尖的位置,就能在屏幕上“作画”。
1.2 李萨如曲线公式:为什么两个正弦波就能画出图案
当两路输入都是正弦波时,屏幕上显示的图形就是经典的李萨如曲线。数学上可以写成:
x(t) = A1 · sin(2π·f1·t + φ1) y(t) = A2 · sin(2π·f2·t + φ2)其中 A1、A2 是两个声道的振幅,f1、f2 是频率,φ1、φ2 是初始相位。屏幕上的最终图案由两个参数决定:频率比 f1/f2 和相位差 φ2 - φ1。
频率比的变化会让图形从简单到复杂:频率比 1:1 时,看到的是直线、椭圆或圆,具体形状取决于相位差;2:1 时出现类似“8”字的抛物线形;3:2 时像三叶草;5:4 时会变成四叶玫瑰;7:5 则出现更多花瓣和交错的曲线。频率比越复杂,图形越丰富。
但有个前提:只有当 f1/f2 是整数比时,曲线才会在有限时间内闭合,形成稳定图像。如果两路频率比不是整数比,比如 550 Hz 和 441 Hz,图形就会缓慢旋转,看起来像在“自转”。这在做动画时很有用,但做稳定静态图案时必须避开。
1.3 立体声通道:示波器音乐的必备前提
示波器的 X-Y 模式需要两路独立输入,这正是立体声音频天生适合的原因:左声道接 X 轴,右声道接 Y 轴。一首立体声歌曲的每一小段音频,都可以被看成一组随时间变化的 (X, Y) 坐标点。播放音乐时,示波器就相当于在逐点重放这段坐标轨迹。
需要注意的是,人耳听到的声音和示波器看到的图案并不是一回事。普通音乐虽然也是双声道,但两个声道的信号各自独立、互不相关,映射到 X-Y 屏幕上大多是一团模糊的杂乱线条。想要看到漂亮的图案,必须在生成音频时就刻意设计两路信号的数学关系。这也是为什么市面上的示波器音乐作品,几乎都是专门合成的音频,而不是拿普通歌曲硬接示波器。
我自己最常用的方法,是把所有图形拆成独立的“图案函数”。每个图案用两路正弦波或正弦波叠加构成,再给整个图案加上音量包络控制出现时间和持续时间。波形在示波器上留下的余晖,会自然形成一层漂亮的荧光效果。
2. 工具选型与方案对比:三条路线怎么选
2.1 播放现成曲目:最低成本的入门方式
最省事的方式,是找已经做好的示波器音乐音频素材直接播放。这类素材往往是一个完整音频文件,左右声道已经预先算好,你只需要一台双通道示波器、一个音频播放设备、一根转接线,就能看到画面。
这种方式优点很明显:不用写任何代码,插上线就能动。适合第一次体验、想验证硬件连接是否正确,或者纯粹为了图一乐的人。但它也有明显边界:你只能看到作者设计好的图案,不能实时修改图形,也不能把画面和自己的音乐做一个真正同步的创作。对于只想感受一下效果的人来说完全够,但如果你想把示波器音乐变成自己的创作工具,这条路线很快就会到天花板。
2.2 网页端工具:随手可玩的快速验证方案
很多人觉得示波器音乐必须要有昂贵设备,其实完全不是。现在浏览器足够强大,用 Web Audio API 可以实时合成两路信号,输出到声卡。你只需要把电脑耳机口接出示波器,再打开网页工具或自己写一段 JS,就能边改参数边看画面。
这个方案最适合验证想法。比如你想知道频率比改成 11:7 会画出什么图案,写一个简单的 HTML 页面可能比改 Python 脚本更快。网页端调试参数的即时反馈非常爽,我建议所有新手都先从这一步入手,把频率比、相位差、振幅这些基础参数玩熟,再进入更复杂的工程化实现。
2.3 代码生成方案:创作自由的终极形态
如果你想把示波器音乐做成一首完整的作品,或者和现有的音乐制作流程结合,那代码生成是绕不开的路。我推荐 Python + NumPy 做信号合成,再通过 sounddevice 或 PyAudio 播放。数据流大致是:先用数学函数生成音频样本 → 写入缓冲区 → 声卡输出 → 示波器显示。
代码方案看起来麻烦,但好处是能做任意形状:多边形、螺旋线、文字轮廓、3D 投影路径,甚至把 SVG 图形转成 X-Y 信号。下面这张表是我做工具选型时的对比总结,供你参考:
| 方案 | 上手难度 | 硬件要求 | 可定制性 | 适合场景 |
|---|---|---|---|---|
| 播放现成曲目 | 低 | 示波器 + 播放器 | 差 | 初次体验、验证连接 |
| 网页端工具 | 中 | 电脑 + 示波器 | 中 | 参数学习、快速原型 |
| Python 代码生成 | 中高 | 电脑 + 示波器 | 高 | 完整创作、定制视觉 |
2.4 硬件准备清单:示波器、声卡和线材
先说示波器。绝大多数双通道数字示波器都支持 X-Y 模式,比如常见的 DS1054Z、TBS2000 系列等。如果是模拟示波器,效果反而更有味道,荧光余晖自然平滑。核心要求只有两条:必须有双通道输入,必须支持 X-Y 模式。
再说音频输出。电脑板载声卡、USB 声卡都可以,但建议尽量用有线连接,不要走蓝牙。蓝牙音频链路有编码延迟和采样率转换,画面会抖动或不同步。如果声卡有噪声,先检查接地和线材屏蔽。
线材这块,最简单的连接方式是“3.5mm 转双 BNC”或者“3.5mm 转双 RCA 再转 BNC”。把左声道接到示波器 CH1,右声道接到 CH2,然后根据示波器手册搞清楚 X-Y 模式的通道映射。我手头这台机器在 X-Y 模式下,默认是 CH1 驱动 Y 轴、CH2 驱动 X 轴,但不同型号可能有差异。接完先放一个两路同频同相的信号,看是否出现一条 45 度斜线,就能验证映射关系。
3. 从零做起:用 Python 生成第一段示波器音乐
3.1 硬件连接与示波器安全设置
动手前先把安全习惯养好。示波器通道输入一般有最大电压限制,虽然音频信号通常只有几百毫伏到几伏,远低于安全阈值,但如果从功放、调音台输出,可能带有直流成分或较大功率,直接怼进示波器输入口有风险。我的习惯是:播放器音量先调到 10% 再开声,看到屏幕上出现小图形后慢慢放大;示波器垂直档位先放在 1V/div 或更大衰减档位,图形过小再减小档位。
连接顺序也有讲究。先接好示波器和电脑之间的线缆,再把示波器切到 X-Y 模式,最后开始播放音频。如果顺序反了,拔插线缆的瞬间可能产生脉冲尖峰,虽然大多数时候没事,但没必要冒这个险。
还有一个容易被忽略的点:示波器垂直通道请务必设置为直流耦合或者按信号特性来选。如果用了高通滤波器(AC 耦合),低频图形会变形。注意,模拟示波器最怕“烧屏”,CRT 荧光屏上长时间固定显示同一个亮点会留下永久暗斑;数字示波器的 LCD 屏幕则没有这个问题,但也不建议把亮度拉到最高连续数小时。
3.2 第一个图案:四叶玫瑰
理论说完,直接上代码。我强烈建议把采样率固定在 44100 Hz,和 CD 音质一致,兼容性最好。下面这段代码生成一个平滑的四叶玫瑰图案:
import numpy as np import sounddevice as sd sr = 44100 duration = 4.0 t = np.linspace(0, duration, int(sr * duration), endpoint=False) # 以 110 Hz 为基准音高,A2 # 左声道 5 倍频,右声道 4 倍频,频率比 5:4 f1 = 110.0 * 5 f2 = 110.0 * 4 left = np.sin(2 * np.pi * f1 * t) right = np.sin(2 * np.pi * f2 * t + np.pi / 2) signal = np.stack((left, right), axis=1) signal *= 0.3 sd.play(signal, sr) sd.wait()左右声道分别叠加 550 Hz 和 440 Hz 的正弦波。频率比是 5/4,理论上会产生四叶玫瑰线;相位差取 π/2 是为了让图案中心对称、分布饱满,避免出现压扁的形态。乘以 0.3 是让信号在示波器上显示一个合适幅度,而不是直接削波。
为什么要用 110 Hz 这个基准?因为它本身的频率不会太低导致图形闪烁,也不会太高导致采样点数不足产生毛刺。5 倍和 4 倍之后分别是 550 Hz 和 440 Hz,这两个频率在音频里正好构成一个大三度音程,听感上也很和谐。当然,画图用的频率和听感不矛盾,你完全可以用任何倍频关系。
3.3 相位调制:让静止图案动起来
一个固定的四叶玫瑰线虽然好看,但看久了就腻。示波器音乐真正迷人的地方,在于画面能跟着音乐情绪“流动”。最简单有效的手法,是相位调制。
# 相位随时间缓慢变化,产生扭动动画 mod_freq = 0.5 phase = np.sin(2 * np.pi * mod_freq * t) * np.pi right = np.sin(2 * np.pi * f2 * t + phase)这里不再给右声道一个固定相位,而是用 0.5 Hz 的低频信号去调制相位。效果是四叶玫瑰线的“叶瓣”会像活物一样慢慢展开又收拢,图形在示波器上形成一个动态扭动效果。调制频率越低,动画越柔和;调制幅度越大,图形扭曲越夸张。如果你想做节奏感强的画面,可以把调制频率改成和节拍相关的数值,比如 BPM 120 对应的每分钟 120 拍,每秒 2 拍,那调制频率 2 Hz 就是一个很好的选择。
相位调制只是其中一种手法,还可以做频率扫描(把 f1、f2 在每段内从某值滑到另一值)、振幅调制(让某一路的图形逐渐变宽变窄)、画多个图形的叠加等。这些方法本质上都在改变李萨如曲线的两个核心变量:频率比和相位差。
3.4 多段拼接:构建有结构的示波器音乐作品
单个图形做熟了,下一步就是把多个图形拼成完整作品。我的做法是先把整首作品的段落结构画在纸上,比如“引子 → 主题 A → 过渡 → 主题 B → 结束”,然后为每段定义一组参数:频率比、相位曲线、持续时间、音量包络。
拼接时最核心的坑是“段落衔接处容易削波或响度突变”。两段信号直接硬接,如果相位不连续,可能会在接缝处产生很大的冲击信号,示波器上表现为一条闪亮的乱线。我通常会给每段加一个 50 到 100 毫秒的淡入淡出包络,并且把所有段落整体归一化到 0.3 到 0.5 的峰值幅度以下,给剪辑和混音留余量。
下面是一个多段拼接的骨架代码,具体参数你可以按自己设计的图形来填:
def envelope(t, attack=0.05, release=0.05): n = len(t) a = int(attack * sr) r = int(release * sr) env = np.ones(n) env[:a] = np.linspace(0, 1, a) env[-r:] = np.linspace(1, 0, r) return env def segment(f1, f2, phase_shift, dur): t_seg = np.linspace(0, dur, int(sr * dur), endpoint=False) left = np.sin(2 * np.pi * f1 * t_seg) right = np.sin(2 * np.pi * f2 * t_seg + phase_shift) env = envelope(t_seg) return np.stack((left * env, right * env), axis=1) seg1 = segment(110.0 * 3, 110.0 * 2, np.pi / 2, 4.0) seg2 = segment(110.0 * 5, 110.0 * 4, np.pi / 3, 6.0) song = np.vstack((seg1, seg2)) song *= 0.35 sd.play(song, sr) sd.wait()如果想再进一步,可以把每个图形设计成一个“对象”,记录它的出现时间、持续时间和动画参数,然后用一个循环把所有图形按时间轴排布。这样做的好处是,你可以在后期快速调整某个图形的出场时机,而不必重写整段生成逻辑。我自己的作品就是这么组织的,类似于一个极简版音序器。
4. 常见问题与排查技巧实录
折腾示波器音乐的时候,我踩过的坑真不少。有些问题看起来像是设备坏了,其实只是参数设置不当。这里整理成一张速查表,再挑几个高频问题单独展开。
| 现象 | 常见原因 | 快速排查 |
|---|---|---|
| 只有横线或竖线 | 某一声道没信号、通道映射错误 | 检查线材,切换 X-Y 通道映射 |
| 图形不断旋转 | 两路频率比不是精确整数比 | 用整数比频率,重新计算频率 |
| 图形整体倾斜、不圆 | 左右声道幅度不均衡 | 调整声卡左右平衡或代码中的振幅 |
| 图形一半被切掉 | 信号幅度过大或直流偏置 | 减小音量,检查 AC/DC 耦合 |
| 画面发虚、亮度不均 | 扫描速度差异大、余辉时间短 | 开示波器余辉模式,降低显示亮度 |
| 声音正常但画面静止不动 | 两个信号频率完全相同且相位不变 | 调整相位调制或频率比 |
| 图形闪烁、抖动 | 蓝牙音频延迟、采样率不稳 | 换有线连接,固定采样率 |
4.1 图形倾斜和椭圆变扁:先查幅度平衡
第一次跑四叶玫瑰代码时,我把电脑音量旋钮随手拧了一下,结果屏幕上出现一个被压扁的图形,怎么看都别扭。当时的第一反应是代码写错了,排查半天才发现是左右声道音量不平衡。示波器 X 轴和 Y 轴的偏转灵敏度如果对应信号幅度不一致,图形就会被横向或纵向拉伸,圆变成椭圆,对称图案变得歪歪扭扭。
排查方法很简单:用一段左、右声道完全相同频率和幅度的信号,比如 440 Hz 正弦波,显示出来如果是 45 度斜线,说明两个通道增益一致;如果斜线明显偏向某一侧,说明音量不平衡,去系统音频设置里调整左右平衡即可。另外注意,示波器两个通道的垂直档位也要调成一样,不然即使信号幅度相同,图形也会变形。
4.2 画面永远在旋转:频率比的整数性陷阱
做旋转动画时,我有一次把两路频率设成 550 Hz 和 441 Hz,结果图案一直在慢慢转动,以为是相位调制代码写错了。实际上原因很简单:441 和 550 之间不是整数比关系,两个信号无法在一个公共周期内闭合,图形每帧都比上一帧多走一点,看起来就像在自转。如果这就是你想要的效果,那当然没问题,但如果你要稳定图案,就必须保证两个频率能整除到同一个基准频率。
计算闭合周期有个实用公式:把两个频率写成最简整数比 f1:f2 = m:n,则图案循环一圈需要的时间是 m/f1 或 n/f2。比如 550:440 = 5:4,循环周期是 20/440 秒,约 45 毫秒。这个周期足够短,肉眼看到的就是平滑稳定的图案。如果比例是 997:991 这样的大质数比,循环周期会变得很长,画面就会出现可见的“缓慢转动”,做特效可以,做稳定图案不行。
4.3 亮度不均和边缘发虚:余辉设置是关键
模拟 CRT 示波器上,电子束扫描速度快的地方荧光粉发光时间短,画面看起来就暗;扫描慢的地方则更亮。同一幅图案里,曲线转角处和直线段的速度不一样,亮度差异是自然现象。数字示波器虽然不存在荧光粉,但默认显示模式也类似,刷新率不足时,快速扫过的部分会显得若隐若现。
解决办法是打开示波器的余辉(persistence)功能,把余辉时间调长,让尾部轨迹保留几十毫秒。这样快速扫过的线条能留下足够长的视觉残留,画面更接近“画笔在画布上持续发光”的质感。不过余辉太长也有副作用:动态图形的尾迹会变得拖沓,看起来脏兮兮的。我一般把余辉设在 20 到 50 毫秒之间,视觉上干净又有层次。
4.4 音量与削波:一个容易被低估的隐藏变量
很多人觉得音量只要“能听到”就行,但在示波器音乐里,音量直接决定画面大小和线条质量。音量太小,图形在屏幕上只占一小块,看不清细节;音量太大,信号被削波,波形顶部变成平顶,图案边缘会出现硬切和断裂。数字域里削波还会产生高频谐波,让原本干净的曲线变得模糊。
我的经验是,先把示波器垂直档位设为最大的衰减,再逐步调高音量,直到图形占屏幕 60% 左右的高度和宽度,然后停止。音量宁小勿大,因为声卡的输出电平在不同系统上差异很大,同一份代码在笔记本和 USB 声卡上的实际输出可能相差数倍。代码里先统一乘 0.2 到 0.4 的系数,比调系统音量更可控。
4.5 声音和画面不同步:用固定采样率和缓冲
做示波器音乐时,声音和画面严格来说是同步的,因为同一个信号既驱动扬声器(如果有)又驱动示波器,输出的就是同一份数据。但如果你用浏览器播放页面做演示,会遇到音频缓冲区造成的轻微延迟,或者蓝牙音频编解码带来的时间偏移。画面和声音本身都是从声卡输出,不会出现内部分裂,唯一的解决思路是用有线输出,并且不要用系统音频增强效果。
如果用人耳监听,最好用耳机接在声卡的另一个输出口,而不是从示波器后面并接,因为示波器输入阻抗很高,对声音的负载效应很小,但直接并接信号可能让耳机听到的声音变小、变浑浊。保持监听和输出独立,排查问题会容易不少。
5. 示波器音乐还能玩出什么:扩展方向与应用场景
5.1 从平面到立体:3D 投影的思路
既然 X-Y 模式能把二维路径映射到屏幕,那能不能把三维物体投影到二维平面,再通过旋转产生立体感?当然可以。方法是对三维空间中的点做绕轴旋转,然后投影到 X-Y 平面,把投影后的 x、y 坐标转成两路信号。随着旋转角度随时间变化,屏幕上的投影轮廓会跟着旋转,人眼通过透视关系可以脑补出“立体”效果。
这种“伪 3D”技术早期在矢量游戏和雷达系统里很常用。示波器音乐的 3D 视觉延续了这一思路,但本质仍是两路信号。实现时注意,3D 投影出来的图形往往比简单的李萨如曲线复杂得多,信号带宽需求也会上升。建议先从简单的立方体或线框球开始,把投影矩阵和采样点数调好,再扩展复杂的网格模型。
5.2 把图形信号和音乐制作流程打通
除了独立的代码生成,示波器音乐也完全可以融入主流 DAW。做法是把左右声道分别当成两轨音频,用合成器或 LFO 驱动两个信号,再通过效果器、压缩器做后期处理。这样你就能让示波器图形和鼓点、贝斯、和声真正联动,实现“波形跟着音乐走”的现场感。
我见过一种很聪明的做法:用侧链压缩把 808 鼓点的包络映射到正弦波的振幅上,鼓点一响,示波器上的图形就“炸开”,鼓点结束图形又收回。这种视觉效果和音乐律动强绑定的创作方式,是单纯播放音频文件很难做到的。关键是,你在 DAW 里做的所有自动化参数,最后都同时作用于声音和画面,天然就是音画同步的。
5.3 互动与现场演出:把示波器变成演出设备
示波器音乐也非常适合现场演出。把 MIDI 控制器接到合成器或脚本上,实时调制参数,让图形随演奏变化,观众看到的就不再是静态曲线,而是一台会呼吸的视觉乐器。这种演出的信息密度非常低,反而带来很强的沉浸感,适合小型电子乐现场、氛围音乐演出、以及艺术装置展。
我自己试过给示波器接上音频接口,由键盘手控制一个低频旋钮,从简单的圆变成复杂的花形,整个过程流畅自然,现场反馈很热烈。当然现场演出要格外注意系统的可靠性。电脑死机、声卡断流、线缆松动都可能在演出中造成画面消失,建议准备备份播放文件,并提前把整套连接反复测试几遍。
5.4 从娱乐到教育:信号的直观化教学
最后补充一个不那么炫酷但很有价值的方向:示波器音乐作为教学工具。李萨如曲线、相位调制、频比、余辉,这些概念在课本上很抽象,但一旦变成真实的视觉演示,理解成本立刻降低一个量级。很多教信号处理或电子电路的老师,会在课堂上用示波器音乐演示这些基础概念,学生在惊讶之余,往往比记公式记得更牢。
如果你在带社团、带实验课,或者自己做家庭实验室,不妨把示波器音乐当成一个入坑项目。它涉及信号生成、音频输出、模拟测量、数学建模,几个维度自然融合,对新手来说比单纯的“搭电路测波形”有趣得多。
说点个人体会吧。示波器音乐最打动我的,不是它有多炫技,而是它把三个不起眼的东西——测量仪器、正弦波、立体声——组合成了一套让人愿意反复调试的创作系统。每改一个参数,屏幕上的曲线就换一副表情,这种即时反馈的乐趣,是写普通软件很难体会到的。如果你手头正好有一台闲置的示波器,强烈建议花一个晚上连上线,先跑出第一个圆,再顺着自己的好奇心折腾下去。你能得到的,远不只是一段奇特的音乐。