使用钢琴键盘作为电脑键盘[关闭]

Posted

技术标签:

【中文标题】使用钢琴键盘作为电脑键盘[关闭]【英文标题】:Using a piano keyboard as a computer keyboard [closed] 【发布时间】:2011-08-21 03:31:59 【问题描述】:

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

【问题讨论】:

如果可以使用合成器键盘作为键盘,为什么要捕获midi? @I__:你需要支持什么操作系统?这可能很重要。 @shevski:我不想做任何事情,@I__ 是提出问题的人。他/她不是要转换声音,而是要转换电子键盘通过Musical Instrument Digital Interface 发送的数字键盘事件信号。这些非常类似于计算机键盘事件:“Note on”很好地对应于 keydown,“note off”对应于 keyup,等等。您甚至可以使用力度数据来执行不同的操作,具体取决于演奏和弦的“响亮”程度。我喜欢这个主意。 如果你让它工作,你可以使用任何类型的midi设备编码。这可能需要一些练习,但使用管弦乐队作为开发团队应该很有趣。 @I__:most upvoted answer 指向 Java 声音 API 的 MIDI 支持,它应该可以让您接收 MIDI 数据,并详细描述了将其转化为一系列击键所涉及的理论。 second most upvoted answer 讨论了一种非常可行的方法,然后您可以使用 Arduino 将其连接到计算机,包括... (续) 【参考方案1】:

我已经很多年没有做过任何 MIDI 编程了,但是你的基本想法非常合理(没有双关语)。

MIDI 是一个“事件”(或“消息”)流,其中最基本的两个是“音符开”和“音符关”,它们带有音符编号(0 = C 中间 C 以下五个八度,到 127 = G 比 G 高出中间 C 五个八度,以半音为单位)。这些事件在对速度敏感(“触敏”)的键盘上带有一个“速度”数字,其力度(您猜对了)在 0 到 127 之间。

在力度、和弦和踏板之间,我认为您可以为钢琴键盘设计一个相当不错的“打字”界面。尤其是和弦可能是一种非常强大的技术——正如我在 cmets 中提到的,这就是为什么普通速记员可以使用stenotype machine 来跟上人们连续几个小时的谈话,而即使是***打字员也不会无法通过普通打字机式键盘长时间使用。与机器速记一样,您需要一本关于和弦含义和和弦序列的“字典”。 (你能告诉我以前在机器速记的软件方面工作吗?)

要做到这一点,基本的部分是:

接收 MIDI 输入。不要尝试自己做,使用图书馆。 编辑:显然,Java Sound API supports MIDI,包括从 MIDI 控制器接收事件。凉爽的。 This page 也可能有用。 将该数据转换为您要发送的击键,例如通过我上面提到的字典。 将击键输出到计算机。

要最广泛地与软件兼容,您必须将其编写为键盘设备驱动程序。这是操作系统的插件,用作键盘事件的来源,与底层硬件(在您的情况下为钢琴键盘)对话。对于 Windows 和 Linux,您可能会想要使用 C。

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


更新:更多关于和弦到击键的“字典”:

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

在机器速记中,速记员通过同时按下速记机上的多个键,然后将它们全部释放来书写。他们称之为键盘的“敲击”;这就像在钢琴上弹奏和弦。笔画经常(但不总是)对应于口语的音节。像音节一样,有时一个笔画(和弦)本身就具有全部意义,有时它仅具有与以下笔画结合的意义。 (想想“好”与“好”,然后是“再见”)。尽管他们会受到所就读学校的严重影响,但每个速记员都会有自己的“词典”,了解他们用什么笔画来表示什么,这是一本他们将在工作生涯中不断磨练的词典。字典将包含速记部分(简称“速记”)为一笔长或多笔长的条目。通常,会有多个条目具有相同的起始笔划,它们的长度和后续笔划不同。例如(我不会在这里使用真正的速记,只是占位符),可能有这些条目:

A = 阿尔法
A/B = 字母
A/B/C = 字母
A/C = 空调
B = 蜜蜂
B/C = 因为
C = 海
D = 狗
D/D = 迪迪

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

