Флажолеты в рельефе звука альта

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


   ФОРМА ПРЕДСТАВЛЕНИЯ РЕЛЬЕФА

  Напомню о форме, в которой в программе ТРИО представляется рельеф звука.
  Рельефом звука называется распределение амплитуды звукового колебания внутри периода - от его начала (обозначенного как 0) и до его конца (обозначенного как 2). Распределение это фигурирует в программе в виде строки из двухцифровых чисел от 01 до 99 каждое. Выраженное, например, так -
 "5050505050505050" что означает, что никакого рельефа нет, амплитуда везде равна нулю.
 или так - "604060406040" третий обертон, за время периода амплитуда рельефа совершила три колебания с размахом плюс минус 10 единиц. Плюс минус - от значения 50.
   Мы видим, что строки, описывающие рельеф, могут быть произвольной длины.
    Амплитуда звукового колебания извлекается из строки рельефа с помощью функции FNSPL(A$,X), осуществляющую сплайн интерполяцию.
   Первым параметром функции является строка, содержащая рельеф. А фактически - ссылка на эту строку. Физически строка никуда не пересылается, и потому время счёта совершенно не зависит от того, насколько длинной окажется строка.
   Вторым параметром при обращении к функции интерполяции является X - фаза колебания, число от 0 до 2-х.
   Функция возвращает значение амплитуды колебания. Вы можете видеть, например, такую запись -
   C=FNSPL(A$,X)+MB*FNSPL(B$,X) к амплитуде первой строки прибавляется часть амплитуды второй, и результат записывается в переменную C. Строки A$ и B$ могут при этом иметь разную длину.


   СОСТАВ ФЛАЖОЛЕТА И ОТОБРАЖЕНИЕ ОБЕРТОНА НА РЕЛЬЕФЕ

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

  '(,5,10,15,20) (,3,6,9,12,18) (,4,8,12,16) (,5,10,15,20) (,6,12,18)

  Чтобы отобразить на рельефе 3-й обертон с максимально возможной его амплитудой, мы запишем строку - "990199019901", в ней мы обозначили три максимума числами 99 и три минимума числом 01.
  Для четвёртого обертона строка будет выглядеть так - "9901990199019901", и далее, чем обертон выше, тем строка длиннее.
  Но, вызванные срывом смычка, обертонные колебания затухают, как бы нам это изобразить? Пусть они не будут затухать совершенно к концу периода, но пусть их амплитуда уменьшается по линейному закону, так как это показано на рисунке для обертона номер 6.
  Там же на рисунке красным показан пичок, шириной Vi=.35 и, разумеется, мы погрешили против истины, начав обертон чуть-чуть прежде, чем струна оборвалась с максимума пичка. Однако в отношении тембра воспринимаемого звука, это небольшое различие оказывается совершенно несущественным, поскольку в звуке реального альта находится много эха обертонной частоты, но не всегда понятной природы, так что примем пока то, что получилось.

  Далее, нам следовало бы сложить несколько обертонов вместе, и установить закон - как громкость обертона будет зависеть от его номера. Предположим, что она будет обратно пропорциональна корню квадратному из номера. Считаем -
  .557 для 3 .5 для 4  .447 для 5 .41 для 6 ... .22 для 20 - может быть излишне пищаще получится, но зато все обертоны слышны будут, из этих соображений.
  Всё это я проделал, используя вспомогательную программу, текст которой привожу в конце статьи. И будем пробовать, какой звук получился.
 

  ЗВУЧАНИЕ ПИЧКОВОЙ СТРУКТУРЫ СОВМЕЩЁННОЙ С ФЛАЖОЛЕТНЫМ РЕЛЬЕФОМ

  Сравнивать звук на рельефе флажолета будем со звуком, полученным на рельефе реального альта, представленным строкой 'red в следующем сценарии -


  CASE 41 'viola
    MU2=20.2 : AU2=2 : DU2=150.99 : mod2=33
    MU3=67.06 : AU3=3 : DU3=10.999
    'red
  CASE -41 : Vi=.35+.15*FNTIM(4/(1+.6*T),T) : IF NT=100 THEN MU2=40.05
             'Vo=.2*FNTIM(6,T)

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

  Чтобы перейти от реального рельефа 'red к составленному из обертонов рельефу флажолета, нужно снять апостроф у длинной строки сценария - в ней записан рельеф флажолета номер 1.
Для других флажолет ставим на место этой строки другие строки.
  Запись звуков альта с флажолетами можно прослушать тут -
 https://yadi.sk/d/6yQVP_8jrGsvq
