Комментарии 7
<шутка>Я думал Вы правда будете делать это на Ardino, а Вы на ATMega</шутка>
Немного оффтопа, а никто не в курсе где почитать про миксер двух звуков одной частоты дискретизации? банальное (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. Код ещё не причёсан достаточно чтоб писать статью на Хабре, но даже по картинкам уже ясно о чём речь.
От себя посоветую добавить в GitHub файл Readme.md который автоматически показывается в браузере при переходе по ссылке на репозиторий. Тогда даже непрограммисты смогут получить общее представление о сути проекта.
Вот пример моего проекта на Arduino DUE. Код ещё не причёсан достаточно чтоб писать статью на Хабре, но даже по картинкам уже ясно о чём речь.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Вывод звука на Arduino Due