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

2023-12-25

I have RSI http://en.wikipedia.org/wiki/Repetitive_strain_injury问题,并尝试了 30 种不同的电脑键盘,这些键盘都给我带来了痛苦。弹钢琴不会给我带来痛苦。我弹钢琴大约 20 年了,没有任何疼痛问题。我想知道是否有一种方法可以从 MIDI 键盘捕获 MIDI 并输出键盘敲击。我对 MIDI 一无所知,但我想要一些关于如何将此信号转换为击键的指导。


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

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

在力度、和弦和踏板之间,我认为你可以为钢琴键盘设计出一个相当好的“打字”界面。和弦尤其可能是一种非常强大的技术——正如我在评论中提到的,这就是为什么普通速记员可以使用速记机 http://en.wikipedia.org/wiki/Stenotype为了跟上人们连续几个小时的交谈,而即使是顶级打字员也无法通过普通打字机式键盘进行任何长时间的交谈。与机器速记一样,您需要一本关于和弦含义和和弦序列的“字典”。 (你能看出我曾经在机器速记软件方面工作吗?)

为此,基本部分是:

  • 接收 MIDI 输入。不要尝试自己执行此操作,请使用库。Edit:显然,Java Sound API支持MIDI http://download.oracle.com/javase/6/docs/api/javax/sound/midi/package-summary.html,包括接收来自 MIDI 控制器的事件。凉爽的。这一页 http://www.jsresources.org/faq_midi.html可能也有用。
  • 将该数据转换为您想要发送的击键,例如通过我上面提到的字典。
  • 将击键输出到计算机。

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

