我在好几个月前入了一个 MIDI 键盘,自学了一段时间的流行钢琴伴奏(弹唱)和相关的乐理,但是由于工作和其它事情的原因,没有太多的时间练习指法,以至于仍然很难熟练地弹唱一首流行歌曲。
我想,我要花很长时间来练习我的键盘指法,但是作为一个程序员,我对电脑键盘的键位了如指掌。于是我开始考虑把钢琴键盘移植到电脑键盘上。
如果你 Google 一下 online piano 的关键词,你会搜出很多在 PC 上模拟钢琴键盘的 demo. 但是这些 demo 的出发点都是把钢琴键盘上每一个黑键白键都序列化地映射在电脑键盘上。这种程序演奏一下单音,弹首小星星还行,但是真的要在上面弹一首流行伴奏,几乎不可能。
首先和弦是由几个不同音高的音组合成的,如果单纯把音序列化地映射到每个按键上,即使是最简单的三和弦,你都没有办法准确地在电脑键盘上同时按下 1 3 5 来弹出一个 C chord. 借鉴五笔输入法的设计,我设计出了通过按键映射和弦(chord),以及对应的分解和弦(broken chord)的键盘布局方案,来降低演奏时对指法的要求,简化流行钢琴伴奏。
利用这个周末,我已经把这个想法初步实现了出来,在这个初步版本里,已经实现了例如右手柱式和弦的几种转位、自动弹奏左手降两个八度的根音、分解和弦在键盘上的映射等等这些基本能力,通过这些能力已经可以玩一些简单的伴奏 pattern,比如常说的 151, 1531 等等。
在浏览器上面,我写了一个钢琴键盘排列,来展示当前所按到的音。
为了证明这个东西真的能弹出伴奏,我特意录了一个用它来弹唱的视频,唱的是薛之谦的《绅士》:
<video src="//o86cdh9ph.qnssl.com/video/IMG_7722.mp4" controls preload="none"></video>
流行钢琴伴奏和古典钢琴不同,流行钢琴伴奏的重点在于节拍的掌握以及对和弦进行丰富。事实上许多流行歌曲都围绕一个相同的和弦进程(chord progression)来创作旋律,所以**一首伴奏好不好听,很大程度上取决于怎样用不同的 pattern 来丰富你的和弦进程而已。**除了一首歌的 Intro 外,基本可以用和弦去完成一首歌曲的伴奏。在这个前提下,用电脑键盘来弹奏流行钢琴也不是不可能的事。因为我可以通过按键映射和弦以及分解和弦。
下图表示了初期版本的键位映射关系:
C
, 按 A 则会弹奏 Am
.从技术上来说,我把 Piano Keyboard 转化成了程序里的数据结构,通过计算得出相应和弦的转位。
电脑键盘比不上真钢琴或者 MIDI 键盘在于延音和力度都没有办法控制。脚踏板是钢琴的灵魂,因此用电脑键盘演奏有时会觉得一些位置非常单调、生硬,不够丰富,但又无能为力。
<!--## 写在最后
王小波的数学老师有一次对他说:「我现在所教的数学,你们也许一生都用不到,但我还是要教,因为这些知识是好的,应该让你产知道」。在我看来,学习总会有用,无论学的是什么,它总会在某一天派上用场。如果我没有学乐理,我写不出这样的程序来。另外,在写这个程序的过程中,我也后悔高中没有学好排列组合。-->
代码开源在 https://github.com/djyde/Pciano
用电脑访问 https://djyde.github.io/Pciano/ 即可