Слияние звука в последовательности нот

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

  Проблема слияния звуков фортепьяно возникает при попытках имитировать нажатие педали на этом инструменте.
  В программе «Трио» последовательность нот обрабатывается также последовательно – подпрограмма-музыкант «MUZ» читает строки текстового файла, называемого партитурой, и находит в строке частоту ноты, длительность её звучания и длительность посленотной паузы (F, T1 и T2). Запомнив эти три величины, музыкант обращается к звуковой функции, настраивая её на начало звука. Затем он ещё T1 раз обращается к звуковой функции.
  В каждом из этих обращений музыкант указывает два параметра – частоту ноты F и номер сценария R, по которому развивается звук. Номер сценария фортепьяно R=8 музыканту уже известен заранее – этот номер был указан в первой строке партитуры.
  Если партитура выглядит так –

R=8 H=3 TE=20
 L= 6750
F= 293.66 T1= 6615  T2= 135
F= 329.63 T1= 6615  T2= 135

то в результате её исполнения мы получим сначала паузу длиной в 6750 семплов, а затем семплы нот Ре и Ми, разделённые коротким интервалом длиной 135. Эти семплы показаны на иллюстрации сверху.
  В первой строке партитуры помимо номера инструмента указана громкость звучания H=3 и длительность среза звука TE=20, выраженная в количестве семплов. Дело в том, что если звук внезапно кончается на высокой амплитуде, то это слышится как хлопок. Постепенное снижение амплитуды к нулю на протяжении 20-ти семплов хлопком уже не ощущается. Именно это значение принимается по умолчанию и поэтому конкретно в этой партитуре оно является излишним.
  Также, по умолчанию, полагается, что H=1, но если нам нужна громкость более высокая, то её мы должны задать в явном виде.

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

  Теперь посмотрим на то, как эти штрихи выполняются или могут быть реализованы в программе «Трио». Перераспределением длительности между величинами Т1 и Т2, а также регулировкой размера среза звука, легко могут быть сделаны различные оттенки нон легато и стаккато.
  Как будто не возникает проблем и с легато – установив в ноль величину Т2 и ликвидировав срез, мы обеспечим полное прилегание звуков. Хлопок, возникающий при этом, можно принять за звук удара молоточка по струне или за стук клавиши. Ясно, что это не во всех случаях хорошо.
  Более того, при быстрой игре форте, струны просто физически не могут затихать мгновенно, и в синтезированном звуке это становится очень заметным – вместо красивых и наполненных звуком пассажей получаются маловыразительные стукатушки.

  Таким образом, реализация портато в форме наползания звука на последующую ноту становится насущной необходимостью. О педали я уж не говорю. Хорошо бы организовать и то, и другое.
  Однако, как это сделать?

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

    ПОЧТИ ДЕТЕКТИВНАЯ ИСТОРИЯ

  Труд программиста похож на распутывание некой детективной истории, которую он сам же написал, но уже порядком подзабыл.
  Так произошло и на этот раз.
  Распутывая «следы детектива», я обратил внимание на переменную F, которая, как вы помните, была прочитана нашим музыкантом. Что делает музыкант с этой переменной когда обнаруживает, что число требуемых семплов Т1 закончилось? Оказывается, что тогда он устанавливает эту переменную в ноль, вот так - F=0. Но зачем он производит такое странное действие?

  Продолжаю распутывать свой «детектив» дальше и обнаруживаю, что именно по этому признаку на своём следующем шаге музыкант понимает, что нужно бросить свои текущие дела, и наступает время читать новую строку партитуры.
  Как это прекрасно! - воскликнул я и поместил перед оператором F=0 небольшую программку, которая продолжает обращаться к звуковой функции P раз, но не передаёт полученные амплитуды в виде семплов, а записывает их в некий числовой массив. Причём, делает это шиворот-навыворот – начиная с номера Np=P и кончая номером 1. И только после этого выполняется оператор F=0, и музыкант приступает к чтению новой строки партитуры.

  Теперь остаётся совсем малое – если Np>0 то в очередном звуке к его амплитуде мы добавляем амплитуду, прочитанную из массива по адресу Np, а сам адрес после этого уменьшаем на единицу.

  Такое удлинение звука легко просмотреть, для этого громкость следующих звуков нужно положить равным нулю, и тогда звук первой ноты предстанет во всей своей красе (см.иллюстрацию).
  А если громкость следующего звука не уменьшать, то произойдёт наложение, которое тоже показано на иллюстрации.
  Длительность нот, показанных на иллюстрации, равна 0.21 сек, а вертикальные чёрточки идут с интервалом 0.3 сек. 
 
  Вот сценарий, в котором для смешения звуков используется портато -

R=8 H=3 TE=1000
 L= 6750
F= 293.66 T1= 6615  T2= 135 p8000
F= 329.63 T1= 6615  T2= 135 n

  Портато вводится локальным указанием p8000, а указание n на следующей ноте устанавливает режим нон легато. Если вслед за вторым звуком идёт пауза, то указания n можно не делать, на паузе режим портато обрывается автоматически - переменной Np присваивается значение 0.

  Ощущение портато зависит от его длины и от размера его среза – этот размер регулируется величиной ТЕ, и при увеличении этого значения портато слабеет в своём окончании, создавая впечатление постепенно заглушаемого звука.
  Портато становится более заметным, когда время нарастания второго звука (время атаки) увеличивается. Для реального исполнения это соответствует мягкому нажатию клавиш, а в партитуре для достижения такого эффекта следует задать диссипативный фактор UDa= …  с целой частью 15 и более.
  По умолчанию UDa= 3.995, а целая часть этого числа определяет число семплов атаки. В начале звука фортепьяно присутствуют обертоны, имеющие в первой октаве полупериод порядка 15-ти семплов, поэтому при превышении именно этого числа мягкость атаки начинает ощущаться.
  Как вы видите, возможности для регулировки портато имеются богатые.
  Портато можно назначать не на одну ноту, а сразу на большое число нот, если использовать партитурное указание с заглавной буквой Р8000. Такое указание устанавливает в портато каждую звучащую ноту, а снимается этот режим заглавной Р без числа или с нулём за этой буквой.      

  По этому адресу https://disk.yandex.ru/d/7nkNacsQ8mAc4w вы можете прослушать запись, где первый пассаж сделан с портато, то есть, с педалью, а второй с легато, то есть, слитно, но без наложения звукового продолжения предыдущих нот.
 
  Интересно восприятие портато на слух. В конце записи в режиме портато сначала звучит только вторая нота (первый звук искусственно обрезан) и эта нота воспринимается как аккорд. А затем пара нот звучит полностью и тогда эти ноты звучат как последовательность одиночных нот, взятых на педали. Ощущение аккорда на второй ноте пропадает.
  Такова интересная особенность нашего слуха – мы чётко выделяем возникший звук, тогда как к предыдущему звуку наше ухо как бы привыкает и отделяет его от звука, вновь возникшего. Понятно, что такая замечательная особенность досталась нам от наших далёких предков, которые ходили по густому лесу, прислушиваясь к разным звукам.

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

  Итак, исполнение с наложением продолженного звука неплохо вписывается в концепцию программы «Трио» и в настоящее время реализовано  в ней. Программу «Трио» в современном её варианте можно скачать тут - https://disk.yandex.ru/d/4YB1q5Hj3NLAn4
  Режим портато предоставляет богатые возможности для создания выразительного фортепьянного звука.

__________
28.12.2023