Использование ревербератора в моделировании звука

КАК РАБОТАЕТ ПРОГРАММА ПОСЕМПЛОВОГО СОЗДАНИЯ ЗВУКА

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

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

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

  CASE 6 'agressive alt sound
      MU2=INT(32*F/220)+.1 : AU2=4 : DU2=260.998
      mod2=31 : Vi=.35 : oKA=5
      MU5=-304 : AU5=1 : DU5=.998
      MU6=-308 : AU6=5 : DU6=-.92 
      V=FNR1(F,101006.4) : V=FNR1(2,102006.4) : V=FNR1(30,-12)

ПРИМЕР. Создание VAW файла с агрессивными двумя звуками альта "до" первой октавы и "фа" малой октавы (с перетекающим эхом и с передающимися установками на эхо) по приведённому выше сценарию, и со следующей за звуками паузой с выходом эха. Результат можно услышать в файле по ссылке, приведённой ниже.

   OPEN "B",#1,"R.WAV"
 SEEK #1,44 : VEL=32000 : A=FNSS3(0,0)
 FOR I=1 TO 20000  : M%=INT(4000*FNSS3(260.74,6)) : PUT$ #1,MKI$(M%) : NEXT I
 FOR I=1 TO 40000 : M%=INT(4000*FNSS3(260.74/1.5,6)) : PUT$ #1,MKI$(M%) : NEXT I
 FOR I=1 TO 10000 : M%=INT(4000*FNR1(0,-1)) : PUT$ #1,MKI$(M%) : NEXT I
 GOSUB 1000 'определение длины и создание шапки файла 
 CLOSE #1 : STOP
=============
      
ДЛЯ ЧЕГО НУЖЕН РЕВЕРБЕРАТОР      

   Ревербератор представляет собой программно-математическую модель, позволяющую собирать, хранить и выпускать эхо, как сложный повтор звука, проходящего мимо. Ревербератор встраивается в строки программы следующим образом:
...
A=A+FNR1(A,-1)
...
если ревербератор не включён, или ключ его не равен 1, то функция FNR1 возвращает ноль, и значение амплитуды A не меняется. Если же ключ ревербератора находится в положении 1, то ревербератор откликнется на обращение со значением (-1) по второму параметру и произведёт следующие действия -

1. считает амплитуду эха по текущему значению поинтера P1
2. ослабит эхо по текущему значению поинтера в 100 раз
3. сдвинет поинтер по массиву R(i), хранящему эхо, вперёд на единицу (на один семпл)
4. засеет массив, хранящий эхо, забросив амплитуду A наперёд, добавив её к уже существующему эху в указанные места и с указанным ослаблением. Одновременно с этим забросом в те же места и с дополнительным общим ослаблением забрасывается и только что считанная амплитуда эха - так моделируется многократно возвращающееся эхо.

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

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

    Файл "звук с ревербератором" можно прослушать здесь - https://yadi.sk/d/aPx-jHA1pxkPw
Первая группа звуков - исходная, в ней для звука альта использована простейшая имитация - довольно короткий импульс треугольной формы. Вторая группа "агрессивный альт" сделана по приведённому выше сценарию CASE 6. Для других групп звуков сценарии эха другие.
Имитируется не только инструмент с различным тембром, но и акустика концертного зала.
    Профиль звуков этой записи представлен на рисунке. Видно, что различные сценарии, преобразуя начальный звук с помощью эха, составляют для звука одной и той же звуковой частоты различные звуковые профили, и создают соответствующий этим сценариям характерный тембр звучания.

    Похож ли полученный звук на звук альта? Я считаю, что похож. Альт в зависимости от движения смычка и пальцев, от характера и места контакта смычка со струнами, способен издавать очень разные звуки, чем умеющий исполнитель и пользуется. Но и программист в каждом конкретном случае, работая над сценарием, может добиться достаточно хорошего сходства компьютерного звука с натуральным. Но даже если сходство это и не будет полным, компьютерный звук оказывается достаточно красив, вариабелен, и демонстрирует возможность успешного своего применения.
    В сущности своей компьютерный альт, в идеале своём, такой же инструмент, как альт натуральный. Особенности его звучания и так называемые "штрихи" соотносятся с программными особенностями создания звука так же, как звук естественного альта соотносится с особенностями резонирования корпуса инструмента.
    Целью компьютерной программы создания звука альта не является полная имитация, но она состоит в достижении  красивого и разнообразного звука при возможности достаточно удобной и предсказуемой вариации тембра звучания, создания "штрихов", тремоло, глиссандо, и при потенциальной возможности создания прочих выразительных средств, подобных средствам естественного инструмента, а может быть и отличных от него.
    Звуковая функция FNSS3 вместе с ревербератором FNR1, реализующая метод посемплового создания звука, вполне удовлетворяет таким требованиям.
 
         
