尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

示波器音乐:用X-Y模式与音频信号画出动态几何图形

示波器音乐:用X-Y模式与音频信号画出动态几何图形 如果你跟我一样第一次在“Oscilloscope Music”视频里看到一台老掉牙的示波器屏幕上随着音乐扭动出旋转的立方体、跳动的粒子甚至一个完整的笑脸时大概率会愣一下这玩意儿不是实验室里测电压波形的吗没错它就是一台普通的示波器只是被一个很有意思的玩法重新定义了——“Oscilloscope Music”的核心是把示波器的X轴和Y轴当作画布把左右声道的电压信号当作画笔原本用来读波形的测量仪器直接变成一台能画出动态几何图案的矢量显示器。这篇文章会把这套玩法从原理、信号链到实操和调试完整拆开讲清楚适合电子爱好者、音乐制作人、视觉艺术玩家甚至只是单纯对数学图形感兴趣的人。你不需要多高深的基础一台示波器、一个能输出双声道的音频设备、一段特殊的音频文件就能让屏幕“唱歌”。1. 它到底在放什么从利萨茹曲线到三维物体1.1 一句人话版的原理普通示波器看波形时横轴是时间纵轴是电压屏幕上显示的是“电压随时间变化的轨迹”。但示波器几乎都有另一种模式叫作X-Y模式。在这个模式里时间轴不再参与显示横轴电压来自通道1CH1纵轴电压来自通道2CH2。这时候示波器的工作方式其实就变成了一台“矢量绘图仪”两个通道的电压值决定了屏幕上那个光点落在哪个坐标上。如果把一台示波器比作一张白纸那么X-Y模式就像是有人握着你的手画图左右声道是两只手一手控制左右移动一手控制上下移动。两只手配合得好就能画出任何你想要的线条和形状。而电脑声卡输出的音频信号本质上就是高速变化的电压信号所以只要把左声道接到X输入右声道接到Y输入一段精心设计的音频就能变成一幅不断变化的画。最经典的入门图形是利萨茹曲线。如果X信号是sin(2πft)Y信号是sin(2πgtφ)当频率比f:g是有理数时屏幕上就会出现稳定的闭合曲线。两个频率相同、相位差90度你会看到一个标准圆频率比是1:2你会看到类似“∞”的曲线频率比是3:2图案会更加复杂。这个现象不是新东西老一辈电子工程师早就用它来测相位、测频率只是现在被人拿来“画画”了。1.2 复杂图案是怎么来的你可能好奇利萨茹曲线再复杂也只是简单的线条那些旋转立方体、人物剪影、花瓣图案是怎么塞进两个声道里的答案是被人“画”出来的。Oscilloscope Music这个玩法的核心思路是把一幅图像看作一系列坐标点然后按顺序把这些点的X坐标和Y坐标编码到左右声道里。只要刷新速度足够快人眼看到的就是连续图案就像老式CRT电视用电子束扫描屏幕形成画面一样。只不过电视用行场扫描而示波器用任意矢量路径扫描。早在2010年代中期音乐人Jerobeam Fenderson的作品横空出世他发布了一系列专门为示波器创作的音乐——那些看似是MV的画面其实是直接由音频信号驱动示波器屏幕产生的完全不是后期视觉特效。他在专辑里展示的旋转立方体、起伏山丘、跳动的几何形状靠的就是把三维模型的每个顶点先做旋转矩阵变换再投影到二维平面最后把X、Y坐标用音频采样点表达出来。如果你仔细观察那些画面会看到线条有一种类似荧光余晖的拖尾质感这正是示波器荧光屏或数字余晖模拟带来的视觉特征。1.3 它和普通“音乐可视化”有什么不同很多人会把Oscilloscope Music和常见的音乐可视化软件混为一谈其实两者有本质区别。普通音乐可视化是先播放音乐然后软件对音频做FFT频谱分析再把频谱结果渲染成屏幕上的动态柱状图或粒子特效。信号链是“音乐→分析→绘制”画面是音乐的一种“间接解读”。而Oscilloscope Music有两种玩法。第一种是“预置波形”音频本身就是图形数据声卡输出什么示波器就画什么音乐和画面具有完全同步的等价关系——你听到的每一个音色、每一个音高变化都和屏幕上的每一条线、每一个转折严格对应。第二种是“实时音频反应”播放一段普通音乐先分析它的频谱参数再把这些参数映射到图形生成算法里最终输出到示波器。这种玩法更接近“可视化”但最终输出信号仍然是直接驱动X/Y坐标的原始电压信号而不是“渲染后的画面”。这两种差别决定了它们的艺术效果完全不同。预置波形更像“用耳朵看画”实时反应则像“让画跟着音乐跳舞”。很多人上手时只玩第一种觉得不够刺激实际上等第二种玩顺了那才是这个项目真正值回票价的地方。2. 系统构成声卡、示波器、线缆组成的“画笔”2.1 最简信号链Oscilloscope Music的信号链不长但每一环都别出错音频文件 → 播放器/DAW → 声卡左右声道 → 示波器CH1(X)和CH2(Y)输入电脑或手机播放一个立体声音频文件声卡把数字信号变成模拟电压输出。左声道的电压进入示波器的CH1驱动光点在水平方向移动右声道的电压进入CH2驱动光点在垂直方向移动。只要左右声道的数据是成对出现的坐标点屏幕上就会画出对应的轨迹。这里最容易被忽略的一点是必须用双声道立体声输出而且左右声道不能是“左右互通的单声道”。很多老式电脑只有一个3.5mm耳机口这没问题因为耳机口本身就是双声道的。但如果你手里只有一个单声道音频接口那无论如何都画不出二维图形。另一个容易被忽略的点是手机或电脑播放时默认可能会开启“立体声混音”“音效增强”之类的功能这些处理会破坏原始信号尽量全部关掉。2.2 示波器选型数字还是模拟多少带宽够用玩Oscilloscope Music对示波器有基本要求但真没你想的那么高。第一个硬性条件是必须有X-Y模式。几乎所有双通道示波器都有哪怕是最便宜的入门款没有这个模式的话你只能看到一条随时间展开的波形画面会糊成一团。第二个是带宽。很多人以为画复杂图案需要几百MHz的示波器实际上音频信号本身就在20Hz到20kHz范围低频端甚至更慢。真正影响显示效果的是采样率和信号完整性而不是带宽。我记得我早期用一台带宽只有5MHz的老古董示波器跑Jerobeam Fenderson的曲子毫无压力。模拟示波器和数字示波器各有各的味道特性模拟示波器数字示波器画面质感荧光粉自然余晖柔和且有“电子味”可以模拟余晖但有时有离散点感线条亮度默认均匀不易断裂靠Persistence模拟调不好会“掉点”价格二手100到500元就能买到不错的入门新机通常1500元起记录和截图只能录像或拍照可USB导出、截图体积重量一般较大且重台式和便携都有轻便我的建议是如果预算有限或者只是想体验一下二手模拟示波器完全够用而且画面特别有氛围感如果你想长期玩、还要录视频、写调试笔记一台支持X-Y模式和持久显示的入门数字示波器会省心很多。2.3 线材和周边硬件看似小事影响很大信号链里最容易被忽视的就是线材和连接方式。从耳机口到示波器最常见的接法是用一条“3.5mm转双莲花RCA”线再用RCA转BNC的转接头插入示波器CH1和CH2。也有人直接用BNC转鳄鱼夹的线但那种线屏蔽通常一般容易引入噪声。这里有一个很重要的知识点示波器的输入阻抗通常是1MΩ音频设备也很容易驱动这个阻抗所以连接上基本不用担心阻抗匹配问题。但要注意不要用带功放的高功率输出口去接示波器比如不要接音箱功放的大功率输出端那可能打出远超示波器安全量程的电压。电脑耳机口、声卡线性输出、手机耳机口的输出电压一般在0.2V到2V之间对示波器来说很安全直接用默认1x档读数即可。如果你手上只有10x衰减探头接上后实际电压会被除以10所以屏幕上图案会变小记得把垂直档位调高或把音量调大。还有一点我之前踩过坑如果电脑和示波器分别插在不同的插座上两个设备的“地”之间可能出现电位差导致图形漂移、闪烁。最简单的解决办法是让它们插在同一个排插上保持共地。3. 一步步搭起来从生成WAV到看到第一帧画面3.1 准备“信号源”用Python生成一段利萨茹音乐Oscilloscope Music最开始往往从“自己做一段WAV”开始。与其到处找现成资源不如先自己动手生成一个最简单的利萨茹图形彻底搞清楚信号怎么变成图案。下面这段Python代码用numpy和scipy生成一个5秒钟的立体声WAV左声道是一个220Hz的正弦波右声道是一个176Hz的正弦波两者频率比是5:4相位差约40度。播放后你会听到两个正弦波叠加的“嗡嗡”声同时示波器屏幕上会出现一条漂亮的闭合曲线。import numpy as np from scipy.io.wavfile import write sample_rate 44100 duration 5.0 t np.linspace(0, duration, int(sample_rate * duration), endpointFalse) # 左右声道频率比5:4相位差0.7弧度 x np.sin(2 * np.pi * 220 * t) y np.sin(2 * np.pi * 176 * t 0.7) # 归一化到16bit的PCM范围预留6dB余量 left np.int16(x * 0.6 * 32767) right np.int16(y * 0.6 * 32767) stereo np.column_stack([left, right]) write(lissajous_54.wav, sample_rate, stereo)代码里几个参数值得说一下。sample_rate取44100Hz是因为声卡基本都支持采样率太低会导致屏幕上的线条呈阶梯状。duration别设太短太短来不及看清图案也别太长太长听起来太吵。x和y的幅值控制在0.6是为了给音量余量留空间避免削波。如果你想看其他利萨茹形状直接改两个频率的比值和相位差就行。如果不想写代码也可以直接下载Jerobeam Fenderson或其他开源Oscilloscope Music生成器产出的WAV文件原理完全一样只是内容更复杂。3.2 接线和示波器设置信号源准备好后接下来是接线和仪器设置。整个过程其实不复杂但顺序错了容易让人怀疑人生。先把示波器关机然后用3.5mm转双RCA线连接电脑或手机耳机口到示波器的CH1和CH2。左声道接CH1右声道接CH2。开机后在示波器面板上找到X-Y模式按钮。老式模拟示波器通常直接有一个“X-Y”按键数字示波器一般要进入“Horizontal”水平菜单在“Time Base”里选择“XY”模式。不同品牌型号的位置不太一样建议翻一下说明书。先把CH1和CH2的垂直档位都调到0.5V/div左右如果屏幕上图案太小或太大再微调。播放那个WAV文件然后把音量从0慢慢往上加直到屏幕上出现清晰的图案。我一般习惯从30%音量开始避免一上来音量太大导致图形变形。如果是数字示波器你可能看到的是亮点而不是连续线条。这时候需要打开显示菜单里的“Vector”矢量/连线模式并把“Persistence”余晖/持久显示调长例如0.5秒到2秒这样线条看起来就会像模拟示波器一样连续。第一次看到屏幕上的图案时可能不是标准圆而是斜着的椭圆或更复杂的弯曲形状这都正常。只要那条线是连续闭合的就说明信号链已经通了。如果画面是乱的下一步就是排查问题。3.3 用现成资源快速跑通第一张图自己写的WAV只有简单线条如果你想第一次就直接体验“旋转立方体”那种让人头皮发麻的效果我建议直接找Oscilloscope Music作品的现成文件。最著名的就是Jerobeam Fenderson的专辑《Oscilloscope Music》里面每首曲子都对应一套完整的示波器3D动画播起来整个屏幕就像一个微缩的电子宇宙。网上还有不少开源生成器项目它们能根据输入的文字、图片甚至三维模型生成对应的立体声WAV文件。这些生成器的原理和我们前面手动生成利萨茹WAV完全一致区别只是坐标点更密集、更复杂。用这些工具可以生成专属的图形和文字比如把自己的名字变成示波器上的一条轨迹这个玩法特别适合拿去当桌面摆件或者拍视频。拿到现成WAV后播放流程和前面一样。如果播放的是官方作品屏幕里应该出现稳定的三维线框物体。如果只是乱线检查接线如果根本没有图形检查是否真的处于X-Y模式如果图形不断闪动检查音量是不是太低或者示波器触发了某个自动模式。4. 调试实录为什么图形歪了、亮了、糊了、飘了4.1 图形左右翻转、上下颠倒是哪里的问题这是最常遇到也最好解决的问题。左右翻转说明X信号反相了也就是左声道和右声道接反了——把CH1和CH2上的两根线交换一下就行。上下颠倒说明Y信号反相也就是你接到CH2正极的那根线可能“参考地”接反了或者信号源内部某个声道存在反相这在部分声卡里其实很常见。判断方法是先播放一个已知的图形文件如果屏幕上的文字或图像像是从镜子背面看的就把其中一路信号反相。你可以用播放器的左右声道平衡设置来快速切换也可以下载Audacity对某个声道执行“Invert”后再导出。如果你看到的不是镜像而是整个图案旋转了90度那说明X和Y接反了——把应该接CH1的接到了CH2把应该接CH2的接到了CH1。这个很好理解横轴纵轴互换画面自然转90度。严格来说旋转90度不一定算错误有人还故意把画面旋转来适应屏幕比例但大多数人还是希望和原图方向一致。4.2 线条发虚、模糊、发糊先调亮度再调余晖线条模糊是最让人头疼的问题因为原因可能有好几个。最常见的是示波器亮度太高或者聚焦不准。模拟示波器面板上有“INTEN”亮度和“FOCUS”聚焦两个旋钮。你可能会本能地把亮度调高结果荧光屏上线条被烧得发白边缘泛光反而看不清图案。正确做法是先把亮度调低到刚好能看见线条再慢慢微调聚焦让线条边缘尽可能锐利。数字示波器不存在聚焦问题但会有自己的“模糊”来源如果显示模式是点状画面就会显得稀疏如果余晖时间设太短快速移动的线条会一闪而过视觉上像在闪烁。解决办法是打开“Vector”模式并调长Persistence调到你看着舒服为止。数字示波器还有一个坑是采样率不够时线条会出现锯齿状塌陷这在画高频细节时尤其明显。解决办法是尽量用96kHz采样率的音频文件并降低图形的整体频率。如果你看到整个图案在轻微“呼吸”或周期性变粗变细那多半不是显示问题而是声卡或播放链路里混入了低频噪声或者是数字示波器的自动亮度调节在作怪建议关闭一切自动优化功能。4.3 图形漂移、断线、闪烁先怀疑电源和接地图形整体漂移或者线条像断气一样时有时无很多时候和示波器本身无关而是电源和接地问题。先确认电脑、声卡、示波器是不是插在同一个排插上。如果分插两个不同房间的插座地线电位差会导致画面零点漂移。把三台设备接到同一路供电后很多莫名其妙的“鬼影”会直接消失。除了供电还有一个容易被忽略的干扰源手机充电器、无线鼠标接收器、无线路由器放在示波器旁边都可能导致屏幕出现细碎噪点或线条毛刺。示波器本身屏蔽做得不错但信号线往往是薄弱环节尽量用质量好、带屏蔽层的线材并且让线材远离电源线。如果图形是“断开”的像是一条虚线在快速分段跳动大概率是数字示波器在X-Y模式下采样点之间没有连线。打开Vector模式就能解决。还有一种情况是信号幅度太低数字示波器的触发或自动增益功能来回切换导致显示不稳定把音量调高并手动设置固定的电压档位情况通常会好很多。另外提醒一下如果使用了10x探头并且探头上有个小小的补偿电容调节孔要先接到示波器的方波校准信号上做探头补偿否则高频信号会被衰减或变形线条边角会变圆变糊。4.4 测量仪器带来的“额外问题”削波、过载和采样率示波器是测量设备不是音响设备所以在连接时要时刻提醒自己这里不是功放是精密仪器。最容易犯的错误是把音量开太大。当音频信号超过声卡或播放器的线性范围后信号会被削波波形顶部被“切平”。在示波器上你会看到原本圆润的图形边缘变成直线切角就像像素游戏里的方块。解决方法是把音量调低直到图形恢复圆润。另外也要注意不要长时间让画面满屏高亮尤其模拟示波器荧光屏中心如果长期高亮显示可能会缩短荧光粉寿命。数字示波器的“额外问题”则是采样率不足导致的假象。X-Y模式下数字示波器本质上是分别对CH1和CH2做ADC采样然后在屏幕上画点。如果采样率不够快或者波形频率太高就会出现线条断裂、摩尔纹、甚至图形往返重叠。这种情况下可以尝试把示波器的时间档位调大但X-Y模式下很多示波器时间档位不可调更有效的方法是从源头上降低信号的频率或提高采样率。一般来说把音频的显示频率控制在几十Hz到几千Hz范围内数字示波器都能从容应对。5. 再把维度抬一层实时音频反应和伪3D投影5.1 实时音频反应从“放预置波形”到“让图形跟音乐互动”预置波形玩熟了之后你会发现它有个限制图形和音乐是“绑死”的换一首歌画面还是那样。想要让任意音乐驱动图形实时变化就需要进入“实时音频反应”的玩法。基本思路是用软件对音频信号做频谱分析提取不同频段的能量然后把这些能量数值映射到图形生成算法的参数上。举个我自己常用的映射方案低频段20到250Hz能量映射为图形绕Z轴的旋转速度低音越强转得越快中频段500到2kHz能量映射为图形的整体缩放倍数人声和旋律一出来图形就变大高频段4kHz以上能量映射为Z轴方向亮度或线条的闪烁速度高频打击乐一响画面就“滋滋”发光。实现方式有很多最简单的可以用Pure Data或Max/MSP这类可视化编程环境直接在软件里拖拽几个模块就能把音频分析结果实时变成两路坐标信号再通过声卡输出到示波器。这类环境适合现场演出做出来很有“生成艺术”的味道。如果不想用图形化编程用Python也可以先用sounddevice库实时读取声卡回环输入再用scipy的FFT计算频谱最后把计算出的参数动态改变图形的轨道并持续写出一小段一小段的音频缓冲流。这种方式更灵活也更适合程序员但延迟控制需要多下功夫。5.2 伪3D投影是怎么实现的Oscilloscope Music里最迷人的部分是“在二维屏幕上看到三维物体”。严格来说示波器只有X、Y两个轴有些示波器后端还有一个Z轴调制输入可以控制亮度但绝大多数人用的双通道示波器并没有真正的Z轴输入。那立体感是怎么来的答案是投影和旋转产生的视觉深度。核心流程其实就是一个三维图形学入门课程里的内容定义一个三维模型比如用8个顶点定义立方体再用12条边连接顶点对每个顶点做旋转矩阵变换让它绕X轴、Y轴或Z轴旋转一个小角度把旋转后的三维坐标投影到二维平面通常就是直接取X和Y坐标把X坐标和Y坐标分别编码到左右声道。如果示波器有Z轴输入还可以把顶点的Z坐标映射成亮度或深度信息这样临边离你远的线条会变暗近的线条更亮立体感立刻变强。没有Z轴也不用失望靠几何旋转本身的透视感已经足够了。下面用一个简化的Python代码说明三维立方体旋转投影的思路import numpy as np def rotate_xyz(points, ax, ay, az): cx, sx np.cos(ax), np.sin(ax) cy, sy np.cos(ay), np.sin(ay) cz, sz np.cos(az), np.sin(az) rx np.array([[1,0,0],[0,cx,-sx],[0,sx,cx]]) ry np.array([[cy,0,sy],[0,1,0],[-sy,0,cy]]) rz np.array([[cz,-sz,0],[sz,cz,0],[0,0,1]]) return points rx ry rz corners np.array([ [-1,-1,-1], [1,-1,-1], [1,1,-1], [-1,1,-1], [-1,-1,1], [1,-1,1], [1,1,1], [-1,1,1], ]) # 每帧给一个微小旋转角度生成连续的坐标序列再写入立体声WAV每帧之间让物体旋转一个角度连续播放就能看到旋转的立方体。图形的流畅度取决于每秒“帧数”也就是你在一秒内放了多组坐标点。如果要看到非常顺滑的旋转动画每秒至少要有30到60帧换算成音频采样点一份5秒的WAV里要包含几百组顶点数据。这也是为什么Oscilloscope Music文件往往听起来像“高频机器人声”——那些声音根本不是旋律而是坐标数据在高速刷新时的副产物。5.3 用游戏引擎做“渲染引擎”接入实时信号链如果你既想实时反应又想要非常复杂的3D图形那游戏引擎是最好的工具。Unity、Godot、Unreal都可以干这件事社区里甚至有人把AudioLink这类开源插件移植到示波器音乐场景中让Shader直接读取音乐频谱再生成两路输出电压信号。我试过用Unity做一版场景里有一个几何体顶点坐标在Shader里实时计算渲染完不输出到屏幕而是把每个顶点的X、Y坐标写成音频缓冲通过声卡模拟输出送到示波器。效果非常夸张可以做到真正的“画面跟着音乐无限变化”。但这里有个非常现实的坑游戏引擎通常以60帧或更高的帧率渲染而音频系统是独立在44.1kHz甚至更高采样率下运行的。如果你直接每帧更新坐标缓冲容易导致画面卡顿或“一顿一顿”的阶梯感。解决办法是给参数加平滑插值例如用滑动平均过滤每帧的频谱能量让图形参数的变化尽量平滑同时注意声卡缓冲设置尽量把延迟降到30ms以下否则会明显感觉到“声音和画面不同步”。玩到这一步示波器已经变成了一个特别的“输出设备”自己用电脑实时生成的图形随时可以从示波器屏幕上“播放”出来。这也是整个Oscilloscope Music项目从“放别人做的WAV”走向“自己做视觉乐器”的分水岭。6. 器材投入与时间成本的实际参考6.1 不同预算的设备组合说了这么多肯定有人想问这套系统到底要花多少钱我按三个档位给个实际参考方案设备清单预估成本适合谁体验档二手模拟示波器 电脑/手机耳机口 免费WAV200到500元只想试试水体验一下信号画画的原理常规档入门数字示波器如Rigol DS1054Z USB声卡 屏蔽信号线1500到2500元打算长期玩需要录屏、截图、调试方便进阶档四通道数字示波器/带Z轴模拟示波器 专业音频接口 游戏引擎软件4000元以上搞现场演出、互动装置、视觉艺术创作体验档的隐患是模拟示波器通常又大又重而且二手货可能某些旋钮不灵光但好处是便宜摔坏了不心疼。常规档是比较推荐的一台入门级数字示波器基本能满足所有Oscilloscope Music需求而且能导出截图和波形数据对学习信号原理也很有帮助。进阶档更多是为了演出和创作一般玩家用不大到。如果你还没有示波器也不想立刻买可以先在电脑上用免费的音频可视化软件模拟一下X-Y显示把音频文件播放进去看看波形轨迹。这种模拟只能帮你理解原理替代不了真正示波器上荧光粉的质感但用来决定“要不要入坑”已经够了。6.2 我个人的经验与几条小贴士我最早玩通这套系统时用的是一台二手泰克2235模拟示波器加一个几十块钱的USB声卡总投入不到七百块钱。第一次把《Oscilloscope Music》专辑播出来办公室所有人都围过来盯着那块发绿光的屏幕有人说像科幻电影里的雷达有人说像电子游戏里的隐藏关卡——那一瞬间你就会明白这个玩法的真正魅力不在技术多高深而在于它把一个很理性的电子测量工具变成了很有情绪感的视觉演出。如果你想动手试我最后分享三条经验第一先别急着买贵设备。找一台200元的二手模拟示波器或者借一台先用现成WAV跑通再考虑要不要升级。市面上大多数复杂图形在老示波器上反而比数字示波器更有味道。第二注意音量旋钮。画图的时候音量就是“刷子的粗细”音量太低图形暗淡音量太高图形削波变方。我习惯把系统主音量固定在50%然后只通过示波器的垂直档位来调整显示大小。第三录屏和拍照时一定要压低手机或相机的曝光补偿。示波器屏幕本身很亮自动曝光会把细节全拍成白茫茫一片。手动把曝光补偿降到-1EV到-2EV才能拍到和肉眼看到的差不多的效果。如果你也有一台吃灰的示波器或者只是想在聚会上搞点大家都看不懂但很好玩的东西不妨从一段利萨茹WAV开始先让屏幕亮起来。示波器音乐不需要完整复刻别人的作品自己改一个频率比、调一个相位就能得到从未见过的新图形。这种“参数一改世界就变”的感觉才是最让人上瘾的地方。
返回列表