王舒揚(yáng) 孫江波 蔡赟 柳虹亮
摘 要:在Visual Studio開(kāi)發(fā)環(huán)境下,使用C#語(yǔ)言設(shè)計(jì)了彈鋼琴擬人機(jī)械手控制軟件,軟件由樂(lè)譜管理,音頻播放,仿真操作界面以及串口通信部分組成。軟件設(shè)計(jì)了算法對(duì)輸入的樂(lè)譜數(shù)據(jù)進(jìn)行識(shí)別與分析,將樂(lè)譜的彈奏任務(wù)智能分配給機(jī)械手。充分利用C#語(yǔ)言可視化編程的優(yōu)點(diǎn),將機(jī)械手運(yùn)動(dòng)的過(guò)程進(jìn)行了可視化仿真。
關(guān)鍵詞:擬人;機(jī)械手;仿真;軟件設(shè)計(jì)
0 引言
隨著科學(xué)不斷進(jìn)步,新型機(jī)械手在關(guān)節(jié)自由度、靈活性、定位精度等方面有了很大的提高,加強(qiáng)了音樂(lè)機(jī)器人物理演奏能力。現(xiàn)有的控制系統(tǒng)大致上分為兩類,一是采用記錄并回放的方式,將演奏過(guò)程中按鍵的輕重等因素記錄為midi音源,并通過(guò)將其轉(zhuǎn)化為波形脈沖信號(hào)驅(qū)動(dòng)機(jī)器人達(dá)到演奏的目的[1]。這種方式應(yīng)用于早期的鋼琴自動(dòng)演奏技術(shù)上,其硬件不具有擬人化的特征,例如日本早稻田大學(xué)曾經(jīng)研制過(guò)鋼琴演奏機(jī)器人,共有88臺(tái)擊鍵器和兩臺(tái)踏板驅(qū)動(dòng)裝置。二是采用硬編碼的方式,即將完整曲目進(jìn)行手工分析、每個(gè)曲譜分配給機(jī)械手相應(yīng)的部位(例如某一根手指)計(jì)算運(yùn)動(dòng)軌跡然后編碼。這種方式雖然在硬件上具有了擬人化的特性,但是任意兩個(gè)不同結(jié)構(gòu)的機(jī)械手之間即使是同一曲目的編碼也各不相同,無(wú)法實(shí)現(xiàn)歌曲編碼的復(fù)用。同時(shí)這兩種類控制系統(tǒng)對(duì)環(huán)境、樂(lè)器規(guī)格適應(yīng)性不強(qiáng),無(wú)法對(duì)未知曲目進(jìn)行自動(dòng)分析并演奏。
編寫符合軟件工程理念,能對(duì)未知曲譜擬進(jìn)行自動(dòng)分析的擬人機(jī)械手彈鋼琴控制軟件能提高機(jī)器人演奏的自動(dòng)程度和減少系統(tǒng)開(kāi)發(fā)的開(kāi)銷,在音樂(lè)機(jī)器人演奏方面的應(yīng)用前景十分廣闊。
1 彈鋼琴擬人機(jī)械手硬件結(jié)構(gòu)
機(jī)械手選用圓柱的手指外形,使得手指的強(qiáng)度增加,同時(shí)最大化的接近人手的比例,可以使機(jī)械手更加的靈活[2-4]。手指的連接處采用平滑的邊緣設(shè)計(jì),使得手指節(jié)在復(fù)位時(shí)限位在手指伸直的中心軸線上。
采用氣動(dòng)作為動(dòng)力源,氣動(dòng)作為驅(qū)動(dòng)具有體積小、結(jié)構(gòu)簡(jiǎn)單等優(yōu)點(diǎn)[5]。氣缸通過(guò)閘線進(jìn)行傳動(dòng),在機(jī)械手的上指節(jié)處連接,受力點(diǎn)在上指節(jié)并以連接銷為軸進(jìn)行運(yùn)動(dòng),使得機(jī)械手擁有人手骨骼與肌肉一樣的工作方式。整個(gè)氣動(dòng)回路連接氣缸固定在固定板上,在固定板上與閘線定位塊上的閘線穿孔進(jìn)行對(duì)心固定。整體裝配圖如圖1所示。
2 軟件總體設(shè)計(jì)
軟件使用C#語(yǔ)言編寫,總體分為四大部分,樂(lè)譜管理,音頻播放,操作界面以及串口通信,其中樂(lè)譜管理是軟件的核心,包括對(duì)樂(lè)譜的輸入與輸出,將樂(lè)譜處理成機(jī)械手可以識(shí)別的數(shù)據(jù)格式,并將彈奏過(guò)程以可視化的形式在軟件界面中仿真出來(lái)[6]。軟件總體框圖如圖2所示。
3 樂(lè)譜處理
使用樂(lè)譜的最終目的是在軟件可視化仿真時(shí)播放對(duì)應(yīng)的音頻,所以必須讓計(jì)算機(jī)的發(fā)聲設(shè)備能夠理解軟件發(fā)送的信號(hào),因此采用了MIDI(Musical Instrument Digital Interface)格式傳輸數(shù)據(jù)[7]。
3.1 軟件數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
整個(gè)軟件中使用的數(shù)據(jù)都是整數(shù)類型,且樂(lè)譜的播放是有序的,所以選擇數(shù)組作為數(shù)據(jù)結(jié)構(gòu)。具體的數(shù)據(jù)需求及處理如下:
3.1.1 當(dāng)前系統(tǒng)正在播放的音符
正在播放的音符使用MIDI音符編碼,但由于用戶輸入的樂(lè)譜格式和輸出的MIDI音符編碼方式不同,所以需要在內(nèi)部進(jìn)行轉(zhuǎn)換。鋼琴上的白色琴鍵依次對(duì)應(yīng)簡(jiǎn)譜中的1、2、3……,但在MIDI中對(duì)應(yīng)的編碼卻不是連續(xù)的,因?yàn)榇┎逶诎咨冁I中的黑色琴鍵也占用了MIDI中的發(fā)音序列??紤]到琴鍵的總數(shù)是有限的,所以在軟件中直接使用哈希表的形式將兩者的編碼建立映射。從中央C開(kāi)始白色琴鍵和其間的黑色琴鍵的MIDI編碼與用戶輸入編碼的部分映射語(yǔ)句如下:
Hashtable soundToMidiNote = new Hashtable();
soundToMidiNote.Add("1",60);
soundToMidiNote.Add("#1", 61);
soundToMidiNote.Add("2",62);
3.1.2 當(dāng)前音符在整首樂(lè)譜中所處的時(shí)間位置
第三方組件C# MIDI Toolkit提供了內(nèi)部時(shí)鐘用以計(jì)時(shí),并將其轉(zhuǎn)化成整數(shù)形式表示的時(shí)間位置,當(dāng)內(nèi)部時(shí)鐘與音符位置相同時(shí)產(chǎn)生一個(gè)發(fā)音事件。
3.1.3 當(dāng)前音符使用左手還是右手彈奏
3.1.4 當(dāng)前音符使用哪個(gè)手指彈奏
3.1.5 機(jī)械手需要移動(dòng)的距離
軟件播放音符時(shí),仿真界面下方的機(jī)械手也應(yīng)該隨著音符的改變而變化自身的位置,所以將音符和中央C之間的距離進(jìn)行映射。以中央C為距離0,一個(gè)白色琴鍵的寬度為單位1,黑色琴鍵的寬度為0.5,從中央C開(kāi)始連續(xù)7個(gè)白色琴鍵和其間的黑色琴鍵的距離映射代碼如下:
Hashtable soundToMidiDistance = new Hashtable();
soundToMidiNote.Add("1",0); soundToMidiNote.Add("#1", 0.5);
soundToMidiNote.Add("2",1);
因?yàn)橐陨显囟加脭?shù)字來(lái)表示,是相同的數(shù)據(jù)類型,并且每一個(gè)音符都包含上述元素信息且音符之間具有順序關(guān)系,所以采用二維數(shù)組作為軟件的數(shù)據(jù)結(jié)構(gòu)。數(shù)組的定義及初始化的代碼如下:
int[,] finAnalyse = new int[originaSound.Length, 5];
for (int i = 0; i < originaSound.Length; i++)
{ finAnalyse[i,0] = midiNoteSound[i];//音符
finAnalyse[i, 1] = 0;//時(shí)間(節(jié)拍計(jì)算)
finAnalyse[i, 2] = 0;//使用哪只手彈奏
finAnalyse[i, 3] = 0;//使用哪個(gè)手指彈奏
finAnalyse[i, 4] = 0;//機(jī)械手移動(dòng)距離 }
3.2 軟件算法設(shè)計(jì)
比較簡(jiǎn)單的算法是將琴鍵從正中分為兩部分,兩只機(jī)械手分別管轄這兩部分,依次循環(huán)數(shù)組中的曲譜,首先判斷曲譜屬于哪一大部分,在計(jì)算當(dāng)前機(jī)械手中哪個(gè)手指與當(dāng)前曲譜位置最近,驅(qū)動(dòng)機(jī)械手去彈奏。但這樣做會(huì)使機(jī)械手左右最邊上的手指使用頻繁,而樂(lè)譜不恰好落入當(dāng)前手掌范圍內(nèi)則很少用到處于中間的手指,并且限于機(jī)械手的性能,頻繁的位移會(huì)影響彈奏的流暢性。所以應(yīng)當(dāng)盡量減少移動(dòng)次數(shù),也就是應(yīng)該在一次機(jī)械手移動(dòng)的過(guò)程中盡可能的多彈奏音符。為了達(dá)到這個(gè)目的,為每個(gè)機(jī)械手定義一個(gè)存放所彈奏樂(lè)譜的序列,當(dāng)序列中最大音符與最小音符之差超出機(jī)械手能控制的彈奏范圍時(shí),即意味著機(jī)械手需要進(jìn)行移動(dòng)。循環(huán)處理所有音符,將每個(gè)音符放入距離較近的機(jī)械手的對(duì)應(yīng)樂(lè)譜序列中,每當(dāng)達(dá)到需要機(jī)械手進(jìn)行移動(dòng)的條件時(shí),確定下來(lái)機(jī)械手的位移距離,將樂(lè)譜序列清空,并將移動(dòng)后的機(jī)械手位置記錄下來(lái)。軟件流程圖如圖3所示:
4 軟件操作及仿真界面
整個(gè)軟件的界面分為數(shù)據(jù)的輸入及顯示區(qū)域,操作區(qū)域以及機(jī)械手演奏的仿真三個(gè)部分。當(dāng)樂(lè)譜播放時(shí),仿真界面會(huì)模擬機(jī)械手彈奏的過(guò)程,移動(dòng)機(jī)械手的位置,以深色顯示出曲譜對(duì)應(yīng)的琴鍵及當(dāng)前動(dòng)作的機(jī)械手的手指,同時(shí)將彈奏的樂(lè)譜播放出來(lái)。軟件界面如圖4所示。
5 結(jié)論
使用C#語(yǔ)言編寫了彈鋼琴擬人機(jī)械手控制軟件,軟件定義了樂(lè)譜的輸入與輸出格式,設(shè)計(jì)了算法對(duì)輸入的樂(lè)譜數(shù)據(jù)進(jìn)行識(shí)別與分析,將樂(lè)譜的彈奏任務(wù)智能分配給機(jī)械手。并將機(jī)械手運(yùn)動(dòng)的過(guò)程進(jìn)行了可視化仿真。實(shí)際應(yīng)用結(jié)果表明軟件操作界面友好靈活,仿真過(guò)程清晰易懂,達(dá)到了設(shè)計(jì)要求。
參考文獻(xiàn):
[1]蔡自興.機(jī)器人學(xué)[M].北京:清華大學(xué)出版社,2000.
[2]張邦成,譚海東,刑天羿,等.微小型救援機(jī)械手的輕量化設(shè)計(jì)[J].制造業(yè)自動(dòng)化,2014(15):129-132.
[3]龐在祥,宮麗男,姜大偉,等.基于CATIA/ADAMS仿人靈巧手建模與動(dòng)力學(xué)仿真[J].長(zhǎng)春工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2013,34(3):264-267.
[4]周慧明.關(guān)節(jié)型機(jī)械手的結(jié)構(gòu)創(chuàng)新設(shè)計(jì)[J].煤礦機(jī)械,2007,28(10):17-19.
[5]董立立,趙益萍,梁林泉,等.機(jī)械優(yōu)化設(shè)計(jì)理論方法研究綜述[J].機(jī)床與液壓,2010(8):114-119.
[6]張邦成,張玉玲,王占禮,等.汽車離合器從動(dòng)盤拖拽分離測(cè)試機(jī)軟件設(shè)計(jì)[J].機(jī)械設(shè)計(jì)與制造,2011(9):203-205.
[7]馮國(guó)杰,王吉軍.基于分層次聚類的MIDI音樂(lè)主旋律提取方法[J].計(jì)算機(jī)工程與應(yīng)用,2009,45(26):233-235.
基金項(xiàng)目:
吉林省教育廳“十二五”科學(xué)技術(shù)研究項(xiàng)目(2012110)。
作者簡(jiǎn)介:
王舒揚(yáng)(1983-),男,漢族,吉林長(zhǎng)春人,長(zhǎng)春工業(yè)大學(xué)講師,碩士,主要從事軟件應(yīng)用與虛擬現(xiàn)實(shí)方向研究。