Алгоритмы и сценарии звука Виолы

  Описываются алгоритмы и сценарии создания синтезированного музыкального звука смычковых инструментов. Среда реализации - Турбо Бейсик.
Звук того, что на рисунке, можно прослушать здесь - http://yadi.sk/d/C4GGDv9JyKzrm

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


   ФОРМА ЗВУКА ВИОЛЫ.

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

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


   АЛГОРИТМ СОЗДАНИЯ ТАКОЙ ФОРМЫ

  Тот или иной алгоритм для Виолы задаётся в программе переменной mod2, соответственно значению этой переменной выполняется тот или иной участок программы. Все вычисления опираются на значение величины X.
  X находится между 0 и 2 и представляет собой фазу колебания (число 2 играет ту же роль, что и 2пи при привычном для нас вычислении синуса).

  CASE 3,30  ' viola  /\___/\___/\___  если mod2=3 или 30
     V=X-Vo : IF V<0 THEN V=2+V
     IF mod2=30 THEN IF V>2 THEN V=V-2
     IF V<Vi THEN
       IF V<Vi/2 THEN A2=2*V/Vi ELSE A2=2*(Vi-V)/Vi
       ELSE : A2=0
     END IF
        A2=A2-Vi/2

здесь, если задано mod2=30, внутри периода воспроизводится пичок в форме равнобедренного треугольника высотой 1 и шириной основания Vi, причём начало основания смещено относительно начала периода на величину Vo (смещение может быть как положительным, так и отрицательным).
  Полученный пичок притоплен последним оператором, с тем, чтобы положительная зона колебания по площади уравновешивалась отрицательной.
  Однако, если задано значение не 30, а mod2=3, то один из операторов пропускается, и тогда при отрицательных значениях Vo, та часть треугольника, которая уходит влево от начала периода. обрезается, вплоть до того, что при Vo<-Vi то, что оставалось от треугольника исчезает совершенно, и, соответственно, звука никакого не воспроизводится.

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

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

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

  Четвёртый принцип метода - следует использовать значащие для звука параметры.
  Так, значение велчины Vi существенно влияет на тембр. Vi=.35 (значение, принимаемое по умолчанию) создаёт обычный, привычный тембр звучания Виолы, Vi=.6 - мягкий, Vi=.1 – резкий, пищащий тембр (такой тембр характерен для игры вблизи подставки).
  А вот отклонения пичка от формы равнобедренного треугольника к треугольнику с тем же основанием, но с разными боковыми сторонами, такие отклонения, как показывает эксперимент, тембр почти не меняют, и подобные вариации могут считаться излишними. Несмотря на то, что в реальном звуке можно часто видеть пички неравнобедренной формы.
  Не нужно тупо копировать реальный звук. От него следует приносить в синтезированный звук только то, что действительно имеет значение.

  Из всего этого следует основное правило - для создания успешного алгоритма синтезируемого звука, реальный звук нужно тщательно изучать.
   
   
   ДРУГИЕ АЛГОРИТМЫ ВИОЛЫ

  Следующие алгоритмы Виолы создают дополнительно к основному ещё один или два движущихся пичка. При этом основной пичок неподвижен - он находится в начале периода, а по периоду (вправо или влево) смещаются дополнительные пички - на величины Vo и 2*Vo - для первого и второго дополнительного пичка.

  CASE 31,32  ' viola 31 /\_A_/\_A_/\_A_
     V=X-Vo : IF V<0 THEN V=2+V
     IF V>2 THEN V=V-2
     IF V<Vi THEN
       IF V<Vi/2 THEN A2=2*V/Vi ELSE A2=2*(Vi-V)/Vi
       ELSE : A2=0 : END IF
     IF X<Vi THEN
       IF X<Vi/2 THEN B=2*X/Vi ELSE B=2*(Vi-X)/Vi
       ELSE : B=0 : END IF
     A2=A2*Vh+B : A2=A2-Vi*.7
     IF mod2=32 THEN ' viola 32 /\AA_/\AA_/\AA_
       V=X-2*Vo : IF V<0 THEN V=2+V
       IF V>2 THEN V=V-2
       IF V<Vi THEN
         IF V<Vi/2 THEN B=2*V/Vi ELSE B=2*(Vi-V)/Vi
         ELSE : B=0 : END IF : END IF : A2=A2+Vh*Vh*B

  первый дополнительный пичок ниже основного, соответствуя множителю Vh, а второй пичок – на столько же ниже первого.
  По умолчанию Vh=1, и если Vo=0, то три пичка объединяются в один с амплитудой 3. Это нужно учитывать при конструировании сценариев, особенно с наличием эха, иначе можно вылететь со слишком большой амплитудой за пределы допустимых её значений.
  Алгоритм 32 используется в сценарии 40 для создания спокойного звука Виолы.

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

  CASE 33,34,35  ' viola 33 _/\,__/\,__/\,__
     V=X-Vo : IF V<0 THEN V=2+V
     IF mod2=33 THEN IF V>2 THEN V=V-2
     IF Vi<.01 THEN Vi=.01
     B=0 : IF Vi<=1 THEN B=.5*Vi*Vi/(2-Vi)
     IF V<Vi+B THEN
       IF V<Vi/2 THEN A2=2*V/Vi ELSE A2=2*(Vi-V)/Vi
       ELSE : A2=0 : IF Vi<=1 THEN A2=2*B*(V-2)/Vi/(2-Vi-B)
     END IF
     IF mod2=35 AND Vh>1 THEN 'case 35 _/``\,__/``\,__/``\,__
        IF A2>0 THEN A2=A2*Vh : IF A2>1 THEN A2=1
        IF A2<0 THEN A2=A2*(2*Vh-1)/Vh
     END IF

в алгоритмах 34 и 35 пропущен оператор, сохраняющий целостность пичка при смещении его влево, поэтому на отрицательных значениях Vo эти алгоритмы создают дополнительный звон, который может быть использован для создания соответствующего эффекта в сценариях.
  В алгоритме 35 пичок вначале подрастает до значения Vh>1, а потом обрезается по вершине на уровне 1. Пичок с плоской вершиной создаёт очень спокойный звук, который однако, при отрицательных Vo начинает сопровождаться звоном - при этом появляется своеобразная возможность игры на контрасте тембра.
  Алгоритм 33 используются в сценарии 4 - звенящий звук Виолы, и в сценарии 41 - трепетный звук. Алгоритм 34 используется в сценарии 4 для создания резкого звука.

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


   СЦЕНАРИИ ЗВУКА ВИОЛЫ

  На настоящее время звуки Виолы имеют 3 сценария развития звука, и имеют 6 алгоритмов для создания пичков. В имеющихся сценариях 4, 40 и 41 используются только 3 алгоритма - 32, 33 и 34. Это не значит, что остальные алгоритмы не нужны - они создают потенциальную возможность к развитию имеющихся, и к созданию новых сценариев.
  Давайте взглянем на имеющиеся сценарии Виолы:

=============== сценарии
по умолчанию    AK=0 : DK1=1 : mod2=0 : Vi=.35 : Vo=0 : Vh=1

  CASE 4 'viola звенящий
    MU2=20.2 : AU2=4 : DU2=150.99 : IF UD1b>0 THEN DU2=UD1b
    mod2=33 : IF UW1=2 THEN mod2=34 'резкий
    MU3=67.06 : AU3=3 : DU3=10.999 : IF UD1c>0 THEN DU3=UD1c
    'red
    IF ARE1=10 THEN IF LEN(A1rr$)>2 THEN Arr$=A1rr$
    IF ARE1=0 OR ARE1=1 THEN