请注意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) 并输出 ("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 应翻译为“alphabet”,而不是“alpha”和“bee”。 (上面未显示)您可能有无法翻译的笔画序列,因为它们与字典中的任何内容都不匹配。 (Steno 人使用名词“未翻译”——例如,在我们的字典中,笔画 E 将是“未翻译”。) (上面未显示)一些速记理论允许同一组笔画在更广泛的背景下具有多个含义。 Steno 人称这些为“冲突”。你可能想在你的项目中禁止它们,事实上,当速记员过去手动翻译速记时,冲突很好,因为他们会知道句子中的哪个位置是正确的选择,但随着增加在机器翻译中,无冲突速记理论的出现是为了避免必须仔细检查生成的翻译文本并“修复”冲突。 实时翻译(您会这样做)意味着如果您收到部分匹配,您会希望在等待下一个和弦时保持它 - 但可能只到超时,此时你会尽可能地翻译缓冲区中的内容。 (或者您可能不想超时;这是您的决定。) 最好有一个写着“忽略上一个笔画”的笔画 最好有一个写着“完全清除缓冲区而不输出任何内容”的笔划

【讨论】:

@I__:有些程序试图直接与键盘设备对话,因此不能很好地使用类似“sendkeys”的界面。希望现在这种情况比几年前我上次处理这个问题时更不常见,所以正如我所说,我会从类似机制的“sendkeys”开始,只在需要时才担心另一个。 (最好做一个快速程序测试发送键[单独,而不是通过从 MIDI 接收它们] - 包括特殊的键序列 - 然后在你走得太远之前用你想要控制的软件测试它.) 对于那些从未听说过这个的人,你描述的字典基本上是一个Trie(读作'try') @I__:写现在来这么说很有趣。你还想要什么?我想我已经解决了您需要做的许多重要方面。我还没有完成它,也没有指出任何做过的人,因为我还有其他事情要做,并且碰巧不知道预先构建的解决方案。但就构建解决方案而言,我认为我已经为您指明了正确的方向。 请注意,您可以将线性阵列中的所有和弦都卡住并在每次收到 midi 事件时进行遍历,但仍然不会出现任何明显的减速。使用 trie 有点过早优化的味道。 @FeepingCreature:当我与速记员和法庭记者一起做这件事时,他们的字典可以轻松地运行到数十万条条目(我记得有一个突破了百万大关)。使用优化策略一点也不为时过早,我们正在处理 12 MHz 386。在 I___ 的情况下,如果他采用 Arduino 的想法(这是一个非常酷的想法),他也将处理现代时代动力不足的硬件,尽管这些硬件的速度当然比我们拥有的快得离谱。我认为他的字典会小很多,但是...【参考方案2】:

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

Arduino MIDI hardware is available off of the shelf Arduinos have been used to emulate keyboard devices

对于 Arduino,有大量的信息和帮助。它是为新手打造的硬件黑客平台。 Google is pushing Arduino.

现在只会越来越大

编辑:虚拟 USB 键盘 software 和 hardware

【讨论】:

我喜欢为此使用 Arduino 的想法。不过,内存可能是个问题。看起来最大的预设计板有 256k 的闪存(其中 8k 由引导加载程序使用)。过去,我们在 DOS 下将机器速记的实时翻译/显示/编辑塞进 1M(例如,通常的 640k 加上 EMS 或扩展内存),但我们正在编写紧凑的 C 代码、汇编和字典(这很容易本身> 250k)在磁盘上。这里没有显示或同步编辑,这很好,但字典必须很小...... 哦,没什么。我经常与法庭记者打交道,他们的字典即使以我们使用的非常紧凑的形式存储,也有数兆字节大小。我个人看到的最大的是 4.5MB——同样,它以高度压缩的形式存储。再加上速记键盘上的键比钢琴键盘少的事实......不过,Arduino 有一个 USB 端口,所以字典可以在 USB 闪存适配器上,甚至是(外部供电的) ) SSD 或 HDD。 @you 可能需要考虑使用 teensy 而不是 arduino (pjrc.com/teensy) 显着增加内存,并且可以直接模拟键盘。它已经与许多 arduino 库兼容,不兼容的库只需要重新分配引脚。 -- 另外,atmega 还制作了一个演示板,它具有 16 MB 的内置闪存,成本约为 30 美元(at90usbkey) 为电脑设计一个有用的钢琴界面并不是一件容易的事。恕我直言,OP 应该首先在他/她当前的环境中对其进行原型制作,然后,如果它满足他/她的需求,请担心可移植性。除非,当然,便携式替代品并不明显更难。【参考方案3】:

在我看来,您似乎在寻找有关如何自己构建它的建议较少,而更多地询问已经存在哪些资源来完成您想要的。根据您的操作系统,有很多方法可以实现这一点,而无需从头开始编写自己的程序:

MIDI Stroke

免费。适用于 Mac OS X 10.3 及更高版本。这个特别带有“使用任何MIDI 键盘作为完整的计算机键盘替代品的能力。”

Bome's MIDI Translator

免费/明信片(有点奇怪)。适用于 Windows 2000 及更高版本以及 Mac OS X。它最初似乎更适合AutoHotkey-type 的使用,但进一步看,我认为它可以很好地满足您的需求。

Max and aka.keyboard

免费。对于 Mac OS X。不完全是“开箱即用”的解决方案,但如果您对基本设备配置感到满意,那应该不会太糟糕。

【讨论】:

【参考方案4】:

您可以在 MIDI DotNet 中使用 .NET 中的源代码示例访问硬件。

VB 5/6-Tipp 0521: MIDI-Töne erzeugen 中作为源代码创建 MIDI 音符数据流的完整工作示例(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 个手指在键盘上,如果矩阵可用,你可以比我认为的任何计算机键盘用户快得多。 :-)

那么,如果我理解你的问题,那应该不是什么大事。

【讨论】:

【参考方案5】:

我在大学学习钢琴演奏,然后进入交互设计、编程和使用Vim,所以我实际上花了很多时间制作这样的原型。

通过使用多媒体艺术家的图形编程语言“Pure Data”以及Alex Andre 的外部x11key,您可以在Linux 中快速完成这项工作。

在 Mac 上,您可以使用 MidiStroke。我相信 Windows 上的一种方法涉及 MidiOx 和 AutoHotKey 工具。另一次,我有一个版本使用Max/MSP 的 Java 插件。我相信Patrice Colet 为 Pure Data 制作了一个外部窗口,效果也很好,但我似乎再也找不到它了。此外,an external for MaxMSP 可以在 Windows 上执行此操作。最后,非免费但很棒的 Osculator 可以做你想做的事 - 请参阅功能页面。

当我开始使用它时,我从未坚持过,因为我无法停止使用布局工具。不过,将显示器放在我的电子键盘上真是太酷了!祝你好运。

【讨论】:

【参考方案6】:

关于 MIDI

你说你“对 MIDI 一无所知”。一旦你掌握了 MIDI 技术,它就相当简单,但一开始它可能会让人困惑。其中一个资源对我理解 MIDI 的基础有很大帮助(如果你想对 MIDI 交互进行编程,这当然是必要的),是一本名为 MIDI for the Technophobe 的书。这本书很容易阅读,而且很有帮助。

纯数据和最大值

根据我开发交互式多媒体的经验,我遇到过两个非常相似的程序,它们有助于连接和映射来自任何设备的信号/输入。

Max 用于 Mac 环境,Pure Data 用于 PC 环境。两者都有大量的在线文档和 YouTube 教程。视频 Max/MSP Tutorial 1 - using your computer keyboard as midikeyboard (ableton style) 演示了 Max 内置的程序,该程序将计算机键盘映射到 MIDI 键盘的输入(这基本上与您尝试做的完全相反)。您可以通过使用相同的模式获得预期的结果,但反转信号/映射。

自动热键

AutoHotKey 是适用于 Windows 的免费开源实用程序,可让您将设备上的按键和按钮重新映射到宏。它原生支持 QWERTY 键盘、游戏杆和鼠标宏。

但是,我能够找到支持您正在寻找的特定映射的实现。这两个线程解释了这个过程:

    MIDI IN support in AutoHotkey ,用例的讨论。作者正在寻找一个可以检测 MIDI IN 输入并将其转换为按键的程序

    MIDI input library ,作者问题的解决方案以及 AutoHotKey 的发布代码/补丁,它实际上实现了您的预期结果。

