Чистый звук при аккорде

Синтез звука. Аккорды

В предыдущей статье обсуждалось создание многоголосия при озвучивании мелодии синтезированным на компьютере звуком. Сейчас мы поговорим о создании звука аккорда.

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

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

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

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

Давайте, рассмотрим структурную схему программы, представленную на рисунке, разберёмся с ней, и посмотрим, каким образом в программу встраиваются аккорды.
О программе TRIO рассказывалось в прошлой статье, но давайте взглянем на неё ещё раз, сосредоточившись на структуре функции создания звука.
Следуя выбранному нами лёгкому пути, мы понимаем, что аккордный ряд можно создать в форме расширения одноголосия, и предназначаем для этого одного музыканта — MUZ3 и одну из трёх функций — FNSS3, к которой обращается музыкант. Можно так поступить со всеми тремя, никаких проблем, в будущем, наверное, я так и сделаю, но пусть пока только MUZ3 будет уметь у нас делать аккорды — дадим ему для этого подходящий инструмент.

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

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

Итак, дирижёр пишет семплы, все работают, музыкант MUZ3 читает партитуру FT3.txt и обращается к функции FNSS3, которая умеет делать аккорды.

При первом обращении с новой частотой программа идёт по голубой стрелочке — «первый ход». Делаются начальные установки — устанавливается время T=0, обычное время в секундах, отсчитываемое от момента начала звука; определяется шаг по времени и период звукового колебания. Затем устанавливаются параметры по умолчанию — в программе масса параметров, и незачем задавать все параметры в каждом сценарии явно. Установка по умолчанию означает обычно отключение звуковой группы* от участия в создании звука, например, все амплитуды и модулирующие факторы по умолчанию полагаются равными нулю.
Затем, в соответствии с параметром обращения K, выполняется установка параметров по тому или другому сценарию.
В последующих обращениях «первый ход» будет обходиться стороной, по чёрной стрелке.
___________
* звуковая группа. Звуковая функция для создания звука может использовать внутри себя три звуковых группы (фортепьяно, Виола и рельеф), каждая со своим алгоритмом вычисления амплитуды.

Далее по программе происходит приращение времени, и по ранее вычисленному периоду колебания TT определяется номер периода, как целая часть результата деления времени на период, и величина X — фаза колебания, как удвоенное значение дробной части результата деления. Фаза колебания оказывается, таким образом, в интервале от 0 до 2-х. Это то же самое, что привычное нам — от 0 до 2*Пи, но число Пи нам не понадобится, поскольку мы не пользуемся функцией синус для построения формы простейшего колебания, а аппроксимируем эту форму параболой.

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

Итак, мы попадаем на блок, названный на рисунке «вычисления амплитуд», тремя различными путями: (1) при первом обращении — по синей стрелке и делая петлю по коричневой, (2) при последующих обращениях и в начале каждого периода — по верхней чёрной стрелке и делая петлю по коричневой, (3) при последующих обращениях и в середине периода — по двум чёрным стрелкам. Последний путь — самый скорый. Описанный алгоритм разделения путей позволяет очень существенно экономить вычислительное время.

Итак, мы переходим собственно к вычислению амплитуд, которое нужно организовать так, чтобы оно происходило предельно быстро. В результате вычислений мы получаем 3 амплитуды от 3-х звуковых групп, которые складываем.
И вот теперь мы попадаем на некие добавления, которые называются «аккордный повтор».

Итак, мы пришли почти что к выходу из звуковой функции, имея амплитуду звука основной частоты.
Пусть это будет частота нижнего аккордного звука. Как нам сформировать аккорд?
Прежде всего мы должны иметь указания на частоты нот составляющих аккорд, и это очень просто сделать, если поместить в какой-нибудь массив коэффициенты повышения частоты для других звуков аккорда, например, указать Ac(2)=1.25 и Ac(3)=1.5 для второго и третьего звуков, сформировав вместе с первым звуком мажорное трезвучие. А первым числом в этот массив можно поместить число нот в аккорде — Ac(1)=3. Число это на стадии начальной установки мы извлечём в переменную NAc.
Но что это у нас позиция Ac(0) в массиве зря пропадает? Поместим туда задержку в появлении звуков верхних нот аккорда и извлечём эту величину в переменную DAc, организовав арпеджиато. Задержку удобно указывать в количестве периодов основного звука, так Ac(0)=20, например.