'ниже, в строках сделан лишний пробел, иначе строки не выводятся на экран
   A11r$="638073504248544232424245506871 67404355686242404338434759475545" 'red
   A12r$="607278553050656342474840304353 48584036787755483755372350483944" 'blue
   A13r$="587779824640345335204055407768 77423260686040503640315460426238" 'green
    END IF
  Apm$="505050707050505560657035504744433857" : Dpm=.999 : Mpm=.5
     Rn(0)=0 : V=FNRn1(0,1006.4) : V=FNRn1(0,2006.4) : V=FNRn1(30,-9)
  CASE -4 : Vi=.35 : IF UV1>0 THEN Vi=UV1
        IF UW1<2 THEN Vi=Vi+Vi*.43*FNTIM(4/(1+.6*T),T) 
     IF NT=100 THEN MU2=40.05
     IF ARE1<>10 THEN Arr$=FNRE$((.8*FNTIM(3,T)+.6*FNTIM(5,T))/2,1)
     IF UW1=1 THEN Vo=.2*FNTIM(FS/64,T)
     IF UW1=2 THEN Vo=.3*FNTIM(8,T)+.3/(1+T)
  IF W1W>0 THEN DT=DT0*(1+(W1W-INT(W1W))*.1*T*FNTIM(INT(W1W),T)/(T+.2)) ELSE DT=DT0

  CASE 40 'viola спокойный
    MU2=0 : AU2=4 : DU2=150.99 :  IF UD1b>0 THEN DU2=UD1b
    mod2=32 : Vo=.6 : Vh=.8 : Vi=.35 : IF UV1>0 THEN Vi=UV1
    MU3=67.06 : AU3=3 : DU3=10.999 : IF UD1c>0 THEN DU3=UD1c
     'red
     IF ARE1=10 THEN IF LEN(A1rr$)>2 THEN Arr$=A1rr$
  CASE -40 : Vo=.6+.2*FNTIM(FS/64,T) : IF NT=100 THEN MU2=40.05

  CASE 41 'viola трепетный
      MU2=INT(32*F/220)+.1 : AU2=4 : DU2=160.998
      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=UW1
      Vo=.1*FNTIM(16/(1+T),T) : IF UV1>0 THEN Vi=UV1

  Сценарии проходятся сверху вниз, и из списка выбирается тот сценарий, который установлен в партитуре указанием R=номер_сценария

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

  Представленные сценарии имеют различный групповой состав параметров: MU,AU и DU - в сценариях 4 и 40 задействованы 2-я и 3-я группы (группы виолы и рельефа), а в сценарии 41 - только 2-я группа.
  С другой стороны, в сценариях 4 и 41 задействован ревербератор (обращением к функции FNRn1 делаются его установки), а сценарий 40 обходится без ревербератора.
  Наиболее развитым является сценарий 4. Только в нём строка рельефа Arr$ корректируется путём ротации трёх строк "red", "blue" и "green" (обращением к функции FNRE$), и только в нём используется строка "тащи в плюс, тяни в минус" - Apm$, создающая розлив звука (заимствовано из сценария для аккордеона, но имеет меньшую амплитуду Mpm).
  Во всех трёх сценариях активно используется движение пичков звука Виолы путём изменения смещения Vo. Для этого используется периодическая функция FNTIM, похожая на функцию -sin, но создающая треугольную форму колебания. Первый аргумент этой функции - частота (Гц), второй - время (сек). Используется эта функция не просто, а довольно замысловато, это делается для того, чтобы избежать занудных вибрато, которые слышатся при использовании просто периодического изменения параметра Vo.
  Во все коррекции, проводимые в нижних частях сценариев, рекомендуется вносить апериодичность. Какого рода должна быть апериодичность и как её осуществить? Только опытным путём можно узнать это.

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

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


   КОРРЕКЦИЯ СЦЕНАРИЕВ С ПОМОЩЬЮ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ

  Большинство имён, которые мы видим в текстах сценариев, представляют собой внутренние переменные звуковой функции. Когда мы выполняем присвоение mod2=33, находясь внутри функции FNSS1, нам нет никакого дела до того, чему равна переменная с таким же названием внутри функции FNSS2 или FNSS3 - внутренние переменные каждой функции не видны из другой функции, они не видны и извне. И изменять их извне мы также не можем.
  Но корректировать параметры извне как-то нужно. Для этого используются глобальные переменные, которые не заявляются в функциях, как внутренние, и могут быть поэтому заданы вне функции, и прочитаны внутри её.

  Все переменные, которые использует Бейсик, имеют вначале нулевые значения. Говорят, что они имеют нулевое значение по умолчанию, то есть тогда, когда им некое значение не присваивается специально. Программа в своих сценариях использует это обстоятельство, считая глобальные переменные значимыми только в том случае, когда они не равны нулю. Вот пример такой логики -
     DU2=150.99 : IF UD1b>0 THEN DU2=UD1b
