1

我正在尝试在 Pure Data 中设置一个小 MIDI 键盘(使用我电脑的键盘)。它是这样工作的:

press a key > send a note_on on midi channel
stop pressing a key > send a note_off on midi channel

问题是,当您按住一个键时,[key]对象会生成一系列输入而不是单个(长)输入。这会停止播放(所需的)音符(因为原始输入在约 500 毫秒后停止)并连续多次重新开始播放该音符。

我已经尝试过[change], [timer]+[moses]和其他非解决方案,我正在寻找[key]可以处理长按键的更好的实现

我正在寻找可以完成[key]工作但可以处理长按的东西,如果我长按一个键[key]超过一秒钟,它会执行以下操作:key....(1 秒过去).. .keyup.key.keyup.key.keyup。它继续......

4

2 回答 2

2

问题是如果您一直按下该键,您的操作系统(!)会生成重复的键事件。

解决方案

所以简单的解决方案是告诉你的操作系统抑制重复的关键事件。

解决方法

更复杂的解决方法是跟踪给定键的当前状态并抑制重复的按键。如果您只跟踪一个键(而不是一次全部),这很容易完成:

例如,一个抽象 [keypress 97] 将检测a(ascii 97) 的按键:

[key]        [keyup]
|            |
[select $1]  [select $1]
|            |
[t b b]      |
|     [stop( |
|     |      |
|     +----- |
|           \|
|            [del 50]
|            |
[1(          [0(
|            |
| -----------+
|/
[change]
|
[outlet]
于 2014-07-07T09:46:16.803 回答
1

怎么样[keyname]

这是一个示例补丁,当按下多个键时将写入数组。应该可以将其用作和弦输入。我认为然后使用 [tabread] 并迭代数组索引号将指示是否按下键(索引应与 ascii/键号匹配):

#N canvas 800 301 544 205 10;
#X obj 23 23 keyname;
#X symbolatom 89 40 10 0 0 0 - - -;
#X floatatom 23 46 5 0 0 0 - - -;
#X obj 181 18 key;
#X floatatom 181 46 3 0 0 0 - - -;
#X floatatom 220 44 3 0 0 0 - - -;
#X obj 220 18 keyup;
#X obj 44 87 pack float symbol float float;
#X obj 67 117 print;
#X obj 46 151 tabwrite array1;
#N canvas 0 0 450 300 (subpatch) 0;
#X array array1 256 float 1;
#A 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
#X coords 0 1.2 255 0 256 100 1 0 0;
#X restore 277 33 graph;
#X connect 0 0 2 0;
#X connect 0 1 1 0;
#X connect 1 0 7 1;
#X connect 2 0 7 0;
#X connect 2 0 9 0;
#X connect 3 0 4 0;
#X connect 4 0 7 2;
#X connect 4 0 9 1;
#X connect 5 0 7 3;
#X connect 5 0 9 1;
#X connect 6 0 5 0;
#X connect 7 0 8 0;

a + g同时按下的示例:

在此处输入图像描述

按下后s

按's'后

虽然a

而一个

按下后a

之后

我也能在这里找到一些东西:http: //puredata.hurleur.com/sujet-3718-pdkb-basic-virtual-midi-keyboard

压缩文件: http ://puredata.hurleur.com/attachment.php?item= 1635

看起来很整洁,不知道它是否有效。

于 2014-07-02T14:26:38.717 回答