КАК РАБОТАЕТ РЕВЕРБЕРАТОР
 
   Звук содержится в ревербераторе в виде массива чисел R(i). Массив имеет размер 5000 ячеек, причём первые 200 ячеек в нём используются для хранения относительных адресов N2 для заброса эха, и коэффициентов ослабления амплитуды при её забросе.
   Амплитуда эха в ячейке по указанному  адресу при каждом забросе трансформируется таким образом -
R()=R()+A2*D+A1*De*D,
где A2 - амплитуда звука, пришедшего в ревербератор
    D - индивидуальное ослабление при забросе в указанную точку
    A1 - амплитуда прочитанного из ревербератора эха (эхо1)
    De - общее ослабление для всех точек заброса при создании многократно возвращаемого эха
 
Массив R(i) можно представить в виде замкнутой концами линейки:

 201, 202, 203 _  _  _ точки чтения эха2 _ P1 _ зонаN3дубликации _зонаN2забросаN2эха1 _ _N1

Проинтер P1 указывает на точку чтения эха1. Эта точка продвигается  по линейке вправо при каждом обращении.
Перед очередным продвижением из этой точки каждый раз читается A1 - амплитуда эха1, затем эта амплитуда ослабляется в 100 раз и перезаписывается в эту же точку. После этого точка чтения продвигается на 1 семпл вправо, а предыдущая точка с ослабленной амплитудой оказывается слева.
  Но этого мало - слева, уже прошедший мимо точки P1 звук можно дополнительно прочесть в виде эха2, складывая, вычитая или беря его в усреднённом виде из некоторых указанных точек. Прочитанное значение эха2 усиливается в 100 раз, но ослабляется индивидуальным для каждой точка чтения фактором. Полученное значение A4 эха2 прибавляется к значению A1 и этот результат возвращается функцией. Оставшиеся, ослабленные в 100 раз значения эха идут по круговому циклу, образуя общий тихо звучащий фон.
Обозначено:
 
N1=5000  - размер массива ревербератора
первые 200 ячеек массива предназначены для записи координат N2 и ослаблений D для создания эха
N2 - точка для записи эха, время возвращения эха в семплах
N3 - размер периода в семплах


   НЕБОЛЬШОЙ ПРИМЕР

  Вот строка, создающая эхо в сценарии звука фортепьяно:

     R(0)=0 : V=FNR1(0,1006.4) : V=FNR1(0,2006.4) : V=FNR1(30,-9)

Сценарий этот был опробован здесь http://www.proza.ru/2016/09/03/816 и здесь http://www.proza.ru/2016/09/18/951
  В последнем примере на рисунке видно, как эхо для звуков левой руки устанавливается указанием в партитуре.

  Но посмотрим на строку сценария. Первым делом идёт оператор R(0)=0, сбрасывающий все ранее сделанные установки эха.
  Следующими двумя обращениями к ревербератору устанавливаются две точки заброса эха - на 1006 и на 2006 семпла вперёд. Некратные адреса точек заброса несколько размывают эхо, не позволяя точно совпадать максимумам звука, если такие найдутся.
Оба заброса делаются с амплитудой 40% по отношению к амплитуде звука, пришедшего на ревербератор, а в дальнейшем пришедшее из ревербератора эхо будет складываться уже с другой амплитудой.
  Последнее обращение указывает на то, что 30% считанного из ревербератора эха, вновь забрасывается по установленным точкам. Этим достигается эффект многократного эха.

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

   Более подробно, примеры использования ревербератора в создании компьютерного звука альта, и другие его возможности будут обсуждаться в последующих статьях.
============================
ПРИЛОЖЕНИЕ

Текст функции "Ревербератор" и подробные пояснения