然而,既然你只是生成击键(不是试图拦截它们,这是我几年前尝试做的),您也许可以使用操作系统具有的任何功能来发送人工击键。 Windows 有一个接口可以做到这一点(可能有几个,我正在考虑的是SendInput http://msdn.microsoft.com/en-us/library/ms646310%28v=vs.85%29.aspx但我知道有一些“日记”界面可以做类似的事情),而且我确信其他操作系统也可以。这可能足以满足您的目的 - 这就是我要开始的地方,因为设备驱动程序路线将会很尴尬,并且您可能必须使用与 Java 不同的语言。 (我是 Java 的忠实粉丝,但操作系统用来与设备驱动程序通信的接口往往更容易通过 C 等语言使用。)


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

基本上,字典是一个trie http://en.wikipedia.org/wiki/Trie(谢谢,@Adam)我们使用最长前缀匹配进行搜索。细节:

在机器速记中,速记员通过同时按下速记机上的多个键,然后全部释放来进行书写。他们称之为键盘的“敲击”;这就像在钢琴上弹奏和弦一样。笔画经常(但并非总是)对应于口语的音节。就像音节一样,有时一个笔画(和弦)本身就有意义,有时它只与后面的笔画组合在一起才有意义。 (想想“好”与“好”后跟“再见”)。尽管他们会受到所就读学校的严重影响,但每个速记员都会有自己的“字典”,记录他们用什么笔画表示什么,这是他们在工作过程中不断磨练的字典。字典中会有速记部分(简称“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, a B,或者你正在重新开始。

另请注意(尽管上面的小示例中未显示),“播放”同一单词或短语可能有多种方式,而不仅仅是一种。速记员这样做是为了根据手的位置更容易从前一个单词流到下一个单词。这与音乐有一个明显的类比,您可以使用它来使您的打字流程更类似于演奏音乐,以便防止这种情况对您的钢琴演奏产生负面影响,并最大限度地提高实际上有助于 RSI 的可能性。

将速记翻译成标准文本时,我们再次使用“最长前缀匹配”搜索:翻译算法从所写的第一个笔画开始,并查找以该笔画开头的条目。如果只有一个条目,并且只有一笔长,那么我们可以可靠地说“这就是要使用的条目”,输出相应的文本,然后从下一笔开始。但更有可能的是,该笔划开始了不同长度的多个条目。因此,我们查看下一个笔画,看看是否有按顺序以这两个笔画开头的条目;依此类推,直到我们找到匹配项。

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


A C B B C A B C A B D  

我们的翻译方式如下:

  1. A是三个不同长度条目的开始;看下一个笔画:C
  2. A/C仅匹配一项;输出“空调”并从下一个行程开始:B
  3. B开始两个条目;看下一个笔画:B
  4. B/B不启动任何东西;取最长的上一场比赛(B)并输出(“蜜蜂”)
  5. 有输出B=“蜜蜂”,我们还有一个B我们的缓冲区中的行程。它开始了两个条目,所以看看下一个笔画:C
  6. B/C匹配一个条目;输出“because”并从下一个笔画开始:A
  7. A开始三个条目;看下一笔:B
  8. A/B开始两个条目;看下一笔:C
  9. A/B/C只匹配一个条目;输出“字母”并从下一个笔画开始:A
  10. A开始三个条目;看下一个笔画:B
  11. A/B开始两个条目;看下一个笔画:D
  12. A/B/D不匹配任何内容,因此取最长的前一个匹配项(A/B)并用它来输出“字母表”。这给我们留下了D仍在缓冲区中。
  13. D开始两个条目,所以我们通常会查看下一个笔画 - 但我们已经处理了所有笔画,所以单独考虑它。孤立地看,它翻译为“狗”,所以输出它。

以上需要注意的几个方面:

  • 您有已读过但尚未翻译的笔画缓冲区。
  • 您总是希望尽可能地将最多的笔划与单个条目进行匹配。A/B应该翻译为“alphabet”,而不是“alpha”和“bee”。
  • (上面未显示)您很可能有无法翻译的笔划序列,因为它们与字典中的任何内容都不匹配。 (速记人使用名词“untranslate”——例如,在我们的字典中,笔划E将是一个“未翻译”。)
  • (上面未显示)一些速记理论允许基于更广泛的上下文,同一组笔划可以表示多个事物。速记人称这些为“冲突”。你可能想在你的项目中禁止它们,事实上,当速记员过去手动翻译速记时,冲突是很好的,因为他们知道句子中的哪个位置是正确的选择,但随着在机器翻译中,无冲突速记理论的出现是为了避免必须仔细检查最终的翻译文本并“修复”冲突。
  • 实时翻译(您正在做的)意味着,如果您收到部分匹配,您将希望在等待下一个和弦时保留它 - 但可能只到超时,此时您会尽可能翻译缓冲区中的内容。 (或者也许您不想要超时;这是您的决定。)
  • 可能最好的中风是“忽略之前的中风”
  • 可能最好有一个笔划表示“完全清除缓冲区而不输出任何内容”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用钢琴键盘作为电脑键盘[关闭] 的相关文章

  • Android:当焦点位于 EditText 上时自动显示软键盘

    我正在使用显示一个输入框AlertDialog The EditText当我调用时 对话框本身会自动聚焦AlertDialog show 但软键盘不会自动显示 如何让软键盘在对话框显示时自动显示 并且没有物理 硬件键盘 类似于当我按下 搜索
  • Delphi:如何停止 TAction 快捷键自动重复?

    我正在使用 Delphi TActionList 带有用于某些操作的快捷键 我想防止某些操作被键盘自动重复多次触发 但我确实这样做not想要影响全局自动重复操作 这样做的最佳方法是什么 澄清 我仍然需要处理多个快速按键 这是only我想忽略
  • iOS:处理长按并拖动以选择另一个按钮。 (如键盘)

    我很难找到有关如何处理触摸事件以支持与键盘类似的行为的正确文档 我想要的是一个按钮 当我长按它时 它会在按钮上方显示一个自定义视图控制器 但我希望用户能够将手指拖动到其他按钮之一 无需将手指离开屏幕 我长按按钮 它是自定义视图控制器的所有设
  • 如何在Android移动网站中强制使用数字键盘

    我有一个移动网站 它有一些 HTMLinput其中的元素 如下所示
  • 按下某个键时仅增加 1

    我想在按下 s 键时将变量 shot pressed 增加一 无论我按下多长时间 但结果是变量不断增大 我按下的时间越长 变量的值就越大 下面是我的代码的一部分 import keyboard shot pressed 0 if keybo
  • 如果没有 sudo,则无法在 Qt 应用程序中使用键盘

    我有一个在 BeagleBone Black 上运行的交叉编译的嵌入式 Qt 应用程序 它工作正常 但有一件事 如果我不直接在 BeagleBone Black 上运行 它不接受键盘输入sudo 这是一个问题 因为 我无法远程调试应用程序并
  • 使用 .NET 4.5.2 从 C# 代码更改键盘布局

    我正在为 SDL Trados Studio 插件编写代码 插件的最后一部分需要一些 API 根本没有公开的自动化 所以我所拥有的 坚持一些东西 就是自动化默认的键盘快捷键 我的代码非常适合英语键盘布局 还有匈牙利语 但它当然不适用于希腊语
  • 为什么 Android webview 仅当 type="number" 而不是 type="text" 时才在键盘中显示“下一步”?

    我有一个带有几个输入字段的表单 因此 我想使用下一个按钮在字段之间导航 但这仅在输入字段类型为 数字 时有效 使用 type text 则不会 这是 Android 3 2 1 中的错误吗 我的输入字段是这样的
  • 获取 UITableView 滚动到选定的 UITextField 并避免被键盘隐藏

    我有一个UITextField在表视图中UIViewController not a UITableViewController 如果表视图位于UITableViewController 表格会自动滚动到textField被编辑以防止它被键
  • 如何禁用 UITextView iPhone 键盘中的自动完成功能

    我正在做一个应用程序 我想在文本字段中禁用键盘的自动完成功能 我怎样才能做到这一点 如果您使用 IB 请使用 epatel 的方法 如果您不使用IB 请尝试以下方法 setAutoCorrectionType 并通过UITextAutoco
  • 了解 Android 上的默认键盘

    我想知道 Android 中用户选择的默认键盘 我知道我可以使用以下命令访问启用的输入法列表InputMethodManager 但我想知道用户当前使用的是哪一个 到目前为止 我已经尝试获取当前的输入法子类型 InputMethodMana
  • Swift 4.2 当键盘显示时使 tableView 的底部向上移动

    尽管我已经进行了搜索 但我对如何最好地解决这个问题感到困惑 我有一个 tableView 其中底部单元格是列表的输入 就像苹果提醒的工作方式一样 当列表中的项目太多时 键盘会覆盖列表 我看不到正在输入的内容 我认为我需要更改表视图的物理大小
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 如何使用 JavaScript 判断大写锁定是否已打开?

    如何使用 JavaScript 判断大写锁定是否已打开 但有一个警告 我确实用谷歌搜索了它 我能找到的最好的解决方案是附加一个onkeypress事件到每个输入 然后每次检查按下的字母是否为大写 如果是 则检查是否也按住了shift 如果不
  • 在 Android 上使用 Fluidsynth 从 SoundFonts 播放音符

    有没有办法让android通过使用FluidSynth使用SoundFont文件播放声音 我一直在看jOrgan http sourceforge net apps mediawiki jorgan index php title Deve
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • iOS - NSNotificationCenter 多个UIKeyboard通知

    我有两个视图控制器 我们称它们为 A 和 B 1 在 A 中 我显示一个包含文本字段的 popOver 2 B中有一个UITextView用于简单的文本编辑 我必须管理 A 和 B 中的键盘才能滚动键盘隐藏的内容 我知道如何重新定位内容 我
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值
  • 如何检测按下的返回键并使用 UIKeyInput 协议对其进行响应?

    我有一个表视图 显示我希望用户能够编辑的列表 为了节省空间 并且让我的视图更容易看清 我创建了一个符合 UIKeyInput 协议的自定义工具栏 这样我就可以拉起键盘而无需使用任何文本字段 到目前为止 一切都很好 我有一个可变字符串正在处理
  • 在 Android 上生成 FileDescriptor 而不先打开文件

    在Android中 是否可以直接从字节数组生成FileDescriptor 而不必先打开文件 在 Android 2 2 中 我动态生成 MIDI 文件 然后使用 MediaPlayer 进行播放 我在下面包含了成功执行此操作的 Main

随机推荐