Синтез музыкального звука. Программирование

Дмитрий Маштаков
  ~статья обобщает опубликованное ранее 10.06.2016 ~
  последняя статья на эту тему - http://www.proza.ru/2018/06/26/656

  Проблема компьютерного синтеза музыкального звука имеет две стороны - первая, чисто прикладная, связана с созданием конкретных музыкальных записей, вторая - более интересная, концентрируется на исследовании того, что мы можем назвать полноценным музыкальным звуком, с богатым тембром,- в отличие от невыразительного писка синусоиды. Два приложения имеет и тот метод, о котором я буду рассказывать.


   ОСНОВЫ МЕТОДА СИНТЕЗА

  Метод, в свою очередь, имеет три предпосылки.

1. Он не использует никаких записей реальных музыкальных инструментов. Амплитуды звука вычисляются математически. Хотя разумеется, алгоритм вычислений был создан на основе тщательного изучения реального звука.
   Это я говорю к тому, что люди, делающие синтезированный звук, как правило, так не поступают. Они мало изучают реальный звук, а берут за основу простейшие периодические последовательности - синусоиду, пилу или меандр, и преобразуют их, добавляют обертоны, смешивают, умножают и вычитают, двигают рычажки на пульте синтезатора, и потом, вдруг, совершенно случайно... И говорят - Вау, мы получили, и даже на звук скрипки похоже. А непохоже!
   Или ещё проще - берётся банк данных заранее записанного звука реальных инструментов, и из него, некими манипуляциями делаются аппликации. Получается неплохо, но это не математический синтез, который в далёкой перспективе мог бы дать красоты, недостижимые в звуке реальном.
 
2. Для синтеза звука используется старая, хорошо известная всем, но очень удобная среда программирования Турбо Бейсик.
   Опять же, так не делает никто. Используют более совершенные, но менее наглядные языки программирования, или специализированные среды, такие, как ChucK или Pure Data, которые заранее имеют недостаток, отмеченный в п.1.
О результате я не слышал.

3. Используется по-периодный метод синтеза звука. Он заключается в том, что основной звук создаётся в виде похожих друг на друга отрезков, имеющих длину периода звукового колебания. Похожих, но несколько различающихся от одного периода к другому. Форма звука внутри каждого периода вычисляется быстро по достаточно простым формулам с некими параметрами. В процессе этого вычисления звуковой файл быстро заполняется семплами. Однако в перерыве между периодами можно не торопиться, можно изменить и формулы, и параметры в них по достаточно сложному сценарию, такому, чтобы звук в результате получался богатым и красивым, и даже похожим на реальный звук.
Как говорится, по отдельности, но вместе - и быстро, и сердито.
   Но не сделать ли проще - возьмём рельеф звука кларнета внутри одного периода, и растиражируем его по всем остальным периодам? Увы, у Вас получится не звук кларнета, а занудное пищание.
   Как меняются параметры, так и меняется звук, поэтому сценарий развития звука нужно писать с умом.
   И опять же, никто так не делает. Почему? Загадка для меня. Наверное потому, что никто в Турбо Бейсике с серьёзными целями не работает. Однако, посмотрите, как красивы и лаконичны сценарии развития звука, записанные на языке Турбо бейсика -

  CASE 40 'viola ЗВУК АЛЬТА (трепетный)
      MU2=INT(32*F/220)+.1 : AU2=4 : DU2=160.998 : IF UD1b>0 THEN DU2=UD1b
      mod2=33 : Vi=.35 : DK1=.94
     Rn(0)=0 : V=FNRn1(0,1006.4) : V=FNRn1(0,2006.4) : V=FNRn1(30,-9)
  CASE -41 : IF NT=100 THEN MU2=MU2*2-.1
      IF UW1>0 THEN mod2=30+UW1
      Vo=.1*FNTIM(16/(1+T),T) : IF UV1>0 THEN Vi=UV1

  CASE 2 : 'f-no ЗВУК ФОРТЕПЬЯНО
    MU1=64.1 : AU1=2 : DU1=3.995
     MU3=0 : AU3=1.5 : DU3=2.99
    IF FS>260 THEN
      Mpm=260/FS : AU3=AU3*260/FS : DU1=INT(3*FS/260)+.995+.003*(1-260/FS)
      MU1=INT(60*FS/260)+.1*260/FS : END IF
    '>>>>="_1_2_3_4_5_6_7_8_9_0_1_2"
     Arr$="905030307050505070303050"
  Apm$="505050707050505560657035504744433857" : Dpm=.98
   CASE -2 : E0=1.25*(1+.2*FNTIM(4,T)) : EA=.3*(1+.2*FNTIM(8,T))
   E1=1.3*(1+.2*FNTIM(10,T)) : E2=1.3*(1+.2*FNTIM(7,T))

  CASE 9 'bell  ЗВУК КОЛОКОЛА
    MU1=0 : AU1=2 : DU1=2.998
    MU5=000.85 : AU5=-1 : DU5=2.998
    MU7=000.855 : AU7=-1 : DU7=2.998
    MU6=4000.124 : AU6=2 : DU6=2.998
  CASE -9 : EA=-2/(1+200*T)

