之前借助Python利用虚拟钢琴软件弹奏了一曲东风破, 虽然是成功了, 但是终究还是要下载一个虚拟钢琴, 那么我想, 我能不能直接用电脑的蜂鸣器来弹奏一曲东风破呢? 感谢 @刘之帅 提供的创意.
不过做这个之前, 需要先普及一点乐理知识, 否则后面的代码会看不懂, 乐理这个东西, 我也是一个初学者, 可能有我理解的不对的地方, 也请各位看官指出.
预备知识
说到音乐, 那肯定离不开声音的三要素: 音调, 音色, 音量. 对于音量, 其实也就是声音的响度, 说白了就是声音的大小, 这个对于蜂鸣器来说, 是固定的, 所以我们暂时不需要考虑这个. 对于音色, 这个东西和发声器相关, 具有同样响度和音调的声音, 不同乐器发出声音听起来的感觉也是不同的, 比如我们用二胡和吉他弹奏同一首曲子, 虽然他们都是同一首曲子, 但是我们还是能够分辨是那种乐器弹奏出来的. 接下来是重点要解释的部分, 音调, 通俗解释就是人们对于声音高低的感觉, 比如男低音或者女高音, 说的就是音调, 这个主要和声波的频率有关. 对于蜂鸣器来说, 我们肯定是不能改变他的音色和音量的, 然鹅, 我们可以改变它发声的频率, 从而改变音调, 来弹奏一首曲子.
十二音律
说到音调, 我们自然不可能绕过十二音律这个东西, 我们先来看一张图.
十二音律是怎么来的呢, 就是把一定频率的音分成12份, 通常来说, 是[440, 880]
, 这个作为基准, 每升高一个八度, 频率翻一番, 每降低一个八度, 频率减少一半. 在钢琴中, 正好有7个白键, 5个黑键正好12个. 因为常用的键位是7个, 所以白色键位是常用键位. 黑色是不常用键位, 因此白色它比较宽, 比较大, 具体这些细节不是本文的重点, 因为我也不是学这个的, 可能我理解的也不是很到位, 这里的重点是我们如何找到钢琴中每个键位对应的频率, 如果不简单理解一下这些的话, 后面频率部分的代码, 可能是不太好理解的, 所以在这里也简单说一下. 下面先给出一个频率对应表.
这张表, 当然不可能手敲进去, 当然, 如果闲得无聊的话, 手敲也是可以的, 因为这个是有规律的, 上文说过, 这其实是把频率分成了12份, 构成一个等比数列, 公比是2^(1/12)
, 所以我们只需要找到上图中的O1
, 然后不断做乘法就可以生成上面那张表.
def generate_piano_table():
start = 27.5
table = []
for i in range(8):
tmp = []
for j in range(12):
tmp.append(round(start))
start *= 2 ** (1 / 12)
table.append(tmp)
return table
这里考虑到一个问题, 就是蜂鸣器接收频率, 只能写整数, 因此这里我们做个四舍五入, 近似一下. 再考虑到, 这个表是固定的, 因此我们生成一边之后, 复制出来就行了, 没必要每次都运行. 在这里给大家一个福利吧, 我直接把这张表贴出来. 也省的在运行了.
PIANO_TABLE = [
[28,