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