первый оператор задаёт диссипативный фактор 150.99, который будет интерпретирован как указание к линейному увеличению амплитуды от нуля до максимального значения (AU2) на протяжении 150 периодов, а после этого будет происходить понижение амплитуды, для чего она будет умножаться на .99 перед каждым следующим периодом.
  Однако, если глобальная переменная UD1b (здесь 1 указывает на номер звуковой функции, b - на группу виолы) не равна нулю, то она полагается значимой, и её значение присваивается диссипативному фактору DU2.

  Давайте посмотрим, какие глобальные переменные использованы для коррекции сценариев виолы внутри функции FNSS1 (именно сценарии этой функции представлены выше). Вот они, по порядку появления их в тексте:

  UD1b  UW1  UD1c  ARE1  UV1  W1W

  Цифра 1 в наименованиях этих переменных указывает на номер звуковой функции.
  Глобальная переменная UW1 указывает на моду алгоритма, по которому строится пичок, а переменная UV1 указывает на ширину пичка в основании. Задаются в партитуре эти переменные не порознь, а форме общего мнемонического указания, например, так -
   v2.52
После этого указания окажется, что UW1=2, а UV1=.52, а уж как распорядится значениями этих переменных сценарий, зависит от того, как конкретно он сконструирован. Обычно UV1 указывает на ширину пичка, но с этим указанием могут быть связаны и другие действия.   
  Не только переменные, но и глобальные строки A11r$, A12r$, A13r$ используются для видоизменения сценариев. Эти строки тоже могут задаваться извне, однако в сценарии 4 эти строки определяются изнутри.
  Если ARE1=10, то внутренняя строка Arr$, по которой делается рельеф, определяется извне - через глобальную строку A1rr$. Но в штатном случае ARE1=1, или если (по умолчанию) ARE1=0, то строка рельефа определяется методом ротации строк A11r$, A12r$ и A13r$.

  А теперь подумайте, можем ли мы для ротации использовать другие строки, и как их задать?
Задать их очень просто, укажем в тексте партитуры

  A1r$="строка"  A2r$="строка"  A3r$="строка"

но вот незадача, переменная ARE1 у нас при этом окажется равной нулю, и сценарий 4 воспротивится новому указанию строк, и сделает по-своему, при ARE1=0 он возьмёт те строки, которые записаны в нём. Ничего, просто добавим следом в строку партитуры указание Ar=2, и тогда сценарий собственное назначение строк пропустит. А поскольку ARE1 не равно 10, то ротация строк у нас происходить будет, но это будут уже новые строки, заданные нами в партитуре. И эта ситуация будет сохраняться до конца озвучивания, или до тех пор, пока по этому поводу не будут сделаны новые партитурные указания.

  Вы видите, что имеются гибкие и разнообразные возможности к изменению характера звучания Виолы. Об управлении сценариями создания звука из партитуры можно прочесть здесь -
http://www.proza.ru/2016/06/19/581   Ниже обсуждаются некоторые добавления.


   ОБ УПРАВЛЕНИИ СЦЕНАРИЯМИ ВИОЛЫ ИЗ ПАРТИТУРЫ

  Партитура, которая озвучивается программой Трио, это обычный текстовый файл.
  В его строках указаны частоты и длительности звучания нот, короткие паузы после окончания звука и, отдельными строками, - длинные паузы.
  Длительности указываются в количестве семплов. Сколько это секунд, можно посчитать, если разделить количество семплов на скорость раздачи ( VEL=32000 семпл/сек).

  В свободных строках партитуры и в строках пауз делаются общие партитурные указания, например -
R=4 указывает сценарий, H=3 указывает общую громкость, exo=1 или exo=0 - включает или отключает эхо. Некоторые глобальные переменные устанавливаются таким же образом.
  Обратите внимание, - индекс принадлежности 1, 2 или 3 в мнемонику партитурных указаний не входит, он будет вставляться в имена глобальных переменных автоматически, в зависимости от того, какой МУЗ (раздел программы) будет этот сценарий читать и будет с ним работать.
  Всего в программе ТРИО таких МУЗов три - MUZ1, MUZ2 и MUZ3. Соответственно они могут изобразить своими звуками трио, то есть трёхголосие. Не считая аккордов. Аккорды могут присутствовать в любом голосе. Для аккордов тоже используются специальные указания - аккордные назначения, например, такие G=/3 G=6/444. Чтобы снять назначение аккорда нужно сделать общее указание G=0 или G= . Или дать локальное указание на отмену аккорда, записав строчное g в строке, задающей частоту следующей ноты.

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

 тест для обкатки сценариев
