问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

单片机MIDI音乐播放原理详解及代码示例

创作时间:
2025-03-16 05:51:00
作者:
@小白创作中心

单片机MIDI音乐播放原理详解及代码示例

引用
CSDN
1.
https://blog.csdn.net/liwangsb2/article/details/145886941

本文将详细介绍如何在单片机中实现MIDI音乐播放功能,包括MIDI的基本概念、音符频率对照表、音乐数据编码方法以及播放核心代码的实现。

一、什么是MIDI?

MIDI(Musical Instrument Digital Interface)是电子乐器间的数字通信协议,在单片机中可通过以下要素模拟实现:

  • 音符数字编码:用数字代替具体音高(如60代表中音C)
  • 持续时间控制:通过定时器设定音符长度
  • 多通道支持:通过PWM同时产生多个音调(需高级单片机)

二、C调音符频率对照表(完整版)

音符
低音组(Hz)
中音组(Hz)
高音组(Hz)
1
262 (C4)
523 (C5)
1047 (C6)
2
294 (D4)
587 (D5)
1175 (D6)
3
330 (E4)
659 (E5)
1319 (E6)
4
349 (F4)
698 (F5)
1397 (F6)
5
392 (G4)
784 (G5)
1568 (G6)
6
440 (A4)
880 (A5)
1760 (A6)
7
494 (B4)
988 (B5)
1976 (B6)

三、MIDI音乐播放实例

1. 音乐数据编码

// 数组结构:[频率, 持续时间(ms)]交替存储
u16 music1[78]={ //音乐1的数据表(奇数是音调,偶数是长度)
330,750,
440,375,
494,375,
523,750,
587,375,
659,375,
587,750,
494,375,
392,375,
440,1500,
330,750,
440,375,
494,375,
523,750,
587,375,
659,375,
587,750,
494,375,
392,375,
784,1500,
659,750,
698,375,
784,375,
880,750,
784,375,
698,375,
659,750,
587,750,
659,750,
523,375,
494,375,
440,750,
440,375,
494,375,
523,750,
523,750,
494,750,
392,750,
440,3000
};

2. 播放核心代码解析

void MIDI_PLAY(void) {
  u16 i, e;
  for(i=0; i<39; i++) { // 遍历39个音符
    
    // music1[i*2]:当前音符频率
    // music1[i*2+1]:当前音符持续时间
    
    for(e=0; e < (music1[i*2] * music1[i*2+1])/1000; e++) {
      /* 方波生成:500000us(0.5秒)/频率 = 单个周期时长 */
      GPIO_WriteBit(BUZZERPORT, BUZZER,(BitAction)(0)); // 输出低电平
      delay_us(500000/music1[i*2]);         // 半周期延时
      
      GPIO_WriteBit(BUZZERPORT, BUZZER,(BitAction)(1)); // 输出高电平
      delay_us(500000/music1[i*2]);         // 另一半周期
    }
  }
}

3. 关键参数说明

  • 频率计算
    500000/music1[i*2]
    推导过程
    周期T(μs)=1,000,000/频率 → 半周期=500,000/频率

  • 循环次数
    (频率×持续时间)/1000
    确保总时长精确
    例:440Hz音符播放500ms时:
    循环次数=(440×500)/1000=220次

四、优化技巧

  1. 硬件定时器替代delay_us:使用PWM输出方波
  2. 中断控制:TIM_IT_Update中断切换电平
  3. 动态BPM调整:添加全局速度系数变量
float speed_ratio = 1.0; // 速度调节系数
delay_us((int)(500000/music1[i*2] * speed_ratio));


图1:无源蜂鸣器驱动电路原理图


图2:方波周期与频率的对应关系示意图

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号