python 机甲_大疆机甲大师Python开发: 演奏

6d54222b645ce04ed3e83eb4e686d07f.png

机甲大师升级了固件,增加了多媒体钢琴音的演奏功能。

不过原先的参数是不带音长的,而音乐会有各种不同时长的音符,如附点、切分音等。

另外,机甲大师原先对音符的录入实太过麻烦,且没有对音符时值的输入。

为了能让机甲大师能够演奏不同时长的音符,并且能尽量按简谱的方式输入乐谱,写了以下的代码。

0acfa07063b447d237bbc6980112ef0f.png
大疆机甲大师演奏 我和我的祖国https://www.zhihu.com/video/1169619390738870272
def playsound(m):
    melody = []
    for i in m:
        if i.isalpha():
            if i.islower():  # 小写
                melody.append((int(ord(i)) - 97,12))
            else:
                melody.append((int(ord(i)) - 65 + 14,12))
        elif i.isdigit():   
            if int(i) == 0:
                melody.append((-1,12))     
            else:
                melody.append((int(ord(i))- 49 + 7,12))
        else:
            note=melody[-1][0]
            span=melody[-1][1]
            if i=='.':
                melody[-1]=(note,span*3/2)
            elif i=='=':
                melody[-1]=(note,span/4)
            elif i=='_':
                melody[-1]=(note,span/2)
            elif i=='-':
                melody[-1]=(note,span*2)
            elif i=='^':
                melody[-1]=(note,span*4)
    play(melody)
            
def play(k):  
    notes = [
        rm_define.media_sound_solmization_1A,
        rm_define.media_sound_solmization_1B,
        rm_define.media_sound_solmization_1C,
        rm_define.media_sound_solmization_1D,
        rm_define.media_sound_solmization_1E,
        rm_define.media_sound_solmization_1F,
        rm_define.media_sound_solmization_1G,       
        rm_define.media_sound_solmization_2C,
        rm_define.media_sound_solmization_2D,
        rm_define.media_sound_solmization_2E,
        rm_define.media_sound_solmization_2F,
        rm_define.media_sound_solmization_2G,
        rm_define.media_sound_solmization_2A,
        rm_define.media_sound_solmization_2B,
        rm_define.media_sound_solmization_3A,
        rm_define.media_sound_solmization_3B,
        rm_define.media_sound_solmization_3C,
        rm_define.media_sound_solmization_3D,
        rm_define.media_sound_solmization_3E,
        rm_define.media_sound_solmization_3F,
        rm_define.media_sound_solmization_3G        
      ]    
    for m in k:        
        if  m[0]<0:
            for j in range(int(m[1])):
                time.sleep(0.02)
            time.sleep(0.08)
        else:
            media_ctrl.play_sound(notes[m[0]])
            for i in range(int(m[1])):        
                time.sleep(0.02)   
            time.sleep(0.08)
            
def sing(song):
    if song=='国歌':
        m='0_g_1.1_1._1=g_a=b=110_3_1_2=3=553._3=1._3=5._3=22-65235_3_0_5_3_2=3=130g._a=1_1_3._3=5_5_2_2=2=a2.g_1.1_3.3_5^1._3=5_5_653._1=5=5=5=3_0_1_0_g13._1=5=5=5=3_0=1_0=g0=10=g0_10_g0_10_1'  
    elif song=='虫儿飞':
        m='33_3_453.2_2-11_1_233.b_b-a32-a32-a32.1_1---'
    elif song=='我和我的祖国':
        m='5_6_5_4_3_2_1.g.1_3_C_7_6_3_5....6_7_6_5_4_3_2.a.b_a_g_5_1._2=3....5_6_5_4_3_2_1.g.1_3_C_7_D._C=6....C_7_6_5.6_5_4_3.ba_g_2_1....C_D_E_D_C_6_7_6._3=5..C_D_E_D_C_6_7_5._3=6..5_4_3_2.b_a_g_3.4.21_1--'
    playsound(m)
    
def start():
    sing('我和我的祖国')

【说明】

e49f43757a6a54a36ddfa1e9972d6be0.png

cdefgab对应为app显示的C1,相当于钢琴的C5

1234567对应为app显示的C2,相当于钢琴的C6

CDEFGAB对应为app显示的C3,相当于钢琴的C7

“0”为休息符

“. ”为附点,时值为1.5

“_” 为减时线,时值为1/2,相当于八分音符

“=” 表示2根减时线,相当于十六分音符

“-” 为增时线,时值为2


顺便说一下机甲大师的音高:

8e04767c6f4131db975a6503fba1bb44.png

大致测了一下,我手上的机甲大师音准稍微偏高,测试了C和A两个音,发现:

C5,机甲大师发出的音高为C#5,

C6,机甲大师发出的音高为C#6,

A5,机甲大师发出的音高为A#5,

A6,机甲大师发出的音高为A#6,

升高了半音。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值