Нужно только, задав частоту и указав номер сценария, обратиться к функции, делающей звук, столько раз, сколько сэмплов этот звук должен длиться.
  И ничего кроме, всё остальное делается по единому алгоритму. Но звук, сделанный по тому или другому сценарию, различается разительно.
  Не посвящённому в "тайны" Бейсика человеку даже сценариев знать не нужно, он может воспользоваться уже готовыми сценариями, корректируя их с помощью указаний в партитуре.

  Ещё раз повторю - никто так не делает. Обычно тембр звука подбирают не изменением рельефа внутри периода, а добавлением некой совокупности обертонов. И результат получается по моему мнению не очень хороший. По крайней мере из того, что я слышал.
  Однако метод, о котором я рассказываю, и обертонов не чужд. В сценарии звука колокола, в строках с параметрами 5, 7 и 6 задаются обертоны. Но и остальное в этом сценарии очень важно, на одних обертонах получить хороший звук трудно.


   КАК ВСЁ РАБОТАЕТ

   Сценарии, показанные выше, находятся в тексте программы ТРИО, которая способна озвучивать и соединять в едином звучании три голоса, да каждый ещё и с аккордами. Программу не нужно компилировать, поскольку Турбо Бейсик текст программы компилирует в код перед каждым исполнением, и поэтому выполнение программы идёт быстро. Чрезвычайно удобно и то, что, внесённые в сценарий изменения можно тут же прослушать.

   Как же работает озвучивание?
   В программе ТРИО есть три автономных раздела, три "МУЗа" - три музыканта, каждый со своим инструментом - функцией создания звука. Звук какого именно инструмента создавать - каждый МУЗ читает из своей партитуры, в которой пометками между строк есть и указания на номер сценария, и на громкость, и на изменение тембра звучания, и даже на изменение высоты и тональности звучания.
Но основное, что есть в партитуре, это последовательность частот, вместе с длительностями звучания нот и длительностями после-нотных пауз, если такие есть. Ну, и разумеется, отдельными строками - паузы и их длительности.

   Что представляет из себя партитура?
   Это обычный текстовый файл, разделённый чёрточками на странички, и имеющий маркер в виде трёх запятых на последней строке. Например, такой:

 1 ================= TF1.TXT   VEL= 32000
  R=7 H=1 G=/35 Ar=3 
 L= 27600
F= 196  T1= 22540  T2= 460
 L= 32200 G=/24
F= 220  T1= 22540  T2= 460
 L= 32200 G=/35
F= 196  T1= 45080  T2= 920
 L= 55200 G=/43 Ar=1
F= 207.6499938964844  T1= 22540  T2= 460
 L= 32200 G=/24 H=.5
F= 220  T1= 22540  T2= 460
 L= 32200 G=/53 H=1
F= 196  T1= 22540  T2= 460
 2 ============ 
,,,

Здесь R=7 H=1 G=/35 Ar=3 - указания на сценарий 7 (аккордеон),
звук тихий, аккорд с дополнительными нотами на интервалах 3 и 5 выше указанной частоты,
тембр - резкий.
  Дальше в строках пауз указываются аккорды к следующим нотам.

Такие же файлы-партитуры есть и у других МУЗов, если они тоже "играют".
А не играют - можно их отключить, поставив апостроф в нужном месте текста программы ТРИО, или поставить три запятые сразу после первой черты партитуры.

