Рельеф звука

Дмитрий Маштаков
  Речь пойдёт о синтезе звука альта путём наложения двух структур - пичковой и рельефной.
  Уважаемые скрипачи и виолончелисты, пишу об альте, а не о скрипке или виолончели только потому, что нахожусь в контакте со студентом консерватории Н.Скибой, играющим именно на альте, и благодарен ему за поддержку работы по математическому моделированию музыкального звука и за обсуждение её результатов.

  В одной из предыдущих статей рассказывалось о программе создания многоголосия TRIO.bas, в которой три музыканта - три небольших блока программы, названные МУЗами, под управлением Дирижёра читают каждый свою партитуру, играют каждый на своём инструменте, используя тот или иной сценарий развития звука, и создают сообща звуковой WAV файл музыкального произведения.
  Партитуры готовятся программой Пианола и озвучиваются программой ТРИО - таким образом, связка этих программ образует законченный комплекс для создания музыки путём математического моделирования.

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

- создание музыкантов определённой направленности (альтистов, пианистов и др.) владеющих большим исполнительским мастерством (набором программных средств) каждый в своей области
- создание из этих музыкантов ансамблей - трио, квартетов и др. (программ, аналогичных ТРИО)

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


   ПИЧКОВАЯ И РЕЛЬЕФНАЯ СТРУКТУРЫ ЗВУКА АЛЬТА

  В одной из предыдущих статей говорилось о том. что альт - инструмент с очень простым звуком, и с очень непростым эхом. И в самом деле - начальный звук альта представляет собой острый пичок, соответствующий спаданию струны со смычка. Пичок может быть достаточно широким - до 0.5 полупериода колебания, если звук извлекается вблизи середины струны, там, где она достаточно эластично следует за смычком. При игре вблизи подставки пичок становится узким - до .15 полупериода и меньше. Жёсткость струны обеспечивает быстрое её движение при срыве со смычка.
  Таким образом, пичок треугольной формы и изменяемой шириной с целью изменения тембра - самое простое средство для изготовления альтового звука.

  Но звук альта Вы таким способом не получите. Вы получите достаточно красивое и очень ровное тонкое гудение, действительно, изменяемого тембра, и, действительно, больше напоминающее звук альта, чем звук трубы.
  Давайте подумаем, как приблизить синтезированный звук к звуку реального инструмента?
  Ответ прост. Альт - не только струна со смычком, он ещё и резонатор.
  Можно заставить пичок двигаться с частотой от 4-х до 12-ти Гц и пропустить звук через ревербератор, задав в нём несколько разнообразных запаздываний. И тогда мы получим звук значительно более похожий на альтовый, с очень красивым, ощутимым на слух эхом. Об этом говорилось в статье о ревербераторе.
  Казалось бы - ну, и хорошо. Будем развивать это направление.
  Но ревербератор штука громоздкая - минимум 5000 ячеек каждому музыканту, и Бейсик начинает возмущаться, - памяти ему мало. Разумеется, современные средства позволяют эту заминку обойти, но ревербератор, кроме того ещё штука непредсказуемая. Каким будет результирующий звук, как управлять тембром - сказать трудно. Примерно также, как если бы Вы, не скрипичный мастер, взялись бы сооружать скрипку - что у Вас получится, да и получится ли?
  Эхо ревербератора определяется точками его заброса, но кто скажет, как эти точки наилучшим образом расположить? Сколько их должно быть, этих точек? Должны ли они следовать частоте звука, или их следует привязать к фиксированным частотам? В общем, хоть метод создания эха в ревербераторе представляется очень интересным, но он "сырой", и нуждается в тщательном исследовании.
  И, наконец, ревербератор, это вещь, замедляющая вычисления. Если использовать его в усечённых возможностях, замедление не будет существенным - увеличение времени счёта в 2 раза вполне приемлемо. Но усечённые возможности не дают желаемого результата. Находя компромисс, хорошо бы знать - что и где усекать. Чтобы и звук получался красивым, и время счёта не было бы слишком затянуто. Однако мы, как было сказано, этого не знаем.

   Давайте, пока забудем про ревербератор и посмотрим на результат - посмотрим на осциллограмму вышедшего из ревербератора эха. На осциллограммах видно, что промежуток между начальными пичками звука, расположенными в начале каждого периода, промежуток, ранее пустой, теперь забит пичками эха, разной амплитуды и разной степени сглаженности. Эти пички наползают друг на друга, а поскольку вершина начального пичка двигается, или потому, что мы такое движение задали, или потому, что мы задали периодическое изменение ширины пичка в небольших пределах, постольку вся система пичков эха тоже находится в движении. Полученный общий рельеф звука непрерывно меняется.
   Но давайте движение пичка остановим, не будем двигать его и не будем менять его ширину. О, тогда живость получаемого звука сразу пропадёт, - обладая обертонами, он будет красив, но он не будет живым звуком альта.
   Проблема ясна, и сразу становится понятным её решение - к пичковой структуре, создаваемой группой Виола, следует добавить структуру рельефа. Причём или рельеф следует сделать изменяемым, или организовать движение пичка (или нескольких пичков!) по неподвижному рельефу.


   ВЗАИМОДЕЙСТВИЕ ПИЧКОВ И РЕЛЬЕФА ЗВУКА

  Итак, в создании звука альта у нас не участвует первая группа параметров (группа фортепьяно), но участвует группа Виолы (вторая группа) и группа рельефа (третья группа).
  Рельеф в третьей группе задаётся строкой Arr$. По ней, в зависимости от фазы колебания X, проводится сплайн-интерполяция и находится амплитуда.
  Давайте посмотрим на сценарий CASE 40 (он попроще) и разберёмся с ним. Вы видите - в нём задаётся строка Arr$ в явном виде. Однако, если мы на одной из строк в партитуре для третьего МУЗа сделаем запись Ar=17, то флаг ARE3 будет установлен в положение 10 и строка Arr$ будет заполнена другим содержанием (закодированным под номером 17).

  CASE 40 'viola
    MU2=0 : AU2=4 : DU2=150.99 :  IF UD3b>0 THEN DU2=UD3b
    mod2=32 : Vo=.6 : Vh=.8 : Vi=.35 : IF UV3>0 THEN Vi=UV3
    MU3=67.06 : AU3=3 : DU3=10.999 : IF UD3c>0 THEN DU3=UD3c
     Arr$="63807350424854423242424550 687167404355686242404338434759475545" 'red
     IF ARE3=10 THEN IF LEN(A3rr$)>2 THEN Arr$=A3rr$
  CASE -40 : IF NT=100 THEN MU2=40.05
             Vo=.6+.2*FNTIM(FS/64,T)

  ознакомимся с другими возможностями изменения сценария 40 с помощью пометок в партитуре.
  Мы видим, что для группы Виола задан диссипативный фактор DU2=150.99