DIM R(5000)
DEF FNR1(A,N) ' reverberator
STATIC P,P1,AV,A1,A2,A3,A4,N1,N2,N3,SW%,AK,DK,De,Pr
LOCAL I,J,R$,D,K,B
  N1=5000
  IF N=0 THEN
     IF A>=6.544 THEN
       IF P1=0 THEN P1=201   
       N3=VEL/A : FNR1=N3 : EXIT DEF : END IF
     IF ABS(A)=1 THEN Pr=A   ' key print comment "N3=";n3;" N2=";n2;"  off/on
     IF A=0 THEN   SW%=1 : Pr=1 'keys: REVon, PRINTon
    AK=0 : DK=0 : De=0 :  P1=201 : N3=0 : FOR I=0 TO N1 : R(I)=0 : NEXT I
    FNR1=N3 : EXIT DEF : END IF

  IF N>0 THEN
      N2=INT(N) : D=N-N2 : AV=INT(N2/10000) : N2=N2-AV*10000
   IF A<>0 THEN I=INT(N2/100) : N2=N2-I*100 : N2=N2+I*60
      IF A>=6.544 THEN N3=VEL/A : N2=N2*N3/60 'new frequence and new N3
      IF A=1 THEN D=-D : N2=N2*N3/60 ' -exo  at same frequence and N3
      IF A=2 THEN N2=N2*N3/60  ' +exo  at same frequence and N3
      IF A<0 THEN FNR1=0 : EXIT DEF ' no use
      IF A=0 AND FFF>0 THEN N3=VEL/FFF 'use global frequency
          N2=INT(N2+.5)   
 IF Pr*SW%>0 THEN print r(0);"N3="; : print using "####.##";n3; : print " N2=";n2;" AV=";av
      IF N2+AV>N1-200 THEN print "N2exo+AV too big" : FNR1=0 : EXIT DEF
      IF R(0)>199-AV*2 THEN print "too more EXO points" : FNR1=0 : EXIT DEF
      IF D=0 THEN FNR1=0 : EXIT DEF
         D=D/(AV+1) : I=R(0)+1
      IF A=3 THEN D=-D : N2=-N2-AV '-exo2 stand without N3
      IF A=4 THEN N2=-N2-AV '+exo2 stand without N3
      FOR J=0 TO AV : R(I)=N2+J : R(I+1)=D : I=I+2 : NEXT J
      R(0)=R(0)+2*(AV+1) : FNR1=R(0) : EXIT DEF
  END IF
    'stand  => De% | DK
  IF N=-9 THEN : De=INT(A) : DK=A-De : De=De/100 : FNR1=N3 : EXIT DEF
  IF N<-9 THEN : SW%=ABS(N+10) : FNR1=N3 : EXIT DEF

     'work
      IF SW%+CINT(N)<>0 THEN FNR1=0 : EXIT DEF
     'IF N3=0 THEN print "errow N3=0" : STOP
     A2=A : A1=R(P1) : R(P1)=A1/100 : P1=P1+1 : IF P1>N1 THEN P1=201

     R$=REV$ 'dubl make
     DO WHILE LEN(R$)>4
          P=VAL(LEFT$(R$,2))*N3/60 : D=VAL(MID$(R$,3,3))/100
          P=INT(P)+P1 : IF P>N1 THEN P=200+P-N1
          R(P)=R(P)+A2*D : R$=MID$(R$,7) : LOOP

     A4=0 : A3=A2+A1*De : IF DK>.001 THEN  A3=A3+AK : AK=AK-(1-DK)*A3
     K=R(0)
     IF K>0 THEN ' exo1 make
 I=1 : FOR J=1 TO K STEP 2
        IF R(I)>0 THEN
         P=P1+R(I) : IF P>N1 THEN P=200+P-N1
         R(P)=R(P)+A3*R(I+1)
        ELSE ' exo2 make
         P=P1+R(I) : IF P<201 THEN P=N1-200+P
         B=R(P)*100 : IF ABS(B)>7 THEN B=7*SNG(B)
         A4=A4+B*R(I+1) 'exo2
        END IF
 I=I+2 : NEXT J
     END IF
     FNR1=A1+A4 ' exo1+exo2
