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

від

у

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]:

Знімок екрану плагіна ефекту YSFX VST3, завантаженого в Carla-rack

Ви можете:

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

Ось знімок вікна Edit:

Знімок екрана вікна редактора, відкритого через плагін YSFX.

Колонка 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
  • Перевести до дБ
  • Відобразити горизонтальну смугу
  • Відобразити числове значення

Ось зображення результату:

Знімок екрану простого прикладу з VU-метром

Підсилювач із використанням 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 організують вертикальний простір.

Ось зображення результату:

Знімок простого прикладу з графічними елементами JSFX

Простий синтезатор

Тепер створюємо звук і використаємо 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


Коментарі

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

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