JS Плагины - обсуждение

@Ortseam мне тоже, но разработчики решили иначе.

суммировать, вычесть, перемножить
Их можно располагать в несколько рядов и клеить, если надо. Этот клей и позволяет суммировать и т.д. Мне вообще хотелось бы, чтобы открыл настройки такого айтема и направил его на любой параметр проекта.
 
чтобы открыл настройки такого айтема и направил его на любой параметр проекта
Вот и я о том же. Просто иметь возможность связать кривые стандартного айтема с параметрами обработок вне его. Больше ничего и не надо было бы.
 
Просто иметь возможность связать кривые стандартного айтема с параметрами обработок вне его. Больше ничего и не надо было бы.
А наверное это можно сделать. Они же и в API кучу функций добавили -
API: add InsertAutomationItem, GetSetAutomationItemInfo, CountEnvelopePointsEx, GetEnvelopePointEx, GetEnvelopePointByTimeEx, SetEnvelopePointEx, InsertEnvelopePointEx, DeleteEnvelopePointRangeEx, Envelope_SortPointsEx
 
  • Like
Реакции: Ortseam
есть ли какая-нибудь команда типа do nothing?
В принципе, не имею ничего против и такого варианта. Но всегда кажется, что без лишних процедур с назначением переменных лучше ))
Код:
    while (midirecv(offset,msg1,msg2,msg3)) ( // REAPER 4.59+ syntax while()
       msg1==$x90 && msg3!=0 ? (
         noteon_cnt+=1; // count note-ons
       ) : (
         midisend(offset,msg1,msg2,msg3); // passthrough other events
       )
    );
 
не могу понять, почему в этом плагине у меня никак не меняется первый миди-байт.
только два последних принимаются с миди-трека, причем не в старой риперовской системе, а нормальное значение ноты типа "65"
миди.png

Код:
desc:simple keyswitch midi-processor for Siberian Samples RFS

slider1:0<0,11,1{C,Cis,D,Dis,E,F,Fis,G,Gis,A,Ais,H,}>trem KS
slider2:1<0,11,1{C,Cis,D,Dis,E,F,Fis,G,Gis,A,Ais,H,}>pluck KS
slider3:2<0,11,1{C,Cis,D,Dis,E,F,Fis,G,Gis,A,Ais,H,}>stacc KS
slider4:5<1,10,1{-2,-1,0,1,2,3,4,5,6,7}>octave
slider5:1<0,1,1>-trem state
slider6:0<0,1,1>-pluck state
slider7:0<0,1,1>-stacc state

@init
trem=slider5;
pluck=slider6;
stacc=slider7;

@slider
tremKS=12*slider4+slider1;
pluckKS=12*slider4+slider2;
staccKS=12*slider4+slider3;


@block
//on midi in loop
while (midirecv(offset,msg1,slider9,slider10)) (
  //tremKS checking
  msg1=0x90&&msg2=tremKS&&msg3!=0 ?(
  trem=1;
  pluck=0;
  stacc=0;
  );/*
  //pluckKS checking
  msg1=0x90&&msg2=pluckKS&&msg3!=0 ?(
  trem=0;
  pluck=1;
  stacc=0;
  );
  //tremKS checking
  msg1=0x90&&msg2=staccKS&&msg3!=0 ?(
  trem=0;
  pluck=0;
  stacc=1;
  );
  trem==1? (
  midisend (offset,msg1,msg2,msg3);
  );
  pluck==1? (
  midisend (offset,msg1+1,msg2,msg3);
  );
  stacc==1? (
  midisend (offset,msg1+2,msg2,msg3);
  );
  slider5=trem;
  slider6=pluck;
  slider7=stacc;*/
);
P.S. вот я дебил. Синтаксис, Шура, синтаксис.
 
Последнее редактирование:
  • Like
Реакции: bloodykot
Люди добрые, скажите, как выявлять какой слайдер мы тронули? Они ж по-умолчанию под одной гребенкой все...
А вот если был тронут 2 слайдер, значит 3 равен 5. и более сложные конструкции.
Допустим, когда трогаем третий слайдер, сохраняем его новое значение в переменную, если второй слайдер равен 1. А потом назначаем слайдер 2 на 0.
А вот если трогаем второй слайдер и выставляем его на 1, он на 0 не возвращается.
Код:
@slider
slider2==1?(
Out_01_Type = slider3;
slider2=0;
);
 
есть у меня тут мысля это через персональную переменную для старого знаения слайдера это делать в секции блок или семпл, но не жирно ли?
тем более, что плагинов таких в одном проекте предполагается докуя...
 
Тронут ли какой-то слайдер можем вычислять сранивая текущее и последующее значение его параметра. Изменилось - тронули, не изменилось - не трогали значит.
 
