Bootstrap

单片机MIDI音乐播放原理详解及代码示例 | 零基础入门STM32第三十二步

主题内容教学目的/扩展视频
MIDI音乐播放程序什么是MIDI,C调音符与频率对照表,编写并下载。对MIDI有初步的认识和印象,知道如何编写。

师从洋桃电子,杜洋老师



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

一、什么是MIDI?

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

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

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

音符低音组(Hz)中音组(Hz)高音组(Hz)
1262 (C4)523 (C5)1047 (C6)
2294 (D4)587 (D5)1175 (D6)
3330 (E4)659 (E5)1319 (E6)
4349 (F4)698 (F5)1397 (F6)
5392 (G4)784 (G5)1568 (G6)
6440 (A4)880 (A5)1760 (A6)
7494 (B4)988 (B5)1976 (B6)

三、MIDI音乐播放实例:

1. 音乐数据编码

// 数组结构:[频率, 持续时间(ms)]交替存储
uc16 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]);         // 另一半周期
    }
  }
}

完整工程代码示例⏬MIDI音乐播放程序

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));
(图2:方波周期与频率的对应关系示意图)

五、相关资源

[1] 洋桃电子B站课程-STM32入门100步
[2] STM32F103xx官方数据手册
[3] STM32F103X8-B数据手册(中文)
[4] STM32F103固件函数库用户手册(中文)
[5] MIDI音乐播放程序


💬 技术讨论(请在评论区留言~)

📌 下期预告:下一期将探讨串口通信重点课程,欢迎持续关注!

点击查阅🔍往期【STM32专栏】文章

版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志

  • v1.0 初始版本(2025-02-26)
;