Мнемоническая запись музыки заменяющая ноты

   На иллюстрации вы видите первые четыре такта произведения С.В.Рахманинова "Вешние воды". Это рисунок. Имея такой рисунок перед своими глазами, хороший пианист сможет сыграть эту музыку. Я не смогу, и компьютер не сможет, правда причина неумения у него будет несколько другая.
   И в самом деле, как компьютер сможет разобрать знаки, представленные на рисунке, и тем более - интерпретировать их?
   И вот тут неумеющий человек может неумеющему компьютеру помочь – он может перевести эти ноты в такую форму, которая компьютеру будет понятна. Разумеется, такая форма должна быть понятна и человеку – это должен быть особый, промежуточный между нотами на нотном стане и музыкой язык, понятный и для компьютера, и для человека.
 
   И такой язык есть. Я использую его в своей программе «Пианола». Об этом языке я расскажу, но прежде хотел бы рассказать немного о своём музыкальном проекте. Он развивался в течении четырёх лет и принёс впечатляющие результаты – любой человек, не виртуоз, а только мало-мальски разбирающийся в музыкальной грамоте, с помощью двух программ - «Пианола» и «Трио» может делать звуковые записи музыкальных произведений любой сложности. Итоговая статья, посвящённая этому проекту опубликована тут http://proza.ru/2018/06/26/656

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

      БАЗОВОЕ ОДНОГОЛОСИЕ

   Мнемоническое одноголосие это основной режим работы программы «Пианола». В программе может находиться до 50-ти строк, каждая длинной по 80 символов. Некоторые символы являются значащими – это большинство латинских букв и цифры, находящиеся за ними, они обрабатываются программой. Другие символы, такие, как пробелы, подчёркивания и кириллица не являются значащими и программой игнорируются.
   Одна из 50-ти строк является  выделенной, она показывается и её можно редактировать. То есть, вносить туда обозначения нот и другие символы и удалять их. Имеется два режима работы – «Text» и «Note», в первом режиме строку можно редактировать как в Блокнотике, нажимая на клавиши ноутбука, а во втором для записи символов используется нарисованная клавиатура и кнопки с нарисованными на них символами.
 
   Главное в строках это нотные знаки – обозначения нот заглавными буквами CDEFGAB (ноты от До до Си), они показывают, что ноты относятся к первой октаве (в программе первая октава обозначена как O4), эти же ноты записанные строчными буквами cdefgab отнесены ко второй октаве (в программе она обозначается как O5).
   Отнесение нот к октавам условно – указание O2, находящееся в строке, отнесёт последующие ноты CDEFGAB к большой октаве. Символы \ и / понижают следующие ноты на октаву или повышают их.

   Для длительности нот специального обозначения нет, кнопка на панели с надписью 1/4 устанавливает начальную длительность в одну четверть, а далее длительность нот можно увеличивать знаками < вдвое, а знаками > вдвое её уменьшать.
   Паузы обозначаются знаками ~ (пауза двойной длительности) ^  (половинной) ‘ (пауза в четверть длительности ноты) ` (пауза в 1/8 длительности ноты). После каждой ноты всегда делается небольшая посленотная пауза, на неё специально указывать не нужно, она делается автоматически и её длительность включается в длительность ноты. Длительность посленотной паузы можно регулировать символами l (легато) n (нормально) s (стаккато) p (пиццикато).

   Тональность, в которой играются ноты, указывается на панели, или задаётся в строке. Запись Z1# указывает на соль мажор (1 диез), а запись Z6- указывает на 6 бемолей в ключе.
   Знак # после обозначения ноты прямо указывает на диез, знак – на бемоль, а цифра 0 – на бекар. Уже после нотных обозначений можно ставить цифры, дополнительно регулирующие длительности нот, например написать вот так С#7 – соль диез с одной точкой, С#8 – с двумя точками, С#9 – с тремя. Цифры 5-9 увеличивают длительность ноты, а цифры 4-1 уменьшает её.
 
  Итак, мы имеем строку с мнемонической записью одноголосия – звуки нот следуют друг за другом, разделяемые паузами, и не перекрывая друг друга. Полученные строки можно проиграть, звук фортепьяно вычисляется математически по упрощённому алгоритму, сохраняется в форме целых чисел в массиве, который можно назвать буфером, и как только буфер наполняется, он сбрасывается в звуковой файл, то есть, добавляет туда накопленные в буфере семплы.
   Так делается почти всегда, когда мы работаем с большими файлами на жёстком диске – передавать туда отдельные семплы можно, но совершенно нерационально, работа при этом замедляется в десятки раз.

   Если же мы хотим не прослушивать мелодию, а создать файл партитуры, то мы передаём туда информацию построчно, только не в таком виде, в каком мы видим её в строке нотной записи, а превращая строки в страницы. На страницах в столбик записываются частоты нот, их живая длительность (без учёта длительности посленотной паузы) и длительность посленотной паузы.
   Например, из строки  O5 CE>^G получается такая страничка –

1 ================= TFP.TXT   VEL= 32000
F= 523.26 T1= 15680  T2= 320
F= 659.26 T1= 15680  T2= 320
 L= 8000
F= 784     T1= 7840  T2= 160
 2 ============ 48000  48000  1,5
,,,

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

     МЫСЛИ О РАЗВИТИИ БАЗОВОГО ЯЗЫКА

   Базовый язык «Пианолы» ограничен, и только поэтому она неспособна создавать полноценную музыкальную запись. Если посмотреть на музыкальный проект в таком ракурсе, то возникает естественное желание дать «Пианоле» такие возможности, тем более, что голосовые начатки у неё есть – красивое одноголосие со звуком фортепьяно она создаёт.
   Вся прелесть тут состоит в том, что результат можно послушать сразу же, а не ожидать его в конце долгой и утомительной работы с партитурами. На роль «Музыкальной шкатулки» Пианола вполне может потянуть и без программы «Трио» http://proza.ru/2024/04/18/539

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

   Язык нотных строк напоминает язык программирования – он описывает те или иные действия, которые нужно совершить, например, создать звук ноты Ре заданной длительности, или сделать паузу. Однако, прежде чем придумывать язык, нужно хорошенько обдумать те действия, которые наш язык будет описывать. А как создать многоголосие или аккорд, это пока не вполне понятно.

     ПРИНЦИП СОЗДАНИЯ МНОГОГОЛОСИЯ

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

     БУФЕР

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

   Семплы новых нот начинают записываться в буфер по индексу I – это номер чётной ячейки, ещё не занятой предыдущей записью. После очередной записи пары семплов (в ячейку I, или в ячейку I+1, или в обе ячейки) индекс I увеличивается на два.
   Если вдруг обнаружится, что запись очередной пары семплов начнётся с ячейки I=96000, то буфер автоматически сбрасывается, затем буфер очищается, устанавливается I=0, и запись продолжается с нулевого индекса в буфере, заполненном нулями.
   В старом варианте никакого стереоэффекта не было – одинаковые амплитуды записывались в чётные и нечётные ячейки буфера. При скорости раздачи семплов 32000 семп/сек и длительности четвертной ноты 0.5 секунд в буфер помещается ровно 3 четвертные ноты. В этот период длительности, то есть в течении полутора секунд, мы можем добавлять в буфер новые звуки. Из этого и нужно исходить, работая в режиме двухголосия или составляя аккорды.

   Чтобы следить за состоянием буфера и проверять правильность его заполнения используется значок ! – он ставится в том месте нотного текста, который мы хотим проверить. Записав такую строку O5 CE!>^G мы получим ту же партитуру и то же звучание нот, но в информационном поле появится надпись 32000 64000 96000. Мы видим, что буфер в момент I имел размер 96000, предыдущая нота E заняла место с 32000 по 64000, а запись семплов новой ноты должен был начаться с индекса 64000.
   Кликнем по этой надписи на информационном поле и получим дополнительную информацию – 1/4 o5 2_н что означает, что в момент ! длительность нот была 1/4, октава О5, а расстояние от начала буфера соответствовало двум четвертным нотам.
   Чтобы проверить буфер в конце нотной записи, поставим ! в её конце вот так O5 CE>^G! и тогда мы получим такую надпись 80000 96000 96000 и дополнительную информацию 1/8 о5 3_н.
   
     ДВУХГОЛОСИЕ

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

  WCDEw>fedcBA W<FGAwABc

   В этом примере ноты внутри скобок вида W__w чередуются с нотами, записанными вслед за скобками. Скобка открывается символом W, а закрывается символом w. При чтении символа W программа сравнивает индекс I с размером буфера 96000, и если эти числа совпадают, то буфер сбрасывается. Затем буфер очищается, то есть, заполняется нулями, и его индекс устанавливается в ноль.
   После этого программа продолжает свою работу в обычном режиме, но с одним отличием – как только буфер переполнится, то есть, номер для записи очередной пары семплов станет равным 96002, то программа прекращает обработку ноты, устанавливает индекс в положение 96000-2=95998 и читает следующий символ в нотной строке.
   
   Для чего так делается, я расскажу попозже, а пока обратимся к приведённому выше примеру. Внутри первой скобки у нас находятся ноты До Ре Ми – они будут прочитаны и обработаны.
   Далее, встретив символ w, программа выставляет флаг, запрещающий запись в нечётные ячейки буфера, устанавливает I=0 и продолжает обрабатывать ноты. Ноты эти - восьмые, они вдвое короче, и в буфере их поместится ровно 6. После записи последнего семпла последней ноты, индекс I примет значение 96000. Тут как раз и вторая скобка подоспела – выставленный флаг особой записи будет сброшен, а поскольку I=96000, то буфер сбрасывается, затем обнуляется, устанавливается I=0, и семплы нот Фа Соль Ля заполняют буфер.
   Вслед за второй скобкой идут четвертные ноты, их семплы располагаются в буфере так же, как и семплы предыдущих нот, только в левой его части – по чётным индексам I. В конечном итоге мы услышим, ноты До Ре Ми с наложенной на них быстрой нисходящей гаммой, а затем услышим аккорды Фа-Ля Соль-Си Ля-до. Посмотрите на эту строку ещё раз и убедитесь, что это именно так:

WCDEw>fedcBA W<FGAwABc

   Однако что будет, если мы ошибёмся с количеством нот или с их длительностью, или нарочно не допишем ноты – не заполним ими буфер полностью, или напротив того – переполним буфер, что будет тогда?
   Оказывается, что ничего неприятного не случится – заполнение нотами внутри скобки нечувствительно к таким вещам, на месте недостающих семплов находятся нули, а ноты переполняющие буфер, просто игнорируются. Если же переполнение случится на следующих за скобкой нотах, то буфер будет сброшен естественным путём, и начнётся новое его наполнение, однако этих звуков никто не услышит, поскольку вторая скобка буфер сбрасывать не будет (I<96000), а очистит буфер и начнёт заполнение буфера заново.

   Неожиданность произойдёт, только если в нотах после скобок будет недобор, тогда, поскольку опять же I<96000 и звуки, накопленные первой скобкой и после неё, тогда не прозвучат. Но это дело легко исправить – поставьте после нот перед началом второй скобки длинную паузу, или даже две, паузы переполнят буфер и дадут возможность прозвучать накопленным в нём звукам.
   Видите, программа лояльно относится к действиям пользователя и как бы сама старается исправить его недочёты.

     ГРОМКОСТЬ

   В базовом варианте программы, при создании партитур, разговора о громкости не было, громкость регулировалась на следующем этапе, во время озвучивания партитур программой «Трио». Там, в частности, можно было делать партитурные указания вида Н=5 – сделаешь такую надпись, и установишь громкость на условный уровень 5. Точно так же сделано и в «Музыкальной шкатулке» в которую превратилась программа «Пианола» со своим двухголосием.
   А чтобы сэкономить на знаках, указания на громкость можно делать цифрами после букв W и w, записав, к примеру, так – W5CGGw9>agfedc тогда аккомпанемент будет тихим, а нисходящая гамма громкой. Но можно делать и локальные указания, вписывая между знаками нот указания на громкость, например H1 – очень тихо, H* - особо громко. Но с появлением новой скобки без цифр, прежние уровни громкости, установленные с её помощью, восстановятся.
   Помимо абсолютной громкости имеется громкость относительная – указания h5-h9 увеличивают текущую громкость (h9 вдвое). а h4-h0 уменьшают её (h0 вдвое). Указание h возвращает прежде установленную относительную громкость.
   Имеется ещё и общая громкость. Она регулируется кликами правой кнопки мыши по кнопке «play» и полоской в нижней части панели с клавишами фортепьяно.   

     РИТМ И ТЕМП

   Итак, наше двухголосие, поученное с помощью буфера, прекрасно работает при счёте на три четверти, иными словами, в ритме вальса. А что делать, если у нас не вальс, а счёт идёт на четыре четверти? Это тоже очень распространённый размер. Что делать это ясно – нужно просто увеличить размер буфера. В буфере размером 128000 будут помещаться 4 четвертных ноты. Следуя по этому пути, найдём, что для счёта на две четверти нам нужен будет буфер размером 64000, можно приспособить буфер и для более редкого счёта, например для 5/4 или даже для 13/8.

   Тут имеется небольшая сложность, дело в том, что размер массива не может быть переменным числом, но эта сложность легко обходится – сброс буфера заменяется переписыванием некоторого числа его семплов в другой буфер, и уж он, по мере его наполнения, будет сбрасывать свои семплы непосредственно в звуковой файл. Эта схема прекрасно работает, и называется она «гибким буфером».
   Переписывание семплов из одного массива в другой происходит очень быстро, в два десятка раз быстрее, чем заполнение массива вычисляемыми амплитудами – именно на вычисление очередной амплитуды звука тратится основное время при создании музыкальной записи в режиме онлайн.

   Имея перестраиваемый по размеру буфер, нетрудно сделать и регулировку темпа, например, его замедление. Замедления темпа чаще встречаются в музыкальной практике, чем его ускорения.
   Как можно замедлить темп исполнения? Ясно как – нужно увеличить длительность нот и пауз и во столько же раз увеличить размер буфера. Чтобы ускорить темп, сделаем обратное – сократим длительность нот и пауз, и, соответственно этому, уменьшим размер буфера.
   Описанная идея реализуется буквенными скобками V__w. Эти скобки функционируют точно так же, как и скобки W__w, то есть, создают двухголосие, только цифра после V не регулирует громкость, а имеет другое значение – цифры 243 устанавливают счёт – 2/4 3/4 и 4/4, цифры 5-9 замедляют темп, а цифры 1 и 0 ускоряют его.
 
   Для особо сложных размеров счёта имеется отдельная регулировка вида V74w, где первая цифра указывает на счёт (здесь он получается 7/8), а вторая на темп (4 это немного быстрее). На темп можно указывать и так T4, или просто поставив цифру 4 в самую первую позицию нотной строки. Запись W74w имеет это же значение, с той разницей, что полагается I=0 и ноты начинают записываться начиная от низа буфера. Запись V7w устанавливает только размер счёта.
   Как вы видите, добавления к мнемоническому нотному языку получились понятными и компактными.

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

     УДЛИННЕНИЕ ЗВУКА НОТЫ

   Акценты на нотах можно делать не только увеличивая громкость отдельных нот, но и увеличивая их длительность. Для этого используется значок плюс: +0 - +9 поставленные прежде ноты или паузы, продлевает длительность звука (паузы) на 0.05 – 0.5 сек, а значок +* увеличивает длительность на одну секунду. Одиночный значок плюс повторяет действие предыдущего значка.

     ПРИНЯТЫЕ СОКРАЩЕНИЯ

   Сокращения делают нотную запись проще и компактнее.
   Назначение и последующее снятие триоли z…z ставит последовательность из трёх нот на место последовательности из двух нот с такой же общей длительностью.
   Назначение и снятие мелизма z13…z ставит 13 нот на место одной ноты текущей длительности. На месте 13 допускается число из одной или двух цифр, большее чем два.
   Конструкция (…) эквивалентна <<<…>>>, а конструкция ((…) эквивалентна <<<…>>>.

     ПЕДАЛЬ

   Педаль назначается символом @ с цифрой за этим символом. Цифра указывает на глубину нажатия педали. Если цифры за этим символом нет и знак педали появился в строке первый раз, то тогда педаль включается и она начинает продолжать звуки нот на 10000 семплов, что по времени составит 0.31 сек или две трети длительности четвертной ноты. Именно столько времени этот остаточный сыгранной звук будет звучать в паузе между нотами и затем складываться со звуком следующей ноты.
   Повторное появление символа @ в строке отменит педаль, а третье – вновь введёт педаль с той же глубиной нажатия, и так до конца строки. В начале следующей строки педаль отменяется и опять, по умолчанию предполагается, что глубина её нажатия составит 10000 семплов.
   Цифры 1-9 стоящие за символом @, устанавливают педаль с глубиной нажатия 4000 – 9*4000 и продлением звука нот на 0.125 – 1.125 сек.
   Установка педали на первой позиции строки привяжет её к началу строки – она будет автоматически включаться в начале каждой последующей строки с той глубиной с которой она была на этой позиции установлена. Отвязывание педали от начала строки делается указанием @0, стоящим в любой позиции строки.


     АККОРДЫ И ПОВТОРЕНИЯ НОТ В АККОМПАНЕМЕНТЕ
   
   Наиболее актуальными являются аккорды в аккомпанементе, то есть, в буквенных скобках. И простейшим решением со стороны синтаксиса стало введение для аккордного сопровождения особых буквенных скобок – v__w и y__w. Они обладают всеми свойствами скобок V__w, но содержат не одиночные ноты, а пары и тройки нот.
   Например, vCEDFEGw прозвучит как аккорды C-E D-F и E-G, а
   yC#C#C#EGcEGcw прозвучит как одиночная нота с двумя одинаковыми аккордами. И тут сразу приходит на ум, что в такой аккордной записи повторения нот могут встречаться часто, и конструкция будет громоздкой, особенно, если нотные знаки содержат диезы и бемоли.
   Синтаксически эта проблема решается введением знака повторения – двоеточия. Тогда нашу длинную скобку можно будет записать в более коротком виде - yC#::EGc:w.

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

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

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

C:E:G:c – тут алгоритм реализации попроще, мы не перекраиваем нотную строку, а каждый раз, при чтении знака двоеточия, обновляем индекс I.

C:3EGcDFBdEGce:0 – это вторая синтаксическая конструкция, цифра после двоеточия показывают сколько нот присоединяется в аккорде к опорной ноте. В данном примере аккорды составлены из четырёх нот и записываются эти ноты подряд, одна за другой. Сначала исполняется аккорд CEGc, затем DFBd и потом EGce. Запись :0 снимает аккордное назначение.

     АРПЕДЖИАТО

   Особой конструкцией является арпеджиато. В арпеджиато может входить до 20-ти нот, Эти ноты записываются друг за другом (также, как и для аккордов, между нотами могут быть и другие знаки, например, слежи \ и / или указания но громкость), а исполняются, накладываясь друг на друга с задержкой.
 
   Арпеджиато задаётся указанием вида T86 где первая цифра задаёт замедление (5-9) или ускорение (4-0) темпа, а вторая задаёт задержку звука очередной ноты относительно предудущей. Если вторая цифра 0, то задержка равна нулю и тогда арпеджиато превращается в аккорд. После набора в арпеджиато нужного количества нот, надо поставить знак S, он оборвёт процесс создания арпеджиато, сбросит буфет и установит I=0.
   Запись арпеджиато может выглядеть так T99\\cegb/cegb/eS
   Вот пример того, как арпеджиато может звучать https://disk.yandex.ru/d/c4upDWFJ9KzRNg
      
   Символ T с одной цифрой просто задаёт темп, а символ T без цифр отменяет заданные изменения темпа.

     РАБОТА С БУФЕРОМ

   Символы Y Y0-Y8 совершают с буфером операции и вносят особенности в работу с ним. Указание Y устанавливает в ноль индекс буфера, Y1 делает то же и очищает буфер, Y2 перед очисткой сбрасывает буфер (целиком), Y2 делает то же, но сбрасывает буфер не целиком, а по индекс I, Y3 делает то же, что и Y2 и организует затем длинную паузу (сбрасывает буфер, наполненный нулями), такая пауза бывает нужна для того, чтобы отделить одну часть музыкального произведения от другой.
   Кроме того, все перечисленные Y указания устанавливают обычный режим записи в буфер, то есть отменяют режимы буквенных скобок и послескобочный режим односторонней записи. Перечисленные указания имеют одноразовый характер – выполнив то или иное действие, они его автоматически не повторяют.

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

   Пролонгированный до конца строки характер имеют символы Y5-Y8. Эти символы устанавливают особый режим работы. Режим Y5 повторяет обычный режим в том отношении, что созданные семплы звука записываются на обе стороны буфера – одновременно в ячейки левой и правой его сторон. Отличие от обычного режима состоит только в том, что при переполнении буфер не сбрасывается, а его индекс начинает топтаться в вершинке буфера, точно так же, как это происходит при работе внутри буквенных скобок – звук нот, переполняющих буфер, попросту теряется.
   В режиме, вводимый символом Y6, семплы записываются в левую часть буфера, а в режиме Y7 – в правую.
   Довершить запись можно в режиме Y8, в нём семплы не записываются а прибавляются своими амплитудами поровну в обе части буфера. Алгоритм построен таким образом, чтобы громкость прежде записываемых нот и громкость прибавляемых нот была бы одинаковой. При этом использовать режим Y8 можно многократно, добавляя в буфер звуки всё новых и новых нот. Результирующий звук, получаемый при многократном наслоении, постепенно увеличивает свою громкость, однако громкость эта ограничена трёхкратной громкостью одиночного звука и асимптотически стремится к этому пределу.
   Сбрасывается буфер по уровню последнего заполнения (то есть до индекса I) указанием Y3. Это же указание ликвидирует предыдущие режимы и устанавливает обычный режим записи (в обе ячейки с автоматическим сбросом при заполнении буфера).

   Для облегчения работы указания Y6,Y7,Y8 и Y3 можно заменить символами I,J,L и S – сброс буфера обозначается этой буквой. С этими символами запись становится более понятной чем та, в которой используются игреки. Опять же, оказываются очень удобными символы повторения – r,R,x они сокращают нотную запись и о них я сейчас расскажу.

   Рассмотрим пример работы с буфером:

M>8  r6JGB0:2d0fxI>/^fe0fagL<<B7,  J\>r3CG:2cgx,I/d#7>e0g/cS

здесь, разделённые пробелом, записаны два последовательных такта музыкального произведения П.И.Чайковского (вальс из цикла Времена года).
   Счёт на три четверти, первый такт имеет долгую ноту Си длительностью в полный такт, и эта нота заключает первый такт - L<<B7
Заметьте, что указания на сброс перед началом второго такта нету, это потому, появление символов I или J после L приводит к автоматическому сбросу буфера.
   Хотя символ S можно и поставить – он ведь вводит обычный режим, и следовательно, лишнего сброса буфера произойти не может.

   Начинается первый такт записью JGB0:2d0fx – одиночная нота Соль и аккорд Си-бекар до-бекар фа. Символ x означает повторение аккорда – программа находит в нотной строке предыдущий аккорд и записывает его вместо значка икс. То есть, фактическая запись оказывается такой JGB0:2d0fB0d0f и, соответственно ей, исполняется одиночная нота и следом два одинаковых аккорда по три ноты в каждом. Возможно также многократное повторение аккорда поставленными подряд значками x. Если внутри нот аккорда находится одна слежа, поднимающая звук на октаву вверх или опускающая его вниз, то в повторе это будет учтено, и повторный аккорд прозвучит правильно.

   Следующая запись I>/^fe0fag заполняет семплами правую часть буфера. Это пауза 1/8 и ноты фа ми-бекар фа ля соль.
   Затем выполняется L<<B7 – длительность нот увеличивается в четыре раза и звучит продлённая точкой (цифра 7 соответствует такому продлению) нота Си.

   Весь первый такт обрамлён значками r6______,
Первый значок организует запоминание следующего за цифрой 6 фрагмента строки. Запятая маркирует конец фрагмента. Теперь, в будущем, можно будет просто записать R6 чтобы воспроизвести в этом месте фрагмент под номером шесть. Запоминать таким образом можно и всю строку, тогда финальную запятую можно не ставить.
   В следующем такте J\>r3CG:2cgx,I/d#7>e0g/c вы тоже можете видеть конструкцию r3____, тут запоминается аккорд Соль до соль вместе с его повторением. В правой руке стоит продлённая четвертная нота ре-диез и затем идёт проигрыш ми-бекар соль до нотами 1/8 длительности.

   ПОДВЕДЁМ ИТОГИ

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

   Вот, например, как выглядит в мнемонической форме запись четырёх тактов, показанных на иллюстрации:

Z3-V1w> H4H0 r9VE7:e7/>Beg/Be<c:e:g rB0:e:g:b0RRrB:e:g:aR'w,Y1   
V16w  R9/r8^>E:1GGBBeegg^b^:0/ecge /B0GeB0geBG,Y2 V09w <O1R9/R8Y2`         
V44wr9O1>>WzEBegb/egdBGce<c:e:g rc-:e:gRRrB:e:gRzw<O4,Y1`   
W47wR9 H9 O5^E:3GBe<9DGBd>9CEGc>0 \BegbH5eeggH9<9Begb/>9CEGc:0 Y2`
W11wr9O1W<9G:/G>9/DGBdg/>0E:3GBe DGBdDGBdC#GBc#DGBd:0G5w,Y1`
W14wR9< H9O5D:3GBd!>H4\\G:1BBddggb /Bd:0^^/GBGdBgc#dBGD!`

Как это звучит, можно послушать тут - https://disk.yandex.ru/d/Q8QWUsiqIrrSUQ

   Создание мнемонического языка для записи нот сложных музыкальных произведений в одну строку и стандартным шрифтом, по моему мнению, тема актуальная и до сих пор очень мало изученная.
Прошлая статья на эту тему опубликована тут – http://proza.ru/2024/03/12/973         

__________
13.05.2024


Рецензии