Последнее редактирование:
  • Like
Реакции: PianoIst
и сюда несрочный но интересный вопрос. Мы никак не можем изменить "текст" значений слайдера после объявления оного?
Скажем в какой-то момент поменять
slider1:0<0,1,1{one,two}>-
на
slider1:0<0,1,1{three,four}>-
 
Думаю - нет.
Но вопрос ты задал из середины.... :)
Может решить задачу, которую ты не объявил, можно и каким либо иным образом,
 
@Aleksandr Oleynik, И правда вопрос из середины. Задача стара как мир, отправить с рипера string по OSC на девайс. Более того я уже понял, что вообще не с того конца зашел, ибо это только отображение, но не значение. А значение в стринге быть не может, т.к. хост...
 
Значение из стринга нужно делать в приёмнике... Иначе ни как.
Если нужен параметр, то его сразу и передавать нужно, в соотвествии с настройками конфиг osc файла Рипера.
 
Можно сделать что-то и по-круче намного. Чисто для JS(там есть особенности).
Больше всего в скриптах, особенно в EEL, и особенно в JS задалбывает графика.
Не потому что это чем-то сложно, наоборот, это неинтересно абсолютно... Как говорится, есть дела поважнее.
В чем фокус JS-слайдеров, по сравнению со скриптами или нарисоваными вручную в JS?
В JS есть родные слайдеры, 64 штуки. С ними очень быстро можно делать эксперименты.
По сути - написав всего одну строку мы имеем сам слайдер со всеми потрохами, переменную со значением,
которое можно взять-установить, повлияв на все остальное, сохраняемый параметр - для пресетов, автоматизацию(передачу значения из хоста и в хост) и т.п.
Используя только родные слайдеры не нужно заботится об автоматизации, сериализации и прочей х..не.
В чем недостаток?
Недостаток очевиден, когда слайдеров становиться более 10-15 штук. Уже даже визуально трудно ориентироваться.
Кроме этого - каждая переключаемая хренюшка требует целый слайдер, это зря отнимает рабочее пространство.
===============
В варианте, который приведен выше, я предложил возможность привязаться к родным JS-слайдерам любыми собственными элементами.
Смысл ясен, только допилить. То есть, использовать свойства родных слайдеров, но свою графику.
Мысль вполне обычная. Разработчик Jeez - сделал "Soda", разработчики в Рипере тоже привязывают, некоторые другие плагины с графикой привязаны, но это уже реже.
Если кто-то скачал и попробовал(пару человек скачало, уже ох..но), то мог заметить, что мышь у меня реализована полностью аналогично родным слайдерам -
двойной клик - сброс, ctrl - точная настойка. Сами элементы(в этом простом случае - кнобы) - тоже содержат все параметры, включая step и прочее.
Остальные кнопки мыши - правая,средняя - поддерживаются точно так же, мышь получилась крутая, и с минимумом кода.
Что мне не нравится в этом решении?
1) Приходится в инициализации вручную дублировать параметры родных слайдеров - вроде и не проблема, но параметров много и если нужно что-то поменять - это сильно задалбывает.
2) Мне просто все не нравится, некрасиво...
3) Хотелось бы так - скрыл родной, указал линкованный слайдер, картинку и координаты - (idx, img_file, x,y,w,h) - и вся любовь. Никакой возни, любые картинки, любые координаты, любые значения.
4) А почему бы и нет?
5) И бл.., вопрос решен, такой крутячок получится для JS.
6) "прелесть" в православии называется, вопрос спорный - но сделал...сам, но "прелесть"...
7) Буду пить.
 
  • Like
Реакции: PianoIst
А зря. Змия душить надо.
О змеях и змиях. Раньше увлекался философией. Много всякого читал. И не знаю почему - но только Ницше запомнился.
Там притчи - натуральные стихи, даже в переводе, это надо уметь так КРАСИВО писать. Некоторые я помню почти наизусть, спустя 15 лет, в том числе и "об укусе змеи".
Однажды Заратустра заснул под смоковницей, ибо было жарко, и положил руку на лицо свое. Но приползла змея и укусила его в шею, так что Заратустра вскрикнул от боли. Отняв руку от лица, он посмотрел на змею; тогда узнала она глаза Заратустры, неуклюже отвернулась и хотела уползти. "Погоди, – сказал Заратустра, – я еще не поблагодарил тебя! Ты разбудила меня кстати, мой путь еще долог". "Твой путь уже короток, – ответила печально змея, – мой яд убивает". Заратустра улыбнулся. "Когда же дракон умирал от яда змеи? – сказал он. – Но возьми обратно свой яд! Ты недостаточно богата, чтобы дарить мне его". Тогда змея снова обвилась вокруг его шеи и начала лизать его рану.

