Перейти к содержимому

Алгоритм Счетчика Bpm


Adi

Recommended Posts

Около года назад, мне понадобилось сделать маленькую програмку, которая считала бы число ударов в минуту какой-нибудь песенки - BPM. С помощью друга я справился с задачей... только вот прога давала не совсем точные данные... Алгоритм должен был работать складывая и находя ср. арифм. времени 10-ти ударов по кнопке, а затем уже по формуле 60/х , где х - полученное ср. арифм. - находить bpm. проблемка была в том, что вместо ср. ариф - в конечном счете прога отнимала от конечного - начальное значение и делила на 9...

Хотелось бы послушать, вернее почитать, ваши соображения по этому поводу!!!

Ссылка на комментарий
Поделиться на других сайтах

задача понятна, алгоритм прост:

- засекай, скажем, секунд 10 и считай количество ударов.

- полученное число умножай на 6 - получится количество ударов в 60 сек (то есть 1 мин)

прим. - погрешность расчета уменьшается с увеличением времени замера, то есть можно считать удары за 20 сек и умножать на 3 - результат будет точнее.

start ():
- start timer
- start counter

running ():
- check timer (continue or stop?)
- register beats

end ():
- stop counter
- calculate result

не совсем понятно - какие возможности и ограничения существуют по автоматическому отсчету времени и счету ударов. объясни, что за кнопка, которая регистрирует удары -) с нее можно считывать инфу в реальном времени и передавать в программу?

Ссылка на комментарий
Поделиться на других сайтах

Понимаешь ли в чем дело, предлагаемый тобой метод дает погрешность в 6 BPM, в то время как допустимая погрешность должна быть порядка 0.1 - 0.3 . Так что - не все так просто, что дает возможность вытыкнуться...

Ссылка на комментарий
Поделиться на других сайтах

OK, не буду устраивать здесь "что, где, когда" по алгоритмике...

Просто обращусь за помощью к специалистам, если конечно таковые имеются...

В прошлой версии я суммировал интервалы между ударами и находил их ср. ариф. не думая, что это и есть разница между первым и последним ударом => неточность порядка 2-3 бмп...

Ниже представлен pas новой версии, где ср. ариф. находится в 2 этапа: между каждыми ударами, и общий среди всех полученных результатов. ( на запятую в полученном числе не обращайте внимания - она смещена на 2 знака влево - а само число бпм - приблизительно верно! - если конечно точно бить...)

Цель проекта - уменьшить погрешность получаемую при каждом неточном ( не в удар) нажатии кнопки.

_____________________

данный pas, как уже догадались знатоки, написан на языке Delphi...

public

t1:ttime;{ Public declarations }

fms:word;

b:boolean;

mas: array [1..10] of word;

k, i:integer;

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

var

t1, t2: ttime;

begin

t1:=(now);

listbox1.Items.Add(timetostr(t1));

end;

procedure TForm1.Button1KeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

var

h,m,s,ms:word;

begin

t1:=(now);

decodetime(t1,h,m,s,ms);

if b then fms := s*1000 + ms;

//listbox1.Items.Add(inttostr(s)+' '+inttostr(round(ms / 10)));

if (not B) and (i<10) then

begin

listbox1.Items.Add( inttostr(((((s*1000 + ms) - fms)) )));

inc(i);

mas := (((s*1000 + ms) - fms));

end;

if b then b := false;

fms := s*1000 + ms;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

k:=0;

i:=0;

b:=true;

t1:=0;

fms:=0;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

j,amt:integer;

itogo:single;

begin

amt:=0;

for j := 1 to 10 do amt :=amt + mas[j];

itogo := amt / 10;

form1.caption := floattostr(600 / itogo);

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

end;

end.

Ссылка на комментарий
Поделиться на других сайтах

так и думал, что в коду вылезут всякие смайлики - хорошо еще, что всего 1...

Короче вот в атачменте полностью весь сорс!!! - кому интересно - go ahead!

Ссылка на комментарий
Поделиться на других сайтах

Понимаешь ли в чем дело, предлагаемый тобой метод дает погрешность в 6 BPM, в то время как допустимая погрешность должна быть порядка  0.1 - 0.3 .  Так что - не все так просто, что дает возможность вытыкнуться...

Adi

ты говорил о простой программке и просил высказать соображения.

То, что мои соображения не удовлетворяют требованиям погрешности 0.1 - 0.3, о которых не было упомянуто в условии задачи, не повод для неуместных рассуждений о моих мотивах. Надеюсь, ты тоже понимаешь.

ШАЛОМ

Ссылка на комментарий
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Only 75 emoji are allowed.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Загрузка...
×
×
  • Создать...