
JSFX на Fedora Linux: надзвичайно швидкий движок прототипування аудіо
https://ift.tt/SYm9NzZ
Вступ
Створення аудіо-pLugins у реальному часі на Linux часто асоціюють із складним середовищем: C++, інструменти розробки, CMake, CLAP / VST3 / LV2 SDK, ABI…
Однак існує набагато простіший підхід: JSFX
Ця стаття пропонує практичне введення у JSFX та YSFX на Fedora Linux: ми напишемо кілька маленьких прикладів, додамо графічний VU-мітер і потім побачимо, як використати це як плагін CLAP / VST3 у нативному Linux-робочому процесі.
JSFX (JesuSonic Effects – створено REAPER [7]) дозволяє писати аудіоплагіни всього в кілька рядків, без компіляції, з миттєвим перезавантаженням та живим редагуванням.
Довгий час пов’язані з REAPER, вони зараз нативно доступні на Linux завдяки YSFX [3], доступний на Fedora Linux у форматах CLAP та VST3 через репозиторій Audinux ([4], [5]).
Це означає, що можливо написати функціональний аудіоефект у десяти рядках, а потім одразу завантажити його в Carla [8], Ardour [9], або будь-який інший сумісний хост, усе в середовищі PipeWire / JACK [11].
Цитата з [1] (див. посилання [1] для зображень):
У 2004 році, ще до того як ми почали розробку REAPER, ми створили програмне забезпечення для створення та модифікації FX у живому режимі, переважно для обробки гітари.
План полягав у тому, щоб воно могло працювати на мінімальній дистрибутивній системі Linux на спеціальному обладнанні, для використання на сцені. Ми збудували кілька прототипів.
Ці ручні прототипи використовували материнські плати mini-ITX з Via або Intel P-M CPU, дешеві USB-аудіододатки, та мікроконтролери Atmel AVR через RS-232 для педалей управління.
Вартість деталей становила близько $600 за штуку.
Однак зрештою ми дійшли висновку, що краще займатися програмним забезпеченням, а не апаратним забезпеченням, і наше дослідження з додаванням багатоканальних можливостей у JSFX привело нас до розробки REAPER. З того часу REAPER інтегрував багато функцій JSFX і покращив їх.
Як видно, ця технологія не така вже й нова. Але підтримка Linux через YSFX [3] досить нова (листопад 2021 року, започаткована Жаном-П’єром Cimando).
Нове мову програмування, але для чого? Для чого може бути використаний JSFX?
Ця мова призначена для аудіо і за її допомогою можна писати аудіоефекти, такі як підсилювач, хор, затримка, компресор, або можна створювати синтезатори.
JSFX підходить для швидкого прототипування і, як тільки все на місці, ви зможете переписати ваш проект на більш ефективну мову, таку як C, C++ або Rust.
JSFX для розробників
Розробка аудіоплагіна на Linux часто вимагає значного технічного середовища. Ця складність може бути перешкодою, коли хочеться швидко перевірити ідею.
JSFX (JesuSonic Effects) пропонує інший підхід: написання аудіоефектів у кількох рядках інтерпретованого коду, без компіляції та з миттєвим перезавантаженням.
Завдяки YSFX, доступному на Fedora Linux у форматах CLAP та VST3, ці скрипти можна використати як справжні плагіни в екосистемі аудіо на Linux.
У цій статті розглянемо, як написати мінімальний підсилювач у JSFX, додати графічний VU-метр та потім завантажити його у Carla як плагін CLAP / VST3.
Мета проста: продемонструвати, що прототипування обробки аудіо в реальному часі на Fedora Linux можливо за кілька хвилин.
Додаткового компіляційного середовища не потрібно: потрібен лише текстовий редактор.
Плагін YSFX
На Fedora Linux YSFX постачається у 3-х варіантах:
- автономний виконуваний файл;
- плагін VST3;
- плагін CLAP.
YSFX доступний у репозиторії Audinux [5]. Отже, спочатку встановіть репозиторій Audinux:
$ dnf copr enable ycollet/audinux
Потім можна встановити потрібну версію:
$ dnf install ysfx $ dnf install vst3-ysfx $ dnf install clap-ysfx
Ось знімок екрана YSFX як плагіна VST3, завантаженого в Carla Rack [8]:

Ви можете:
- завантажити файл;
- завантажити нещодавній файл;
- перезавантажити файл, змінений через меню Edit;
- масштабувати/масштабувати назад за допомогою кнопки 1.0;
- завантажувати пресети;
- переключатися між переглядами Graphics та Sliders.
Ось знімок вікна Edit:

Колонка Variables відображає всі змінні з завантаженого файлу.
Приклади
Ми використаємо документацію JSFX, доступну за [4].
Код JSFX завжди поділяється на секції.
- @init : код у секції @init виконується при завантаженні ефекту, при зміні частоти дискретизації та при запуску відтворення.
- @slider : код у секції @slider виконує після @init, або коли змінюється параметр (слайдер)
- @block : код у секції @block виконується перед обробкою кожного блоку зразків. Зазвичай блок має ту ж довжину, що й аудіо-обчислювач, або від 128 до 2048 зразків.
- @sample : код у секції @sample виконується для кожного PCM зразка.
- @serialize : код у секції @serialize виконується, коли плагіну потрібно завантажити або зберегти розширений стан.
- @gfx [width] [height] : секція @gfx виконується близько 30 разів на секунду, коли відкритий графічний інтерфейс плагіна.
Простий підсилювач
У цьому прикладі використаємо значення слайдера для підсилення аудіо-входу.
desc:Simple Amplifier slider1:1<0,4,0.01>Gain @init gain = slider1; @slider gain = slider1; @sample spl0 *= gain; spl1 *= gain;
slider1, @init, @slider, @sample, spl0, spl1 — це ключові слова JSFX [1].
Опис:
- slider1: створює елемент керування користувача (від 0 до 4 тут);
- @init: секція, що виконується під час завантаження;
- @slider: секція, що виконується при переміщенні слайдера;
- @sample: секція, що виконується для кожного аудіозразка;
- spl0 і spl1: лівий та правий канали.
- У цьому прикладі ми просто множимо вхідний сигнал на коефіцієнт підсилення.
Ось зображення результату:

Підсилювач із підсиленням у дБ
Цей приклад створює слайдер, який генерує підсилення в дБ.
desc:Simple Amplifier (dB) slider1:0<-60,24,0.1>Gain (dB) @init gain = 10^(slider1/20); @slider gain = 10^(slider1/20); @sample spl0 *= gain; spl1 *= gain;
Тільки спосіб обчислення підсилення змінюється.
Ось зображення результату:

Підсилювач із захистом від клиппінґу
Цей приклад додає захист від клиппінґу та використовує JSFX-функцію для цього.
desc:Simple Amplifier with Soft Clip slider1:0<-60,24,0.1>Gain (dB) @init gain = 10^(slider1/20); @slider gain = 10^(slider1/20); function softclip(x) ( x / (1 + abs(x)); ); @sample spl0 = softclip(spl0 * gain); spl1 = softclip(spl1 * gain);
Ось зображення результату:

Підсилювач ізVU-метром
Цей приклад той же, що вище, ми просто додаємо вивід значення підсилення.
desc:Simple Amplifier with VU Meter
slider1:0<-60,24,0.1>Gain (dB)
@init
rms = 0;
coeff = 0.999; // RMS згладжування
gain = 10^(slider1/20);
@slider
gain = 10^(slider1/20);
@sample
// Застосувати підсилення
spl0 *= gain;
spl1 *= gain;
// Обчислити RMS (середнє значення двох каналів)
mono = 0.5*(spl0 + spl1);
rms = sqrt((coeff * rms * rms) + ((1 - coeff) * mono * mono));
@gfx 300 200 // UI частина
gfx_r = 0.1; gfx_g = 0.1; gfx_b = 0.1;
gfx_rect(0, 0, gfx_w, gfx_h);
// Перетворити в дБ
rms_db = 20*log(rms)/log(10);
rms_db < -60 ? rms_db = -60;
// Нормалізація для дисплею
meter = (rms_db + 60) / 60;
meter > 1 ? meter = 1;
// Зелений колір
gfx_r = 0;
gfx_g = 1;
gfx_b = 0;
// Горизонтальна смуга
gfx_rect(10, gfx_h/2 - 10, meter*(gfx_w-20), 20);
// Текст
gfx_r = gfx_g = gfx_b = 1;
gfx_x = 10;
gfx_y = gfx_h/2 + 20;
gfx_printf("Level: %.1f dB", rms_db);
Загальна структура коду:
- Застосувати підсилення
- Обчислити згладжене значення RMS
- Перевести до дБ
- Відобразити горизонтальну смугу
- Відобразити числове значення
Ось зображення результату:

Підсилювач із використанням UI-лібри від jsfx-ui-lib
У цьому прикладі використаємо UI-бібліотеку JSFX для більш гарної візуалізації елементів підсилювача.
Спочатку склонуйте репозиторій https://github.com/geraintluff/jsfx-ui-lib та скопіюйте файл ui-lib.jsfx-inc у директорію, де зберігаються ваші JSFX-файли.
desc:Simple Amplifier with UI Lib VU
import ui-lib.jsfx-inc
slider1:0<-60,24,0.1>Gain (dB)
@init
freemem = ui_setup(0);
rms = 0;
coeff = 0.999;
gfx_rate = 30; // 30 FPS
@slider
gain = 10^(slider1/20);
@sample
spl0 *= gain;
spl1 *= gain;
mono = 0.5*(spl0 + spl1);
rms = sqrt(coeff*rms*rms + (1-coeff)*mono*mono);
// ---- RMS computation ----
level_db = 20*log(rms)/log(10);
level_db < -60 ? level_db = -60;
@gfx 300 200
ui_start("main");
// ---- Gain ----
control_start("main","default");
control_dial(slider1, 0, 1, 0);
cut = (level_db + 100) / 200 * (ui_right() - ui_left()) + ui_left();
// ---- VU ----
ui_split_bottom(50);
ui_color(0, 0, 0);
ui_text("RMS Level: ");
gfx_printf("%d", level_db);
ui_split_bottom(10);
uix_setgfxcolorrgba(0, 255, 0, 1);
gfx_rect(ui_left(), ui_top(), ui_right() - ui_left(), ui_bottom() - ui_top());
uix_setgfxcolorrgba(255, 0, 0, 1);
gfx_rect(ui_left(), ui_top(), cut, ui_bottom() - ui_top());
ui_pop();
Загальна структура прикладу:
- Імпорт та підготовка: бібліотека UI імпортується, після чого виділяється пам’ять (ui_setup) за допомогою @init;
- UI-контроли: control_dial створює тематичний потенціометр з міткою, інтегрований у бібліотеку;
- Інтегрований VU-метр: Малюється невелика графіка з нормалізацією RMS значення між 0 і 1;
- Структура UI: ui_start(“main”) підготовлює інтерфейс для кожного кадру. ui_push_height / ui_pop організують вертикальний простір.
Ось зображення результату:

