使用钢琴键盘作为电脑键盘

我有RSI问题,并尝试了30种不同的电脑键盘,这些都让我感到痛苦。 弹钢琴不会让我感到痛苦。 我已经弹了大约20年的钢琴,没有任何疼痛问题。 我想知道是否有方法从MIDI键盘捕捉MIDI并输出键盘笔画。 我对MIDI一无所知,但我希望得到关于如何将此信号转换为按键的指导。


在.NET中有完整的midi支持(BASS)的好库,请访问http://www.un4seen.com。

另一方面,将键盘midi音符转换为键和更多,我会选择AutoItX,即ActiveX / COM和DLL接口autoIt。 信息和下载,请访问http://www.autoitscript.com/site/autoit/

无需编写键盘驱动程序。


多年来我没有做过任何MIDI编程,但您的基本想法非常合理(无双关)。

MIDI是“事件”(或“消息”)的流,其中最重要的两个是“音符”和“音符关”,它们带有音符编号(0 = C低于中间C五个八度音阶,通过127 = G五个八度以上G以上的中间C,半音)。 这些事件在速度敏感的键盘(“触摸敏感”)上带有一个“速度”数字,其中(你猜对它)的力度介于0到127之间。

在速度,和弦和踏板之间,我想你可以为钢琴键盘提供一个很好的“打字”界面。 特别是Chording可能是一种非常强大的技术 - 正如我在评论中提到的那样,这就是为什么普通速记员可以使用速记机跟上连续数小时谈话的人,甚至连顶级打字员也不会这样做。通过普通的打字机式键盘可以达到任意长度的时间。 和机器速记一样,你需要一个和弦和和弦序列的“词典”。 (你能告诉我曾经在机器速记的软件方面工作吗?)

