如何将曲谱的各音符转换成频率数组和持续时间

乐曲中不同的音符实质上表示的是不同频率的声音。

 在单片机中要发出不同频率的声音,只要产生不同频率的脉冲信号,再通过喇叭等播放出来即可。又由于方波容易用定时器产生,故一般单片机使用方波脉冲。


关于Win32 API的发音函数Beep,很多人不知道怎么把音频文件的曲谱转换成频率数组和持续时间,在这我给出两个方法。

方法一,对于一个音频文件,我们可以先获取到它的曲谱,再去根据曲谱去查各音调的频率套公式得到持续时间;

方法二,可以利用cooledit等软件分析音频文件的频谱;


附表:

音符与频率对应表

(“#”表示半音,用于上升或下降半个音)

表9.1  C调各音符频率与计数值T的对照表


音符   频率(Hz) 简谱码T值    

低1DO  262         63628           
#1DO#  277         63731           
低2RE  294         63835           
#2RE#  311        63928           
低3M   330        64103           
低4FA  349        64103           
#4FA#  370       64260           
低5SO  392       64260           
#5SO#  415      64331            
低6LA  440      64400          
#6       466       64463              
低7SI    494      64524           
中1DO  523     64580        

#1DO#  554  
中2RE  578      FC9F;
#2RE#  622  
中3MI   659     FD09;
中4FA  698     FD34
#4FA#  740
中5SO  784    FD82
#5SO#  831
中6LA  880     FDC8
#6LA#  932
中7SI   988     FE06

 

 节拍

       每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,下表为节拍码的对照。但如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如下表为1/4和1/8节拍的时间设定。   

     
        表9.2  节拍码对照表
1/4节拍 1/8节拍
节拍码 节拍数 节拍码 节拍数
1 1/4拍 1 1/8拍
2 2/4拍 2 1/4拍
3 3/4拍 3 3/8拍
4 1拍 4 1/2拍
5 1又1/4拍 5 5/8拍
6 1又1/2拍 6 3/4拍
7 1又3/4拍 7 7/8拍
8 2拍 8 1拍
9 2又1/4拍 9 1又1/8拍
A 2又1/2拍 A 1又1/4拍
B 2又3/4拍 B 1又3/8拍
C 3拍 C 1又1/2拍
D 3又1/4拍 D 1又5/8拍
E 3又1/2拍 E 1又3/4拍
F 3又3/4拍 F 1又7/8拍

    节拍延时参考:

       曲调            1/4拍的延迟时间             1/8拍的延迟时间
      4/4              125ms                         62ms                                 
      3/4              187ms                         94ms
      2/4              250ms                         125ms




  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
将音乐数据转换为单片机可识别的格式需要经过以下步骤: 1. 找到《天空之城》的 MIDI 文件,或者使用软件将音乐文件转换为 MIDI 格式; 2. 使用 MIDI 编辑器打开 MIDI 文件,查看每个音符的音高和时长; 3. 将每个音符的音高和时长转换为单片机可识别的格式,比如使用数组存储每个音符频率和时长等信息。 下面是一个示例代码,将《天空之城》前几个音符的数据存储在数组中: ```c // 定义音符频率 #define NOTE_C4 262 #define NOTE_D4 294 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_G4 392 #define NOTE_A4 440 #define NOTE_B4 494 // 定义每个音符的时长,以毫秒为单位 #define WHOLE 1600 #define HALF 800 #define QUARTER 400 #define EIGHTH 200 #define SIXTEENTH 100 // 存储音符数据的数组 int notes[] = { NOTE_G4, EIGHTH, NOTE_E4, EIGHTH, NOTE_C4, EIGHTH, NOTE_D4, EIGHTH, NOTE_E4, EIGHTH, NOTE_D4, EIGHTH, NOTE_C4, QUARTER, NOTE_G4, EIGHTH, NOTE_E4, EIGHTH, NOTE_C4, EIGHTH, NOTE_D4, EIGHTH, NOTE_E4, EIGHTH, NOTE_D4, EIGHTH, NOTE_C4, QUARTER, NOTE_E4, EIGHTH, NOTE_G4, EIGHTH, NOTE_A4, EIGHTH, NOTE_G4, EIGHTH, NOTE_E4, EIGHTH, }; // 存储音符数量的变量 int numNotes = 20; ``` 这个数组中存储了《天空之城》前面的一段旋律,每个元素依次表示一个音符频率和时长。例如,第一个元素 `NOTE_G4, EIGHTH` 表示一个 G4 音符,时长为 1/8 拍,即 200 毫秒。 您可以根据 MIDI 文件中的数据,修改这个数组中的值,以便将整个曲子的音符数据存储在数组中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值