Простое приложение для iPhone с метрономом - PullRequest
1 голос
/ 16 января 2012

Я пытаюсь создать простое приложение с метрономом, и мне интересно, есть ли какой-нибудь пример кода или проекты с открытым исходным кодом для изучения.Я думаю, что раньше у яблока это было, но не больше.Я полагаю, что это не должно быть так сложно, но мне любопытно посмотреть, как загрузить аудио, как установить таймер и зациклить звук соответственно.Любая помощь высоко ценится.

Ответы [ 4 ]

3 голосов
/ 16 января 2012

Приложение Apple Metronome все еще доступно в библиотеке iOS 4.2.

В XCode просто перейдите на Window -> Organizer.
Затем перейдите на панель Documentation и найдите Metronome.
Проект Metronome появится под образцом кодараздел.

Чтобы убедиться, что у вас есть библиотека iOS 4.2, перейдите в «Настройки» -> «Загрузки» -> «Документация» и убедитесь, что библиотека iOS 4.2 находится в вашем списке.

Итак ... по состоянию на лето 2015 года, редизайн Apple своего сайта, похоже, сломал эти ссылки.Я нашел ссылку на файл в формате .xar http://devimages.apple.com/docsets/20101122/com.apple.adc.documentation.AppleiOS4_2.iOSLibrary.Xcode4.xar, которую вы можете загрузить, а затем извлечь с помощью инструмента командной строки xar -xf <docsetfilename> или чего-то подобного приложению unarchiver.

2 голосов
/ 10 августа 2012

Я попробовал NSTimer, но это не очень хорошее решение, если вы ищете Pro Metronome.Вам нужен основной двигатель, который продвигает время, чтобы быть в том месте, где он должен быть.NSTimer позволяет вам просто зацикливаться во временных пространствах, которые не могут обеспечить необходимую вам точность.

Посмотрите сейчас, iOS 5 позволяет вам использовать Music Sequencer, который является хорошим решением для музыкальных приложений.И у него есть основной двигатель, чтобы контролировать время.

0 голосов
/ 29 декабря 2012

Просто для целей Google вот мои выводы по этому вопросу. Я испробовал как пример подхода Apple (с использованием фонового потока), так и подход NSTimer, и победителем на сегодняшний день является использование многопоточности. Просто нет способа заставить NSTimer срабатывать достаточно точно при работе в основном потоке (UI). Я полагаю, вы могли бы провести время в фоновом режиме, но пример Apple действительно работает очень хорошо.

0 голосов
/ 16 января 2012

Это проект метронома, который я сделал ранее. Он довольно простой, но он должен помочь. Если вы используете его, просто назовите меня, Jordan Brown 15y Mango Apps. Это заняло какое-то время, но я так и не сделал из этого приложение.

        //.h
NSTimer *timer;
int count;
float bpm;
float speed;
UILabel *numberLabel;
IBOutlet UISwitch *vibrate;
IBOutlet UISegmentedControl *timing;
 }
 - (IBAction)up;
 - (IBAction)down;
 - (IBAction)stop:(id)sender;
 @property (nonatomic, retain)IBOutlet UILabel *numberLabel;
 @property (nonatomic, retain)IBOutlet UILabel *bpmLabel;

 @property (nonatomic, retain)IBOutlet UISegmentedControl *timing;



 //.m
  #define SECONDS 60
  #import <AudioToolbox/AudioToolbox.h>

 @implementation metronome
  @synthesize numberLabel; // labels
  @synthesize bpmLabel;
  @synthesize timing; 

-(IBAction)stop:(id)sender{
[timer invalidate];
[self performSelector:@selector(playTockSound)];
numberLabel.text = [NSString stringWithFormat:@"%i",count];
bpm = bpm;
if (bpm > 300) {
    bpm = 300;
}
int new = bpm;

bpmLabel.text = [NSString stringWithFormat:@"%i",new];
speed = INFINITY;

NSLog(@"%f",speed);
timer = [NSTimer scheduledTimerWithTimeInterval:speed target:self selector:@selector(updateNumber) userInfo:nil repeats:YES];

}
 -(IBAction)up{
 [timer invalidate];
count = 1;
[self performSelector:@selector(playTockSound)];
numberLabel.text = [NSString stringWithFormat:@"%i",count];
bpm = bpm+10;
if (bpm > 300) {
    bpm = 300;
}
int new = bpm;

bpmLabel.text = [NSString stringWithFormat:@"%i",new];
speed = SECONDS/bpm;

NSLog(@"%f",speed);
timer = [NSTimer scheduledTimerWithTimeInterval:speed target:self selector:@selector(updateNumber) userInfo:nil repeats:YES];
 }
-(IBAction)down{
 [timer invalidate];
count = 1;
[self performSelector:@selector(playTockSound)];
numberLabel.text = [NSString stringWithFormat:@"%i",count];
bpm = bpm-10;
if (bpm < 10) {
    bpm = 10;
}
int new = bpm;

bpmLabel.text = [NSString stringWithFormat:@"%i",new];
speed = SECONDS/bpm;
NSLog(@"%f",speed);
timer = [NSTimer scheduledTimerWithTimeInterval:SECONDS/bpm target:self               selector:@selector(updateNumber) userInfo:nil repeats:YES];

  }
  -(void)updateNumber{
count += 1;
//if 4/4 timing is selected then the count wont go past 4
if (timing.selectedSegmentIndex == 2) {
if (count >= 5) {
    count = 1;
}
}

//if 3/4 timing is selected then the count wont go past 3
if (timing.selectedSegmentIndex == 1) {
    if (count >= 4) {
        count = 1;
    }
}

//if 2/4 timing is selected then the count wont go past 2
if (timing.selectedSegmentIndex == 0) {
    if (count >= 3) {
        count = 1;
    }
}    
  //In each timing case it plays the sound on one and depending 
  //on the limitiations on the cont value the amount of each tick 
      if (count == 1) {
    [self performSelector:@selector(playTockSound)];
}else {
    [self performSelector:@selector(playTickSound)];
}

numberLabel.text = [NSString stringWithFormat:@"%i",count];
  }
  -(void)playTickSound
  {
NSString *path = [[NSBundle mainBundle] pathForResource:@"tick" 
                                                 ofType:@"caf"];
SystemSoundID soundID;
    AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path]
                                 , &soundID);
  AudioServicesPlaySystemSound (soundID);




  }
  -(void)playTockSound
  {
NSString *path = [[NSBundle mainBundle] pathForResource:@"tock" 
                                                 ofType:@"caf"];

SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path]
                                 , &soundID);
     AudioServicesPlaySystemSound (soundID);



  - (void)didReceiveMemoryWarning
  {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
  }


  - (void)viewDidLoad
  {
bpm = 60.00;
speed = SECONDS/bpm;
timer = [NSTimer scheduledTimerWithTimeInterval:speed target:self selector:@selector(updateNumber) userInfo:nil repeats:YES];
int new = bpm;

bpmLabel.text = [NSString stringWithFormat:@"%i",new];
[super viewDidLoad];

  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...