要做到这一点,基本要点是:

  • 接收MIDI输入。 不要试图自己做这个,使用一个库。 编辑 :显然,Java Sound API支持MIDI,包括从MIDI控制器接收事件。 凉。 此页面可能也有用。
  • 将该数据转换为您想要发送的键击,例如通过上面提到的词典。
  • 将击键输出到计算机。
  • 为了与软件最广泛地兼容,您必须将其作为键盘设备驱动程序编写。 这是操作系统的一个插件,它可以作为键盘事件的来源,与底层硬件(在你的情况下,钢琴键盘)交谈。 对于Windows和Linux,你可能会想为此使用C语言。

    但是,由于您只是生成击键(而不是试图拦截它们,我多年前正在尝试这些操作),所以您可能可以使用操作系统发送人工击键的任何功能。 Windows有一个接口可以做到这一点(可能有几个,我想到的是SendInput但我知道有一些类似的“日志”界面),我相信其他操作系统也是如此。 这对于你的目的来说可能就足够了 - 这是我开始的地方,因为设备驱动程序的路由将会很尴尬,你可能不得不为Java使用不同的语言。 (我是Java的忠实粉丝,但操作系统用于与设备驱动程序交谈的接口往往更容易通过C和类似的方式消耗)。


    更新 :更多关于和弦到键盘的“词典”:

    基本上,字典是我们用最长前缀匹配搜索的trie(感谢,@Adam)。 细节:

    在机器速记中,速记员同时按下滑轮机上的多个键,然后释放它们。 他们称这是键盘的“中风”; 这就像在钢琴上弹奏和弦一样。 笔画经常(但不总是)对应于口语的音节。 像音节一样,有时一个笔画(和弦)的意义都是独立的,其他时候它只有和下面的笔画结合的意思。 (认为​​“好”与“良好”之后是“再见”)。 虽然他们会受到他们学习的学校的深刻影响,但每个速记员都会有自己的“词典”,用来表示他们将在工作生涯中不断磨练的词典。 该词典将具有其中速记部分(简称“steno”)长度为一个笔划或多个笔划长度的条目。 通常,会有几个具有相同起始行程的记录,这些记录通过其长度和随后的行程来区分。 例如(我不会在这里使用真正的steno,只是占位符),可能会有这些条目:

    A     = alpha
    A/B   = alphabet
    A/B/C = alphabetic
    A/C   = air conditioning
    B     = bee
    B/C   = because
    C     = sea
    D     = dog
    D/D   = Dee Dee

    (这些字母不是音符,只是抽象的标记。)

    请注意, A启动多个条目,同时请注意,您如何翻译C笔划取决于您以前是否看过AB ,或者您是否刚刚开始。

    还要注意的是(尽管上面非常小的样本没有显示),可能有多种方式来“播放”相同的单词或短语,而不仅仅是一个。 速记员会这样做,以便根据手的位置更轻松地从前一个字流到下一个字。 这里有一个明显的音乐比喻,你可以使用它来使你的打字流程更类似于播放音乐,以防止这种情况对你的钢琴演奏产生负面影响,并最大限度地提高实际上帮助RSI的可能性。

    在将steno翻译成标准文本时,我们再次使用“最长前缀匹配”搜索:翻译算法从写入的第一笔画开始,查找以该笔画开始的项目。 如果只有一个条目,并且它只有一个笔画长度,那么我们可以可靠地说出“这是使用条目”,输出相应的文本,然后从下一个笔划开始。 但更可能的是,该笔画开始多个不同长度的输入。 所以我们看下一个笔画,看看是否有以这两个笔画开头的条目; 等等,直到我们得到一场比赛。

    因此,对于上面的字典,假设我们看到了这个序列:

    A C B B C A B C A B D

    以下是我们如何翻译它的方法:

  • A是不同长度的三个条目的开始; 看下一笔: C
  • A/C只匹配一个条目; 输出“空调”,然后用下一笔新鲜开始: B
  • B开始两个条目; 看下一笔: B
  • B/B不启动任何事情; 取最长的前一场比赛( B )并输出(“蜜蜂”)
  • 输出B =“蜜蜂”后,我们的缓冲区仍然有一个B笔划。 它开始两个条目,所以看下一个笔画: C
  • B/C匹配一个条目; 输出“因为”,并开始新的下一笔划: A
  • A开始三项; 看下一个笔画: B
  • A/B开始两个条目; 看下一个笔画: C
  • A/B/C只能匹配一个条目; 输出“字母”并从下一笔画开始新鲜: A
  • A开始三项; 看下一笔: B
  • A/B开始两个条目; 看下一笔: D
  • A/B/D不匹配任何内容,因此请采用最早的匹配( A/B )并使用它输出“字母”。 这给我们留下了D仍然在缓冲区中。
  • D开始两个入口,所以我们通常会看下一个笔画 - 但是我们已经处理了所有的笔画,所以要单独考虑它。 孤立地说,它翻译为“狗”,以便输出。
  • 以上要注意的方面:

  • 你有一个你已经阅读但尚未翻译的笔画缓冲区。
  • 你总是希望匹配最多的笔画和单个条目。 A/B应翻译为“字母”,而不是“阿尔法”和“蜜蜂”。
  • (上面没有显示)你可能有不能翻译的笔画序列,因为它们与字典中的任何内容都不匹配。 (Steno人使用名词“untranslate” - 例如,与我们的字典一样,笔画E将是“未翻译的”。)
  • (以上未显示)有些steno理论允许同一套笔画根据更广泛的上下文来表示不止一件事。 斯泰诺人称之为“冲突”。 你可能想要在你的项目中禁止他们,事实上,当速记人员曾经被速记员手动翻译时,冲突是没有问题的,因为他们只知道在句子的哪个部分他们是正确的选择,但随着崛起的机器翻译,steno无冲突理论专门出现,以避免必须经过翻译后的文本和“修复”冲突。
  • 实时翻译(您会这样做)意味着如果您收到部分匹配,您需要在等待下一个和弦时保持它 - 但可能只是暂停,在此时间点尽可能地翻译缓冲区中的内容。 (或者,也许你不想要暂停,这是你的电话。)
  • 可能最好有一个说“无视先前中风”的中风
  • 可能最好有一个描述“完全清除缓冲区而不输出任何内容”

  • 考虑在模拟usb(或ps / 2?)键盘的硬件中进行一些操作。 您将不再依赖于特定的操作系统或特定的OS API。 硬件解决方案将经受住时间的考验。 当别人正在运行Windows 11时,不要在Windows 7中使用旧的API卡住! Arduino很容易学习。

  • Arduino MIDI硬件可从现货供应
  • Arduinos已被用来模拟键盘设备
  • 有大量的信息和帮助Arduino。 它是为新手建立的硬件黑客平台。 现在只有Google推动Arduino才会变得更大。

    编辑:虚拟USB键盘软件和硬件

    链接地址: http://www.djcxy.com/p/92973.html

    上一篇: Using a piano keyboard as a computer keyboard

    下一篇: Forcing the Soft Keyboard open