кнопка темпа iphone BPM - PullRequest
       11

кнопка темпа iphone BPM

1 голос
/ 19 ноября 2009

Я хочу создать кнопку, которая позволит пользователю нажимать на нее и тем самым устанавливать количество ударов в минуту. у меня также будет движение вверх и вниз, чтобы настроить быстрее и медленнее. (я уже разобрался с этим битом).

Каковы подходящие способы получения времени, когда пользователь нажал на кнопку, чтобы получить среднее время между нажатиями и, таким образом, отработать темп.

Ответы [ 2 ]

3 голосов
/ 19 ноября 2009

В целом

  1. Лучше всего использовать time() из time.h вместо NSDate. При частоте ударов накладные расходы на создание NSDate могут привести к значительной потере точности.

    Я считаю, что time_t гарантированно будет иметь двойную точность, поэтому вы можете безопасно использовать time() в комбинации с difftime().

  2. Используйте для этого весь экран, а не просто дайте пользователю 1 маленькую кнопку.

Две идеи

Post-процесс

  1. Хранить все время в массиве.

  2. Обрезать результат. Удалите элементы из начала и конца, которые превышают пороговое значение от среднего.

  3. Получить среднее значение из оставшихся значений. Это ваша скорость.

  4. Если оно близко к общему значению, используйте его.

Адаптивная

  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. Сходи с ума от интерфейса. Сделать экран мигать всякий раз, когда пользователь нажимает. Дополнительные искры для крана, который почти идентичен ожидаемому времени.

    Сделать цвет фона соответствующим ошибке. Чем ярче ошибка, тем ярче она становится.

0 голосов
/ 19 ноября 2009

При каждом нажатии кнопки сохраняется текущая дата / время (с [NSDate date]). Затем при следующем нажатии вы можете рассчитать разницу с помощью -[previousDate timeIntervalSinceNow] (отрицательно, поскольку она вычитает текущую дату из предыдущей), что даст вам количество секунд.

...