Перевод Справочника по программированию JSFX

  • Автор темы Автор темы belovw
  • Дата начала Дата начала
При определённых условиях возникла потребность в переводе Справочника по программированию JSFX
Перевод делается с помощью Google переводчик. На сколько хватает сил и познаний английского - делаю поправки. Исходный размер документа при шрифте 12 составляет 35 страниц. Перевод делается по абзацам. Т.е. один абзац идет на английском, и следом в этом же документе перевод на русском. Пока так для того что бы исходник всегда был под рукой. Позже английский текст почистим.
Пока переведено 3 страницы. Переведенный английский текст подкрашивается серым цветом. Проверенный и отредактированный русский перевод подкрашивается нежно голубым :))

Так как моих знаний английского не хватает и маловато свободного времени,

Прошу комрадов помочь в данном деле.​

Документ находится на Google доксах.
Любознательные могут получить допуск на просмотр документа.
Желающие помочь получат права на редактирование.

Ребята англичане, кто на каникулах, подключайтесь!!!
 
daicehawk, Спасибо за проделанную работу. Как только напишу новый плагин, ты обязательно получишь 100 процентную скидку на лицензию.

Пока что отредактирована 1/7 часть справочника. Мужики, подключайтесь.
 
Такие вот выражения -
value / divisor
value >> shift_amt
видимо переводить не нужно? Только описание что это значит.


PS: если что-то находим в синем не то - выделяем красным - в скобках после твоего пишем свой вариант подсвеченный красным?
 
PS: если что-то находим в синем не то - выделяем красным - в скобках после твоего пишем свой вариант подсвеченный красным?
Можно и так. Хотя синее это проверенное и типа уже не должно содержать ошибок, но мало ли ))))
Такие вот выражения -
value / divisor
value >> shift_amt
видимо переводить не нужно? Только описание что это значит.
Надо бы.
 
Такие вот выражения -
value / divisor
value >> shift_amt
видимо переводить не нужно? Только описание что это значит.


Бывает, делают еще так:
value / divisor (значение / делитель)
Но если в тексте дофига такого, то может сильно отвлекать, мешать и т.п.

По поводу гуглотранса: есть еще мультитран — там при переводе используется куча тематических словарей, можно выбрать более точно.
 
  • Like
Реакции: belovw
Джентльмены, кто занимается переводом справочника — там есть удобная фича "Комментарии":
Выделяем букву или текст, жмем вверху справа кнопку "Комментарии", пишем свои мысли, замечания и — "Сохранить".
Очень удобно.
 
Последнее редактирование:
еще мультитран


Как-то странно он работает, но правда один раз помого определиться с вариантом перевода.

Далее. Нужно уже начинать подкрашивать окончательно переведённые и проверенные участки текста. Предлагаю зелёный.

Ещё раз выражаю сердечную благодарность всем подключившимся. С меня пиво ;-)
 
А как понять, что они уже проверены.
Я вычитывал уже подкрашенные голубым (это ж вроде как уже переведенные и проверенны?) и то находил и делал много мелких правок.
Я там на полях пооставлял кое-какие замечания.
 
Тогда предлагаю спорные проверенные и подкрашенные участки выносить в коменты.
 
belovw, а где оригинал справочника или имеется ввиду то,что на сайте кокос?
 
Всем привет. Огромное спасибо всем откликнувшимся в этой теме. Без вас я бы не осилил этот объём. Остался небольшой затык по последней главе "User defined functions and namespace psuedo-objects". Вроде переведены всё верно, но доходчивого понимания нет. Видимо нужно уже обладать какими-то знаниями по объектно ориентированному программированию и псевдо-объектам, но к сожалению у меня этого нема.

Сабж: подскажите пожалуйста кто в теме что курить и что копать.
 
  • Like
