Portamento в NI Kontakt.

  • Автор темы Автор темы variator
  • Дата начала Дата начала

variator

Active Member
9 Сен 2008
449
52
28
Желаю здравствовать!
Реально ли реализовать такую штуку?
Напели небольшие отрывки на "А-а-а". Раскидали по клавишам Ni kontakt. Пробуем играть вокализ. Но слышим неестественность при больших интервальных скачках. Дело в том, что семплер делает переход механически точно, а живой человек немного "с подъездом".
http://prostopleer.com/tracks/5216283s3Vd
Вопрос в том, как сделать такое портаменто между нашими семплами?
Режим Mono mode - Legato не подходит. При нем, если мы сыграем две ноты, то вторая это будет семпл первой, потянутой на нужную высоту. При этом слышится формантная неестественность.
http://prostopleer.com/tracks/5216317Jskb
А вот скрипт Factory-Perfomance-Unisono_Portamento вроде бы то, что нужно, но...
http://prostopleer.com/tracks/5216305OtBj
Как-то не так он тянет.
 
Последнее редактирование:
Переписал шапку, потому что если честно, в первоначальном варианте сам ничего не понял.
 
С помощью SIPS можно попробовать - в Legato скрипте параметры BTime, Octave X и MinBend "подтягивание" ("bend") регулируют.
 
Последнее редактирование:
Вопрос актуален. Сам к сожалению не разберусь со скриптами.
 
если есть возможность записать сэмплы реальных легатных переходов, можно сделать примерно так, как во вложении: http://yadi.sk/d/VDp5-WW7FMGum

разбор кода:

on init
declare $firstnote := (0) - переменная первой ноты из двух, участвующих в легато
declare $lastnote - переменная второй ноты из двух, участвующих в легато
declare $interval - переменная расстояния между двумя нотами в полутонах
declare $firstnote_id - переменная для сохранения ID сыгранной ноты (нужна для корректного релиза при легато)
declare %posintervalgrp [2] := (0,2) - массив с номерами групп для различных скачков вверх (каждая ячейка - полутон) в моем случае, это первая группа для полутонового скачка и третья группа для скачка на тон, но в связи с нумерацией групп 0,1,2, их номера - 0 (первая) и 2 (третья)
declare %negintervalgrp [2] := (4,5) - такой же массив для скачков вниз

end on

on note
ignore_event ($EVENT_ID) - игнорируем воспроизведение чего-либо, дабы не вносить путаницы
disallow_group ($ALL_GROUPS) - отключаем все группы

$lastnote := $EVENT_NOTE - присваиваем этой ноте положение последней ноты
if ($firstnote # 0) - если это не первое нажатие, или переменная слева не обнулялась в калбеке release,
$interval := $lastnote - $firstnote - вычисляем интервал, путем отнимания значения переменной, которая присваевается ноте в конце цикла, от значения, только что присвоенного ей при нажатии
end if

if ($interval >0) - если интервал положительный
note_off ($firstnote_id) - выключаем ноту, сыгранную предыдущей, предполагая, что вы ее не отпустили
allow_group (%posintervalgrp [$interval-1]) -подключаем группу, соответствующую нашему интервала, из массива с позитивными интервалами (не забываем от реального интервала отнять значение 1, теряющееся при присвоении номера ячейки в массиве при нумерации от ноля)
play_note ($EVENT_NOTE,$EVENT_VELOCITY,0,0) -инграем нашу ноту группой с легатными сэмплами (не забываем славить сэмплы на ту ноту, к которой идет скачек, а не от которой)
disallow_group ($ALL_GROUPS) - выколючаем группы
wait (500) - ждем примерное время проигрывания нашего скачка (и это костыль, надо что-то с ним сделать в идеале)
allow_group (1) - включаем группу sustain (в моем случае вторая (1))
play_note ($EVENT_NOTE,$EVENT_VELOCITY,0,-1)- играем сустейн
end if

if ($interval <0) - аналогичный цикл, только для скачков вниз
note_off ($firstnote_id)
allow_group (%negintervalgrp [-$interval -1]) - не забываем, что интервалполучился отрицательный, для выбора корректной группы значение надо инвертировать
play_note ($EVENT_NOTE,$EVENT_VELOCITY,0,-1)
disallow_group ($ALL_GROUPS)
wait (1000)
allow_group (1)
play_note ($EVENT_NOTE,$EVENT_VELOCITY,0,-1)
end if

if ($interval = 0) - если интервал не присваивался, то-есть, нота берется в первый раз или после полноценного релиза, играем сустейн
allow_group (1)
play_note ($EVENT_NOTE,$EVENT_VELOCITY,0,-1)
end if

(это конец цикла, здесь нужно обнулить нужные переменные, и присвоить значения другим)

$interval :=0
$firstnote := $EVENT_NOTE - теперь мы можем присвоить значение этой переменной, чтобы следующий цикл при легато заработал
$firstnote_id := $EVENT_ID - присваеваем значение для корректного релиза
end on

on release
$firstnote :=0 - обнуляем значение. Очень важно понимать, зачем: при релизе во время цикла легато значение обнуляется уже после присвоения значения интервалу, но при релизе ноты без легато, мы даем понять, что легато не тригируется, и следующая нота будет взята сустейном, т.к. интервал будет равен 0
disallow_group ($ALL_GROUPS) - выключаем группы
if ($interval = 0) - если перед релизом было присвоено значение интервалу - нота просто заглушится, если не было - прозвучит сэмпл релиза
allow_group (3) - группа с сэмплами релиза
play_note ($EVENT_NOTE,$EVENT_VELOCITY,0,0) - нота релиза
end if
end on
 
Последнее редактирование:
  • Like
Реакции: stl и variator
@PianoIst, скажите, а как этим пользоваться в Контакте? Есть ли какая-то инструкция?
Вот , допустим, у меня есть 2 секунды голоса, я загружу их в контакт, а как привязать скрипт к этому сэмплу?
 
@stl, Я обнаружил, что алгоритм не работает. Поскольку необходимости его чинить не было, он отался нерабочим.
Еще раз повторюсь, что это только для сэмплового (натурального легато). Ему в принципе, все равно, какой сэмпл внутри, можно на транзиции хоть рабочий втыкать. Смысл в том, что при легатном переходе с ноты на ноту играется сэмпл перехода + сэмпл сустейна. Если вас устраивает именно этот способ транзиции - пишите, попробуем починять))))
Если нужно утянуть тот же самый сэмпл на нужную ноту и взять другой - такое у меня уже есть в готовом решении, надо просто аккуратненько извлечь. Опять же, для портаменто тюном есть универсальный и очень удобный в настройке алгоритм, кажется SIPS. погуглите, если оно.
 
Да, мне подходит ваша версия, я просто не понимаю, как ей пользоваться. Можете объяснить?
 

Сейчас просматривают