計(jì)算機(jī)接口使19世紀(jì)管風(fēng)琴自行彈奏
const midi_state_table_entry_t MIDI_STATE_TABLE[] =
{
{INHIBITED,PANIC,
MidiSM_Panic,INHIBITED},
{ANY_STATE,PANIC,
MidiSM_Panic,INIT},
{ANY_STATE,INHIBIT,
MidiSM_DoNothing,INHIBITED},
{ANY_STATE,OTHER_STATUS_RECEIVED,MidiSM_ClearMessage,INIT},
{INIT,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte,NOTE_ON_OR_OFF},
{INIT,DATA_RECEIVED,
MidiSM_DoNothing,INIT},
{NOTE_ON_OR_OFF,NOTE_ON_OR_OFF_RECEIVED, MidiSM_StoreStatusByte,NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF,DATA_RECEIVED, MidiSM_StoreNoteNumber,NOTE_ON_OR_OFF_NUMBER},
{NOTE_ON_OR_OFF_NUMBER,NOTE_ON_OR_OFF_RECEIVED, MidiSM_StoreStatusByte, NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF_NUMBER,DATA_RECEIVED, MidiSM_NoteOnOrOffComplete,NOTE_ON_OR_OFF},
{INHIBITED,ENABLE,
MidiSM_DoNothing,INIT},
{LAST_STATE, LAST_EVENT, 0,LAST_STATE},
};
我們成功演奏了一些非常復(fù)雜、快節(jié)奏的音樂(lè),從古典到搖滾;電磁鐵和驅(qū)動(dòng)器在速度方面并沒(méi)有表現(xiàn)出太大的局限性。
StoreStatusByte,NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF,DATA_RECEIVED,
MidiSM_StoreNoteNumber,NOTE_ON_OR_OFF_NUMBER},
{NOTE_ON_OR_OFF_NUMBER,
NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte, NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF_NUMBER,
DATA_RECEIVED,MidiSM
_NoteOnOrOffComplete,
NOTE_ON_OR_OFF},
{INHIBITED,ENABLE,
MidiSM_DoNothing,INIT},
{LAST_STATE, LAST_EVENT, 0,
LAST_STATE},
};
在該結(jié)構(gòu)體中的第一個(gè)entry表示當(dāng)前狀態(tài);第二個(gè)entry表示事件到達(dá);第三個(gè)entry表示處理該事件需要使用狀態(tài)轉(zhuǎn)換功能;第四個(gè)entry表示下一狀態(tài)。
狀態(tài)機(jī)業(yè)務(wù)端采用的代碼如下:
XStatus MidiSM_
DoStateTransition
(midi_state_machine_t *pInstance,
u8 event)
{
const midi_state_table_
entry_t *pTable = pInstance-
>pStateTable;
// Search for a match in the
state table
do {
if ((event == pTable-
>received_event)
((pInstance-
>current_state == pTable-
>state)
|| (pTable->state ==
ANY_STATE)))
{
(*pTable-
>transition_function)((v
oid *)pInstance);
pInstance->current_state
= pTable->next_state;
return XST_
SUCCESS;
}
pTable++;
} while (pTable->state !=
LAST_STATE);
// Aaargh, something bad happened - should never get here
XASSERT_NONVOID_ALWAYS();
}
事件循環(huán)提供的事件是對(duì)這種功能的論證,根據(jù)當(dāng)前的狀態(tài)和事件,采取某種措施和改變系統(tǒng)狀態(tài)。事件的類型包括字節(jié)到達(dá)MIDI接口,字符到達(dá)控制端口和按下重啟按鈕(panic button)。所有經(jīng)驗(yàn)豐富的MIDI玩家都知道重啟按鈕是保護(hù)耳朵和電源必備的特性——它可無(wú)條件地關(guān)閉所有電磁鐵,使系統(tǒng)恢復(fù)到已知安全狀態(tài)。
演奏WaldflOe
安裝了這種應(yīng)用精致的控制器, 機(jī)器人管風(fēng)琴手可演奏從狂想曲到搖滾的所有風(fēng)格音樂(lè)。隱藏在琴鍵底部的是電磁鐵木制背板——每塊板上安裝30個(gè)或更多的電磁鐵,同時(shí)還安裝了一些回收利用的罐狀電容器,為電磁鐵提供電能。我們將整個(gè)驅(qū)動(dòng)器組件與管風(fēng)琴連接。在圖的上方,您可看到Spartan-3E入門套件開(kāi)發(fā)板和其右側(cè)的接口萬(wàn)用板;我們利用回收利用的CAT5電纜將這些裝置與驅(qū)動(dòng)器組件連接。
用文字很難說(shuō)明管風(fēng)琴的運(yùn)行情況,因此,我建議您點(diǎn)擊本文結(jié)尾的互聯(lián)網(wǎng)鏈接地址,收看我們上傳的視頻。當(dāng)機(jī)器人管風(fēng)琴手演奏《月光奏鳴曲》或《Jump》時(shí),您將會(huì)聽(tīng)到電磁鐵發(fā)出的咔嗒聲——這是電磁鐵鐵芯降至線圈底部時(shí)發(fā)出的聲音,不是杠桿敲擊琴鍵的聲音。不過(guò),您若是坐在大廳里,而不是站在講道臺(tái)上,電磁鐵發(fā)出的聲音就會(huì)小很多。您所能聽(tīng)到的只是管風(fēng)琴流淌出的優(yōu)美音樂(lè)。
我們利用這套系統(tǒng)成功演奏了一些非常復(fù)雜、快節(jié)奏的音樂(lè),從古典到搖滾;電磁鐵和驅(qū)動(dòng)器在速度方面并沒(méi)有表現(xiàn)出太大的局限性。即使在彈奏要求最苛刻的曲目時(shí),電磁鐵電源在15V電壓條件下通常電流不超過(guò)4A。即使我們稍微過(guò)度使用電磁鐵,電磁鐵線圈也沒(méi)有出現(xiàn)明顯升溫的情況??偠灾覀儗?duì)這個(gè)系統(tǒng)非常滿意,同時(shí)為參與開(kāi)發(fā)這套系統(tǒng)深感自豪。
WaldflOe下一步是什么?噢,我們已經(jīng)非正式地邀請(qǐng)了一些音樂(lè)家為這種新樂(lè)器創(chuàng)作曲目(尤其是對(duì)擁有53根手指、從不感到疲倦的演奏者感興趣的作曲家),我們還考慮舉辦一個(gè)獨(dú)奏會(huì)。另一種可能是實(shí)現(xiàn)管風(fēng)琴音栓運(yùn)作的機(jī)械化,便于我們?cè)陔娮友葑噙^(guò)程中改變音量和音色。我們還在考慮采取某些方法驅(qū)動(dòng)管風(fēng)琴的低音踏板,使最長(zhǎng)的低音管發(fā)音。最后也是最有可能完成的是,我們正打算在互聯(lián)網(wǎng)上推出一項(xiàng)服務(wù),使公眾能夠把他們的MIDI文件上傳至這個(gè)系統(tǒng),然后再聆聽(tīng)管風(fēng)琴的實(shí)時(shí)演奏。
然后,我們會(huì)再次回到酒吧。
如欲觀看和收聽(tīng)WaldflOe的演奏,敬請(qǐng)登錄:http://dorkbot.noodlefactory.co.uk/ wiki/WaldFlote。
評(píng)論