摘要:突然靈機一動,能不能用自動化腳本彈奏一曲美妙的鋼琴曲呢今天就一起帶大家如何用實現自動化彈出一首天空之城首先一起來看看最終實現的演奏效果下面,我們就開始介紹如何實現這個自動化彈鋼琴腳本的。
小時候一直有一個想成為鋼琴家的夢想,最近在網上看到了一個開源的鋼琴演奏網頁autopiano,可以支持鍵盤按鍵彈奏、鼠標點擊彈奏。
突然靈機一動,能不能用Python自動化腳本彈奏一曲美妙的鋼琴曲呢?今天就一起帶大家如何用Python實現自動化彈出一首《天空之城》!
首先一起來看看最終實現的演奏效果:
下面,我們就開始介紹如何實現這個自動化彈鋼琴腳本的。
總體的實現相對是比較簡單的,主要分為以下4步實現:
我們首先需要模擬出演奏時,各個按鍵的停頓間隔時間,實現鍵盤控制,通過傳入的音樂樂符和時間實現各個現場手指的演奏。核心代碼如下:
# author:Dragon少年def play_piano(music, keytime): for n in music: if n.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) elif n == "|" or n == ")": pass elif n in "!@$%^*(": 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) elif n != " " and n != "-": keyboard.press(n) if music.index(n) != len(music) - 1 and music[music.index(n) + 1] == ")": time.sleep(keytime / 2) else: time.sleep(keytime) keyboard.release(n) elif n == "-": time.sleep(2 * keytime) else: time.sleep(keytime)
因為整首音樂彈奏的時候,有時候需要雙手同時控制演奏,所以我們需要通過線程模擬出主旋律、和弦、右手拇指、右手食指、左手拇指、左手食指各個部分的演奏效果,通過多線程開啟上面的演奏函數。核心代碼如下:
# author:Dragon少年def thread_play(play_piano, keytime, right="", left="", rightThumb="", rightIndexFinger="", leftThumb="", leftIndexFinger=""): # 運行線程 rt = threading.Thread(target=play_piano, args=(right, keytime)) # 主旋律線程 lt = threading.Thread(target=play_piano, args=(left, keytime)) # 和弦線程 rtt = threading.Thread(target=play_piano, args=(rightThumb, keytime)) # 右手拇指線程 rift = threading.Thread(target=play_piano, args=(rightIndexFinger, keytime)) # 右手食指線程 ltt = threading.Thread(target=play_piano, args=(leftThumb, keytime)) # 左手拇指線程 lift = threading.Thread(target=play_piano, args=(leftIndexFinger, keytime)) # 右手食指線程
雙手彈琴那么就需要確認好整首音樂中,各個手指的彈奏節奏和彈奏內容。我們需要模擬出各個階段需要的演奏音樂并拼出整首音樂。下面就以《天空之城》為例,核心代碼如下:
# author:Dragon少年# 右手right = "s-as f |a --u |p -ops |" / "o --uu|i-uis-|u - sss|a-Ii a |" / "a --|"# 左手left = "etu --|0wr --|qet --|" / "80w --|9qe --|80w --|7Qr --|" / "370Wr |"# 演奏線程thread_play(play_piano, 0.3, right, left)right = "---op|s-as f |a --u |p -ops |" / "o --uu|i-uis-|u - sss|a-Ii a |" / "a --pa|s-as f |a --u |p -ops |"left = "----|etu --|0wr --|qet --|" / "80w --|9qe --|80w --|7Qr --|" / "370Wr u |etu --|0wr --|qet --|"# 演奏線程thread_play(play_piano, 0.25, right, left)# 右手right = "o --uu|i sa-s |d fs--|sap a O |" / "p --sd|f-df h |d --o |s-as f |" / "f --oo|pas asd |s-oo- |d s a p |"# 左手left = "80w --|9qe --|680 --|9ey 0 -|" / "e ---|89w -t |579 --|60e -t |" / "370 w -|q -q -|0 ---|9 ---|"# 右拇指rightThumb = "----|----|----|--W -|" / "s ---|----|----|----|" / "----|----|----|g f d s |"# 右食指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-sd h |" / "f --f |j -h -|"# 左手left = "3 %70Wru|60e 37w |48qer w |59q e t |" / "80wty -|60e 37w |"# 右手拇指rightThumb = "f ---|----|----|----|" / "----|----|"# 右食指rightIndexFinger = "----|----|----|----|" / "----|----|"# 左拇指leftThumb = "----|----|----|----|" / "----|----|"# 演奏線程thread_play(play_piano, 0.25, right, left, rightThumb, rightIndexFinger, leftThumb)# 右手right = "fds -s |d-sd a |u --op|"# 左手left = "48qer w |7 -7 % |6 ---|"# 右拇指rightThumb = "----|9 ---|8"# 右食指rightIndexFinger = "----|q ---|0"# 左拇指leftThumb = "----|----|p"# 多線程模擬手指彈琴,按鍵時間為0.3sthread_play(play_piano, 0.3, right, left, rightThumb, rightIndexFinger, leftThumb)right = "s-as f |a --u |p -ops |" / "o --uu|i-uis-|u - sss|a-Ii a |" / "a --|"left = "etu --|0wr --|qet --|" / "80w --|9qe --|80w --|7Qr --|" / "370Wr |"thread_play(play_piano, 0.4, right, left)
最后我們只需要打開鋼琴auto piano網頁,(注意:博主這里是直接通過桌面任務欄程序打開的瀏覽器窗口,所以需要手動瀏覽器先打開自由鋼琴網頁)通過控制鍵盤按鍵,實現手指演奏曲譜線程,就可以模擬彈奏出整首音樂了。核心代碼如下:
# author:Dragon少年# 控制鍵盤鍵入keyboard = Controller()# 切換到鍵盤鋼琴網頁端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="Google Chrome - 1 個運行窗口", auto_id="Chrome", control_type="Button").click()time.sleep(2)keyboard.press(Key.f11)keyboard.release(Key.f11)
至此,自動化彈鋼琴就實現完成了,當然如果需要實現別的鋼琴演奏,只需要會看樂譜,根據樂譜修改各個階段手指彈奏線程,就可以實現不同樂曲的鋼琴演奏啦!
最后大家一起來欣賞欣賞Python演奏的鋼琴曲《天空之城》效果如何吧!
若本篇內容對您有所幫助,請三連點贊,關注,收藏支持下。
創作不易,白嫖不好,各位的支持和認可,就是我創作的最大動力,我們下篇文章見!
Dragon少年 | 文
如果本篇博客有任何錯誤,請批評指教,不勝感激 !
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119555.html
摘要:底部彈出選擇,可滑動選擇選項,如果停留在選項中間,可自動校正位置,加了一點簡單的動畫效果,需要的朋友可以下載下來修改下應用到自己的項目中。 一、簡介 個人上傳的第一個示例源碼,兩天空閑時間寫的,一點簡單組件,寫的挺亂還沒啥注釋,僅供新手學習。 底部彈出選擇,可滑動選擇選項,如果停留在選項中間,可自動校正位置,加了一點簡單的動畫效果,需要的朋友可以下載下來修改下應用到自己的項目中。 De...
摘要:寫成一行參數解釋腳本開始彈出新窗口的命令彈出窗口的文件名彈出窗口的名字不是文件名,非必須,可用空代替窗口高度窗口寬度窗口距離屏幕上方的象素值窗口距離屏幕左側的象素值是否顯示工具欄,為顯示,表示菜單欄和滾動欄。 Window.Open詳解2006年11月09日 12:14 Window.Open詳解 一、window.open()支持環境: JavaScript1.0+/JScript...
摘要:后來他們談戀愛并且結婚了,有一天小明調用了自己的方法,并將小白作為參數傳入,隨后出了一個孩子小黑。但是小黑并沒有繼承小明的和小紅的,反倒是有了自己的私有屬性。 tips:本文盡量用樸實易懂的語言來解釋面向對象的思想。 荒古時期 上帝首先創造了幾個原始類 original class。例如:動物類Animal,植物類Plant,地形類Topography,氣象類Atmosphere等作...
閱讀 2320·2021-09-26 10:21
閱讀 2796·2021-09-08 09:36
閱讀 3069·2019-08-30 15:56
閱讀 958·2019-08-30 12:57
閱讀 924·2019-08-26 10:39
閱讀 3559·2019-08-23 18:11
閱讀 3083·2019-08-23 17:12
閱讀 1086·2019-08-23 12:18