END DEF
'=============================
ПОЯСНЕНИЯ К ОТДЕЛЬНЫМ ФРАГМЕНТАМ ПРОГРАММЫ

ОБРАЩЕНИЕ С НУЛЕВЫМ ВТОРЫМ ПАРАМЕТРОМ

  FNR1(0,0) - стандартное обращение к ревербератору в начале программы, рекомендуемое для начальной установки.

  Обращение V=FNR1(Ф,0) если Ф>=6.544 Гц устанавливает N3 и проверяет проинтер P1 - если ноль, то ставит поинтер в начальное положение P1=201. Это обращение настраивает ревербератор на новую частоту, но сохраняет в нём эхо, оставшееся после предыдущего звучания. Об этом обращении не нужно заботиться - оно выполняется функцией создания звука при первом обращении к ней с новой частотой или новым сценарием.

  Если же Ф<6.544 то обращение FNR1(Ф,0) обнуляет массив R(i) а, если Ф=0, то включается ревербератор - SW%=1
        сбрасывается режим сглаживания и повторное эхо - AK=0 : DK=1 : De=0
        Такое обращение полностью очищает ревербератор от предыдущего эха.
        Но может быть вы не хотите очищать ревербератор от эха, а только хотите дать эху новые установки? Тогда напишите в сценарии, или перед циклом обращений к звуковой функции - R(0)=0
Хотите сохранить часть предыдущих установок на эхо - укажите другое значение для R(0). Удвоенный номер заброса печатается в комментарии при каждом забросе вместе со значениями N3 и N2
         Если вам печать комментария при каждом забросе не нужна, то воспользуйтесь этим:
   Ф=1 и  Ф=-1 задают ключ для печати комментариев об установлении эха

        Функция  FNR1 при нулевом обращении по второму параметру возвращает значение N3

  IF N=0 THEN
     IF A>=6.544 THEN
       IF P1=0 THEN P1=201   
       N3=VEL/A : FNR1=N3 : EXIT DEF : END IF
     IF ABS(A)=1 THEN Pr=A   ' key print comment "N3=";n3;" N2=";n2;"  off/on
     IF A=0 THEN   SW%=1 : Pr=1 'keys: REVon, PRINTon
    AK=0 : DK=0 : De=0 :  P1=201 : N3=0 : FOR I=0 TO N1 : R(I)=0 : NEXT I
    FNR1=N3 : EXIT DEF : END IF
=======

ОБРАЩЕНИЕ С ОТРИЦАТЕЛЬНЫМ ВТОРЫМ ПАРАМЕТРОМ

   РАБОЧЕЕ ОБРАЩЕНИЕ - A=FNR1(A,-1) или A=FNR1(A,-2), где A - амплитуда звука на входе
   Отрицательное значение второго параметра, большее чем минус девять, означает рабочее обращение - первый параметр несёт амплитуду в ревербератор, а функция FNR1 возвращает значение эха.
Если значение ключа SW% внутри ревербератора не совпадает со вторым параметром, или SW%=0 (ревербератор выключен), то функция FNR1 возвращает ноль.

   Специальные обращения  с N<-9 - ВКЛЮЧЕНИЕ И ВЫКЛЮЧЕНИЕ:
   Второй параметр -10 выключает ревербератор
   Обращения с -11 и -12 переводят ключ во включённое состояние 1 или 2.
   Аналогично при -13, -14 и т.д.

   При обращении с N=-9, если A>0 ,то
    устанавливается режим сглаживания с DK=дробная часть A, и DK=1, если дробная часть отсутствует
   и устанавливается ослабление для многократного эха De=целая часть A, понимаемая как ослабление, выраженное в процентах :
  IF N=-9 THEN : De=INT(A) : DK=A-De : De=De/100 : FNR1=N3 : EXIT DEF
  IF N<-9 THEN : SW%=ABS(N+10) : FNR1=N3 : EXIT DEF

Рабочее обращение FNR1(0,-1) может использоваться как внутри, так и снаружи функции создания звука.
Таким образом можно организовать паузу, во время которой собственно звук не создаётся, но эхо от прошлого звука из ревербератора слышно. Так делается в приведённом в начале статьи примере.
========

ОБРАЩЕНИЕ С ПОЛОЖИТЕЛЬНЫМ ВТОРЫМ ПАРАМЕТРОМ

