rzyzzxw 发表于 2018-10-5 21:39:26

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

-handpy,演奏一首世界名曲呗。
-可以啊,可是,你要写代码给我啊。

……

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

http://v.youku.com/v_show/id_XMzg1MDM2MDY2OA==.html?spm=a2h3j.8428770.3416059.1

本视频及代码,由南昌七七老师授权大圣老师(稍有修改,加上了彩灯)写入帖子,给掌控普惠课用(太感谢了哈)。

【学习目标】
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 = (random.randint(0, 255), 0, 0)# RGB灯0(第1个彩灯)设为红色随机亮度
      rgb = (0, random.randint(0, 255), 0)# RGB灯1(第2个彩灯)设为绿色随机亮度
      rgb = (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 = (random.randint(0, 255), 0, 0)#RGB灯0(第一个彩灯)设为红色随机亮度
    rgb = (0, random.randint(0, 255), 0)#RGB灯1(第二个彩灯)设为绿色随机亮度
    rgb = (0, 0, random.randint(0, 255))#RGB灯2(第一个彩灯)设为蓝色随机亮度
    rgb.write() #点亮彩灯
    buzz.on(i)#启动蜂鸣器依次播放音符频率
    time.sleep_ms(500)#延时500ms(当做一拍,可能不准的,要请音乐老师指导)
    buzz.off()#演奏结束后关闭蜂鸣器

【视频效果】
http://v.youku.com/v_show/id_XMzg1MDYyNjIxNg==.html?spm=a2h3j.8428770.3416059.1

geekzen 发表于 2018-10-5 22:22:33

朱老师动作真快。。。。我的升级版本还没做好呢

rzyzzxw 发表于 2018-10-6 09:01:38

geekzen 发表于 2018-10-5 22:22
朱老师动作真快。。。。我的升级版本还没做好呢

板载buzz的新函数用法有例程了。buzz.on(i) #启动蜂鸣器依次播放音符频率,默认音高400
buzz.off()#演奏结束后关闭蜂鸣器

rzyzzxw 发表于 2018-12-28 09:16:53

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 = (random.randint(0, 255), 0, 0)# RGB灯0(第1个彩灯)设为红色随机亮度
      rgb = (0, random.randint(0, 255), 0)# RGB灯1(第2个彩灯)设为绿色随机亮度
      rgb = (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()# 调用函数

rzyzzxw 发表于 2018-12-28 09:21:46

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 = (random.randint(0, 255), 0, 0)#RGB灯0(第一个彩灯)设为红色随机亮度
    rgb = (0, random.randint(0, 255), 0)#RGB灯1(第二个彩灯)设为绿色随机亮度
    rgb = (0, 0, random.randint(0, 255))#RGB灯2(第一个彩灯)设为蓝色随机亮度
    rgb.write() #点亮彩灯
    buzz.on(i)#启动蜂鸣器依次播放音符频率
    time.sleep_ms(500)#延时500ms(当做一拍,可能不准的,要请音乐老师指导)
    buzz.off()#演奏结束后关闭蜂鸣器
页: [1]
查看完整版本: 【掌控】mpython-12…handpy,演奏一首曲子呗