Необходимые элементы:
- чтение байтов (возможно, до
AudioInputStream
, если данные не хранятся в массиве памяти) - преобразование байтов аудиоданных в PCM
- oversample
- применить функцию искажения
- сглаживающая фильтрация
- decimate
- преобразовать обратно в байты
- вывод через
SourceDataLine
Я не знаю, какой алгоритм искажения может быть лучшим для ваших целей. В бесплатной книге *1025* Physical Audio Signal Processing есть несколько предложений. Я вспоминаю, что в CCRMA Стэнфордского университета тоже было несколько интересных статей по этому поводу, но у меня нет удобных ссылок.
Мое личное любимое искажение - функция tanh
. Код Java, который я использую для синтезированного патча, который получает довольно сильное гитароподобное искажение, выглядит следующим образом:
float distortVal = (float)Math.tanh(noteVal * (1 + timbreNormal * 5));
В этом случае noteVal
- это одно значение PCM. У меня есть переменная timbreNormal
в диапазоне от 0 до 1, и я читаю ее из эквивалента контроллера педали. Значение 5 паттерна "magi c number" - это константа, которую я лениво вставляю. Она определяет максимальную величину, на которую сигнал усиливается перед применением алгоритма искажения. Какой бы алгоритм искажения вы ни использовали, интенсивность искажения будет зависеть от степени усиления сигнала до применения алгоритма. Если вы хотите более тонкий эффект, значение «число волшебный c» может быть установлено ниже.
Чрезмерная выборка очень помогает при фильтрации. Я передискретизировал 8 и использую двухполюсный фильтр Баттерворта. Мне пришлось бы сделать несколько значительных копаний, чтобы найти значения, используемые в конструкции фильтра. Но я думаю, что вы можете понять суть программы из этого ответа.