Кроме создания указанного массива нам следует позаботиться о счётчике числа нот аккорда и о переменной, в которой амплитуды звуков аккорда будут накапливаться.
Поместим присвоения NNAc=0 : Asum=0 в то же место, в котором программа делает шаг по времени. Теперь у нас всё готово. Вычисляя в аккордном повторе новые значения X взамен относящегося к основному звуку и уже использованного, и переходя по оператору GOTO к повторному вычислению амплитуд, но уже с новым значением фазы, мы наберём в суммирующей переменной суммарный аккордный звук.
Разумеется, звук нескольких нот имеет громкость существенно большую, чем громкость одиночной ноты, поэтому мы уменьшим суммарную амплитуду пропорционально квадратному корню из общего числа нот, составляющих аккорд. Почему корень, а не само количество нот? Потому, что амплитуды составляющих аккорд звуков проявляют при сложении свойства случайных величинам — они могут быть как положительными, так и отрицательными, и потому мы пользуемся законом статистики.
Вот весь текст аккордного повтора —

NNAc=NNAc+1 : Asum=Asum+A
IF NNAc NNAc*DAc THEN X=T*Ac(NNAc+1)/TT : X=(X-INT(X))*2 : GOTO M2SS3
END IF
A=Asum/SQR(NAc)

здесь GOTO M2SS3 это переход на метку, на которую указывает красная стрелочка на рисунке.
Поскольку, как оказалось, аккордный повтор это такая простота, то я думаю ввести его во все звуковые функции, нужно только будет перейти от одномерного массива A(i) к двухмерному A(i,n), где n будет номером звуковой функции.

Нужно ещё подумать о том, как и насколько удобно будет заполнять аккордный массив коэффициентами. Кто это будет делать? Понятно, музыканты — они же читают партитуру.

ЗАПОЛНЕНИЕ АККОРДНОГО МАССИВА КОЭФФИЦИЕНТАМИ

Прежде всего о мнемонике. Cm или C7maj — общепринятые музыкальные обозначения. Используем их и мы. Одновременно будем пользоваться мнемоникой, принятой в программе для чтения партитуры.
Появление в строке партитуры записи G=Cm будет означать использование последующих звуков в форме минорных трезвучий. Заметим, что «C» должно обозначать вроде бы До, а у нас в партитуре частоты нот задаются в явном виде, и они могут быть отличными от частоты До, тем не менее мы сохраним такую несколько странную мнемонику. Странную, но зато всем понятную. Почему G= а не A= ? Чтобы не путать с русской буквой А, и кроме того, А больше ассоциируется с амплитудой, а не с аккордом.

А как нам в такой мнемонике указать на арпеджиато? Давайте так — G=20/Cm, здесь 20 — те самые 20 периодов задержки звуков в арпеджиато, о которых говорилось выше.
Обозначения аккордов были взяты из этого источника —
http://www.gitaristu.ru/beginners/art/tabl_accord
они удобны и разнообразны, но не исчерпывают всех возможностей сочетания звуков в аккорде. Поэтому введём в мнемонику возможность явного указания на высоту тона.

G=20/34 сформирует всё то же минорное трезвучие с той же задержной для звуков арпеджиато. Одиночные цифры=числа в этом назначении обозначают количество полутонов, на которые повышается звук при переходе от предыдущей ступени аккорда на последующую. Всего в массиве предусмотрено место для 10-ти аккордных звуков.
Среди одиночных цифр могут быть и нули. Тогда предыдущий аккордный звук будет повторён, но мы вряд ли заметим это, просто он будет звучать в 2 раза громче, что, кстати, может быть использовано для акцентации отдельных звуков аккорда.
Предусмотрена и возможность понижения ступени аккорда. Чтобы указать на понижение, перед цифрой, обозначающей количество полутонов, нужно поставить знак минус.
Повысить ступень можно и на двухзначное число, для этого перед двумя его цифрами нужно поставить знак плюс. Таким образом, конструирование аккорда может быть разнообразным. В арпеджиато ступени аккорда играются в очерёдности их записи.
Обрабатывается назначение аккорда отдельной функцией по обращению от MUZ3
I=INSTR(L$,»G=») : IF I>0 THEN I=FNAcc(MID$(L$,I))

