Музыкальная шкала: функция цикла для воспроизведения разных нот

#objective-c #ios #cocoa-touch #audio #avaudioplayer

#objective-c #iOS #cocoa-touch #Аудио #avaudioplayer

Вопрос:

Я создаю приложение для iPhone, которое включает в себя учебные пособия по гитарным гаммам. Цель состоит в том, чтобы у меня было много звуков, которые воспроизводит моя функция, пока масштаб не будет завершен.

Вот случайная шкала: F G A B C D E. Я записал звуки, похожие на C.mp3, D, E, F, G, A, B, C2, D2, E2 … 2 — более высокая нота. Вот код, который я использую :

 - (IBAction) playScale {

    NSLog(@"s: %i", s);
    NSLog(@"p: %i", pressed);
    [self.player prepareToPlay];

    components = [self.scale componentsSeparatedByString:@", "];
    ns_NoteToPlay = [components objectAtIndex:s];
    NSString *path = [[NSBundle mainBundle] pathForResource:ns_NoteToPlay ofType:@"m4a"];
    NSLog(@"Path : %@", path);
    self.player.delegate = self;
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    [self.player play];
    mChord.text = ns_NoteToPlay;

    NSLog(@"Nombre de notes ds Array : %i", components.count);

    if ( s == 0) { 
        int clean;
        clean = components.count   1;
        [NSTimer scheduledTimerWithTimeInterval:clean target:self selector:@selector(cleanDots) userInfo:nil repeats:NO];
    }

    nsNowPlayingNote = ns_NoteToPlay;
    [self instrument];
    s = s 1;



    if ((s < components.count) amp;amp; (pressed == 0)) {
        [self performSelector:@selector(playScale) withObject:nil afterDelay:0.8];    
    } 


}
  

Это работает. Функция воспроизводит шкалу, но я не могу найти способ определить, когда вызывать более высокую ноту C2. В результате, когда он воспроизводит D, а затем C, C должен быть C2, но все равно вызывает C, который ниже.

Ответ №1:

Вы могли бы сохранить массив NSStrings, которые содержат имена ваших файлов, что-то вроде:

 [NSArray arrayWithObjects:@"C", @"D"..., @"C2", @"D2", nil]
  

И тогда вы могли бы сохранить int переменную, которую вы используете для итерации по массиву.

В качестве дополнительного замечания, вы уверены AVAudioPlayer , что это правильный выбор для воспроизведения ваших звуков? Вы должны хотя бы взглянуть AudioServicesPlaySystemSound() , что больше подходит для воспроизведения коротких звуков.

Комментарии:

1. Merci! Я попробую поиграть с этим! : p

2. Решено! Работает как шарм с помощью большого NSArray и нескольких манипуляций с int / strings / array