iphone BPM速度按钮

时间:2009-11-19 05:54:11

标签: iphone audio custom-controls uibutton

我想创建一个按钮,允许用户点按它,从而设置每分钟节拍。我也会在它上下移动以更快更慢地调整。 (我已经解决了这个问题)。

有什么方法可以让用户点击按钮的时间来获得按下之间的平均时间,从而达到节奏。

2 个答案:

答案 0 :(得分:3)

总体

  1. 您最好使用time()中的time.h而不是NSDate。以节拍的速度创建NSDate的开销可能导致严重的精度损失。

    我相信time_t保证具有双精度,因此您可以安全地将time()difftime()结合使用。

  2. 使用整个屏幕,不要只给用户1个小按钮。

  3. 两个想法

    后处理

    1. 将所有时间存储在数组中。

    2. 修剪结果。从开头和结尾删除超过平均值的元素。

    3. 从剩余值中获取平均值。那是你的速度。

    4. 如果它接近公共值,请使用它。

    5. 自适应

      1. 使用2个变量。一个称为speed,另一个称为error

      2. 在前2次节拍计算估计速度后,将error设为speed

      3. 每次击败后

        queue = Fifo(5)                        # First-in, first-out queue. Try out
                                               # different values for the length
        currentBeat = now - timeOflastBeat
        currentError = |speed - currentBeat|
        
        # adapt
        error = (error + currentError) / 2     # you have to experiment how much
                                               # weight currentError should have
        
        queue.push(currentBeat)                # push newest speed on queue
                                               # automatically removes the oldest
        speed = average(queue)
        
      4. 只要error小于某个阈值,您就可以停止并告诉用户您已确定速度。

      5. 疯狂的界面。每当用户点击时,屏幕都会闪烁。水龙头的额外火花几乎与预期时间相同。

        使背景颜色与错误相对应。错误越小,使其越亮。

答案 1 :(得分:0)

每次按下该按钮,都会存储当前日期/时间([NSDate date])。然后,在下次按下时,您可以使用-[previousDate timeIntervalSinceNow]计算差异(因为它从前一个减去当前日期,所以为负值),这将为您提供秒数。