APP下载

基于Arduino的多轨道Midi音序器的实现

2019-05-27陈业欣丰大军

网络安全与数据管理 2019年5期
关键词:子程序按键音符

陈业欣,丰大军,张 蓓

(华北计算机系统工程研究所,北京 100083)

0 引言

声音是人类感知世界和沟通交流的重要途经,蕴含着丰富的艺术、情感与信息。音乐更是人们表达情感的重要手段,中国古代就将音乐上升至“和民声,善民心”的层面,且礼乐并重。电声学交叉涵盖数学、物理、电器电子、电磁学、计算机科学、生理、艺术等众多学科知识,且学科间跨度很大,它是对声音信号进行创造、加工、处理的学科[1]。我国的电声行业起步较晚,尽管在21世纪初期电声元器件和消费类数码产品蓬勃发展的带动下取得了巨大的经济利益,但专业电声产品领域的研究仍处在空白阶段。中国的电声企业几乎没有电子器乐产品,现阶段国内所使用的合成器均为欧美国家及日本的产品。本文针对合成器的演奏控制部分(即音序器)进行研究,设计并开发了一种基于Arduino的多轨道Midi音序器,介绍了音序器的系统功能及硬件设计,给出了音序播放、录制及其他控制的复杂逻辑的软件解决办法,实现了真正可实际应用在电子乐创作及现场表演的多轨道Midi音序器。

1 功能设计

合成器因其区别于常规管弦乐器的声音,而且拥有丰富多变的音色,因此在电子音乐创作中被作为主要的器乐来使用。其组成可分为演奏控制部分和音色合成部分,分别对应演奏乐句和调制音色的功能[2]。通常合成器的演奏控制部分均为带有键盘的音序器,且与合成器集成于一体,而在某些种类电子音乐(如Techno、House等)的现场表演中,需要用到多台合成器同时依靠音序器来演奏从而形成复杂的和声、复调及音色结构。而合成器自带的音序器一般较为简单且各品牌产品功能及规格不统一,在多台合成器自带音序器上进行音序的编辑及播放给准备工作及现场演出都带来了一定的麻烦。因此需要实现一种具有标准Midi接口[3]、操作简便、可同时驱动多轨道的独立音序器。

完整的音序器需要如下三个功能:实时演奏功能、音序播放功能、音序录制功能。

实时演奏功能需要在系统待机状态下实时接收键盘的输入信号(包含音高信息与力度信息等)并将其转化为Midi信号输出;可调节演奏的Midi通道并可更改当前音序器的步进长度(默认16步进,最长32步进)。

当触发音序播放功能时,系统将按照当前设置的拍速播放选定的已存储音序工程(以下简称“工程”,包含三个最长32步进的音序),并分别将三个音序的音高、力度及Midi时钟信息以预先设定的三个Midi通道输出,同时在播放时可实时切换不同的工程、改变拍速。

当使用音序录制功能时,使用键盘输入每一步进的音高信息及力度信息,并可将任意步进空拍,分别录制当前选定工程的三个音序。

2 硬件设计

硬件平台的搭建以Arduino Mega 2560开发板为系统逻辑控制及存储的核心。该控制板拥有54路数字输入输出接口,其中15路可作为PWM输出,16路模拟输入,4路UART接口,且拥有256 KB的Flash,8 KB动态内存及2 KB EEPROM存储空间,可实现大量输入输出的复杂逻辑[4]。

2.1 硬件平台搭建

本系统的外部硬件设备均采用简单的数字、模拟按键或旋钮输入及数码管、LED等简单的显示模块,因5 V供电电压且接口电流小,所以功耗较低。以Arduino Mega 2560为逻辑控制的核心,实现对复杂多变的输入与输出的控制[5]。系统硬件结构框图如图1所示。

图1 系统硬件结构框图

2.2 输入模块

本系统输入部分需完成模式控制、音符音高输入、音符力度输入、工程选择、拍速设置、步进长度设置、Midi通道设置。