# 1 ========== W TEST
  R=4 H=3 exo=0
 L= 20000
F= 391.11  T1= 40000  T2= 500
F= 391.11  T1= 40000  T2= 500 w8.25
F= 391.11  T1= 40000  T2= 500 r40 w
F= 391.11  T1= 40000  T2= 500 r41
 UDb=150.9995
 L= 20000
F= 260.74  T1= 30000  T2= 500 r4 l
F= 260.74  T1= 30000  T2= 500 v.2 w8.05 <
F= 260.74  T1= 15000  T2= 500 v.11 < w7.27
F= 260.74  T1= 15000  T2= 500 v.08 < w6.27
 L= 2000 UDb=

F= 260.74  T1= 40000  T2= 500 r40 v w >> n
F= 260.74  T1= 40000  T2= 500 r41 >
 L= 20000
F= 173.827  T1= 40000  T2= 500 r4
F= 173.827  T1= 40000  T2= 500   w8.25
F= 173.827  T1= 40000  T2= 500 r40 w
F= 173.827  T1= 40000  T2= 500 r41
 L= 2000
 2 ============
,,,

  Вначале идут общие назначения, о которых уже говорилось. На то, что эхо отсутствует, можно было бы не указывать - эхо отсутствует по умолчанию. Также, как по умолчанию было бы H=1, а R=0 – тогда, по нулевому сценарию, генерируется обычная синусоида.
  Но поскольку указано R=4, то первый звук, имея частоту 391.11 Гц, будет развиваться по четвёртому сценарию.

  По этому же сценарию будет развиваться и звук следующей ноты, но на ней имеется локальное указание - w8.25
  Оно назначает частотное вибрато.


   ЧАСТОТНОЕ ВИБРАТО В ЗВУКЕ ВИОЛЫ

  Мнемоника w8.25 (между буквой и числом допускается пробел) задаёт частоту вибрато 8 Гц и амплитуду вибрато плюс-минус 2.5% от частоты основного звука.
  Подъём высоты звука на полутон при равномерной темперации составляет 5.9%, так что .25 в дробной части указания w задаёт вибрато с размахом чуть менее полутона.

  Тот МУЗ, который читает этот сценарий, передаёт численное значение из указания на вибрато в глобальную переменную W_W, указывая на месте подчёркивания  в имени этой переменной свой номер. Выше, в рассмотренном нами сценарии 4 (а точнее, в нижней его части -4), для первого МУЗа мы видим строку, обрабатывающую заданное вибрато -

  IF W1W>0 THEN DT=DT0*(1+(W1W-INT(W1W))*.1*T*FNTIM(INT(W1W),T)/(T+.2)) ELSE DT=DT0

если W1W=0 (такое значение эта переменная имеет по умолчанию, или приобретает в том случае, когда вибрато снимается указанием w0 или просто w ), тогда приращение времени при переходе в вычислениях от предыдущего семпла к следующему остаётся постоянным, вычисленным при первом обращении к звуковой функции.
  Но если вибрато назначено, то время ведёт себя не совсем правильно - оно периодически то немного замедляется, то ускоряется. Для обеспечения большей естественности вибрато, оно появляется не сразу - в начальный момент возникновения звука, а развивается постепенно, в соответствии с фактором T/(T+.2), то есть размах вибрато достигает своего половинного значения через .2 сек от начала звука и затем постепенно увеличивается до полного своего значения.
  Периодичность вибрато с заданной частотой создаётся функцией FNTIM, о ней мы уже говорили выше.


   ДРУГИЕ ЛОКАЛЬНЫЕ УКАЗАНИЯ ДЛЯ ЗВУКОВ ВИОЛЫ

  Проследуем по нашей партитуре дальше. На следующей строке даны указания  r40 w
