几种音乐电子琴的设计.docx

上传人:b****2 文档编号:669273 上传时间:2023-04-29 格式:DOCX 页数:64 大小:403KB
下载 相关 举报
几种音乐电子琴的设计.docx_第1页
第1页 / 共64页
几种音乐电子琴的设计.docx_第2页
第2页 / 共64页
几种音乐电子琴的设计.docx_第3页
第3页 / 共64页
几种音乐电子琴的设计.docx_第4页
第4页 / 共64页
几种音乐电子琴的设计.docx_第5页
第5页 / 共64页
几种音乐电子琴的设计.docx_第6页
第6页 / 共64页
几种音乐电子琴的设计.docx_第7页
第7页 / 共64页
几种音乐电子琴的设计.docx_第8页
第8页 / 共64页
几种音乐电子琴的设计.docx_第9页
第9页 / 共64页
几种音乐电子琴的设计.docx_第10页
第10页 / 共64页
几种音乐电子琴的设计.docx_第11页
第11页 / 共64页
几种音乐电子琴的设计.docx_第12页
第12页 / 共64页
几种音乐电子琴的设计.docx_第13页
第13页 / 共64页
几种音乐电子琴的设计.docx_第14页
第14页 / 共64页
几种音乐电子琴的设计.docx_第15页
第15页 / 共64页
几种音乐电子琴的设计.docx_第16页
第16页 / 共64页
几种音乐电子琴的设计.docx_第17页
第17页 / 共64页
几种音乐电子琴的设计.docx_第18页
第18页 / 共64页
几种音乐电子琴的设计.docx_第19页
第19页 / 共64页
几种音乐电子琴的设计.docx_第20页
第20页 / 共64页
亲,该文档总共64页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

几种音乐电子琴的设计.docx

《几种音乐电子琴的设计.docx》由会员分享,可在线阅读,更多相关《几种音乐电子琴的设计.docx(64页珍藏版)》请在冰点文库上搜索。

几种音乐电子琴的设计.docx

几种音乐电子琴的设计

音乐电子琴的设计

1.1.1设计要求

●音乐自动播放,存储2首歌,由键控选择播放。

●琴键演奏,含高低16个音符。

●配有随音乐节奏而闪烁变化的LED以及乐谱显示。

音乐电子琴的系统设计框图如图6-29所示。

图6-29音乐电子琴的系统框图

1.1.2设计原理

乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。

而要准确地演奏出一首乐曲,仅仅让扬声器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。

由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个关键因素。

乐曲的12平均率规定:

每2个八度音(如简谱中的中音1与高音1)之间的频率相差1倍。

在2个八度音之间,又可分为12个半音。

另外,音符A(简谱中的低音6)的频率为440Hz,音符B到C之间、E到F之间为半音,其余为全音。

由此可以计算出简谱中从低音l至高音1之间每个音符的频率,如表6-1所示。

音名

频率/Hz

音名

频率/Hz

音名

频率/Hz

低音1

261.6

中音1

523.3

高音1

1045.5

低音2

293.7

中音2

587.3

高音2

1174.7

低音3

329.6

中音3

659.3

高音3

1318.5

低音4

349.2

中音4

698.5

高音4

1391.1

低音5

392

中音5

784

高音5

1568

低音6

440

中音6

880

高音6

1760

低音7

493.9

中音7

987.8

高音7

1975.5

表6-1简谱音名与频率的对应关系

产生各音符所需的频率可用一分频器实现,由于各音符对应的频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。

若分频器时钟频率过低,则由于分频系数过小,四舍五入取整后的误差较大;若时钟频率过高,虽然误差变小,但分频数将变大。

实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取合适的时钟频率。

实际上,只要各个音符间的相对频率关系不变,演奏出的乐曲听起来都不会走调。

音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。

因此,要控制音符的音长,就必须知道乐曲的速度和每个音符所对应的节拍数,本例所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s的话,那么一拍所应该持续的时间为0.25秒,则只需要提供一个4HZ的时钟频率即可产生四分音符的时长。

本例设计的音乐电子琴选取12MHZ的系统时钟频率。

在数控分频器模块,首先对时钟频率进行16分频,得到0.75MHZ的输入频率,然后再次分频得到各音符的频率。

由于数控分频器输出的波形是脉宽极窄的脉冲波,为了更好的驱动扬声器发声,在到达扬声器之前需要均衡占空比,从而生成各音符对应频率的对称方波输出。

这个过程实际上进行了一次二分频,频率变为原来的二分之一即0.375MHZ。

因此,分频系数的计算可以按照下面的方法进行。

以中音1为例,对应的频率值为523.3Hz,它的分频系数应该为:

至于其他音符,同样可由上式求出对应的分频系数,这样利用程序可以很轻松地得到相应的乐声。

表6-2各音名对应的分频系数

音名

频率/Hz

分频系数

音名

频率/Hz

分频系数

低音1

261.6

1433

高音1

1045.5

358

低音2

293.7

1277

高音2

1174.7

319

低音3

329.6

1138

高音3

1318.5

284

低音4

349.2

1074

高音4

1391.1

268

低音5

392

960

高音5

1568

239

低音6

440

853

高音6

1760

213

低音7

493.9

759

高音7

1975.5

190

中音1

523.3

716

中音2

587.3

638

至于音长的控制,在自动演奏模块,每个乐曲的音符是按地址存放的,播放乐曲时按4HZ的时钟频率依次读取简谱,每个音符持续时间为0.25秒。

如果乐谱中某个音符为三拍音长,那又该如何控制呢?

其实只要在3个连续地址存放该音符,这时就会发三个0.25秒的音长,即持续了三拍的时间,通过这样一个简单的操作就可以控制音长了。

1.1.3设计模块

本系统主要由三个功能模块组成:

music.vhd、tone.vhd和speaker.vhd。

系统顶层设计原理图如图6-30所示,该系统有4个输入,3个输出端口。

图6-30系统顶层设计原理图

【输入端口】:

●CLK:

12MHZ系统时钟输入端口。

●handTOauto:

电子琴模式控制端口,高电平1时是按键弹奏模式,低电平0时是播放预存储的歌曲。

●Tonekey:

电子琴音符输入端口。

●Sel:

播放模式下,乐曲选择控制端口。

【输出端口】:

●Led:

音符简码输出LED显示端口。

●SPKS:

乐曲的声音输出端口,输出的是对应各音符频率的方波信号。

●HIGH1:

音符高音指示端口。

1.自动演奏模块

自动演奏模块可以自动播放电子琴内置乐曲,按节拍读取内置乐谱。

在弹奏模式下,是将键盘输入的音符信号输出。

因此,本模块是向Tone模块提供音符信息。

图6-31自动演奏模块

2.音阶发生器模块

本模块根据music模块提供的音符,完成音符到音符的分频系数,音符的显示,高低音阶的译码。

图6-32音阶发生器

3.数控分频模块

根据音阶发生器Tone提供的分频系数产生对应的发音频率,实现乐曲播放。

图6-33数控分频器

1.1.4程序实现

1.音阶发生器的VHDL程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYTONEIS

PORT(INDEX:

INSTD_LOGIC_VECTOR(15DOWNTO0);--音符输入信号

TUNE_SEG:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);--音符显示信号

HIGH:

OUTSTD_LOGIC;--高低音显示信号

TONE0:

OUTINTEGERRANGE0TO2047);--音符的分频系数

ENDTONE;

ARCHITECTUREBEHAVIORALOFTONEIS

BEGIN

SEARCH:

PROCESS(INDEX)--此进程完成音符到音符的分频系数译码,音符的显示,高低音阶

BEGIN

CASEINDEXIS

WHEN"0000000000000001"=>TONE0<=1433;TUNE_SEG<="0000110";HIGH<='0';

WHEN"0000000000000010"=>TONE0<=1277;TUNE_SEG<="1011011";HIGH<='0';

WHEN"0000000000000100"=>TONE0<=1138;TUNE_SEG<="1001111";HIGH<='0';

WHEN"0000000000001000"=>TONE0<=1074;TUNE_SEG<="1100110";HIGH<='0';

WHEN"0000000000010000"=>TONE0<=960;TUNE_SEG<="1101101";HIGH<='0';

WHEN"0000000000100000"=>TONE0<=853;TUNE_SEG<="1111101";HIGH<='0';

WHEN"0000000001000000"=>TONE0<=759;TUNE_SEG<="0000111";HIGH<='0';

WHEN"0000000010000000"=>TONE0<=716;TUNE_SEG<="0000110";HIGH<='1';

WHEN"0000000100000000"=>TONE0<=358;TUNE_SEG<="0000110";HIGH<='1';

WHEN"0000001000000000"=>TONE0<=319;TUNE_SEG<="1011011";HIGH<='1';

WHEN"0000010000000000"=>TONE0<=284;TUNE_SEG<="1001111";HIGH<='1';

WHEN"0000100000000000"=>TONE0<=268;TUNE_SEG<="1100110";HIGH<='1';

WHEN"0001000000000000"=>TONE0<=239;TUNE_SEG<="1101101";HIGH<='1';

WHEN"0010000000000000"=>TONE0<=213;TUNE_SEG<="1111101";HIGH<='1';

WHEN"0100000000000000"=>TONE0<=190;TUNE_SEG<="0000111";HIGH<='1';

WHEN"1000000000000000"=>TONE0<=638;TUNE_SEG<="1011011";HIGH<='1';

WHENOTHERS=>TONE0<=0;TUNE_SEG<="0000000";HIGH<='0';

ENDCASE;

ENDPROCESS;

ENDBEHAVIORAL;

【程序说明】

●音符输入信号INDEX是16位矢量,它既可以是键盘弹奏输入,也可以是预存储的音符数据。

INDEX的取值分别代表了16个高低音符,对应关系如下表。

表6-3INDEX值对应的音符和分频系数

INDEX值

对应音符

分频系数

0000000000000001

低音1

1433

0000000000000010

低音2

1277

0000000000000100

低音3

1138

0000000000001000

低音4

1074

0000000000010000

低音5

960

0000000000100000

低音6

853

0000000001000000

低音7

759

0000000010000000

中音1

716

0000000100000000

高音1

358

0000001000000000

高音2

319

0000010000000000

高音3

284

0000100000000000

高音4

268

0001000000000000

高音5

239

0010000000000000

高音6

213

010*********

高音7

190

1000000000000000

中音2

638

●进程SEARCH完成音符到音符的分频系数译码,音符的显示,高低音阶

音阶发生器的仿真波形如图6-34所示。

图6-34音阶发生器的仿真波形

由仿真图可以验证各音符的分频系数、高低音以及7段显示代码。

2.数控分频器的VHDL程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYSPEAKERIS

PORT(CLK1:

INSTD_LOGIC;--系统时钟12MHZ

TONE1:

ININTEGERRANGE0TO2047;--音符分频系数

SPKS:

OUTSTD_LOGIC);--驱动扬声器的音频信号

ENDSPEAKER;

ARCHITECTUREBEHAVIORALOFSPEAKERIS

SIGNALPRECLK,FULLSPKS:

STD_LOGIC;

BEGIN

P1:

PROCESS(CLK1)--此进程对系统时钟进行16分频

VARIABLECOUNT:

INTEGERRANGE0TO16;

BEGIN

IFCLK1'EVENTANDCLK1='1'THENCOUNT:

=COUNT+1;

IFCOUNT=8THENPRECLK<='1';

ELSIFCOUNT=16THENPRECLK<='0';COUNT:

=0;

ENDIF;

ENDIF;

ENDPROCESSP1;

P2:

PROCESS(PRECLK,TONE1)--对0.75MHZ的脉冲再次分频,得到所需要的音符频率

VARIABLECOUNT11:

INTEGERRANGE0TO2047;

BEGIN

IFPRECLK'EVENTANDPRECLK='1'THEN

IFCOUNT11

=COUNT11+1;FULLSPKS<='0';

ELSECOUNT11:

=0;FULLSPKS<='1';

ENDIF;

ENDIF;

ENDPROCESSP2;

P3:

PROCESS(FULLSPKS)--此进程对FULLSPKS进行2分频

VARIABLECOUNT2:

STD_LOGIC:

='0';

BEGIN

IFFULLSPKS'EVENTANDFULLSPKS='1'THENCOUNT2:

=NOTCOUNT2;

IFCOUNT2='1'THENSPKS<='1';

ELSESPKS<='0';

ENDIF;

ENDIF;

ENDPROCESSP3;

ENDBEHAVIORAL;

【程序说明】

●进程P1对系统时钟CLK1进行16分频得到0.75MHZ的时钟信号PRECLK。

●进程P2实现分频功能,按照TONE1输入的分频系数对0.75MHZ的脉冲再次分频,得到所需要的音符频率。

●由于数控分频器输出的波形是脉宽极窄的脉冲波,为了更好的驱动扬声器发声,需要均衡占空比,从而生成各音符对应频率的对称方波输出。

进程P3对FULLSPKS信号进行了一次二分频,输出的SPKS信号频率变为FULLSPKS的二分之一。

数控分频器的仿真波形如图6-35所示。

图6-35数控分频器的仿真波形

图中TONE1输入的分频系数为1433(低音1)和213(高音6),SPKS仿真输出了各音符的频率波形。

由仿真图也可以看出,FULLSPKS是脉宽极窄的脉冲波,SPKS信号频率是FULLSPKS的二分之一,的确是进行了二分频。

3.自动演奏模块的VHDL程序

自动演奏模块可以实现自动播放电子琴内置乐曲,本例内置了2首乐曲,两只老虎(laohu.vhd)和字母歌(abc.vhd),由键控sel选择播放。

在弹奏模式下,是将键盘输入的音符信号输出。

【程序说明】:

由2选1的数据选择器实现内置歌曲的选择播放,该模块包含3个元件,采用元件例化语句实现,非常方便。

--自动演奏模块程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYMUSICIS

PORT(CLK:

INSTD_LOGIC;

HANDTOAUTO:

INSTD_LOGIC;

TONEKEY:

INSTD_LOGIC_VECTOR(15DOWNTO0);

SEL:

INSTD_LOGIC;

TONE_KEY_0:

OUTSTD_LOGIC_VECTOR(15DOWNTO0));

ENDMUSIC;

ARCHITECTUREBEHAVIORALOFMUSICIS

COMPONENTLAOHU

PORT(CLK:

INSTD_LOGIC;

AUTO:

INSTD_LOGIC;

TONE_KEY2:

INSTD_LOGIC_VECTOR(15DOWNTO0);

TONE_KEY_0:

OUTSTD_LOGIC_VECTOR(15DOWNTO0));

ENDCOMPONENT;

COMPONENTABC

PORT(CLK:

INSTD_LOGIC;

AUTO:

INSTD_LOGIC;

TONE_KEY2:

INSTD_LOGIC_VECTOR(15DOWNTO0);

TONE_KEY_0:

OUTSTD_LOGIC_VECTOR(15DOWNTO0));

ENDCOMPONENT;

COMPONENTMUX21

PORT(A,B:

INSTD_LOGIC_VECTOR(15DOWNTO0);

S:

INSTD_LOGIC;

Y:

OUTSTD_LOGIC_VECTOR(15DOWNTO0));

ENDCOMPONENT;

SIGNALS1,S2:

STD_LOGIC_VECTOR(15DOWNTO0);

BEGIN

U0:

LAOHUPORTMAP(CLK=>CLK,TONE_KEY2=>TONEKEY,TONE_KEY_0=>S1,AUTO=>HANDTOAUTO);

U1:

ABCPORTMAP(CLK=>CLK,TONE_KEY2=>TONEKEY,TONE_KEY_0=>S2,AUTO=>HANDTOAUTO);

U2:

MUX21PORTMAP(A=>S1,B=>S2,S=>SEL,Y=>TONE_KEY_0);

