2010-10-31 134 views
2

我想知道什么是最好的方式来实现一个莫尔斯电码发生器。它的工作方式是用户键入一个单词或短语,然后NSString将作为参数传递给我的方法进行处理。我想要处理的方式是循环播放字符串中的每个字符,然后在播放时播放正确的音调序列。我已经在一个单独的类中实现了该机制。我怎样才能实现一个莫尔斯电码发生器?

我已经尝试了很多不同的方法,但它们似乎都引入了某种问题。我迄今尝试过的事情是:使用延迟方法调用(performSelector:withObject:afterDelay)创建一个NS Timer。

下面是我用来延迟的方法的一个例子,但问题是,如果用户输入“aaaa”,只会播放第一个“a”,因为整个循环将在莫尔斯序列甚至完成了生成。如果循环可以在继续之前等待开关盒完成,那将会更理想。

反正这是我认为它应该实现的方式,但它似乎并没有工作,所以也许有更好的方式来实现莫尔斯电码生成器或我只是错过了一个步骤,如果有人可以请帮助我解决这个问题,我真的很感激它。

- (NSString *)convertTextToMorse:(NSString *)phrase { 

    for (int i = 0; i < [phrase length]; i++) { 

     unichar ch; 
     ch = [phrase characterAtIndex:i]; 
     NSLog(@"Processing charachter %c",ch); 

     //Dot = 100ms 
     //Dash = 300ms 
     //Pause = 200ms 

     switch (ch) { 
      case 'a': 
       //Morse "a" 
       [self playDotSound]; 
       [self performSelector:@selector(playDashSound) withObject:nil afterDelay:0.2]; 
       break; 
      case 'b': 
       //Morse "b" 
       break; 
      default: 
       break; 
     } 
    } 

    return phrase; 

} 

回答

3

另一种选择可能是运行在一个单独的线程整个事情:

- (NSString *) convertTextToMorse:(NSString *)phrase { 
    [self performSelectorInBackground:@selector(morseInternal:) withObject:phrase]; 
    return phrase; 
} 

- (NSString *) morseInternal:(NSString *)phrase { 
    NSAutoreleasePool *pool = [NSAutoreleasePool new]; 
    for (int i = 0; i < [phrase length]; i++) { 
     if (stopMorse) { 
      break; 
     } 
     unichar ch = [phrase characterAtIndex:i]; 
     NSLog(@"Processing charachter %c",ch); 
     switch (ch) { 
      case 'a': 
       [self playDotSound]; 
       [self pause]; 
       [self playDashSound]; 
      break; 
      case 'b': 
       //Morse "b" 
       break; 
      default: 
       break; 
     } 
    } 
    [pool release]; 
} 

- (void) pause { 
    [NSThread sleepForTimeInterval:0.2]; 
} 

通知我说,如果你想停在莫尔斯代码生成,你可以设置为true的stopMorse Boolean实例变量字符串的中间。

+0

WOW !!!!我只能说,你是我的英雄哈哈。它完美的工作,非常感谢 – cgossain 2010-10-31 17:06:05

+0

如果答案适合你,请点击对号 – 2010-11-01 18:03:44

0

当你弄清楚什么声音可以播放时,将它们添加到数组中。 通过数组播放并在您前进时保存阵列中的位置。如果您遇到解析问题,请暂停,然后继续您离开的地方。

或者,找出每个字母需要多长时间并将变量用于回放延迟。

0

NSTimers和运行循环延迟产生很差的莫尔斯码,并且在较高的WPM上变差。最好创建一个DSP音频合成引擎,这个引擎对于毫秒精确的鼓循环(可能需要使用RemoteIO音频单元)足够好,并用它来混合定时嘟嘟声而不是打击乐器样本。