2009-06-07 21 views
1

Je viens de créer une application de batterie. L'utilisateur appuie sur les boutons individuels qui déclenchent un son court à jouer en utilisant le système de AudioToolbox. Je voudrais maintenant ajouter un UIButton qui dit "record", et lors du clic, va enregistrer tous les Systemounds en cours de lecture, puis lorsque l'utilisateur appuie sur le bouton stop; le programme devrait alors pouvoir lire le son.application iPhone terminée: ajoutez une nouvelle fonctionnalité. enregistrer le son du système et ensuite être en mesure de lire

Comment puis-je faire ça?! L'ensemble du processus du programme étant capable d'enregistrer les sons courts que l'utilisateur déclenche en tapant sur les zones touchées individuelles ?!

S'il vous plaît laissez-moi savoir

Merci

Pavan

Répondre

0

Je ne suis pas familier avec le matériel audio dans l'iPhone lui-même, mais comme il ne met pas en routines internes synthétisation je ne serais pas être surpris s'il n'est pas possible de capturer l'audio sortant pour le retraitement. Je pense que vous trouverez beaucoup plus facile, en particulier si vous n'êtes pas familier avec la programmation audio directement, d'enregistrer les actions de batterie et les intervalles de temps et de rejouer les fichiers audio de la même manière qu'initialement joué. Cela aurait également l'avantage de pouvoir éditer, ralentir, accélérer, et d'autres astuces sans altérer l'audio directement. Lorsque la batterie est atteinte, vous devez ajouter un NSMutableArray. L'exemple ci-dessous est basé sur un drumType (une étiquette pour le bouton de batterie étant frappé par exemple), et un drumNextDelay qui est le délai (NSTimeInterval) au prochain coup de batterie. Il y a évidemment plus de façons de gérer cela, mais ce n'est qu'un exemple.

Une version approximative de la lecture pourrait être mis en œuvre en appelant performSelector à plusieurs reprises avec l'intervalle de temps suivant, quelque chose comme ce qui suit:

- (void) startPerformance { 
self.drumIndex = -1; 
[self performSelector:@selector(playDrumBeat) withObject:nil afterDelay:0]; 
} 

- (void) playDrumBeat { 
self.drumIndex++; 
[self playDrum:[[drumBeats objectAtIndex:self.drumIndex] drumType]]; 
[self performSelector:@selector(playDrumBeat) withObject:nil afterDelay:[[drumBeats objectAtIndex:self.drumIndex] drumNextDelay]]; 
} 

Cela peut être sujette à des problèmes de synchronisation avec le système d'exploitation, mais je poursuivre quelque chose comme ça pour une première coupe et voir si cela fonctionne.

Barney

+0

Je pourrais l'utiliser comme première coupe. et oui cela ne tiendra pas compte du temps et du délai entre les temps réels. il ne ferait que le jouer l'un après l'autre sans aucun motif rythmique. Mais cela ressemble vraiment à la façon de faire. merci beaucoup pour le guide et l'exemple de code. Je l'apprécie vraiment. – Pavan