計算機接口使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é)奏的音樂,從古典到搖滾;電磁鐵和驅(qū)動器在速度方面并沒有表現(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)體中的第一個entry表示當(dāng)前狀態(tài);第二個entry表示事件到達;第三個entry表示處理該事件需要使用狀態(tài)轉(zhuǎn)換功能;第四個entry表示下一狀態(tài)。
狀態(tài)機業(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)提供的事件是對這種功能的論證,根據(jù)當(dāng)前的狀態(tài)和事件,采取某種措施和改變系統(tǒng)狀態(tài)。事件的類型包括字節(jié)到達MIDI接口,字符到達控制端口和按下重啟按鈕(panic button)。所有經(jīng)驗豐富的MIDI玩家都知道重啟按鈕是保護耳朵和電源必備的特性——它可無條件地關(guān)閉所有電磁鐵,使系統(tǒng)恢復(fù)到已知安全狀態(tài)。
演奏WaldflOe
安裝了這種應(yīng)用精致的控制器, 機器人管風(fēng)琴手可演奏從狂想曲到搖滾的所有風(fēng)格音樂。隱藏在琴鍵底部的是電磁鐵木制背板——每塊板上安裝30個或更多的電磁鐵,同時還安裝了一些回收利用的罐狀電容器,為電磁鐵提供電能。我們將整個驅(qū)動器組件與管風(fēng)琴連接。在圖的上方,您可看到Spartan-3E入門套件開發(fā)板和其右側(cè)的接口萬用板;我們利用回收利用的CAT5電纜將這些裝置與驅(qū)動器組件連接。
用文字很難說明管風(fēng)琴的運行情況,因此,我建議您點擊本文結(jié)尾的互聯(lián)網(wǎng)鏈接地址,收看我們上傳的視頻。當(dāng)機器人管風(fēng)琴手演奏《月光奏鳴曲》或《Jump》時,您將會聽到電磁鐵發(fā)出的咔嗒聲——這是電磁鐵鐵芯降至線圈底部時發(fā)出的聲音,不是杠桿敲擊琴鍵的聲音。不過,您若是坐在大廳里,而不是站在講道臺上,電磁鐵發(fā)出的聲音就會小很多。您所能聽到的只是管風(fēng)琴流淌出的優(yōu)美音樂。
我們利用這套系統(tǒng)成功演奏了一些非常復(fù)雜、快節(jié)奏的音樂,從古典到搖滾;電磁鐵和驅(qū)動器在速度方面并沒有表現(xiàn)出太大的局限性。即使在彈奏要求最苛刻的曲目時,電磁鐵電源在15V電壓條件下通常電流不超過4A。即使我們稍微過度使用電磁鐵,電磁鐵線圈也沒有出現(xiàn)明顯升溫的情況??偠灾?,我們對這個系統(tǒng)非常滿意,同時為參與開發(fā)這套系統(tǒng)深感自豪。
WaldflOe下一步是什么?噢,我們已經(jīng)非正式地邀請了一些音樂家為這種新樂器創(chuàng)作曲目(尤其是對擁有53根手指、從不感到疲倦的演奏者感興趣的作曲家),我們還考慮舉辦一個獨奏會。另一種可能是實現(xiàn)管風(fēng)琴音栓運作的機械化,便于我們在電子演奏過程中改變音量和音色。我們還在考慮采取某些方法驅(qū)動管風(fēng)琴的低音踏板,使最長的低音管發(fā)音。最后也是最有可能完成的是,我們正打算在互聯(lián)網(wǎng)上推出一項服務(wù),使公眾能夠把他們的MIDI文件上傳至這個系統(tǒng),然后再聆聽管風(fēng)琴的實時演奏。
然后,我們會再次回到酒吧。
如欲觀看和收聽WaldflOe的演奏,敬請登錄:http://dorkbot.noodlefactory.co.uk/ wiki/WaldFlote。
評論