我怎么能/我会实现莫尔斯码生成器?

时间:2010-10-31 15:46:07

标签: iphone iphone-sdk-3.0 ios4

我想知道实现莫尔斯代码生成器的最佳方法是什么。它的工作方式是用户键入单词或短语,然后NSString将作为参数进行处理。我想要处理的方法是循环遍历字符串中的每个字符,然后播放正确的音调序列。我已经在一个单独的类中实现了这个机制。

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

下面是我用来延迟的方法示例,但问题是如果用户输入说“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 个答案:

答案 0 :(得分: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];
}

注意我添加了一个stopMorse布尔实例变量,如果要在字符串中间停止莫尔斯代码生成,可以将其设置为true。

答案 1 :(得分:0)

当您弄清楚要播放的声音时,请将它们添加到阵列中。 在您进行播放时,通过阵列播放并保存阵列中的位置。如果你解决了问题,请暂停,然后继续你离开的地方。

或者,弄清楚每个字母占用多长时间并使用变量进行播放延迟。

答案 2 :(得分:0)

NSTimers和运行循环延迟产生非常差的摩尔斯电码,并且在更高的WPM下变得更糟。最好创建一个足以满足毫秒精确鼓声循环(可能需要使用RemoteIO音频单元)的DSP音频合成引擎,并使用它来混合定时蜂鸣声而不是打击乐器样本。