Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 我如何实现摩尔斯电码发生器?_Iphone_Iphone Sdk 3.0_Ios4 - Fatal编程技术网

Iphone 我如何实现摩尔斯电码发生器?

Iphone 我如何实现摩尔斯电码发生器?,iphone,iphone-sdk-3.0,ios4,Iphone,Iphone Sdk 3.0,Ios4,我想知道实现莫尔斯电码发生器的最佳方法是什么。它的工作方式是用户键入一个单词或短语,然后将NSString作为参数传递到我的方法中进行处理。我想处理的方法是循环字符串中的每个字符,然后在播放时播放正确的音调序列。我已经在一个单独的类中实现了该机制 我已经尝试过很多不同的方法,但它们似乎都会带来一些问题。到目前为止,我尝试的是:创建一个NS计时器,使用延迟方法调用(performSelector:withObject:afterDelay) 下面是我用来延迟的方法的一个例子,但问题是,如果用户输入

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

我已经尝试过很多不同的方法,但它们似乎都会带来一些问题。到目前为止,我尝试的是:创建一个NS计时器,使用延迟方法调用(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;

}
-(NSString*)convertexttomorse:(NSString*)短语{
for(int i=0;i<[短语长度];i++){
unichar ch;
ch=[短语特征索引:i];
NSLog(@“处理字符%c”,ch);
//点=100ms
//破折号=300ms
//暂停时间=200ms
开关(ch){
案例“a”:
//莫尔斯“a”
[自动播放网络声音];
[自执行选择器:@selector(playdashound)with object:nil afterDelay:0.2];
打破
案例“b”:
//莫尔斯“b”
打破
违约:
打破
}
}
返回短语;
}

当您确定要播放的声音时,将它们添加到数组中。 在阵列中进行游戏,并在行进中保存您在阵列中的位置。如果您在解析过程中遇到困难,请暂停,然后从您停止的地方继续


或者,计算每个字母需要多长时间,并使用一个变量作为播放延迟。

另一个选项可能是在单独的线程上运行整个过程:

- (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];
}
-(NSString*)convertexttomorse:(NSString*)短语{
[self-performSelectorInBackground:@selector(morseInternal:)with object:phrase];
返回短语;
}
-(NSString*)morseInternal:(NSString*)短语{
NSAutoreleasePool*池=[NSAutoreleasePool新建];
for(int i=0;i<[短语长度];i++){
if(stopmores){
打破
}
unichar ch=[短语特征索引:i];
NSLog(@“处理字符%c”,ch);
开关(ch){
案例“a”:
[自动播放网络声音];
[自我暂停];
[自动播放声音];
打破
案例“b”:
//莫尔斯“b”
打破
违约:
打破
}
}
[池释放];
}
-(无效)暂停{
[NSThread sleepForTimeInterval:0.2];
}

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

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

WOW!!!!我能说的就是你是我的英雄,哈哈。它工作得很好,非常感谢