Also, du hast die Definition eines bpm. Entspricht wie gesagt einem Schlag pro Minute. Die Variable "bpmTicks" speichert, wie viele Ticks eines Taktgebers im Rechner einer Minute entsprechen. Oder wir stellen eine Frage: Wenn ich zwischen zwei Schlägen (1 bpm) eine Minute warten will, wie groß muss der Unterschied zwischen dem QueryPerformanceCounter-Wert des
letzten Schlags und jetzt sein? Nun, ganz genau "bpmTicks". Willst du 2 Schläge (2 bpm) haben, wäre es dann logischerweise "bpmTicks
div 2"
Hier mal ein kleiner Code, der ungefähr tun sollte, was du willst.
Delphi-Quellcode:
var
TempTicks, LastBeatTicks: Int64;
bpm: IntegerM
bpm := StrToInt(Edit.Text);
// bpm enthält nun deine gewünschte bpm-Zahl
QueryPerformanceCounter(LastBeatTicks);
DoBeat;
// Am Anfang gleich den ersten Schlag abspielen
while MetronomeRunning
do // solange wie das Metronom laufen soll..
begin
QueryPerformanceCounter(TempTicks);
if SameValue(LastBeatTicks - TempTicks, bpmTicks
div bpm, Frequency
div 10000)
then
// mit SameValue (unit Math) überprüfen wir, ob die Zeitdifferenz zwischen dem letzten Beat
// und jetzt ungefähr mit der Zeit übereinstimmt, die zwischen 2 Beats liegen soll.
// Frequency div 10000 heißt hier: Selbst, wenn die Werte noch 100µs auseinander liegen,
// wird angenommen die Werte seien gleich
begin
DoBeat;
LastBeatTicks := TempTicks;
end;
end;
Der Code ist ungetestet, sollte aber funktionieren.