效果展示
我們先來看看最終實現效果
功能實現
總體的實現相對是比較簡單的,主要分為以下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文章
277瀏覽量
19923 -
python
+關注
關注
56文章
4782瀏覽量
84453 -
腳本
+關注
關注
1文章
387瀏覽量
14832
原文標題:用Python寫了一個自動彈鋼琴腳本!
文章出處:【微信號:浩道linux,微信公眾號:浩道linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論