ENDBEHAVIORAL;

【程序说明】

●进程P1对12MHZ系统时钟进行3000000的分频,得到4HZ的时钟信号CLK2。

CLK2一个周期是0.25s,1/4拍。

●进程P2完成自动演奏部分乐曲的地址累加,实现乐曲音符的逐个播放。

●在进程P3中,Auto为低电平0时,电子琴是演奏模式,播放预存储的乐曲。

因此,在Case语句部分实现自动演奏乐曲的存储。

Auto为高电平1时,电子琴是弹奏模式,将键盘输入的音符信号输出。

--乐曲(两只老虎LAOHU.VHD)

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYLAOHUIS

PORT(CLK,AUTO:

INSTD_LOGIC;--系统时钟;键盘输入/自动演奏

TONE_KEY2:

INSTD_LOGIC_VECTOR(15DOWNTO0);--键盘输入信号

TONE_KEY_0:

OUTSTD_LOGIC_VECTOR(15DOWNTO0));--音符信号输出

ENDLAOHU;

ARCHITECTUREBEHAVIORALOFLAOHUIS

SIGNALCOUNT0:

INTEGERRANGE0TO31;--CHANGE

SIGNALCLK2:

STD_LOGIC;

BEGIN

P1:

PROCESS(CLK,AUTO)--对12MHZ系统时钟进行3M的分频,得到4HZ的信号CLK2

VARIABLECOUNT:

INTEGERRANGE0TO3000000;

BEGIN

IFAUTO='1'THENCOUNT:

=0;CLK2<='0';

ELSIFCLK'EVENTANDCLK='1'THENCOUNT:

=COUNT+1;

IFCOUNT=1500000THENCLK2<='1';

ELSIFCOUNT=3000000THENCLK2<='0';COUNT:

=0;

ENDIF;

ENDIF;

ENDPROCESSP1;

P2:

PROCESS(CLK2)--此进程完成自动演奏部分乐曲的地址累加

BEGIN

IFCLK2'EVENTANDCLK2='1'THEN

IFCOUNT0=31THENCOUNT0<=0;

ELSECOUNT0<=COUNT0+1;

ENDIF;

ENDIF;

ENDPROCESSP2;

P3:

PROCESS(COUNT0,AUTO,TONE_KEY2)

BEGIN

IFAUTO='0'THEN

CASECOUNT0IS--此CASE语句:

存储自动演奏部分的乐曲

WHEN0=>TONE_KEY_0<=B"00000001_00000000";--1

WHEN1=>TONE_KEY_0<=B"00000010_00000000";--2

WHEN2=>TONE_KEY_0<=B"00000100_00000000";--3

WHEN3=>TONE_KEY_0<=B"00000001_00000000";--1

WHEN4=>TONE_KEY_0<=B"00000001_00000000";--1

WHEN5=>TONE_KEY_0<=B"00000010_00000000";--2

WHEN6=>TONE_KEY_0<=B"00000100_00000000";--3

WHEN7=>TONE_KEY_0<=B"00000001_00000000";--1

WHEN8=>TONE_KEY_0<=B"00000100_00000000";--3

WHEN9=>TONE_KEY_0<=B"00001000_00000000";--4

WHEN10=>TONE_KEY_0<=B"00010000_00000000";--5

WHEN11=>TONE_KEY_0<=B"00000100_00000000";--3

WHEN12=>TONE_KEY_0<=B"00001000_00000000";--4

WHEN13=>TONE_KEY_0<=B"00010000_00000000";--5

WHEN14=>TONE_KEY_0<=B"00010000_00000000";--5

WHEN15=>TONE_KEY_0<=B"00100000_00000000";--6

WHEN16=>TONE_KEY_0<=B"00010000_00000000";--5

WHEN17=>TONE_KEY_0<=B"00001000_00000000";--4

WHEN18=>TONE_KEY_0<=B"00000100_00000000";--3

WHEN19=>TONE_KEY_0<=B"00000001_00000000";--1

WHEN20=>TONE_KEY_0<=B"00010000_00000000";--5

WHEN21=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2