Обращение V=FNR1(Ф,N) при положительном втором параметре устанавливает в начальную часть массива R () элементы эха - адрес заброса эха и коэффициент индивидуального ослабления при забросе в точку по этому адресу.

V=FNR1(F,102006.4)
Положительный второй параметр трактуется как мнемонический указатель для установки эха

если Ф=0, это значит, что частота не указана. Тогда в качестве адреса заброса берутся младшие 4 знака  целой части второго параметра, а в качестве коэффициента ослабления - дробная его часть:
FNR1(Ф,320531.5) =>  3|0531|.5 = AV | N2 | D    => N2=531 и  D=0.5
 
значение  AV=3 означает, что кроме 531-го адреса для заброса будут установлены также адреса 532, 533 и 534, забрасываемая амплитуда перераспределяется между ними поровну, поэтому для каждого заброса берётся  D=0.5/4.
   Такое размытие эха сглаживает острые пики эха, а многократное эхо делает ещё более размытым.
Значение N3, необходимое для целей дублицирования (см. ниже), при неуказанной частоте (Ф=0) вычисляется по глобальной переменной FFF, указывающей на текущую частоту -
   N3=VEL/FFF

если Ф не равно 0, это значит, что частота указана и адрес заброса вычисляется с ориентировкой на период звукового колебания. Ориентировка на период позволяет легко назначать точки заброса, находящиеся в резонансе к текущему моменту - со сдвигом на кварту, квинту и проч. кратные интервалы, а также со сдвигом на указанное число периодов.
   Прежде всего вычисляется N3=VEL/F - размер периода, выраженный в семплах. Впрочем, если Ф<6.544, то N3 не вычисляется, а берётся таким, каким было до этого. Возьмём обращение из сценария CASE 8, приведённого выше -
V=FNR1(F,102006.4) => 10|20|06|.4 = AV | I | N2 | D
здесь AV=10, поэтому заброс будет осуществляться последовательно в 11 точек с ослаблением  D=0.4/11 для каждой точки, но каким будет адрес первой точки заброса?
   При ориентировке на период, период делится на 60 частей. Прима соответствует 60, октава вверх - 30-ти.
Квинта вверх - 60*2/3=40,  кварта - 60*3/4=45,  терция - 60*4/5=48,  малая терция - 60*5/6=50
секунда - 60*9/10=54,  секста - 60*3/5=36, две октавы вверх - 15. Многие числа при разделении периода на 60 оказываются кратными целым дробям, представляющим собой интервалы и их обертоны. Поэтому мнемоника соответствующая делению периода на 60 оказывается удобной при назначении точек эха - она поддерживает гармоничность эха.
  Число N2 при мнемонике на 60 может быть равным 0 -99, и таком же может быть число  I - число целых периодов при забросе эха. Но каждый период составлен из 60-ти равных частей, потому число N2 первычисляется таким образом:
  N2=I*60+N2 и далее, поскольку каждый период составляет N2 семплов, то адрес заброса перевычисляется ещё раз:
  N2=N2*N3/60  Поскольку в результате всех вычислений получается дробная величина, то результат округляется до целого. Так, в нашем примере для частоты ноты Фа малой октавы при скорости раздачи 32000 семплов в секунду, размер периода оказался равным N3=184.09 семплам, I=20, и адрес заброса - N2=3700.

   Интересна частота Ф=6.7 Гц. Интересна она тем, что мнемоническое указание N2 на точку заброса эха будет численно соответствовать  пути, проходимым звуком до препятствия, создающего эхо и обратно. Например, указание на эхо FNR1(6.7,30050.4) поместит источник с размытием эха на расстояние 50 метров, то есть будет имитировать эхо в зале, имеющим длину 25 метров.
    Хотите перейти к расстояниям в дециметрах или сантиметрах - задайте Ф=67 или 670.

    Хотите указать на резонанс, создаваемый корпусом скрипки с шириной корпуса 20 см - укажите FNR1(670,20.6). Кажется, мы на квинту от середины третьей октавы попали? 670 Гц - середина второй октавы (а первая и вторая октавы - самый скрипичный диапазон), в соответствии с мнемоникой прима - 60, середина следующей выше, третьей октавы - 30, а вот 20 - это ещё выше на квинту. Другой резонансный размер - 16 см, ширина корпуса скрипки со стороны грифа. Третий резонансный размер -36 см приблизительно равен длине скрипки ( расстояние от подставки до стенки корпуса + расстояние от стенки корпуса до эфа).
   Можете настроиться и на многократное эхо корпуса - укажите постепенно ослабляющееся эхо с запаздыванием на 1, 2 и 3 периода FNR1(670,120.3) : FNR1(670,220.2) : FNR1(670,320.1)
   Если у вас есть альт, то измерьте его резонансные размеры в сантиметрах, и указывайте их на частоте 670 Гц - сделаете математический резонатор, имитирующий эхо в корпусе вашего инструмента.

     Но если вы играете на виолончели, с размерами корпуса примерно в 2 раза большими чем у скрипки, то не только звуковой диапазон у вас буде пониже, но и резонансы, создаваемые корпусом оказываются пониже. Всё от той же частоты 670 Гц обертоны корпуса будут не 16, 20 и 36, а 32, 40 и 72, или что-нибудь вблизи этого - измерьте свою виолончель. Приведёт  ли это к радикальному изменения тембра эха и, как следствие, к изменению формы звукового колебания?
