EDA技术实用教程课程设计简易音乐播放器电子12-11206040124简易音乐播放器设计1.MIDI概述MIDI(Musical Instrument Digital Interface)乐器数字接口,是20 世纪80 年代初为解决电声乐器之间的通信问题而提出的。
MIDI是编曲界最广泛的音乐标准格式,可称为“计算机能理解的乐谱”。
它用音符的数字控制信号来记录音乐。
一首完整的MIDI音乐只有几十KB大,而能包含数十条音乐轨道。
MIDI 应用也比较广泛,电视晚会的音乐编导可以用MIDI功能辅助音乐创作,或按MIDI 标准生成音乐数据传播媒介,或直接进行乐曲演奏。
如果在计算机上装备了高级的MIDI软件库,可将音乐的创作、乐谱的打印、节目编排、音乐的调整、音响的幅度、节奏的速度、各声部之间的协调、混响由MIDI来控制完成。
利用MIDI 技术将电子合成器、电子节奏机(电子鼓机)和其他电子音源与序列器连接在一起即可演奏模拟出气势雄伟、音色变化万千的音响效果,又可将演奏中的多种按键数据存储起来,极大的改善了音乐演奏的能力和条件。
2.工作原理MIDI 音乐是Windows下的一种合成音乐,由于它通过记谱的方式来记录一段音乐。
因此与wave音乐相比,它可以极大的减少存储容量。
MIDI 音乐的基本原理为:组成乐曲的每一个音符的频率值(音调)及其持续的时间(音长)是乐曲能连续演奏的两个基本数据,因此只要控制输出到扬声器的激励信号频率的高低和每一个频率信号持续时间,就可以使扬声器发生连续的乐曲。
图 1 是歌曲《生日快乐歌》开头一句的简谱。
由图 1 可知,该乐典涉及:中音5,6 ,7 ;高音1,2,3,4,5 。
以此为例下面介绍在本音乐发生器芯片中音乐的形成过程。
前两个音符为中音 5 ,1/16 音符,它对应的编码为1000 ,所占的脉冲个数为2 ,这样逐个将以上的简谱翻译成代码如下:|1000 1000 1001 1001 1000 1000 |1011 1011 1010 1010 1010 1010| |1000 1000 1001 1001 1000 1000 |1100 1100 1011 1011 1011 1011| |1000 1000 1111 1111 1101 1101 |1011 1011 1010 1010 1001 1001| |1110 1110 1101 1101 1011 1011 |1100 1100 1011 1011 1011 1011|图1 《生日快乐歌》歌谱在节奏时钟脉冲的控制下,将每个代码所对应的分频系数逐一赋给基频,得到对应的音调,这样连续起来就形成一段美妙的音乐。
本设计的关键是要准确地产生音乐中各音符所对应的频率信号,并根据乐曲要求按节拍输出。
为了减少系统复杂性,本设计根据可变模值计数器的原理,按照乐曲要求定时改变计数器的预置数,即可产生乐曲所需要的频率信号。
芯片原理框图如图2 所示。
图2 中节拍控制电路产生节拍定时信号;音符产生电路按节拍要求产生乐曲所需要的音符;预值数产生电路受音符控制,产生该音符频率相对应的预置数,送计数器的置入数据输入端。
音符频率发生器根据不同的预置数产生相应的频率信号,从而完成乐曲的演奏功能。
图2 播放器原理3.音乐编码模块此模块包括节拍控制电路和音符产生电路。
节拍控制电路以乐曲中最短音符的节拍为基准,产生乐曲所需要的全部节拍。
因为乐曲《生日快乐歌》中最短音符为1/4 节拍,全曲共有48 个1/4 节拍,故节拍控制器至少需要产生48 个有效状态。
考虑到一遍演奏完需要间隔时间,所以选定节拍控制计数器CNT1 的计数状态为48 + 4 个,其中间隔时间为4个有效状态。
本例要求演奏时能循环进行,因此需要另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。
音符产生电路采用查找表形式.在节拍控制产生电路的节拍信号作用下,按乐曲中音符持续时间的长短输出相应音符名称。
以乐曲中前两个音节为例,其音符输出查找表如表1 所示。
4.音调发生模块此模块包括预值数产生电路和频率发生器。
预值数产生电路设计采用查找表形式,按照音符的频率要求产生相应的预置数。
根据可变模值计数器的设计原理及音符的分频系数,可计算出乐曲《生日快乐歌》中各音符的预置数如表 2 所示。
表2 音频的分频和预置数频率发生器由可变模值计数器实现.由于系统要求产出的信号频率较高,因此选用2 MHz 高频脉冲信号作为可变模值计数器的计数脉冲。
此片段内各音阶频率及相应的分频如表 3 所示。
为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,考虑到输出信号是脉冲极窄的脉冲式信号,为了有利于驱动扬声器,可以在到达扬声器之前,有一个二分的分频器,或在计数器输出端外加一个D触发器也可以均衡占空比。
当然,如果输出到扬声器的信号采用正弦波代替对称方波将会有更好的效果。
表3 音符与频率对照表由于最大的分频系数为5102,故采用13 位十二进制计数器已能满足分频要求。
在表 3 中除给出了分频比以外,还给出了相应于各个音节频率时计数器不同的初始值。
对于不同的分频系数,只要加载不同的初始值即可。
采用加载初始值而不将分频输出译码反馈,一个常用技巧。
表中“0”表示休止符。
对于乐曲的休止符。
只要将分频系数设为0,即初始值为213-1=8191,此时扬声器将不会发声。
5.顶层文件设计顶层文件采用原理图设计,根据图1所示原理框图,可设计出MIDI 音乐,发生器顶层原理如图3所示。
为了方便设计,图3中将节拍控制电路和音符产生电路设计在同一模块中,称为TONE 模块。
音调发生器电路称为FPQ模块,彩灯控制电路称为LIGH模块。
图3 顶层远离6.底层文件TONE 模块中的CLK 为4Hz 信号输入端,SEL[3 …0]为音符输出端,其输出用于驱动FPQ 和LIGHT模块。
图4为其时序仿真,其中SEL为各个音符的二进制编码。
从图4 可以看出,仿真结果和设计要求一致。
前两个脉冲SEL输出为1000,即为中音5的二进制编码,第三第四个脉冲下SEL 为1001,对应中音6,依次下去,第五第六个脉冲下SEL为1000,对应中音5,第七第八个脉冲下SEL 为1011,对应高音1,后面四个脉冲下SEL为1010对应中音7。
COUNT为节拍控制计数器。
图4 音乐编码器仿真FPQ模块中的CLKM为2 MHz输入端,MUS为音调输出端。
图5为其时序仿真,在这里只对音符中音5仿真,此时其编码为1000,NUM为其分频系数1276。
当CT 计数到1276时,MUS就输出计数脉冲,其效果就是频率784 的信号。
图5 音调发生器仿真7.部分代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity zy4668_music1 isport(clk:instd_logic;huifang: in std_logic;qiege: in std_logic;xuhuan: in std_logic;zanti: in std_logic;xuan: in std_logic_vector(1 downto 0);index:outstd_logic_vector(3 downto 0));end zy4668_music1;architecture behav of zy4668_music1 issubtype word is integer range 0 to 15;type memory is array(0 to 565) of word;signal rom:memory;signal clk_4Hz:std_logic;signal clk_cnt:integer range 0 to 249;signal adr:integer range 0 to 600;signal sar:integer range 0 to 600;signal sar1:integer range 0 to 600;beginprocess(clk,zanti)beginif zanti='1' thenif clk'event and clk='1' thenif clk_cnt=249 thenclk_cnt<=0;clk_4Hz<='1';elseclk_cnt<=clk_cnt+1;clk_4Hz<='0';end if;end if;end if;end process;process(clk_4Hz,xuan,zanti,xuhuan,qiege,huifang) beginif zanti='1' thenif xuan="00" and qiege='0' thenadr<=416;sar<=558;sar1<=416;elsifxuan="01" and qiege='0' thenadr<=0;sar<=138;sar1<=0;elsifxuan="10" and qiege='0' thenadr<=139;sar<=279;sar1<=139;elsifxuan="11" and qiege='0' thenadr<=280;sar<=415;sar1<=280;elseif clk_4hz'event and clk_4hz='1' thenif huifang='1' thenif xuhuan='1' thenif adr=sar then adr<=sar1;else adr<=adr+1;end if;elseif adr=558 then adr<=0;else adr<=adr+1;end if;if adr>415 then sar<=558;sar1<=416; elsifadr>279 then sar<=415;sar1<=279;elsifadr>138 then sar<=279;sar1<=139;else sar<=138;sar1<=0;end if;end if;elseif adr=sar1 then adr<=sar1;else adr<=adr-1;end if;end if;end if;end if;end if;end process;index<=conv_std_logic_vector(rom(adr),4);rom(0)<=3;rom(1)<=3;rom(2)<=3;rom(3)<=3;rom(4)<=5;rom(5)<=5;rom(6)<=5;rom(7)<=6;rom(8)<=8;rom(9)<=8;rom(10)<=8;rom(11)<=9;rom(12)<=6;rom(13)<=8;rom(14)<=5;rom(15)<=5; rom(16)<=12;rom(17)<=12;rom(18)<=12;rom(19)<=15; rom(20)<=13;rom(21)<=12;rom(22)<=10;rom(23)<=12; rom(24)<=9;rom(25)<=9;rom(26)<=9;rom(27)<=9; rom(28)<=9;rom(29)<=9;rom(30)<=9;rom(31)<=0; rom(32)<=9;rom(33)<=9;rom(34)<=9;rom(35)<=10; rom(36)<=7;rom(37)<=7;rom(38)<=6;rom(39)<=6; rom(40)<=5;rom(41)<=5;rom(42)<=5;rom(43)<=6; rom(44)<=8;rom(45)<=8;rom(46)<=9;rom(47)<=9; rom(48)<=3;rom(49)<=3;rom(50)<=8;rom(51)<=8; rom(52)<=6;rom(53)<=5;rom(54)<=6;rom(55)<=8; rom(56)<=5;rom(57)<=5;rom(58)<=5;rom(59)<=5; rom(60)<=5;rom(61)<=5;rom(62)<=5;rom(63)<=5; rom(64)<=10;rom(65)<=10;rom(66)<=10;rom(67)<=12; rom(68)<=7;rom(69)<=7;rom(70)<=9;rom(71)<=9; rom(72)<=6;rom(73)<=8;rom(74)<=5;rom(75)<=5; rom(76)<=5;rom(77)<=5;rom(78)<=5;rom(79)<=5; rom(80)<=3;rom(81)<=5;rom(82)<=3;rom(83)<=3; rom(84)<=5;rom(85)<=6;rom(86)<=7;rom(87)<=9; rom(88)<=6;rom(89)<=6;rom(90)<=6;rom(91)<=6; rom(92)<=6;rom(93)<=6;rom(94)<=5;rom(95)<=6;rom(96)<=8;rom(97)<=8;rom(98)<=8;rom(99)<=9;rom(100)<=12;rom(101)<=12;rom(102)<=12;rom(103)<=10;rom(104)<=9;rom(105)<=9;rom(106)<=10;rom(107)<=9;rom(108)<=8;rom(109)<=8;rom(110)<=6;rom(111)<=5;rom(112)<=3;rom(113)<=3;rom(114)<=3;rom(115)<=3;rom(116)<=8;rom(117)<=8;rom(118)<=8;rom(119)<=8;rom(120)<=6;rom(121)<=8;rom(122)<=6;rom(123)<=5;rom(124)<=3;rom(125)<=5;rom(126)<=6;rom(127)<=8;rom(128)<=5;rom(129)<=5;rom(130)<=5;rom(131)<=5;rom(132)<=5;rom(133)<=5;rom(134)<=5;rom(135)<=5;rom(136)<=0;rom(137)<=0;rom(138)<=0;rom(139)<=10;rom(140)<=10;rom(141)<=11;rom(142)<=12;rom(143)<=12;rom(144)<=11;rom(145)<=10;rom(146)<=9;rom(147)<=8;rom(148)<=8;rom(149)<=9;rom(150)<=10;rom(151)<=10;rom(152)<=9;rom(153)<=9;rom(154)<=9;rom(155)<=10;rom(156)<=10;rom(157)<=11;rom(158)<=12;rom(159)<=12;rom(160)<=11;rom(161)<=10;rom(162)<=9;rom(163)<=8;rom(164)<=8;rom(165)<=9;rom(166)<=10;rom(167)<=9;rom(168)<=8;rom(169)<=8;rom(170)<=8;rom(171)<=9; rom(172)<=9;rom(173)<=10;rom(174)<=8;rom(175)<=9;rom(176)<=10;rom(177)<=11;rom(178)<=10;rom(179)<=8;rom(180)<=9;rom(181)<=10;rom(182)<=11;rom(183)<=10;rom(184)<=9;rom(185)<=8;rom(186)<=9;rom(187)<=5;rom(188)<=10;rom(189)<=10;rom(190)<=10;rom(191)<=11;rom(192)<=12;rom(193)<=12;rom(194)<=11;rom(195)<=10;rom(196)<=9;rom(197)<=8;rom(198)<=8;rom(199)<=9;rom(200)<=10;rom(201)<=9;rom(202)<=8;rom(203)<=8;rom(204)<=8;rom(205)<=10;rom(206)<=10;rom(207)<=11;rom(208)<=12;rom(209)<=12;rom(210)<=11;rom(211)<=10;rom(212)<=9;rom(213)<=8;rom(214)<=8;rom(215)<=9;rom(216)<=10;rom(217)<=10;rom(218)<=9;rom(219)<=9;rom(220)<=9;rom(221)<=10;rom(222)<=10;rom(223)<=11;rom(224)<=12;rom(225)<=12;rom(226)<=11;rom(227)<=10;rom(228)<=9;rom(229)<=8;rom(230)<=8;rom(231)<=9;rom(232)<=10;rom(233)<=9;rom(234)<=8;rom(235)<=8;rom(236)<=8;rom(237)<=9;rom(238)<=9;rom(239)<=10;rom(240)<=8;rom(241)<=9;rom(242)<=10;rom(243)<=11;rom(244)<=10; rom(245)<=8;rom(246)<=9;rom(247)<=10;rom(248)<=11;rom(249)<=10;rom(250)<=9;rom(251)<=8;rom(252)<=9;rom(253)<=5;rom(254)<=10;rom(255)<=10;rom(256)<=10;rom(257)<=11;rom(258)<=12;rom(259)<=12;rom(260)<=11;rom(261)<=10;rom(262)<=9;rom(263)<=8;rom(264)<=8;rom(265)<=9;rom(266)<=10;rom(267)<=9;rom(268)<=8;rom(269)<=8;rom(270)<=8;rom(271)<=8;rom(272)<=8;rom(273)<=8;rom(274)<=9;rom(275)<=10;rom(276)<=9;rom(277)<=8;rom(278)<=8;rom(279)<=8;rom(280)<=6;rom(281)<=6;rom(282)<=6;rom(283)<=7;rom(284)<=8;rom(285)<=8;rom(286)<=8;rom(287)<=6;rom(288)<=8;rom(289)<=8;rom(290)<=7;rom(291)<=6;rom(292)<=7;rom(293)<=7;rom(294)<=3;rom(295)<=0;rom(296)<=7;rom(297)<=7;rom(298)<=7;rom(299)<=8;rom(300)<=9;rom(301)<=9;rom(302)<=9;rom(303)<=7;rom(304)<=9;rom(305)<=9;rom(306)<=8;rom(307)<=7;rom(308)<=6;rom(309)<=6;rom(310)<=6;rom(311)<=6;rom(312)<=10;rom(313)<=10;rom(314)<=13;rom(315)<=13;rom(316)<=12;rom(317)<=12;rom(318)<=13;rom(319)<=12;rom(320)<=11;rom(321)<=11;rom(322)<=10;rom(323)<=9;rom(324)<=10;rom(325)<=10;rom(326)<=6;rom(327)<=6;rom(328)<=0;rom(329)<=11;rom(330)<=11;rom(331)<=9;rom(332)<=10;rom(333)<=10;rom(334)<=10;rom(335)<=8;rom(336)<=7;rom(337)<=3;rom(338)<=8;rom(339)<=7;rom(340)<=6;rom(341)<=6;rom(342)<=6;rom(343)<=6;rom(344)<=0;rom(345)<=0;rom(346)<=0;rom(347)<=0;rom(348)<=6;rom(349)<=6;rom(350)<=6;rom(351)<=7;rom(352)<=8;rom(353)<=8;rom(354)<=8;rom(355)<=6;rom(356)<=8;rom(357)<=8;rom(358)<=7;rom(359)<=6;rom(360)<=7;rom(361)<=7;rom(362)<=3;rom(363)<=0;rom(364)<=7;rom(365)<=7;rom(366)<=7;rom(367)<=8;rom(368)<=9;rom(369)<=9;rom(370)<=9;rom(371)<=7;rom(372)<=9;rom(373)<=9;rom(374)<=8;rom(375)<=7;rom(376)<=6;rom(377)<=6;rom(378)<=6;rom(379)<=6;rom(380)<=10;rom(381)<=10;rom(382)<=13;rom(383)<=13;rom(384)<=12;rom(385)<=12;rom(386)<=13;rom(387)<=12;rom(388)<=11;rom(389)<=11;rom(390)<=10;rom(391)<=9;rom(392)<=10;rom(393)<=10;rom(394)<=6;rom(395)<=6;rom(396)<=0;rom(397)<=11;rom(398)<=11;rom(399)<=9;rom(400)<=10;rom(401)<=10;rom(402)<=10;rom(403)<=8;rom(404)<=7;rom(405)<=3;rom(406)<=8;rom(407)<=7;rom(408)<=6;rom(409)<=6;rom(410)<=6;rom(411)<=6;rom(412)<=0;rom(413)<=0;rom(414)<=0;rom(415)<=0;rom( 416)<=6;rom( 417)<=7;rom(418)<=8;rom( 419)<=8;rom(420) <=9; rom( 421)<=8;rom( 422)<=7;rom( 423)<=5;rom( 424)<=3;rom( 425)<=6;rom(426)<=6;rom(427)<=6;rom( 428) <=6;rom( 429)<=6;rom( 430)<=7;rom( 431)<=8;rom( 432)<=8;rom( 433)<=9;rom( 434)<=8;rom( 435)<=7;rom( 436)<=5;rom( 437)<=3;rom(438)<=10;rom( 439)<=10;rom( 440)<=10;rom(441)<=10;rom(442)<=10;rom( 443)<=10;rom( 444)<=13; rom( 445)<=13;rom( 446)<=13;rom(447)<=12;rom( 448)<=10; rom(449)<=0;rom( 450)<=9;rom( 451)<=8;rom( 452)<=9; rom( 453)<=9;rom( 454)<=9;rom( 455)<=8;rom( 456)<=6; rom( 457)<=6;rom(458)<=0;rom( 459)<=6;rom( 460)<=7; rom( 461)<=8;rom( 462)<=8;rom( 463)<=9;rom(464)<=8; rom( 465)<=9;rom(466)<=10;rom(467)<=5;rom( 468)<=6; rom( 469)<=6;rom( 470)<=6;rom( 471)<=6;rom( 472)<=15; rom(473)<=14;rom(474)<=13;rom(475)<=13;rom(476)<=10; rom(477)<=9;rom(478)<=10;rom(479)<=0;rom(480)<=10;rom(481)<=13;rom(482)<=12;rom(483)<=12;rom(484)<=12; rom(485)<=12;rom(486)<=12;rom(487)<=10;rom(488)<=12; rom(489)<=12;rom(490)<=15;rom(491)<=14;rom(492)<=13; rom(493)<=13;rom(494)<=10;rom(495)<=9;rom(496)<=8;rom(497)<=8;rom(498)<=8;rom(499)<=8;rom(500)<=9;rom(501)<=10;rom(502)<=10;rom(503)<=12;rom(504)<=10; rom(505)<=9;rom(506)<=10;rom(507)<=10;rom(508)<=15; rom(509)<=14;rom(510)<=13;rom(511)<=13;rom(512)<=10; rom(513)<=9;rom(514)<=10;rom(515)<=10;rom(516)<=10; rom(517)<=13;rom(518)<=12;rom(519)<=12;rom(520)<=12; rom(521)<=12;rom(522)<=10;rom(523)<=12;rom(524)<=13; rom(525)<=13;rom(526)<=6;rom(527)<=7;rom(528)<=8;rom(529)<=8;rom(530)<=8;rom(531)<=10;rom(532)<=9;rom(533)<=9;rom(534)<=12;rom(535)<=14;rom(536)<=13; rom(537)<=12;rom(538)<=13;rom(539)<=13;rom(540)<=13; rom(541)<=13;rom(542)<=6;rom(543)<=7;rom(544)<=8;rom(545)<=8;rom(546)<=8;rom(547)<=10;rom(548)<=12;rom(549)<=12;rom(550)<=12;rom(551)<=14;rom(552)<=13; rom(553)<=12;rom(554)<=12;rom(555)<=13;rom(556)<=13; rom(557)<=13;rom(558)<=13;end behav;。