开始琢磨:声音到底长啥样?
我这个人就是闲不住,非要给自己找点事干。前段时间在家录了一堆教程,然后听着那干巴巴的音频波形图,心里就犯膈应。我就寻思,这声音能不能带点颜色?咱耳朵听见的东西,能不能让眼睛也瞧瞧?
想法挺疯狂,但既然冒出来了,不试试就浑身不自在。我的目标很简单:
第一次瞎搞:只看响度,全是废物
我最早的版本简直是糊弄自己。我最开始就想,颜色不就是亮度嘛声音大就亮一点,声音小就暗一点。我随便找了个代码库,把声音文件扔进去,让它计算声音的响度。这活儿简单,不到半小时就跑出来了。
结果?我跑了一段摇滚乐,跑出来一大坨黑乎乎的东西,偶尔在鼓点炸开的时候蹦出一个闪光点。跑人声对话,那简直就是一堆
我赶紧停下来琢磨,颜色哪有那么简单?它不光有亮度,还得有色相,有饱和度!
第二次拆解:暴力映射的实现过程
我意识到,我必须把声音的三个主要特征,对应到颜色的三个维度上。
- 声音的高低音(频率):这玩意儿得决定
色相(Hue),也就是具体是红是蓝还是绿。我定义低音(比如贝斯和鼓)是暖色调,偏红、黄。高音(比如镲片和女高音)是冷色调,偏蓝、紫。 - 声音的响度(振幅):这个最简单,直接对应
亮度(Brightness)。声音越大,画面就越亮。 - 声音的“复杂程度”(泛音和和声):这块儿有点难搞。我把它对应给
饱和度(Saturation),就是颜色浓不浓。声音越纯净单一(比如纯粹的正弦波),饱和度我就拉得越高,颜色就鲜艳得跟要滴出来一样。声音越复杂、越混乱(比如一大堆杂音),饱和度就低,偏灰。
我把这个新的映射逻辑写进去,重新跑了一遍。这下效果马上就不一样了!我跑了一段古典乐,画面立马变成了一团流动变化的油画,低音提琴拉出来就是深沉的紫红,小提琴一上来就是跳跃的浅蓝。看着舒服多了。
最新进展:修正人声的“脾气”
这回的“更新日志”主要就是修正人声的显示问题。我发现,人说话不像音乐那么有规律,频率和响度变动得太快了,导致颜色一直在屏幕上
我最新做的事情,就是给颜色变化加了个“缓冲算法”。让它别那么着急变色,声音突然高了,颜色也得慢悠悠地过渡过去,这样视觉上才稳定,不晃眼。
我拿我前几天跟我老婆吵架,她吼我的那段录音做测试。以前的版本,那段录音跑出来就是一团高饱和度的乱麻。现在加了缓冲,颜色虽然还是高亢的亮蓝色,但变化流畅了,让我能更清楚地看清楚:她那句“你到底在干什么”里的声音频率,居然从头到尾都保持在一个极高的水平上。
我用耳朵听的时候,只觉得她生气了。现在用眼睛一看,我才意识到那声音里蕴含着巨大的,几乎不曾改变的
现在我算是彻底上瘾了,下一步得把这玩意儿做成个实时工具,我要看看我自己的声音到底是什么德行。