Найти тему

Язык скриптов Kontakt 2 Перевод часть 4

Изображение с официального сайта
Изображение с официального сайта

Мы дошли до середины мануала! Прошу обратить внимание - дзен режет табуляцию, поэтому скрипты будут выглядеть немножко неприятно.

Не забудьте подписаться - чем больше подписчиков, тем больше переводов))

Event Management (Управление событиями)

Events and Note ID's (События и идентификаторы заметок)

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

Важно отметить, что обратный вызов и событие — это две разные вещи. Обратный вызов — это программа, которую интерпретирует компьютер, а событие можно рассматривать как виртуальный голос.

Идентификационный номер заметки, которая запустила обратный вызов, хранится во встроенной переменной. $EVENT_ID. Доступ к идентификационному номеру искусственно сгенерированных заметок можно получить через play_note():

on init

message ("")

declare $new_note_id

declare $original_note_id

end on

on note

$original_note_id := $EVENT_ID

wait(500000)

note_off($original_note_id)

$new_note_id := play_note($EVENT_NOTE + 12,$EVENT_VELOCITY,0,500000)

wait(500000)

note_off($new_note_id)

end on

on release

if ($EVENT_ID = $new_note_id)

message("note off new note")

{“ примечание от новой заметки”}

wait(200000)

message ("")

end if

if ($EVENT_ID = $original_note_id)

message("note off original note")

{“ заметка отличается от исходной заметки”}

wait(200000)

message ("")

end if

end on

При нажатии клавиши обратный вызов ноты выполняется один раз. Обратный вызов освобождения, однако, выполняется дважды, как вы можете видеть в строке состояния Kontakt.

Почему?

Функцию play_note() можно рассматривать как виртуальный палец, нажимающий клавишу, и, поскольку каждую клавишу нужно когда-то отпускать, это искусственное включение ноты генерирует ноту-выключение, которая затем запускает обратный вызов отпускания.

40

Фактически,play_note() теоретически также должен выполнять обратный вызов заметки. Однако это не так, так как получится бесконечный цикл. Итак, play_note() никогда не выполняет обратный вызов note, даже если он запущен из другого обратного вызова.

С play_note() связана функция note_off(), поскольку эта команда также генерирует note -off:

note_off(<ID-номер>)

note_off() оказывает такое же влияние на событие, как и выпуск note. note_off() всегда будет вызывать release callback

На самом деле параметр продолжительности в play_note() можно заменить комбинацией wait (), а также note_off(). Но с тех пор play_note() часто используется, параметр продолжительности доступен в play_note().

И, наконец, если вы хотите полностью избавиться от события, используйте ignore_event()

on note

ignore_event($EVENT_ID)

play_note($EVENT_NOTE,$EVENT_VELOCITY,400000,-1)

end on

Исходная нота, вызвавшая обратный вызов, доступна, как если бы клавиша никогда не была нажата. Однако номер ноты и скорость нажатия все еще могут использоваться в обратном вызове. play_note() нота воспроизводится, но сэмпл имеет смещение 400 мс. release callback также можно игнорировать с помощью ignore_event (игнорировать_событие).

ignore_event(<ID-номер>)

игнорировать событие в обратном вызове

Changing Events (Изменение событий)

Значения $EVENT_NOTE и $EVENT_VELOCITY можно изменить с помощью следующих функций:

change_note(<ID-number>,<new-note-number>)

change_note(<ID-номер>,<новый-номер-заметки>)

изменить значение ноты определенного события ноты

change_velo(<ID-number>,<new-velocity-number>)

change_velo(<ID-номер>,<новый-номер-скорости>)

изменить значение динамической чувствительности определенного события ноты

Если две функции применяются до первой wait (), изменение происходит для звучащего голоса. Если голос уже запущен, меняется только значение переменной.

До сих пор было возможно только имитировать MIDI-сигналы (play_note() а также note_off()), или игнорировать их (ignore_event()) или изменить их значение (change_note() а также change_velo ()). С помощью следующих команд вы также можете изменить образец:

41

change_pan(<ID-number>,<panorama>,<relative-bit>)

change_pan(<ID-номер>,<панорама>,<относительный бит>)

изменить позицию панорамирования определенного события ноты

< ID-number > Идентификационный номер события, которое необходимо изменить

< panorama > Положение панорамирования, значения варьируются от -1000 (слева) до 1000 (справа)

< relative-bit > Если относительный бит установлен на 0, изменение происходит относительно начального значения события. Если он установлен на 1, это происходит относительно фактического значения панорамирования.

Различные последствия имеют значение только тогда, когда существует более одного изменить_ pan() заявление, относящееся к одному и тому же событию.

change_vol(<ID-number>,<volume>,<relative-bit>)

change_vol(<ID-номер>,<том>,<относительный бит>)

изменить громкость сэмпла определенного нотного события в милли децибелах

< ID-number > Идентификационный номер события, которое необходимо изменить

< volume > Изменение громкости в милли децибелах

< relative-bit > Если относительный бит установлен на 0, изменение происходит относительно начального значения события. Если он установлен на 1, это происходит относительно фактического значения громкости.

Различные последствия имеют значение только тогда, когда существует более одного change_vol() заявление, относящееся к одному и тому же событию.

change_tune(<ID-number>,<tune-amount>,<relative-bit>)

change_tune(<ID-номер>,<количество-настройки>,<относительный-бит>)

изменить настройку сэмпла определенного нотного события в миллицентах

< ID-number > Идентификационный номер события, которое необходимо изменить

< tune-amount > Сумма в милли центах, поэтому 100000 равняется половине тона

< relative-bit > Если относительный бит установлен на 0, изменение происходит относительно начального значения события. Если он установлен на 1, это происходит относительно фактического значения настройки.

Различные последствия имеют значение только тогда, когда существует более одного change_tune() заявление, относящееся к одному и тому же событию.

fade_in(<ID-number>,<fade-time>)

fade_in(<идентификационный номер>,<время исчезновения>)

выполнить постепенное появление определенного события ноты

< ID-number > Идентификационный номер события, которое необходимо изменить

< fade-time > Время затухания в микросекундах

fade_out(<ID-number>,<fade-time>,<stop-voice>)

fade_out(<ID-номер>,<время затухания>,<стоп-голос>)

выполнить затухание определенного события ноты

< ID-number > Идентификационный номер события, которое необходимо изменить

< fade-time > Время затухания в микросекундах

< stop-voice > Указать, если голос останавливается после того, как он исчез (1), голос затих и молчит, но все еще работает (0)

42

Grouping Events (Группировка событий)

Иногда нецелесообразно рассматривать каждое событие отдельно. Таким образом, можно создавать группы, присваивая событию отметку:

set_event_mark(<ID-number>,<bit-mark>)

set_event_mark(<ID-номер>,<битовая метка>)

назначить указанное событие указанной группе событий

< ID-number > Идентификационный номер события, которое нужно сгруппировать

< bit-mark > Здесь вы можете ввести одну из 28 марок от $MARK_1до $MARK_28 которое адресовано этому событию. Вы также можете адресовать более одной метки одному событию, набрав команду или используя оператор +.

Таким образом, вместо индивидуального идентификатора вы можете использовать метки, набрав by_marks (<bit-mark>) вместо идентификатора (программа должна знать, что вы хотите адресовать метки, а не идентификаторы). Давайте рассмотрим следующий пример, чтобы проиллюстрировать это:

on init

declare $new_id

end on

on note

set_event_mark($EVENT_ID,$MARK_1)

$new_id := play_note($EVENT_NOTE + 12,120,0,-1)

set_event_mark($new_id,$MARK_1 + $MARK_2)

change_tune(by_marks($MARK_1),50000,0)

{ Обе note установлены на 50 центов выше }

change_vol(by_marks($MARK_2),-6000,0)

{ изменяется только громкость новой ноты –6 дБ }

end on

by_marks(<bit-mark>) (by_marks(<битовая метка>))

обращаться ко всем событиям указанной группы событий

43

Assigning Event Parameters (Назначение параметров события)

