基于FPGA的MIDI音乐发生器的设计探讨
2022-09-07李栋
李 栋
(衡水学院 河北 衡水 053000)
0 引言
随着集成电路技术的进步,EDA(电子设计自动化)被广泛地用于仿真、数字电路等各个方面[1]。EDA是一项与电子及微电子技术紧密联系的自动化电子系统或电子产品的设计技术。乐器数字化接口MIDI是一种用于连接不同设备、不同行业标准制造商的通信协议。MIDI文件中最大的优点就是所占的空间相对于WAV来说,这并非是一个音乐样本,而是一个包含了所有音符的信息,并且以数字形式记录,比如在MIDI键盘上的按键,实际上是发送一个MIDI命令。因而利用此类技术对音乐发生器进行设计,可以在很大程度上提高系统的灵活性和普适性。为此,本文就基于FPGA的MIDI音乐发生器的设计展开如下论述,以供参考。
1 FPGA原理与MIDI音乐发生器概述
1.1 FPGA
FPGA是一种基于CPLD、GAL、PLA等可编程器件的现场可编程门阵列,它是一种经过不断改进和创新而形成的半自定义电路,是一种特殊的集成电路,使用该方法可以很好地弥补常规电路的不足,同时也可以有效地解决可编程器件中的门回路数目有限的问题。在实际应用中,其主要采用了内部连接、输入、输出、可配置逻辑模块CLB等逻辑单元,利用小型查询表来完成组合逻辑,每一个D型触发器的输入端都连接到一个查找表,然后用触发器来驱动I/O和逻辑电路,最后完成了FPGA的全部功能[2]。
1.2 MIDI音乐发生器
MIDI是一种音乐仪器数码界面的简称,意为“电子乐器数码界面”,它是一种在音乐合成和一种标准的乐器和计算机之间的音乐信息交流协议[3]。MIDI文件由MIDI装置之间传输的MIDI报文组成,因为 MIDI文件并不是一个采样的音乐样本,它只是一个乐曲的数据,因此它的存储空间很少。在信息化时代的背景下,音乐是人类精神生活不可或缺的一部分,对音乐信息化的研究是必然发展趋势。而MIDI与MP3、WAV以及其他流行的音乐格式一样,也是一种很普遍的数字音乐形式,但是MIDI并不只是一个简简单单的硬件,还可以是一个标准、技术或者协议。
MIDI不像WAV、MP3以及其他的数码音乐格式,它是用数码方式储存的,而WAV、MP3以及其他的一些格式则是通过解码后可以直接播放的[4]。所以,MIDI文件在某些方面有其他音乐格式所不具备的优势,主要表现在:(1)MIDI档案容易编辑,在处理音乐时,往往要将各个音轨分开,以便进行分析。MIDI可以轻松实现,而且编辑起来也很简单。(MIDI档案为纯粹的数码形式,无录音波形,所以一部完整的音乐旋律);(2)MIDI音乐所需要的空间很少,往往只有数十个千字节,而每一首MIDI都可以容纳10条以上的音轨。举例而言,当取样频率为11 kHz时,对1 min的音频进行取样,16比特的量化储存需要大约1.32 MB的内存。如果是MIDI格式,那么它的内存容量也就4 KB左右。这对我们构建自己的资料库很有帮助。
同时,MIDI文件的使用范围也很广。20世纪80年代早期,每个电子乐器制造商都是根据各自的标准生产的,所以在建立一个系统的时候,会出现很多兼容的问题。MIDI的问世,为各种乐器提供了一系列的标准,使得各种乐器之间没有了语言的隔阂,并且一直延续到今天都还在使用。MIDI音序装置的应用极大地减少了作曲者的创作费用,从小型交响乐团到大型演唱会,MIDI都扮演着举足轻重的角色。
所以,MIDI可以被认为是电脑上最简单的乐谱,可以精确地告知播放者所播放乐曲的时间值、音调、音色等。由于MIDI的播放依赖于资源库,所以MIDI的音乐在不同的平台上会有细微差别。但是,这仅仅是相似的差别,在声音质量上,不会对整个音乐的辨识产生任何影响。
2 MIDI命令介绍
MIDI中有16个通道,通道从1到16,由0到 F表示,用户可以根据不同的声道来选择不同的音色,除了打击乐器通道以外,每个通道仅可以选择一种音色,而且每种声音库中有128种不同的声音。通道10是一个打击乐器通道,在这个通道里,每一个音符都代表着一个不同的音色。在打击乐器通道中,有48种不同的音色。
MIDI传输的信息主要有两种:状态和数据两种字节。MIDI指令有:状态字节,数据字节。这个状态字节指的是一个指令字,表示后面的数据类型,状态字永远都在80 H以上,而数据字永远都在80 H以下。通常使用十六进制数字来表示状态字,而数据字则用十六进制或十进制来表示。
例如,MIDI音符ON/OFF指令包括3个字节,包括4种类型的消息:第一个字节含有一个状态(表明该信息的特性)以及信道编号1至16;第2字节为0至127的音符;第3个字节代表的是力量 O至127。例子:
(1)93 H、60、68;此指令代表一个四通道的音符开,60个音符,68个键。
(2)83 H、60、68;此指令代表一个四通道的音符关,60个音符,68个键。
实例(1)示出了通道4发出60个音符和68个按键的声音,并且实例(2)代表在闭合通道4中的一个音符是60,在这个时候可以忽略按键的力量。在90 H、60、0中,按键的力量是0,同时也是一个关卡,如果选择了后者,保持MIDI指令状态不改变,可以有效地减少 MIDI的传输密度。
随着我国海事管理信息化程序的不断增强,对新技术的需要也逐步增大,在所有海事活动中,精确的数据采集与可靠的通信必然是工作的重中之重。精确的数据采集可以最大程度了解周围的实际环境,同时可靠的数据传输可以使控制台实时监控当前情况,尤其是在环境相对复杂的海事活动中。数据采集系统的运行不公提高了船舶的航行安全,同时也可以记录船舶的动态数据,船位、航向等,为海事执法提供了最为客观、直接的证据。一旦发生事故,可以将这些数据采集出来,并进行回放,从而为事故的分析提供最为直接的证据。
(3)c2H、40;此指令用于更改声调,3通道选择40音调,也就是小提琴的声调。
每一通道的预设音色为钢琴音,可根据程序调整音色,共128种音色,数字0~127。例3中,第三通道的音色被修改成了小提琴,40被认为是小提琴的音色,每个乐器的号码都可以查询。
3 工作原理概述
计数器作为一种基本的逻辑元件,它的主要应用功能是通过计算、应用程序和定时、分频产生脉冲序列和拍频脉冲来实现它的功能,分频器可以将不同波段的音频信号分割开来,并将不同的音频信号分别传输到特定的扬声器中,再以回放的形式进行播放,由此可以看出,该电路的基本原理是将音频信号分开,并以放大的方式获得特定的播放效果[5]。
MIDI是Windows下的一种混合音效,因为它是用记谱的形式录制一首歌,所以相对于wave音乐来说,这将会大大降低存储能力。MIDI音乐的基本原则是,每一个音符的频率值(音高)和它的持续(音高)是一部音乐作品中的两项重要参数,为此,扬声器就能发出连续的音乐,只需控制将激励信号输出到扬声器的频率以及每个频率信号的持续时间[6]。
关于音调名与频率的关系。音乐的12个平均值规定了两个八度音阶间的频差(例如简谱中的中音1与高音1),之间的频率相差1倍。在两个八度音阶间,有12个半音,每一个音调的频率比率见表1。另外,音符A(简谱中的低音6)的频率为440 Hz,在B至C之间、E至F之间是半音,而其他的则是全音。由此可以计算出简谱中从低音1至高音1之间每个音名的频率,见表1。
表1 简谱中音名与频率的关系 单位:Hz
4 系统模块设计
本系统利用VHDL语言层次化设计为基础,按照功能划分为3个模块:歌曲选择模块、音乐存储模块以及输出驱动模块。
4.1 歌曲选择模块
本系统主要包括解码器,解码器的两个输入端与钥匙相连,产生二位二进制编码,各自对应于四首歌曲的储存地址[4]。例如,这个模组主要由拨码开关来决定是否要弹奏《月代表我的心》或《梁祝》,它的内部是由一个数据选择器来完成的,它的外部则连接有一个输入拨码开关,它的高和低电平会让输出从两个音乐作品中选择一首。
4.2 音乐存储模块
本系统包括两大部分:计数器 Lpm_counter0和Lpm_rom0。Lpm_counter0是一个10 bit的二进制计数,用作记录资料储存的位置产生器。这个计数器具有4 Hz的技术频率,即每个技术值的驻留时间为0.25 s,正好是全音符的音调设置是1 s,也刚好是4-4个音符中的一个4分音。比如,《梁祝》的第一个音符是“3”,逻辑上是4个钟拍,也就是1s的时间,相应的,对应“3”的相交值是1 036,并且在SPEAKERA的输入中逗留1 s。当计数器的时钟频率为4 Hz时,也就是本地地址值增大,则由ROM经q〔4..0〕传送至TONETABA组件,随后,这首歌就像是一首连贯而又自然的乐曲。Lpm_rom0是一个音符数据存储装置,具有5个字宽,总共1 024个字节,存储一首歌,每首歌256字节。
4.3 输出驱动模块
这个模块包括两个子模块:TONETABA与SPEAKERA。
音调的频率主要来自TONETABA模块,它是一个数字分频器。在它的clk端子上输入一高频率的信号,用 SPEAKERA进行分频,然后由speaker进行输出,因为从 CNC分频器中直接输出的信号是脉冲宽度非常狭窄的脉冲型信号,为了便于对扬声器的驱动,需要另外增加D型触发,使其工作循环达到平衡,但是此时的频率会是1/2。SPEAKERA的clk输入信号的分频率由11位预先设定的Tone[10..0]决定。SPEAKERA的输出频率会影响每个音符的音高,这样,分频计数器的预定值Tone[10..0]就符合speaker的输出频率。在TONETABA模块中,如果Tone [10..0]=1 035,那么,这个音符的信号频率为“3”。
音调的长短与音乐的节拍和每一个音符的节拍有关。TONETABA模块的特点是,先给SPEAKERA一个预定的片段数目,然后在SPEAKER中逗留的时间就是这个片段的节拍数值。TONETABA模块是一种乐谱编码的交叉预设查询电路,与该乐曲中的全部音符相对应的交叉预设数量为24个,每个音符的停顿时间取决于该乐曲的节拍,并且在此还包括音频产生模块NOTETABA的clk的输入频率。这24个数值的输出是根据TONETABA索引的5比特输入值来决定Index[4..0],但是Index[4..0]有32个值可以被选择。指数的价值和期限Index[4..0]向TONETABA的输出取决于内存ROM模块。
5 音乐选择开关及彩色灯光控制线路
在音乐发生器设计过程中,音乐选择开关及彩色灯光控制线路这两个部分的电路都非常简单,在输入端,将音乐选择输入端连接两个键开关S1,S2,S1关闭时A[0]端为高,关闭时A[0]端为低压,S2关闭时A[1]端是高电平,关闭时A[1]端是高电平,关闭时A[1]端是低电平,通过S1和S2的打开和关闭来改变存贮器的初始状态。两个LED显示音乐时相应的音符,3个LED分别显示高、中、低音,显示出音乐的动态,非常直观[9-10]。
6 结语
本设计以VHDL语言层次化为基础,通过模块化的方式来实现音乐播放器的设置。通过模拟和下载,可以看出,该系统可以根据键盘上的音乐和按键来选择所要播放的音乐。同时,无需改变最上层的文件就可以任意修改或添加音乐,对音乐发生器的数字电路进行了优化,能在较短的时间内设计出高效、稳定、符合设计要求的系统,并能在不改变上层文档的前提下,任意更改或添加歌曲。VHDL是一种通用的硬件描述语言,它可以提高软件的可移植性和扩展性,使得设计更加灵活,因此该系统具有体积小、功耗低、可靠性高等优点,可以满足设计的需要。经过进一步的改良和完善,MIDI音乐发生器可以应用到声控电子乐器的研发中,为人们的生活增添新的乐趣。