Глядя на текстовые файлы партитуры можно вспомнить структуру МИДИ формата, которая несоизмеримо сложнее, и в которой можно разобраться только с помощью специальных редакторов. А по сути дела - это одно и то же.
  Но откуда же берутся файлы партитуры? Кто вычисляет частоты звучания нот и длительности пауз?
Это делает программа ПИАНОЛА - пианино на клавишах компьютера. Они так и работают в паре - программа ПИАНОЛА и программа ТРИО.

  Я запускаю программу Пианола, смотрю в ноты, или импровизирую, нажимая на клавиши. Обозначения нот пишутся в нотные строки. Я проигрываю то, что получилось, исправляю, редактирую, добиваясь нужного темпа и ритмики звучания мелодии, запоминаю результат в текстовом файле.
А если захочу, то проигрываю мелодию целиком, и программа делает партитуру того, что я записал в нотных строках. Из каждой строки получается страничка партитуры.
  Нужен второй голос - точно так же делаю партитуру и для него. Можно одновременно работать в двух окнах и, используя счетчики, синхронизировать звучание отдельных голосов.
  В полученную партитуру в нужных местах я вставляю указания, вроде этого: R=7 H=1 G=/35 Ar=3 - по какому сценарию создавать звук, как громко, нужны ли аккорды, каким тембром.
Всё достаточно просто.
  Со всеми указаниями разбираются МУЗы, когда читают партитуру. Они же обращаются к звуковой функции, каждый - к своей. Получают от звуковой функции амплитуду звукового колебания и передают её дирижёру. Дирижёр - это небольшая часть программы. Он, как и настоящий дирижёр, руководит музыкантами, раздаёт им партитуры, просит подождать того, кто ошибся и слишком рано закончил играть свою страничку. Полученные от МУЗов амплитуды дирижёр складывает и записывает в звуковой файл и, по окончании работы, он этот файл закрывает.
  Как работает звуковая функция показано на рисунке. Подробные пояснения к рисунку находятся здесь - http://www.proza.ru/2016/03/28/350

  Но наибольшая ценность всего, о чём я Вам рассказал - исследовательский аспект. Работа со сценариями и совершенствование этих сценариев позволит достаточно хорошо разобраться в сущности того явления. которое мы называем музыкальным звуком.
  Нет никаких ограничений к исследованиям, хотите - звук трубы, хотите - звук барабана. Кстати, строка Apm$ в сценарии звука фортепьяно передаёт стук клавиши. Хотите по-другому - совершенствуйте, регулируйте.

Скачать Пианолу и ТРИО (2 файла - TRIO.BAS и TRIO_FN.BAS) вместе с Турбо Бейсиком можно по этим ссылкам -
http://yadi.sk/d/5u-HJdxls6LKS
http://yadi.sk/d/QvD6_C70rDQKo
Последняя версия программы Пианола и комплекс программ ТРИО находится тут -
http://yadi.sk/d/zv-WYZdC328cGV но это всё на языке Турбо Бейсик. Рекомендую ознакомиться и использовать более продвинутый вариант проекта по следующим ссылкам:

 ВНИМАНИЕ  Программы Пианола и ТРИО переведены на язык VB6
исходники программы Пианола находятся тут - http://yadi.sk/d/O99BeORs3NG4z5
исходники программы Трио тут - http://yadi.sk/d/wmi511zH3MEmEv
  Откомпилированные программы для практического их использования, здесь -
 http://yadi.sk/d/FBHosWpK3MLC6T
_______________
 дополнение от 1.10.2017 Дмитрий.


  Этой статьёй я завершаю то исследование в области компьютерного звука, которое начал полтора года назад - http://www.proza.ru/2015/04/02/1578
  Уважаемые читатели, если у Вас будут какие-нибудь замечания, мнения или предложения по теме исследования - пишите сюда или на почту.

================= июнь 2016
P.S. Появились и практические результаты. В звуках фортепьяно.
Вот здесь всё подробно описано -
http://www.proza.ru/2016/09/03/816
http://www.proza.ru/2016/09/18/951
Со всеми последующими записями можно познакомиться тут - http://yadi.sk/d/poMxlrBuxendv