это означает, что первые 150 периодов амплитуда пичка будет линейно нарастать от нуля до амплитудного значения AU2=4, а потом она пойдёт на убыль по экспоненте, уменьшаясь каждый период в соответствии с множителем .99 Аналогичное значение имеет диссипативный фактор группы рельефа - DU3=10.999.
  Но эти факторы при желании можно изменить, указав для них в партитуре другие значения -
   UDb=... или UDc=... Можно изменить также и ширину пичка Vi, указав в партитуре  новое её значение - UV=...
  Если никаких указаний в партитуре не делать, то соответствующие переменные UD3b, UD3c и UV3 сохраняют значения ноль, и в этом случае параметры берутся из сценария.

  В сценарии 40 для создания пичка взята модификация mod2=32. В этой модификации создаётся не один пичок, а три. Первый пичок неподвижен, он находится в начале периода. Второй пичок ниже первого на величину Vh=.8 и сдвинут в сторону запаздывания на .6 полупериода с периодическим движением около этой точки в пределах +-0.2 с весьма низкой частотой - в 64 раза более низкой, чем частота колебания.
  Имеется и третий пичок, меньший второго на Vh=.8 и повторяющий движения второго пичка, находясь на расстоянии вдвое большем от первого пичка.
  Оба подвижных пичка двигаются по рельефу, заданному в строке A3r$, и обозначенному как рельеф 'red, а списан этот рельеф с рельефа звука реального альта. Об этом речь пойдёт впереди, а пока, давайте, послушаем результат работы сценария 40.
  Запись "чакона 40" Вы можете прослушать здесь - https://yadi.sk/d/R-kj3tr8rDQVh
  Не правда ли, получился строгий и красивый звук.
  Запись озвучивания этой же партитуры по другому сценарию мы прослушаем ниже. А пока займёмся проблемой создания рельефа.


   ЗВУК АЛЬТА БЕЗ ПИЧКОВ. СОЗДАНИЕ СТРОК РЕЛЬЕФА. РОТАЦИЯ СТРОК.
   СЦЕНАРИЙ CASE 4 'viola

  Идея, до ужаса простая - запишем звук натурального альта, и создадим рельеф, соответствующий его осциллограмме. А чтобы звук не казался мертвенным и неподвижным, строку Arr$, по которой пишется рельеф, заполняющий период, будем слегка изменять во время смены периодов колебания.
  По записи звука натурального альта на разных фазах его развития мы можем приготовить не одну, а три строки, задающие рельеф, и в ходе синтеза звука осуществлять плавную их ротацию, постепенно переходя от одной строки к другой.
  Как приготовляется строка - показано на рисунке. Строки рельефа 'red, 'blue и 'green пишутся на нижней границе окна блокнотика, окна, которое перекрывает демонстрационную картинку профилей звука.
