2010-10-31 131 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音頻單元)足夠好,並用它來混合定時嘟嘟聲而不是打擊樂器樣本。