计算机接口使19世纪管风琴自行弹奏
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},
};
我们成功演奏了一些非常复杂、快节奏的音乐,从古典到摇滚;电磁铁和驱动器在速度方面并没有表现出太大的局限性。
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},
};
在该结构体中的第一个entry表示当前状态;第二个entry表示事件到达;第三个entry表示处理该事件需要使用状态转换功能;第四个entry表示下一状态。
状态机业务端采用的代码如下:
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();
}
事件循环提供的事件是对这种功能的论证,根据当前的状态和事件,采取某种措施和改变系统状态。事件的类型包括字节到达MIDI接口,字符到达控制端口和按下重启按钮(panic button)。所有经验丰富的MIDI玩家都知道重启按钮是保护耳朵和电源必备的特性——它可无条件地关闭所有电磁铁,使系统恢复到已知安全状态。
演奏WaldflOe
安装了这种应用精致的控制器, 机器人管风琴手可演奏从狂想曲到摇滚的所有风格音乐。隐藏在琴键底部的是电磁铁木制背板——每块板上安装30个或更多的电磁铁,同时还安装了一些回收利用的罐状电容器,为电磁铁提供电能。我们将整个驱动器组件与管风琴连接。在图的上方,您可看到Spartan-3E入门套件开发板和其右侧的接口万用板;我们利用回收利用的CAT5电缆将这些装置与驱动器组件连接。
用文字很难说明管风琴的运行情况,因此,我建议您点击本文结尾的互联网链接地址,收看我们上传的视频。当机器人管风琴手演奏《月光奏鸣曲》或《Jump》时,您将会听到电磁铁发出的咔嗒声——这是电磁铁铁芯降至线圈底部时发出的声音,不是杠杆敲击琴键的声音。不过,您若是坐在大厅里,而不是站在讲道台上,电磁铁发出的声音就会小很多。您所能听到的只是管风琴流淌出的优美音乐。
我们利用这套系统成功演奏了一些非常复杂、快节奏的音乐,从古典到摇滚;电磁铁和驱动器在速度方面并没有表现出太大的局限性。即使在弹奏要求最苛刻的曲目时,电磁铁电源在15V电压条件下通常电流不超过4A。即使我们稍微过度使用电磁铁,电磁铁线圈也没有出现明显升温的情况。总而言之,我们对这个系统非常满意,同时为参与开发这套系统深感自豪。
WaldflOe下一步是什么?噢,我们已经非正式地邀请了一些音乐家为这种新乐器创作曲目(尤其是对拥有53根手指、从不感到疲倦的演奏者感兴趣的作曲家),我们还考虑举办一个独奏会。另一种可能是实现管风琴音栓运作的机械化,便于我们在电子演奏过程中改变音量和音色。我们还在考虑采取某些方法驱动管风琴的低音踏板,使最长的低音管发音。最后也是最有可能完成的是,我们正打算在互联网上推出一项服务,使公众能够把他们的MIDI文件上传至这个系统,然后再聆听管风琴的实时演奏。
然后,我们会再次回到酒吧。
如欲观看和收听WaldflOe的演奏,敬请登录:http://dorkbot.noodlefactory.co.uk/ wiki/WaldFlote。
评论