Когда Заратустра однажды рассказал это ученикам своим, они спросили: "В чем же мораль рассказа твоего, о Заратустра?" Заратустра так отвечал на это:— Разрушителем морали называют меня добрые и праведные: мой рассказ неморален.

возможно, перевод, но моя версия в памяти более проста
Однажды Заратустра заснул под смоковницей, ибо было жарко. Но приползла змея и укусила его в шею, так что Заратустра проснулся и вскрикнул от боли.
Отняв руку от лица, он посмотрел на змею; тогда она узнала она глаза Заратустры, неуклюже отвернулась и хотела уползти. "Погоди, – сказал Заратустра, – я еще не поблагодарил тебя! Ты разбудила меня кстати, мой путь еще долог".
"Твой путь уже короток, – ответила печально змея, – мой яд убивает". Заратустра улыбнулся! "Когда же дракон умирал от яда змеи? – сказал он. – На, возьми обратно свой яд! Ты недостаточно богата, чтобы дарить мне его". Тогда змея снова обвилась вокруг его шеи и начала лизать его рану.
Когда Заратустра однажды рассказал это ученикам своим, они спросили: "В чем же мораль рассказа твоего, о Заратустра?" Заратустра так отвечал на это:
Разрушителем морали называют меня добрые и праведные: мой рассказ аморален.
==========
Кстати, почему Заратустра не подает милостыни, интересный вопрос - недостаточно беден - не ответ. Вернее. ответ, но не для нас...
 
Последнее редактирование:
  • Like
Реакции: mitinglas и vitalker
PHP:
function jsl_knob_GetJSslider(idx)
  local(handle, pattern, retval, str, s1,s2, def_val, min_val, max_val, val_step, lbl, val_lbl)
