Реальная звуковая волна - это комбинация синусоидальных волн разных частот и амплитуд, сложенных вместе, а не случайных отклонений от синусоидальной волны. Сложная часть будет состоять в том, чтобы выбрать комбинацию амплитуд и частот волны, которая будет давать выход, который вам понравится субъективно! Однако большинство звуковых волн имеют базовую частоту, а затем несколько обертонов, которые «вписываются» в эту длину волны - например, он может иметь обертон на 3/2 * базовой частоты и с амплитудой 2/3 базовой частоты. Комбинируя эти обертоны и масштабируя полученную форму волны до диапазона -127 - +127, вы получите реальную звуковую волну.
Следующий код на C #, но достаточно близок к Java, чтобы дать вам представление. Это из игры, где мне нужно было объединить множество синусоидальных волн для создания различных типов колебательных эффектов:
/// <summary>
/// Return a value between 0 and 1 based on a sine-wave oscillating with a given combination of periods at a given point in time
/// </summary>
/// <param name="time">time to get wave value at</param>
/// <param name="periods">lengths of waves</param>
/// <returns>height of wave</returns>
public static float MultiPulse(float time, params float[] periods)
{
float c = 0;
foreach (float p in periods)
{
float cp = (MathHelper.Pi / p) * time;
float s = ((float)Math.Sin(cp) + 1) / 2;
c += s / periods.Length;
}
return c;
}
Возможно, вы захотите изменить это, чтобы указать различные амплитуды, а также периоды для волн, которые вы комбинируете.
Комбинируя множество широко варьирующихся амплитуд и периодов (частот), вы должны методом проб и ошибок получить что-то убедительное.