Немного теории, что мне известно о звуке — звук это:
волна, колебания, затухающие колебания, волна может быть описана с точки зрения физики, волна может быть описана с точки зрения математики.

Скачать и протестировать программу


Поскольку моделируем мы на компьютере, то наша волна описывается при помощи последовательности (ряда Фурье) из байт (чисел от -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

Тестовые звуки я загрузил в программу lmms.

image

Послушать 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 ));
}

Комментарии (22)


  1. maslyaev
    29.11.2018 13:14

    По сколько моделируем мы на компьютере
    Поскольку
    Извините за граммар-нацизм


    1. Padaboo Автор
      29.11.2018 13:19
      -1

      Поправил


    1. musicriffstudio
      29.11.2018 16:07

      "Поскольку"
      Извините за граммар-нацизм.


      1. maslyaev
        30.11.2018 11:36

        Сдаюсь.


      1. berez
        30.11.2018 16:35

        Извините за граммар-нацизм.

        Это не граммар-нацизм, а пунктуационный докоп.


  1. vilgeforce
    29.11.2018 13:47
    +3

    «Уравнение колебательных движений лучше всего описывает функция SIN.» — насколько хуже колебания описывает функция COS? Чем хуже?


    1. Padaboo Автор
      29.11.2018 15:07
      -2

      Это одно и тоже с двигом на по оси X.


      1. vilgeforce
        29.11.2018 15:09

        Спасибо, кэп! Вопросы видите, что по ним скажете?


      1. AntonSazonov
        30.11.2018 05:06

        Скажите, а вы кто по национальности?


  1. VaalKIA
    29.11.2018 14:00
    +1

    Это вступление к CSound? На первой картинке, какой-то подозрительный излом на графике, сразу за первой волной, сдаётся мне, вашей проге нельзя доверять.


    1. Padaboo Автор
      29.11.2018 14:33

      Там есть часть кода которая поправляет разрывы и прочие неровности волн, для того, что бы звучание не портилось.


  1. Doberman341
    29.11.2018 14:46

    Модуляция звука, суть, умножение колебательных уравнений. Дает в спектре разностную и суммарную частоты. А у Вас описана суперпозиция волн, то есть — сложение. В спектре будет просто две волны. Зачем в формуле волны делить Пи на единицу?
    Ну и непонятно, что же вы хотели сказать данной статьей? Складывается ощущение, что она не доделана…


    1. Padaboo Автор
      29.11.2018 14:47

      Отличная идея, попробую: что умножать сами уравнения или их результаты?
      Мой второй вариант волна кторая будет колебаться в канале первой.


      1. Doberman341
        29.11.2018 14:55

        Формулы колебания умножать:
        A1*SIN(2*Pi*F1+Ph1) * A2*SIN(2*Pi*F2+Ph2)
        Вот это и будет модуляцией.
        В спектре дополнительно появятся колебания вида:
        A3*SIN(2*Pi*(F1+F2)+Ph1) и A3*SIN(2*Pi*(F1-F2)+Ph1)
        А у Вас — наложение волн, это не совсем то…


        1. Padaboo Автор
          29.11.2018 14:57

          Хорошо попробую несколько вриантов:
          1) умножить первое уравнение само на себя.
          2) первое уравнение на второе
          3) первое на первое и второе на второе


        1. Padaboo Автор
          29.11.2018 14:58

          Волный друг на друга не накладываются, просто по первой волне строится вторая.


          1. Doberman341
            29.11.2018 15:02

            Да, пардон, не сразу увидел.


        1. Padaboo Автор
          29.11.2018 15:53

          Сделал программу перезалил


  1. Padaboo Автор
    29.11.2018 16:17

    После обновления программы нашел звук похожий на колокол спасибо Doberman341


  1. REPISOT
    29.11.2018 18:02

    звук это:
    И что же это? Вы не написали, что такое звук.

    P.S. О чем я сейчас прочитал? Что хотел донести до читателя автор? Я не понял.


    1. Padaboo Автор
      29.11.2018 21:38
      +1

      О том как синтезировать звук при помощи математики, а не микросхемы.


  1. REPISOT
    30.11.2018 07:42

    Неа, не об этом.