Как сделать звук скрипки. Синтез звука

Дмитрий Маштаков
  О сложностях воспроизведения звука скрипки компьютерными методами известно -
 http://www.all-2music.com/violin_sintez.html
  Специфика струнных смычковых такова, что колеблющийся элемент (струна) практически всегда находится в контакте с элементом, который её к этим колебаниям побуждает. Со смычком, который эту же струну и тормозит. К тому же есть ещё и подставка, передающая колебания струны, как корпусу скрипки, так и другим её струнам.
  К тому же и дека скрипки резонирует по-своему, а резонаторная полость - по-своему, и всё это вместе устроено таким образом, чтобы звук оказался гармоничным и красивым.
  К тому же есть ещё и пальцы музыканта, то прижимающие эти струны, то ослабляющие прижим. А пальцы правой руки, это тоже чудо - их функции по управлению смычком распределены и расписаны для каждого пальца. Один прижимает, второй наклоняет, пятый уравновешивает.
  И всё для того, чтобы музыка была не только красива и гармонична, но и выразительна.
  Естественно, что музыкант, будучи постоянно в контакте со своим инструментом, может легко передать через него свои чувствования.

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

  А какой отсюда следует вывод? А вывод такой, что звук скрипичный следует изучать. И проводить эксперименты по его синтезу не на уровне неповоротливого МИДИ формата, а другими средствами. Тем более, что возможности для этого есть - развились и вычислительные программы общего назначения, и быстродействие компьютеров повысилось, вычисления амплитуд семплов теперь можно проводить, используя более сложные алгоритмы, чем те, что принимались на заре компьютерной музыки.

  Но это так сказать, присказка. А рассказать я хочу о своих новых экспериментах по части синтеза музыкального звука скрипки.


   ИМЕЮЩИЕСЯ СЦЕНАРИИ СИНТЕЗА ЗВУКА СКРИПКИ

  В программе Трио, которой я пользуюсь для озвучивания партитур, к настоящему времени имелось три сценария развития звука скрипки. Сценарий №4 - Виола звонкая, №40 - Виола спокойная и сценарий №42 - Виола трепетная.
  Каждый сценарий со своими особенностями, и со своим собственным тембром. Я использовал все три, но чаще - №4, поскольку он предусматривал большие возможности для управления звуком.

  Каждому сценарию предшествовала некоторая исследовательская работа - оценивалось тембровое звучание, оценивалось сходство со звуком реального инструмента, и оценивались выразительные возможности, связанные с перестройкой параметров сценария - если перестройка параметра существенных изменений в звук не вносит, то зачем такой параметр нужен?
  В частности выяснилось, что очень важным параметром является ширина пичка, который собственно и создаёт характерный скрипичный звук. А вот форма этого пичка - составлен ли он из прямых линий, или закруглён, имеет ли он фронт более крутой чем срез, или наоборот, разницы в этом не чувствовалось. Про пичок скрипичного звука, подробно написано тут - http://www.proza.ru/2016/03/08/2244

  Все три сценария виолы имели дело именно с этим пичком. И был этот пичок один одинёшенек, хотя и двигался, и взаимодействовал с эхом.
  Расскажу немного о том, в чём состоит суть движения пичка. Представьте себе пичок в виде заглавной буквы А, стоящей на ровной поверхности внутри периода. То есть, между числами 0 и 2. Где конкретно находится пичок, не так уж важно - он может находиться в середине периода на отсечке 1, а может находиться и в его начале. Важно, чтобы пичок двигался - слегка изменял своё положение от одного периода к другому.
  Движение это осуществляется по периодическому закону с низкими частотами - от 3-х до 12-ти Гц. Кроме того, чтобы не возникало слышимых на слух биений, позиция пичка, выражаемая параметром Vo, определяется сложением двух колебаний с различающимися амплитудами и частотами. Такое странное изменение параметра с возникающими отклонениями относительно некой средней точки, называется его девиацией.
  Поскольку пичок двигается, то его запаздывающие отражения эхо приходятся на разные части периода. Они могут складываться с пичком, усиливая его, могут совпадать друг с другом, а могут попадать мимо. В результате ткань скрипичного звука становится живой, она как бы дышит. Такой звук воспринимается ухом вполне как естественный, а не напоминающий занудное гудение.

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

  Далее, чтобы облегчить объяснения, я пока отошлю Вас к небольшому клипу -