基本上,看起来 AutoHotKey 以及该用户的自定义补丁将提供您创建从 MIDI 键盘到 QWERTY 键盘输入信号的映射所需的内容。您所要做的就是安装、配置和定义您的映射。

还有什么?

一般来说,其他一些答案为您提供了有关 MIDI 和 MIDI 编程的更广泛的信息,但正如您的帖子所述,这似乎并不是您想要的。如果可能的话,我想为您提供更多帮助,但如果您能更具体地了解您正在寻找的信息类型会更容易。例如,您是否对如何将 MIDI 键盘的输入信号转换为 QWERTY 键盘的信号更感兴趣,或者您的主要兴趣是寻找开箱即用的解决方案针对您的具体问题?您在寻找什么尚未解决的问题?

【讨论】:

【参考方案7】:

您可以使用 Teenys 微控制器快速破解您自己的 USB 键盘。

事实上,他们有如何make a USB keyboard的示例代码。

你可以通过两种方式来处理:

    买一架旧钢琴,将开关直接连接到青少年

    添加附加逻辑以连接到 MIDI 端口和必要的解码。

【讨论】:

这是最有希望的答案,因为一旦你完成了设备,它就可以在任何计算机和任何操作系统上运行。将其用于工作或只是很高兴您可以升级计算机而无需担心键盘。我会使用两个 Teensy 设备,并将它们与它们的 I/O 引脚连接在一起。由于 Teensy 已经支持 USB MIDI pjrc.com/teensy/td_midi.html 您的代码只需要处理键盘 teensy 和 midi teensy 之间的移动信号。【参考方案8】:

实际上,我前段时间做过这个工作,试图将Rock Band 鼓输入捕获到我的计算机中(制作一个小的 Java 自制鼓模拟器)无论如何,我在这里问了一个问题,Time delay problem (那里有轮询代码,以及我试图做的事情。)。如果我能找到我的程序,我可以给你代码,它使用第三方 API (JInput)。

祝你好运。

【讨论】:

【参考方案9】:

试试Bome's MIDI translator。

它可以跨平台工作,可以轻松地将任何MIDI 输入转换为按键,快速设置和配置,而且免费供个人使用。

有一个教程,Quick Tip: MIDI Translation – MIDI to Keystrokes,介绍了如何轻松设置它:

基本上,您可以做的事情有无限可能,包括和弦键和修饰键。我将它用于我的现场音频设备,以使用我的钢琴控制我的DAW,并且从未遇到过问题。

【讨论】:

【参考方案10】:

在 Java 中,您可以使用 JMF(Java 媒体框架)来转换 MIDI 信号。 键盘设计的基础是易于使用,即用户界面;并将常用的字符/符号放在手边。

Java Sound Resources: Examples: Digital Signal Processing (DSP) 中的示例代码和 API 有助于理解如何处理信号。

更多参考资料:

Processing Audio with Controls Digital Audio Signal Processing, 2nd Edition

【讨论】:

【参考方案11】:

.NET 中一个很好的库,具有完整的 midi 支持 (BASS),请转到 http://www.un4seen.com。

对于另一部分,将键盘 MIDI 音符转换为键等等,我会选择 AutoItX,即与 autoIt 的 ActiveX/COM 和 DLL 接口。信息和下载,去http://www.autoitscript.com/site/autoit/

无需编写键盘驱动程序。

【讨论】:

【参考方案12】:

有一个程序叫做GlovePIE。您可以使用简单的脚本语言对其进行编程,并且我相信它支持 MIDI。我不确定这是否属于“Java”类别,但它仍然是一个很棒的程序。我用它来控制使用PS3 控制器的机器人。它非常强大。

【讨论】:

【参考方案13】:

许多键盘都有一个串行端口 (RS-232) 连接器,用于将 MIDI 信号发送到计算机。我使用一个名为Girder的程序将串口通信转换为键盘敲击。

Girder 具有“映射”功能,可让您将每个键一个一个地映射到相应的击键。

这可能是您正在寻找的简单解决方案!

【讨论】:

【参考方案14】:

只要学习速记!

从您的所有讨论中可以清楚地看到。从技术角度来看,您不想重新发明任何***。但是,一旦你建立了联系(这个问题要问的是什么)并开始工作,你仍然有大部分工作要做:你必须训练你的大脑。您必须发明最聪明、最有效的方法来做到这一点 - 一个完全出自计算机技术人员范围的设计问题。你或我们中的任何人都会达不到要求。

幸运的是,经过几个世纪的成熟,这个问题已经得到解决和磨练......

学习速记!

是的,这会让你退缩一些。但是,你自己的数百个小时的时间到底值多少钱,结果却不尽如人意?此外,the stenography Wikipedia article 说,“它看起来更像钢琴键盘”。

当然,除非你想产生副作用。我不得不承认,我从没想过这种可能性,看到有人从钢琴键盘上敲出一段文字,这将是真的有趣!

您可以从USB keyboard with touchpad 开始(或者pointing stick 会更符合人体工程学?),使用Plover 来翻译它(我确信它可以配置为让非字母键保留其功能因为它们对于编程至关重要),或者,跟随线程 Re: Plover keyboard 滚动你自己的 USB 速记键盘,或者,购买 a stenotype。

祝你好运!

【讨论】:

速记键盘上的 和 在哪里?您将如何输入不是单词的名称,例如pthread ***链接错误,应该是en.wikipedia.org/wiki/Stenography【参考方案15】:

看看MAME 街机游戏。他们已经构建了硬件设备以允许来自任意数量的不同项目的输入。例如,iPac 将来自输入设备的信号转换为 USB,然后计算机可以使用该 USB 来模拟按键。您可以使用输入设备的任何组合,以任何看起来很舒服的方式排列,不需要疯狂的编程逻辑——因为解释输入的软件已经完成并经过良好测试。

我见过用这种方法构建的飞行模拟器驾驶舱输入、定制信息亭和投票系统......而且价格合适!

【讨论】:

【参考方案16】:

要解决这个问题,您需要做一些事情:

    一种从键盘捕获 MIDI 数据的方法。取决于接口:MIDI 接口(经典)或USB MIDI 接口(现代)最可能的接口是计算机,因为它提供了最多的选项。 USB 主机微控制器并不像使用电脑那么简单。

    一种将 MIDI 数据转换为击键的方案。就像一位用户指出的那样,和弦是一种方式,因为键的数量不会取决于钢琴键的数量。

    一种将密钥注入操作系统的方法。这需要低级驱动程序才能准确。我在 Windows 7 中使用过将键盘和鼠标数据注入应用程序的应用程序,它可能很不稳定,并且取决于应用程序当前是否处于焦点位置。这是界面中最难的部分。可行的方法是创建一个HID USB 键盘微控制器,它也具有串行接口。

串行接口将创建一个虚拟串行端口。读取 MIDI 数据并产生击键的软件可以将串行消息发送到虚拟串行端口。微控制器会发送一个击键,所以它看起来像一个标准的键盘输入。这将允许连接 MIDI 端口和 USB MIDI 键盘。

嗯,使用这种类型的界面,您还可以模拟鼠标并为鼠标轴和按钮使用一些钢琴键设置。压力可用于确定鼠标指针速度。所以你也可以消除鼠标。这种方法的另一个好处是您连接的任何类型的输入设备都可以与虚拟串行端口通信以产生键盘和鼠标事件。因此,如果您想添加其他硬件,例如鼓踏板或操纵杆,只需调整与串行接口对话的程序即可。

上面的另一种看法就像上面发布的一些使用 Arduino,但还包括来自 Sparkfun 的 USB Host Shield 来处理基于 USB 的音乐键盘。这允许将 Arduino 编程为引导加载程序芯片中的键盘或键盘鼠标组合,并允许设备充当基于 USB 的音乐键盘的USB 主机。然后,您将涵盖这两种类型。虽然,我仍然认为虚拟串口方法更灵活,从长远来看更容易编程。 Arduino 设备将比桌面程序或服务更难更改。

还有一种可能: 和弦单手键盘已经存在。我看过有关它们的视频,但您必须确定它们是否会伤到您的手。

【讨论】:

【参考方案17】:

使用 .NET DirectSound 接口之类的东西连接到 MIDI 设备应该相当容易。您将需要识别您的目标 MIDI 设备,然后获取代码以监听传入的消息(Google 上有关于这样做的文章)。

