Я не уверен, какой класс WaveIn.cs вы используете, но обычно с кодом, который записывает аудио, вы либо A) указываете код, чтобы начать запись, а затем в какой-то более поздний момент вы говорите коду остановиться, и вы получаете массив (обычно типа short []), который содержит данные, записанные за этот период времени; или B) указать коду начать запись с заданным размером буфера, и при заполнении каждого буфера код выполняет обратный вызов метода, который вы определили, со ссылкой на заполненный буфер, и этот процесс продолжается до тех пор, пока вы не сообщите ему остановить запись.
Предположим, что ваш формат записи составляет 16 бит (или 2 байта) на семпл, 44100 семплов в секунду и моно (1 канал). В случае (A), допустим, вы начинаете запись, а затем прекращаете запись ровно через 10 секунд. В результате вы получите короткий массив [] длиной 441 000 (44 100 x 10). Я не знаю, какой алгоритм вы используете для обнаружения «отводов», но допустим, что вы обнаруживаете отводы в этом массиве в элементе 0, элементе 22,050, элементе 44,100, элементе 66,150 и т. Д. Это означает, что вы находите метки каждый. 5 секунд (потому что 22 050 - это половина из 44 100 выборок в секунду), что означает, что у вас есть 2 нажатия в секунду и, следовательно, 120 ударов в минуту.
В случае (B) предположим, что вы начинаете запись с фиксированным размером буфера в 44 100 сэмплов (примерно 1 секунда). По мере поступления каждого буфера вы найдете метки в элементе 0 и в элементе 22,050. По той же логике, что и выше, вы вычислите 120 ударов в минуту.
Надеюсь, это поможет. При общем обнаружении ударов лучше всего записывать в течение относительно длительного времени и считать удары по большому массиву данных. Попытка оценить «мгновенный» темп более трудна и подвержена ошибкам, точно так же, как и оценка высоты записи в реальном времени сложнее, чем при записи полной ноты.