Мой код никогда раньше не использовался для обработки значений со знаком, и поэтому преобразование байтов -> короткое преобразование некорректно обрабатывало знаковый бит. Это правильно решило проблему.
Я пытаюсь изменить громкость потока данных PCM. Я могу извлекать одноканальные данные из стерео файла, делать различные глупые экспериментальные эффекты с образцами, пропуская / дублируя их / вставляя нули и т. Д., Но я не могу найти способ каким-либо образом изменить фактические значения образцов и получить разумный выход.
Мои попытки действительно просты: http://i.imgur.com/FZ1BP.png
(value = -value отлично работает - переворачивает волну и звучит так же)
Код для этого одинаково прост (ввод-вывод использует беззнаковые значения в диапазоне 0 -65535) это была проблема, чтение правильно подписанных значений решило проблему :
// NOTE: INVALID CODE
int sample = ...read unsigned 16 bit value from a stream...
sample -= 32768;
sample = (int)(sample * 0.9f);
sample += 32768;
...write unsigned 16 bit value to a stream...
// NOTE: VALID CODE
int sample = ...read *signed* 16 bit value from a stream...
sample = (int)(sample * 0.9f);
...write 16 bit value to a stream...
Я пытаюсь сделать образец тише. Я предполагаю, что уменьшение амплитуды (пример * 0,9) приведет к более тихому файлу, но и 4., и 5. выше явно недействительны. Есть аналогичный вопрос для SO , где MusiGenesis говорит, что он получил правильные результаты с типом кода 'sample * = 0.75' (да, я экспериментировал с другими значениями, кроме 0.9 и 1.1).
Возникает вопрос: делаю ли я что-то глупое или вся идея умножения на константу неверна? Я бы хотел, чтобы конечный результат был примерно таким: http://i.imgur.com/qUL10.png