Как воспроизводить комбинированный звук, как будто он исходит из толпы звукообразующих объектов - PullRequest
3 голосов
/ 12 апреля 2011

Учтите, что у меня есть 100 экземпляров класса "писка". Каждый объект «писк» способен индивидуально издавать писк. Каждый объект Squeaker использует один и тот же ресурс .mp3. Когда все сквикеры представлены вместе на экране (например, в виде маленьких персонажей), я хочу, чтобы все они пискнули примерно (но не точно) одновременно, чтобы их объединенные пики были слышны вместе как толпа пикарей.

Ориентация на iOS, какой подход (и аудио / звуковые рамки) вы рекомендуете? Кто-нибудь делал это раньше? Образцы кода?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Прежде всего, не используйте MP3.IPhone / iPod / iPad использует аппаратное ускорение декодирования звука для первого случая сжатого звука / аудио-слоя с потерями.Начиная с iOS (я думаю) 3.0, можно проигрывать еще один сжатый звук с потерями, но это сильно нагрузит на процессор, поскольку он не ускоряется аппаратно.AFAIK, который уже является пределом для MP3 и AAC.

В качестве личного фаворита, я бы предложил использовать OpenAL в сочетании с RAW (несжатыми) 16-битными аудио файламиOpenAL действительно прост, гибок и хорошо документирован (вне ссылок Apple).Тем не менее, вы также достигнете предела.Из того, что я помню, OpenAL на устройстве iOS имеет ограничение в 32 голоса одновременно.

1 голос
/ 12 апреля 2011

Возможно, лучше всего построить это как «дорожку смеха», в которой вы используете аудиоредактор для объединения нескольких скрипов в один файл MP3, который затем воспроизводите в цикле (этот файл может и должен быть намного длиннее, чемsingle squeak).

Попытка воспроизвести 100 звуков как отдельные экземпляры, воспроизводящие звук, может привести к тем же проблемам с голосом и задержкой, с которыми сталкиваются разработчики программных синтезаторов.Поддержание счета голоса 100 с общей задержкой менее 25 миллисекунд или около того трудно сделать на современном ПК, и намного сложнее (или невозможно) сделать на iPhone / iPad.

Вообще говоряГолос и задержка представляют собой фундаментальный инженерный компромисс: довольно просто иметь механизм синтеза с малой задержкой на мобильном устройстве, но это может быть достигнуто только с очень небольшим количеством голосов (то есть с разными параллельными звуками).И наоборот (как и мой собственный механизм синтеза программного обеспечения), у вас может быть механизм, который может эффективно обрабатывать бесконечное число голосов, но с очень высокой задержкой (порядка многих секунд).

Обновление: генерация ваших собственных звуков программно - отличная идея.Вы можете сделать это относительно легко в iPhone, используя класс AVAudioPlayer.Обычно этот класс инициализируется с помощью метода initWithURL, который используется для загрузки аудиоданных из файла.

В вашем случае вместо этого вы хотите использовать метод initWithData.Здесь вы передаете объект NSData, который в основном представляет собой блок байтов.В этом случае вы хотите, чтобы блок байтов был WAV-файлом в памяти, который будет состоять из 44-байтового заголовка, за которым следует массив из 2-байтовых целых чисел, который представляет фактические данные выборки.

Вы устанавливаете значения в заголовке (такие как частота дискретизации, биты на выборку, количество каналов и т. Д.), А затем вычисляете значения выборки, используя любой алгоритм, который вам нравится.Простая волна sin - это хорошая вещь для начала, но она просто создаст скучный тон.Более интересный звук (и тот, который может быть близок к тому, что вы ищете) называется «чириканье» - это в основном короткий звук на основе синусоидальной волны, но частота синусоидальной волны изменяется от высокой частоты кНизкая частота при воспроизведении звука.

Извините, у меня есть тонны аудиокода для C # и Java, но пока нет ничего для iPhone.Надеюсь, что я добавил здесь, поможет вам Google для этого.Вам просто нужно понять две вещи: 1) как использовать AVAudioPlayer с использованием initWithData и формат файла WAV.

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