效果展示
我们先来看看最终实现效果
功能实现
总体的实现相对是比较简单的,主要分为以下4步实现:
-
实现演奏函数,通过手指及时间间隔模拟弹钢琴
-
添加各个演奏旋律线程,通过多线程模拟双手演奏效果
-
确定需要演奏的钢琴乐谱,确认主旋律、和弦、右手拇指、右手食指、左手拇指、左手食指
-
自动切换打开键盘钢琴(autopiano)网页,通过键盘键入实现模拟演奏功能
代码实现
演奏函数
首先需要模拟出演奏时各个按键的停顿间隔时间,实现键盘控制,通过传入的音乐乐符和时间实现各个现场手指的演奏。
defplay_piano(music,keytime):
forninmusic:
ifn.isupper():
keyboard.press(Key.shift)
time.sleep(0.001)
keyboard.press(n.lower())
time.sleep(keytime-0.001)
keyboard.release(n.lower())
keyboard.release(Key.shift)
elifn=="|"orn==")":
pass
elifnin"!@$%^*(":
keyboard.press(Key.shift)
time.sleep(0.001)
keyboard.press("1245689"["!@$%^*(".index(n)])
time.sleep(keytime-0.001)
keyboard.release("1245689"["!@$%^*(".index(n)])
keyboard.release(Key.shift)
elifn!=""andn!="-":
keyboard.press(n)
ifmusic.index(n)!=len(music)-1andmusic[music.index(n)+1]==")":
time.sleep(keytime/2)
else:
time.sleep(keytime)
keyboard.release(n)
elifn=="-":
time.sleep(2*keytime)
else:
time.sleep(keytime)
添加演奏旋律
音乐弹奏的时候,有时候需要双手同时控制演奏,我们需要通过线程模拟出主旋律、和弦、右手拇指、右手食指、左手拇指、左手食指各个部分的演奏效果,通过多线程开启上面的演奏函数。
准备演奏
双手弹琴需要确认好整首音乐中各个手指的弹奏节奏和弹奏内容。需要模拟出各个阶段需要的演奏音乐并拼出整首音乐。
right="s-asf|a--u|p-ops|"
"o--uu|i-uis-|u-sss|a-Iia|"
"a--|"
left="etu--|0wr--|qet--|"
"80w--|9qe--|80w--|7Qr--|"
"370Wr|"
thread_play(play_piano,0.3,right,left)
right="---op|s-asf|a--u|p-ops|"
"o--uu|i-uis-|u-sss|a-Iia|"
"a--pa|s-asf|a--u|p-ops|"
left="----|etu--|0wr--|qet--|"
"80w--|9qe--|80w--|7Qr--|"
"370Wru|etu--|0wr--|qet--|"
thread_play(play_piano,0.25,right,left)
right="o--uu|isa-s|dfs--|sapaO|"
"p--sd|f-dfh|d--o|s-asf|"
"f--oo|pasasd|s-oo-|dsap|"
left="80w--|9qe--|680--|9ey0-|"
"e---|89w-t|579--|60e-t|"
"370w-|q-q-|0---|9---|"
rightThumb="----|----|----|--W-|"
"s---|----|----|----|"
"----|----|----|gfds|"
rightIndexFinger="----|----|----|--r-|"
"u---|----|----|----|"
"----|e-r-|w---|e---|"
leftThumb="----|----|----|----|"
"----|----|----|----|"
"----|t-y-|t---|t---|"
thread_play(play_piano,0.25,right,left,rightThumb,rightIndexFinger,leftThumb)
right="a--f|j-h-|fds-s|d-sdh|"
"f--f|j-h-|"
left="3%70Wru|60e37w|48qerw|59qet|"
"80wty-|60e37w|"
rightThumb="f---|----|----|----|"
"----|----|"
rightIndexFinger="----|----|----|----|"
"----|----|"
leftThumb="----|----|----|----|"
"----|----|"
thread_play(play_piano,0.25,right,left,rightThumb,rightIndexFinger,leftThumb)
#右手
right="fds-s|d-sda|u--op|"
#左手
left="48qerw|7-7%|6---|"
#右拇指
rightThumb="----|9---|8"
#右食指
rightIndexFinger="----|q---|0"
#左拇指
leftThumb="----|----|p"
#多线程模拟手指弹琴,按键时间为0.3s
thread_play(play_piano,0.3,right,left,rightThumb,rightIndexFinger,leftThumb)
right="s-asf|a--u|p-ops|"
"o--uu|i-uis-|u-sss|a-Iia|"
"a--|"
left="etu--|0wr--|qet--|"
"80w--|9qe--|80w--|7Qr--|"
"370Wr|"
thread_play(play_piano,0.4,right,left)
模拟演奏
最后只需要打开钢琴网页,通过控制键盘按键,实现手指演奏曲谱线程,就可以模拟弹奏出整首音乐了。
这里我们需要安装谷歌浏览器驱动,来实现自动打开浏览器。
if__name__=='__main__':
#准备演奏
##控制键盘
keyboard=Controller()
##切换到vue键盘钢琴(autopiano)网页
#keyboard.press(Key.cmd)
#time.sleep(1)
#keyboard.press("d")
#keyboard.release("d")
#keyboard.release(Key.cmd)
##链接的方式点击桌面任务栏的正在运行程序print_control_identifiers()
#dlg=Desktop(backend="uia").任务栏.运行中的程序.child_window(title="GoogleChrome-1个运行窗口",auto_id="Chrome",
#control_type="Button").click()
chromePath=r'C:ProgramFilesGoogleChromeApplicationchrome.exe'
webbrowser.register('chrome',None,webbrowser.BackgroundBrowser(chromePath))
webbrowser.get('chrome').open('https://www.autopiano.cn',new=1,autoraise=True)
到这里自动弹钢琴就实现完成了,如果需要实现别的钢琴演奏,只需要会看乐谱,根据乐谱修改各个阶段手指弹奏线程,就可以实现不同乐曲的钢琴演奏啦!
-
多线程
+关注
关注
0文章
278浏览量
19946 -
python
+关注
关注
56文章
4793浏览量
84635 -
脚本
+关注
关注
1文章
389浏览量
14860
原文标题:用Python写了一个自动弹钢琴脚本!
文章出处:【微信号:浩道linux,微信公众号:浩道linux】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论