模式控制使用4键模拟键盘分别实现播放及停止、步进录制及停止、激活步进长度修改模式、激活实时演奏Midi通道修改模式,只需占用一个模拟输入接口;音符音高输入由4×4矩阵键盘实现,占用8个数字接口,利用数字扫描实现信号的输入,响应速度快,键盘共16个按键,其中13个按键用于满足一个八度音及下一八度C的音高输入需要,两个按键用于实现键盘八度的移掉控制(使得一个八度的键盘也可输入C0至G10的完整音域),剩余一个按键用于在步进录制模式下音符的静音(即空拍);音符力度输入采用旋转电位器模拟接口输入,占用一个模拟输入接口,可输入从0至Midi标准值127的完整力度信息,且力度输入与键盘分离的设计凸显了本系统简单创新的设计理念;工程选择不仅在待机模式下需要完成选定,在播放音序时更需要实时响应工程选择的变化,因此采用10挡位数字波段开关来实现,占用10个数字接口,用于快速选择播放及录制的工程编号;拍速设置范围设置在60~160 BPM(Beats Per Minute,单位时间内的拍数)之间,需要准确控制速度,拍速稳定不漂移,并且在音序播放时要实时响应拍速变化,因此选用无限旋转数字脉冲电位器作为输入控制,占用一个外部中断接口及数字接口,以外部中断进行更改拍速寄存数值的方式实时响应速度控制;步进长度设置需要按下模式控制键盘对应按键来激活此模式,并复用数字脉冲电位器更改步进长度从1至32的变化;Midi通道设置需要按下模式控制键盘对应按键激活此模式,并复用矩阵键盘16个按键选择所需的16个Midi通道之一。

2.3 输出模块

本系统输出部分需完成Midi信号标准接口的输出、拍速的显示、步进录制时工程中音序编号的显示、Midi通道的显示、音序播放时步进位置的显示、步进录制时步进位置的显示、步进长度修改时长度的显示、实时演奏时力度输入的显示。

Midi接口采用标准5针Midi接口,占用一个串口输出口;拍速、音序编号及Midi通道均为数字信息,因此选用TM1650芯片驱动4位数码管实现相关信息的显示,只需要占用两路数字接口;步进位置、长度及力度输入等信息的显示采用16位RGB全彩内置WS2811芯片的LED灯条分别对应16步进(或32步进以颜色区分)或力度,且只需占用一个数字接口。

3 软件设计

系统软件设计基于Arduino IDE软件开发环境,使用C/C++编程语言。Arduino有丰富的库文件以供使用,利用库文件适当地简化了程序开发工作[6]。软件设计时把整个系统程序分为三个模块:实时演奏主程序、音序播放子程序、音序录制子程序、多轨道Midi设置子程序及外部中断子程序(拍速及步进长度设置),首先对主程序框架进行设计,并针对每个模块进行独立设计,最后将各模块构建一个完整的工程,并烧录进Arduino Mega 2560开发板。

3.1 实时演奏主程序

由于在系统开机进入待机状态后,需要实时响应键盘的输入并输出Midi信号,因此以实时演奏作为系统的主程序,主程序流程图如图2所示。

在正式进入主程序流程前,必须先进行初始化工作,包括完成串口、数码管、LED的初始化设置,各数字、模拟引脚的初始化设置,开中断,读取Midi设置等流程。在初始化完成后判断启动模式,开始实时演奏或进入多轨道Midi设置子程序。拍速设置、步进长度设置、演奏Midi通道设置及选择播放或录制的音序均需要在判断是否进入音序播放及音序录制模式之前完成。若未进入音序播放及录制模式,则读取数字扫描键盘有无输入,并将输入按键映射为相应音高的Midi信号,旋转电位器输入映射为力度的Midi信号,并通过串口发送至外部。

图2 主程序流程图

3.2 音序播放子程序

进入音序播放子程序之前需要在主程序获取拍速、步进长度、多轨道Midi设置及所要播放的工程编号。进入音序播放子程序后开始进入播放循环,长度与步进长度一致,每个步进即占用一个循环节,在4/4拍的音乐中,每一步进代表16分音符,4个步进占用4分音符的时值即为一拍,默认步进长度为16,即完整播放一次音序为4拍。在音乐演奏过程中,丢拍的代价远比音符演奏错误要高,所以Midi协议采用异步串行的通信方式,并规定每16分音符需要包含6个Midi时钟[7]。

