戴舒琪,夏光宇
(1.北京大学 信息科学技术学院,北京 100871; 2.上海纽约大学 工程与计算机科学学院,上海 200122)
随着计算机音乐领域的发展,越来越多的乐器开始了电子化之路.在电子合成器的帮助下,人们可以在计算机和智能移动设备的软件上演奏乐器.然而,相比于钢琴、小提琴和小号这些西方乐器,我国民族音乐中的琵琶、古筝等弹拨乐器有着一套自己独特的、更为复杂的技法体系,即使有着出色的合成器音色,也难以在缺乏技法模型的情况下,于计算机上演奏出流畅而真实的乐曲.以素有“民乐之王”美誉的琵琶为例,它有着所有民族乐器中最为复杂的技法体系,即便是简单的琵琶曲目,除了弹挑、轮指这样的基本技法外,也会用到扫弦、拉弦、揉弦、泛音等一系列中级难度的技法.这不仅需要计算机理解掌握这些常见技法,还要学习模仿人的演奏习惯,才能“以假乱真”.
另一方面,智能化的计算机自动演奏近年来日益受瞩目.以钢琴为例,在计算机中输入一段钢琴乐谱,就能自动合成相应的钢琴音乐.而对于琵琶这样的中国民族乐器而言,要想实现智能化自动演奏,必须要有更为精确而智能的技法控制模型.例如,想要在计算机上生成一段由轮指弹奏的指定节奏下的1/4音符,则需要精确计算出轮指的时长,并根据时长限制和乐曲风格等智能控制轮指的速度.同样,琵琶的不同技法模型在叠加和衔接时也需要更为智能的控制,譬如,如何在左手揉弦的同时右手进行长轮,将扫弦紧接轮指从而形成扫轮等.
不论是通过计算机和移动设备的软件演奏琵琶,还是智能化的计算机自动演奏,琵琶常见技法的建模控制都必不可少,其模型水准更是决定演奏效果的关键所在.由琵琶出发,迈出民族乐器技法智能电子化的第一步,将来更容易推广至古筝、阮、柳琴、三弦等技法相似的民族弹拨乐器,对西方的吉他等弹拨乐器的技法电子化,也有着重要的借鉴意义.
本文对琵琶的轮指、扫弦、推拉弦揉弦等主要技法,及其衍生或叠加而成的常见技法进行计算建模,并加入了泛音技法的采样,输入乐谱音符序列和对应的技法标示后,程序将自动生成曲目的MIDI格式编码文件,最后使用GarageBand中的琵琶合成器对MIDI文件输出合成结果.在实验阶段,采用analysis by synthesis(A-by-S)方法进行实验,最终确定各个模型的参数,并与GarageBand ios版琵琶的演奏进行对比,取得了显著效果.
MIDI键盘最初用来控制钢琴,而对于钢琴,并不需要复杂的技法控制,甚至根本不必对技法建模,就可以在计算机上演奏大部分乐曲.对吉他而言,它与琵琶在构造和技法上都有相似之处,然而目前的学术研究和业界软件中也只有基本的弹拨、推拉弦和扫弦技法,也没有根据乐曲要求来自动智能调节参数的模型.
在苹果公司2016年5月发布的新版GarageBand ios版中,加入了采样制作的琵琶合成器,并添加了弹、轮指、推拉弦和扫弦的技法,这也是当前唯一的琵琶技法模型.然而,这些技法模型有着致命缺陷: (1) 技法太少,无法满足绝大多数琵琶乐曲的需求;(2) 模型过于简单,导致演奏效果和人的真实演奏差距非常大,例如其中的轮指模型完全采用均匀分布,不符合人的实际演奏情况,且无法体现轮指和夹弹、滚奏、摇指之间的区别;(3) 无法根据乐曲要求,智能精确地控制技法,衔接操作难度大,难以流畅演奏,例如无法控制轮指个数(琵琶曲目中常常有精确的五指轮或四指轮要求),更无法精确限制轮指的节奏与时长等.由于GarageBand的琵琶采样合成器的音色目前仍属业界最佳,尤其是推拉弦的音色,于是本文选择该合成器进行建模后的音色合成.
在声学方面,文献[1]针对琵琶的11种左手技法,进行了时长、能量、频谱的声学参数分析,这对本文2.3节中的推拉弦和揉弦模型的构建有所启发.除此之外,其他民族弹拨乐器尚没有任何从计算机或声学角度进行技法建模或分析的经验可以借鉴.
琵琶的左右手各有约30种技法(文献[2]中附录三与四分别记录了琵琶左右手共68种技法),两手互相组合,变化繁多.从计算机演奏的角度来看,其中的基本技法(即独立且有与其他技法明显不同的合成单位)有右手的弹挑、轮指、扫弦与左手的推拉弦、揉弦、泛音.大类中又有细分,左右手组合、不同技法衔接又衍生出新技法.本文的技法模型,以单音“弹”为最小的基本单元,4种基本技法模型为基础,涵盖了大部分琵琶曲目所需的技法.
为了更接近人的真实演奏效果和实现精准控制,一方面,根据琵琶演奏经验和相关技法发声原理进行编程建模,输出结果为MIDI编码格式的文件;另一方面,借鉴文献[3]中提出的analysis-by-synthesis方法,根据合成实验的结果不断调整参数,验证并修改模型.
轮指是琵琶演奏中最为常见的技法,其中又可以细分为长轮、三指轮、四指轮、五指轮、轮双等.现有的轮指模型使用各指均匀分布的方式,与真实演奏差距大,且无法精确控制轮指个数与时长.因此,采用全新的计算模型,从时间控制(速度)和力度控制两个维度对常用的四指轮、五指轮及长轮进行建模*轮指有“上出轮”(即按照食指、中指、无名指、小指顺序弹奏)和“下出轮”(按照小指、无名指、中指、食指顺序弹奏)之分,目前在实际演奏中,下出轮几乎很少出现,因此本文只讨论上出轮..
(1) 四指轮
又称“半轮”,食、中、名、小4指依次“弹”出,连得4声.
首先是速度,对于四指轮来说,除了第四声的延长时间由乐谱中下一个指法的开始时间所控制外,其余3指的弹奏时长都有一定的规律分布.且根据经验,演奏速度较快或较慢时,往往各声之间的时长差别较小.
(1)
式(1)中:T为速度(Tempo,单位: 每分钟四分音符的个数,bpm);D为四指轮的总时长(单位: s);L表示最后一声的拍长(单位: 四分音符个数);αi是控制前3声时长关系的参数(浮点数);B为其余3声的基准拍长.
(2)
式(2)中:αi是关于前3声总时长的二次函数.可以通过两种方式控制速度: 一是调整轮指的总时长D,时间越短,速度越快;二是直接调整每一声的基准拍长B,B越小,则速度越快.
其次是力度.设每一声的力度为vi,为1到127的正整数,V是基准力度,βi为浮点参数,则有
vi=βi×Vi=1,2,3,4;0≤βi≤1.
(3)
(2) 五指轮
简称“轮”,食、中、名、小4指依次“弹”出,大指“挑”进,连得5声.其建模公式与四指轮基本相同,将式(1),(2)中i的取值范围增加到4,式(3)中i的取值增加到5即可.
(3) 长轮
两个以上的“轮”连接在一起称为“长轮”.在人演奏长轮时,无法精确保证每个轮的速度和力度都相同,为了更接近真实演奏效果,在长轮模型中加入噪音参数nt与nv,分别用来模拟速度和力度的偏差.同时,将相邻轮之间的间隔也加入考量.另外,由于一段长轮中连续轮的个数不定,无法由总时长确定其轮指速度,因此,加入K作为每个轮的拍长参数用于调节轮的速度,N为轮的个数.模型公式如下:
N×K=60TD,
(4)
(5)
vi=βi×V+nvi=1,2,3,4,5;0≤βi≤1.
(6)
扫弦与弹的区别在于,食指自右向左弹出后,同时要弹多根弦,如得一声.由此,扫又可分为双弹(2根弦)、小扫(3根弦)、扫(4根弦)、拂(4根弦,自左向右)、琶音(慢速,得4声)、连续扫拂等.*本文讨论的扫弦模型,在应用于从低音到高音,或从高音到低音的扫弦时,可以通过调整音高和力度参数进行选择.
根据经验和测评,扫弦时4声的间隔几乎没有差异,可认为是平均分布.式(7)表示时间控制,与式(1)类似,只是将αi变为常数1,表示最后1声弦音的拍长,表示其余3根弦的基准拍长;T为速度(每分钟四分之一拍的个数);D是以s为单位的总时长.对于大多数扫弦(爬音除外),L的值会远远大于B,以获得4弦1声的效果.
L+3B=60TD.
(7)
在力度上,由于琵琶4根弦的构造不同,用食指扫弦时各弦所发出的音量也有所区别,但一般来说,在同一把琴上4根弦的力度比例可近似认为是恒定的,其公式模型与式(3)相同.
(1) 推拉弦
推、拉弦分别是左手按弦向右推进或向左拉出,使得弦音升高的指法.两者在拉高弦音的效果上并没有明显差异,由文献[1]的实验结果,也可从声学角度得知二者几乎没有差别.现有的推拉弦模型,无法精确控制速度和音高,本文的模型则能够很好地解决这些问题.
t(i)=L1+B×i1≤i≤N,
(8)
(9)
(2) 揉弦
揉弦指的是左手按弦在音位上作规律的小幅度摇动,发出波音效果,本文的揉弦模型是市面上迄今为止第一个揉弦模型.与推拉弦模型的不同之处在于,揉弦没有必须拉到某一指定音高的要求,只需小幅度的音高变化,且绝大多数情况下,揉弦的速度没有明显区别,只需按某一速度进行循环往复地摇动即可.如式(10)所示,揉弦中一个推拉摇动所用拍长为常数参数Dx,N为重复个数.每一个小幅度推拉摇动的公式即为推拉弦的公式(8)和(9),目标音高需设置在较小范围内.
N×Dx=60TD.
(10)
泛音广泛存在于弦乐器中,这里讨论的是琵琶的自然泛音,其原理与吉他的自然泛音类似.根据文献[4],当左手虚按在琴弦上(仅仅接触琴弦但不用力),琴弦的振动将受到限制,且只有以此触点为节点的振动才被保留下来.如果触点在琴弦的1/2处,那么泛音频率就是琴弦基频的2倍;如果触点在琴弦的1/3或2/3处,那么泛音频率就是琴弦基频的3倍,依此类推.由于目前市面上的琵琶合成器均没有泛音的合成选项,MIDI命令也无法直接控制滤波器,因此,本文计算出琵琶每根弦各个泛音的频率,再根据计算结果使用滤波器在泛音所对应音高的弦音上进行滤波.
在琵琶的常见技法中,绝大多数都是由上述4种基本技法叠加、衔接衍生而来.而目前市面上还没有考虑这些衍生技法的模型.在此,分别以左右手配合的揉弦轮指,以及右手扫弦与轮指衔接的“扫带轮”两种最典型的技法为例,描述衍生技法的建模.
(1) 揉弦与轮指
在右手轮指的同时左手进行揉弦,是琵琶演奏中极为常用的技法.其组合建模的方式为,将式(10)中的揉弦总时长N×Dx设为轮指的每一声时长,即式(1)中的αi×B与L;将普通轮指调用若干次“弹”换为调用若干次“揉弦”;同时,揉弦公式中的L1与L2参数需调至更小的值.
(2) 扫带轮
“轮”时首先用食指作“扫”,然后中、名、小、大指紧跟作轮单弦.联立五指轮和扫弦的时长公式,可得:
(11)
在力度方面,虽然扫弦的力度通常比轮指要大,但由于两者的力度公式形式相同,如式(3),可直接沿用.
除泛音模型直接使用GarageBand中的滤波器在MIDI音符上进行实验外,其余模型的实验,均是先编程输出MIDI格式的编码文件,再由GarageBand琵琶采样合成器生成音频,并采用文献[3]中的analysis by synthesis方法,与真实的演奏片段进行比对,分析差距,调节参数,如此循环往复.
在实验的参数调节中,除了依据专业的演奏经验和发音原理外,我们邀请了琵琶演奏家、琵琶爱好者以及无琵琶背景的普通音乐爱好者,分别进行聆听,将他们的反馈意见应用到实验的analysis by synthesis方法中.下面逐一介绍4种指法模型的实验情况.
根据轮指的速度公式(1),(2),有两种方式控制轮指速度: 一是调整轮指的总时长D,时间越短,速度越快;二是直接调整每一声的基准拍长B,B越小,则速度越快.L作为最后一个音的总拍数,在轮指后紧接其他指法的情形下,由乐曲及下一个指法的要求来确定L的具体数值(通常较短);在没有明确要求时,则L为琵琶弦音的自然延长拍数,根据经验,自然延长的时间约为2s左右.
表1 轮指模型参数的估计结果
注: 在四指轮和五指轮模型中,只使用其公式中i取值范围以内的值.
根据实验测试和调整,时间控制公式中的参数ki及力度控制公式中βi的估计取值如表1所示,如此,既能保证每一声的间隔时长在轮速较快或较慢时差异更小,也能保持最佳的时长比例.长轮中,速度噪音nt与力度噪音nv分别为基准拍长B和基准力度V上下5%范围内的随机数,从而更接近真实演奏.
实验中发现,即便在力度和速度分布上与人的演奏接近,本文的轮指模型在音乐性上显得过于机械.于是,进一步在长轮模型中加入了一些常见的音乐效果,如,通过在轮指各声的音量V上,按时序增加线性渐强或渐弱的包络,来控制整体的渐强与渐弱.
在扫弦的模型公式(7)中,L值与轮指模型中的L相同,同时,与轮指模型类似,也通过控制时长D或直接调整B来控制扫弦速度,具体力度参数实验估计结果见表2.
推拉弦模型中的L2的取值参照轮指和扫弦模型的L参数,其余参数的实验计算估值如表3所示.模型中notetarget与noteorigin的取值分别为目标音高和原始音高的MIDI音高值,在揉弦模型中notetarget默认为noteorigin+1.
表2 扫弦模型力度参数的估计结果
注: “拂”指法中,生成顺序为从β3到β1.
表3 推拉弦与揉弦模型参数的估计结果
注:L1/T,L2/T,B/T的单位都是s;e为自然常数.
实验发现,计算频率并滤波的方法合成出的泛音,与真实的琵琶自然泛音相比,仍有较大的差距.由于琵琶每根弦的自然泛音数目很少,完全可以通过采样录音的方式将其记录下来,再封装出函数调用接口,加入技法模型中,由程序在合成音频时进行调用.
为了检验模型最终的效果,本文从琵琶传统古曲《高山流水》(浦东派演奏家,林石城编曲版)中改编出7小节的选段,涵盖拧弦、轮指、扫弦、泛音、揉弦、推拉弦等技法,分别用GarageBand ios版中的琵琶和真实琵琶进行演奏,并与本文中模型的合成结果进行对比分析.对于GarageBand琵琶中无法演奏的技法,则用简化版或相近技法代替,例如,用音高相同或相差一个八度的弦音代替泛音、不使用揉弦、扫轮拆分为扫弦和轮指等.检验结果表明: 本文的模型不仅大大提高了计算机演奏的质量,与人的真实演奏更为相似;而且相比GarageBand中需要花费大量时间练习操作、错误率高、无法精准控制演奏的事实,本文的模型生成简单便捷,可操作性强.相关合成结果见http:∥shuqid.net/pipa.
实验结果表明: 本文所提出的琵琶常用技法计算模型,不论是在指法的种类数目,与人演奏的相似度,还是在演奏控制上都有着质的飞跃,可以实现大部分中等难度琵琶曲目的电子化合成,控制自由准确,生成便捷,并且保证了相当的演奏质量.同时,采用MIDI编码格式也保证了该模型的通用性和可扩充性.
针对模型中存在的问题,还有更多的改进空间:
(1) 琵琶指法组合千变万化,在现有模型基础上,增加更多的高级指法模型,包括更多的“噪音”技法,如“摘”、“拍板”、“绞线”等(倘若难以实现物理模型,也可以直接使用类似本文“泛音”技法的采样方法来加入,毕竟这些技法没有音高,音色种类较为固定),则可以演奏更多的琵琶乐曲.
(2) 在建模时采用机器学习方法来假设和验证分布,或许可以提高模型的精确性.例如,式(2)中αi的二次函数的参数可以通过回归模型进行解决,或假设为其他分布类型;甚至可以不假设分布,采用生成对抗网络(Generative Adversarial Network)[5],在建立生成指法的网络同时,再设计一个判别网络专门用来判断该指法是否由人演奏.
(3) 增加模型参数,采用一些机器学习中的监督学习算法,从合成的指法模型音频出发,以真实演奏的音频信号波形为训练样本,从而更准确地分析调整各个指法模型.
(4) 尝试学习同一指法在不同曲目中的音频样本,或许能够得到不同演奏家在不同演奏风格下的指法模型,进一步学习某个具体演奏家的演奏习惯.
(5) 可以适当加入一些触弦所产生的噪音,更加真实地模拟人的演奏效果.
(6) 设计模型的图形化操作界面,让非开发者用户也能自如演奏.
未来若能够创建琵琶指法符号的电子识别系统,结合本文中的指法模型,将真正实现计算机上的琵琶智能读谱及自动演奏.琵琶中级指法智能模型,作为民族乐器智能电子化的第一步,不仅为其他民族乐器,也为部分西方乐器(如吉他)的指法电子化提供了很好的借鉴;对中西方乐器融入未来信息世界,特别是对于建立中国民族音乐的独特体系,有着重要而深远的意义.