Нет. Вы же не играете в скрипичном диапазоне. Ваш звук на октаву пониже, и опять средний обертон, создаваемый корпусом инструмента оказывается на октаву или две и ещё на квинту выше основного звука. Видимо, именно такое положение этого и других обертонов корпуса воспринимается нашим ухом, как красивое звучание, сопровождающее основной звук.
     Не правда ли, интересные разговоры у нас происходят вокруг такого, казалось бы сугубо технического пункта - как задаются в программе точки заброса эха.

   Параметр D при забросе эха является положительным. А можно ли сделать его отрицательным - организовать точку заброса в противофазе к основному звуку. Делать этого не стоит, поскольку слуховое ощущение эха при таких забросах ослабевает, но, тем не менее, принципиальная возможность такого в программе имеется. Пишем: FNR1(1,24.6), указывая единицу в качестве первого параметра.
  Параметр Ф=2 устанавливает заброс в полном соответствии с мнемоникой, но с использованием предыдущего значения длины периода N3, а параметр Ф=1 устанавливает отрицательный знак для D.
Например, обращение FNR1(1,24.6) запишет в массив R()  адрес N2=24*N3/60 и ослабление D=-.6

   Обращения с Ф=3 и Ф=4 записывают в массив R() отрицательные адреса, которые понимаются не как адреса заброса эха, а как адреса для прослушивания эха2.  Полагается N2=-(I*60+N2), но перевычислений с учётом N3 не делается.
   Обращение FNR1(4,N) => AV | I | N2 | D запишет в массив R() AV+1 отрицательный адрес, сопроводив каждый адрес положительным D=D/(AV+1)
   Обращение FNR1(3,N) => AV | I | N2 | D запишет в массив R() AV+1 отрицательный адрес, сопроводив каждый адрес отрицательным D=-D/(AV+1)
   Интересно обращение FNR1(3,1.9999) - оно организует прослушивание эха2 из той же точки, из которой только что было взято эхо1. Поскольку это прослушивание происходит с D=-.9999, то сложение эха2 с эхом1 даст почти ноль, и никакого эха мы  из ревербератора не услышим.
   Зачем такое нужно? Но мы можем установить с несколько большим запаздыванием ещё несколько точек прослушивания эха2, и соединять звук, подслушанный в разных точках, слушать эхо2 как бы не одним ухом, а несколькими ушами микшируя звук. Можно по разному сочетать эхо1 и эхо2.
===============

ДУБЛИЦИРОВАНИЕ ЗВУКА

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

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

     R$=REV$ 'dubl make
     DO WHILE LEN(R$)>4
          P=VAL(LEFT$(R$,2))*N3/60 : D=VAL(MID$(R$,3,3))/100
          P=INT(P)+P1 : IF P>N1 THEN P=200+P-N1
          R(P)=R(P)+A2*D : R$=MID$(R$,7) : LOOP

   Рассмотрим мнемонику строки REV$ на примере:
REV$="60-20 10-60 20+50 24+50 36+99 39-70 46+10 47-10"

