使用钢琴键盘作为电脑键盘
我有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可能是一种非常强大的技术 - 正如我在评论中提到的那样,这就是为什么普通速记员可以使用速记机跟上连续数小时谈话的人,甚至连顶级打字员也不会这样做。通过普通的打字机式键盘可以达到任意长度的时间。 和机器速记一样,你需要一个和弦和和弦序列的“词典”。 (你能告诉我曾经在机器速记的软件方面工作吗?)
要做到这一点,基本要点是:
为了与软件最广泛地兼容,您必须将其作为键盘设备驱动程序编写。 这是操作系统的一个插件,它可以作为键盘事件的来源,与底层硬件(在你的情况下,钢琴键盘)交谈。 对于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
笔划取决于您以前是否看过A
, B
,或者您是否刚刚开始。
还要注意的是(尽管上面非常小的样本没有显示),可能有多种方式来“播放”相同的单词或短语,而不仅仅是一个。 速记员会这样做,以便根据手的位置更轻松地从前一个字流到下一个字。 这里有一个明显的音乐比喻,你可以使用它来使你的打字流程更类似于播放音乐,以防止这种情况对你的钢琴演奏产生负面影响,并最大限度地提高实际上帮助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
应翻译为“字母”,而不是“阿尔法”和“蜜蜂”。 E
将是“未翻译的”。) 考虑在模拟usb(或ps / 2?)键盘的硬件中进行一些操作。 您将不再依赖于特定的操作系统或特定的OS API。 硬件解决方案将经受住时间的考验。 当别人正在运行Windows 11时,不要在Windows 7中使用旧的API卡住! Arduino很容易学习。
有大量的信息和帮助Arduino。 它是为新手建立的硬件黑客平台。 现在只有Google推动Arduino才会变得更大。
编辑:虚拟USB键盘软件和硬件
链接地址: http://www.djcxy.com/p/92973.html