http://youtu.be/ubNmvFydjtk
а более подробные пояснения дам в этой статье позже.

  На иллюстрации представлена математическая формула, по которой вычисляются амплитуды семплов внутри периода скрипичного звука. Предполагается, что пичок один, его ширина обозначена через Vi. А показатель степени в формуле берётся равным 1/Vi^3
  Формула эта для музыкальных приложений очень удобна - при показателе степени 1 она описывает кривую, похожую на синусоиду, а при увеличении показателя степени левая часть кривой постепенно стягивается в пичок. Обратите внимание на то, что вершина пичка при этом никуда ни уходит, поэтому пичок очень легко сделать асимметричным, использовав разный показатель степени слева и справа от координаты Х=-.5774, хотя нужно позаботиться о том, чтобы концы кривых сходились друг с другом, а ещё лучше - сходились бы к нулю на концах периода.

  Я немного поразмышлял над этим и нашёл другую формулу, которая очень подойдёт к формированию асимметричного пичка. Её достоинство в том, что кривая нигде, кроме самого пичка, не отходит от нулевого значения.
Эта формула вот здесь, на рисунке - http://yadi.sk/i/p7on5sS5AA-mdw
  Эта формула уже реализована в сценарии 43 по алгоритму mod2=37. Выяснилось, что девиация пичка, с отклонением его формы от симметричной, позволяет делать звук изысканным и более естественным.
  mod2 здесь номер алгоритма для вычисления амплитуд звука. Пичок, показанный на рисунке к статье реализуется по алгоритму mod2=36, а пичок с линейным срезом и спадом - по алгоритму mod2=31. Каждый алгоритм создаёт свой собственный тембр. несколько отличный от других.
________________
ниже добавлены подробные объяснения тому, как всё устроено...


   О СЦЕНАРИИ "ВИОЛА ПОЮЩАЯ" И ПОЯСНЕНИЯ К ЭТОМУ СЦЕНАРИЮ
 
  Я уже говорил о том, что для создания выразительного звука, нужны параметры, должным образом влияющие на звук, и нужны средства, позволяющие эти параметры менять.
  В музыкальных синтезаторах параметры звука меняются кручением ручек на панели управления. В программе Трио таких ручек нет.
  В программе Трио параметры сценариев меняются из партитуры.

 1 ================= TFP.TXT   VEL= 32000
  TE=800 S=10
  R=43 H=3 exo=3
 A1r$="150=8-9----3\9\9\9\ы9----9_7"
    UX=1
F= 659.26 T1= 13840  T2= 160
F= 440     T1= 7840  T2= 160 
F= 440     T1= 2000  T2= 2000 

вот, например, начало партитуры того поющего голоса, который вы слышали в клипе.

  Здесь, кроме указания на частоты, на длительность звучания ноты (указывается количество семплов), и на длительность посленотных пауз, имеются другие указания. Они сосредоточены в начале партитуры.

  TE=800 - указывается количество семплов в срезе звука (перед посленотной паузой). Без этого указания в окончаниях звучания нот слышатся хлопки.
 
  S=10 - а Вы не догадываетесь, что ноты в партитуре для протяжного пения взяты из каприса 24 Паганини? Длительность звучания этих нот увеличена в 10 раз. Вот и получилось протяжное пение.
   
  R=43 - указывается номер нового сценария, по которому будет развиваться звук. сценарий звука с двумя пичками.

  H=3 exo=3 - устанавливается громкость звука и включается эхо. 

  Заметьте, мы не сделали никаких указаний на то, какой ширины будут наши пички, будет ли второй пичок той же высоты, что и первый, или он должен быть несколько пониже? А не нужно ли нам изначально развести пички, и указать такую среднюю точку девиации, чтобы пички пореже подходили друг к другу? Какой алгоритм для создания формы пичка мы будем использовать - создадим ли пичок с линейным фронтом и срезом, или будем придерживаться формулы, приведённой в иллюстрации, и придадим пичку округлённую форму?
  Дело в том, что все параметры имеют значения, принимаемые по умолчанию, и нам не надо делать никаких указаний, если мы не хотим иного.
  Например, по умолчанию принимается, что TE=30.

  Давайте теперь посмотрим на сценарий №43 Виола поющая.
  Нас интересует в этом сценарии только одна строчка:

Vo = Eo + 0.3 * FNTIM(3, T) + 0.2 * FNTIM(8, T)

  Vo это сдвиг первого пичка от того положения, в котором его можно видеть на иллюстрации. Благодаря присутствию периодических функций FNTIM(частота, время) смещение пичка в каждом новом периоде оказывается несколько другим.
  Параметр Vo непосредственно не задаётся, но он совершает девиацию вокруг среднего значения Eo. А вот эту-то величину можно из партитуры установить.
  Все три важных для звука Виолы параметра устанавливаются одним указанием. Делается это, например, так:
 
F= 659.26 T1= 13840  T2= 160 v232.35

здесь 2 -выбирается второй вид пичка (по умолчанию пичок имеет линейный фронт и срез)
      3 - Vo=.3 (по умолчанию Vo=1)
      2 - Vh=.2 (по умолчанию высота второго пичка Vh=1 )
     .35 - Vi=.35 (по умолчанию Vi=.25 )
если значение указанной цифры нулевое, то берётся значение по умолчанию.

  Установленные таким образом параметры имеют пролонгированное действие - они сохраняются для последующих нот вплоть до аналогичного указания. Чтобы сбросить все параметры сразу к их значениям по умолчанию, в строке достаточно указать только одну букву - v

  Такая мнемоника очень удобна, она позволяет изменять параметры как по отдельности, так и все сразу. Подобные мнемонические обозначения, заключаемые по отдельности в целую и дробную части числа, широко практикуются а программе Трио.
  Например, чтобы изменить сразу и время атаки и коэффициент последующего затухания звука, в партитуре записывается такое указание:
  DU2=50.992  здесь 50 -число семплов, отведённое на атаку, а 995 -декремент затухания звука. Мы услышим очень короткий звук, несмотря на то, что его долгота Т1 в партитуре может быть указана другой.
  По умолчанию DU2=150.999 вернуться к этой величине можно, записав DU2= в партитуру.

  Подобная мнемоника работает в сценарии 43 и при регулировке эха. Если к строке партитуры, организующей звучание ноты, приписать указание r1.9 то произойдёт следующее:
 1 -будет установлено дальнее эхо (по умолчанию оно не установлено)
 9 -амплитуда эхо в целом возрастёт до максимума, к ней будет добавлено 0.9
      (вместо небольшой добавки 0.2 по умолчанию)

  Разумеется, в других сценариях используются другие регулировки, с другими значениями параметров по умолчанию, хотя мнемоника таких указаний может совпадать.
  В сценарии 43 имеются и другие мнемонические навороты, позволяющие эффективно управлять звуком.


  КАК ЗАДАЁТСЯ ОГИБАЮЩАЯ ЗВУКА

  Про огибающую звука можно прочитать, например тут - http://soundtheory.ru/formirovanie-zvuka/
// Огибающая – это один из базовых инструментов для настройки звука. В большинстве случаев, огибающая настраивается с помощью нескольких регуляторов, а именно – Atack (Атака), Decay (Спад), Sustaine (Звучание), Release (Затухание)//
  Она так и называется - огибающая (ADSR).

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

  Рассказываю, как я эту идею попытался реализовать.
Взгляните на оператор сценария 43 :

    ADSR$ = "10=7-9-94"

в нём (если Вы знаете язык Бейсик) строковой переменной присваивается некое значение.
Мнемонически оно означает: 10 -число семплов отводится на атаку, а далее идёт профиль звука с шагом 0.2 сек на каждую цифру или на знак тире.

Символ = в начале строки это не только значок разделитель, но ещё и напоминание о том, что последующая цифра 7 приравнивается к уровню громкости, достигнутой после атаки, а далее коэффициент изменения громкости устанавливается таким образом, чтобы к уровню 9 придти постепенно - через 0.4 секунды, далее уровень 9 в течении 0.4 секунд удержать, после чего быстро, за 0.2 секунды уменьшить громкость до уровня 4 и оставить такой коэффициент затухания до окончания звучания ноты.
  Лаконично, но эффективно.

  Тут надо ещё подумать о том, как строки, содержащие информацию об огибающей звука можно будет вводить из партитуры.
  В программе Трио предусмотрен ввод подобных строк. Их значения могут быть заданы в партитуре, например, следующей записью:
 специальным образом указать
   A1r$="150=8-9----3\9\9\9\ы9----9_7"