Ниже приводится текст этой функции, из которого ясна принятая мнемоника стандартных аккордов. Заметим, что при создании аккордов используются не чистые интервалы, а интервалы, соответствующие равномерно темперированной шкале (потому множителем для звука Ми стоит не 1.25, а 1.26).
По ссылке — https://yadi.sk/d/CGLZxYKKqXEVU
можно послушать запись (осциллограммы отдельных частей этой записи показаны на слайдах рисунка) звуками фортепьяно, в которой первая и заключительная части идут одиночными звуками, вторая часть — звуками арпеджиато мажорного трезвучия G=20/C, а третья часть — с отменой арпеджиато, четырьмя звуками доминатсептаккорда с понижением звучания на октаву. Последнее сделано установкой множителя для частоты, передаваемой звуковой функции. Выглядит такая запись в партитуре так —
G=/C7 M=.5
Чтобы снять только назначение арпеджиато, сохранив прежний аккорд, нужно записать G=/, чтобы назначить новый аккорд, сохранив прежнее арпеджиато — G=C7, а чтобы перейти к одиночному звуку — G= безо всяких указаний после знака равенства или G=C1.
В одной строке с назначением аккорда могут быть и другие назначения. Эта строка в своём начале может задавать также и паузу.

Из всего вышесказанного следует, что имплантация аккордов в рассматриваемую структурную схему создания записи с компьютерно синтезированным звуком делается просто и эффективно.
______
Примечание. В настоящее время от опций с мнемоникой Cm или C7maj я отказался, и указываю на интервалы между звуками аккорда только в численном виде.
Зато появилась возможность переходить на большие интервалы:
если одиночное 5 означает на 5 интервалов вверх, то трёхзначная мнемоника
+12 будет означать на октаву вверх, а -05 означает на пять интервалов вниз.

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

‘==================
DIM Ac(10)
DEF FNAcc(S$)
LOCAL A$,I,M,Mi,N,J,Ns
FNAcc=1
A$=MID$(S$,3) : I=INSTR(A$,» «) : IF I>0 THEN A$=MID$(A$,1,I-1)
IF A$=»» THEN Ac(0)=0 : Ac(1)=1 : EXIT DEF
I=INSTR(A$,»/») : IF I>0 THEN Ac(0)=VAL(A$) : A$=MID$(A$,I+1)
IF A$=»» THEN EXIT DEF
IF MID$(A$,1,1)=»C» THEN
SELECT CASE A$ ‘эта часть программы в настоящее время отсутствует
CASE «C» : Ac(1)=3 : Ac(2)=1.26 : Ac(3)=1.5
CASE «Cm» : Ac(1)=3 : Ac(2)=1.19 : Ac(3)=1.5
CASE «C5+» : Ac(1)=3 : Ac(2)=1.26 : Ac(3)=1.587
CASE «Cm5-» : Ac(1)=3 : Ac(2)=1.19 : Ac(3)=1.414
CASE «C6» : Ac(1)=4 : Ac(2)=1.26 : Ac(3)=1.5 : Ac(4)=1.682
CASE «Cm6» : Ac(1)=4 : Ac(2)=1.19 : Ac(3)=1.5 : Ac(4)=1.682
CASE «C7maj» : Ac(1)=4 : Ac(2)=1.26 : Ac(3)=1.5 : Ac(4)=1.888
CASE «C7» : Ac(1)=4 : Ac(2)=1.26 : Ac(3)=1.5 : Ac(4)=1.782
CASE «C75+» : Ac(1)=4 : Ac(2)=1.26 : Ac(3)=1.587 : Ac(4)=1.782
CASE «C75-» : Ac(1)=4 : Ac(2)=1.26 : Ac(3)=1.414 : Ac(4)=1.782
CASE «Cm7+» : Ac(1)=4 : Ac(2)=1.19 : Ac(3)=1.5 : Ac(4)=1.888
CASE «Cm7» : Ac(1)=4 : Ac(2)=1.19 : Ac(3)=1.5 : Ac(4)=1.782
CASE «Cm7+5+» : Ac(1)=4 : Ac(2)=1.26 : Ac(3)=1.587 : Ac(4)=1.888
CASE «Cm75-» : Ac(1)=4 : Ac(2)=1.19 : Ac(3)=1.414 : Ac(4)=1.782
CASE «Cdim» : Ac(1)=4 : Ac(2)=1.26 : Ac(3)=1.414 : Ac(4)=1.682
CASE ELSE : Ac(1)=1
END SELECT : EXIT DEF
END IF
M=1 : Mi=1.059463 : I=1 : Ac(1)=1
DO UNTIL I>LEN(A$)
Ns=1 : IF MID$(A$,I,1)=»-» THEN Ns=-1 : A$=MID$(A$,2)
IF MID$(A$,I,1)=»+» THEN Ns=2 : A$=MID$(A$,2)
N=VAL(MID$(A$,I,ABS(Ns))) : IF N=0 THEN N=1 : M=M/Mi
IF Ns>0 THEN FOR J=1 TO N : M=M*Mi : NEXT J
IF Ns 10 THEN EXIT DEF
Ac(I)=M : Ac(1)=I : LOOP
END DEF
==================

Источник

Оцените статью