【掌控】mpython-12…handpy,演奏一首曲子呗

2018-10-059715
AI 快速预览详细 收起
本文介绍了如何使用mPython-12和handpy掌控板通过编程演奏《小星星》。首先,学习了数组的基本概念,并通过查找谱子和频率关系表,将音符频率写入数组。然后,使用for循环调用数组中的音符频率,通过蜂鸣器和彩灯实现演奏效果。整个过程不仅有趣,还能帮助初学者理解数组和for循环的应用。
-handpy,演奏一首世界名曲呗。
-可以啊,可是,你要写代码给我啊。

……

-下面,由handpy掌控给伙伴们演奏一曲,《小星星》。
-这首曲子,流传度可能是最广的了。



本视频及代码,由南昌七七老师授权大圣老师(稍有修改,加上了彩灯)写入帖子,给掌控普惠课用(太感谢了哈)。
【掌控】mpython-12…handpy,演奏一首曲子呗图1
【学习目标】
1、初步学习数组
2、for循环

【学习过程】
1、查找谱子
【掌控】mpython-12…handpy,演奏一首曲子呗图2
这个G调,找个C调的过来。
【掌控】mpython-12…handpy,演奏一首曲子呗图6
2、查资料
频率和音符的关系
【掌控】mpython-12…handpy,演奏一首曲子呗图3
【掌控】mpython-12…handpy,演奏一首曲子呗图4
【掌控】mpython-12…handpy,演奏一首曲子呗图5

2、写程序:
前面有几个帖子里,已经用到数组来表示图片。
不过哪有些套公式的感觉,这次要认真体会数组的用法了。
思路是把和音符频率写入数组,再用for循环来调用,演奏出曲子。

程序:
  1. from mpython import *  # 导入掌控库
  2. import time  # 导入时间库
  3. import random  # 导入随机数库
  4. buzz = PWM(Pin(16), freq = 500, duty = 0)  # 定义板载蜂鸣器引脚
  5. # 定义数组,写入乐曲音符频率
  6. song = [523, 523, 784, 784, 880, 880, 784, 784, 698, 698, 659,
  7.     659, 587, 587, 523, 523, 784, 784, 698, 698, 659, 659, 587,
  8.     587, 784, 784, 698, 698, 659, 659, 587, 587, 523, 523, 784,
  9.     784, 880, 880, 784, 784, 698, 698, 659, 659, 587, 587, 523,
  10.     523, ]
  11. # 清屏,显示节目预告
  12. display.fill(0)
  13. display.DispChar("Hi,I'm handpy.", 16, 16)
  14. display.show()
  15. time.sleep(2)
  16. display.fill(0)
  17. display.DispChar("下面演奏一曲-", 16, 16)
  18. display.show()
  19. time.sleep(2)
  20. display.fill(0)
  21. display.DispChar("《小星星》", 16, 16)
  22. display.show()
  23. time.sleep(2)
  24. # 定义演奏小星星函数,用for循环调用数组音符频率
  25. def xiaoxingxing():
  26.     for i in song:
  27.         rgb[0] = (random.randint(0, 255), 0, 0)  # RGB灯0(第1个彩灯)设为红色随机亮度
  28.         rgb[1] = (0, random.randint(0, 255), 0)  # RGB灯1(第2个彩灯)设为绿色随机亮度
  29.         rgb[2] = (0, 0, random.randint(0, 255))  # RGB灯2(第2个彩灯)设为蓝色随机亮度
  30.         rgb.write()  # 点亮彩灯
  31.         buzz.freq(i)  #  蜂鸣器演奏数组音符
  32.         buzz.duty(512) #  音高设为512
  33.         time.sleep_ms(500)  # 延时500ms(当做一拍)
  34.     buzz.duty(0)  # 音量高为0
  35.     buzz.off()  # 关闭蜂鸣器
  36.      
  37. xiaoxingxing()  # 调用函数
复制代码


(小提示,掌控库的buzz应用还在完善,后面程序再调整。)

【更新】
下面运用掌控新库,buzz已完善,上面的程序仍然可以执行。
下面更简练:

用buzz.on(i) #启动蜂鸣器依次播放音符频率,默认音高400
buzz.off()#演奏结束后关闭蜂鸣器
  1. from mpython import *#导入掌控库
  2. import time          #导入时间库
  3. import random        #导入随机数库
  4. #乐曲音符频率数组
  5. M = [523, 523, 784, 784, 880, 880, 784, 784, 698, 698, 659,
  6.     659, 587, 587, 523, 523, 784, 784, 698, 698, 659, 659, 587,
  7.     587, 784, 784, 698, 698, 659, 659, 587, 587, 523, 523, 784,
  8.     784, 880, 880, 784, 784, 698, 698, 659, 659, 587, 587, 523,
  9.     523, ]
  10. #清屏,屏幕显示节目预报
  11. display.fill(0)
  12. display.DispChar("Hi,I'm handpy.", 16, 16)
  13. display.show()
  14. time.sleep(2)
  15. display.fill(0)
  16. display.DispChar("下面演奏一曲-", 16, 16)
  17. display.show()
  18. time.sleep(2)
  19. display.fill(0)
  20. display.DispChar("《小星星》", 16, 16)
  21. display.show()
  22. time.sleep(2)
  23. #演奏乐曲,用for循环调用数组音符频率
  24. for i in M:
  25.     rgb[0] = (random.randint(0, 255), 0, 0)#RGB灯0(第一个彩灯)设为红色随机亮度
  26.     rgb[1] = (0, random.randint(0, 255), 0)#RGB灯1(第二个彩灯)设为绿色随机亮度
  27.     rgb[2] = (0, 0, random.randint(0, 255))#RGB灯2(第一个彩灯)设为蓝色随机亮度
  28.     rgb.write() #点亮彩灯
  29.     buzz.on(i)  #启动蜂鸣器依次播放音符频率
  30.     time.sleep_ms(500)#延时500ms(当做一拍,可能不准的,要请音乐老师指导)
  31.     buzz.off()#演奏结束后关闭蜂鸣器
复制代码


【视频效果】


创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(3)
rzyzzxw
rzyzzxw
作者
[code]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, ]
#清屏,屏幕显示节目预报
oled .fill(0)
oled .DispChar("Hi,I'm mpython.", 16, 16)
oled .show()
time.sleep(2)
oled .fill(0)
oled .DispChar("下面演奏一曲-", 16, 16)
oled .show()
time.sleep(2)
oled .fill(0)
oled .DispChar("《小星星》", 16, 16)
oled .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()#演奏结束后关闭蜂鸣器[/code]
rzyzzxw
rzyzzxw
作者
[code]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, ]
# 清屏,显示节目预告
oled.fill(0)
oled.DispChar("Hi,I'm mpython.", 16, 16)
oled.show()
time.sleep(2)
oled.fill(0)
oled.DispChar("下面演奏一曲-", 16, 16)
oled.show()
time.sleep(2)
oled.fill(0)
oled.DispChar("《小星星》", 16, 16)
oled.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() # 调用函数[/code]
geekzen
geekzen
朱老师动作真快。。。。我的升级版本还没做好呢
rzyzzxw
rzyzzxw
作者
回复geekzen
板载buzz的新函数用法有例程了。buzz.on(i) #启动蜂鸣器依次播放音符频率,默认音高400
buzz.off()#演奏结束后关闭蜂鸣器
- 没有更多了 -