KSP все о нем

Тема в разделе "Native Instruments", создана пользователем PianoIst, 29 дек 2013.

  1. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    Подумал я тут, что стали потихоньку и в россии библиотеки писать, так почему бы наконец не открыть тему на профильном форуме конкретно по программингу в 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аметры и вуаля), да, при этом, по уроку, с примером из урока, на который все ссылались сабж не работал... и три часа убито
    На самом деле несколько фишек, не столь очевидных из мануала я нашел, но всем этим люди давно пользются, так зачем изобретать велосипед?
    В связи с этим предлагаю потихоньку в форме вопрос-ответ заполнять пробелы) Надеюсь, что многоуважаемые мастера виртуальных инструментов присоединятся.

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

    Вложения:

    Последнее редактирование: 4 июн 2016
    sensor1990, Hedgehog, Stapleton и ещё 1-му нравится это.
  2. deleted_neighbourhood

    deleted_neighbourhood келасоф

    Регистрация:
    27 авг 2013
    Сообщения:
    395
    Симпатии:
    627
    Адрес:
    Неевклидово
    Поддерживаю!

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

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

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

    Раздел Kontakt Scripts сайта "Большого Боба", автора скрипта SIPS.
     
    Последнее редактирование модератором: 26 дек 2015
    Hedgehog, PianoIst и Stapleton нравится это.
  3. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Последнее редактирование модератором: 26 дек 2015
    PianoIst нравится это.
  4. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    спасибо, что поддержали

    раз уж написал в соседнюю тему, думаю, можно и сюда закинуть пример легато на сэмплах.
    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), для проигрывания легатного сэмпла. В чем суть проблемы: если играешь быстрее - не успевает прописаться полный цикл, и проскакивают сэмплы релиза. Как бы сделать "по-грамотному"?
     
    sensor1990 нравится это.
  5. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    кстати, посмотрел код для ударных. Почему бы вместо команды play_note ($EVENT_NOTE,$EVENT_VELOCITY,0,-1) не писать ($EVENT_NOTE,$EVENT_VELOCITY,0,0), что будет проигрывать сэмпл до конца?
    эфект тот же, что и при увеличении времени релиза в envelope, но можно попробоать послушать, как оно будет, если релизить сэмплы во время проигрывания следующей ноты через команду note_off. Не уверен, что стоит того, но вдруг?)))
    и в принципе, для тарелок такой тип релиза правильнее, мне кажется
     
  6. Wham_48

    Wham_48 Sneiro Member

    Регистрация:
    15 дек 2006
    Сообщения:
    3.955
    Симпатии:
    2.321
    Пол:
    Мужской
    Адрес:
    Валдай-Минск
    Также стоит незабывать коммерческий Scriptorium от Soniccouture (39$ всего), из покупных вроде бы это лучшее (если не единственное)) что есть по этой теме.

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

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

    Там вроде и бесплатно можно забрать чегойто.
     
  7. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    есть еще книжка: http://www.amazon.com/KSP-Scripting-1-Mike-Novy/dp/3839150515

    оно, конечно, может быть полезно. Но вот мне учебники шаг-за-шагом никогда не помогали. Примеры лучше, жопа еще лучше, а месяц присутствия при работе мастера - бесценно
     
  8. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    это было тяжко, но у меня получилось!
    скрипт для трелей а ля 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
    
     
  9. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Кстати, мужики, а к какому языку программирования ближе KSP? Сейчас в работе большая и многослойная библиотека ударных, большую часть сделал, добрался до хэта и уже второй день маленькими шажками допиливаю код. Уже надоело по каждой мелочи в гугл лезть, да и там не всегда ответы очевидны. Конечно же, многое проще подглядеть в других библиотеках, но когда узнаю элементарные вещи вроде boolean, становится не по себе от осознания собственного ламерства :) Основ бы. Прям самых самых.
     
  10. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    Сначала думал про 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

    но наверняка обо многом знаете, так что спрашивайте конкретно. Может чуть менее конкретно о вариантах реализации)
     
    Последнее редактирование: 8 янв 2014
    Stapleton и Kokarev Maxim нравится это.
  11. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    PianoIst, спасибо! Да, аналогия с php тоже возникала, те же on init и end on вызывают ассоциации с <?php и ?>. С этим уже намного проще разобраться и выделить/выбросить кусок кода отвечающий за определённые задачи. С кнопочками и менюшками тоже всё просто.

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

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

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

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

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

    Вложения:

  12. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    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:
     
    Последнее редактирование: 8 янв 2014
    Kokarev Maxim нравится это.
  13. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    как я вижу алгоритм для хета:
    список групп и сэмплов
    группы основные (по количеству 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
    о, вроде даже в колбеке релиза ничего писать не надо... Ну, это так, очень схематично

    и вообще я преклоняюсь перед вашей целью, ибо даже представить не могу, сколько сэмплов находится в работе....
     
    Последнее редактирование: 8 янв 2014
    Kokarev Maxim нравится это.
  14. pustoy

    pustoy Active Member

    Регистрация:
    20 янв 2011
    Сообщения:
    472
    Симпатии:
    119
    Адрес:
    Сейчас СПБ
    cool, для себя или продавать будешь?)
     
  15. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    pustoy, для себя. Продавать или раздавать бесплатно не получится - многие сэмплы покупались и у меня нет прав перепродажи или, тем более, бесплатного распространения. С этим вообще жопа. Я как то даже писал в Alesis, они не позволяют использовать в коммерческих целях и распространять даже сэмплы старых драм модулей. Хотя, энтузиазм поддерживают и для частного использования разрешают брать сэмплы.

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

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

    Сэмплов там ~1500 :) Но благодаря быстрому групповому переименованию, сам инструмент был собран за один вечер. Так что, не всё так страшно :) Если интересны характеристики - 6 слоёв RR, 12 динамических, 7 артикуляций (3 вариации закрытого, 4 открытого). Сэмплы микрофонов и пары оверхэда звучат строго в нужном порядке и в нужное время, всё ровно так, как в реальной записи барабанов.
     
  16. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    а что такое быстрое групповое переименование?
    вообще актуален вопрос оптимизации нарезки сэмплов. Потому как я уже третий день с грехом пополам режу сэмплы для дудочки диапазоном в октаву, загоняю каждый на свой трек, переименовываю его и потом делаю batch треков по группам сэмплов одной продолжительности) замаялся:yawn:
    правда, в моем случае все осложняется еще тем, что пока ищу наиболее правильную методику записи, приходится многое перезаписывать...
     
  17. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    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 и выравниваю по фазе, вручную подрезая и двигая. После экспорта уже идёт этап переименования. С мелодическими инструментами возился бы намного дольше, задавая ноты каждому сэмплу.
     
    PianoIst нравится это.
  18. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    cool, спасибо! буду знать :i_am_so_happy:
     
  19. ruslan.st

    ruslan.st New Member

    Регистрация:
    13 дек 2012
    Сообщения:
    13
    Симпатии:
    5
    Тоже вожусь с барабанами - переделываю скрипт Drummica. Сделал управление барабанами и микрофонами, теперь разбираюсь как midi проигрывать.
    Может кому интересно, пока-что патч выглядит вот так :) :
    https://drive.google.com/file/d/0B1RPGmWyo9ubYkFtR09DT28xWWc/edit?usp=sharing
     
  20. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    ruslan.st, я выше про хэт писал, он как раз на основе сэмплов drummica :) Ещё рабочий думаю оттуда выдернуть, да всё руки не доходят. Потрясающе сэмплированы инструменты. Для бесплатной библиотеки это нереально круто.

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

    ruslan.st New Member

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

    Вложения:

    Последнее редактирование: 13 янв 2014
    Kokarev Maxim нравится это.
  22. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    ruslan.st, о, это прикольный минимализм. В оригинальном интерфейсе drummica действительно, ногу сломишь :) Сейчас разве что надписей к ручкам не хватает. Но переключатели микрофонов, которые доступны сразу, это очень удобно.
     
    ruslan.st нравится это.
  23. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    О, а вот этот скрипт сегодня пригодился :)

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

    Код:
    if (not in_range ($EVENT_NOTE,95,95))
    exit
    else
    fade_out($ALL_EVENTS - 1, 700000, 1)
    end if
     
  24. ruslan.st

    ruslan.st New Member

    Регистрация:
    13 дек 2012
    Сообщения:
    13
    Симпатии:
    5
    А что даёт отнятие единицы от $ALL_EVENTS в fade_out($ALL_EVENTS - 1, 700000, 1) ?
    В мануале не нашёл. Адресует все события, кроме последнего?
     
  25. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Вроде того. На самом деле это последствия моего индусского кодинга :) У меня эта же строчка используется в глушении хэта и я просто бездумно скопировал в скрипт тарелки. Конечно же, для глушения тарелки подойдёт и без "- 1". А вот хэт замолкает реалистичнее с "$ALL_EVENTS - 1", у него звучит последняя нота закрытия. Я записал два варианта хэта с "-1" и без, думаю, с примером сразу понятно будет, о чём я.
     

    Вложения:

    ruslan.st нравится это.
  26. ruslan.st

    ruslan.st New Member

    Регистрация:
    13 дек 2012
    Сообщения:
    13
    Симпатии:
    5
    Интересно :) Тут можно пробовать и без кейсвитча обойтись, а сделать автоматически. Засекать время, через которое берётся новая нота, и если оно слишком короткое, глушить предыдущую ноту.
     
  27. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Ну, пока в этом потребности не возникало, беспокоят только длинные релизы после исполнения партии. А одну лишнюю нотку глушения поставить в нужном месте партии - это очень просто :)

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

    ruslan.st New Member

    Регистрация:
    13 дек 2012
    Сообщения:
    13
    Симпатии:
    5
    :sarcastic:

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

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Ну да, всегда есть несколько вариантов :) Можно ещё вставить на нужную ноту сэмпл с тишиной и назначить ему свою voice группу с полифонией 1 голос и нужным release. Но они все не подходят, инструмент уже собран со своими группами, уже назначен cycle round-robin и в скриптах прописаны огибающие adsr для обеих групп. То есть, если что-то менять в группах, можно получить кучу проблем на свою голову, а переделывать всю работу очень не хочется :) Поэтому именно небольшое дополнение в скрипт больше всего здесь к месту пришлось :)
     
  30. ruslan.st

    ruslan.st New Member

    Регистрация:
    13 дек 2012
    Сообщения:
    13
    Симпатии:
    5
    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. Потом надо поочерёдно выгрузить и загрузить все каналы в микшере и то же самое проделать с инструментами.
     

    Вложения:

    PianoIst нравится это.
  31. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    как-то геморно, мне кажется. если я правильно понял проблему - лучше ввести какой-нить массив, в который складировались бы по порядку id эвентов с того же хэта, при привышении кол-ва активных сэмплов вырубать их)
    а есть же еще регулирование полифонии группы с режимом kill oldest
     
    ruslan.st нравится это.
  32. ruslan.st

    ruslan.st New Member

    Регистрация:
    13 дек 2012
    Сообщения:
    13
    Симпатии:
    5
    Да, тут можно пробовать и совсем без массива выкрутиться всего с одной переменной для последнего события. Изначально я думал, что дополнительная переменная вермени может пригодиться для более точного подсчёта fade-time. Теоретически без примера сложно сказать как лучше.
    cool, а можно патч этого райда выложить? вдруг что нибудить получится наэксперементировать :moil:
     
  33. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Спасибо за интерес к инструменту, но нет смысла в этом. Там уже всё готово и работает как нужно. Любое автоматическое событие не будет работать корректно - автомат же не знает в какой момент мне нужно заглушить тарелку. Это событие привязано к характеру композиции, аранжировке и темпу. И только я знаю в какой момент мне поставить нотку глушения. Автомат не справится :)
     
    ruslan.st нравится это.
  34. Corvus13

    Corvus13 Member

    Регистрация:
    6 янв 2013
    Сообщения:
    35
    Симпатии:
    17
    Пол:
    Мужской
    Еквалайзер (Solid G-EQ), компрессор (Solid Comp)...
    У Н.Либерга в редакторе их нет, поэтому решил поделиться...когда писал скрипты, думал использовать его на библе ударных, но надобность в этом отпала...так как всё равно пользуюсь стороними эффетами...но кому-нибудь думаю пригодится...
    В $slot := [после равно прописывайте номер ячейки(-1), где вы открыли эквалайзер или компрессор в меню Insert Effects]. По дефолту я поставил в первую ячейку эквалайзер, во вторую - компрессор.
    в insert effects обработка будет действовать на все группы, если вам надо установить на отдельную группу(или группы), то посылайте группу(или группы) на BUS-шину(а их,благо, 16 штук), и после $slot_eq прописывайте: $NI_BUS_OFFSET + 15(в данном случае это 16-я шина) .
    пример(14 строка из эквалайзера):
    $SEQgainLF := _get_engine_par($ENGINE_PAR_SEQ_LF_GAIN,-1,$slot_eq,$NI_BUS_OFFSET + 15)
    и далее по аналогии...15 шина будет $NI_BUS_OFFSET + 14 и т.п. =)
    Можно конечно ещё в Group Insert Fx модуль запихнуть, но там нужно будет на каждую группу открывать...дольше и кропотливее...для избежания этого утомительного процесса, думаю, в 5ой версии и реализовали bus-шины...))))))
    скрипты ннннада!? :download:
     

    Вложения:

    Последнее редактирование: 1 фев 2014
    PianoIst нравится это.
  35. Corvus13

    Corvus13 Member

    Регистрация:
    6 янв 2013
    Сообщения:
    35
    Симпатии:
    17
    Пол:
    Мужской
    скрипты нннада!?)))
    Cкрипт, заменяющий фоновую картинку при нажатии клавиши...
    В архиве пример с бас-бочкой(nki,скрипт в текстовом виде,пара картинок,сэмпл)...чтобы всё работало, картинки background1 и background2 переместите в корневую папку контакта pictures...у меня по умолчанию она имеет след. адрес:
    C://Program Files/Common Files/Native Instruments/Kontakt 5/pictures

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

    Вложения:

    • arch_1.rar
      Размер файла:
      259,1 КБ
      Просмотров:
      3
    Последнее редактирование: 10 фев 2014
  36. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    Можно дополнить ваш скрипт примечанием о возможности использования picture_state?
    Процесс создания кода для спрайта можно найти по поиску словосочетания выше в правом мануале шапки темы. Сам спрайт создается в программке knobman, советую снабжать работающим txt из любой коммерческой библиотеки, но выставив свои параметры, т.к. могут быть проблемы с кодировкой вашего собственного.

    В данном случае, думаю как раз наверное, употребительнее использование спрайтов)
    А wallpaper, или ui_label размером с окно инструмента более близки для окна настроек.

    В приложении пример такой же анимации, но со спрайтами, правда, эта версия старая некрасивая и недоделанная. Кстати, если покрутите колесо модуляции, изменится и надпись breath.:greedy:

    Corvus, спасибо, что наполняете раздел скриптами))) Можно попросить Вас не забывать создавать либо папки resources/pictures. А лучше, изначально, перед работой над примером ресурс-контейнер?
    Я-то догадался перекинуть все так, чтобы изображения появились, но, возможно, придет в голову не всем. А пример, в силу своей прозрачности, очень полезен:up:
     

    Вложения:

    • okarina.rar
      Размер файла:
      586,5 КБ
      Просмотров:
      4
  37. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    А еще, кстати, если человек владеет высоким искусством верстки, то имеет смысл подумать о разрезании изображений на отдельные инструменты установки и назначении этих картинок на много ui_label

    пример с использованием ui_button. Но, к сожалению, без высокого искусства верстки. И, за ненадобностью, без связи кейсвитчей и картинки в одну экосистему) Картинки работают, как кейсвитчи, кейсвитчи, как сменители картинок нет:schmoll:
     

    Вложения:

    • samples new.rar
      Размер файла:
      6,4 МБ
      Просмотров:
      4
    Последнее редактирование: 10 фев 2014
  38. Corvus13

    Corvus13 Member

    Регистрация:
    6 янв 2013
    Сообщения:
    35
    Симпатии:
    17
    Пол:
    Мужской
    PianoIst, спрайты бесспорно лучше...я уже как то делал библу со спрайтами, правда тогда не умел рисовать в кнобмэне и, поэтому, использовал заводские контактовские спрайты(см.вложение)...скрипт с бочкой это, так сказать, фундамент, от которого уже можно танцевать, как угодно фантазии...))) а про ресурс-контэйнер, это да...просто забыл сделать...)))))))
     

    Вложения:

    • supra_snare.jpg
      supra_snare.jpg
      Размер файла:
      20,5 КБ
      Просмотров:
      11
  39. Corvus13

    Corvus13 Member

    Регистрация:
    6 янв 2013
    Сообщения:
    35
    Симпатии:
    17
    Пол:
    Мужской
    Меня интересует следующий момент...может кто талкнёт идею для написания след.функции:
    Пример:
    у нас имеется 2 группы сэмплов,назначенные на одну клавишу...по умолчанию играет первая группа...но если мы нажимем клавишу пока не закончилось длительность сэмпла 1ой группы,то автоматически все последующие удары контакт будет брать из 2ой группы...но если сэмпл заканчивается(по длительности),независимо от воспроизведенной группы, следующий сэмпл будет браться из 1ой группы...?

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

    можно, конечно, просто взять и назначить это всё дело на регулятор CC#х(например колесо modwheel) или сделать это через кейсвич, или, ещё проще, на другую клавишу, но страть как "хотца" реализовать через скрипт...)))))))))))
     
    Последнее редактирование: 10 фев 2014
  40. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    думаю, использовать play_note ($EV_NOTE,EV_VEl,0,0), во-вторых, при взятии сэмпла инкризить переменную типа $note_count, или такой же массив, если речь идет о нескольких тарелках. А при релизе (который будет по окончании сэмпла) декризить. А дальше для Вас уже дело техники:up:
     
    Corvus13 нравится это.
  41. Corvus13

    Corvus13 Member

    Регистрация:
    6 янв 2013
    Сообщения:
    35
    Симпатии:
    17
    Пол:
    Мужской
    PianoIst, благодарю за мысль))) надо будет попробовать...
    у меня, правда, были мысли через группы реализовать, но так тоже думаю сгодится...)
     
    Последнее редактирование: 10 фев 2014
  42. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    через группы, в смысле, без скриптования?
    можно заделать тогда обычный раунд-робин в меню редакции групп)
    можно так и назначить, просто при релизе с $note_count = 0 отправлять раунд-робин в позицию 1. Где-то была такая фишка в KSP Manual
     
  43. Corvus13

    Corvus13 Member

    Регистрация:
    6 янв 2013
    Сообщения:
    35
    Симпатии:
    17
    Пол:
    Мужской
    PianoIst, скриптованием. Просто через allow/disallow group и подвязать это к note и release командам...
     
  44. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    а, ну это и было у меня изначально в голове :) Я и сказал, что это дело техники для Вас, потому что все остальное должно быть очевидно. С раунд-робином, это уже извращение, чтобы, возможно! снять лишний код
     
  45. Corvus13

    Corvus13 Member

    Регистрация:
    6 янв 2013
    Сообщения:
    35
    Симпатии:
    17
    Пол:
    Мужской
    Тоже так подумал)))

    кстати, нашёл у себя самую первую рукопись по KSP скриптингу от апреля 2006...решил прикрепить, думаю, лишней не будет...)))
     

    Вложения:

    zindersons нравится это.
  46. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Вот это решение, имхо, лучше оставлять на крайний случай. Ибо дальнейшем могут быть проблемы с mute и round robin, реализованными через те же allow/disallow скрипта. Просто сам уже сталкивался, получил много головной боли :)

    За рукопись по ksp отдельное спасибо!

    upd.
    Полчаса уже читаю этот мануал. Очень доступно и дружественно всё описано, с детально разжёванными примерами. Этого так не хватало в новой версии...
     
    Последнее редактирование: 10 фев 2014
  47. Corvus13

    Corvus13 Member

    Регистрация:
    6 янв 2013
    Сообщения:
    35
    Симпатии:
    17
    Пол:
    Мужской
    поэтому и решил залить...когда пишу скрипт, почему то невольно открываю старую версию...она нагляднее что ли...)))
     
  48. Сэр Ёжик

    Сэр Ёжик Member

    Регистрация:
    7 ноя 2007
    Сообщения:
    86
    Симпатии:
    16
    Адрес:
    Москва
    Фоновую картинку, кстати, нельзя через скрипты менять. Только в init и больше ни-ни! :schmoll:
     
  49. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.444
    Симпатии:
    1.304
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    а где-от видел я мануал. Там для фоновой картинки ни в коем не использовали код для wallpaper, а делали все через ui_label
    а потом, это и логично. Кому наод менять wallpaper по CC, или ноткой?
     
  50. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.516
    Симпатии:
    1.945
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Вспомнился забавный, неюзабельный пример из вчерашнего мануала :)

    Код:
    on init 
     declare ui_button $Bingo 
     $Bingo := 1 
    move_control ($Bingo,0,0) 
    end on 
    on note 
    move_control ($Bingo,3,6) 
    end on 
    on release 
    move_control ($Bingo,0,0) 
    end on 
    
     

Поделиться этой страницей