我遇到了RSI问题,并尝试了30种不同的计算机键盘,这些都使我感到痛苦。弹钢琴不会使我痛苦。我已经弹钢琴大约20年了,没有任何痛苦的问题。我想知道是否可以从MIDI键盘捕获MIDI并输出键盘笔触。我对MIDI一无所知,但我希望获得有关如何将该信号转换为击键的指导。
我遇到了RSI问题,并尝试了30种不同的计算机键盘,这些都使我感到痛苦。弹钢琴不会使我痛苦。我已经弹钢琴大约20年了,没有任何痛苦的问题。我想知道是否可以从MIDI键盘捕获MIDI并输出键盘笔触。我对MIDI一无所知,但我希望获得有关如何将该信号转换为击键的指导。
Answers:
要获得全面的Midi支持(BASS)的.NET良好库,请访问http://www.un4seen.com。
对于另一部分,将键盘Midi音符转换为按键等,我将选择AutoItX,将ActiveX / COM和DLL接口转换为autoIt。信息和下载,请访问http://www.autoitscript.com/site/autoit/
无需编写键盘驱动程序。
几年来我没有做任何MIDI编程,但是您的基本想法非常合理(没有双关语)。
MIDI是“事件”(或“消息”)流,其中最基本的两个是“音符打开”和“音符关闭”,它们带有音符编号(0 = C在中间C下方五个八度,直到127 =在中间C上方的G上方的G五个八度音阶(半音)。这些事件在力度敏感(“触觉敏感”)的键盘上带有“力度”数字,力度(您猜对了)在0到127之间。
在速度,和弦与踏板之间,我认为您可以为钢琴键盘提供一个很好的“键入”界面。特别是和弦可能是一种非常强大的技术-正如我在评论中所提到的,这就是为什么普通档速记员可以使用定型打字机来跟上人们连续几个小时的谈话,而即使是顶级打字员也不会这样做。不能通过普通的打字机式键盘持续任何时间。与机器速记一样,您需要“和弦”以及和弦序列的“字典”。(您能告诉我以前在机器速记的软件方面工作吗?)
为此,基本部分是:
为了与软件最广泛地兼容,您必须将其编写为键盘设备驱动程序。这是操作系统的插件,可作为键盘事件的源,与基础硬件(在您的情况下为钢琴键盘)对话。对于Windows和Linux,您可能要为此使用C。
但是,由于您只是在生成击键(而不是试图拦截它们,这是我几年前试图做的),因此您可以使用操作系统具有的任何功能来发送人工击键。Windows有一个用于执行此操作的接口(可能是几个,我想到的是一个接口,SendInput
但是我知道有一些类似的“新闻”接口),而且我敢肯定其他操作系统也会这样做。对于您的目的而言,这可能就足够了–这就是我要开始的地方,因为设备驱动程序路线将很尴尬,并且您可能必须为此使用与Java不同的语言。(我是Java的忠实拥护者,但是操作系统通常使用C和类似的东西来使用它与设备驱动程序进行通信的接口。)
更新:有关击键和弦的“字典”的更多信息:
基本上,字典是我们使用最长前缀匹配进行搜索的特里(谢谢,@ Adam)。细节:
在机器速记中,速记员通过同时按下定型机上的多个键进行书写,然后释放所有键。他们称这为键盘的“笔触”。就像在钢琴上弹奏和弦一样。频繁(但不总是)的笔触对应于口语的音节。像音节一样,有时一个笔画(和弦)本身具有全部含义,而有时只有与后续的笔画结合才具有含义。(想想“好”与“好”,然后再说“再见”)。尽管他们会受到所学学校的严重影响,但每个速记员都会有自己的“字典”,以了解他们使用的笔法是什么意思,他们会在工作过程中不断完善自己的字典。词典中将包含速记部分(简称“ steno”)为一笔长或多笔长的条目。通常,会有几个条目具有相同的起始笔画,但它们的长度和后续笔画却有所不同。例如(在这里,我将不使用真正的Steno,仅使用占位符),可能存在以下条目:
A =阿尔法 A / B =字母 A / B / C =字母 空调=空调 B =蜜蜂 B / C =因为 C =海 D =狗 D / D =迪迪
(这些字母并不意味着是音符,只是抽象标记。)
请注意,这会A
开始多个条目,并且还要注意,C
笔画的翻译方式取决于您以前是否看到A
过B
,或重新开始。
还要注意(尽管在上面的非常小的示例中未显示),但是可能有多种方式来“播放”相同的单词或短语,而不仅仅是一种。速记员这样做是为了使其更容易从前一个单词流到下一个单词,具体取决于手的位置。那里有一个明显的音乐类比,您可以使用它来使您的打字流程更像是播放音乐,以防止这对您的钢琴演奏产生负面影响,并最大程度地提高实际使用RSI的可能性。
将Steno转换为标准文本时,我们再次使用“最长前缀匹配”搜索:翻译算法从有史以来的第一个笔画开始,然后查找从该笔画开始的条目。如果只有一个条目,并且有一个笔画长,那么我们可以可靠地说“这就是要使用的条目”,输出相应的文本,然后从下一个笔画重新开始。但更可能的是,该笔划开始了多个不同长度的条目。因此,我们查看下一个笔划,看看是否有按顺序从这两个笔划开始的条目。依此类推,直到我们得到比赛为止。
因此,使用上面的字典,假设我们看到了以下序列:
ACBBCABCABD
这是我们的翻译方式:
A
是三个长度不同的条目的开始;看下一个行程:C
A/C
仅匹配一个条目;输出“空调”并从下一个行程重新开始:B
B
开始两个条目;看下一个行程:B
B/B
什么也没开始 进行最长的前一场比赛(B
)并输出该结果(“ bee”)B
=“ bee”后,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
将是“ untranslate”。)考虑在硬件上做一些模拟USB(或ps / 2?)键盘的操作。您将不再依赖特定的操作系统或特定的操作系统API。硬件解决方案将经受住时间的考验。当其他所有人都在运行Windows 11时,不要在Windows 7中使用旧的API! Arduino很容易学习。
有大量的信息,可以为Arduino提供帮助。这是为新手打造的硬件黑客平台。现在,只有Google推出Arduino,它才会变得更大。
在我看来,您正在寻找有关如何自己构建此问题的建议,而更多地是在询问已经有哪些资源来实现您想要的目标。根据您的操作系统,有很多方法可以完成此操作,而不必从头开始编写自己的程序:
自由。对于Mac OS X 10.3及更高版本。此功能专门具有“能够将任何MIDI键盘用作完整的计算机键盘替代品”。
免费/明信片软件(有点奇怪)。对于Windows 2000及更高版本,以及Mac OSX。最初,它似乎更适合于AutoHotkey类型的用法,但从进一步的角度来看,我认为它可以很好地满足您的要求。
自由。对于Mac OSX。并非完全是一种“即用型”的解决方案,但是如果您对基本的设备配置感到满意,那么它应该还不错。
您可以使用MIDI DotNet中的.NET中的源代码示例访问硬件。
VB 5 / 6-Tipp 0521中提供了完整的工作示例,作为创建MIDI音符数据流的源代码:MIDI-Töneerzeugen(Visual Basic 6.0,也是.NET版本)
VB 5 / 6-Tipp 0155中提供了一种模拟键盘笔触的方法:Tastaturereignisse simulieren(Visual Basic 6.0,也是.NET版本)
在Tipp-Upload:VB.NET 0266:Globaler KeyHook中描述了识别按键。
然后,只需为钢琴演奏者使用一个良好的工作矩阵
在钢琴上,当您是一名出色的演奏家时,键盘上可以有10个手指,如果矩阵可用,您会比我认为的任何计算机键盘用户都快得多。:-)
在这种情况下,如果我理解您的问题是对的,那不应该是一件大事。
我在大学期间学习了钢琴演奏,然后进入了交互设计,编程和使用Vim的过程,因此我实际上花了很多时间来制作类似此类的原型。
通过使用针对多媒体艺术家的图形编程语言“ Pure Data ”以及Alex Andre外部的x11key,您可以在Linux中快速完成此工作。
在Mac上,您可以使用MidiStroke。我相信Windows上的一种方法涉及MidiOx和AutoHotKey工具。在另一个时间,我有一个使用Java插件的Max / MSP版本。我相信Patrice Colet为Pure Data制作了一个外部窗口,该窗口也可以正常工作,但是我似乎找不到它了。另外,MaxMSP的外部可以在Windows上执行此操作。最后,非免费但很棒的Osculator可以执行您想要的操作-请参见功能页面。
当我开始使用它时,我从不坚持使用它,因为我无法停止使用版面设计工具。不过,将显示器放在电子键盘上真是太酷了!祝好运。
您说自己“对MIDI一无所知”。一旦掌握了MIDI技术,它就相当简单了,但是一开始它可能会造成混淆。一本名为MIDI for Technophobe的书,对我理解MIDI的基础(如果您要对MIDI交互进行编程肯定是必要的)有极大帮助。这是一本容易阅读的书,非常有帮助。
根据我开发交互式多媒体的经验,我遇到了两个非常相似的程序,它们有助于连接和映射来自任何设备的信号/输入。
在Mac环境中为Max,在PC环境中为Pure Data。两者都有大量的在线文档和YouTube教程。视频Max / MSP教程1-使用计算机键盘作为Midikeyboard(坎顿风格),演示了Max内置的程序,该程序将计算机键盘映射到MIDI键盘的输入(基本上与您尝试做的相反)。通过使用相同的模式,但是反转信号/映射,您可以得到预期的结果。
AutoHotKey是Windows的免费开源实用程序,可让您将设备上的键和按钮重新映射到宏。它本身支持QWERTY键盘,操纵杆和鼠标宏。
但是,我能够找到支持您要查找的特定映射的实现。这两个线程说明了该过程:
AutoHotkey中的MIDI IN支持,用例的讨论。作者正在寻找一个程序,该程序可以检测MIDI IN输入并将其转换为按键。
MIDI输入库,解决作者问题的方法以及发布到AutoHotKey的代码/补丁,实际上可以实现您的预期结果。
基本上,AutoHotKey以及该用户的自定义补丁看起来将完全提供创建从MIDI键盘到QWERTY键盘的输入信号的映射所需的内容。您要做的就是安装,配置和定义映射。
通常,其他一些答案为您提供了有关MIDI和MIDI编程的更多信息,但正如您的帖子所述,这似乎并不是您所要的。如果可以的话,我想为您提供更多帮助,但是,如果您可以更详细地了解要查找的信息类型,将会更加容易。例如,您对如何将MIDI键盘的输入信号转换为QWERTY键盘的信号更感兴趣,还是对解决特定问题的现成解决方案感兴趣?您在寻找什么尚未解决?
您可以使用Teenys微控制器快速破解自己的USB键盘。
实际上,他们具有如何制作USB键盘的示例代码。
您可以采用以下两种方法:
买一架旧钢琴并直接将开关连接到未成年人
添加其他逻辑以连接到MIDI端口和必要的解码。
尝试Bome的MIDI转换器。
它跨平台工作,可以轻松地将任何MIDI输入转换为按键,快速设置和配置,并且免费供个人使用。
有一个教程,“ 快速提示:MIDI转换– MIDI到击键”,介绍如何轻松设置它:
基本上,您可以做的事有无限可能,包括和弦和修饰键。我将其用于现场音频设备,以使用钢琴控制DAW,但从未遇到过问题。
在Java中,可以使用JMF(Java Media框架)转换MIDI信号。键盘设计的基础很容易使用,即用户界面;并放置经常使用的字符/符号。
Java Sound Resources中的示例代码和API :示例:数字信号处理(DSP)帮助您了解如何处理信号。
更多参考:
从您的所有讨论中可以清楚地看出。从技术角度来看,您不想重新发明任何轮子。但是,一旦建立了连接(这个问题在问什么)并且正常工作,您仍然需要进行大部分工作:您必须训练自己的大脑。您还必须发明最聪明,最有效的方法来完成设计工作,而这完全是出于计算机技术专家的考虑。您或我们中的任何一个都将无法实现。
幸运的是,这个问题已经解决并经过了数百年的成熟磨练。
学习速记!
是的,这会使您背上一些插孔。但是,您自己花费的数百小时可算是值得的结果呢?此外,速记维基百科上的文章说,“它看起来更像是钢琴键盘”。
除非,当然,除非您想进行边秀效果。我不得不承认,我从来没有想过这种可能性,看到有人从钢琴键盘上敲出一段文字真的很有趣!
您可以从带有触摸板的USB键盘开始(或者指点杆更符合人体工程学?),使用Plover对其进行翻译(我相信可以将其配置为让非字母键保留其功能,因为它们对于编程),或者按照线程Re:Plover键盘滚动自己的USB速记键盘,或者购买定型器。
祝好运!
pthread
?
为了解决这个问题,您将需要做一些事情:
一种从键盘捕获MIDI数据的方法。取决于接口:MIDI接口(经典)或USB MIDI接口(现代),最可能的接口是计算机,因为它提供了最多的选项。USB主机微控制器并不像仅使用计算机那样简单。
一种将MIDI数据转换为击键的方案。就像一个用户指出的那样,和弦是必经之路,因为琴键的数量将不取决于钢琴琴键的数量。
一种将密钥注入操作系统的方法。这将需要底层驱动程序来确保准确性。我玩过将Windows和Windows 7中的键盘和鼠标数据注入到应用程序中的应用程序,它可能很不稳定,并取决于当前是否关注某个应用程序。这是界面中最难的部分。可行的是创建一个也具有串行接口的HID USB键盘微控制器。
串行接口将创建一个虚拟串行端口。读取MIDI数据并产生击键的软件可以将串行消息发送到虚拟串行端口。微控制器会发送一个按键,因此看起来像是标准键盘输入。这将允许连接MIDI端口和USB MIDI键盘。
嗯,使用这种类型的界面,您还可以模拟鼠标并为鼠标轴和按钮使用一些钢琴键设置。压力可用于确定鼠标指针速度。因此,您也可以消除鼠标。这种方法的另一个好处是,您连接的任何类型的输入设备都可以与虚拟串行端口对话以产生键盘和鼠标事件。因此,如果您想添加其他硬件,例如鼓踏板或操纵杆,则需要调整与串行接口通信的程序。
上面的另一种用法类似于上面发布的一些使用Arduino的用法,但是还包括Sparkfun的USB Host Shield,用于处理基于USB的音乐键盘。这允许将Arduino编程为引导加载程序芯片中的键盘或键盘鼠标组合,并允许该设备充当基于USB的音乐键盘的USB主机。然后,您将同时获得这两种类型的信息。虽然,我仍然认为虚拟串行端口方法更灵活,从长远来看更容易编程。与台式机程序或服务相比,Arduino设备更难更改。
还有另一种可能性:和弦单手键盘已经存在。我看过其中的视频,但您必须确定这些视频是否伤害了您的手。
使用.NET DirectSound接口之类的东西连接到MIDI设备应该相当容易。您将需要识别目标MIDI设备,然后获取代码以侦听传入的消息(有关如何通过Google进行此操作的文章)。
由于您将MIDI用作键盘,因此基本上只需要检测两条MIDI消息,即音符打开和音符关闭。MIDI消息是三个数据字节,用于指定命令,音符和力度。音符只是音符编号(有时“不良” MIDI堆栈会以零速度发送音符,这也是您所期望的)。
消息翻译完成后,.NET的键盘输出应该非常简单。
在其他答案中,有很多关于技术方面的建议;我只是想让您了解实际的MIDI消息。祝好运!
通过声卡将任何外接MIDI键盘用作控制器,您将获得更好,更快乐的结果(无论您要使用哪种操作系统和/或DAW程序)。然后将其路由到您的GB软件(或其他任何软件)中,并且音调会实时生成它们以这种方式为您提供的多种声音。
如果您的声卡不支持MIDI I / O(输入/输出/通过),那不是问题。您可以考虑研究和投资于外部MIDI台式转换器。许多设备可以将MIDI输出进一步转换为USB 2.0(完全绕过现有的声卡)。
例如:使用计算机键盘和铅笔工具通过Z和X更改键选项来获得“类似人”的宽限音结果非常困难。相反,当您自己的手指可以立即使用MIDI键盘从其自身的物理八度寄存器范围进行弹奏时!
我意识到可能会涉及预算限制。但是,其中一些看似便宜的“ Casio”类型5八度键盘在Radio Shack出售的价格低于100.00美元(*或更少),是您所需要的(此外,它们的一些板载声音补丁和音序器模块的声音和处理能力也是如此)对于其他事物也非常好)。
至于现有声卡的外部MIDI转换器,我专门针对Mac平台,对您进行了以下Google搜索:
起初,许多此类外部MIDI转换信息可能对您来说很麻烦,因此出于您的考虑和预算考虑,我将其更细分为“用户友好”:
使用DAW时,将虚拟键盘作为VST进行推广并没有错。他们有自己的位置。
但是,您听起来像个熟练的键盘手。那么,为什么不考虑我刚才提到的外部MIDI转换/键盘选项呢?
祝您好运,我希望这能给您一些可以并且会为您服务的想法!
如果您不想自己进行任何编程,而只是想解决问题,则可以购买USB-MIDI-键盘,在其中您可以重新分配任何键来发送QWERTY键盘输出信号,而不是MIDI输出,例如M-Audio Axiom Pro示例
由于MIDI键盘会将自己标识为标准QWERTY键盘,因此该方法适用于任何支持标准USB键盘的操作系统和计算机。
如果您知道使用Java进行编码,则可以使用以下方式:
首先,javax.sound.midi.Receiver
使用send(..)
将“ Note on”事件映射到所需击键的方法来实现。
您将需要获取MidiMessage的内容及其getMessage
方法,并以自己的方式对其进行解释。信息字节的含义可以在MIDI信息中找到。
在收到某个键盘键的“ note on”或“ note off”之后,您可以通过为它分配KeyEvent类的常量(例如C#4-> KeyEvent.VK_A等)将其映射到所需的键。 。然后,java.awt.Robot
的keyPress和keyRelease方法可以使用此键代码将击键实际发送到OS,从而发送到其他应用程序。
我同意Brian O'Dell的回答-如果这是我的项目,那么我将在硬件中完成。它具有平台和硬件独立的优势-您的设备取代了对MIDI-USB接口和PC API的需求。
mbed是一个快速原型开发平台,非常易于学习,并且比Arduino IMHO(在线编译器,512 KB闪存,96 MHz,C ++语言)具有多个优势。它具有为您预先编写的USB键盘接口和USB Midi接口。
该社区非常友好并且乐于提供帮助,并且有许多现有项目同时使用MIDI和USB隐藏仿真-在Youtube中搜索“ mbed MIDI”或类似内容。
这不会太难。
我假设您使用的是Windows,不过不确定。我已经用普通的C ++编写了MIDI音序器http://pianocheetah.com,它可以让您使用钢琴键盘运行命令。没有任何理由您不能做同样的事情将按键推入键盘输入流。
但是,现在就来。您还记得一开始学习键盘花了多长时间,对吗?您愿意再经历一次吗?您是否愿意用一堆愚蠢的按键符号来污染您的祝福键盘?
您将需要至少使用26个字母,10个数字,11个标点和至少12个功能键及其转换状态。因此,这是60个键加上已转换的状态。这将耗尽整个八度的键。您将要进行钢琴“跳跃” = all =时间。告别触摸输入。
您可以从RSI中解脱出来,但是您还为自己创建了另一种类型的噩梦。
祝您好运,老板可以在工作时为您购买MIDI键盘。
如果您学会了真正弹钢琴,那么您就学会了弹奏无压力。在QWERTY键盘上执行此操作。不用紧张 开始慢。