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