(
  handle = file_open(JS.file);
  //--------------------------
  handle >= 0 ? (
    file_rewind(handle);
    pattern = strcat(strcpy(#, "slider"), sprintf(#, "%d", idx));
    pattern = strcat(pattern, ":*?%f*?<*?%f*?,*?%f*?,*?%f*?>*?%s");
    retval = 0;
    str = #; lbl = #;
    while(file_string(handle, str) > 0 && !retval ) (
      retval = match(pattern, str, def_val, min_val, max_val, val_step, lbl);
    );
    file_close(handle);
  );
 
  //--------------------------
  retval ? (
    s1=#; s2=#;
    match("-%s", lbl, s1) ? lbl = s1;
    match("*?%s(%s)*", lbl, s1, s2 ) ? (lbl = s1; val_lbl = s2) : val_lbl = "";     
    //------------------------
    this.idx = idx;
    this.val = this.def_val = def_val;
    this.min_val = min_val;
    this.max_val = max_val;
    this.val_step = val_step;
    this.lbl = lbl;
    this.val_lbl = val_lbl; 
  );
  
);

Функция берет все значения из JS - слайдера. Единицы измерения, если нужно, указываются в круглых скобках, например, Threshold (dB).
Единственное, что указывается вручную - сам JS-файл.
 
Еще одна мысль - разработчик Jeez сделал менеджер кучи(heman). Основанный на строках.
Я подумал, сам менеджер кучи мне, например, не нужен - но идея отличная!
Можно сделать маленький аналог таблиц - как в Lua, построить по такому же принципу.
Допустим, на пару десятков кБ - для простых граф. элементов - этого с головой хватит.
 
Ух..вроде все. Добавил в Scope шкалу уровня, отображение значения в позиции курсора и паузу - на правый клик, поисправлял мелкие косяки.
Осталось добавить временную шкалу и смещение-перетаскивание влево-вправо.
Может еще что-то, и мы уделаем все скопы, сейчас не могу засыпаю на ходу прямо.
https://raw.githubusercontent.com/EUGEN27771/JSFX/master/WaveScope
 
Последнее редактирование:
но можно, пожалуйста, поярче форму волны. Идеальный вариант был бы выбор цвета, яркости и сглаживание
Вот это очень ДА, т.к. у кого с глазами проблема - все надо подбирать индивидуально! @EUGEN27771, если сложно или нет времени то можно хотя бы инструкцию в какой строчке в тексте менять значения для цвета волны.
 
Позавчера, когда практиковал метод научного тыка, мне показалось, что _global.x работает и в скриптах, то-есть, можно с помощью этих переменных отправлять значения из скрипта в JS плагин. А сегодня чего-то хрень какая-то... В какой раз я был не прав?
 
пожалуйста, поярче форму волны
Цвет волны можно поменять прямо сейчас, в начале кода:
r1=0.6; g1=0.3; b1=0.3; a1=0.2; // для первой
r2=0.3; g2=0.6; b2=0.3; a2=0.2; // для второй
Тут он указан в формате 0...1, если хотите указать в формате 0...255, просто добавьте /255;
То есть вот так -
r1 = 50/255; // ( для значения, например, 50);
g1=80/255; // ( для значения, например, 80);
и так далее.
========
Контур волны пока зависит от осн. цвета, просто чуть светлее, на a + 0.2, поэтому, не ставьте в цвете волны a1 и a2 - более 0.8(в норм. значениях)!
По графике в Scope - @HDVulcan, написал очень много хороших и детальных советов, буду доделывать постепенно.
========
Еще хотелось бы тактовую сетку (в идеале с возможностью ее менять).
Сетку тоже буду делать, пока мне не совсем понятно, как ее привязать к изм. темпу в этой версии, хоть приблизительно.
С постоянным темпом - проблем нет, а когда темп изменяемый - она не будет соответствовать реальности.
Есть другая версия скоп, где сетка будет ложиться четко, но там другие вопросы не решены.
========
[DOUBLEPOST=1489403935][/DOUBLEPOST]
_global.x работает и в скриптах
Не работает, хотя было бы круто, если бы работало.
 
Последнее редактирование:
@EUGEN27771, Можешь мне залечить про два вопроса?
простой: я не совсем въехал в работу @serialize Он вызывается и при сохранении параметров и при считывании, правильно? Но в функции file_var(), например, мы не указываем, считываем мы значение или записывваем. То-есть, мы можем спокойно вызывать эту функцию единожды, верно? без всякой возни с условиями.

сложный: Я так понял, что eel в принципе объектно-ориентированный, но вроде как через костыли. И вот осознать механику работы с "объектами" я пока не могу. Допустим сейчас на платформе HISE (движок, написанный на JUCE) используется несколько переработанный JavaScript, там объектом может быть почти все что угодно, как и атрибутом. То-есть, можно сделать примерно так:
PHP:
function add(x,y)
{
   x+y;
};

function addParams(param1,param2)
{
   param1.add(1,2);
   param2.add(3,4);
};
object1.addParams();
object2.addParsms();

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

В принципе, спрашиваю все еще в контексте построения интерфейса, хотя и для остальных вещей тоже было бы очень полезно знать как оно здесь функционирует.
 
Последнее редактирование:
То-есть, мы можем спокойно вызывать эту функцию единожды, верно? без всякой возни с условиями.
Да, условия нужны в более сложных ситуациях, когда, например, не нужно записывать новые данные при каких-то обстоятельствах.
В большинстве случаев - file_var или file_mem в секции @serialize для необх. данных - и все.

Я так понял, что eel в принципе объектно-ориентированный, но вроде как через костыли.
Если бы так было... Там используются пространства имен, что позволяет получить некое подобие - в док. прямо написано "псевдо".
В принципе, уже хорошо, хотя хотелось бы большего. Тот пример, что Вы выше привели - вполне будет работать с мин. исправлений.
Что не получится - переназначить "методы"(если уж так называть) , после того, как к ним уже есть обращения. То есть в EEL все функции должны быть определены до вызова,
и еще много всяких проблем и ограничений. Если поизворачиваться, решается. И, учитывая, что люди просто на функциях делают очень крутые вещи - возможности не такие и маленькие.
 
  • Like
Реакции: PianoIst
И, учитывая, что люди просто на функциях делают очень крутые вещи - возможности не такие и маленькие.
да в принципе, в том же KSP функции - единственное, что можно использовать, и то в них нельзя кое-что запихивать. Оно не то, чтобы мешает, просто разница между 20 000 строк и 2 000 есть))) Вот я сейчас в JS и JavaScript уже чувствую ощутимое сокращение рукописного текста, аппетиты и растут)))
 
@EUGEN27771, еще сложный вопрос:
По мануалу я не понял, как происходит навигация по файлу (скажем, текстовому), и как вообще с ними работать.
Ну, понятное дело, что указать в filename:0, а вот что происходит дальше - хз....
Конкретная цель: сделать две кнопки: сохранить пресет\загрузить пресет. Слайдеры для этого использовать низя, т.к. переменных очень много.
Попутно хотелось бы, если это вообще возможно, импортировать имена программ из reabank файлов в соответствующие ячейки, скажем, массива.

P.S> ВообЩЕ да, массив. Научиться бы экспортировать\импортировать хотя бы один массив с фиксированной длинной в разные файлы, этого бы на долгое время хватило.
 
Господа, есть ли плагин, который блокирует все миди-сообщения кроме нот?
 

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