我如何将DK手鼓变成键盘

您可能已经知道DK BONGOS是为“驴KONGA 1/2”和“ DK JUNGLE BEAT”制成的特殊GAMECUBE控制器。

如果您想知道为什么我要全部写大写字母,那是因为我使用DK Bongos编写了它,而我目前不支持小写字母。 如果您想知道为什么我花了30分钟使用邦戈鼓输入一个句子,那是因为当您决定花一分钟时间阅读有关使用Nintendo邦戈鼓主题控制器作为键盘时,这可能是您对我的自虐程度。 因此,如果您碰巧在Twitter上关注我,您可能已经看过我的音乐键盘,并使用它输入了此x3速度30秒的剪辑:

当然,这有点简化,但是或多或少地显示了一切的交流方式。

Mayflash gamecube适配器具有“ PC”模式,该模式不是使用任天堂Wii U的gamecube适配器的通信方式,而是允许您将其用作HID适配器。 如果您不熟悉HID,则是用于用户输入的一类USB设备(未缩写的HID是“人机接口设备”)。 它用于从键盘到控制器的所有操作。 通信的基本方式称为“轮询”,它基本上是经常检查控制器的状态。 对于这个项目,我使用了C#的HID库,我发现它运行良好(我唯一的问题是示例代码不断轮询控制器并耗尽了所有CPU,因此您必须告诉它慢一点) 。 一旦理解,该过程将非常简单,并且可以分为以下几个步骤:

  1. 通过查找Mayflash适配器的供应商ID和产品ID(供应商ID为0x0079,产品ID为0x1844)来检查控制器是否已插入,如果是,则通过HID库打开设备并设置事件发生时间。插入和删除。
  2. 插入时(如果正确插入,应立即发生),它将运行相应的事件。 所有这些操作是记录控制器连接到控制台的日志,然后告诉控制器从控制器轮询消息,并在收到消息时运行OnReport事件。
  3. 每次轮询控制器时,它都会收到一条消息,对其进行分析以找出相应的按钮按下麦克风电平。 (我还检查了邦戈鼓是否已插入,以便在未正确连接端口的情况下打印消息)。

消息解析有些棘手,尤其是因为我之前对它还不熟悉,所以我只是在按下按钮以弄清楚消息时才将消息打印到控制台。 当我不按住任何按钮而鼓掌时的一些示例消息如下:

因此,一些值得注意的功能:

  • 无论您按什么按钮,FFFF都是常数,但是如果您没有插入控制器,则FFFF是0000,这是一种简单的方法来判断小鼓是否在正确的端口中。
  • 第八个字节(从0A开始,升至6F,然后缓慢回到0A)是麦克风检测到的音量,我只是检查它是否高于所需的阈值(我使用了0x40,但有时我仍然无法拍到足够大的音量) ,只是将其用作猜测,以便为比我的6F安静的拍手留出一些摆动的空间。

对于按钮,它只是布局的位字段的前2个字节:

 字节1: 
  1位—右上方按钮 
  2位—右下角按钮 
  4位-左下按钮 
  8位—左上方按钮 
 字节2: 
  2位—“开始”按钮 

因此,例如,如果我仅按住右上角的按钮,它可能看起来像这样:

  010000FFFF00000A08 

如果我同时按住左上角和左下角,它将看起来像:

  0C0000FFFF00000A08 

解析输入后,我将它们与最后一帧进行比较,以查看这是否是按下按钮的第一帧,因为我不想按住一个按钮(否则天堂禁止将按钮多次轮询!)多次输入。 如果您不同意取消按住按钮多次操作的功能,请随时向我发一条推文,向您显示一个节拍,让您使我只按住小鼓,那我可不是一个会误导我的异教徒邦戈键盘,所以请把“智能设计”带到别处。 最后,我有将这些输入转换为按键的逻辑,其中大多数并不是很特殊。 按键代码非常简单:

我“循环”浏览字符的方式本质上是按退格键并同时键入新字符。