Реакции: Trasher
"User defined functions and namespace psuedo-objects".
Мне кажется это что-то из C++:0372:На пальцах если,то ближе всего к созданию библиотек функций или наподобии API.А если образно,то это создание описания сложной функции(состоящей из нескольких функций или же возможно даже алгоритма действий какого-либо процесса) в одном файле/нескольких файлах с указанием параметров и упрощенным обозначением самих функций или алгоритмов,к которым в дальнейшем будет обращаться исполняемый файл.Как пример(подглядено у забугорных товаристчей) в файле описании(описание фейдера) через векторную графику без использования растровых изображений будет выглядеть каким-то набором кода(нарисовать прямоугольник в векторе с указанием размеров,цвета и т.д.,нарисовать шкалу-тут надо нарисовать много линий с указанием размеров линий(кстати шкалу можно нарисовать отдельным инклюд файлом,а затем просто импортировать в файл описание для фейдера) и т.д. и т.п.,а в исполняемом файле для вызова нужно будет только указание имени и параметров фейдера без описания графической части.Грубо(даже очень грубо) говоря чем-то напоминает написание API,т.е. в исполняемом файле при написании плагина нам будет нужно указать упрощенное имя функции/алгоритма с указанием используемых параметров(тем самым экономим время написания кода и копипасты и упрощаем наглядно сам плагин в плане оформления кода,ещё из плюсов проще наверное искать баги если плагин пишем блоками,а не устраиваем помойку из кода в одном исполняемом файле,также при разумном подходе в оформлении структуры можно упростить себе работу при дальнейшем(если конечно в планах) портировании кода плагина при переносе на вст или другие технологии.Извиняюсь за оффтоп,если где-то не прав,может кто поправит,но моё мнение рыть надо в районе API.
 
Последнее редактирование:
Из С++ однозначно, но к API отношения не имеет. Из JS кода к апи доступа нет.
С помощью этого выстраивается иерархия, понять бы как чего и зачем.
 
  • Like
Реакции: Trasher
Из JS кода к апи доступа нет.
С помощью этого выстраивается иерархия, понять бы как чего и зачем.
Я имел ввиду создание своей структуры API к написуемому плагину,используя базовые функции языка JSFX для упрощения написания плага(т.е базовые функции языка-это низшая ступень иерархии(принудительно нужно себя заставить не лезть ниже),а дальше дело за фантазией разработчика:080:.Структуру можно слямзить взяв за основу модули того же Reaktora(имеется ввиду core) или же если в планах написание эмуляции,создание описаний своих элементов плагина(например резистор,диод,и т.д.,что-то наподобии Spice симуляции(это мне кажется сложнее,так как тот же резистор например для переменки создать для JS будет довольно затратно по ресурсам(придется синтезировать синус или дублировать входящий сигнал с учетом амплитуды и положением фазы(если считаем напряжение то сила тока по фазе к напряжению=- и *или / на какой-то коэфф., и т.п.(причем частоту тоже придется менять согласно частоте тока входящего сигнала ),а если по схеме этих резисторов будет до хрена и т.п.,то и в итоге плагин не взлетит.Структура может быть какая угодно,с учетом одного ограничения(правда я не уверен),40 функций в одном инклюд файле(вроде так).Как я понял если в инклюд файле/файлах есть импортированный другой инклюд файл(т.е. он использует функции с другого файла без описания процесса,а ограничивается только названием функции и параметрами необходимыми для выполнения функции),то он на одну ступень выше по иерархии из-за того,что использует функции из другого файла,если его не будет тогда весь процесс вычислений будет неудачным (но это тоже не факт,возможно есть и фокусы для обхода),жаль,что JSFX не поддерживает хотя бы частично динамичного поведения(вот это был бы жесткач по полной).Из минусов-также можно устроить помойку только уже из инклюд файлов и запутаться,что где(если пишем только в JS,а портировать не будем).Возможно где-то я и ошибаюсь.
 
Последнее редактирование:
@belovw, завтра скину переведенную последнюю главу.
[DOUBLEPOST=1431659693,1431625054][/DOUBLEPOST]Определяемые пользователем функции и пространство имен псевдо-объектов.

Примечание: Функциональность предоставленная в данном разделе доступна только с версии Reaper 4.25.

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

Функции могут быть объявлены в любом месте кода, кроме тела блока, и в любом разделе. Хотя функции объявленые в Init доступны в любом месте кода, в то же время функции объявленые в других разделах являются локальными для них и недоступны в других разделах.
Функции не могут быть рекурсивными, возможен вызов вышестоящей функции в коде, но не наоборот.
Функции могут иметь от 0 до 40 параметров.
Чтобы определить функцию используйте следующий синтаксис:

function getSampleRate()
(
srate; // return srate
);

function mySine(x)
(
// taylor approximation
x - (x^3)/(3*2) + (x^5)/(5*4*3*2) - (x^7)/(7*6*5*4*3*2) + (x^9)/(9*8*7*6*5*4*3*2);
);

function calculateSomething(x y)
(
x += mySine(y);
x/y;
);

Эти функции могут вызываться так:

y = mySine($pi * 18000 / getSampleRate());
z = calculateSomething(1,2);

Примечание: обратите внимание на то что переменные вне функции являются глобальными.
Чтобы объявить переменную внутри функции используется ключевое слово local() между объявлением и телом функции.
Объявленые таким образом переменные являются локальными для данной функции и сохраняют свое значение между вызовами функции. При этом одноименные переменные могут использоваться в разных разделах, например init и sample и будут иметь разные значения.
Пример:

function mySine(x) local(lastreq lastvalue)
(
lastreq != x ? (
lastreq = x; // save last input
// taylor approximation
lastvalue = x - (x^3)/(3*2) + (x^5)/(5*4*3*2) - (x^7)/(7*6*5*4*3*2) + (x^9)/(9*8*7*6*5*4*3*2);
);
lastvalue; // result of function is cached value
);

В написаном выше примере mySine кеширует последнее значение и невыполняет расчеты если кешированое значение доступно. Обратите внимание что локальные переменные инициализируются значением 0, которая работает только в данном примере, и при использовании mycosine() прийдется применить дополнительные логические выражения.

JS поддерживает пространство имен в виде глобальных переменных, что позволяет применять объектно-ориентированый стиль программирования. Доступ к переменным пространства имен осуществляется с помощью "this", который служит преффиксом для определения переменных и функций используемых как экземпляры.

function set_foo(x) instance(foo)
(
foo = x;
);
// или
function set_foo(x)
(
this.foo = x;
);

whatever.set_foo(32); // whatever.foo = 32;
set_foo(32); // set_foo.foo = 32;

function test2()
(
this.set_foo(32);
);
whatever.test2(); // whatever.foo = 32

Кроме этого функции могут использовать преффикс для перемещения по иерархии пространства имен, пример:

function set_par_foo(x)
(
this..foo = x;
);
a.set_par_foo(1); // устанавливает foo (global) в значение 1
a.b.set_par_foo(1); // устанавливает a.foo в 1
userfunc
[DOUBLEPOST=1431659957][/DOUBLEPOST]Перевел максимально приближенно к смыслу а не к машинному, английский знаю достаточно по части программирования так что здесь все нормально. Ради интереса проверил как переводит гугл, и мне поплохело))))
[DOUBLEPOST=1431661071][/DOUBLEPOST]Trasher
Эмулировать транзисторы и резисторы гиблое дело)))) Это тонны бесполезного кода, можно использовать готовые волновые формы типа синусоиды, треугольника и т.д...
С помощью наследования можно собрать даже примитивный синтезатор, несколько таких примеров есть на кокосовом форуме.
По поводу функций ошибочка: можно использовать бесконечное количество функций, но у одной функции может быть максимум 40 аргументов, например:
function myfunc(param1, param2, ... param40)

