Je cherche cela depuis des semaines maintenant: Mon application a besoin d'une fonction de métronome et je l'ai fait avec un fil (copié et adapté à partir de l'exemple d'Apple Metronom) mais le timing est misérable. Je sais que les ressources du minuteur ne sont pas précises mais je ne trouve pas d'autre technique réalisable. Et j'ai juste besoin de brefs "bips" sonores afin d'attaquer la totalité de la lecture audio n'est pas nécessaire. Je divise le BPM (battements par minute) par 12 pour avoir la possibillité de jouer aussi les huitièmes, seizièmes et ainsi de suite. Donc le problème n'est pas le jeu audio, le problème est la distance temporelle précise entre deux "ticks".Exact Timer recherché!
Voici le code pour le calcul de la distance de tique:
- (double)Be_get12TickDistance:(NSInteger)bpm{
double result = 60.0/(bpm*12);
return result;
} Voici le fil:
- (void)startDriverTimer:(id)info {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Give sound thread high priority to keep the timing steady
[NSThread setThreadPriority:1.0];
BOOL continuePlaying = YES;
while (continuePlaying) { // loop until cancelled
// Use an autorelease pool to prevent the build-up of temporary date objects
NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
SoundEffect *currentSoundEffect= [[self beepAndLEDKeeper] Be_GetBeepSound4CurrentTick:beatNumber theCurrentGroove:grooveNumber];
[currentSoundEffect play];
if ([[self beepAndLEDKeeper] Be_isLEDFlashPoint:beatNumber]){
[self performSelectorOnMainThread:@ selector(setLEDtoHidden:) withObject:[NSNumber numberWithInt:LEDoldBeatNumber+oldGrooveNumber*9] waitUntilDone:NO];
[self performSelectorOnMainThread:@ selector(setLEDtoUnHidden:) withObject:[NSNumber numberWithInt:LEDbeatNumber+grooveNumber*9] waitUntilDone:NO];
LEDoldBeatNumber = LEDbeatNumber++;
}
oldBeatNumber = beatNumber++;
oldGrooveNumber = grooveNumber;
if (beatNumber >= grooveEnd[grooveNumber])
{
beatNumber=0;
LEDbeatNumber=0;
if (++grooveNumber > 1)
grooveNumber=0;
if (grooveEnd[grooveNumber] == 0)
grooveNumber=0;
}
if ([soundPlayerThread isCancelled] == YES)
continuePlaying = NO;
else
[NSThread sleepForTimeInterval:self.duration];
[loopPool release];
}
[pool release];
}
Question: Est-ce que quelqu'un a un indice comment faire d'une manière facile? J'ai juste besoin d'une meilleure possibilité de timing, le jeu avec SoundEffect est assez bon.
Merci pour toute l'aide, Andreas
Salut John, ok, vous voulez dire que j'ai une distance fixe entre une tique granulaire fine et ensuite construire mes tics BPM hors de lui? J'ai essayé cela une fois sur une conception 80C535 et j'ai dû réaliser que l'erreur de synchronisation pour certains taux de battement n'est pas négligeable parce que vous avez une erreur d'arrondi pour des battements comme 300bpm où une distance de 12tick est 16.66666667 ms. Cela ajoute ... mais je pourrais faire un tel thread avec le temps réel de la tique. Mais je n'utilise pas un thread d'arrière-plan en faisant [NSThread sleepForTimeInterval: self.duration]; ??? Andreas –