关于可生成优美旋律的简单数学方程的技术问询
关于可生成优美旋律的简单数学方程的技术问询
我之前见过一些能生成绝美复杂图形的简单方程,就在琢磨——音乐领域有没有类似的东西?比如有没有一个简单的方程$A(t)$,把它转换成声音后就能生成一段旋律?如果这种时域的方程不存在,那傅里叶域里有没有用简单公式就能生成惊艳复杂旋律的方法?
我正在给自己写的一款开源小工具找一个漂亮的默认音效,这个工具的功能就是把方程转换成音频播放。
函数如何被解读为音乐
音乐可以被建模成一个关于时间的振幅函数,更常见的是立体声形式——也就是左右耳各对应一个函数。这些函数和其他数学函数一样可以被绘制出来:
要说明的是,实际音频是离散采样的(采样率约48000Hz),但我们可以用连续函数来近似它,所以能对它做各种操作,比如用FFT来近似傅里叶变换。但麻烦的是,这种由数百万数据点组成的离散函数没法被简洁地表达出来——就像网页顶部那张绝美图形,如果用像素数据表示会无比臃肿,但用生成它的数学函数就异常简洁。
我做的原型验证
我已经完成了一个概念验证:用相当简单的方程确实能生成旋律:
$$
\begin{align*}
&\sin(440 \cdot 2 \pi t) \exp(-(t-1.1)^2 e{(t-1.1)2}) \
- &\sin(554.365 \cdot 2 \pi t) \exp(-(t-3.0)^2 e{(t-3.0)2}) \
- &\sin(659.225 \cdot 2 \pi t) \exp(-(t-4.9)^2 e{(t-4.9)2})
\end{align*}
$$
这个方程其实有点生硬,它只是把“凸包函数”和正弦波结合起来,生成了A大调的琶音:A、C♯、E。核心思路就是让函数的频率和振幅随时间变化,当频率落到悦耳的数值时,振幅达到峰值。
但我想要更自然的版本,就像网页顶部那种用简单方程生成绝美复杂图形的效果一样。这个原型生成的旋律是可以播放出来的。
自己动手尝试的方法
你可以自己动手调整参数玩:把凸包函数和你想要的周期函数相乘就行。想要调整每个音符的延迟,只需要把方程里的延迟值(比如我用的2.9)改成你想要的数值。每个凸包函数大概持续2秒,你也可以调整凸包函数的参数来改变它的宽度和形状。
备注:内容来源于stack exchange,提问作者Zaz
相关产品推荐
相关产品推荐

