主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
MIDI音乐播放程序 | 什么是MIDI,C调音符与频率对照表,编写并下载。 | 对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)]交替存储
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]); // 另一半周期
}
}
}
3. 关键参数说明
-
频率计算:
500000/music1[i*2]
推导过程
周期T(μs)=1,000,000/频率 → 半周期=500,000/频率
-
循环次数:
(频率×持续时间)/1000
确保总时长精确
例:440Hz音符播放500ms时:
循环次数=(440×500)/1000=220次
四、优化技巧
- 硬件定时器替代delay_us:使用PWM输出方波
- 中断控制:TIM_IT_Update中断切换电平
- 动态BPM调整:添加全局速度系数变量
float speed_ratio = 1.0; // 速度调节系数
delay_us((int)(500000/music1[i*2] * speed_ratio));
五、相关资源
[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)