Это значит, что звук будет развиваться по сценарию 40, и уже без вибрато.

  Можно было бы перед этой строкой, и даже в ней, написать R=40, но можно сделать более краткое указание r40. Подобное дублирование с использованием разной мнемоники удобно для более мобильного распоряжения сценариями Виолы.
  В следующей строке звук развивается по сценарию 41, и без вибрато, поскольку мы его вновь не назначали.

  Далее, после паузы, я решил испробывать слитный звук. Объясню, что за термин такой "слитный звук", и зачем такой звук понадобился для нашей компьютерной Виолы.


   СИНТЕЗ СЛИТНОГО ЗВУКА   

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

  Такие возможности появляются, если локальным указанием l установить режим слитного звука.
  Слитный звук, это звук нот, соединённых между собою лигами. Он следует тем правилам, которые обычно понимаются - для разных нот их звуки следуют друг за другом слитно, без какой либо паузы между ними. А слигованные одинаковые ноты звучат как одна нота, имеющая более длительное звучание. Отменяется режим слитного звука локальным указанием n.

  Программа Пианола не делает T2=0, даже если в ней установлен режим легато. Если звук не очень короткий, она всегда делает небольшие паузы после окончания каждого звука. Паузы настолько короткие, что они почти незаметны на слух.
  Но режим слитного звука ликвидирует эти паузы совершено - T1 полагается равным T1+T2, а T2 полагается равным нулю. Более того, если частота последующего звука оказывается равной предыдущей, и совпадают также и номера сценариев звука, то звук последующей ноты не начинается заново, а строится как продолжение предыдущего звука.

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

 UDb=150.9995
 L= 20000
F= 260.74  T1= 30000  T2= 500 r4 l
F= 260.74  T1= 30000  T2= 500 v.2 w8.05 <
F= 260.74  T1= 15000  T2= 500 v.11 < w7.27
F= 260.74  T1= 15000  T2= 500 v.08 < w6.27
 L= 2000 UDb=

  Перед началом этого фрагмента делается указание на долгое звучание - .9995 задаётся в качестве диссипативного фактора.
  В первой строке устанавливается сценарий 4 и режим слитного звука.
  Во второй строке  принятая по умолчанию ширина пичка Vi=.35 сужается до значения .2 и задаётся вибрато небольшой амплитуды. Кроме того значком < на 20% повышается громкость звука.
  В следующих двух строках вибрато усиливается, а пичок сильно сужается - в реальном звуке это соответствует смещению смычка к игре у подставки.
  Режим слитного звучания отменяется только на следующей ноте.
 
  В результате получается интересный по тембровым изменениям слитный звук.
  Его можно прослушать по этой ссылке - http://yadi.sk/d/C4GGDv9JyKzrm
  Запись по ссылке содержит звуки, записанные по приведённой выше партитуре в двух вариантах - сначала без эха, а потом с указанием exo=1 в начале сценария.
  Обратите внимание на то, что частотное вибрато, задаваемое в строке
     F= 173.827  T1= 40000  T2= 500   w8.25
в присутствии эха звучит гораздо более выразительно. Вибрато хорошо звучит на частотах от 8-ми до 16 Гц, начиная с 7 Гц и ниже, оно становится мало заметным. Потому вибрато не очень ощущается как таковое в приводимой записи слитного звука даже в присутствии эха. Но определённый эффект оно производит.
  Форма колебаний, полученных в слитном, и в двух последующих звуках (без эха), показана на рисунке в начале статьи.

   ЗАКЛЮЧЕНИЕ

  На примере звуков Виолы мы с вами подробно рассмотрели возможности к тембровому изменению звука, синтезируемого программой ТРИО, и то, как эти возможности могут осуществляться внешними указаниями из партитуры.
  Возможности эти довольно широки. Более того, путём развития имеющихся сценариев, или путём создания новых, возможности эти могут быть ещё более расширены ( о развитии сказанного выше говорится тут - http://www.proza.ru/2016/12/12/989 ).
  Таким образом, применяемый в синтезе метод по-периодного синтеза музыкального звука, демонстрирует свою эффективность.
  Алгоритмы этого метода могут быть успешно применимы не только для озвучивания музыкальных текстов, но и для создания звука онлайн на музыкальных синтезаторах. В этом, при реализации в более быстрой среде, они могут составить конкуренцию семплерному методу.

====================


Рецензии