【问题标题】:In Pure Data how to keyup, keydown, and while keydown?在 Pure Data 中如何 keyup、keydown 和 while keydown?
【发布时间】:2014-07-01 22:19:39
【问题描述】:

我正在尝试在 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] 长按一个键超过一秒钟,它会执行以下操作: 键....(1 秒通过)...keyup.key.keyup.key.keyup。它会一直持续下去......

【问题讨论】:

    标签: keypress keydown keyup long-press puredata


    【解决方案1】:

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

    解决方案

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

    解决方法

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

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

    [key]        [keyup]
    |            |
    [select $1]  [select $1]
    |            |
    [t b b]      |
    |     [stop( |
    |     |      |
    |     +----- |
    |           \|
    |            [del 50]
    |            |
    [1(          [0(
    |            |
    | -----------+
    |/
    [change]
    |
    [outlet]
    

    【讨论】:

      【解决方案2】:

      [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

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

      看起来很整洁,不确定它是否有效。

      【讨论】:

      • 此答案中的第一个链接已失效(404 Not Found)。请检查。谢谢。
      猜你喜欢
      • 2013-05-14
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多