Если что-то будет непонятно - спрашивайте, попробую объяснить.
 
  • Like
Реакции: EUGEN27771 и belovw
Ребята, не совсем в том разделе, но спрошу тут - так как тут те, кто точно внимательно читал этот документ....
Может есть какой-то механизм позволяющий при помощи JSFX запустить скрипт? Кроме MIDI сообщения.
 
Та то, что очевидными способами нельзя - я знаю, но может есть какой-то обходной?
[DOUBLEPOST=1431671305,1431671115][/DOUBLEPOST]
Сторонние скрипты незапускаются, но есть функция run() в апи JS, насколько помню. С помощью нее по идее можно чего-нибудь запустить.
Ну вот я что-то такое и имею в виду....
Просто когда для работы проекта нужно запускать очень большое кол-во разнообразных скриптов, midi пул сообщений быстро заканчивается, не смотря на 16 каналов и 127 сообщений в каждом. Если бы скрипты можно было запускать локальными (в рамках одной группы трэков) midi сообщениями, то ещё куда ни шло, но тут ведь только глобальное midi применимо :(
А и забивать midi "эфир" вспомогательными сообщениями очень не хочется.

Может посмотрите?
 
Сейчас поковыряю, на кокосовом форуме что-то попадалось с вызовом питоновского скрипта из JS и выборка параметров.
[DOUBLEPOST=1431673128,1431671607][/DOUBLEPOST]http://forum.cockos.com/showthread.php?t=33795
Посмотрите в этом топике, может попадется то что нужно, особенно среди семплеров и мидиутилит.

https://sites.google.com/site/jesuccernn/files
А это для общего развития и вдруг кому-нибудь пригодятся выложеные там скрипты.
 
По поводу функций ошибочка:
Alex_028
Вы правы.По поводу резисторов и транзисторов не много не соглашусь,есть способы избежать тонны кода,на худой конец есть люди которым это просто интересно.:)
 
Последнее редактирование:
Trasher
Есть более подходящие инструменты для моделирования аналоговых схем, если брать из звукового dsp то есть Csound, Cabbage, Chuck.
На JS сложновато реализовать. Я когда наткнулся на эту тему сразу попробовал написать примитивный блок имитации транзистора, но что с ним дальше делать я понятия не имею)))) Нужно много знать о процессах которые происходят при различных напряжениях, частотах и еще куча неучтенных параметров, а в радиоэлектронике у меня слабоватые знания.
Даже при написании vst синтезаторов используется принцип обработки уже готовых волновых форм или генерация с нуля по заданным параметрам, а не эмуляция полной аналоговой схемы синтезаторов 80-х годов))))
 
Перевод для всех,или только для принимавших участие?
 
Этот вопрос с участниками перевода не обсуждался.
Думаю народ будет не против, но правильно будет дождаться личного разрешения от каждого.
[DOUBLEPOST=1431766612,1431766412][/DOUBLEPOST]
Сторонние скрипты незапускаются, но есть функция run() в апи JS, насколько помню. С помощью нее по идее можно чего-нибудь запустить.
Не помню такой функции. Не могли бы указать документацию или ссылки на нее?
 

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