Дальше самое интересное! Прошу обратить внимание - дзен режет табуляцию, поэтому скрипты будут выглядеть немножко неприятно.
Не забудьте подписаться - чем больше подписчиков, тем больше переводов))
Advanced Concepts (Расширенные концепции)
Preprocessor (Препроцессор)
Препроцессор используется для исключения элементов кода из интерпретации. Вот как это работает:
USE_CODE_IF(<condition>) . . .
END_USE_CODE
или же
USE_CODE_IF_NOT(<condition >) . . .
END_USE_CODE
< condition > относится к символическому имени, которое состоит из буквенно-цифровых символов, которым предшествует буква. Вы могли бы написать, например:
on note
{do something general} {Делать что-нибудь}
$var := 5
{do some conditional code} { сделать некоторый условный код}
USE_CODE_IF_NOT(dont_do_sequencer)
while ($count > 0)
play_note()
end while
END_USE_CODE
end on
Что тут происходит?
Только если символ Dont_do_sequencer не определен, код между USE и END_USE будет обработан. Если бы символ был найден, код не был бы передан синтаксическому анализатору; это как если бы код никогда не был написан (поэтому он не использует мощность процессора).
Вы можете определить символы с помощью
SET_CONDITION(<condition symbol>)
и удалите определение с помощью
RESET_CONDITION(<condition symbol>)
Все команды будут интерпретироваться before скрипт работает, т.е. с помощью USE_CODE_ код может зависнуть до того, как он будет передан обработчику сценариев. Это означает, SET_CONDITION, а также RESET_CONDITION на самом деле не являются настоящими командами: их нельзя использовать в if()...end if заявления; также wait()оператор перед этими командами бесполезен.
Каждый SET_CONDITION, а также RESET_CONDITION будет выполнен до того, как произойдет что-то еще. Все определенные символы передаются последующим скриптам, т.е. если скрипт 3 содержит условный код, вы можете включить или выключить его в скрипте 1 или 2.
Вы можете использовать условный код для обхода системных скриптов. Есть два встроенных символа:
55
NO_SYS_SCRIPT_PEDAL
NO_SYS_SCRIPT_RLS_TRIG
Если вы определите один из этих символов с помощью SET_CONDITION(),соответствующая часть системных скриптов будет пропущена. Для ясности эти определения всегда должны иметь место в init callback..
on init
{we want to do our own release triggering}
{мы хотим запустить собственный выпуск}
SET_CONDITION(NO_SYS_SCRIPT_RLS_TRIG)
end on
on release
{do something custom here}
{сделайте здесь что-нибудь нестандартное}
end on
56
Engine Parameter (Параметр двигателя)
General Syntax (Общий синтаксис)
Все автоматические параметры Kontakt можно контролировать с помощью KSP. Общий синтаксис следующий:
_set_engine_par(<parameter>,<value>,<group>,<slot>,<generic>)
_set_engine_par(<параметр>,<значение>,<группа>,<слот>,<общий>)
управлять любым автоматическим параметром Kontakt из KSP
<parameter>
Здесь вы указываете параметр, которым нужно управлять с помощью встроенной переменной.
Все эти встроенные переменные начинаются с $ENGINE_PAR_ ,например
$ENGINE_PAR_VOLUME
$ENGINE_PAR_TUNE
$ENGINE_PAR_CUTOFF
Вы можете найти список всех параметров Kontakt в приложении к данному руководству.
<value> Значение, которое задано для указанного параметра. Диапазон значений всегда от 0 до 1000000.
<group> Индекс (с нуля) группы, в которой находится указанный параметр. Если указанный параметр находится на уровне инструмента, введите -1. индекс слота (отсчитываемый от нуля) указанного параметра применяется только к групповым эффектам, инструментальной вставке и эффектам посыла и модуляторам.
<slot> Для эффектов группы/инструмента этот параметр указывает слот, в котором находится эффект (отсчитывается от нуля). Для внутренних модуляторов этот параметр определяет назначение модуляции на основе порядка создания. Для внешних модуляторов этот параметр определяет модуль модуляции. Для всех других приложений установите этот параметр на -1.
<generic> Этот параметр применяется к эффектам инструментов (Send/Insert) и к внутренним модуляторам. Для инструментальных эффектов этот параметр различается между
1: Insert Effect
0: Send Effect
Для внутренних модуляторов этот параметр указывает фактическое назначение модуляции. Для всех других приложений установите этот параметр на -1.
Одно слово предостережения, прежде чем мы углубимся в это: эта команда применима только к параметрам Kontakt, которые доступны для автоматизации, то есть ручкам и ползункам. Кроме того, ручка Bypass всех фильтров и эффектов доступна в качестве параметра движка.
57
Еще одно предостережение: поскольку эта команда не что иное, как дистанционное управление параметром, как автоматизация. Это также означает, что изменение значений может потребовать интенсивного использования ЦП (точно так же, как автоматизация).
Мы можем разделить параметры Kontakt на четыре группы:
• "Основные" параметры, т.е. параметры, доступные для каждого инструмента (настройка инструмента, панорама и громкость; групповая настройка, панорама и громкость)
• Групповые и инструментальные эффекты
• Внешние модуляторы
• Внутренние модуляторы
В следующих четырех главах мы продемонстрируем каждый сценарий на нескольких примерах сценариев.
Для простоты вам не нужно использовать _set_engine_par для управления параметрами, поскольку MIDI-события, генерируемые set_controller также может использоваться для автоматизации параметров.
58
Basic Procedure (Основная процедура)
Следующий скрипт просто создает ручку, которая управляет громкостью инструмента; Ни больше ни меньше:
on init
declare ui_knob $Volume (0,1000000,1000000)
end on
on ui_control ($Volume)
_set_engine_par($ENGINE_PAR_VOLUME,$Volume,-1,-1,-1)
end on
Важно запомнить порядок последних трех параметров: группа/слот/общий. В нашем примере выше,
• группа параметр установлен на -1 так как мы обращаемся к чему-то на instrumentlevel
• слот параметр установлен на -1 так как он не имеет здесь никакой функции
• универсальный параметр установлен на -1 так как он не имеет здесь никакой функции
Если вместо этого мы хотим управлять громкостью группы, мы пишем:
on init
declare ui_knob $Volume (0,1000000,1000000)
end on
on ui_control ($Volume)
_set_engine_par($ENGINE_PAR_VOLUME,$Volume,0,-1,-1)
end on
Теперь ручка управляет громкостью первой группы, т.к. группа параметр был
установлен на 0: _set_engine_par($ENGINE_PAR_VOLUME,$Volume,0,-1,-1)
Однако ручка всегда будет регулировать громкость только первой группы, независимо от количества групп в инструменте.
Посмотрите следующий пример:
on init
declare $count
declare ui_menu $group_menu
while ($count < $NUM_GROUPS)
add_menu_item ($group_menu,group_name($count),$count)
inc($count)
end while
declare ui_knob $Pan (0,1000000, 1000000)
end on
on ui_control ($Pan)
_set_engine_par($ENGINE_PAR_PAN,$Pan,$group_menu,-1,-1)
end on
Здесь в обратном вызове инициализации создается раскрывающееся меню с именами групп всех групп в инструменте. Если вы измените ручку, положение панорамирования выбранной группы будет изменено.
Конечно, если вы сделаете какие-либо изменения в количестве групп в вашем инструменте или если вы измените названия групп в вашем инструменте, изменения в меню отразятся не сразу. Либо нажмите «Apply» еще раз, либо сохраните и перезагрузите инструмент (помните, что обратный вызов инициализации обрабатывается, когда вы нажимаете «Apply», или открываете сценарий из меню «Сценарий», или когда вы загружаете инструмент).
59
Working with Group/Inst rument Ef fects (Работа с групповыми/инструментальными эффектами)
Теперь давайте настроим частоту среза фильтра, который применяется как групповой вставной эффект (мы опустим общее групповое меню выше, чтобы сэкономить место, и применим все к первой группе). Сначала создайте пустой инструмент и вставьте фильтр в третий слот, затем введите следующий скрипт:
on init
declare ui_knob $Freq (0,1000000,1000000)
end on
on ui_control ($Freq)
_set_engine_par($ENGINE_PAR_CUTOFF,$Freq,0,2,-1)
end on
Теперь ручка управляет частотой среза фильтра в третем слоте в первой группе, просто потому что:
• группа параметр установлен в 0, так как мы обращаемся к первой группе
• слот Параметр установлен на 2, так как мы ищем эффект в третьем слоте
• универсальный параметр установлен на -1 так как он не имеет здесь никакой функции
Два небольших замечания:
• встроенная переменная $ENGINE_PAR_CUTOFF действует для всех типов фильтров
• если в указанном слоте нет фильтра, ручка просто ничего не сделает.
Давайте закончим этот небольшой скрипт, добавив кнопку Bypass:
on init
declare ui_knob $Freq (0,1000000,1000000)
declare ui_button $Bypass
end on
on ui_control ($Freq)
_set_engine_par($ENGINE_PAR_CUTOFF,$Freq,0,2,-1)
end on
on ui_control ($Bypass)
_set_engine_par($ENGINE_PAR_EFFECT_BYPASS,$Bypass,0,2,-1)
end on
60
Working with external modulators (Работа с внешними модулями)
Теперь сделаем еще один шаг: предположим, у нас есть простой патч с фильтром в качестве эффекта групповой вставки. Частота среза модулируется скоростью, и мы хотим контролировать количество модуляции с помощью _set_engine_par команда. Так как Velocity — внешний модулятор, мы используем встроенную переменную: $ENGINE_PAR_EXTMOD_INTENSITY
Создайте новый инструмент, поместите фильтр в первый слот Group Insert FX и назначьте скорость для модуляции частоты среза фильтра. Затем введите следующий скрипт:
on init
declare ui_knob $Mod (0,1000000,1000000)
end on
on ui_control ($Mod)
_set_engine_par($ENGINE_PAR_EXTMOD_INTENSITY,$Mod,0,2,-1)
end on
Теперь скрипт должен управлять ползунком модуляции, но не обязательно…
В нашем скрипте мы присвоили индексу слота (четвертый параметр) значение 2. Индекс слота определяет, какое из назначений модуляции адресовано. Внутренняя нумерация индексов слотов определяется порядком их создания. Таким образом, когда у вас есть три назначения внешних модов (например, усиление скорости, изменение высоты тона, отсечка скорости), индекс слота соответствующих назначений зависит от того, когда эти назначения были созданы.
Давайте посмотрим на инструмент:
Когда вы создаете новый инструмент, обычно velocity → volume иpitch bend → pitch уже назначены, поэтому индексы слотов 0 и 1 уже заняты. Однако, если ваш инструмент по умолчанию уже имеет больше назначений, вам нужно поэкспериментировать, чтобы найти правильный индекс слота.
При удалении модуля индексы слотов не меняются! Кроме того, при удалении задания и повторном вводе того же назначения индекс слота будет таким же!
62
Итак, в приведенном выше примере давайте предположим, что velocity → назначение volume имеет индекс слота 0.
Если вы удалите назначение, а позже назначите velocity для управления громкостью, это назначение снова будет иметь индекс слота 0.
Working with internal modulators (Работа с внутренними модулями)
Внутренние модуляторы представляют собой огибающие (AHDSR, DBD, гибкие) и LFO. Как и внешние назначения модов, индекс слота является решающим фактором и ведет себя аналогично. Однако <generic > параметр (пятый параметр) тоже играет роль, поэтому при работе с внутренними модуляторами запомните следующее:
<slot > Параметр указывает модуль модуляции.
<generic > (общий ) Параметр указывает фактическое назначение модуляции.
<slot > Параметр указывает модуль модуляции.
<generic > (общий ) Параметр указывает фактическое назначение модуляции.
имеется только один внутренний модулятор (который, вероятно, был создан первым), поэтому мы обращаемся к нему с индексом слота 0.
63
Теперь еще один шаг вперед, мы хотим управлять интенсивностью мод этой огибающей (хорошо, не имеет особого смысла контролировать интенсивность огибающей громкости, но это служит цели нашего объяснения).
Обратите внимание на использование <generic > параметр:
on init
declare ui_knob $Mod (0,1000000,1000000)
end on
on ui_control ($Mod)
_set_engine_par($ENGINE_PAR_INTMOD_INTENSITY,$Mod,0,0,0)
end on
Теперь ручка скрипта управляет интенсивностью мода:
Теперь рассмотрим следующее: приведенная выше огибающая не только модулирует громкость, но и отсечку фильтра (комбинированную огибающую громкости/фильтра). Создайте фильтр и назначьте существующую огибающую для модуляции частоты среза. Теперь мы хотим управлять отсечкой окружения с помощью ручки скрипта:
on init
declare ui_knob $Mod (0,1000000,1000000)
end on
on ui_control ($Mod)
_set_engine_par($ENGINE_PAR_INTMOD_INTENSITY,$Mod,0,0,1)
end on
64
Параметру <generic> присвоено значение 1, чтобы различать назначение между env → volume и
env → cutoff:
Получение значений параметров (т. е. то, что растет, должно снижаться)
Вы можете не только отправлять определенные значения в автоматические параметры Kontakt из KSP, но и получать эти значения. Основной синтаксис следующий:
_get_engine_par(<параметр>,<группа>,<слот>,<общий>)
возвращает значение любого автоматизируемого параметра Kontakt из KSP
Итак, давайте вернемся к самому первому сценарию, который мы написали, используя _set_engine_par. Мы можем использовать приведенную выше команду для получения настройки ручки в обратном вызове инициализации:
on init
declare ui_knob $Volume (0,1000000,1000000)
$Volume := _get_engine_par($ENGINE_PAR_VOLUME,-1,-1,-1)
end on
on ui_control ($Volume)
_set_engine_par($ENGINE_PAR_VOLUME,$Volume,-1,-1,-1)
end on
Теперь всякий раз, когда обрабатывается обратный вызов инициализации, ручка сбрасывается на правильный уровень громкости инструмента.
65
Вот реальный сценарий сценария:
on init
declare ui_label $label (1,1)
set_text ($label,"Select Group:")
declare $count
declare ui_menu $group_menu
while ($count < $NUM_GROUPS)
add_menu_item ($group_menu,group_name($count),$count)
inc($count)
end while
declare ui_knob $Volume (0, 100, 1)
declare ui_knob $Pan (-100, 100, 1)
declare ui_knob $Tune (-1200, 1200, 100)
$Volume := _get_engine_par($ENGINE_PAR_VOLUME,0,0,1) / 10000
$Pan := _get_engine_par($ENGINE_PAR_PAN,0,0,1) / 5000 -100
$Tune := _get_engine_par($ENGINE_PAR_TUNE,$group_menu,0,1)*24/10000-
1200
move_control ($label,1,1)
move_control ($group_menu,1,2)
move_control ($Volume,2,1)
move_control ($Pan,3,1)
move_control ($Tune,4,1)
make_perfview
end on
on ui_control ($Volume)
_set_engine_par($ENGINE_PAR_VOLUME,$Volume * 10000,$group_menu,0,-1)
end on
on ui_control ($Pan)
_set_engine_par($ENGINE_PAR_PAN,($Pan+100) * 5000,$group_menu,0,-1)
end on
on ui_control ($Tune)
_set_engine_par($ENGINE_PAR_TUNE,($Tune +
1200)*100000/240,$group_menu,0,-1)
end on
on ui_control ($group_menu)
$Volume := _get_engine_par($ENGINE_PAR_VOLUME,$group_menu,0,1) /
10000
$Pan := _get_engine_par($ENGINE_PAR_PAN,$group_menu,0,1) / 5000 -100
$Tune := _get_engine_par($ENGINE_PAR_TUNE,$group_menu,0,1)*24/10000-
1200
end on
Вы получите красивое и простое представление производительности с тремя основными параметрами, доступными для настройки:
66
Module s tatus ret r ieval (Получение статуса модуля)
Комбинируя команду _get_engine_par и следующие пять встроенных переменных:
$ENGINE_PAR_EFFECT_TYPE
$ENGINE_PAR_EFFECT_SUBTYPE
$ENGINE_PAR_SEND_EFFECT_TYPE
$ENGINE_PAR_INTMOD_TYPE
$ENGINE_PAR_INTMOD_SUBTYPE
вы можете получить информацию о том, какой модуль используется в каком слоте. По сути, это расширенный инструмент для создания общих меню, основанный на составе инструмента Kontakt.
Существуют встроенные переменные для любого типа эффекта, например $EFFECT_TYPE_FILTER или же $EFFECT_TYPE_REVERB, пожалуйста, проверьте приложение для полного списка.
Использование этой команды можно лучше всего объяснить с помощью следующих небольших скриптов.
Этот скрипт проверяет, используется ли фильтр как групповой вставной эффект во втором слоте первой группы:
on init
if (_get_engine_par($ENGINE_PAR_EFFECT_TYPE,0,1,-1) =
$EFFECT_TYPE_FILTER)
message ("There's a filter in the second slot of the first group, hooray!")
{Во втором слоте первой группы есть фильтр, ура!}
else
message ("There's no filter in the second slot of the first group, boooo!")
{Во втором слоте первой группы нет фильтра, буооо!}
end if
end on
Заявление _get_engine_par($ENGINE_PAR_EFFECT_TYPE,0,1,-1) возвращает эффект
тип второго слота (индекс слота = 1; третий параметр) первой группы (индекс группы = 0; второй параметр). Общий параметр был установлен в -1, так как здесь он не имеет значения.
Упомянутый выше оператор на самом деле возвращает целое число от нуля до 20 (встроенная переменная $EFFECT_TYPE_FILTER имеет значение 7).
Используя следующий массив строк:
declare !effect_name[21]
!effect_name[0] := "None"
!effect_name[2] := "Compressor"
!effect_name[3] := "Limiter"
!effect_name[4] := "Inverter"
!effect_name[5] := "Surround Panner"
!effect_name[6] := "Saturation"
!effect_name[7] := "Filter"
!effect_name[8] := "Lo-Fi"
!effect_name[9] := "Stereo Modeller"
!effect_name[10] := "Distortion"
!effect_name[11] := "Send Levels"
!effect_name[14] := "Phaser"
!effect_name[15] := "Flanger"
!effect_name[16] := "Chorus"
!effect_name[17] := "Reverb"
!effect_name[18] := "Delay"
!effect_name[19] := "Convolution"
!effect_name[20] := "Gainer"
вы можете легко получить имя любого эффекта. Итак, давайте перепишем приведенный выше скрипт следующим образом:
67
on init
declare !effect_name[21]
!effect_name[0] := "None"
!effect_name[2] := "Compressor"
!effect_name[3] := "Limiter"
!effect_name[4] := "Inverter"
!effect_name[5] := "Surround Panner"
!effect_name[6] := "Saturation"
!effect_name[7] := "Filter"
!effect_name[8] := "Lo-Fi"
!effect_name[9] := "Stereo Modeller"
!effect_name[10] := "Distortion"
!effect_name[11] := "Send Levels"
!effect_name[14] := "Phaser"
!effect_name[15] := "Flanger"
!effect_name[16] := "Chorus"
!effect_name[17] := "Reverb"
!effect_name[18] := "Delay"
!effect_name[19] := "Convolution"
!effect_name[20] := "Gainer"
message (!effect_name[_get_engine_par($ENGINE_PAR_EFFECT_TYPE,0,1,-1)])
end on
Теперь этот скрипт выведет название эффекта второго слота первой группы. Если вы хотите получить информацию об insert effects инструмента, последнюю команду нужно будет переписать в
message (!effect_name[_get_engine_par($ENGINE_PAR_EFFECT_TYPE,-1,1,1)])
поскольку:
• второй параметр определяет уровень инструмента (-1)
• третий параметр указывает второй слот (1)
• четвертый параметр определяет встроенный эффект (1)
Бывают случаи, когда вам нужна информация о том, какой фильтр используется, поэтому давайте предположим, что вы знаете, что у вас есть фильтр в первом слоте первой группы. Используя $EFFECT_SUBTYPE вы можете получить тип фильтра:
on init
declare !filter_name[25]
!filter_name[2] := "1-pole LP"
!filter_name[3] := "1-pole HP"
!filter_name[4] := "2-pole BP"
!filter_name[6] := "2-pole LP"
!filter_name[7] := "2-pole HP"
!filter_name[8] := "4-pole LP"
!filter_name[9] := "4-pole HP"
!filter_name[10] := "4-pole BP"
!filter_name[11] := "4-pole BR"
!filter_name[12] := "6-pole LP"
!filter_name[13] := "Phaser"
!filter_name[14] := "Vowel A"
!filter_name[15] := "Vowel B"
!filter_name[16] := "Pro 53"
!filter_name[17] := "4-stage ladder"
!filter_name[19] := "3x2"
!filter_name[22] := "1-band EQ"
!filter_name[23] := "2-band EQ"
!filter_name[24] := "3-band EQ"
message (!filter_name[_get_engine_par($ENGINE_PAR_EFFECT_SUBTYPE,0,0,-1)])
end on
Теперь давайте сделаем то же самое с эффектами посыла инструмента; здесь мы используем встроенную переменную
$ENGINE_PAR_SEND_EFFECT_TYPE, поэтому, если мы хотим знать, какой эффект находится в первом слоте эффекта посыла, мы пишем:
68
on init
declare !effect_name[21]
!effect_name[0] := "None"
!effect_name[14] := "Phaser"
!effect_name[15] := "Flanger"
!effect_name[16] := "Chorus"
!effect_name[17] := "Reverb"
!effect_name[18] := "Delay"
!effect_name[19] := "Convolution"
!effect_name[20] := "Gainer"
message
(!effect_name[_get_engine_par($ENGINE_PAR_SEND_EFFECT_TYPE,-1,0,-1)])
end on
Loading IR Samples (Загрузка образцов ИК)
Можно загрузить образцы импульсов в эффект с помощью следующей команды:
load_ir_sample(<file name>,<slot>,<generic>)
загрузить образец импульсного отклика в эффект Kontakt
<file name>> имя файла образца. Должен использоваться относительный путь.
<slot> индекс слота эффекта свертки (с нуля)
<generic> указывает, используется ли эффект свертки в качестве
эффекта вставки (1)
Отправить Эффект (0)
Проблемным вопросом здесь является правильный путь к образцу. Чтобы обеспечить кроссплатформенную совместимость, всегда используйте относительный путь с помощью этой команды:
get_folder(<path variable>) (_get_folder(<переменная )пути>)
возвращает путь, указанный с помощью встроенной переменной path
и эти три встроенные переменные пути:
$GET_FOLDER_INSTALL_DIR
каталог установки Kontakt 2
$GET_FOLDER_LIBRARY_DIR
каталог библиотеки (устанавливается в Options/Load-Import)
$GET_FOLDER_PATCH_DIR
каталог, в котором был сохранен патч. Если патч не был сохранен ранее, возвращается пустая строка.
Итак, давайте предположим, что у нас есть образец импульсной характеристики под названием «Super Hall.wav», и он находится в каталоге установки Kontakt. С помощью скрипта, такого как:
on init
declare ui_button $Load
end on
on ui_control ($Load)
69
_load_ir_sample(_get_folder($GET_FOLDER_INSTALL_DIR) ...
& "Super Hall.wav",0,1)
$Load := 0
end on
сэмпл загружается в эффектconvolution (который сам указан как находящийся в цепочке вставок в первом слоте) всякий раз, когда нажимается кнопка.
Конечно, в каталоге установки Kontakt 2 должен быть образец под названием «Super Hall.wav», иначе вы получите предупреждающее сообщение.
Поскольку Kontakt 2 поставляется с набором пресетов и семплов convolution, вот пример сверху, указывающий на образец «Super Hall.wav», который находится здесь:
Kontakt 2/presets/effects/convolution/06 Medium Rooms/IR Samples/warm room.wav
Таким образом, правильная команда будет
_load_ir_sample(_get_folder($GET_FOLDER_INSTALL_DIR)...
& "presets/effects/convolution/06 Medium Rooms/IR Samples/warm room.wav",0,1)
Указание, когда считываются постоянные переменные
Можно указать точный момент считывания персистентных переменных:
_read_persistent_var(<переменная>)
считывает значение указанной постоянной переменной в обратном вызове инициализации
Обычно все постоянные переменные устанавливаются ПОСЛЕ обратного вызова инициализации. С
_read_persistent_var(), постоянные переменные могут быть сохранены в любом месте обратного вызова инициализации. Если значение читается с _read_persistent_var(), значение, конечно, не считывается снова после обратного вызова инициализации.
Эта команда очень полезна, если пользователь может сделать определенные элементы графического интерфейса видимыми или невидимыми, а загруженный патч должен вызывать последнее состояние графического интерфейса. См. следующий скрипт:
70
on init
declare ui_button $Sync
declare ui_menu $time
add_menu_item ($time,"16th",0)
add_menu_item ($time,"8th",1)
$Sync := 0
{sync is off by default, so hide menu}
{синхронизация по умолчанию отключена, поэтому скройте меню}
move_control ($time,0,0)
move_control ($Sync,1,1)
make_persistent ($Sync)
make_persistent ($time)
_read_persistent_var ($Sync)
if ($Sync = 1)
move_control ($time,2,1)
else
move_control ($time,0,0)
end if
end on
on ui_control ($Sync)
if ($Sync = 1)
move_control ($time,2,1)
else
move_control ($time,0,0)
end if
end on
В зависимости от состояния кнопки отображается меню или нет. Используя _read_persistent_var ($Sync),вы можете получить последнее сохраненное состояние кнопки и, следовательно, решить показать или скрыть меню.
71
На сегодня все, подписываемся и ждем следующую часть!