Opis - wersja skrócona ;-)
Muszę określić częstotliwość odbieranych komunikatów. Konkretnie to wygląda tak, że dopiero 24 odebrane komunikaty stanowią 1 jakąś tam "wartość". Muszę policzyć ilość tych "wartości" w ciągu minuty ;-)
Opis - wersja dłuższa ;)
Tempo utworu w MIDI określa ilość ćwierćnut na minutę, potocznie zwana BPM. Jednak przez MIDI nie przesyła się konkretnej wartości tego tempa w postaci liczby, a generuje się komunikaty zegarowe. Odbiornik zlicza je i na tej podstawie oblicza wspomniane BPM. Na jedną "B" z tego BPM przypada 24 komunikaty. Czyli dla tempa 60 BPM tych komunikatów w ciągu sekundy musi być 24, dla 120 BPM 48 itd.
Odbieram te komunikaty i chcę wyliczyć tempo. Teoretycznie wydawało się to proste, praktycznie mam problem z dokładnością tych wyliczeń. Z braku mądrzejszego pomysłu robię tak:
- Tworzę zmienną TStrings Lista, wpisuję do niej 24 po kolei pobrane wartości GetTickCount i przekonwertowane na String
- Zaczynam pomiar - odbieram te komunikaty zegarowe - przy każdym wrzucam jak wyżej - przekonwertowany GetTickCount na koniec listy i usuwam pierwszy element - więc zawsze mam 24 elementy na liście.
- TTimerem co 1 sek obliczam (po przekonwertowaniu na Int64) różnicę czasu między piewszym a ostatnim elementem na liście. No i 60000 (ilość ms w minucie) podzielone przez tę różnice daje mi wartość BPM.
Problem leży w dokładności tego pomiaru. Wiem na pewno, że urządzenie nadawcze generuje ten zegar np. 120 BPM, a mnie w programie wychodzi 122 - 123 BPM. I z reguły zawsze jest to zawyżone.
Gdzie jest haczyk? Jak to powinno wyglądać "po ludzku"? (taka procedura pomiarowa...)
Pozdrawiam,
Jacek