Использование буфера для двухголосия и аккордов

Дмитрий Маштаков
   В программе «Пианола» созданная нотная строка проигрывается звуком фортепьяно. В обычном режиме это проигрывание одноголосное, то есть звук генерируется одиночными нотами и распределяется поровну между левым и правым динамиками ноутбука. Однако последняя версия программы позволяет делать звуковые записи в режиме двухголосия с аккордами http://proza.ru/2024/04/08/240

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

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

   Для того чтобы создать двухголосие или сопроводить мелодию аккордами в программе «Пианола» используются буквенные скобки. Они начинаются открывающими символами W,V или v, а закрываются символом w. Рассмотрим сперва скобки вида W…w. Символы внутри этих скобок читаются и обрабатываются точно так же как и обычно, разница лишь та, что семплы нот в буквенных скобках, попав в буфер, не покидают его, а остаются и накапливаются, накладываясь друг на друга, в его нечётных ячейках. Последующие за скобкой ноты записываются своими семплами в чётные ячейки буфера, а когда буфер и ими будет заполнен, он сбрасывается в звуковой файл, создавая разноголосие в наушниках.   
   Рассмотрим, как пример, строку с записью начала вальса Амурские волны:

O1WA/eewA/cc W\E/EEw^cc W\\A/eewA/cc W\E/EEw^cc W\A/ccw<<e>> W\E/ccw^fe

O1 – начало в октаве №1 (контр октава)   
W – индекс буфера i=0, буфер очищается и запрещается его сброс
A – семплы ноты Ля записываются в буфер (в чётные и в нечётные яч.)
    ноты четвертные и поэтому они занимают ровно треть буфера
/ - поднимаемся на октаву выше
еe – записываем в буфер две четвертные ноты Ми,
     если длительность нот начинает превышать размер буфера,
     то полагается i=0, а буфер не сбрасывается а просто
     начинает перезаписываться начиная снизу
w – устанавливается режим, в котором запись идёт только
    в чётные ячейки буфера
A/cc – в чётные ячейки буфера записываются ноты Ля,до,до
       при превышения размера буфера, он сбрасывается и начинает
       перезаписываться.
