-handpy,演奏一首世界名曲呗。
-可以啊,可是,你要写代码给我啊。
……
-下面,由handpy掌控给伙伴们演奏一曲,《小星星》。
-这首曲子,流传度可能是最广的了。
本视频及代码,由南昌七七老师授权大圣老师(稍有修改,加上了彩灯)写入帖子,给掌控普惠课用(太感谢了哈)。
【学习目标】
1、初步学习数组
2、for循环
【学习过程】
1、查找谱子
这个G调,找个C调的过来。
2、查资料
频率和音符的关系
2、写程序:
前面有几个帖子里,已经用到数组来表示图片。
不过哪有些套公式的感觉,这次要认真体会数组的用法了。
思路是把和音符频率写入数组,再用for循环来调用,演奏出曲子。
程序:
- from mpython import * # 导入掌控库
- import time # 导入时间库
- import random # 导入随机数库
-
- buzz = PWM(Pin(16), freq = 500, duty = 0) # 定义板载蜂鸣器引脚
- # 定义数组,写入乐曲音符频率
- song = [523, 523, 784, 784, 880, 880, 784, 784, 698, 698, 659,
- 659, 587, 587, 523, 523, 784, 784, 698, 698, 659, 659, 587,
- 587, 784, 784, 698, 698, 659, 659, 587, 587, 523, 523, 784,
- 784, 880, 880, 784, 784, 698, 698, 659, 659, 587, 587, 523,
- 523, ]
-
- # 清屏,显示节目预告
- display.fill(0)
- display.DispChar("Hi,I'm handpy.", 16, 16)
- display.show()
- time.sleep(2)
- display.fill(0)
- display.DispChar("下面演奏一曲-", 16, 16)
- display.show()
- time.sleep(2)
- display.fill(0)
- display.DispChar("《小星星》", 16, 16)
- display.show()
- time.sleep(2)
-
- # 定义演奏小星星函数,用for循环调用数组音符频率
- def xiaoxingxing():
- for i in song:
- rgb[0] = (random.randint(0, 255), 0, 0) # RGB灯0(第1个彩灯)设为红色随机亮度
- rgb[1] = (0, random.randint(0, 255), 0) # RGB灯1(第2个彩灯)设为绿色随机亮度
- rgb[2] = (0, 0, random.randint(0, 255)) # RGB灯2(第2个彩灯)设为蓝色随机亮度
- rgb.write() # 点亮彩灯
- buzz.freq(i) # 蜂鸣器演奏数组音符
- buzz.duty(512) # 音高设为512
- time.sleep_ms(500) # 延时500ms(当做一拍)
- buzz.duty(0) # 音量高为0
- buzz.off() # 关闭蜂鸣器
-
- xiaoxingxing() # 调用函数
复制代码
(小提示,掌控库的buzz应用还在完善,后面程序再调整。)
【更新】
下面运用掌控新库,buzz已完善,上面的程序仍然可以执行。
下面更简练:
用buzz.on(i) #启动蜂鸣器依次播放音符频率,默认音高400
buzz.off()#演奏结束后关闭蜂鸣器
- from mpython import *#导入掌控库
- import time #导入时间库
- import random #导入随机数库
-
- #乐曲音符频率数组
- M = [523, 523, 784, 784, 880, 880, 784, 784, 698, 698, 659,
- 659, 587, 587, 523, 523, 784, 784, 698, 698, 659, 659, 587,
- 587, 784, 784, 698, 698, 659, 659, 587, 587, 523, 523, 784,
- 784, 880, 880, 784, 784, 698, 698, 659, 659, 587, 587, 523,
- 523, ]
- #清屏,屏幕显示节目预报
- display.fill(0)
- display.DispChar("Hi,I'm handpy.", 16, 16)
- display.show()
- time.sleep(2)
- display.fill(0)
- display.DispChar("下面演奏一曲-", 16, 16)
- display.show()
- time.sleep(2)
- display.fill(0)
- display.DispChar("《小星星》", 16, 16)
- display.show()
- time.sleep(2)
-
- #演奏乐曲,用for循环调用数组音符频率
- for i in M:
- rgb[0] = (random.randint(0, 255), 0, 0)#RGB灯0(第一个彩灯)设为红色随机亮度
- rgb[1] = (0, random.randint(0, 255), 0)#RGB灯1(第二个彩灯)设为绿色随机亮度
- rgb[2] = (0, 0, random.randint(0, 255))#RGB灯2(第一个彩灯)设为蓝色随机亮度
- rgb.write() #点亮彩灯
- buzz.on(i) #启动蜂鸣器依次播放音符频率
- time.sleep_ms(500)#延时500ms(当做一拍,可能不准的,要请音乐老师指导)
- buzz.off()#演奏结束后关闭蜂鸣器
复制代码
【视频效果】
|