由于您将 MIDI 输入用作键盘,因此您基本上只需要检测两个 MIDI 消息,即音符开和音符关。 MIDI 消息是三个数据字节,指定命令、音符和速度。关闭的音符只是音符编号(有时“坏”的 MIDI 堆栈会以零速度发送音符,这也是您必须预料到的)。

一旦你有了翻译它们的消息,键盘输出在 .NET 中应该是相当简单的。

其他答案中有很多关于技术细节的建议;我只是想让你了解实际的 MIDI 信息。祝你好运!

【讨论】:

作为旁注,“MIDI 设备的通用串行总线设备类定义”文档对 MIDI 消息进行了非常简洁的概述:usb.org/developers/devclass_docs/midi10.pdf【参考方案18】:

通过您的声卡将任何外部 MIDI 键盘作为控制器演奏,您将获得更好、更快乐的结果(无论您喜欢使用什么操作系统和/或DAW 程序)。然后将其路由到您的 GB 软件(或其他任何软件)中,并生成他们以这种方式实时提供给您的许多声音。

如果您的声卡不支持 MIDI I/O(输入/输出/thrus),那不是问题。您可以考虑研究和投资外部 MIDI 桌面转换器。许多设备可以进一步将 MIDI 输出转换为 USB 2.0(完全绕过现有的声卡)。

例如:通过使用计算机键盘和铅笔工具的 Z 和 X 更改键选项来获得“类似人类”的装饰音结果是非常困难的。相反,当您自己的手指可以使用 MIDI 键盘从其自己的物理八度音域寄存器范围内弹奏时——立即!

我意识到可能涉及预算限制。但是,您只需要一些在 Radio Shack 以低于 100.00 美元(* 或更少)的价格出售的这些看似便宜的“卡西欧”类型 5 八度音阶键盘(另外,它们的一些板载声音补丁和音序器模块的声音和处理其他事情也非常好)。

Radioshack MIDI keyboard options.

至于现有声卡的外部 MIDI 转换器,我已经为您运行了some Google searches,具体考虑了 Mac 平台:

很多这种外部 MIDI 转换信息一开始对您来说可能很麻烦,因此出于您的考虑和预算,我将其分解为“用户友好”:

MIDI sound cards

在使用DAW 时,将虚拟键盘简化为VST 并没有错。他们有自己的位置。

但是,您听起来像个出色的键盘手。那么,为什么不考虑一下我刚才提到的外部 MIDI 转换/键盘选项呢?

祝你好运,我希望这能给你一些可以而且会为你工作的想法!

【讨论】:

【参考方案19】:

如果您不想自己进行任何编程但只想解决问题,您可以购买一个 USB-MIDI 键盘,您可以在其中重新分配任何键以发送 QWERTY 键盘输出信号而不是 MIDI-输出,例如M-Audio Axiom Pro

此方法适用于支持标准 USB 键盘的任何操作系统和任何计算机,因为 MIDI 键盘会将自己标识为标准 QWERTY 键盘。

【讨论】:

您知道是否也可以将和弦分配给特定的击键?例如,如果我演奏 C MAJOR 和弦,我可以把它翻译成“狐狸跳” 抱歉没有这么快回答,我已经放假了 4 天;)不,很遗憾,每个键只能分配一个 QWERTY 代码,所以它几乎可以作为标准键盘使用。跨度> 顺便说一句,如果你买了,记得买PRO-one,因为我不认为非PRO-版本有QWERTY-assignment功能。 我认为不可能将和弦分配给 ASCII 码,每个码只有一个键,但我今晚下班回家后会在我自己的 Axiom 上检查一下。跨度> 我刚刚注意到只能将 qwerty 代码分配给控制按钮(功能键、鼓垫、数字键等),而不是键盘上的实际钢琴键。我自己拥有这个键盘,并且确信可以将 ascii 代码分配给任何键,但现在当我尝试它时,我发现这是错误的!对此我感到非常抱歉,是否可以通过某种方式恢复奖励?【参考方案20】:

您可以使用简单的AutoIt 脚本来读取 MIDI 事件,请参阅 MIDI Input

您还需要 MIDI UDF 和 simulate key presses。

读取 MIDI 事件应该很容易,但不同的 MIDI 控制器(乐器)具有不同的功能。首先尝试找出您的 MIDI 钢琴可以做什么,然后看看如何将这些功能最好地映射到模拟的QWERTY-keyboard press。

