Проблема
Я пытаюсь некоторое время разобраться с этим, но безрезультатно - как постоянно изменять высоту ноты между двумя частотами.
Я генерирую аудиосигнал с помощью функции, подобной этой:
double SineGenerator(double time, double frequency)
{
return Math.Sin(frequency * time * 2 * Math.PI);
}
Пока я управляю временем вручную вне этой функции, вот так:
time += 1.0 / sampleRate;
double sample = SineGenerator(time, frequency);
И очевидное решениеЛинейная интерполяция параметра frequency
по требуемому количеству выборок не работает должным образом.При этом звуковая волна заполняется хлопками и щелчками.
Как мне вместо этого реализовать это?
Решение (Редактировать)
БлагодаряЭто было удивительно легко решить.Сейчас я перешел на использование этого генератора:
double SineGenerator(ref double time, double frequency, int sampleRate)
{
return Math.Sin(time += (frequency * 2 * Math.PI) / sampleRate);
}
, который заботится о внутреннем увеличении time
.
Использование этого генератора с интерполяцией frequency
работает плавно и без проблем со звуком.Спасибо!