У нас для каждого профиля получилось 31 число, из двух цифр каждое, представляющее собой амплитуду, серединная линия колебаний которой находится на уровне 50.
  Разумеется, нужно потрудиться, чтобы в программе Paint сделать такую картинку, наложив колебания, снятые с осциллограммы нажатием Принт Скрин, в подходящем масштабе на заранее подготовленную для этого сетку. Но результат того стоит.
  Метод, казалось бы универсальный - не только звук альта, но и любой другой звук Вы можете сделать таким способом. Но не спешите радоваться. Хаотическая ротация трёх строк приводит и к результату хаотическому. В частности, никакого эха Вы при такой ротации не услышите.
  Эхо появляется не при хаотическом, а при регулярном движении одной структуры звука относительно другой, и неплохо при этом, если ухо эти структуры звука различает.

  Утверждение это имеет вполне естественное объяснение - представьте, что Вы находитесь на лесопилке. Циркулярная пила шумит, и некоторые её шумы и взвизги улетают к окрестным холмам и скалам, и возвращаются в виде эха. Не только по запаздыванию звука мы судим об эхе. Эхо имеет другой, более сглаженный спектральный состав, распространяясь в значительном пространстве, оно вбирает в себя флуктуации воздуха, влияющие на скорость распространения звука, интерференция нескольких эхо также приводит к временным сдвигам. И наше ухо, как оказывается, очень чётко отмечает такие тонкости.
  Поэтому, создавая рельеф звука, отказываться от других методов создания звука не следует, тем более. что эти другие методы обладают более простыми возможностями к регулировке тембра.
  Например, сузил плавно ширину пичка - и перевёл тем самым смычок от середины струны к игре у подставки не прерывая извлечения звука. Чтобы такое сделать с рельефом, нужно его строки менять, и менять достаточно плавно.
  Потому звук альта без отдельной пичковой структуры создать можно, но лучше использовать и ту и другую структуры в паре.
  На правом верхнем слайде рисунка показана осциллограмма синтезированного звука в ротации строк по 4-му сценарию без заметного использования пичковой структуры. Форма звука вполне соответствует цветным кривым рисунка. На слайде ниже - пичковая структура сценария 4 на фоне рельефа, рассчитанного по обертонам 4-го флажолета. Подробности расчёта строки рельефа для флажолета носят технический характер, и будут обсуждаться в следующей статье.
  На самом нижнем слайде показана трёхпичковая структура сценария 40 на фоне рельефа 'red.

  Но, давайте, посмотрим на сценарий Виолы номер 4, в котором осуществляется ротация строк -

  CASE 4 'viola
    MU2=20.2 : AU2=4 : DU2=150.99 : IF UD3b>0 THEN DU2=UD3b
    mod2=3 : IF UW3=2 THEN mod2=30
    MU3=67.06 : AU3=3 : DU3=10.999 : IF UD3c>0 THEN DU3=UD3c
    'red
    IF ARE3=10 THEN IF LEN(A3rr$)>2 THEN Arr$=A3rr$
    IF ARE3=0 OR ARE3=1 THEN
   A31r$="63807350424854423242424550 687167404355686242404338434759475545" 'red
   A32r$="60727855305065634247484030 435348584036787755483755372350483944" 'blue
   A33r$="58777982464034533520405540 776877423260686040503640315460426238" 'green
    END IF
  Apm$="505050707050505560657035504744433857" : Dpm=.999 : Mpm=.5
  CASE -4 : Vi=.35 : IF UV3>0 THEN Vi=UV3
        IF UW3<2 THEN Vi=Vi+Vi*.43*FNTIM(4/(1+.6*T),T) 
     IF NT=100 THEN MU2=40.05
     IF ARE3<>10 THEN A3r$=FNRE$((.8*FNTIM(3,T)+.6*FNTIM(5,T))/2,3)
     IF UW3=1 THEN Vo=.2*FNTIM(FS/64,T)
     IF UW3=2 THEN Vo=.3*FNTIM(8,T)+.3/(1+T)