如果您愿意,您可以在屏幕上或托盘中放置一些东西来帮助您查看您在做什么(即,对于 ShiftCtrlAlt 模拟)。

【讨论】:

【参考方案21】:

你可以看看chorded keyboards。它们的优点是您无需为它们编写驱动程序就可以使用它们,并且有些类似于钢琴键盘的布局。

【讨论】:

【参考方案22】:

如果你知道 Java 编码,你可以这样使用:

首先,使用send(..) 方法实现javax.sound.midi.Receiver,该方法将“Note on”事件映射到您想要的按键。

您需要使用其getMessage 方法获取 MidiMessage 的内容并以您的方式解释它。消息字节的含义可以在MIDI Messages中找到。

在接收到某个键盘键的“note on”或“note off”后,您可以通过为其分配 KeyEvent 类的常量来将其映射到您喜欢的键,例如 C#4 -> KeyEvent.VK_A等等。然后,java.awt.Robot 的 keyPress 和 keyRelease 方法可以使用此键码将击键实际发送到操作系统,从而发送到其他应用程序。

【讨论】:

【参考方案23】:

我同意 Brian O'Dell 的回答 - 如果这是我的项目,我会用硬件来完成。它具有独立于平台和硬件的优势——您的盒子取代了对 MIDI-USB 接口和 PC API 的需求。

mbed 是一个非常容易学习的快速原型设计平台,与 Arduino 恕我直言(在线编译器、512 KB 闪存、96 MHz、C++ 语言)相比具有多项优势。它有一个 USB keyboard interface 和一个 USB Midi interface 为您预先编写。

社区非常友好并且乐于提供帮助,并且有很多现有的项目同时使用 MIDI 和 USB hid 仿真 - 在 Youtube 上搜索“mbed MIDI”或类似内容。

【讨论】:

【参考方案24】:

如果您使用 Linux,请联系 Footware

它应该正是您正在寻找的 - 如果您将 MIDI 音高调整为您喜欢的键盘映射...

我从没想过这对我以外的任何人都有用;o)

【讨论】:

在我以前担任管理员的工作中,我的办公桌下有一个脚踏控制器 - 以尽量减少在 vim 中离开主行【参考方案25】:

尝试使用基于微控制器的系统,例如 Arduino。

【讨论】:

【参考方案26】:

这不会太难。

我假设你在Windows,但不确定。我写了一个MIDI 音序器http://pianocheetah.com,用普通的C++,它可以让你使用钢琴键盘来运行命令。没有任何理由你不能做同样的事情来按键 进入键盘输入流。

但是现在来吧。你记得你花了多长时间学习 首先是键盘,对吧? 你愿意再经历一次吗? 你愿意污染你祝福的键盘吗? 一堆看起来很傻的关键符号?

您需要使用至少 26 个字母、10 个数字、11 个标点符号, 以及至少 12 个功能键及其转换状态。 所以这是 60 个键加上转换的状态。 这会烧掉整整 5 个八度音阶的键。 您将一直在弹钢琴“跳”=所有=。 告别触摸打字。

您可以从RSI 中拯救自己,但您已经创建了另一个 给自己带来不同类型的噩梦。

祝你老板在工作时给你买一个 MIDI 键盘。

如果你学会了真正弹钢琴,你就学会了 如何玩无压力。在QWERTY 键盘上执行此操作。 没有紧张。慢慢开始。

【讨论】:

感谢您的客气话,但我已经在这件事上全力以赴,不打算将其开源 - 抱歉。但是你要做的是使用 midiInOpen();为其提供回调以处理 MIDI 输入;忽略除notedown事件之外的所有内容,将midi音符映射到某个键盘键并将其插入键盘输入流(我忘记了api,但我很确定至少有一个)。

以上是关于使用钢琴键盘作为电脑键盘[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

苹果电脑键盘没反应

开源钢琴键盘ios [关闭]

Postmessage模拟键盘

mac键盘快捷键详解,苹果电脑键盘快捷键图文教程

mac键盘快捷键详解,苹果电脑键盘快捷键图文教程

苹果电脑如何关闭键盘上的Fn功能?