Простий синтезатор
Тепер створюємо звук і використаємо MIDI для цього.
Ядро цього прикладу — генератор ADSR-енвелопи ([10]).
desc:Simple MIDI Synth (Mono Sine)
// Параметри
slider1:0.01<0.001,2,0.001>Attack (s)
slider2:0.2<0.001,2,0.001>Decay (s)
slider3:0.8<0,1,0.01>Sustain
slider4:0.5<0.001,3,0.001>Release (s)
slider5:0.5<0,1,0.01>Volume
@init
phase = 0;
note_on = 0;
env = 0;
state = 0; // 0=idle,1=attack,2=decay,3=sustain,4=release
@slider
// Обчислити крок/зменшення для кожного стану
attack_inc = 1/(slider1*srate);
decay_dec = (1-slider3)/(slider2*srate);
release_dec = slider3/(slider4*srate);
@block
while (
midirecv(offset, msg1, msg23) ? (
status = msg1 & 240;
note = msg23 & 127;
vel = (msg23/256)|0;
// Note On
status == 144 && vel > 0 ? (
freq = 440 * 2^((note-69)/12);
phase_inc = 2*$pi*freq/srate;
note_on = 1;
state = 1;
);
// Note Off
(status == 128) || (status == 144 && vel == 0) ? (
state = 4;
);
);
);
@sample
// ADSR Envelope [10]
state == 1 ? ( // Attack
env += attack_inc;
env >= 1 ? (
env = 1;
state = 2;
);
);
state == 2 ? ( // Decay
env -= decay_dec;
env <= slider3 ? (
env = slider3;
state = 3;
);
);
state == 3 ? ( // Sustain
env = slider3;
);
state == 4 ? ( // Release
env -= release_dec;
env <= 0 ? (
env = 0;
state = 0;
);
);
// Синусний осцилятор
sample = sin(phase) * env * slider5;
phase += phase_inc;
phase > 2*$pi ? phase -= 2*$pi;
// Стерао вихід
spl0 = sample;
spl1 = sample;
Загальна структура прикладу:
- Отримання MIDI через @block;
- Перетворення MIDI-ноти на частоту (стандарт A440);
- Генерація синусоїдального сигналу;
- Застосування ADSR-енвелопи;
- Вивід стерео.
Ось зображення результату:

Порівняння з CLAP / VST3
JSFX + YSFX
Переваги JSFX:
- Не потрібна компіляція;
- Миттєве перезавантаження;
- Швидка навчальна крива;
- Ідеально підходить для прототипування DSP;
- Портативність між системами через YSFX.
Обмеження:
- Менш продуктивний ніж нативний C++ для важкої обробки;
- Менш придатний для «промислового» розповсюдження;
- Проста API, тому менше низькорівневого контролю.
CLAP / VST3 у C/C++
Переваги:
- Максимальна продуктивність;
- Тонке керування архітектурою;
- Глибока інтеграція з Linux аудіо-екосистемою;
- Стандартизований розповсюдження.
Обмеження:
- Потребує повного інструментарію розробки;
- Управління ABI/компіляція;
- Довший цикл розробки.
Висновок
Функціональний аудіоефект можна написати всього в кілька рядків, додати простий графічний інтерфейс і потім завантажити цей скрипт як CLAP / VST3 плагін на Fedora Linux. Це не потребує компіляції, складного SDK або громіздкого інструментарію.
JSFX-скрипти не замінюють нативну розробку на C++ коли мова йде про продуктивні, широко розповсюджувані плагіни. Проте вони пропонують надзвичайне середовище для експериментів, навчання обробці сигналів та швидкого прототипування.
Завдяки YSFX JSFX-скрипти тепер тісно інтегровані у Linux аудіо-екосистему, поряд із Carla, Ardour та аудіо системою на основі PipeWire.
Для розробників та цікавих музикантів JSFX надає просту та миттєву точку входу до створення ефектів реального часу на Fedora Linux.
Доступні плагіни
ysfx-chokehold
Безкоштовна колекція JS (JesuSonic) плагінів для Reaper.
Код доступний за адресою: https://github.com/chkhld/jsfx
Щоб встановити цей набір плагінів YSFX:
$ dnf install ysfx-chokehold
Плагіни YSFX будуть доступні за адресою /usr/share/ysfx-chokehold.
ysfx-geraintluff
Колекція ефектів JSFX.
Код доступний за адресою: https://github.com/geraintluff/jsfx
Щоб встановити цей набір плагінів YSFX:
$ dnf install ysfx-geraintluff
Плагіни YSFX будуть доступні за адресою /usr/share/ysfx-geraintluff.
ysfx-jesusonic
Деякі JSFX-ефекти від Cockos.
Код доступний за адресою: https://www.cockos.com/jsfx
Щоб встановити цей набір плагінів YSFX:
$ dnf install ysfx-jesusonic
Плагіни YSFX будуть доступні за адресою /usr/share/ysfx-jesusonic.
ysfx-joepvanlier
Збірка JSFX та скриптів для reaper.
Код доступний за адресою: https://github.com/JoepVanlier/JSFX
Щоб встановити цей набір плагінів YSFX:
$ dnf install ysfx-joepvanlier
Плагіни YSFX будуть доступні за адресою /usr/share/ysfx-joepvanlier.
ysfx-lms
LMS Plugin Suite – Open source JSFX аудіо плагіни
Код доступний за адресою: https://github.com/LMSBAND/LMS
Щоб встановити цей набір плагінів YSFX:
$ dnf install ysfx-lms
Плагіни YSFX будуть доступні за адресою /usr/share/ysfx-lms.
ysfx-reateam
Спільнотна колекція JS ефектів для REAPER
Код доступний за адресою: https://github.com/ReaTeam/JSFX
Щоб встановити цей набір плагінів YSFX:
$ dnf install ysfx-reateam
Плагіни YSFX будуть доступні за адресою /usr/share/ysfx-reateam.
ysfx-rejj
Reaper JSFX Plugins.
Код доступний за адресою: https://github.com/Justin-Johnson/ReJJ
Щоб встановити цей набір плагінів YSFX:
$ dnf install ysfx-rejj
І всі плагіни YSFX будуть доступні за адресою /usr/share/ysfx-rejj.
ysfx-sonic-anomaly
Sonic Anomaly JSFX скрипти для Reaper
Код доступний за адресою: https://github.com/Sonic-Anomaly/Sonic-Anomaly-JSFX
Щоб встановити цей набір плагінів YSFX:
$ dnf install ysfx-sonic-anomaly
Плагіни YSFX будуть доступні за адресою /usr/share/ysfx-sonic-anomaly.
ysfx-tilr
Колекція ефектів JSFX від TiagoLR
Код доступний за адресою: https://github.com/tiagolr/tilr_jsfx
Щоб встановити цей набір плагінів YSFX:
$ dnf install ysfx-tilr
Плагіни YSFX будуть доступні за адресою /usr/share/ysfx-tilr.
ysfx-tukan-studio
JSFX Плагіни для Reaper
Код доступний за адресою: https://github.com/TukanStudios/TUKAN_STUDIOS_PLUGINS
Щоб встановити цей набір плагінів YSFX:
$ dnf install ysfx-tukan-studio
Плагіни YSFX будуть доступні за адресою /usr/share/ysfx-tukan-studio.
Webography
[1] – https://www.cockos.com/jsfx
[2] – https://github.com/geraintluff/jsfx
[3] – https://github.com/JoepVanlier/ysfx
[4] – https://www.reaper.fm/sdk/js/js.php
[5] – https://audinux.github.io
[6] – https://copr.fedorainfracloud.org/coprs/ycollet/audinux
[7] – https://www.reaper.fm/index.php
[8] – https://github.com/falkTX/Carla
[9] – https://ardour.org
[10] – https://en.wikipedia.org/wiki/Envelope_(music)
[11] – https://jackaudio.org
HI-FI News
через LXer Linux News https://lxer.com/
27 березня 2026 р. о 22:39 містить українізований переклад.
March 17, 2026 at 10:39PM

Залишити відповідь