STM32-MIDI音乐播放程序


杨桃32学习笔记,本文图片文字皆为转述

MIDI(Musical Instrument Digital Interface)乐器数字接口

是20 世纪80 年代初为解决电声乐器之间的通信问题而提出的。
MIDI是编曲界最广泛的音乐标准格式,可称为“计算机能理解的乐谱”。
它用音符的数字控制信号来记录音乐。一首完整的MIDI音乐只有几十KB大,
而能包含数十条音乐轨道。几乎所有的现代音乐都是用MIDI加上音色库来制作合成的。
MIDI 传输的不是声音信号, 而是音符、控制参数等指令, 它指示MIDI 设备要做什么,
怎么做, 如演奏哪个音符、多大音量等。它们被统一表示成MIDI 消息。
传输时采用异步串行通信, 标准通信波特率为31.25×( 1±0.01) KBaud。

在这里插入图片描述

/将音符转换为频率使用蜂鸣器产生。

修改上次buzzer.c和buzzer.h

在buzzer.c内加入music1[78]数组和MIDI_PLAY函数。
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
};
void MIDI_PLAY(void){ //MIDI音乐
	u16 i,e;
	for(i=0;i<39;i++){
		for(e=0;e<music1[i*2]*music1[i*2+1]/1000;e++){
			GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鸣器接口输出0
			delay_us(500000/music1[i*2]); //延时		
			GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1
			delay_us(500000/music1[i*2]); //延时	
		}	
	}
}
在buzzer.h内加入MIDI_PLAY函数声明。

在这里插入图片描述

修改上次main.c

在这里插入图片描述

解读MIDI_PLAY函数

第一个for循环:
for(i=0;i<39;i++){	//39个音符循环一次
第二个for循环:
for(e=0;e<music1[i*2]*music1[i*2+1]/1000;e++)
//music1[i*2]*music1[i*2+1]每个音符所播放的长度
//music1[i*2]是数组的偶数位也就是024.....数组的左列,代表音符播放长度
//music1[i*2+1]是数组右列代表音符对应的频率
//当i=0时上面算式得到的是数组0和1元素330:一秒震动次数
750:时间长度,应该转化为us 也就是750/1000
//music1[0]*music1[1]=750*330,意义750秒钟震动的次数
//然后转化为毫秒music1[i*2]*music1[i*2+1]/1000 意义750毫秒钟震动的次数
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鸣器接口输出0
delay_us(500000/music1[i*2]); //延时 决定音调	
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1
delay_us(500000/music1[i*2]); //延时
//music1[i*2]数组的偶数位也就数数组左列 	
500000/music1[i*2]就是半秒/低电平的次数 就是低电平时间 
加上高电平的延时时间形成1秒周期

烧写验证得到预期结果

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值