это как раз та "поющая" строка, которую Вы слышали в клипе. В партитуре можно задать ещё пару строк, определив таким же образом переменные A2r$ и A3r$. Однако просто так приготовленные огибающие реализованы не будут. На них следует ещё специальным образом указать.
  Указание UX=1 сделает это. После него все ноты партитуры будут звучать в соответствии со строкой A1r$. Указание UX=2 подключит огибающую звука из строки A2r$, запись UX=3 введёт строку A3r$, указание UX=4 реализует записанный в сценарии оператор ADSR$ = "10=7-9-94", а указание UX= вернёт программу в исходное состояние - по умолчанию реализуется профиль DU2=150.999.

  Поскольку мы думаем об удобствах, то имеется возможность задать огибающую и для отдельных нот. Например, локальное указание b, которое в сценарии для фортепьяно трактовалось как удар по клавише, в сценарии 43 трактуется точно также - как удар смычком по струне. При этом реализуется предусмотренный в сценарии профиль DU2=5.995 короткого звука с резкой атакой.
  Но если указать b1, b2, b3 или b4, например так:

   F= 440 T1= 13840  T2= 160 b2
 
то тогда, вне зависимости от значения UX, будет реализована огибающая из переменной A2r$. Но просуществует эта огибающая только для одной ноты. А дальше профиль звука будет выбираться в соответствии со значением переменной UX, а там, как мы понимаем, может быть записано 1, 2, 3, 4 или 0.
   Вот собственно о профиле звука и всё. Пока этот алгоритм реализован только в одном сценарии Трио - в сценарии Виолы поющей. Но его можно добавить и к сценарию звука аккордеона, или сделать на основе него звук саксофона - тоже привлекательная тема для применения.


   ДОПОЛНИТЕЛЬНАЯ МНЕМОНИКА В СТРОКАХ ОГИБАЮЩЕЙ

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

  Наклонные слежи / и \ означают подъём и опускание частоты звука на полутон.
  Буква Ы - большое частотное вибрато, ы - малое, _ - прекращение вибрато.
  Движение по полутонам и вибрато конфликтуют друг с другом (вибрато пересиливает), потому эти ходы не должны выполняться одновременно.
  За этим нужно следить. Тем более, что вибрато может быть назначено извне, локальным указанием, например w5.35 - здесь 5 - частота, а .35 - амплитуда вибрато. В сомнительных случаях вибрато лучше заранее отменять.

  Значки < и > увеличивают и уменьшают ширину пичков на 12%.
  Для огибающей по умолчанию принят шаг 0.2 – то есть, каждый фрагмент между смежными цифрами, между цифрой и значком -, между двумя смежными значками -, каждый такой фрагмент длится 0.2 сек.
  Но можно время звучания фрагмента уменьшить, для этого внутри него нужно поставить точку, две точки или три точки. Соответственно, длительность помеченного точками фрагмента будет равна .15, .1 или .05 секунды.
   Уменьшенный шаг в огибающей удобен, например, для того, чтобы изменять тембр постепенно. При резкой смене тембра в записи могут слышатся щелчки.


Тексты программы Трио, связанные со сценарием 43, приведены тут - http://www.proza.ru/2019/03/17/719
___________

  Уважаемые читатели, простите меня, я вам более рассказывал не про звук скрипки, а про мнемонику. Про то, какие можно делать обозначения, с тем, чтобы звуком скрипки было удобно управлять. С тем, чтобы пение скрипки можно было бы сделать наиболее выразительным.

  Что касается самого скрипичного звука, то мне его получить не удалось. Звук реальной скрипки светлее (у меня был образец того звука, который я проигрывал в клипе). В звуке реальной скрипки чувствуется особое дыхание, звук её струн как бы парит над резонирующим корпусом, подчиняясь движениям смычка.
  Синтезированная музыка звучит более рационально. Но тем интереснее и сама задача. Я не сомневаюсь, что синтезированный звук когда-нибудь станет звучать не как в секвенсорах с их в МИДИ форматом, а куда более красиво и выразительно.

Спасибо за внимание.
____________
16.03.2019