Немного теории, что мне известно о звуке — звук это:
волна, колебания, затухающие колебания, волна может быть описана с точки зрения физики, волна может быть описана с точки зрения математики.
Скачать и протестировать программу
Поскольку моделируем мы на компьютере, то наша волна описывается при помощи последовательности (ряда Фурье) из байт (чисел от -128 до 127 и ноля), тоесть массивом байт.
Уравнение колебательных движений лучше всего описывает функция SIN.
Согласитесь было бы слишком просто, если бы мы просто прогнали по массиву функцию SIN.
Поэтому руководствуясь статьями об описании устройства синтезатора Yamaha, я написал следующий алгоритм:
1. При помощи функции SIN создается основная или моделирующая волна, вот формула которая может пригодиться другим разработчика:
Где:
amplitude1 — амплитуда
frequency1 — частота колебаний
faza — начальная фаза колебаний
2. При помощи второй функци SIN, создается основная волна, амплитудой в которой выступают значения первой волны:
Скриншот программы
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/8dd/b29/e1f/8ddb29e1f224f0d7b2fd2c6a6aacac29.png)
Тестовые звуки я загрузил в программу lmms.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/34a/dad/83e/34adad83e9d9a9d87cb82f20fb1f320e.png)
Послушать mp3
Будет реализован другой алгоритм, который будет работать по каналам, если получится напишу о нем во второй статье.
Update:
По замечаниям комментаторов алгоритмы теперь можно перемножать сами на себя и между собой.
Update 2: Программа обновлена, теперь к звуку волну можно примешать.
волна, колебания, затухающие колебания, волна может быть описана с точки зрения физики, волна может быть описана с точки зрения математики.
Скачать и протестировать программу
Поскольку моделируем мы на компьютере, то наша волна описывается при помощи последовательности (ряда Фурье) из байт (чисел от -128 до 127 и ноля), тоесть массивом байт.
Уравнение колебательных движений лучше всего описывает функция SIN.
Согласитесь было бы слишком просто, если бы мы просто прогнали по массиву функцию SIN.
Поэтому руководствуясь статьями об описании устройства синтезатора Yamaha, я написал следующий алгоритм:
1. При помощи функции SIN создается основная или моделирующая волна, вот формула которая может пригодиться другим разработчика:
for(int k = 0; k < SoundLabVisual.player.data.length;k++){
double sinusoid = amplitude1 * Math.sin(2 * (3.14/1 ) * k * frequency1 + faza);
}
Где:
amplitude1 — амплитуда
frequency1 — частота колебаний
faza — начальная фаза колебаний
2. При помощи второй функци SIN, создается основная волна, амплитудой в которой выступают значения первой волны:
//cдвиг по оси
double a1 = 0.1f;
//cдвиг по оси
double c1 = 0.1f;
//cдвиг по оси
double d1 = 0.1f;
sinusoid = a1 + (sinusoid * Math.sin( (c1 * (double)k) * frequency2Double + d1 ));
Скриншот программы
![image](https://habrastorage.org/getpro/habr/post_images/8dd/b29/e1f/8ddb29e1f224f0d7b2fd2c6a6aacac29.png)
Тестовые звуки я загрузил в программу lmms.
![image](https://habrastorage.org/getpro/habr/post_images/34a/dad/83e/34adad83e9d9a9d87cb82f20fb1f320e.png)
Послушать mp3
Будет реализован другой алгоритм, который будет работать по каналам, если получится напишу о нем во второй статье.
Update:
По замечаниям комментаторов алгоритмы теперь можно перемножать сами на себя и между собой.
if(jCheckBox8.isSelected()){
sinusoid = (a1 + (sinusoid * Math.sin( (c1 * (double)k) * frequency2Double + d1 ))) * (a1 + (sinusoid * Math.sin( (c1 * (double)k) * frequency2Double + d1 )));
}else{
sinusoid = a1 + (sinusoid * Math.sin( (c1 * (double)k) * frequency2Double + d1 ));
}
Update 2: Программа обновлена, теперь к звуку волну можно примешать.