KSP все о нем

PianoIst

Well-Known Member
19 Май 2010
4.145
4.092
113
30
Kirchberg, kreis Zwickau
soundcloud.com
Подумал я тут, что стали потихоньку и в россии библиотеки писать, так почему бы наконец не открыть тему на профильном форуме конкретно по программингу в Kontakt Script Processor?
Только начавших интересоваться, думаю, не только я, а, порой, ответы на очевидные вопросы приходится искать долго и муторно.
Давеча на форуме NI нашел 3 темы посвященных UI, но только в одной очень вскользь упомянулось, что не все крутилки (анимации) в формате png принимаются, в чем суть их различия так и не понял, возможно в компрессии, но фишка в том, что специально для этих целей сделали программку http://www.g200kg.com/en/software/knobman.html , в которую загружаются спрайты (можно сложить вместе в этой порграммке http://spritesheetpacker.codeplex.com/ )
а дальше все по мануалам: кидается в папку доп [имя из png].txt файл с текстом
Has Alpha Channel: yes
Number of Animations: 31
Horizontal Animation: no
Vertical Resizable: no
Horizontal Resizable: no
Fixed Top: 0
Fixed Bottom: 0
Fixed Left: 0
Fixed Right: 0

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

ну и на всякий случай мануалы
 

Вложения

Последнее редактирование:
почему бы наконец не открыть тему
Поддерживаю!

В копилку несколько ссылок:

Nils Liberg's KScript Editor - программка, упрощающая создание и редакцию скриптов.

KONTAKT: Sampling, Programming & Scripting - место, где сидят знатоки скриптов.

Раздел Kontakt Scripts сайта "Большого Боба", автора скрипта SIPS.
 
Последнее редактирование модератором:
спасибо, что поддержали

раз уж написал в соседнюю тему, думаю, можно и сюда закинуть пример легато на сэмплах.
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

смущает меня только костыль с wait (500), для проигрывания легатного сэмпла. В чем суть проблемы: если играешь быстрее - не успевает прописаться полный цикл, и проскакивают сэмплы релиза. Как бы сделать "по-грамотному"?
 
  • Like
Реакции: sensor1990
кстати, посмотрел код для ударных. Почему бы вместо команды play_note ($EVENT_NOTE,$EVENT_VELOCITY,0,-1) не писать ($EVENT_NOTE,$EVENT_VELOCITY,0,0), что будет проигрывать сэмпл до конца?
эфект тот же, что и при увеличении времени релиза в envelope, но можно попробоать послушать, как оно будет, если релизить сэмплы во время проигрывания следующей ноты через команду note_off. Не уверен, что стоит того, но вдруг?)))
и в принципе, для тарелок такой тип релиза правильнее, мне кажется
 
Также стоит незабывать коммерческий Scriptorium от Soniccouture (39$ всего), из покупных вроде бы это лучшее (если не единственное)) что есть по этой теме.

http://www.soniccouture.com/en/products/27-electronica/g16-scriptorium/

И их же блог по скриптам:
http://www.soniccouture.com/blog/category/script/

Там вроде и бесплатно можно забрать чегойто.
 
есть еще книжка: http://www.amazon.com/KSP-Scripting-1-Mike-Novy/dp/3839150515

оно, конечно, может быть полезно. Но вот мне учебники шаг-за-шагом никогда не помогали. Примеры лучше, жопа еще лучше, а месяц присутствия при работе мастера - бесценно
 
  • Like
Реакции: TechnoIsBack
это было тяжко, но у меня получилось!
скрипт для трелей а ля sample modeling или orange tree
ну, точнее, та его часть, которая отвечает за триггеринг легато обратно. Все остальное можно собрать из предыдущего легатного скрипта.
Код:
on init
declare $count :=0 {variable for attach two last notes to massive}
declare %count [2] := (0,0) {massive for note numbers of last two notes}
declare $hold := 0 {variable to off release script}
end on

on note
$hold = 1 {release script is off}
{making cycle for our two notes, 1 - this note, 0 - next note, 1 - next note and so}
if ($count+1 = 2) 
$count = 0
else
$count = $count+1
end if

%count[$count] := $EVENT_NOTE {note numbers to massive}

<играем легато. Очень важно не использовать команду note_off а использовать fade_out (<id>,<время>,-1)
$hold := 0 {release script is on}

end on

on release
{relese off}
if ($hold >0)
exit
else
if ($count -1 <0)
$count := 1
end if

{asking %KEY_DOWN [<previous note>] if it is held}
if (%KEY_DOWN[%count[$count-1]] = 1)
<играем легато и сустейн обратно>
else
<играем релиз>
end if
end if
 
Кстати, мужики, а к какому языку программирования ближе KSP? Сейчас в работе большая и многослойная библиотека ударных, большую часть сделал, добрался до хэта и уже второй день маленькими шажками допиливаю код. Уже надоело по каждой мелочи в гугл лезть, да и там не всегда ответы очевидны. Конечно же, многое проще подглядеть в других библиотеках, но когда узнаю элементарные вещи вроде boolean, становится не по себе от осознания собственного ламерства :) Основ бы. Прям самых самых.
 
Сначала думал про c#, но сейчас больше аналогий пришло с php. Смысл в том, что есть калбеки, есть три варианта условий (if\else, case, while), есть глобальные константы (в мануале для них отдельный список), есть пользовательские переменные, константы и массивы. Вы спрашивайте, может ответим))
из того, что не столь очевидно, но очень распостранено:
определение групп значений с помощью while, типа
Код:
on init
declare $i :=0
while ($i <15)
set_key_color ($i+60, $KEY_COLOR_RED)
$i=$i+1
end while
end on
хранения значений одного типа в массивах, типа
Код:
on init
declare %note_id [127]
declare $i :=0
end on

on note
%note_id [$EVENT_NOTE] := $EVENT_ID
$i:=0
while ($i <127)
if (%KEY_DOWN [$i] = 1 and $i # $EVENT_NOTE)
note_off (%note_id [$i])
end if
$i = $i+1
end while
есть еще любимая фишка всяких скриптов с кейсвитчами:
Код:
if (not in_range ($EVENT_NOTE,<номер нижней ноты>,<номер верхней ноты>))
exit
else
[код]
end if

но наверняка обо многом знаете, так что спрашивайте конкретно. Может чуть менее конкретно о вариантах реализации)
 
Последнее редактирование:
  • Like
Реакции: Stapleton и Kokarev Maxim
PianoIst, спасибо! Да, аналогия с php тоже возникала, те же on init и end on вызывают ассоциации с <?php и ?>. С этим уже намного проще разобраться и выделить/выбросить кусок кода отвечающий за определённые задачи. С кнопочками и менюшками тоже всё просто.

Не понимаю, что такое declare и то, зачем оно вообще надо.

Например, задаётся вначале declare $xyz := 0
Далее в коде встречается change_velo($EVENT_ID, $xyz)

Зачем такая городьба, и не сделать просто change_velo($EVENT_ID, 0) ?

Ну по самим declare после знака $ - я так понял это может быть любое слово для удобства восприятия кода? В общем, понять бы суть этого для начала :)

Кстати, хэт я в итоге доделал. Три дня копипаста методом тыка и анализа чужих скриптов :)
 

Вложения

  • my perfect hat.jpg
    my perfect hat.jpg
    40,6 KB · Просмотры: 15
declare - это обьявление переменной или чего еще
в том же C для этого ничего не надо писать. Написал новую переменную - она обьявлена. А здесь для наглядности дебага сделано так

на счет переменной $xyz не уверен до конца, как она работает, поскольку не видно оригинал. Но, скорее всего, там может быть значение, отличное от "0", которое зависит еще от чего-то
скопируйте код в любой удобный текстовый редактор, и поищите все места, где встречается $xyz
то, что находится после знака $ и до первого пробела является именем переменной. То-есть имя переменной $xyz_id таким и будет, а в $xyz id имя переменной будет $xyz и такое написание будет синтаксической ошибкой.
теперь о знаках:
declare $<имя> (опционально ":= <значение>")- переменная, ей вы можете присваивать значение любым удобным вам способом в любом месте, просто вставив строчку "$<имя> := <прямое значение, значение другой переменной или булево выражение>"
declare constant $<имя> := <значение>- константа, она никак не изменяется, насколько я понял
declare %<имя>[<количество ячеек>] (опционально ":= (<значения для каждой ячейки по порядку через запятую>)" здесь можно использовать булевы выражения для удобства) - это массив. задаете кол-во ячеек и их значения. работает как куча переменных в одной строчке.
можно сделать так:
Код:
declare %presets[10*8] := (...
{1} 8,8,8,0, 0,0,0,0,...
{2} 8,8,8,8, 0,0,0,0,...
{3} 8,8,8,8, 8,8,8,8,...
{4} 0,0,5,3, 2,0,0,0,...
{5} 0,0,4,4, 3,2,0,0,...
{6} 0,0,8,7, 4,0,0,0,...
{7} 0,0,4,5, 4,4,2,2,...
{8} 0,0,5,4, 0,3,0,0,...
{9} 0,0,4,6, 7,5,3,0,...
{10} 0,0,5,6, 4,4,3,2)
P.S. Ах, да. Чтобы добавить значение в массив стандартным способом пишем: %<имя массива>[номер ячейки] := <значение или булево выражение>

фигурные скобки {<любой текст>} - комментарии. Все, что находится внутри таких скобок, не взирая на пробелы и переводы строк - не учитывается компилятором
declare @<имя> := ("<текст>" либо <значение>) - текстовая (она же string) переменная. хранит текст на латинице. Так же хранит и обычные значения
declare !<имя> [<кол-во ячеек>] то же самое для массива
есть еще такие буковки, как "str" (они же string) - означает, что здесь будет использоваться текст. Пример: set_control_par_str ($id,$CONTROL_PAR_PICTURE,"<название png>")
declare polyphonic !@#$ - полифоничные переменные, жрут память и для каждого нового эвента закладывают в себя новое значение. то-есть:
взяли до первой октавы (NN 60) поместили туда значение. в рамках эвента значение этой переменной будет таким, какое мы поместили, но если мы возьмем следующую ноту, скажем до# (NN61), и вытащим оттуда значение перед тем, как поместить, оно будет равно "0". попробуйте вставить в пустой инструмент этот код - поймете, о чем речь
Код:
on init
declare polyphonic $note
declare $i :=0
declare ui_label $note_text_prev (1,1)
declare ui_label $note_text_post (1,1)
end on

on note
set_text ($note_text_prev, $note)
$note :=$i
set_text ($note_text_post, $note)
$i:= $i+1
end on


если мы хотим присвоить значение событию, которое должно зависить от события, произошедшего в другом колбеке, мы используем переменые
важно помнить, что код исполняется построчно. То-есть, яркий пример как раз - мой скрипт легато. Последовательность событий:

поняли, что играем легато,
кинули в переменную значение 1
выключили предыдущую ноту, она начала калбэк релиза для своего эвента
в релизе при значении 1 ничего не происходит
взяли сустейн
кинули в переменную значение 0
отпустили сустейн, заустился кадбек релиза для нашего эвента
в релизе при значение 0 играется релиз-семпл

Код:
on note
$hold :=1
note_off (<ID предыдущей ноты>)
<код>
play_note ($EVENT_NOTE,$EVENT_VELOCITY,0,-1) {сустейн}
<код>
$hold :=0
end on

on release
if ($hold = 0)
<код>
play_note ($EVENT_NOTE,$EVENT_VELOCITY,0,0)
end if
end on

по-моему, ничего не забыл :up:
 
Последнее редактирование:
  • Like
Реакции: arkaine и Kokarev Maxim
как я вижу алгоритм для хета:
список групп и сэмплов
группы основные (по количеству RR) в каждой группе на определенных нотах висят удары по стандартной схеме: открытый, полуоткрытый, закрытый, по краю, по цоколю, педаль. сколько записано, в общем
группы релиз (по кол-ву RR) на нотах, аналогичных в нормальных группах закрытому хету висят сэмплы закрытия

в on note пишем что-то вроде
Код:
on note
disallow_group ($ALL_GROUPS)
if (in_range ($EVENT_NOTE, <нижняя нота открытого хэта>, <верхняя нота открытого хэта>))
allow_group (<основные группы>) или ваш алгоритм RR для основных групп
$id := play_note ($EVENT_NOTE, $EVENT_VELOCITY,0,0)
$pref_open := 1
else
if ($prev_open = 1)
allow_group (<группы со звуком закрытия>) или любой ваш алгоритм для этого дела
note_off ($id)
play_note ($EVENT_NOTE, $EVENT_VELOCITY,0,0)
wait (<время проигрывания сэмпла закрытия>)
end if
disallow_group (<я бы написал $ALL_GROUPS, но можно выборочно>)
allow_group (<основные группы>)
play_note ($EVENT_NOTE,$EVENT_VELOCITY,0,0)
$pref_open :=0
end if
end on
о, вроде даже в колбеке релиза ничего писать не надо... Ну, это так, очень схематично

и вообще я преклоняюсь перед вашей целью, ибо даже представить не могу, сколько сэмплов находится в работе....
 
Последнее редактирование:
  • Like
Реакции: Kokarev Maxim
pustoy, для себя. Продавать или раздавать бесплатно не получится - многие сэмплы покупались и у меня нет прав перепродажи или, тем более, бесплатного распространения. С этим вообще жопа. Я как то даже писал в Alesis, они не позволяют использовать в коммерческих целях и распространять даже сэмплы старых драм модулей. Хотя, энтузиазм поддерживают и для частного использования разрешают брать сэмплы.

PianoIst, спасибо за большое количество информации! Мои мысли по поводу declare подтвердились, это уже значительно упростит жизнь :)

В моём скрипте код закрытия хэта состоит из перечисления нот закрытого хэта вроде $EVENT_NOTE=44 и команды fade_out следом. Часть кода самого инструмента написана стариной Corvus, огромный ему респект за это и безвозмездную помощь по мелким вопросам. Но кучу мелочей вроде ручки панорамы, деталей интерфейса, кода закрытия хэта и дублирования нот для gm midi совместимости, пришлось допиливать (или подсматривать в других инструментах) самостоятельно.
Кстати, через команду play_note не получалось реализовать закрытие хэта - из-за кнопок включения микрофонов, которые реализованы через disallow_group, дополнительный код с этой функцией не получалось корректно вставить, поэтому пришлось искать другое решение.

и вообще я преклоняюсь перед вашей целью, ибо даже представить не могу, сколько сэмплов находится в работе....
Сэмплов там ~1500 :) Но благодаря быстрому групповому переименованию, сам инструмент был собран за один вечер. Так что, не всё так страшно :) Если интересны характеристики - 6 слоёв RR, 12 динамических, 7 артикуляций (3 вариации закрытого, 4 открытого). Сэмплы микрофонов и пары оверхэда звучат строго в нужном порядке и в нужное время, всё ровно так, как в реальной записи барабанов.
 
а что такое быстрое групповое переименование?
вообще актуален вопрос оптимизации нарезки сэмплов. Потому как я уже третий день с грехом пополам режу сэмплы для дудочки диапазоном в октаву, загоняю каждый на свой трек, переименовываю его и потом делаю batch треков по группам сэмплов одной продолжительности) замаялся:yawn:
правда, в моем случае все осложняется еще тем, что пока ищу наиболее правильную методику записи, приходится многое перезаписывать...
 
PianoIst, суть группового переименования в том, что в Контакте есть "auto mapper", который читает значения в названии файла. Я мелодические инструменты не делал, а для ударных у меня вот так:
Есть исходные файлы в формате snare_high_1, где названы, соответственно, инструмент, сила удара и номер сэмпла в round robin. С помощью функции группового переименования в Total Commander я ищу все snare и заменяю на snare_D#2, все high и заменяю их на 127_90. В итоге за пару действий получаю кучу файлов вида snare_D#2_127_90_1.
Затем, просто закидываю все файлы в окно mapping editor и правой кнопкой на сэмплах выбираю в меню auto map setup, где задаю, как читать мои названия файлов. Нажимаю apply и вуаля - все сэмплы встают на ноту D#2, занимают область velocity с 90 до 127 и попадают в группу 1.

Кстати, выше я давал ссылку, где рассказываю что-то подобное: http://forum.rmmedia.ru/showthread.php?t=37084&page=283&p=1601083&viewfull=1#post1601083

Но это всё относится к Контакту.

А вот сами сэмплы, увы, приходится редактировать долго и муторно. Я закидываю большую пачку того же snare в daw и выравниваю по фазе, вручную подрезая и двигая. После экспорта уже идёт этап переименования. С мелодическими инструментами возился бы намного дольше, задавая ноты каждому сэмплу.
 
  • Like
Реакции: PianoIst
ruslan.st, я выше про хэт писал, он как раз на основе сэмплов drummica :) Ещё рабочий думаю оттуда выдернуть, да всё руки не доходят. Потрясающе сэмплированы инструменты. Для бесплатной библиотеки это нереально круто.

Кстати, сразу маленький лайфхак: если скрипт делать в предыдущей версии Контакта, есть большая вероятность, что его сможет открыть большее количество пользователей. Это особенно актуально, если делается для продажи или общей публикации. Свои на всякий случай все делаю в 4-м. Ваш скрипт у меня не открылся ни в 4-м ни в 5-м контакте, требует ещё более новую версию...
 
Да, про версию я как-то не подумал. Делаю просто так ради интереса, чтоб со скриптингом ознакомиться и взял последнюю версию контакта 5.3.0.
Но сохранился ещё патч и под 5.2.1 (во вложении).
А названия микрофонов я сразу в скриншоте узнал :)
 

Вложения

Последнее редактирование:
  • Like
Реакции: Kokarev Maxim
ruslan.st, о, это прикольный минимализм. В оригинальном интерфейсе drummica действительно, ногу сломишь :) Сейчас разве что надписей к ручкам не хватает. Но переключатели микрофонов, которые доступны сразу, это очень удобно.
 
  • Like
Реакции: ruslan.st
есть еще любимая фишка всяких скриптов с кейсвитчами:
Код:
if (not in_range ($EVENT_NOTE,<номер нижней ноты>,<номер верхней ноты>))
exit
else
[код]
end if

О, а вот этот скрипт сегодня пригодился :)

Искал простую реализацию глушения райда - после серии ударов, релиз может быть неприлично долгим, сэмплы секунд по 8. В работе может сильно мешать. Было решено назначить нотку в запредельной части клавиатуры, которая бы управляла фейдаутом. Получилось вот так (это внутри on note):

Код:
if (not in_range ($EVENT_NOTE,95,95))
exit
else
fade_out($ALL_EVENTS - 1, 700000, 1)
end if
 
А что даёт отнятие единицы от $ALL_EVENTS в fade_out($ALL_EVENTS - 1, 700000, 1) ?
В мануале не нашёл. Адресует все события, кроме последнего?
 
Адресует все события, кроме последнего?

Вроде того. На самом деле это последствия моего индусского кодинга :) У меня эта же строчка используется в глушении хэта и я просто бездумно скопировал в скрипт тарелки. Конечно же, для глушения тарелки подойдёт и без "- 1". А вот хэт замолкает реалистичнее с "$ALL_EVENTS - 1", у него звучит последняя нота закрытия. Я записал два варианта хэта с "-1" и без, думаю, с примером сразу понятно будет, о чём я.
 

Вложения

  • Like
Реакции: ruslan.st
Интересно :) Тут можно пробовать и без кейсвитча обойтись, а сделать автоматически. Засекать время, через которое берётся новая нота, и если оно слишком короткое, глушить предыдущую ноту.
 
Тут можно пробовать и без кейсвитча обойтись, а сделать автоматически. Засекать время, через которое берётся новая нота, и если оно слишком короткое, глушить предыдущую ноту.

Ну, пока в этом потребности не возникало, беспокоят только длинные релизы после исполнения партии. А одну лишнюю нотку глушения поставить в нужном месте партии - это очень просто :)

Сейчас поймал себя на мысли, что готов что угодно сюда постить, лишь бы в теме хоть какое то движение происходило. Не верится, что на весь форум только 3 человека, увлечённых скриптами :)
 
  • Like
Реакции: ruslan.st
Сейчас поймал себя на мысли, что готов что угодно сюда постить, лишь бы в теме хоть какое то движение происходило. Не верится, что на весь форум только 3 человека, увлечённых скриптами :)
:sarcastic:

Вообще-то подумал такое можно и без скриптинга сделать, раскидать семплы на группы по количеству round-robin, и присвоить им voice-group с некоторым fade-time :)
 
Вообще-то подумал такое можно и без скриптинга сделать, раскидать семплы на группы по количеству round-robin, и присвоить им voice-group с некоторым fade-time :)

Ну да, всегда есть несколько вариантов :) Можно ещё вставить на нужную ноту сэмпл с тишиной и назначить ему свою voice группу с полифонией 1 голос и нужным release. Но они все не подходят, инструмент уже собран со своими группами, уже назначен cycle round-robin и в скриптах прописаны огибающие adsr для обеих групп. То есть, если что-то менять в группах, можно получить кучу проблем на свою голову, а переделывать всю работу очень не хочется :) Поэтому именно небольшое дополнение в скрипт больше всего здесь к месту пришлось :)
 
Abbey Road & Studio Drummers

Разбираясь в скриптинге подглядываю на скрипты барабанов Native Instruments Abbey Road и Studio Drummer. И наткнулся на серию багов в них связанных с загрузкой/выгрузкой каналов и инструментов (кнопки Unload/Load Channel/Instrument). Не знаю, есть ли смысл отдельную тему создавать (и вообще писать) но раз касается скриптинга, опишу тут.

В микшере:

Последний том (самый низкий) и последняя тарелка (China, Sizzle, Pang) не выгружаются и не загружаются в каналы Overhead и Room во всех патчах Abbey Road и Studio Drummer.
То же происходит с последним перкуссионным инструментом в некоторых патчах (например Early 60s, весь Studio Drummer)

В некоторых случаях в overhead/room остаются висеть оба рабочих барабана, занимая лишнюю память. Подвержены большинство патчей Drummer'ов.

В патче 60s Late вообще всё перепутано, выгружая один канал можно выгрузить частично соседний, например, выгружая Room из соседнего Mono Overhead исчезает тарелка, sticks, claps, тамбурин…

В Studio Drummer Stadium Kit каналы томов и перкуссии выгружают не себя, а случайные другие группы, например канал Direct Tom 1 выбрасывает нижний том из Overhead, Direct Tom2 - China из Room и т.п.

Во вкладке барабанов:

В патчах с 3-я рабочими барабанами (80s Chrome Kit, Modern Drummer) первый рабочий барабан не выгружается

Если просто выбрать 2-ой или 3-ий рабочий барабан в патче 80s Chrome Kit из Bleed канала исчезает нижний том, из оверхедов пропадают октобаны, Clap пропадает из Room и т.п.

Ну и по мелочам иногда не работают функции на некоторых direct каналах перкуссионных инструментов, например тамбурин, шейкер в 70s Open Kit

Если кратко, проявление багов зависит от последовательности, в которой происходит загрузка/удаление каналов/инструментов. В лучшем случае в памяти остаются висеть лишние семплы. Это можно проверить, если выгрузить все каналы подряд в микшере – счётчик памяти не обнуляется. В худшем случае пропадает звук некоторых инструментов из каналов, в основном из Overhead и Room.


Попробовал исправить сам, как получается. Выкладываю скрипты для каждого патча, вдруг кому пригодятся. Текст из файла можно скопировать поверх оригинального скрипта в соответствующем слоте. Для этого в выпадающем меню над окном скрипта надо указать Apply From..Editor/Patch. Потом надо поочерёдно выгрузить и загрузить все каналы в микшере и то же самое проделать с инструментами.
 

Вложения

  • Like
Реакции: PianoIst

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