虫虫首页| 资源下载| 资源专辑| 精品软件
登录| 注册

t-T

  • 单片机音乐中音调和节拍的确定方法

    单片机音乐中音调和节拍的确定方法:调号-音乐上指用以确定乐曲主音高度的符号。很明显一个八度就有12个半音。A、B、C、D、E、F、G。经过声学家的研究,全世界都用这些字母来表示固定的音高。比如,A这个音,标准的音高为每秒钟振动440周。 升C调:1=#C,也就是降D调:1=BD;277(频率)升D调:1=#D,也就是降E调:1=BE;311升F调:1=#F,也就是降G调:1=BG;369升G调:1=#G,也就是降A调:1=BA;415升A调:1=#A,也就是降B调:1=BB。466,C 262   #C277   D 294   #D(bE)311  E 330   F 349   #F369   G 392  #G415A 440.    #A466    B 494 所谓1=A,就是说,这首歌曲的“导”要唱得同A一样高,人们也把这首歌曲叫做A调歌曲,或叫“唱A调”。1=C,就是说,这首歌曲的“导”要唱得同C一样高,或者说“这歌曲唱C调”。同样是“导”,不同的调唱起来的高低是不一样的。各调的对应的标准频率为: 单片机演奏音乐时音调和节拍的确定方法 经常看到一些刚学单片机的朋友对单片机演奏音乐比较有兴趣,本人也曾是这样。在此,本人将就这方面的知识做一些简介,但愿能对单片机演奏音乐比较有兴趣而又不知其解的朋友能有所启迪。 一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。 在音乐中所谓“音调”,其实就是我们常说的“音高”。在音乐中常把中央C上方的A音定为标准音高,其频率f=440Hz。当两个声音信号的频率相差一倍时,也即f2=2f1时,则称f2比f1高一个倍频程, 在音乐中1(do)与 ,2(来)与 ……正好相差一个倍频程,在音乐学中称它相差一个八度音。在一个八度音内,有12个半音。以1—i八音区为例, 12个半音是:1—#1、#1—2、2—#2、#2—3、3—4、4—#4,#4—5、5一#5、#5—6、6—#6、#6—7、7—i。这12个音阶的分度基本上是以对数关系来划分的。如果我们只要知道了这十二个音符的音高,也就是其基本音调的频率,我们就可根据倍频程的关系得到其他音符基本音调的频率。 知道了一个音符的频率后,怎样让单片机发出相应频率的声音呢?一般说来,常采用的方法就是通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,我们只需将定时器予置不同的定时值就可实现。那么怎样确定一个频率所对应的定时器的定时值呢?以标准音高A为例:   A的频率f = 440 Hz,其对应的周期为:T = 1/ f = 1/440 =2272μs 由上图可知,单片机上对应蜂鸣器的I/O口来回取反的时间应为:t = T/2 = 2272/2 = 1136μs这个时间t也就是单片机上定时器应有的中断触发时间。一般情况下,单片机奏乐时,其定时器为工作方式1,它以振荡器的十二分频信号为计数脉冲。设振荡器频率为f0,则定时器的予置初值由下式来确定:    t = 12 *(TALL – THL)/ f0 式中TALL = 216 = 65536,THL为定时器待确定的计数初值。因此定时器的高低计数器的初值为:     TH = THL / 256 = ( TALL – t* f0/12) / 256    TL = THL % 256 = ( TALL – t* f0/12) %256  将t=1136μs代入上面两式(注意:计算时应将时间和频率的单位换算一致),即可求出标准音高A在单片机晶振频率f0=12Mhz,定时器在工作方式1下的定时器高低计数器的予置初值为 :    TH440Hz = (65536 – 1136 * 12/12) /256 = FBH    TL440Hz = (65536 – 1136 * 12/12)%256 = 90H根据上面的求解方法,我们就可求出其他音调相应的计数器的予置初值。 音符的节拍我们可以举例来说明。在一张乐谱中,我们经常会看到这样的表达式,如1=C  、1=G …… 等等,这里1=C,1=G表示乐谱的曲调,和我们前面所谈的音调有很大的关联, 、 就是用来表示节拍的。以 为例加以说明,它表示乐谱中以四分音符为节拍,每一小结有三拍。比如:      其中1 、2 为一拍,3、4、5为一拍,6为一拍共三拍。1 、2的时长为四分音符的一半,即为八分音符长,3、4的时长为八分音符的一半,即为十六分音符长,5的时长为四分音符的一半,即为八分音符长,6的时长为四分音符长。那么一拍到底该唱多长呢?一般说来,如果乐曲没有特殊说明,一拍的时长大约为400—500ms 。我们以一拍的时长为400ms为例,则当以四分音符为节拍时,四分音符的时长就为400ms,八分音符的时长就为200ms,十六分音符的时长就为100ms。可见,在单片机上控制一个音符唱多长可采用循环延时的方法来实现。首先,我们确定一个基本时长的延时程序,比如说以十六分音符的时长为基本延时时间,那么,对于一个音符,如果它为十六分音符,则只需调用一次延时程序,如果它为八分音符,则只需调用二次延时程序,如果它为四分音符,则只需调用四次延时程序,依次类推。通过上面关于一个音符音调和节拍的确定方法,我们就可以在单片机上实现演奏音乐了。具体的实现方法为:将乐谱中的每个音符的音调及节拍变换成相应的音调参数和节拍参数,将他们做成数据表格,存放在存储器中,通过程序取出一个音符的相关参数,播放该音符,该音符唱完后,接着取出下一个音符的相关参数……,如此直到播放完毕最后一个音符,根据需要也可循环不停地播放整个乐曲。另外,对于乐曲中的休止符,一般将其音调参数设为FFH,FFH,其节拍参数与其他音符的节拍参数确定方法一致,乐曲结束用节拍参数为00H来表示。下面给出部分音符(三个八度音)的频率以及以单片机晶振频率f0=12Mhz,定时器在工作方式1下的定时器高低计数器的予置初值 : C调音符  频率Hz 262 277 293 311 329 349 370 392 415 440 466 494TH/TL F88B F8F2 F95B F9B7 FA14 FA66 FAB9 FB03 FB4A FB8F FBCF FC0BC调音符 1 1# 2 2# 3 4 4# 5 5# 6 6# 7频率Hz 523 553 586 621 658 697 739 783 830 879 931 987TH/TL FC43 FC78 FCAB FCDB FD08 FD33 FD5B FD81 FDA5 FDC7 FDE7 FE05C调音符  频率Hz 1045 1106 1171 1241 1316 1393 1476 1563 1658 1755 1860 1971TH/TL FB21 FE3C FE55 FE6D FE84 FE99 FEAD FEC0 FE02 FEE3 FEF3 FF02

    标签: 单片机 音调

    上传时间: 2013-10-20

    上传用户:哈哈haha

  • PLC和变频器在烟支输送存储系统中的应用

    介绍了以PLC为控制单元,变频器为执行单元的控制系统及其在烟支输送储存系统中的应用,并给出了系统的组成、硬件的配置及具体的实现方法。关键词 : PLC 变频器输送储存系统 Ab str ac t;T hisp aperi ntroducest hec ontrols ystem whichc onsistso fP LCa ndf requencyc onvertera ndi ts application in the buffer conveyor for cigarettes. The system constitute, hardware disposal and realization method are also presented in detail.Keywords:PLC f requencyc onverter b ufferc onveyor

    标签: PLC 变频器 中的应用 存储系统

    上传时间: 2013-10-22

    上传用户:ouyang426

  • 传真通信国家标准

    传真通信国家标准,相当于ITU - T T.30协议。文件传真三类机在电话网中的互通技术条件 第2部分:在公用电话交换网上的文件传真传输规程

    标签: 传真通信 国家标准

    上传时间: 2013-12-18

    上传用户:txfyddz

  • 工程计算MATLAB code to calculate the reorthogonalized sine tapers input: N = the length of the time se

    工程计算MATLAB code to calculate the reorthogonalized sine tapers input: N = the length of the time series data to be tapered p = the number of tapers requested I = the gap structure a vector of length N I(t) = 1 if there is data at time t, t=1, ..., N I(t) = 0 if there is a gap at time t output: X = N-by-p vector of the reorthogonalized sine taper

    标签: the reorthogonalized calculate MATLAB

    上传时间: 2013-12-17

    上传用户:wangyi39

  • 【目的】 设计一个算符优先分析器

    【目的】 设计一个算符优先分析器,理解优先分析方法的原理。 【要求】 使用算符优先分析算法分析下面的文法: E’ → #E# E → E+T | T T → T*F | F F → P^F | P P → (E) | i 其中i可以看作是一个终结符,无需作词法分析。具体要求如下: 1. 如果输入符号串为正确句子,显示分析步骤,包括分析栈中的内容、优先关系、输入符号串的变化情况; 2. 如果输入符号串不是正确句子,则指示出错位置。

    标签: 分析器

    上传时间: 2017-01-03

    上传用户:cmc_68289287

  • 一个基于GTK+的单词数值计算器

    一个基于GTK+的单词数值计算器,1、 按照规则计算单词的值,如果 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 26个字母(全部用大写)的值分别为 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26,如: WINJACK这个单词的值就为:W+I+N+J+A+C+K=23+9+14+1+3+11=71% HARDWORK=H+A+R+D+W+O+R+D=8+1+18+4+23+15+18+11=98% LOVE=L+O+V+E=12+15+22+5=54% LUCK=L+U+C+K=12+21+3+11=47% ATTITUDE= A+T+T+I+T+U+D+E=1+20+20+9+20+24+4+5=100% 2、对程序的界面布局参考如下图所示,在第一个单行文本框输入一个单词,点击“计算”按钮,按照以上算法计算出该单词的值。 3、如果在最下面的单行文本框输入一个文件路径,此文件每行记录一个单词,那么经过程序计算出各个单词的值,并把结果输出到当前目录下result.txt文件中。如果文件不存在,应该提示错误。

    标签: GTK 数值 计算器

    上传时间: 2014-01-11

    上传用户:康郎

  • 开源路由器的研究

    本论文研究了开源路由器的实现方法,通过具体的实验在X O R P 上实现了R I P , O S P F , B G P 等一系列协议,在P A C K E T T R A C E R 上进行了仿真,并对开源路由器进行了性能评价。

    标签: 开源路由器

    上传时间: 2015-02-21

    上传用户:13666909595

  • 开源路由器的实现方法

    本论文研究了开源路由器的实现方法,通过具体的实验在X O R P 上实现了R I P , O S P F , B G P 等一系列协议,在P A C K E T T R A C E R 上进行了仿真,并对开源路由器进行了性能评价。

    标签: 开源路由器

    上传时间: 2015-02-21

    上传用户:13666909595

  • 2013遗传算法工具箱

    % 生成训练样本集 clear all; clc; P=[110 0.807 240 0.2 15 1 18 2 1.5; 110 2.865 240 0.1 15 2 12 1 2; 110 2.59 240 0.1 12 4 24 1 1.5; 220 0.6 240 0.3 12 3 18 2 1; 220 3 240 0.3 25 3 21 1 1.5; 110 1.562 240 0.3 15 3 18 1 1.5; 110 0.547 240 0.3 15 1 9 2 1.5]; 0 1.318 300 0.1 15 2 18 1 2]; T=[54248 162787 168380 314797; 28614 63958 69637 82898; 86002 402710 644415 328084; 230802 445102 362823 335913; 60257 127892 76753 73541; 34615 93532 80762 110049; 56783 172907 164548 144040]; @907 117437 120368 130179]; m=max(max(P)); n=max(max(T)); P=P'/m; T=T'/n; %-------------------------------------------------------------------------% pr(1:9,1)=0; %输入矢量的取值范围矩阵 pr(1:9,2)=1; bpnet=newff(pr,[12 4],{'logsig', 'logsig'}, 'traingdx', 'learngdm'); %建立BP神经网络, 12个隐层神经元,4个输出神经元 %tranferFcn属性 'logsig' 隐层采用Sigmoid传输函数 %tranferFcn属性 'logsig' 输出层采用Sigmoid传输函数 %trainFcn属性 'traingdx' 自适应调整学习速率附加动量因子梯度下降反向传播算法训练函数 %learn属性 'learngdm' 附加动量因子的梯度下降学习函数  net.trainParam.epochs=1000;%允许最大训练步数2000步 net.trainParam.goal=0.001; %训练目标最小误差0.001 net.trainParam.show=10; %每间隔100步显示一次训练结果 net.trainParam.lr=0.05; %学习速率0.05 bpnet=train(bpnet,P,T); %------------------------------------------------------------------------- p=[110 1.318 300 0.1 15 2 18 1 2]; p=p'/m; r=sim(bpnet,p); R=r'*n; display(R);

    标签: 2013 算法 工具箱

    上传时间: 2016-05-28

    上传用户:shanqiu

  • 运动会源代码

    #include <malloc.h>       #include <stdio.h>       #include <stdlib.h>       #include <string.h>       #define NULL 0      #define MaxSize 30          typedef struct athletestruct /*运动员*/     {         char name[20];          int score; /*分数*/         int range; /**/         int item; /*项目*/     }ATH;     typedef struct schoolstruct /*学校*/     {         int count; /*编号*/         int serial; /**/          int menscore; /*男选手分数*/         int womenscore; /*女选手分数*/         int totalscore; /*总分*/         ATH athlete[MaxSize]; /**/         struct schoolstruct *next;      }SCH;         int nsc,msp,wsp;      int ntsp;      int i,j;      int overgame;      int serial,range;      int n;      SCH *head,*pfirst,*psecond;      int *phead=NULL,*pafirst=NULL,*pasecond=NULL;     void create();         void input ()     {         char answer;          head = (SCH *)malloc(sizeof(SCH)); /**/         head->next = NULL;         pfirst = head;          answer = 'y';         while ( answer == 'y' )         {         Is_Game_DoMain:         printf("\nGET Top 5 when odd\nGET Top 3 when even");         printf("\n输入运动项目序号 (x<=%d):",ntsp);         scanf("%d",pafirst);         overgame = *pafirst;         if ( pafirst != phead )         {             for ( pasecond = phead ; pasecond < pafirst ; pasecond ++ )             {                 if ( overgame == *pasecond )                 {                     printf("\n这个项目已经存在请选择其他的数字\n");                     goto Is_Game_DoMain;                 }             }         }         pafirst = pafirst + 1;         if ( overgame > ntsp )         {             printf("\n项目不存在");             printf("\n请重新输入");             goto Is_Game_DoMain;         }         switch ( overgame%2 )         {         case 0: n = 3;break;         case 1: n = 5;break;         }         for ( i = 1 ; i <= n ; i++ )         {         Is_Serial_DoMain:         printf("\n输入序号 of the NO.%d (0<x<=%d): ",i,nsc);                 scanf("%d",&serial);         if ( serial > nsc )          {             printf("\n超过学校数目,请重新输入");             goto Is_Serial_DoMain;         }         if ( head->next == NULL )          {             create();         }         psecond = head->next ;          while ( psecond != NULL )          {             if ( psecond->serial == serial )             {                 pfirst = psecond;                 pfirst->count = pfirst->count + 1;                 goto Store_Data;             }             else             {                 psecond = psecond->next;             }         }         create();         Store_Data:                 pfirst->athlete[pfirst->count].item = overgame;         pfirst->athlete[pfirst->count].range = i;         pfirst->serial = serial;         printf("Input name:) : ");                 scanf("%s",pfirst->athlete[pfirst->count].name);         }         printf("\n继续输入运动项目(y&n)?");         answer = getchar();         printf("\n");         }     }         void calculate() /**/     {         pfirst = head->next;         while ( pfirst->next != NULL )         {             for (i=1;i<=pfirst->count;i++)             {                 if ( pfirst->athlete[i].item % 2 == 0 )                  {                     switch (pfirst->athlete[i].range)                     {                     case 1:pfirst->athlete[i].score = 5;break;                     case 2:pfirst->athlete[i].score = 3;break;                     case 3:pfirst->athlete[i].score = 2;break;                     }                 }                 else                  {                     switch (pfirst->athlete[i].range)                     {                     case 1:pfirst->athlete[i].score = 7;break;                     case 2:pfirst->athlete[i].score = 5;break;                     case 3:pfirst->athlete[i].score = 3;break;                     case 4:pfirst->athlete[i].score = 2;break;                     case 5:pfirst->athlete[i].score = 1;break;                     }                 }                 if ( pfirst->athlete[i].item <=msp )                  {                     pfirst->menscore = pfirst->menscore + pfirst->athlete[i].score;                 }                 else                  {                     pfirst->womenscore = pfirst->womenscore + pfirst->athlete[i].score;                 }             }             pfirst->totalscore = pfirst->menscore + pfirst->womenscore;             pfirst = pfirst->next;         }     }         void output()     {         pfirst = head->next;         psecond = head->next;         while ( pfirst->next != NULL )          {             // clrscr();              printf("\n第%d号学校的结果成绩:",pfirst->serial);             printf("\n\n项目的数目\t学校的名字\t分数");             for (i=1;i<=ntsp;i++)              {                 for (j=1;j<=pfirst->count;j++)                  {                     if ( pfirst->athlete[j].item == i )                     {                                                                         printf("\n %d\t\t\t\t\t\t%s\n %d",i,pfirst->athlete[j].name,pfirst->athlete[j].score);break;                                             }                 }             }             printf("\n\n\n\t\t\t\t\t\t按任意建 进入下一页");             getchar();             pfirst = pfirst->next;         }     //  clrscr();          printf("\n运动会结果:\n\n学校编号\t男运动员成绩\t女运动员成绩\t总分");         pfirst = head->next;         while ( pfirst->next != NULL )         {             printf("\n %d\t\t %d\t\t %d\t\t %d",pfirst->serial,pfirst->menscore,pfirst->womenscore,pfirst->totalscore);             pfirst = pfirst->next;         }         printf("\n\n\n\t\t\t\t\t\t\t按任意建结束");         getchar();     }         void create()     {                 pfirst = (struct schoolstruct *)malloc(sizeof(struct schoolstruct));         pfirst->next = head->next ;         head->next = pfirst ;                 pfirst->count = 1;         pfirst->menscore = 0;         pfirst->womenscore = 0;         pfirst->totalscore = 0;     }     void Save()     {FILE *fp;     if((fp = fopen("school.dat","wb"))==NULL)     {printf("can't open school.dat\n");     fclose(fp);     return;     }     fwrite(pfirst,sizeof(SCH),10,fp);     fclose(fp);     printf("文件已经成功保存\n");     }         void main()     {         system("cls");         printf("\n\t\t\t 运动会分数统计\n");         printf("输入学校数目 (x>= 5):");         scanf("%d",&nsc);          printf("输入男选手的项目(x<=20):");         scanf("%d",&msp);          printf("输入女选手项目(<=20):");         scanf("%d",&wsp);          ntsp = msp + wsp;                  phead = (int *)calloc(ntsp,sizeof(int));         pafirst = phead;         pasecond = phead;         input();         calculate();          output();         Save();     }             

    标签: 源代码

    上传时间: 2016-12-28

    上传用户:150501