вначале идут звуки с рельефом 'red - обычные и торжественные, а затем, последовательно, такие же звуки на рельефе 5-ти флажолет.

  Звуки, на мой взгляд, перспективные для использования. Поскольку, во-первых они не являются некой выдумкой или украшательством, призвук флажолет естественен для всех смычковых инструментов поскольку смычок с одной стороны разгоняет струну, а с другой стороны, прижимаясь к ней, он же её тормозит. Ну как в этом звуке не услышать призвук флажолета?
  Призвук, он может быть, небольшой, рельеф не обязательно целиком строить на флажолете, а примешать в него значительную долю реального рельефа, например, 'red или 'blue или'green, но зато ( и это во-вторых) какие возможности модуляции тембра и какие красоты открываются перед синтезированным звуком!
  Так что оптимизм в этом направлении имеется. Тем более, что и вся музыкальная культура идёт в настоящее время по пути поиска нового или уже забытого старого звучания музыкальных инструментов, по пути поиска нового тембра.
  Потому и вся эта работа представляется мне нужной, даже если не в практическом, то в исследовательском плане.


   РОТАЦИЯ СТРОК

  Обертонный состав рельефа может изменяться в процессе развития звука путём ротации строк.
  Дело в том, что рельеф может содержатся не только в единственной строке A3r$, но и в предназначенных для того же 3-го МУЗа строках A31r$, A32r$ и A33r$. Строки эти могут, составляя некую комбинацию, или сами по себе, подменять содержимое Arr$.
  Ротация строк с подменой рельефа осуществляется обращением к подпрограмме функции "3_to_one" FNRE$(AM,K). Функция "3_to_one" условно располагает строки A31r$, A32r$ и A33r$ по уровням -1, 0 и 1 и возвращает строку промежуточную - взвешенную между этими уровнями в соответствии со значением параметра-амплитуды AM. Возвращённое значение присваивается строке Arr$.
    Иллюстрацию этого процесса см. на рисунке сверху справа.

  Параметр AM можно изменять по времени периодически, так, как это показано на рисунке красным, или экспоненциально, если связать его с амплитудой того же рельефа - показано синим.
  Если в процессе изменения окажется, что AM=1 - функция вернёт верхнюю строку, AM=0 - среднюю, AM=-1 - нижнюю. Если AM займёт промежуточное значение, то строка будет составлена таким образом, что все значения рельефа в ней будут иметь промежуточные значения.
  Второй параметр K указывает на номер МУЗа, на строках которого делается ротация.
  Ротацией строк рельефа можно оживлять звук во время его развития, или изменять его обертонный состав в процессе его затухания. Такие возможности, в совокупности с тем, о чём было сказано выше, будут конкурировать с возможностями обертонной группы, которая через некоторое время будет всё же добавлена в программу ТРИО.


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

  Привожу текст программы для создания рельефа с обертонными наложениями. Обращаю внимание на начальную строку с нулевым рельефом C$. Какой длины Вы её зададите, такой длины строку получите в результате, и таково, соответственно, будет и тонкое разрешение обертонной структуры.
  А каким должно быть разрешение? Для частоты 640 Гц при скорости раздачи 32000 семпла в секунду на 1 период приходится 50 семплов, и нет смысла делать строку длиннее. У нас она, видите, разрешит 42 семпла на период, и вполне годится не только для 640 Гц, но и для более низких частот.
  Вы указываете обертонный состав - SS$="(,3,6,9,12,18)" и запускаете программу. На знак ? нажимаете Enter. Результат находите в файле RR.TXT
================

'Z_FL.bas
'sum C$=A$+MB*B$+...
   M=1 : MA=1 : MB=.1
10 INPUT A$
  IF A$="9" THEN : STOP
  OPEN "RR.TXT" FOR OUTPUT AS #2

  SS$="(,3,6,9,12,18)"
  '(,5,10,15,20) (,3,6,9,12,18) (,4,8,12,16) (,5,10,15,20) (,6,12,18)
   
  E$=SS$ : MM=0
15 I=INSTR(E$,CHR$(44)) : IF I=0 THEN M=M/MM : GOTO 20
   E$=MID$(E$,I+1) : V=VAL(E$) : MM=MM+SQR(1/V) : GOTO 15

20 A$=C$ : I=INSTR(SS$,CHR$(44)) : IF I=0 THEN CLOSE #2 : GOTO 10
   SS$=MID$(SS$,I+1) : V=VAL(SS$) : MB=M*SQR(1/V) : B$=""
   FOR I=1 TO V : B$=B$+"9505" : NEXT I

   C$="" : L=LEN(A$)/2 : DX=2/L : X=DX/2
30 S=(FNSPL(A$,X)+MB*FNSPL(B$,X)*(3-X)/3+1)*50
   S$=STR$(CEIL(S)) : L=LEN(S$)
   IF L=3 THEN S$=MID$(S$,2)
   IF L=1 THEN S$="00"
   C$=C$+S$ : X=X+DX : IF X<2 THEN 30
   PRINT #2,"B$="+CHR$(34);B$;CHR$(34)
   PRINT #2,"C$="+CHR$(34);C$;CHR$(34) : GOTO 20

'================
DEF FNSPL(E$,X) 'spline interpolation
LOCAL L,Nr,B,B1,B2,ZZ,A$
  A$=E$
  L=LEN(A$)/2 : IF L<1 THEN FNSPL=0 : EXIT DEF
  L=X*L/2 : Nr=INT(L) : L=(L-Nr)*2-1 : Nr=Nr*2+1
  B=VAL(MID$(A$,Nr,2))
  IF Nr=1 THEN B1=50 ELSE B1=(VAL(MID$(A$,Nr-2,2))+B)/2
  IF Nr=LEN(A$)-1 THEN B2=50 ELSE B2=(VAL(MID$(A$,Nr+2,2))+B)/2
  B2=(B2-B1)/2 : B1=B2+B1 'B2=(-)/2 B1=(+)/2
  ZZ=B1+B2*L : ZZ=ZZ+(B-B1)*(1-L*L)
  FNSPL=(ZZ/50-1)
END DEF
'=================================================