基于FPGA的乐器数字接口音乐FM合成器
扫描二维码
随时随地手机看文章
l 引言
乐器数字接口(Musical Instraament Digital Inter一face,MIDI)是20世纪80年代初为解决电声乐器之间的通信问题而提出的。MIDI传输的不是声音信号,而是音符、控制参数等指令,它指示MIDI设备要做什么,怎么做,如演奏哪个音符、多大音量等。它们被统一表示成MIDI消息(MIDI Message)。传输时采用异步串行通信,标准通信波特率为31.25x(1±0.01)Kb/s[1]。
MIDI的核心技术之一是合成。合成方法主要有2种:频率调制(Frequency Modularion,FM)合成和波表(wavetable)合成[2]。相对于高成本的样本波表合成,FM方式对存储空间要求更低,尽管音色表现有一定的局限性,实现难度较大,但在国际上仍然十分流行。目前,国内对MIDI技术层面的研究还不多,FM合成方面也大多采用单音基频方式,这在很大程度上制约了MIDI音乐的表现力。笔者论述了在FPGA上的MIDI音乐数字式FM合成方法,设计并验证了合成方案,合成音乐的表现力有了本质上的改善,达到了预期的效果。
2 音乐合成
2.1 FM方法
FM作为音乐合成方法最早由John Chowning提出,它是用调制器发出的周期性信号(调制波)来调制另一个信号(载波)的频率[3-4]。FM的基本表达式为
其中,A(n)为幅度包络;I(n)为调制度包络;ωm为载波角频率,它决定了乐音的音调;ωm为调制波角频率。如调制波频率处于亚音频(sub-audio)段时,可以听到像警车警报器似的音调起伏变化的声音;而当频率升高到约30 Hz以上时,可听到有边带频率的新的音色。
2.2复音
合成器的复音(polyphony)涉及到它同时发出多个独立音的能力,也叫"和弦"。复音一般以音符(note)数或声音(voice)数来衡量或说明,voice的数量就是复音数或和弦数。不同MIDI音乐要求的复音播放能力可能不相同,复音数越高,播放和声的能力就越强。
2.3 ADSR包络
图1示出的ADSR包络(ADSR envelope)[5]是许多合成器、采样器和其他电声乐器的重要部件。其功能是对乐器声音的某些方面进行调制(常常是音量)。当乐器发声时,相关音量也随着时间而变化。不同乐器的音量变化图案不同。
ADSR的定义如下:
起奏(attack)时间,表示声音由激活到达到满音量的时间。衰减(decay)时间,表示声音由峰值音量衰减到保持的时间。保持(sustain)时间,表示声音衰减后到音符被释放前的音量定常值。释放(release)时间,表示音符终止后声音淡出的时间。
如果把不同的ADSR包络应用到FM表达式中的A(n)和,(n),那么就可得到变化的频谱,再设置合适的fc/fm值,就可得到不同的音色。
3 设计实现
3.1 总体结构
在本设计中,硬件和软件资源都得到了利用。在串口MIDI驱动的支持下,软件音序器Sonar6.0播放计算机里的MIDI文件,通过RS232口输出波特率38.4 Kb/s的MIDI信号,如图2所示。全部的数字音频合成都在FPGA内部完成。数字音频码流通过12S总线方式接口到音频DAC,最后由功放输出。
|
3.2合成部分逻辑结构
为实现32复音FM合成,如图3的逻辑结构被采用。它需要逻辑上64个振荡器、64个ADSR包络发生器和64个压控放大器。这样的逻辑结构有大量的重复单元和模块,直接在FPGA上实现会消耗很多资源,开销太大。为减少面积,采用了时分复用技术把资源消耗控制到约1/64,而宏观上看起来却仍然是并行的。设计中,在FPGA上构造一个DDS(实现OSC)和一个ADSR包络发生器。
3.3设计结构
FPGA上的主要模块设计结构如图4所示,描述方式为VHDL[6],LPM和原理图。
MIDI UART即通用异步收发器,用来把异步串行方式的MIDI信号转换为MIDI字节。
消息检测模块检测MIDI字节的有效性,并提取预定义的MIDI消息。在本设计中,使用了音符开和音符关2种消息(力度为0的音符开消息等于音符关)。
声音分配器是实现复音合成的重要模块。作为关键技术之一一,它负责音的动态分配,当有新的音需要创建而没有空闲可用时,直接丢弃该音符(丢音时会被汁数器记录),如有空闲可用时则注册到寄存器里;当要关闭音时查找对应位值并改写标志位。32个声音的值和占用情况被存储在寄存器中,其音符值和开关值在时分复用的各时隙被输出。音符供后级查表得出频率,开关则用来触发ADSR包络发生器。另一方面,包络发生器反馈回来的声音状态又决定哪个复音需要被终结并使之空闲(释放复音资源)。
音符频率表模块查表得出哪个音符对应的频率是多少,以LPM方式实现。按照十二平均率音程关系,声音每升高8度,频率提高一倍,则相邻音阶的频率比值为 。以国际标准A音(440Hz)为基准,它在MIDI消息中音符值为69(0x45),则音符值为Ⅳ所对应的频率为
相位累加器模块对频率进行线性累加后得到在一个周期内的相位值。它配合正弦表模块实现DDS。一其中包含64个寄存器,分别存储64个相位,并进行时分复用以实现FM与复音。
相位调制器对2个输入求和并映射回一个周期内实现间接调频。
ADSR发生器模块根据参数控制器和触发器输入产生64个包络,在调制波和载波的相应采样时刻输出,以调制正弦表的输出幅度。
正弦表模块存储正弦波表,把相位映射到幅度。作为关键技术之一,它与相位累加器和相位调制器组成了带相位调制能力的DDS。本设计中,在Matlab里预先计算出正弦波从相位0~π/2的4070点采样,实现时经过变换,映射成为一个整周期的虚拟正弦波表,实现了一个正弦周期内的16 276点采样,实际占用存储空间只有其1/4。本设计中音频采样率约为32 550 Hz,所以频率分辨率为
FIFO模块起延迟作用。由于时序上先生成所有32个调制波采样点,后生成32个载波采样点,所以必须进行延迟使对应点在相位调制器上适当的时刻相遇,即FIFO模块对齐了载波采样和调制波采样。
混音与限幅模块的作用就是把各已调单音的采样值相加,混合为复音输出。32个单音采样都是16 bit的,相加后有可能溢出,于是还要进行限幅。这里使用的是硬限幅算法。
参数控制器模块实现合成参数的配置。以VHDL代码的形式仔放不同音色的ADsR参数和fm/fc比值。本设计内置了8种音色,2个子模块分别存放A(n)和I(n)的参数,参数部分代码如下:
数字音频效果用FPCA实现简单低音增强数字效果器。在Matlab 7.0中设计IIR低通滤波器,16 bif定点方式计算,经低音增强并混音后输出到后级。
11S总线接口模块负责配置外部DAC。I2S(Inter-ICSound Bus)[7]是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。在飞利浦公司的I2S标准中,既规定了硬件接口规范,也规定了数字音频数据的格式。本设计使用的是CS4334音频专用DAC。合成音频采样率32550Hz,双声道16bit补零填充到24bit,I2S总线上输出MCLK为12.5 MHz,SCLK为1.5625 MHz,LRCK为32.55 kHz,SDATA为串行音频数据。
3.4系统特性
整个FPGA设计总共消耗逻辑单元5 000多个(约90%),存储器57000多位(约60%),时钟频率50MHz,主要特性为双声道16 bit,32.55 kHz采样率;32复音FM数字合成,实时MIDI演奏;独立ADSR控制器;8种内置音色参数;内置低音增强数字效果器。
图5~6为声音分配器到混音器以及I2S接口的仿真结果,声音分配器的输入消息为"开启通道0上的音符60(channel=0,note=60,on-off=1)",在收到该消息约80μs后,声音开始起奏,可见声音合成时间远小于MIDI通信约1.5 ms的固有延迟。
|
以下为MIDI的合成实例,图7为MIDI音乐在音序器软件Sonar 6.0钢琴卷视图里的显示,它指示了各个音的开闭时间。图8是这段MIDI音乐在FPGA上合成出的实际波形,此波形由声卡以44.1 kHz采样率、16 bit录制,这里在音频软件Audition 2.0中显示了其中一个声道对应图7的片段。图9为对波形的STFT分析。可以清楚地看到,合成出的声音均有丰富的谐波分量存在(主要分布在10kHz以下),且由于调制度包络的变化频谱也动态变化。另外,从频谱上看也没有明显的宽带亮线存在,这说明合成波形的相位连续性较好,在听感上表现为没有暴音。图10显示了声音起奏阶段的波形,从其包络可看到ADSR模型的实现也是成功的。
4 结束语
本设计以现代电声技术为依托,在FPGA上进行全数字音乐合成,使用了经典的FM音乐合成算法,并成功实现了32复音(和弦),完成了风琴等多种音色的模拟,声音悦耳动听,音乐表现力强,可应用于伴奏、演奏、铃音、电玩等各种场合,具有实用价值,同时也体现了FPGA开发数字IC的优越性和在MIDI系统中的灵活性。