我试图在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]
对象会生成一系列输入而不是单个(长)输入。这会停止播放(所需)音符(因为原始输入在约500ms后停止)并重新开始连续多次播放音符。
我已经尝试[change]
,[timer]
+ [moses]
以及其他非解决方案,我正在寻找更好的[key]
实施方案可以处理长按键
我正在寻找能够处理[key]
工作但可以处理长按的内容,如果我长按[key]
的某个键而不是第二,它做了类似的事情:
key ....(1秒后通过)... keyup.key.keyup.key.keyup。它继续......
答案 0 :(得分:2)
问题是如果你一直按下按键,你的操作系统(!)会产生重复的按键事件。
因此,简单的解决方案是告诉您的操作系统抑制重复的关键事件。
更复杂的解决方法是跟踪给定密钥的当前状态并抑制重复的密钥更新。如果您只跟踪一个键(而不是一次全部),这是最容易完成的:
e.g。抽象[keypress 97]将检测 a (ascii 97)的按键:
[key] [keyup]
| |
[select $1] [select $1]
| |
[t b b] |
| [stop( |
| | |
| +----- |
| \|
| [del 50]
| |
[1( [0(
| |
| -----------+
|/
[change]
|
[outlet]
答案 1 :(得分: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 :
a :
按 a :
我也能在这里找到一些东西:http://puredata.hurleur.com/sujet-3718-pdkb-basic-virtual-midi-keyboard
zipfile:http://puredata.hurleur.com/attachment.php?item=1635
看起来很整洁,不确定它是否有效。