Событию можно присвоить до четырех параметров. Как вы уже знаете, каждое событие имеет определенные параметры, привязанные к этому событию, такие как идентификационный номер ($EVENT_ID), note

number ($EVENT_NOTE) и velocity number ($EVENT_VELOCITY).

Событию можно назначить до четырех параметров, используя

set_event_par(<ID-number>,<index>,<value>)

set_event_par(<ID-номер>,<индекс>,<значение>)

присвоить параметр событию

<ID-number> Идентификационный номер связанного события

< index > Индекс (0 – 3) назначенного параметра

< value > Значение назначенного параметра

Четыре параметра находятся в массиве %EVENT_PAR[],который состоит из четырех элементов

($EVENT_PAR[0] – $EVENT_PAR[3]).

Вот пример использования set_event_par():

Этот скрипт находится в слоте 1 и настраивает каждую ноту на 50 центов выше (этот простой скрипт просто демонстрирует принцип, он может использоваться, например, для таких скриптов, как Microtuning):

on note

change_tune($EVENT_ID,50000,1)

set_event_par($EVENT_ID,0,50000)

end on

В слоте 2 создается искусственная нота. Поскольку исходное событие игнорируется, информация о настройке (т.е. 50 центов) теряется. Используя set_event_par в первом слоте и

%EVENT_PAR[ ] во втором слоте вы можете получить эту информацию о настройке:

on init

declare $art_id

declare ui_button $On_Off

end on

on note

ignore_event($EVENT_ID)

$art_id := play_note($EVENT_NOTE+2,$EVENT_VELOCITY,0,-1)

if ($On_Off = 1)

change_tune($art_id,%EVENT_PAR[0],1)

end if

end on

44

User Interface Controls (Элементы управления пользовательского интерфейса)

Скриптовый движок способен генерировать модули пользовательского интерфейса, чтобы облегчить использование скрипта и предоставить пользователю возможность непосредственного контроля над переменными. Элементы управления пользовательского интерфейса должны быть объявлены в обратном вызове инициализации, как и другие переменные. Элемент управления пользовательского интерфейса — это, по сути, переменная, которой пользователь может управлять из интерфейса Kontakt. Элементы управления пользовательского интерфейса отображаются в отдельном модуле в Kontakt. Вот все доступные элементы управления пользовательского интерфейса:

Buttons (Кнопки)

объявить ui_button $<имя-переменной>

создать кнопку пользовательского интерфейса

on init

declare ui_button $mybutton (моя кнопка)

end on

Изображение с мануала
Изображение с мануала

Кнопка — это переменная, которая может принимать значение 0 (неактивна/нажата) или 1 (активна/нажата).

Если вы нажмете на кнопку, переменная и кнопка переключатся между двумя состояниями.

Knobs (Ручки)

объявить ui_knob $<имя-переменной> (<min>,<max>,<отношение отображения>)

создать ручку пользовательского интерфейса

on init

declare ui_knob $myknob (1,100,1)

$myKnob := 50

end on

Изображение с мануала
Изображение с мануала

Переменная ручки может содержать целые числа от <min > (когда ручка повернута в крайнее левое положение) до <max.> (когда ручка повернута в крайнее правое положение). Значение по умолчанию при инициализации < min >.Однако в нашем примере патча выше мы присвоили значение 50 переменной $myknob ($моя ручка) который по умолчанию устанавливает ручку на это значение при инициализации скрипта. Имя переменной также будет отображаться справа от ручки, поэтому выбирайте имя переменной с умом.

<display-ratio> немного сложно понять: это означает соотношение отображаемого и внутреннего значения. Это может быть полезно, например, если вы хотите настроить параметр времени, который должен быть в микросекундах, но вы хотите показать секунды для пользователя.

45

Предположим, вам нужна ручка со значениями от 0 до 1000000, поскольку вы хотите, чтобы пользователь выбирал время от 0 до 1 секунды (помните, 1 миллион микросекунд равен одной секунде). Затем вы снабдите ручку шкалой 1000000. Таким образом, вы получите значения, которые вам нужны внутри, и пользователь увидит то, с чем он может справиться. Кроме того, ручка знает, что нужно отображать дробные значения, так как внутреннее разрешение выше, чем отображаемое.

