Как стать автором
Обновить

Комментарии 7

Немного оффтопа, а никто не в курсе где почитать про миксер двух звуков одной частоты дискретизации? банальное (s1/2+s2/2) не очень хорошо работает.
Вот простой способ, но не факт, что будет сильно лучше.
хм… в свое время извращался используя формулу сложения скоростей из СТО (v1+v2)/(1+(v1*v2)/c^2), где v1 и v2 это значения семплов, а С — это максимальное значение семпла. На слух звук нормальный.
Нашел свой старый код
void audio_mixer_callback(void *userdata, Uint8 *stream, int len)
{
	memset(stream, 0, len);
	short * output = (short*) stream;
	short * buf = (short*) malloc(len); //FixMe: неоптимально

	for (list<audioStream*>::const_iterator it = mixer_streams.begin(), end =
			mixer_streams.end(); it != end; ++it)
	{
		mix_callback cb = (*it)->callback;
		cb((*it)->userdata, (char*) buf, len);

		for (int i = 0; i < (len / AUDIO_SAMPLE_SIZE); ++i)
		{
			//  re: нужна нормальная функция микширования
			//  Теория относительности даёт ответ на этот вопрос.
			//  Она расширяет понятие принципа относительности, распространяя его и на оптические процессы.
			//  Правило сложение скоростей при этом не отменяется совсем,
			//  а лишь уточняется для больших скоростей с помощью преобразования Лоренца:
			//  vrel = (v1+v2)/(1+(v1*v2)/c^2) -- http://ru.wikipedia.org/wiki/Сложение_скоростей
			//  меняем скорость света на максимальное значение семпла,
			//  а складываемые скорости -  на текушие значения семплов.
			//  ту-турууу теория относительности помогла написать функцию микширования

			double max_sample_val = pow(2.0, (AUDIO_SAMPLE_SIZE * 8) - 1) - 1; // ибо знаковая
			double max_val_square = pow(max_sample_val, 2);// нaша скорость света -> максимальное значение семпла ^

			double a = output[i];
			double b = (float) buf[i] * (float) ((*it)->volume) / (float) 100;

			double rel_samp = (a + b) / (1 + (a * b) / max_val_square);

			output[i] = rel_samp;
		}
	}
	free(buf);
}

PS: код страшный :)
Спасибо, очень интересно.

От себя посоветую добавить в GitHub файл Readme.md который автоматически показывается в браузере при переходе по ссылке на репозиторий. Тогда даже непрограммисты смогут получить общее представление о сути проекта.

Вот пример моего проекта на Arduino DUE. Код ещё не причёсан достаточно чтоб писать статью на Хабре, но даже по картинкам уже ясно о чём речь.
Судя по картинкам, проект должен быть интересным. Пост будет?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации