KSP все о нем

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

  1. zindersons

    zindersons Member

    Регистрация:
    16 ноя 2006
    Сообщения:
    70
    Симпатии:
    16
    Не могу понять почему выскакивает варнинг типа "object ENV_AHDSR not found - index will be invalid" огибающие работают, скрипт эдитор ошибок не находит. В чём загвоздка?
     
  2. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    без кода сказать сложно.... Первая мысль - что это не совсем энжин параметр. Группа-то у него есть, а слота нет
    --- добавлено 18 ноя 2015, дата сообщения: 18 ноя 2015 ---
    можно попробовать покурить на тему команды find-target
    --- добавлено 18 ноя 2015 ---
    Понадобились они мне тут, и нашел в сети. Пусть будут здесь
     

    Вложения:

  3. V_ad_im

    V_ad_im Well-Known Member

    Регистрация:
    31 окт 2006
    Сообщения:
    924
    Симпатии:
    351
    Пол:
    Мужской
    А вот такой вопрос - если мы имеем несколько групп, записанных разной громкостью (например, 7 слоёв громкости скрипок), и хочется переключаться между ними колесом модуляции, а не за счёт велосити, да ещё чтобы кроссфейд был между этими слоями - это в контакте скриптом решается или так можно, малой кровью накрутить?
     

    Вложения:

  4. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    малой кровью
    редактируете 1-ю группу, чтобы никаких управлялок громкостью не было (вкладка mod посередине где-то)
    создаете 6 групп для разных слоев.
    Ставите галку edit all groups
    И добавляете параметр модуляции по CC. В окошке lag поставить значение около 50
    Дальше каждую группу редактируете по отдельности, рисуя огибающие в выпадающем окошке, вуаля.
    --- добавлено 16 дек 2015, дата сообщения: 16 дек 2015 ---
    вот так
     

    Вложения:

    V_ad_im нравится это.
  5. V_ad_im

    V_ad_im Well-Known Member

    Регистрация:
    31 окт 2006
    Сообщения:
    924
    Симпатии:
    351
    Пол:
    Мужской
    Но при этом по-прежнему слои переключаются, только если я заново нажму клавишу, а без нажатия не хотят - в халионе это решается переключением New note на Held note, а в контакте как?
     
  6. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @V_ad_im, параметр модуляции на CC поправили?
    если скрипта нет - то все должно работать. Если есть скрипт - непонятно на кой он в такой ситуации нужен))))
    группы должны быть все желтенькими при взятии ноты, если все правильно.
    Если не так - проверить макимальное кол-во голосов для инструмента (вверху там где название), проверить вкладку group sstart options, чтоб стояло always
    и проверить, чтоб во всех группах сэмплы были растянуты на весь диапазон велосити. можно нажать кнопку selected groups only в mapping editor
     
    V_ad_im нравится это.
  7. V_ad_im

    V_ad_im Well-Known Member

    Регистрация:
    31 окт 2006
    Сообщения:
    924
    Симпатии:
    351
    Пол:
    Мужской
    Вот так? ползунок ещё выдвинул, чтобы кривая влияла на на 100%
     

    Вложения:

    Последнее редактирование: 16 дек 2015
  8. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @V_ad_im, Да, все правильно. Проверьте распределение сэмплов по велосити
     
    V_ad_im нравится это.
  9. V_ad_im

    V_ad_im Well-Known Member

    Регистрация:
    31 окт 2006
    Сообщения:
    924
    Симпатии:
    351
    Пол:
    Мужской
    Велосити у всех звуков стоят от 1 до 127, каждая нота покрывет весь диапазон.
    А вот кривые для СС где правильней рисовать? потому как вкладка Mod есть в секции Amplifier, а есть ещё и в секции volume
     
  10. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    сейчас @Ostap Fender поднял достаточно насущную проблему. Хотелось бы влыожить рассуждение по ее поводу сюда:
    Расположение и работа слайдеров - не та часть, которую надо копипастить.
    Надо оставить ровно столько слайдеров, сколько их будет в максимальной комплектации (експрессия, атака, релиз, сустейн, LFO, и т.д.) По одному на параметр.
    Не для каждой группы собственные, а в принципе, мы ж типа аналог моделируем? Аналог не будет ручкой вращать от нажатия кнопки.
    То-есть для каждого слайдера заведем мини-секцию, отделенную пропусками строк в on init, примерно так:
    Код:
    on init
      declare ui_slider $Attack (0,127,1)
      set_control_par(get_ui_id ($Attack),$CONTROL_PAR_MOUSE_BEHAVIOUR,подобрать)
      set_control_par(get_ui_id ($Attack),$CONTROL_PAR_DEFAULT_VALUE,0)
      set_control_par_str(get_ui_id ($Attack),$CONTROL_PAR_PICTURE,"картинка")
    
      declare ui_slider $Release (0,127,1)
      set_control_par(get_ui_id ($Release),$CONTROL_PAR_MOUSE_BEHAVIOUR,подобрать)
      set_control_par(get_ui_id ($Release),$CONTROL_PAR_DEFAULT_VALUE,0)
      set_control_par_str(get_ui_id ($Release),$CONTROL_PAR_PICTURE,"картинка")
    
    end on
    и т.д.

    Потом в этой же мини-секции добавить по текстовой переменной, которая будет отвечать за надпись
    Потом создать сетку расположения:
    условно:
    есть базовый х и базовый у. Из этого делается ряд переменных для расположения элементов:
    $x_base (изначальное смещение по х)
    $x_step (смещение каждого следующего элемента по х)
    $x_width (размер кнопки\слайдера по х)
    то же самое для у
    $y_base
    $y_step
    $y_height

    как минимум по три параметра, иногда надо больше.
    А дальше при расположении самих элементов занимается элементарной процедурой сложения-умножения:
    move_control_px ($Attack,$x_base+$x_step*3+$x_width*4, $y_base)
    этой строчкой ты расположишь элемент в третью ячейку той таблицы, которую организуешь сам.
    Таким образом впоследствии мы сможем изменением одной цифры менять все интервалы между контроллерами.

    Потом, как и говорил во всех группах за одни и те же параметры должны отвечать одни и те же контроллеры:
    во всех группах атака, скажем, будет подчиняться контроллеру 50, а релиз 51

    потом в каллбеке on ui_control (переменная слайдера) добавляем команду
    set_controller (номер контроллера, переменная слайдера)
    Таким образом мы установим атаку во всех группах на уровень слайдера.


    С текстом придется повозиться больше всего.
    Нужен будет строковый массив (к примеру !Attack_indicator[128]), в котором будет храниться значение для каждого положение контроллера приравненное к ms
    Легче всего это сделать так:
    Код:
    $i := 0
    while ($i<128)
      !Attack[$i] := максимальное значение атаки в ms \ на 128 * $i
      inc ($i)
    end while
    Далее нужно придумать каким способом у нас будет выводиться текст на виртуальный дисплей.
    Самый простой - сделать его в виде ui_label
    и простым суммированием текстовых переменных добавлять все надписи. Будет возможно, некрасиво, но просто
    Код:
    set_text ($indicator, "Attack" & !Attack[%CC[50]])
    add_text_line($indicator"Release" !Release[%CC[51]])
    При чем, это нужно будет прописать в каллбеке каждого контролера, а так же в каллбеке on init

    Более сложный способ - добавление самого окошка в кач-ве картинки и расположение отдельных ui_label со скрытым фоном (hide_part (&Attack_indicator, $HIDE_PART_BG)) как нам хочется. Даст больше гибкости в настройке, но добавит геморроя.

    Ну и в довершение работы над слайдерами - прописать все hide_part для тех кнопок на которых они не нужны отдельной функцией, вызываемой из всех каллбеков, или в каждом каллбеке по отдельности. Речь идет о ui-каллбеках кнопок и возможно каллбеке on note

    Вообще работа над качественным интерфейсом - самая изнурительная, после нарезки сэмплов.
    Искать новые алгоритмы для реализации никем не придуманных функций интересно и здорово; заниматься же постоянным копипастингом собственных формулировок с заменой одной-двух букв, в коде на 3000 строк - уныние.
    --- добавлено 10 мар 2016, дата сообщения: 24 янв 2016 ---
    еще одна концепция программирования сегодня всплыла в обсуждении:
    Чтобы, скажем, одной ручкой контролировать и dry и wet сигнал конволюции в противофазе, надо сделать так:
    Код:
    on init
    
    declare $i_invert
    declare $i
    $i_invert = 127
    $i = 0
    declare %invert_velocity[128]
    while ($i_invert >= 0)
    %invert_velocity[$i]:=$i_invert
    inc ($i)
    dec ($i_invert)
    end while
    
    end on
    
    on ui_control ($drywet_slider)
    
    set_engine_par ($ENGINE_PAR_SEND_EFFECT_DRY_LEVEL,%invert_velocity[$drywet_slider]*7874,-1,0,1)
    set_engine_par ($ENGINE_PAR_SEND_EFFECT_OUTPUT_GAIN,$drywet_slider*7874,-1,0,1)
    
    end on

    при этом то, что я обозвал $drywet_slider должно быть со шкалой 127.

    При этом: я добавил коэфицент умножения *7874. Это число получается, если максимальную шкалу engine-параметра разделить на 127. Но, нам же не нужно wet и dry сигналы разгонять до абсурдных значений.
    Соответственно, это число должно быть меньше, выводить надо экспериментальным путем, чтобы в положении 0 слайдер выдавал 100% dry сигнала, а в положении 127 - 100% wet-сигнала. Возможно, как раз 1000 подойдет

    Вообще очень полезно иметь при себе инвертированную шкалу миди-параметров, я ее использую довольно часто. К примеру, если нужно организовать какой-нибудь специфический кроссфейд. Так же можно создать несколько разных шкал, которые будут расположены по всему диапазону. В общем, стоит подумать о миди-маппинге.
     
    Последнее редактирование: 10 мар 2016
    arkaine и V_ad_im нравится это.
  11. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    сегодня открыл отвратительнейшую особенность контакта... Envelope AHDSR применяется к зоне во время ее активации. То-есть. Взяли ноту при показателе release 20ms, держим, двигаем release в значение 200ms, и отпускаем. Играет релиз 20ms. В то же время, мы спокойно можем менять частоту envelope sine, как так...
     
  12. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    261
    Симпатии:
    66
    Адрес:
    Spb
    Друзья помогите пожалуйста создать мульти скрипт(multiscript ) что бы отфильтровать #CC 7 контроллер на все каналы контакта. Проблема в следующем используем контакт на живых выступлениях а на контроллерах (Гитарах) невозможно отключить этот volume -7 CC и часто гитаристы задевают его тем самым меняя баланс инструментов. Пробовал стандартным фактори миди фильтром он отрубает все контроллеры а мне нужны c #CC 1 и до #CC 6 Буду очень благодарен!
     
  13. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @incubator,
    Код:
    on midi_in
    if ($MIDI_COMMAND = $MIDI_COMMAND_CC and $MIDI_BYTE_1 = 7)
    ignore_midi
    end on
     
    incubator нравится это.
  14. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    261
    Симпатии:
    66
    Адрес:
    Spb
    @PianoIst, Спасибо громадное! Заработал правда контакт попросил добавить еще "end if" чисто интуитивнго поставил и фильтрует без ошибок!Супер!
     
    PianoIst нравится это.
  15. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @incubator, да, чет я про него забыл )))
     
  16. Dr.NORFOLK

    Dr.NORFOLK New Member

    Регистрация:
    7 июл 2008
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Новосибирск
    Друзья, совсем недавно начал изучать KSP и появился вопрос. Сразу прошу простить, если вопрос банален или уже обсуждался.

    Делаю ручки (knob) управления громкостью групп инструмента. Нашел вот такой код (выдержки, чтобы было понятнее):
    Код:
    on init
    
       declare ui_knob $Vol1 (0,631000,1)
       set_knob_unit($Vol1,$KNOB_UNIT_DB)
       set_knob_defval($Vol1,500000)
       set_knob_label($Vol1,get_engine_par_disp($ENGINE_PAR_VOLUME,0,-1,-1))
       $Vol1 := get_engine_par($ENGINE_PAR_VOLUME,0,-1,-1)
       make_persistent($Vol1)
       message("")
    
    end on
    
    
    Все прекрасно, все работает. Появляется ручка (knob), рядом с ней поле, в котором отображается значение в Дб уровня громкости. Из примера выше видно, что значение по-умолчанию для данной ручки 500000(или -6.0dB). Но захотелось изменить этот параметр, например на -8.0dB или на -2.0dB, к примеру. Но как узнать значение этой величины в тех единица, которые нужны скрипту?
    Покрутил, повертел методом научного тыка, но закономерности не понял, вспомнил лишь, что dB - логарифмическая величина и отправился в гугл. Нашел на форумах формулу расчета уровня (dB): dB = 20 * log (V1/V2) , подставил цифирки в формулу, преобразовал выражение, но что-то не сходилось.
    Выражение для расчета получалось следующее (выражаясь языком Excel):
    Код:
    =СТЕПЕНЬ(10;LOG10(631000) - (ABS(A)/20))
    
    , т.е. 10 в степени LOG10(631000) - (ABS(A)/20)
    , где А - уровень громкость к которому нужно прийти, например -8.0 или -5.0 или какой захочется.

    И так как получаемые значение не соответствовали задумке, начал подгонять)). Экспериментально пришел к заключению, что вместо "20" в формуле, должно быть "60" и тогда все работает!
    Собственно и вопрос! Почему именно "60"? Может кто-то знает физику работы этого элемента?

    Наверное, можно все было сделать как-то проще, но в программировании на KSP я совсем новичок.

    Спасибо!
     
  17. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Dr.NORFOLK, Чувак, ты сломал систему)
    Никогда не слышал, чтоб кто-то разобрался, как оно работает)
    Навскидку: дело в том, что норм шкала dB - до нуля, и от -60. (а скорее, от -63.1). А в контакте этих шкал как минимум, 4: от -12 до +12. От -120 до +12 от -120 до +6 и еще что-то.
    Я просто сделал массивы, в которых записаны значения каждой из них от 0 до 127 соответственно (исходя из автоматизации в миди).
    Если что - вот они.
    Вообще, даже те значения, которые должны получаться простым делением - не получаются аналогичными тому, что показывает внутренний интерфейс. И это раздражает)
     
    arkaine нравится это.
  18. arkaine

    arkaine Active Member

    Регистрация:
    13 сен 2007
    Сообщения:
    600
    Симпатии:
    116
    Подскажите, пожалуйста, какой параметр отвечает за поведение слайдеров.
    Т.е., допустим, в тех скриптах, которые используются в определённых библиотеках, за движение (горизонтального!) слайдера отвечает вертикальное движение мыши, а меня интересует, как сделать, чтобы отвечало горизонтальное движение мыши.
     
  19. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @arkaine, set_control_par (get_ui_id(<slider>),$CONTROL_PAR_MOUSE_BEHAVIOUR,<value>)
    если value положительный - движется горизонтально, если отрицательный - вертикально. Чем он больше - тем быстрее движется.
     
    arkaine нравится это.
  20. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    ну и сюда запостю: (для хистори, типа)
    2017-09-14_02-33-11.png
     
    arkaine нравится это.
  21. arkaine

    arkaine Active Member

    Регистрация:
    13 сен 2007
    Сообщения:
    600
    Симпатии:
    116
    Не нашёл для задавания интересующих меня вопросов более подходящей темы, чем данная, поэтому решил обратиться именно сюда. Если вопросы окажутся здесь не к месту, то не обессудьте и, как вариант, модератор может перенести их в отдельную тему.

    Поднакопилось вопросов. Вопросов не_много, но они есть.

    Экспериментирую с созданными другими людьми библиотеками с целью освоения навыка создания своих, да и просто модификации/подстройки некоторых (уж больно неудобных) из них под себя.

    Возникла вот такая каверзная ситуация и в связи с ней вопрос.

    Оригинальный файл бэкграунда:
    [​IMG]

    То, что выдаёт Контакт в результате изменения структуры папки Resources:
    [​IMG]

    Почему кнопки стали отображаться так? Стали серыми, будто из внутреннего контактовского редактора.)

    И (возможно) вытекающий из предыдущего вопроса вопрос:
    Где указывается путь к файлам Resources? В самом инструменте можно выбрать только Instrument Wallpaper, но это, как я понимаю, не единственное место указания пути к ресурсам. Ещё в инструменте можно выбрать некий контейнер ресурсов (к которому неизвестно, как подступиться). И если, допустим, невозможно "распотрошить" уже созданную библиотеку, то где указать путь к файлам Resources в созданной собственной библиотеке?
     
  22. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @arkaine, скорее всего, ресурс-койнтейнер слетел, указывается рядом с wallpaper.
    Кнопки просто картинок не находят
     
    arkaine нравится это.
  23. arkaine

    arkaine Active Member

    Регистрация:
    13 сен 2007
    Сообщения:
    600
    Симпатии:
    116
    @PianoIst, в том-то и дело, что ресурс-койнтейнер указан, но вот структуру папок, на которые ссылается данный инструмент, я изменил. Вопрос в том, где (в контейнере или, возможно, в скрипте самого инструмента) указывается ссылка на папку с картинками / сами картинки. :)

    Скрипт данного инструмента таков (см. вложение).

    Единственное возникшее предположение заключалось в том, что
    set_control_par_str($INST_ICON_ID,$CONTROL_PAR_PICTURE,"icon")
    отвечает за этот путь, но оно (вроде бы) оказалось неверно.
     

    Вложения:

    • Script.txt
      Размер файла:
      7,9 КБ
      Просмотров:
      3
    Последнее редактирование: 15 сен 2017
  24. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @arkaine, когда жмете кнопку create nkr, он сам создает правильную структуру папок, можно этим воспользоваться. Вообще про nkr есть пара страничек в мануале по KSP
    Если структуру папок меняли непосредственно в nkr, бросьте это занятие, просто создаете папку Resources со вложенными
    2017-09-15_12-01-20.png
    и пихаете в нее нововведения. В финальной упаковке контакт вложенные папки не понимает и не пакует (вложенные в те, что на картинке)
     
    arkaine нравится это.
  25. arkaine

    arkaine Active Member

    Регистрация:
    13 сен 2007
    Сообщения:
    600
    Симпатии:
    116
    Именно с целью унификации библиотек и удобства при дальнейшей работе с ними (напр., Batch Resave или перемещение библиотеки с последующим указанием файлов к инструментам в ней) я и попытался воссоздать такую (стандартную) структуру папок, ибо изначально в некоторых (слишком во многих) других библиотеках структура отличная от неё.

    В данной библиотеке разработчик, кажется (уже забыл, каковой была структура), умудрился засунуть картинки в папку Pictures, которую он "заботливо" в папке Data. :)

    Спасибо за развёрнутый ответ, попробую пересоздать контейнер ресурсов, а также поперемещаю картинки, глядишь и удастся восстановить полноценную загрузку скина данного инструмента.
     
    Последнее редактирование: 15 сен 2017
  26. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @arkaine, Пересобирание библиотек, особенно защищенных - гиблое дело.
    Даже у нас в незащищенной библе в данный момент используются дополнительное дерево каталогов для дополнительных ресурсов. Защищенные же библиотеки с файлами обращаются совсем иначе, и это зашито внутрь инструментов, помимо самого скрипта. Теоретически, можно прошерстить скрипт и переписать пути, но, кмк, лишняя трата ресурсов.
    Лучше собирать мульти, на мульти-скриптах.
    Можно немного почитать про скриптовый роутинг миди здесь
     
    arkaine нравится это.
  27. Bborisss

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    Приветствую, программисты!
    Подскажите, пжст, где можно подробно почитать про операторы KSP?
    Я прочитал что было на http://nilsliberg.se/ksp/(тут все понятно), есть так же reference manual, но там как то не хватает информации для понимания. Есть какие то еще материалы? Хочется что то типа словаря.
     
  28. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Bborisss, Если еще вдруг не читали - KSPReference, лежит в папке с мануалами контакта на диске C:/Program Files.
    Вообще, честно говоря, не знаю, чего можно писать про операторы, т.к. все они помещаются на строчку:
    :=(присваивание), =(сравнение), + - / * >= <= mod cell floor and or
    вроде все. Может еще что-то забыл
     
  29. PianoIst

    PianoIst Well-Known Member

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

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    @PianoIst , не операторы, а скорее встроенные переменные и функции и правила их применеия. Например вот самое первое из ref manual NI_CALLBACK_TYPE, что это, мне не понятно. Я правда не програмист, а просто представление имею, но как правило с примерами и объяснениями все бывает понятно.
    --- добавлено 4 ноя 2017 ---
    Я немного на javascript програмировл, а KSP, я так понимаю, на основе php сделано?
     
  31. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Bborisss, тоже все очень хорошо в мануале описано. Прочитайте его, он не длинный)
    конкретно NI_CALLBACK_TYPE выдает тип каллбека, они тоже запакованы во вшитые переменные, типа NI_CALLBACK_TYPE_INIT и т.д.
    есть еще CALLBACK_ID, это порядковый номер исполнения каллбека, условно говоря. То есть дважды раз исполненный один и тот же один каллбек будет иметь разные ID
     
  32. Bborisss

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    @PianoIst это он? У меня просто в этой папке нет ничего... отдельно скачивал
     

    Вложения:

    • IMG_1293.PNG
      IMG_1293.PNG
      Размер файла:
      156,5 КБ
      Просмотров:
      5
  33. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Bborisss, он. Но он обязан там быть) Контакт все мануалы по дефолту ставит)
    2017-11-04_16-16-59.png
     
  34. Bborisss

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    @PianoIst спасибо, посмотрю еще повнимательнее. Но я его как то помню необычно ставил...
     
  35. Bborisss

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    @PianoIst, поможете разобраться с stop_wait?

    Не пойму как он действует.

    on init
    message(" ")
    end on

    on note
    if ($EVENT_NOTE = 55)
    message ("hey")
    wait(3000000)
    message("hey again")
    end if

    if ($EVENT_NOTE = 60)
    stop_wait($NI_CALLBACK_ID, 0)
    end if

    end on

    /Жму ($EVENT_NOTE = 55) потом ($EVENT_NOTE = 60)/

    По моему представлению здесь либо после ($EVENT_NOTE = 60) зразу должно написаться ("hey again"), либо ничего не написаться. А получается что ($EVENT_NOTE = 60) никак не влияет на выполнение предыдущего Call_backэ'а.

    А вообще, как можно остановить выполнение определенных предыдущих выполняющихся Call_back'ов при определенных условиях?
     
  36. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Bborisss, На эти грабли легко наступить :)
    соответственно, надо сделать что-то вроде:

    Код:
    on init
    message(" ")
    declare $new_callback
    declare $prev_callback
    end on
    
    on note
    $prev_callback := $new_callback
    $new_callback := $NI_CALLBACK_ID
    if ($EVENT_NOTE = 55)
    message ("hey")
    wait(3000000)
    message("hey again")
    end if
    
    if ($EVENT_NOTE = 60)
    stop_wait($prev_callback, 0)
    end if
    
    end on 
    Но вообще это пока сферический код в вакууме. Каллбек on note обычно перегружен событиями. поэтому для сообщения между разными on init лучше выбирать не ID каллбека, а что-нибудь попроще и понадежнее. Как правило, массивы в 128 ячеек для хранения параметров для каждой ноты (в смысле питча)
    --- добавлено 7 ноя 2017 ---
    да как угодно, ессчестно.
    допустим (псевдокод):
    Код:
    on note
      $stop := 0
      ignore_event ($EVENT_ID)
      $new_id := play_note ($EVENT_NOTE, $EVENT_VELOCITY,0,0)
      $i := 0
      while ($stop # 1)
        inc($i)
        wait (100)
        if ($i = 100000)
          exit
        end if
      end while
      note_off ($new_id)
    end on
    
    on release
      $stop := 1
    end on
    совершенно бесполезный код, который по идее должен провоцировать залипание ноты, если мы ее слишком долго держим (ок секунды, если не просчитался).
    Естессно, работает на одной ноте за раз)
     
  37. Bborisss

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    @PianoIst Спасибо, к массивам потихонечку прихожу. Щас буду разбираться в ваших кодах, это для меня пока не быстро)
    Тут еще одна странность возникла.

    Задача что бы нажатие педали сустейна сняло ноту, а снимает почему то отпускание (т.е. нажал и отпустил). При чем попробовал сыграть ноту от нажатия, тут все ок.

    Код:
    on init
    declare %new_id[10]
    message("")
    declare $i := 0
    declare %sustain_notes[10]
    end on
    
    on note
    if (%CC[64] = 127)
    ignore_event($EVENT_ID)
    %sustain_notes[$i] := $EVENT_NOTE
    %new_id[$i] := play_note(%sustain_notes[$i],30,0,0)
    $i := $i + 1
    end if
    end on
    
    on controller
        if (%CC[64] = 127)
        $i := 0
    end if
        while ($i < 10)
         note_off(%new_id[$i])
         $i := $i + 1
        message("muting note")
    end while
    $i := 0
       
    end on
    Вообще тут идея такая что при нажатии педали сустейна он их запоминает и они звучат даже после того как педаль отпущена, а потом когда педаль повторно нажимается ноты звучать прекращают. И все в целом работает кроме того, что заглушаются они при отпускании, а не при нажатии.
     
  38. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Bborisss, вообще в коде много логических ошибок.
    Я нарисую пример, но завтра, сейчас работы много...
    Пока советую проверить настройки иснтрумента. в данном случае режим cc64 должен стоять controller only
     
  39. Bborisss

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    Интересно...
    Спасибо, что помогаете.
    --- добавлено 7 ноя 2017 ---
    Все заработало!
     
    PianoIst нравится это.
  40. Bborisss

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    @PianoIst , не могу пнять одну вещь...
    На входе нота. Первым делом ее игнорируем и делаем своютакую же. Играем так несколько нот и все их пока держим и все они звучат. Потом одну отпускаем. Вопрос: как на on release получить параметр какую именно мы отпустили, что б ее заглушть?
     
  41. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Bborisss, как правило, мы не отпускаем дважды одну и ту же ноту, предварительно ее не взяв.
    По этому в релизе спокойно используем переменную EVENT_NOTE.
    !НО!
    Релиз иногда вызывается по десять раз на дню, допустим: при игре легато с сэмплами транзиций мы проигрываем сэмпл транзиций в on note, потом проигрываем сэмпл сустейна (а часто и во время звучания сэмпла транзиции). И вот тут начинают вылезать косяки как раз по причине того, что одна и та же нота была взята дважды, без единого эвента note_off. Поэтому надо либо фильтровать по EVENT_ID (проверять на соответсвие new_id и иже с ними), или еще как-то по ситуации.
    А когда делается какой-то арпеджиатор вообще катавасия начинается с контролем вызова каллбеков.
    Я люблю отключать релиз способом типа:
    Код:
    on note
    release_off := 1
    <кой-какой код со снятием нот>
    release_off := 0
    end on
    
    on release
      if (release_off = 1)
        exit
      end if
    end on
    Еще можно проверять какие клавиши нажаты, но надо учитывать, что если мы игнорим эвент снятия ноты в принципе (в смысле, покидаем каллбек через exit в самом начале) ноты могут "залипать".
     
    Bborisss нравится это.
  42. Bborisss

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    А как ее использовать? Ведь в note_off параметр не EVENT_NOTE, а EVENT_ID?
    --- добавлено 10 ноя 2017 ---
    Можно, конечно, связать EVENT_NOTE и EVENT_ID, а потом на релизе релизе опрашивать какой EVENT_ID соответствует конкретноой отпущеной EVENT_NOTE... Но как то это усложненно мне кажется.
     
    Последнее редактирование: 10 ноя 2017
  43. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Bborisss, EVENT_NOTE и EVENT_VELOCITY также действуют и для события release. Правда релиз велосити никто не шлет, а жаль...
     
    Bborisss нравится это.
  44. Bborisss

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    @PianoIst, не работает:(

    Код:
    on note
    ignore_event($EVENT_ID)
    play_note($EVENT_NOTE, 100, 0, 0)
    end on
    
    on release
    note_off($EVENT_NOTE)
    end on
     
  45. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Bborisss, ну дsr это... про то, что note_off принимает event_note я и не говорил :) Эта функция выключает ноту по ID, а не номеру.
    Но вообще в релизе использовать event_note можно.
    тут так должно быть
    Код:
    on note
      if (EVENT_NOTE = (60))
        new_id := play_note бла бла
      end if
    end on
    
    on release
       if (EVENT_NOTE = 60)
        note_off (new_id)
      end if
    end on
     
    Bborisss нравится это.
  46. Bborisss

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    @PianoIst , а вы пробовали использовать "заскриптованный" Контакт как источник миди сигнала для других инструментов?
     
  47. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Bborisss, в принципе, работает. Но это как кувалдой гвозди забивать :)
     
    Bborisss нравится это.
  48. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.186
    Симпатии:
    1.833
    Пол:
    Мужской
    @PianoIst, у меня вопрос, не касающийся напрямую KSP.
    В общем, суть такова - давно хочу сделать конструктор интерфейсов, естественно, только для основных элементов.
    То есть - кнобы, слайдеры, чекбоксы, поля для текста и прочее.
    Насколько удобнее задавать параметры по отдельности - либо проще кучку аргументов прописать?
    Это вопрос к Вам, как к человеку в курсе и KSP, и JS, потому что, я один раз глянул всего KSP.
     
  49. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    1.937
    Симпатии:
    1.815
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @EUGEN27771, честно говоря, мне кажется, тут все от языка зависит.
    Я по лету пытался написать библиотеку адаптивного дизайна для контакта. На тот момент наилучшей архитектурой показалось - изначально интерфейс строить на функциях (или методах, хз) комбайнах, в которых определяешь все параметры сразу. Но чтобы потом адекватно работала привязка к контейнерам и была возможность делать "доводку" позиций в стиле Button.x += value, пришлось городить огород из дополнительной здоровой функции. (Она еще попутно решала вопрос слишком большого кода).
    Но библиотека не взлетела в итоге (использовалл в двух проектах, и понял, что надо переписывать кардинально, на питоне :) ), потому что я гнался за тем, чтобы была и автоматизация, и псевдо-ООП, и простота написания кода в процедурном стиле. Все это привело к жуткому раздуванию кода при компиляции.
    Вообще много вещей получились хорошо, если интересно, могу архитерктуру нарисовать вечером. Но все-таки я не конструктор делал, а приблуду, вроде библиотеки Lokasenna_GUI
     
    EUGEN27771 и Bborisss нравится это.
  50. Bborisss

    Bborisss Member

    Регистрация:
    18 июн 2010
    Сообщения:
    71
    Симпатии:
    6
    @PianoIst У меня как то не корректно работает. Вот например в данном коде другой инструмент не получает cообщене note_off.
    Код:
    on init
      declare $new_id
    end on
    
    on note
      ignore_event($EVENT_ID)
      if ($EVENT_NOTE = $EVENT_NOTE)
        $new_id := play_note($EVENT_NOTE, 100, 0, 0)
      end if
    end on
    
    on release
       if ($EVENT_NOTE = $EVENT_NOTE)
        note_off ($new_id)
      end if
    end on
    А где это лучше делать? Т.е. если нужно что бы видоизмененный скриптами миди сигнал попадал на другие инструменты?
    Например, знаю, в лоджике X есть Skriptor, но не пробовал.
    И не уверен что сигнал можно направить на другие каналы...
     
    Последнее редактирование: 12 ноя 2017

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