Установка нуля для параметра шкалы аналогична установке 1 и означает, что внутренний и отображаемый диапазоны совпадают друг с другом.

Menus (Меню)

declare ui_menu $<variable-name> (объявить ui_menu $<имя-переменной>)

создать меню пользовательского интерфейса

add_menu_item (<variable>,<text>,<number>) (add_menu_item (<переменная>,<текст>,<число>))

добавить текст в меню пользовательского интерфейса

on init

declare ui_menu $myMenu

add_menu_item($myMenu,"take the first",0){Возьмите первый}

add_menu_item($myMenu,"take that",1){Возьми это}

add_menu_item($myMenu,"take this",2){Возьми это}

end on

Изображение с мануала
Изображение с мануала

Линия declare ui_menu $myMenu объявляет управляющую переменную пользовательского интерфейса и создает для нее меню. Новое меню изначально будет пустым, поэтому мы должны заполнить его чем-то толковым. add_menu_item оператор принимает три параметра: сначала идет переменная меню, затем идет текст, отображаемый в меню, и, наконец, идет значение, которое переменная будет иметь при выборе определенного пункта меню.

46

Text Labels (Текстовые метки)

declare ui_label $<variable-name> (<width>,<height>)

объявить ui_label $<имя-переменной> (<ширина>,<высота>)

создать текстовую метку пользовательского интерфейса

set_text (<variable>,<text>) (set_text (<переменная>,<текст>))

при применении к текстовой метке: удалить текст, видимый в данный момент в указанной метке, и добавить новый текст

add_text_line (<variable>,<text>) (add_text_line (<переменная>,<текст>))

добавить новую текстовую строку в указанную метку, не стирая существующий текст

on init

declare ui_label $myText(<width>,<height>){Ширина, Высота}

set_text(<label_variable>,<text>)

add_text_line(<label_variable>,<text>)

end on

Изображение с мануала
Изображение с мануала

Это создает текстовое поле, в котором вы можете написать текст. Вы должны указать значения ширины и высоты текстового поля. Ширина измеряется в столбцах, а высота в строках, максимум шесть столбцов и шесть строк.

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

Value Edit (Значение Изменить)

declare ui_value_edit $<variable>(<min>,<max>,<display-ratio>)

создать поле номера пользовательского интерфейса

on init

declare ui_value_edit $myEdit (0, 1000,10)

$myEdit := 166

end on

Изображение с мануала
Изображение с мануала

Этот элемент управления ведет себя точно так же, как ручка, с той разницей, что пользователь может ввести значение двойным щелчком.

47

Table (Стол)

declare ui_table %<array-name>[columns](<width>,<height>,<range>)

объявить ui_table %<имя-массива>[столбцы](<ширина>,<высота>, <диапазон>)

создать таблицу пользовательского интерфейса

on init

declare ui_table %table[32](2,2,128)

end on

Изображение с мануала
Изображение с мануала

Этот элемент управления создает таблицу, которую пользователь может редактировать. Количество столбцов указано в скобках (количество индексов или значений «x») и ограничено максимальным значением 128. < width> (ширина) и < height> (высота) работайте как в текстовой таблице. <range> (диапазон) в приведенном выше примере от 0 до 127, положительные значения для диапазона создают однополярную таблицу, а отрицательные значения создают двуполярную таблицу. Это означает, что мы получим таблицу с шагом от -100 до 100, если <range > установлен на -100.

Positioning of ui elements (Позиционирование элементов пользовательского интерфейса)

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

С помощью команды

move_control (<variable>,<x position>, <y position>)

move_control (<переменная>,<позиция x>, <позиция y>)

переместить элемент пользовательского интерфейса в определенное место

вы можете перемещать элемент управления пользовательского интерфейса. Вы можете сделать это не только в обратном вызове init, но и во всех обратных вызовах; таким образом позволяя элементам пользовательского интерфейса появляться динамически в любом месте. Вот пример:

on init

declare ui_label $label (1,1)

set_text ($label,"Move the wheel!") {Двигайте колесо!}

move_control ($label,3,6)

end on

on controller

if ($CC_NUM = 1)

move_control ($label,3,(%CC[1] * (-5) / (127)) + 6 )

end if

end on

(не беспокойтесь об обратном вызове on controller, это будет рассмотрено позже).

48

Hiding GUI elements (Скрытие элементов графического интерфейса)

Вы можете скрыть элементы графического интерфейса, такие как кнопки, ручки и т. д. Просто переместите элемент управления в положение 0–0, и элемент управления станет невидимым.move_control (<variable >,0,0) может использоваться во всех обратных вызовах и может применяться более чем к одному элементу GUI:

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

UI Callbacks (Обратные вызовы пользовательского интерфейса)

Вы можете создать обратный вызов для каждого элемента управления пользовательского интерфейса, который запускается, когда пользователь меняет соответствующий элемент управления. В приведенном ниже примере создается кнопка, которая воспроизводит ноту при ее нажатии.

on ui_control (<variable-name>) ... end on

on ui_control (<имя-переменной>) ... конец

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

on init

declare ui_button $play

$play := 0

end on

on ui_control ($play)

play_note(60,120,0,1000000)

wait (1000000)

$play := 0

end on

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

Naming of GUI elements (Именование элементов графического интерфейса)

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

Команда такая же, как и для меток графического интерфейса:

Эту команду можно использовать во всех обратных вызовах:

set_text (<variable>,<text>) (set_text (<переменная>,<текст>))

при применении к метке: удалить текст, видимый в данный момент в указанной метке, и добавить новый текст при применении к ручкам, кнопкам и редактированию значений: установить имя элемента пользовательского интерфейса

49

Вот простой пример для этого:

on init

declare ui_button $Toggle

$Toggle := 0

set_text ($Toggle,"Off")

end on

on ui_control ($Toggle)

select ($Toggle)

case 0

set_text ($Toggle,"Off")

case 1

set_text ($Toggle,"On")

end select

end on

Просмотр производительности

С помощью команды:

make_perfview

активирует представление производительности для соответствующего скрипта

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

Итак, когда этот скрипт используется в iinstrument:

on init

declare ui_knob $A (0,127,1)

declare ui_knob $B (0,127,1)

declare ui_knob $C (0,127,1)

declare ui_knob $D (0,127,1)

declare ui_knob $E (0,127,1)

declare ui_knob $F (0,127,1)

make_perfview

end on

представление инструмента выглядит следующим образом:

Изображение с официального сайта
Изображение с официального сайта

50

Usage of Midi Controllers (Использование миди-контроллеров)

The Controller Callback (Обратный вызов контроллера)

Последний тип обратного вызова, который мы пока не обрабатывали, — это обратный вызов контроллера. Он вызывается каждый раз при изменении значения контроллера:

on controller ... end on

обратный вызов контроллера, выполняемый всякий раз, когда получено сообщение cc или изменение высоты тона

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

on controller

message ("You've changed a controller!")

{Вы сменили контроллер}

wait(1000000)

message("")

end on

Подобно обратным вызовам note и release, есть функция игнорирования:

ignore_controller

игнорировать событие контроллера в обратном вызове контроллера

Эта функция не имеет параметров.

Controller variables and arrays (Переменные контроллера и массивы)

Вы можете получить доступ к номеру контроллера, который запустил обратный вызов, со встроенной переменной $CC_NUM:

$CC_NUM

номер контроллера, который инициировал обратный вызов контроллера

Используя массив %CC[<controller number>] >]вы можете получить доступ к конкретным значениям контроллера, которые идут от 0 до 127:

%CC[<controller number>] >]

