JSFX on Fedora Linux: an ultra-fast audio prototyping engine

від

у

JSFX на Fedora Linux: надзвичайно швидкий движок прототипування аудіо
https://ift.tt/o4lLygb

Introduction
Написати плагін для аудіо в режимі реального часу в 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 у форматах CLAP та VST3 через репозиторій Audinux ([5], [4]).

Це означає, що можливо написати функціональний аудіоефект у десять рядків, а потім одразу завантажити його в Carla [8], Ardour [9] або будь-який інший сумісний хост у середовищі PipeWire / JACK [11].
Цитата з [1] (див. посилання [1] для зображень):

У 2004 році, ще до того як ми почали розробку REAPER, ми створили програмне забезпечення, призначене для живого створення та модифікації FX, головним чином для обробки гітари.
План полягав у тому, щоб це могло працювати на мінімальному дистрибутиві Linux на спеціалізованому обладнанні, для використання на сцені. Ми побудували кілька прототипів.
Ці ручно зібрані прототипи використовували міні-ITX материнські плати з Via або Intel P-M CPU, дешеві універсальні USB-аудіопристрої та мікроконтролери Atmel AVR через RS-232 для керування ногами.
Вартість деталей становила близько 600 доларів кожна.
Врешті-решт ми дійшли висновку, що краще залишитися у програмному бізнесі, а не в апаратному, і наш дослідження щодо додавання багатодорожній обробки в JSFX привели до розробки REAPER. Відтоді REAPER інтегрував значну частину функціональності JSFX та покращив її.

Отже, як бачите, ця технологія не така вже нова. Але підтримка Linux через YSFX [3] є досить новою (листопад 2021, започаткована Жаном-П’єром Сімаландо).

Нове мову програмування, але для чого? Для чого її використовують JSFX?
Ця мова призначена для аудіо і за допомогою нею можна писати аудіоефекти, такі як підсилювач, хор, затримку, компресор, або ви можете писати синтезатори.
JSFX добре підходить для швидкого прототипування, а коли все готово, можна переписати проект на більш ефективну мову, наприклад C, C++ або Rust.

JSFX для розробників
Розробка аудіоплагіна на Linux часто потребує значного технічного середовища. Ця складність може заважати швидкому тестуванню ідеї.
JSFX (JesuSonic Effects) пропонує інший підхід: написання аудіоефектів всього кількома рядками інтерпретованого коду, без компіляції та з миттєвим перезавантаженням.
Завдяки YSFX, доступному на Fedora Linux у форматах CLAP та VST3, ці скрипти можуть використовуватися як справжні плагіни в аудіосистемі Linux.
Ця стаття розгляне, як написати мінімальний підсилювач у JSFX, додати графічний VU-метр і завантажити його у Carla як CLAP / VST3 плагін.
Мета проста: показати, що можливо швидко сп protотипувати реальну обробку аудіо на Fedora Linux за кілька хвилин.
Ніякого середовища компіляції не потрібно: потрібен лише текстовий редактор.

YSFX плагін
На Fedora Linux YSFX випускається у 3 варіантах:
– автономний виконуваний файл;
– плагін VST3;
– плагін CLAP.
YSFX доступний у репозиторії Audinux. Спершу встановіть репозиторій Audinux:
$ dnf copr enable ycollet/audinux
Потім встановіть потрібну версію:
$ dnf install ysfx
$ dnf install vst3-ysfx
$ dnf install clap-ysfx
Ось знімок YSFX як плагіна VST3, завантаженого у Carla Rack:
Ви можете:
– завантажити файл;
– завантажити останній файл;
– перезавантажити файл, змінений через меню Edit;
– масштабувати / зменшувати через кнопку 1.0;
– завантажувати пресети;
– перемикати між виглядом Graphics та Sliders.
Ось знімок вікна редагування:
Як видно, стовпець 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: лівий та правий канали.
– У цьому прикладі ми просто множимо вхідний сигнал на коефіцієнт gain.

Ось вигляд результату:

Підсилювач з підсиленням у дБ
Цей приклад створює слайдер, який задає підсилення в дБ.
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
У цьому прикладі використаємо JSFX UI-бібліотеку для кращої візуалізації елементів підсилювача.
Спочатку клонувати репозиторій https://ift.tt/kZnd9Q0 та скопіювати файл 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) // Parameters 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
// Compute the increment / decrement for each states
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; ); ); // Sine oscillator sample = sin(phase) * env * slider5; phase += phase_inc; phase > 2*$pi ? phase -= 2*$pi;

// Stereo output
spl0 = sample;
spl1 = sample;

Структура прикладу:
– Отримання MIDI через @block;
– Перетворення MIDI-ноти у частоту (стандарт A=440);
– Генерація синусоїдального сигналу;
– Застосування 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-аудіое Ecosystem, поряд з Carla, Ardour та аудіосистемою на основі PipeWire.
Для розробників та цікавих музикантів JSFX надає простий та миттєвий стартовий пункт для створення плагінів реального часу на Fedora Linux.

Доступні плагіни
ysfx-chokehold
Free колекція JS (JesuSonic) плагінів для Reaper.
Код доступний за: https://ift.tt/pUBqDbP
Щоб встановити цей набір YSFX-плагінів:
$ dnf install ysfx-chokehold
YSFX-плагіни будуть доступні за шляхом /usr/share/ysfx-chokehold.

ysfx-geraintluff
Колекція JSFX-ефектів.
Код доступний за: https://ift.tt/PcHY5q6
Щоб встановити цей набір YSFX-плагінів:
$ dnf install ysfx-geraintluff
YSFX-плагіни будуть доступні за шляхом /usr/share/ysfx-geraintluff.

ysfx-jesusonic
Деякі JSFX-ефекти від Cockos.
Код доступний за: https://ift.tt/TYq8Pa4
Щоб встановити цей набір YSFX-плагінів:
$ dnf install ysfx-jesusonic
YSFX-плагіни будуть доступні за шляхом /usr/share/ysfx-jesusonic.

ysfx-joepvanlier
Пакет JSFX та скриптів для Reaper.
Код доступний за: https://ift.tt/lNmF5qy
Щоб встановити цей набір YSFX-плагінів:
$ dnf install ysfx-joepvanlier
YSFX-плагіни будуть доступні за шляхом /usr/share/ysfx-joepvanlier.

ysfx-lms
LMS Plugin Suite – open source JSFX аудіоплагіни
Код доступний за: https://ift.tt/0HxnWZa
Щоб встановити цей набір YSFX-плагінів:
$ dnf install ysfx-lms
YSFX-плагіни будуть доступні за шляхом /usr/share/ysfx-lms.

ysfx-reateam
Спільнотовий набір JS ефектів для REAPER
Код доступний за: https://ift.tt/MO03EVZ
Щоб встановити цей набір YSFX-плагінів:
$ dnf install ysfx-reateam
YSFX-плагіни будуть доступні за шляхом /usr/share/ysfx-reateam.

ysfx-rejj
Reaper JSFX плагіни.
Код доступний за: https://ift.tt/w4Xdea0
Щоб встановити цей набір YSFX-плагінів:
$ dnf install ysfx-rejj
І всі YSFX-плагіни будуть доступні за шляхом /usr/share/ysfx-rejj.

ysfx-sonic-anomaly
Sonic Anomaly JSFX скрипти для Reaper
Код доступний за: https://ift.tt/C96WMd8
Щоб встановити цей набір YSFX-плагінів:
$ dnf install ysfx-sonic-anomaly
YSFX-плагіни будуть доступні за шляхом /usr/share/ysfx-sonic-anomaly.

ysfx-tilr
Колекція ефектів JSFX від TiagoLR
Код доступний за: https://ift.tt/vhy2pqe
Щоб встановити цей набір YSFX-плагінів:
$ dnf install ysfx-tilr
YSFX-плагіни будуть доступні за шляхом /usr/share/ysfx-tilr.

ysfx-tukan-studio
JSFX плагіни для Reaper
Код доступний за: https://ift.tt/FZyeasB
Щоб встановити цей набір YSFX-плагінів:
$ dnf install ysfx-tukan-studio
YSFX-плагіни будуть доступні за шляхом /usr/share/ysfx-tukan-studio.

Webography
[1] – https://ift.tt/TYq8Pa4
[2] – https://ift.tt/PcHY5q6
[3] – https://ift.tt/k51yc8X
[4] – https://ift.tt/nHDSCmd
[5] – https://audinux.github.io/
[6] – https://ift.tt/m9M4y0w
[7] – https://ift.tt/PJoyMBX
[8] – https://ift.tt/YcXaNu1
[9] – https://ardour.org
[10] – https://ift.tt/Hd4wOVk
[11] – https://jackaudio.org

HI-FI News
via Fedora Magazine https://ift.tt/mXBbOcZ

Час публікації: 13 березня 2026 р. 09:01 AM

March 13, 2026 at 09:01AM


Коментарі

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

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *