摘要:突然靈機(jī)一動(dòng),能不能用自動(dòng)化腳本彈奏一曲美妙的鋼琴曲呢今天就一起帶大家如何用實(shí)現(xiàn)自動(dòng)化彈出一首天空之城首先一起來(lái)看看最終實(shí)現(xiàn)的演奏效果下面,我們就開(kāi)始介紹如何實(shí)現(xiàn)這個(gè)自動(dòng)化彈鋼琴腳本的。
小時(shí)候一直有一個(gè)想成為鋼琴家的夢(mèng)想,最近在網(wǎng)上看到了一個(gè)開(kāi)源的鋼琴演奏網(wǎng)頁(yè)autopiano,可以支持鍵盤(pán)按鍵彈奏、鼠標(biāo)點(diǎn)擊彈奏。
突然靈機(jī)一動(dòng),能不能用Python自動(dòng)化腳本彈奏一曲美妙的鋼琴曲呢?今天就一起帶大家如何用Python實(shí)現(xiàn)自動(dòng)化彈出一首《天空之城》!
首先一起來(lái)看看最終實(shí)現(xiàn)的演奏效果:
下面,我們就開(kāi)始介紹如何實(shí)現(xiàn)這個(gè)自動(dòng)化彈鋼琴腳本的。
總體的實(shí)現(xiàn)相對(duì)是比較簡(jiǎn)單的,主要分為以下4步實(shí)現(xiàn):
我們首先需要模擬出演奏時(shí),各個(gè)按鍵的停頓間隔時(shí)間,實(shí)現(xiàn)鍵盤(pán)控制,通過(guò)傳入的音樂(lè)樂(lè)符和時(shí)間實(shí)現(xiàn)各個(gè)現(xiàn)場(chǎng)手指的演奏。核心代碼如下:
# 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)
因?yàn)檎滓魳?lè)彈奏的時(shí)候,有時(shí)候需要雙手同時(shí)控制演奏,所以我們需要通過(guò)線程模擬出主旋律、和弦、右手拇指、右手食指、左手拇指、左手食指各個(gè)部分的演奏效果,通過(guò)多線程開(kāi)啟上面的演奏函數(shù)。核心代碼如下:
# author:Dragon少年def thread_play(play_piano, keytime, right="", left="", rightThumb="", rightIndexFinger="", leftThumb="", leftIndexFinger=""): # 運(yùn)行線程 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)) # 右手食指線程
雙手彈琴那么就需要確認(rèn)好整首音樂(lè)中,各個(gè)手指的彈奏節(jié)奏和彈奏內(nèi)容。我們需要模擬出各個(gè)階段需要的演奏音樂(lè)并拼出整首音樂(lè)。下面就以《天空之城》為例,核心代碼如下:
# 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"# 多線程模擬手指彈琴,按鍵時(shí)間為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)
最后我們只需要打開(kāi)鋼琴auto piano網(wǎng)頁(yè),(注意:博主這里是直接通過(guò)桌面任務(wù)欄程序打開(kāi)的瀏覽器窗口,所以需要手動(dòng)瀏覽器先打開(kāi)自由鋼琴網(wǎng)頁(yè))通過(guò)控制鍵盤(pán)按鍵,實(shí)現(xiàn)手指演奏曲譜線程,就可以模擬彈奏出整首音樂(lè)了。核心代碼如下:
# author:Dragon少年# 控制鍵盤(pán)鍵入keyboard = Controller()# 切換到鍵盤(pán)鋼琴網(wǎng)頁(yè)端keyboard.press(Key.cmd)# 延時(shí)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="Google Chrome - 1 個(gè)運(yùn)行窗口", auto_id="Chrome", control_type="Button").click()time.sleep(2)keyboard.press(Key.f11)keyboard.release(Key.f11)
至此,自動(dòng)化彈鋼琴就實(shí)現(xiàn)完成了,當(dāng)然如果需要實(shí)現(xiàn)別的鋼琴演奏,只需要會(huì)看樂(lè)譜,根據(jù)樂(lè)譜修改各個(gè)階段手指彈奏線程,就可以實(shí)現(xiàn)不同樂(lè)曲的鋼琴演奏啦!
最后大家一起來(lái)欣賞欣賞Python演奏的鋼琴曲《天空之城》效果如何吧!
若本篇內(nèi)容對(duì)您有所幫助,請(qǐng)三連點(diǎn)贊,關(guān)注,收藏支持下。
創(chuàng)作不易,白嫖不好,各位的支持和認(rèn)可,就是我創(chuàng)作的最大動(dòng)力,我們下篇文章見(jiàn)!
Dragon少年 | 文
如果本篇博客有任何錯(cuò)誤,請(qǐng)批評(píng)指教,不勝感激 !
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119555.html
摘要:底部彈出選擇,可滑動(dòng)選擇選項(xiàng),如果停留在選項(xiàng)中間,可自動(dòng)校正位置,加了一點(diǎn)簡(jiǎn)單的動(dòng)畫(huà)效果,需要的朋友可以下載下來(lái)修改下應(yīng)用到自己的項(xiàng)目中。 一、簡(jiǎn)介 個(gè)人上傳的第一個(gè)示例源碼,兩天空閑時(shí)間寫(xiě)的,一點(diǎn)簡(jiǎn)單組件,寫(xiě)的挺亂還沒(méi)啥注釋?zhuān)瑑H供新手學(xué)習(xí)。 底部彈出選擇,可滑動(dòng)選擇選項(xiàng),如果停留在選項(xiàng)中間,可自動(dòng)校正位置,加了一點(diǎn)簡(jiǎn)單的動(dòng)畫(huà)效果,需要的朋友可以下載下來(lái)修改下應(yīng)用到自己的項(xiàng)目中。 De...
摘要:寫(xiě)成一行參數(shù)解釋腳本開(kāi)始彈出新窗口的命令彈出窗口的文件名彈出窗口的名字不是文件名,非必須,可用空代替窗口高度窗口寬度窗口距離屏幕上方的象素值窗口距離屏幕左側(cè)的象素值是否顯示工具欄,為顯示,表示菜單欄和滾動(dòng)欄。 Window.Open詳解2006年11月09日 12:14 Window.Open詳解 一、window.open()支持環(huán)境: JavaScript1.0+/JScript...
摘要:后來(lái)他們談戀愛(ài)并且結(jié)婚了,有一天小明調(diào)用了自己的方法,并將小白作為參數(shù)傳入,隨后出了一個(gè)孩子小黑。但是小黑并沒(méi)有繼承小明的和小紅的,反倒是有了自己的私有屬性。 tips:本文盡量用樸實(shí)易懂的語(yǔ)言來(lái)解釋面向?qū)ο蟮乃枷搿?荒古時(shí)期 上帝首先創(chuàng)造了幾個(gè)原始類(lèi) original class。例如:動(dòng)物類(lèi)Animal,植物類(lèi)Plant,地形類(lèi)Topography,氣象類(lèi)Atmosphere等作...
摘要:運(yùn)行一下頁(yè)面,成功彈出提示窗口,的執(zhí)行全過(guò)程順利完成到這里為止的話,相信你已經(jīng)能夠理解的客戶端實(shí)現(xiàn)原理了吧剩下的就是如何把代碼封裝一下,以便于與用戶界面交互,從而實(shí)現(xiàn)多次和重復(fù)調(diào)用。 先說(shuō)說(shuō)JSONP是怎么產(chǎn)生的: 其實(shí)網(wǎng)上關(guān)于JSONP的講解有很多,但卻千篇一律,而且云里霧里,對(duì)于很多剛接觸的人來(lái)講理解起來(lái)有些困難,小可不才,試著用自己的方式來(lái)闡釋一下這個(gè)問(wèn)題,看看是否有幫助。 1、...
摘要:一個(gè)對(duì)應(yīng)相應(yīng)的狀態(tài)碼,狀態(tài)碼表示協(xié)議所返回的響應(yīng)的狀態(tài)。下面將狀態(tài)碼歸結(jié)如下繼續(xù)客戶端應(yīng)當(dāng)繼續(xù)發(fā)送請(qǐng)求。繼續(xù)處理由擴(kuò)展的狀態(tài)碼,代表處理將被繼續(xù)執(zhí)行。處理方式丟棄該狀態(tài)碼不被的應(yīng)用程序直接使用,只是作為類(lèi)型回應(yīng)的默認(rèn)解釋。 本篇內(nèi)容為 python 網(wǎng)絡(luò)爬蟲(chóng)初級(jí)操作,內(nèi)容主要有以下 3 部分: python 關(guān)于爬蟲(chóng)的一些基本操作和知識(shí) 靜態(tài)網(wǎng)頁(yè)抓取 動(dòng)態(tài)網(wǎng)頁(yè)抓取 基本操作和知識(shí)...
閱讀 2338·2021-09-26 10:21
閱讀 2824·2021-09-08 09:36
閱讀 3077·2019-08-30 15:56
閱讀 968·2019-08-30 12:57
閱讀 950·2019-08-26 10:39
閱讀 3572·2019-08-23 18:11
閱讀 3096·2019-08-23 17:12
閱讀 1098·2019-08-23 12:18