W – анализируется индекс i если индекс равен размеру буфера, то
    буфер сбрасывается. Затем буфер очищается, полагается i=0,
    устанавливается режим записи в чётные и нечётные ячейки
    и запрет на сброс буфера

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

     РИТМ

   Описанный алгоритм рассчитан на счёт три четверти, то есть, на ритм вальса. Однако его можно перестроить на счет четыре четверти или на две четверти. Длительности нот и пауз в этих режимах автоматически уменьшаются или увеличиваются.
   Делается это цифрой после первой буквы в буквенных скобках вида V4…w и V2…w, а  скобка V3…w возвращает счёт в ритм вальса. Скобки эти вводят двхголосие и полностью аналогичны скобкам вида W…w.


     ТЕМП

   Помимо ритма, можно изменять и темп, то есть, общую скорость проигрывания нотной записи. Делается это изменением скорости раздачи семплов, а вводится указаниями вида Z\3 Z\ Z/9 Z/ Z/\1 и подобными. Значки / и \ изменяют темп вдвое, а такие же значки с цифрами меняют его в меньшее число раз.
   Эти указания делаются прежде нот и пауз, в самой первой строке.
   Чтобы при изменении скорости раздачи не менялась слышимая частота звука, в начало каждой строки при её проигрывании автоматически вставляются значки, противоположные заданным – они изменяют высоту тона на октаву или на указанное цифрой число полутонов.

     ГРОМКОСТЬ

   В момент открытия файла для записи музыки громкость звука принимается за единицу, а потом, специальными указаниями в нотной строке вида H1 H9 его громкость может регулироваться от уровня 0.1 до уровня 1.5, указание H* создаёт звуковой акцент с громкостью 2, а указание H без цифры возвращает громкость на уровень 1.
   H6 даёт громкость чуть больше единицы, а H5 – чуть ниже.

   Символы W и w, составляющие буквенные скобки, устанавливают громкость по своим собственным уровням Hww и Hw. В начале проигрывания эти уровни полагаются равными единице, а в дальнейшем их можно изменять, записывая после букв W и w цифру большую ноля или звёздочку. Буквы, W и w, записанные без указанных знаков за ними, уровень своей громкости не меняют, а просто воспроизводят его.
  То же относится и к букве V в скобках, меняющих ритм.

  Разделение громкости на отдельные уровни Hww и Hw позволяет регулировать громкость мелодии и аккомпанемента раздельно, без лишних на то указаний. Символ с нулём H0 приравнивает уровни Hww и Hw к текущему уровню громкости.

     АККОМПАНЕМЕНТ С АККОРДАМИ

   Аккорды из двух нот в аккомпанемент вводит буквенная скобка вида v…w. Функционально она аналогична скобке V…w и также может задавать ритм цифрами 2,3 или 4, стоящими после открывающей скобки буквы. И так же начальная буква v не задаёт уровень громкости, а воспроизводит его. Ноты аккорда указываются внутри скобок попарно и их семплы записываются в буфер, складываясь между собой.
   Как это происходит, посмотрим на следующем примере. В ключе выставлено четыре бемоля (см. http://proza.ru/2024/03/19/981 ), поэтому ноты Ре,Ми,Ля,Си будут исполняться с бемолями без особых на то указаний.

<v\\AA/<Ec/w9<A7

< - переходим от четвертей к половинным нотам
v – обнуляем буфер, i=0, N=0 – счетчик нот в аккорде равен 0
\\ - опускаемся на 2 октавы ниже
A – Io=i – запоминаем индекс начала записи семплов ноты,
    записываем семплы ноты Ля начиная с индекса i,
    N=N+1 – считаем число нот аккорда
A – N<2 поэтому восстанавливаем значение индекса i=Io,
    записываем семплы ноты Ля в нечётные ячейки начиная с индекса i
    и складывая их с прежними значениями по формуле А=А1/2+А2/2,
    N=N+1 – считаем число нот аккорда
/ - поднимаемся на октаву вверх
< - переходим к четвертным нотам
E – N=2 поэтому запоминаем текущее значение индекса i=0, а
    счётчик нот аккорда обнуляем N=0, записываем семплы ноты Ми
    начиная с индекса i, N=N+1 – считаем число нот аккорда   
C – N<2 поэтому восстанавливаем значение индекса i=Io,
    записываем семплы ноты До в нечётные ячейки начиная с индекса i
    и складывая их с прежними значениями по формуле А=А1/2+А2/2,
    N=N+1 – считаем число нот аккорда
w9 – устанавливаем режим, запрещающий запись в нечётные ячейки,
     задаём громкость H9 и запоминаем уровень громкости Hw=H9
< - переходим к половинным нотам
A7 – записываем в чётные ячейки буфера семплы ноты Ля длительностью
     три четверти, в результате буфер у нас полностью заполнен,
     после сброса буфера в звуковой файл мы услышим ноту Ля в
     сопровождении двух аккордов аккомпанемента. Поскольку первый
     аккорд составлен из одинаковых нот, он слышится как одиночная
     нота.

        АККОРДЫ ИЗ ТРЁХ НОТ

   Рассмотрим теперь пример с аккордами, состоящими из трёх нот.
   Аккорд, состоящий из трёх нот вводится буквенными скобками такого вида v9…w - число 9 здесь служит признаком этого аккорда.
   
v9\\EEE/EGdEAf/w3>(-3)EFE()D0Edc

   Обрабатывается аккорд точно так же, как и аккорд из двух нот, только счёт нот аккорда ведётся не до двух, а до трёх, а для присоединения амплитуд третьей ноты используется другая формула – А=А+А3/2 немного повышающая громкость такого аккорда, но оставляющая равным распределение громкости между его нотами.
   В приведённом примере аккомпанемент состоит из одиночной ноты нижнего Ми и аккордов Ми,Соль,Ре и Ми,Ля,Фа. Цифра 3 после скобок делает мелодию негромкой.
   Знак > это переход на восьмушки.
   Скобка (-3) указывает на триоль – Ми,Фа,Ми имеет длительность двух восьмых нот. Пустая скобка () возвращает нотам их обычную восьмую длительность, и четыре последующие ноты Ре_бекар,Ми,Ре_(бемоль),До заполняют чётные ячейки буфера до самого верха. Буфер, заполненный семплами музыки, готов к сбросу в звуковой файл.

     ОСОБЫЕ МАНИПУЛЯЦИИ С БУФЕРОМ

   На иллюстрации приведен фрагмент осциллограммы со звучанием начала вальса Шопена, проигрываемого программой «Пианола», аккомпанемент находится снизу а мелодия (левый наушник ноутбука и правая рука фортепьяно) на осциллограмме показывается сверху.
   Нас будет интересовать середина фрагмента, отмеченная стрелочкой. На этом месте в нотах указано замедление и затем восстановление темпа. Такие вещи реализовать очень трудно, поскольку буфер имеет жёсткие рамки и не может произвольно растягиваться или сокращаться. Мы можем только менять длину звуков, записываемых в него.

   Мы можем также управлять буфером, для этого существуют специальные значки – Y, Y1 и Y2. Эти значки устанавливают обычный режим записи семплов в буфер, Y1 и Y2 устанавливают в ноль его индекс i=0, а Y2 предварительно сбрасывает содержимое буфера в звуковой файл.
   Это место показано на нижней осциллограмме в укрупнённом масштабе. Ему соответствует следующий фрагмент нотной строки:

v\\AA/<Ec/w9<AH6H0Y1 ^ed0Y2v\FFAdAd/w>(-3)d-ed-()cd-fe

   Первая буквенная скобка заносит в буфер одиночно звучащую ноту Ля четвертной длительности, следующие ноты Ми и До это аккорд половинной длительности(вместо четверти), таким способом создаётся замедление.
   После выхода из скобок записана нота Ля целой длительности. Эта длительность превышает размер буфера, поэтому, по достижении трёх четвертей буфер автоматически сбрасывается в звуковой файл.
   Оставшиеся семплы ноты Ля записываются в буфер, но пропадают, поскольку пришедшее перед последующей паузой указание Y1 обнуляет буфер и устанавливает его индекс в ноль.
   Затем в буфер записывается последовательность, состоящая из четвертной паузы и таких же нот Ми и Ре. Как видите, звучание этих нот тоже затягивается. Пауза и ноты записываются в буфер в обычном режиме и заполняют его целиком. Пришедшее следом указание Y2 сбрасывает буфер в звуковой файл.
   Далее приходит конструкция скобки v…w и запись продолжается в аккордном режиме и в прежнем темпе. Подробности звука вместе с написанными там нотами вы можете рассмотреть на нижней осциллограмме иллюстрации.

     ГИБКИЙ БУФЕР

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

W5ABcd<ew//>ABcd<e W6\\<F>Ew//<f>eY^d#e\\ W7B/BBw/>>g<<<f4>e\\ W8E/ddw/^B7H7>c W8AECw//<A7\\\WA7w/A7

   Цифры после символов W,V,v открывающих буквенные скобки, в программе «Пианола» трактуются как указания на замедления темпа. Они увеличивают длительность звучания последующих нот и пауз и во столько же раз увеличивают размер гибкого буфера. Цифра 5 увеличивает длительность на 10%, 6 – на 20%, 7 – на 30%, 8 – на 40%, а 1 возвращает длительность и размер буфера в обычное состояние.
   Любопытно, что для скобок вида W…w эти же цифры постепенно увеличивают громкость аккомпанемента. И это очень кстати – окончание Амурских волн звучит очень торжественно.
   Если подобная связь с громкостью не нужна, можно использовать скобки вида V…w в которых первый символ громкость не устанавливает. Скобку для аккордов из трёх нот вида v9…w можно заменить на эквивалентную ей скобку y…w, освободив тем самым место для указаний на замедление.

     ТЕХНИЧЕСКИЕ УДОБСТВА

   Буквенные скобки с аккордами - громоздкие конструкции, они занимают в нотной строке значительное место, между тем, как аккорды в аккомпанементе довольно часто повторяются. Поэтому я ввёл удобство чисто технического плана – символ двоеточия внутри аккордной скобки вида v…w и y…w означает повторение предыдущих нот.
   К примеру, в этой строке

Z2#^^fy\\BBB/FBd:/w>^gfcdB< y\CCCFce:/wA#^f y\\A#::/FA#e:/w>^gfced y\<B7::wb7

повторяются сочетания нот FBd Fce FA#e и дважды повторяется ноты A# и B7.
   При проигрывании такой строки, с целью проверки правильности интерпретации повторений, на отдельном поле показываются вставляемые в строку нотные знаки – ими в строке заменяются двоеточия. Опыт показал, что такое усовершенствование удобно.

   Конечно, трудно ожидать от программы «Пианола» полноценного исполнения музыки со многими её нюансами, но на уровне Музыкальной шкатулки она вполне себе работает. Кроме того и сам принцип создания двухголосия и аккордов достаточно простым способом - с использованием буфера, интересен как в теоретическом, так и в творческом плане.
 
__________
10.04.2024

Записи от "Пианолы" слушаем тут -
Амурские волны https://disk.yandex.ru/d/4eRdSiYSJnwg-A
Шопен https://disk.yandex.ru/d/_EUKOYBLmsIiiw

Записи в форме нотных строк -
Амурские волны https://disk.yandex.ru/i/ASsmY3s0xqqdYA
Шопен https://disk.yandex.ru/d/vsckOa7fcF84mA

Скачать программу "Пианола" - https://disk.yandex.ru/d/zY37dlSe4GNqog