效果展示
我們先來看看最終實(shí)現(xiàn)效果
功能實(shí)現(xiàn)
總體的實(shí)現(xiàn)相對(duì)是比較簡(jiǎn)單的,主要分為以下4步實(shí)現(xiàn):
-
實(shí)現(xiàn)演奏函數(shù),通過手指及時(shí)間間隔模擬彈鋼琴
-
添加各個(gè)演奏旋律線程,通過多線程模擬雙手演奏效果
-
確定需要演奏的鋼琴樂譜,確認(rèn)主旋律、和弦、右手拇指、右手食指、左手拇指、左手食指
-
自動(dòng)切換打開鍵盤鋼琴(autopiano)網(wǎng)頁,通過鍵盤鍵入實(shí)現(xiàn)模擬演奏功能
代碼實(shí)現(xiàn)
演奏函數(shù)
首先需要模擬出演奏時(shí)各個(gè)按鍵的停頓間隔時(shí)間,實(shí)現(xiàn)鍵盤控制,通過傳入的音樂樂符和時(shí)間實(shí)現(xiàn)各個(gè)現(xiàn)場(chǎng)手指的演奏。
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)
添加演奏旋律
音樂彈奏的時(shí)候,有時(shí)候需要雙手同時(shí)控制演奏,我們需要通過線程模擬出主旋律、和弦、右手拇指、右手食指、左手拇指、左手食指各個(gè)部分的演奏效果,通過多線程開啟上面的演奏函數(shù)。
準(zhǔn)備演奏
雙手彈琴需要確認(rèn)好整首音樂中各個(gè)手指的彈奏節(jié)奏和彈奏內(nèi)容。需要模擬出各個(gè)階段需要的演奏音樂并拼出整首音樂。
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"
#多線程模擬手指彈琴,按鍵時(shí)間為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)
模擬演奏
最后只需要打開鋼琴網(wǎng)頁,通過控制鍵盤按鍵,實(shí)現(xiàn)手指演奏曲譜線程,就可以模擬彈奏出整首音樂了。
這里我們需要安裝谷歌瀏覽器驅(qū)動(dòng),來實(shí)現(xiàn)自動(dòng)打開瀏覽器。
if__name__=='__main__':
#準(zhǔn)備演奏
##控制鍵盤
keyboard=Controller()
##切換到vue鍵盤鋼琴(autopiano)網(wǎng)頁
#keyboard.press(Key.cmd)
#time.sleep(1)
#keyboard.press("d")
#keyboard.release("d")
#keyboard.release(Key.cmd)
##鏈接的方式點(diǎn)擊桌面任務(wù)欄的正在運(yùn)行程序print_control_identifiers()
#dlg=Desktop(backend="uia").任務(wù)欄.運(yùn)行中的程序.child_window(title="GoogleChrome-1個(gè)運(yùn)行窗口",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)
到這里自動(dòng)彈鋼琴就實(shí)現(xiàn)完成了,如果需要實(shí)現(xiàn)別的鋼琴演奏,只需要會(huì)看樂譜,根據(jù)樂譜修改各個(gè)階段手指彈奏線程,就可以實(shí)現(xiàn)不同樂曲的鋼琴演奏啦!
-
多線程
+關(guān)注
關(guān)注
0文章
275瀏覽量
19850 -
python
+關(guān)注
關(guān)注
53文章
4753瀏覽量
84089 -
腳本
+關(guān)注
關(guān)注
1文章
382瀏覽量
14761
原文標(biāo)題:用Python寫了一個(gè)自動(dòng)彈鋼琴腳本!
文章出處:【微信號(hào):浩道linux,微信公眾號(hào):浩道linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論