Как я могу / мог бы реализовать генератор кода Морзе? - PullRequest
2 голосов
/ 31 октября 2010

Мне было интересно, как лучше всего реализовать генератор кода Морзе. Это будет работать так: пользователь вводит слово или фразу, а затем этот NSString будет передан в мой метод в качестве аргумента для обработки. Способ, которым я хочу обработать, состоит в том, чтобы циклически проходить через каждый символ в строке и затем воспроизводить правильную последовательность тонов, когда я иду. Я уже реализовал механизм в отдельном классе.

Я уже пробовал так много разных методов, но все они, кажется, представляют какую-то проблему. То, что я пробовал до сих пор: создание таймера NS, использование отложенных вызовов методов (executeSelector: 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 ]

3 голосов
/ 31 октября 2010

Другим вариантом может быть запуск всей вещи в отдельном потоке:

- (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, если вы хотите остановить код Морзепоколение в середине строки.

0 голосов
/ 31 октября 2010

NSTimers и задержки цикла выполнения приводят к очень плохому азбуке Морзе и ухудшаются при более высоком WPM. Лучше создать механизм аудиосинтеза DSP, достаточно подходящий для миллисекундных точных петель ударных (вероятно, требующий использования аудиоустройства RemoteIO), и использовать его для микширования синхронизированных сигналов вместо сэмплов ударных инструментов.

0 голосов
/ 31 октября 2010

Как только вы поймете, какие звуки воспроизводить, добавьте их в массив.Проходите через массив и сохраняйте свою позицию в массиве по мере продвижения.Если вы застряли при разборе, сделайте паузу и продолжите прямо с того места, где остановились.

В качестве альтернативы выясните, сколько времени занимает каждая буква, и используйте переменную для задержки воспроизведения.

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