многое в этом сценарии Вы можете понять сами, по предыдущим объяснениям.
  Строки 'red, 'blue и 'green ротируются обращением к функции FNRE$
  Ротации, однако, не происходит, если в партитуре указать Ar=14, загрузив в A3rr$ рельеф 4-го флажолета и установив флаг ARE3 в положение 10.
  Назначение в партитуре UW=1 добавляет пичку движение и сдвигает тембр в сторону торжественности звучания. Небольшую торжественность создаёт и строка Apm$ - "толкай в плюс-минус"

  Но, давайте, перейдём к прослушиванию результатов озвучивания с использованием сценария 4



   КОРРЕКЦИЯ СЦЕНАРИЯ ИЗ ПАРТИТУРЫ

  Привожу партитуру полностью. Так, как она записана в текстовом файле.
F - обозначения частот L - обозначения пауз T1.T2 - длительность звучания и длительность паузы перед следующим звуком.

 1 ================= TF.TXT   VEL= 32000
  R=4  H=3 UW=1
F= 220  T1= 56448  T2= 1151
   UW=0
F= 220  T1= 9407  T2= 191
F= 329.6300048828125  T1= 47040  T2= 959
 L= 9600
F= 329.6300048828125  T1= 56448  T2= 1151
F= 329.6300048828125  T1= 9407  T2= 191
F= 349.2300109863281  T1= 47040  T2= 959
 L= 9600 Ar=14 H=4 UW=1
F= 293.6600036621094  T1= 65856  T2= 1343
    Ar=0 H=3 UW=0
F= 261.6300048828125  T1= 9407  T2= 191 
F= 233.0800018310547  T1= 47040  T2= 959
F= 220  T1= 37631  T2= 767
  R=40
F= 196  T1= 11760  T2= 239
F= 174.6150054931641  T1= 9407  T2= 191
F= 164.8150024414062  T1= 11760  T2= 239
F= 174.6150054931641  T1= 9407  T2= 191
F= 196  T1= 11760  T2= 239
F= 164.8150024414062  T1= 9407  T2= 191
F= 174.6150054931641  T1= 11760  T2= 239
F= 146.8300018310547  T1= 9407  T2= 191
  R=4
F= 220  T1= 65856  T2= 1343
F= 220  T1= 9407  T2= 191
F= 329.6300048828125  T1= 37631  T2= 767
 L= 9600
F= 329.6300048828125  T1= 65856  T2= 1343
F= 329.6300048828125  T1= 9407  T2= 191
F= 349.2300109863281  T1= 47040  T2= 959
 L= 9600 Ar=12 UW=1 H=4
F= 293.6600036621094  T1= 65856  T2= 1343
    Ar=0
F= 293.6600036621094  T1= 9407  T2= 191
    Ar=15
F= 466.1600036621094  T1= 37631  T2= 767
    Ar=0
F= 440  T1= 37631  T2= 767
 2 ============ 912000  912000  28.5
,,,

  Как видно, тембр звучания довольно активно корректируется пометками в партитуре.
  Назначения открываются строкой   R=4 H=3 UW=1, устанавливающий номер сценария. громкость звучания и торжественность звучания.
  Обратите внимание на временный переход к сценарию номер 40 в проигрыше быстрыми нотами. Этот переход создаёт слышимую на слух сдержанность звучания.
  Три звука с назначениями перед ними Ar=14 Ar=12 и Ar=15 создаются на рельефе флажолета с номерами 4, 2 и 5. Обратите внимание на выразительность звучания тембров, основанных на флажолетах.

  Запись можно прослушать по этому адресу - https://yadi.sk/d/yzMLzaFZrDQbs