текущее значение контроллера для указанного контроллера (CC# 128 = изменение высоты тона)

Значения изменения высоты тона можно получить с помощью встроенной переменной $VCC_PITCH_BEND: значения изменения высоты тона варьируются от –8192 до +8191:

$VCC_PITCH_BEND

значение виртуального контроллера cc для изменения высоты тона

51

Итак, написав

on controller

message(%CC[$VCC_PITCH_BEND])

end on

значения изменения высоты тона от –8192 до +8191 отображаются во входящих сообщениях изменения высоты тона.

Другой массив %CC_TOUCHED[<controller number >]:

%CC_TOUCHED[<controller number >]

1, если значение контроллера изменилось, 0 в противном случае

Этот массив будет содержать «1» для каждого контроллера, который был изменен с момента последнего обращения к обратному вызову контроллера, и ноль для всех остальных. Важно знать, изменился ли определенный интересующий контроллер, поскольку обратный вызов выполняется для каждого контроллера.

on controller

if (%CC_TOUCHED[1] = 1)

message ("You've changed the mod wheel!")

{ Вы изменили колесо модов!}

wait(1000000)

message ("")

end if

if (%CC_TOUCHED[$VCC_PITCH_BEND] = 1)

message ("You've changed the pitch bend wheel!")

{ Вы изменили колесо высоты тона!}

wait (1000000)

message ("")

end if

end on

Функция, связанная с контроллерами, set_controller():

set_controller(<controller-number>,<controller-value>)

set_controller(<номер-контроллера>,<значение-контроллера>)

отправить значение MIDI CC определенного контроллера

Эта функция доступна во всех обратных вызовах. С его помощью вы можете назначать значения контроллера контроллерам. Модулируя параметры в Kontakt через MIDI CC, вы можете получить доступ ко всем параметрам в Kontakt через скриптовый движок.

52

Working with RPN and NRPN messages(Работа с сообщениями RPN и NRPN)

Доступны два других типа обратного вызова, которые вызываются всякий раз, когда принимается сообщение rpn или nrpn:

on rpn ... end on

Обратный вызов rpn, выполняемый всякий раз, когда получено сообщение rpn (зарегистрированный номер параметра)

on nrpn ... end on

Обратный вызов nrpn, выполняемый всякий раз, когда получено сообщение nrpn (незарегистрированный номер параметра)

Чтобы использовать эти два обратных вызова, важны следующие две встроенные переменные:

$RPN_ADDRESS

номер параметра принятого сообщения rpn/nrpn (0 – 16383). Может использоваться только в обратном вызове rpn/ nrpn.

$RPN_VALUE

значение принятого сообщения rpn/nrpn (0 – 16383). Может использоваться только в обратном вызове rpn/nrpn.

Переменные могут использоваться как в обратном вызове rpn, так и в обратном вызове nrpn. Следующий простой скрипт ищет три распространенных типа RPN:

on rpn

if ($RPN_ADDRESS <= 2)

select ($RPN_ADDRESS)

case 0

message("Pitch Bend Sensitivity"){ Чувствительность}

case 1

message("Channel Fine Tuning"){ Тонкая настройка}

case 2

message("Channel Coarse Tuning"){ Грубая настройка}

end select

else

message ("Not specified")

end if

end on

Любое сообщение (n)rpn использует два байта для представления номера параметра, например, в случае сообщений rpn CC 101 представляет MSB (старший значащий байт), а CC100 — младший SB (младший значащий байт).

Кроме того, два байта используются для представления значения (CC 6 для MSB и CC 38 для LSB).

Можно получить MSB или LSB часть сообщения, используя следующие функции:

msb(<built-in variable>) (msb(<встроенная переменная>))

возвращает часть MSB адреса или значения rpn/nrpn.

lsb(<built-in variable>) (lsb(<встроенная переменная>))

возвращает часть LSB адреса или значения rpn/nrpn.

53

И, наконец, есть две команды, с помощью которых вы можете создавать сообщения rpn и nrpn (аналогично set_controller). Эти команды можно использовать во всех обратных вызовах:

set_rpn(<address>,<value>) (set_rpn(<адрес>,<значение>))

отправить рп сообщение

set_nrpn(<address>,<value>) (set_nrpn(<адрес>,<значение>))

отправить nrpn-сообщение

54

На сегодня все, подписываемся и ждем следующую часть!