因此,每个循环节内首先在LED灯条上显示当前步进的位置(如第一个步进则点亮16个LED灯的第一个,如第17个步进则用不同颜色点亮第一个LED灯),向窗口发送6个时钟信号(单字节数据0xF8),并分别从Arduino的EEPRom读取及向串口发送由所存储选定工程的三组音序的音高及力度信息组成的音符开始信号,通过拍速(定义为每分钟包含的拍数)计算出每步进的时值并延迟响应时间后发送音符停止信号,从而保证每一步进的音符保持了当前拍速下16分音符的时值,而后判断音序播放模式标志位,若为真则开始下一步进的循环节,否则跳出音序播放子程序回到主程序。若在多轨道Midi设置子程序中走带控制位为真,则在以上流程发送Midi时钟信号前向串口发送走带开始信号(单字节数据0xFA),并在跳出音序播放子程序后发送走带停止信号(单字节数据0xFC)再进入主程序。

3.3 音序录制子程序

与播放子程序一样,进入录制子程序之前需要在主程序获取步进长度、多轨道Midi设置及所要播放的工程编号。进入音序录制子程序后开始进入录制循环,长度与步进长度一致,每个步进即占用一个循环节。每个循环节开始时判断所选择当前工程下的音序编号(由波段开关进行选择),并在LED灯条显示当前步进位置,当数字扫描键盘按键触发时同时读取旋转电位器获取力度信息,向串口发送音符开始信息,当按键释放时录入当前音序的数组,而后判断音序录制模式标志位,若为真则开始下一步进的循环节,否则将当前工程的三个音序数组写入到EEPRom后跳出音序录制子程序回到主程序。

3.4 多轨道Midi设置子程序

开机启动时按下模拟键盘的Midi设置键进入多轨道Midi设置子程序,通过波段开关选择默认三个音序的Midi通道设置及Midi走带控制标志位设置,选中其中一个设置并通过数字扫描键盘的输入完成对当前设置的修改。Midi通道可完成16个通道的设置分别对应数字扫描键盘的16个按键。Midi协议中走带控制信号用于控制对器乐演奏时各器乐自带音序器的播放与停止,在本系统应用场景下只需控制鼓机的走带控制即可,若无需鼓组的音乐则无需走带控制信号,只需要利用Midi时钟信号进行同步。

3.5 外部中断子程序

由于在音序播放模式下,演奏者可能会对当前演奏拍速进行调节,故需要利用外部中断接收数字脉冲电位器发出的正脉冲与负脉冲两种信号来分别控制拍速寄存数值及步进长度寄存数值的增减。高频脉冲速度使得中断时间微乎其微(人耳可辨识时延范围大概为20 ms,中断程序只进行简单的加减运算,故不会被人耳察觉),因此不会影响音序播放的速度。

4 结论

本文完成了基于Arduino的多轨道Midi音序器的设计与实现,并阐述了系统的功能和硬件设计以及程序结构的设计,编写了完整的程序代码。经过实际演奏及准备工作的测试,系统运行稳定。该系统实现了在一台音序器上利用标准Midi接口驱动三台合成器音源同时演奏的基本使用需求以及录制工作的需求,解决了多台合成器演奏及录制工作复杂的问题。在硬件设计上采用简单易于操作的显示及输入模块,力度与音高输入分离的设计提高了音序化合成器现场演奏的操作性,波段开关的设计替代了国外产品利用组合按键的设计使得歌曲工程的切换更快速准确,全彩LED灯条比同类产品单色LED灯条可显示更复杂的步进位置信息。

本系统具有功耗低、通用性好、体积小、操作简单及运行稳定的优点,在国产电声器乐产品中较为先进且市场前景较大,可突破国外企业对世界专业电声器乐市场的垄断。

猜你喜欢

子程序按键音符
子程序在数控车编程中的创新应用
基于有限状态机的按键检测程序设计
多按键情况下,单片机端口不足的解决方法
美妙音符
青春音符
浅谈子程序在数控车编程中的应用
其实真的很简单教你轻松关闭WP8.1手机按键灯
计算器
子程序在数控车加工槽中的应用探索
西门子840D系统JOG模式下PLC调用并执行NC程序