строка распадается на группы, разделённые пробелами, по 5 символов в каждой группе.

   Первое число в группе - это точка заброса, в соответствии с уже рассмотренной нами мнемоникой, привязанная к длительности периода. Хотя первое число может быть от 00 до 99 ( нули писать обязательно - каждая группа должна иметь точно 5 символов), однако указывать 00 или 60, 30 или 90 - разницы нет, длительность периодов и полупериодов при любом колебании меняется плавно, Да и форма пичка не будет кардинально меняться, поэтому амплитуды, записанные по адресам 0 и 60, или 30 и 90 будут попросту складываться друг с другом.

   Второе число в группе - коэффициент ослабления в процентах. Со своим знаком, знак "+" можно было бы не писать, заменив его пробелом - машина разберётся. Но вас этот пробел, не разделяющий группы, спутать может, поэтому советую, указывая коэффициент ослабления при дублицировании, писать знак плюс в явной форме.
   Хотите не ослабить а усилить амплитуду, а число 150% в формат не помещается?
   Забросьте амплитуду дважды по тому же адресу - "24+99 24+51"

Подробно техника дублицирования, применительно к звуку альта, описана тут -
http://www.proza.ru/2016/03/14/716
И хотя там приведён текст малого ревербератора, отличный от приведённого здесь, но всё работает точно также. Кроме того я впоследствии вернулся к большому ревербератору, так что текст, приведённый здесь, в настоящее время является основным (12.10.2016)
===============

ВЫВОДЫ

   Использование ревербератора может быть мощным средством для математического моделирования музыкального звука. Особенно это касается звука смычково-струнных инструментов
   Ревербератор, структура которого описана, и программа которого представлена здесь, может быть использован не только в сочетании с функцией создания звука FNSS3, но и самостоятельно. Например, используя его, можно весьма просто сделать добавление эха в уже существующие записи.
ССЫЛКА для прослушивания или скачивания записи - https://yadi.sk/d/aPx-jHA1pxkPw
===
Спасибо за внимание.


Рецензии
Что интересно, Леонардо да Винчи в своих поисках в передаче божественной пропорции - в звуках и художественного осмысления звуковой и цветовой гаммы на земном плане: передаче и осмысления, пользуясь знаниями того времени и опережая современников, говорил об этом же, но другими словами...
Маленький экскурс... "ИЗО. Эпоха Возрождения"

"Композиция – одно из ключевых понятий художественной системы эпохи Возрождения. Время систематизации творческого процесса. Поиски в Божественном – совершенства человеческого, божественной геометрии. Язык живописи Возрождения складывается, в противовес средневековой традиции: «изображение, как текст». Ориентирован на зрительный образ земного мира. Леонардо да Винчи, постигая новые пласты в изобразительном искусстве, называет живопись царицей искусств! «Живопись затмевает поэзию во всем! так как служит более благородному чувству – зрению, показывает предмет в целом, а не по частям…». Но так как композиция в живописи осмысливается через теорию красноречия (понятие художественной композиции, и ее характеристики, взяты Альберти из теории античного красноречия), Леонардо все же соглашается, что оба искусства – поэзия и живопись, хоть и различны (как бы самостоятельны), всё же равноправны. Позже, Леонардо да Винчи (по свидетельствам современников искусный музыкант «человек всеми совершенствами одаренный») в поисках научного осмысления изобразительного искусства, соотносит и музыку с живописью: «Живопись сестра музыки! так как обе они изучают математические интервалы!»...".

Добрых Вам пожеланий!

Анатолий Святов   15.03.2016 02:08     Заявить о нарушении
Согласен, Анатолий. Есть многие параллели и аналогии, которые прослеживаются и между различными родами искусств, и в соотнесении приёмов искусства с природой. Многое из того, что мы наблюдаем в природе, прежде всего - проявления симметрии, входит в качестве гармонической составляющей и в организуемую художником композицию, и самоорганизующийся случайным образом художественный материал.
И большое мастерство, наблюдательность и знания требуются от художника, чтобы созданное им, и вроде бы искусственное, было в действительности вовсе не им создано. Чтобы в своём творчестве услышать правильно и не заглушить тот Божественный источник, о котором хорошо известно всем творческим людям.
Успехов и Вам!
Дмитрий

Дмитрий Маштаков   15.03.2016 10:12   Заявить о нарушении