一种激光竖琴电路的设计
2011-08-16张丽华
陈 新,张丽华
(合肥工业大学 计算机与信息学院,安徽 合肥 230009)
0 引言
科技馆的激光竖琴,是一种利用激光信号有无(遮挡和无遮挡)作为输入信号,控制音乐芯片发出各种音符,来模拟竖琴的设备。
激光竖琴可以通过MP3模块播放竖琴音阶进行设计,但这种方式反应缓慢,很难奏出快速音符。激光竖琴还可以采用继电器控制音乐芯片进行设计,而这种方式的缺点是继电器的噪音很大。本文应用单片机直接控制电子琴音乐芯片进行发音,快速有效,既可以弹奏电子竖琴,也可以自动演奏电子竖琴音乐,如图1所示。图中激光传感器采用了M658D200激光器作为光发射器,IS486/485作为光接收器。控制器用32位单片机LM3S615,音乐芯片用YM-6100,功放采用KA2206芯片配两只3W/8Ω扬声器。其中IS486/485和KA2206芯片的外围电路采用相关的数据手册电路即可。
图1 激光竖琴电路方框图
1 单片机和音乐芯片的接口电路设计
YM-6100音乐芯片采用8行8列扫描按键方式发出64个音,这64个音符对应电子琴键盘按键的排列如图2所示。每个音阶黑、白键共12个,5组音阶另加4个音符,共64个按键。每个按键排列值在图的最下面一行。
图2 64键音乐芯片YM-6100的键盘编码
本设计的难点是:音乐芯片YM-6100内部也含有MCU,它的输入是8×8的行列按键矩阵,每行依次输出扫描信号,读取对应每行的8个列按键信号[1],如图3所示。应注意,不能用TTL电平直接输给YM-6100的行列按键矩阵,YM-6100只能接收干触点信号[2]。这就牵涉到如何用单片机去完成一个行列按键矩阵的功能。我们把音乐芯片YM-6100的行扫描脉冲 AB0~AB7作为单片机LM3S615的中断输入,当 YM-6100扫描某行时,LM3S615发生中断并在中断服务程序中读取激光传感器信号[3],译码后由PD口输出给YM-6100,控制其发什么音和不发音,如图4所示。(注:不发音时输给YM-6100的信号为0。)
图3 音乐片YM-6100的行列按键矩阵
图4 音乐芯片YM-6100和LM3S615连接
激光传感器信号也可以用硬件直接译码,如图5所示,用8片74HC373把 64个激光传感器TTL电平信号Y1~Y64译码为YM-6100的行列按键矩阵。其中AB0~AB7是YM-6100的第0~7行对应扫描脉冲,Y1输入对应第0行第0列按键输入D0,Y2对应第0行第1列按键输入D1,……Y8对应第0行第7列按键输入D7。当AutoPlay=1且扫描脉冲为AB0=1时,Y1~Y7被允许输出给YM-6100的D0~D7按键输入端,可以发出最低音阶12个音符的前8个音符。其它74HC373输入和发音原理类似。而来自单片机的信号AutoPlay是用来控制自动播放音乐还是手工弹奏,当AutoPlay=0时,D0~D7输出为高阻态,这时扫描脉冲 AB0~AB7使LM3S615中断,在中断服务程序中LM3S615只需按照预存的简谱音符,译码并通过PD口直接输出按键信号,进行单片机自动播放音乐。
图5 64个TTL电平输入译码为行列按键矩阵
2 自动播放音乐功能实现
我们可以通过编程让LM3S615自动播放音乐。音乐用简谱存储,用0.25秒定时器做一个最小时隙,表示1/4拍。简谱编码用十进制整型数(2字节)表示。对一个音符用:“-”表示升半调,“+”表示原调;对音符整数取绝对值后,个位为1、2、3、4、5、6、7表示音符,个位为其它值译为休止符;十位为0、1、2、3、4、5 分别表示该音符处在的音阶:低 2 音阶、低1音阶、中音阶、高1音阶、高2音阶、高3音阶,十位为其它值译为休止符;百千万位组合表示该音符时隙长度(即1/4拍得整倍数),如图6所示。为了译码方便百千万位组合超过255,截取为255,即一个音符的时长最大为256*1/4=64拍(秒);超过范围的音符全部译为休止符,常数30000表示歌曲结束。例如:整数1237表示(高1阶)7,时长为12;-10247表示(高2阶)7#,时长为102;整数2299、整数2219、整数2219都表示休止符,时长为22等。
图6 简谱音符编码方式
如图7所示为《东方红》乐曲,其简谱可以编码为:int JP[]={425,225,226,822,421,221,216,822,425,425,226,231,226,225,421,221,216,822,30000};其中30000表示歌曲简谱数组结束。为了方便,译码后保存为2个数组:音符的行列扫描值数组HL[]、时隙长度数组Slots[]。行列扫描值为2字节无符号整型数,高字节为行扫描值,低字节为列按键输入值。时隙长度为无符号字符型数,是1/4拍的整倍数。
图7 《东方红》简谱
下面我们介绍译码函数的译码步骤。在函数decode()中:①先把单个简谱音符值Yinfu分解为原音和升半音、音符、音阶、音符时长;②计算音符对应的键盘按键排列值,公式为音符小于等于3时,为音阶*12+(音符-1)*2+升半调值;音符大于3时,为音阶*12+(音符-1)*2+升半调值-1;③将其译为音符时长和音符的行列扫描信号组合成的long型数,作为返回值,时长占D31~D16,行扫描占D15~D8,列扫描占D7~D0;④如果是休止符,则long型返回值为:时长占 D31~D16,行列为0xFFFF。
接着在另一个函数decodeSZ()中,译码一首曲子的音符数组,先判断JP[i]是否为30000,是则简谱译码结束,否则调用decode()函数进行简谱译码。用这种方式还可以对多声部的乐曲,多次这样做,最后把各个声部进行组合,就可以构成多声部乐曲。LM3S615单片机在自动播放音乐的时,依次读取各个音符的时长和行列扫描值,把行列扫描值输给YM-6100音乐片进行播放,当时长递减到零时,再读取下一音符同样进行播放。
在湖南科技馆钢琴喷泉项目设备中,我们使用了自动播放功能,还可以同时准确的控制喷泉和指示灯的开关,效果很好。
3 结语
本文介绍的激光竖琴设计方法,是笔者在设计中国科技流动馆激光竖琴和湖南省科技馆的钢琴喷泉展品的经验总结。自动播放音乐部分的编码和译码等都有一定的独创性,展品运行稳定效果良好。
[1] YM6100音乐芯片数据手册[C].广州:广东省揭西县永美电子琴厂
[2] LM3S615微控制器数据[C].广州:广州周立功单片机发展有限公司
[3] 丁志刚,李刚民.单片微型计算机原理和应用[M].北京:电子工业出版社,1990.5