0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用Python寫了一個(gè)自動(dòng)彈鋼琴腳本!

jf_TEuU2tls ? 來源:浩道linux ? 2023-09-10 10:21 ? 次閱讀

效果展示

我們先來看看最終實(shí)現(xiàn)效果

3d71e616-4f7e-11ee-a25d-92fbcf53809c.gif

功能實(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)不同樂曲的鋼琴演奏啦!


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 多線程
    +關(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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于Python腳本的R語言的函數(shù)

    本文介紹了采用創(chuàng)建個(gè)Python腳本,腳本模仿R風(fēng)格的函數(shù)的方法來方便地進(jìn)行統(tǒng)計(jì)。 是
    的頭像 發(fā)表于 10-12 09:33 ?2001次閱讀
    基于<b class='flag-5'>Python</b><b class='flag-5'>腳本</b>的R語言的函數(shù)

    介紹10個(gè)Python自動(dòng)腳本

    在這個(gè)自動(dòng)化時(shí)代,我們有很多重復(fù)無聊的工作要做。想想這些你不再需要一次又一次地做的無聊的事情,讓它自動(dòng)化,讓你的生活更輕松。那么在本文中,我將向您介紹 10 個(gè)
    發(fā)表于 10-17 09:27 ?897次閱讀

    10個(gè)Python腳本來自動(dòng)化你的日常任務(wù)

    今天浩道跟大家分享幾個(gè)關(guān)于python自動(dòng)化日常工作的實(shí)用案例腳本!
    發(fā)表于 10-25 09:04 ?690次閱讀

    10個(gè)殺手級(jí)的Python自動(dòng)腳本

    今天浩道跟大家分享10個(gè)日常工作中用到的python自動(dòng)腳本。讓你感受python簡(jiǎn)單強(qiáng)大
    發(fā)表于 11-28 11:07 ?642次閱讀

    夢(mèng)幻鋼琴

    ` 本帖最后由 3010203109 于 2013-3-31 14:34 編輯 *界面美觀,多種音色,曲目豐富,可自動(dòng)彈奏*游戲仿照鋼琴而做,共有13個(gè)鍵,音域從低音部的sol到高音部的mi
    發(fā)表于 10-12 20:02

    labview做的鋼琴程序,可以修改,無密碼

    可以用電腦彈鋼琴,鋼琴完全labview做的,比較復(fù)雜。
    發(fā)表于 06-14 15:46

    python自動(dòng)編寫腳本及分配引腳

    對(duì)于具有484個(gè)引腳的芯片,如果手動(dòng)一個(gè)一個(gè)設(shè)置引腳,必然是場(chǎng)噩夢(mèng)。網(wǎng)上有使用Capture進(jìn)行自動(dòng)導(dǎo)入的帖子,不過沒有找到AD方面的帖子。本文使用
    發(fā)表于 07-23 06:49

    Arduino Uno板控制88個(gè)螺線管彈鋼琴

    塊Arduino Uno板控制88個(gè)螺線管彈鋼琴
    發(fā)表于 12-02 14:57 ?0次下載

    基于Arduino的鋼琴機(jī)器人

    塊Arduino Uno板控制88個(gè)螺線管彈鋼琴。多年前,雅馬哈推出了自動(dòng)鋼琴。年輕天真的我看到了樂器店的玻璃窗后面那架正在彈奏音樂的
    發(fā)表于 12-05 17:20 ?0次下載

    10個(gè)殺手級(jí)的Python自動(dòng)腳本分享

    重復(fù)性任務(wù)總是耗時(shí)且無聊,想想你想要張地裁剪 100 張照片或 Fetch API、糾正拼寫和語法等工作,所有這些任務(wù)都很耗時(shí),為什么不自動(dòng)化它們呢?在今天的文章中,我將與你分
    的頭像 發(fā)表于 01-06 15:34 ?665次閱讀

    分享10個(gè)實(shí)用的Python自動(dòng)腳本

    重復(fù)性任務(wù)總是耗時(shí)且無聊,想想你想要張地裁剪 100 張照片或 Fetch API、糾正拼寫和語法等工作,所有這些任務(wù)都很耗時(shí),為什么不自動(dòng)化它們呢?在今天的文章中,我將與你分
    的頭像 發(fā)表于 01-21 15:58 ?1253次閱讀

    利用Python寫了個(gè)監(jiān)控服務(wù)器資源利用率的腳本!

    研究了個(gè)腳本,其主要目的是:基于 Python 編程語言來監(jiān)控服務(wù)器的 CPU、內(nèi)存、/目錄、/appslog、/bigdata目錄使用率以及網(wǎng)卡接收和發(fā)送情況。
    的頭像 發(fā)表于 01-29 15:08 ?603次閱讀

    怎么Python構(gòu)建個(gè)自動(dòng)發(fā)送郵件的腳本

    ? 類似的應(yīng)用場(chǎng)景還有很多,不僅僅是在股票策略提醒上,比如定時(shí)向某些人發(fā)送郵件;網(wǎng)站宕機(jī)了,實(shí)時(shí)發(fā)送郵件提醒;網(wǎng)站負(fù)載過高,發(fā)送郵件提醒......等等。 下面就來講講怎么Python構(gòu)建
    的頭像 發(fā)表于 10-21 14:47 ?652次閱讀
    怎么<b class='flag-5'>用</b><b class='flag-5'>Python</b>構(gòu)建<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b><b class='flag-5'>自動(dòng)</b>發(fā)送郵件的<b class='flag-5'>腳本</b>

    怎么Python構(gòu)建個(gè)自動(dòng)發(fā)送郵件的腳本

    呢? 類似的應(yīng)用場(chǎng)景還有很多,不僅僅是在股票策略提醒上,比如定時(shí)向某些人發(fā)送郵件;網(wǎng)站宕機(jī)了,實(shí)時(shí)發(fā)送郵件提醒;網(wǎng)站負(fù)載過高,發(fā)送郵件提醒......等等。 下面就來講講怎么Python構(gòu)建
    的頭像 發(fā)表于 10-31 16:36 ?472次閱讀
    怎么<b class='flag-5'>用</b><b class='flag-5'>Python</b>構(gòu)建<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b><b class='flag-5'>自動(dòng)</b>發(fā)送郵件的<b class='flag-5'>腳本</b>

    如何使用Python編寫腳本來自動(dòng)發(fā)送郵件

    Python種非常流行的編程語言,可以用于多種用途,包括自動(dòng)化任務(wù)。其中個(gè)常見的自動(dòng)化任務(wù)
    的頭像 發(fā)表于 12-07 11:36 ?1059次閱讀