а за партитурными назначениями, приводящими к изменению тембра звука можно проследить по рисунку, в нижней части которого осциллограмма записи приведена полностью.


   НЕКОТОРЫЕ ЗАМЕЧАНИЯ ОБЩЕГО ПЛАНА

 1.  Методы математического моделирования, которые развиваются в рамках программы озвучивания, основаны на посемпловой и на попериодной структуре создания звука. Создаваемый звук представляет собой функцию амплитуды от времени с чётким членением на периоды, в начале и в конце которых амплитуды малы настолько, что их можно считать равными друг другу, и которые чётко следуют частоте звука.
   Почему возникает это требование - малости амплитуды колебания в начале и в конце периода? А возникает оно потому, что перед началом нового периода мы хотим как-то изменить амплитудный рельеф, изменить незначительно, но всё же изменить, и хорошо, если такие изменения придутся не на ту часть колебания, где амплитуда велика, а на ту часть, где она мала - на то место, которое мы обозначили за конец старого и за начало нового периода. В этом случае, при замене рельефа, не может возникнуть резких и непредусмотренных перепадов амплитуды, которые будут слышны как треск, или неприятный тон той частоты, на которой мы работаем.
   Все переходы должны быть достаточно гладкими. Если - нет, то тогда придётся их принудительно сглаживать. Вот почему изменения рельефа следует делать при малой его амплитуде.
 
   Итак, поведение звука внутри каждого периода переопределяется на границе его начала, на что уходит достаточное количество вычислительного времени, но зато внутри периода вычисления ведутся такими средствами, которые это позволяют делать быстро. Подобный подход позволяет строить эффективные структуры моделирования звука в рамках простейшей среды программирования - Турбо Бейсик.
   По-периодное моделирование накладывает некие общие ограничения на класс звуковых функций, которые должны быть представлены целыми обертонами в отношении основной звуковой частоты. Хотя это обстоятельство можно обойти, если использовать отдельную обертонную группу, которая имеется в начальном проекте, и которую можно предоставить в распоряжение каждому музыканту, но которая пока не введена в программу ТРИО, в частности потому, что вычисления амплитуд обертонов, выпадая из общей концепции, задерживают скорость работы внутри периода. И в самом деле - в ТРИО инструментах имеется три группы создания звука - группа фортепьяно, группа Виолы и группа рельефа. Из этих групп практически одновременно работают только две. Однако каждый лишний обертон будет требовать таких же вычислительных мощностей.
    Тем не менее обертонную группу наверное придётся вводить в будущие ансамбли. Без неё вряд ли может быть хорошо смоделирован звук органа или колоколов.

    Компьютер, на котором я работаю, - не самый современный, тактовая частота составляет 700 мГц. А вот частота исполнения оператора присвоения типа A=B, достижимая для Турбо Бейсика, составляет только 5 мГц, то есть оказывается в 140 раз меньшей, чем тактовая частота. Я понимаю, что время тратится не только на пересылку значения переменных, но и на их адресацию, да и ещё какие-то задачи машина параллельно для себя может решать.
     Время записи тех звуковых фрагментов, которые Вы прослушали, равно времени их звучания. А поскольку время раздачи составляет 32000 семплов в секунду, можно заключить, что на изготовление одного семпла тратится 20000 тактов машинного времени. Что не удивительно – для оператора присвоения – 140, и по программе таких операторов столько же наберётся, вот 20 тысяч тактов и набежало. Так что – не надейтесь на быстродействие компьютера, берегите его.

 2.  Методы моделирования, основанные на попериодной структуре, показывают простоту и эффективность в сравнении с обертонным моделированием, о котором обычно говорят в первую очередь, когда речь заходит о моделировании звука. И в самом деле - хотя ряд Фурье может быть теоретически составлен из сколько угодно большого числа компонент, для того, чтобы реализовать собой какой угодно звук, но ты попробуй, сложи его, и прежде чем проводить вычисления для каждого его компонента, подумай - сколько времени всё это займёт.
    Поэтому методы, альтернативные гармоническим, но легко реализуемые в вычислительной практике, очень важны. Например, функция INT, определяющая целую часть положительного числа, может указать на число периодов колебания, а дробная его часть  E может указывать на  фазу. И никаких синусов косинусов не нужно.
Хотя выигрыш тут небольшой – если синус от E вычисляется за 11 мксек, то небольшая программка с квадратичной аппроксимацией, его заменяющая, даёт результат через 7 мксек. Но, тем не менее.

===
  Программу ТРИО в нынешнем её состоянии можно скачать вместе с Турбо Бейсиком отсюда - https://yadi.sk/d/QvD6_C70rDQKo

там же находятся некоторые вспомогательные программы и материалы.
=========
Спасибо за внимание.