{"id":136424,"date":"2026-03-13T08:00:00","date_gmt":"2026-03-13T08:00:00","guid":{"rendered":"https:\/\/fedoramagazine.org\/?p=43090"},"modified":"2026-03-13T08:00:00","modified_gmt":"2026-03-13T08:00:00","slug":"jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine","status":"publish","type":"post","link":"https:\/\/sickgaming.net\/blog\/2026\/03\/13\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine\/","title":{"rendered":"JSFX on Fedora Linux: an ultra-fast audio prototyping engine"},"content":{"rendered":"<p><img decoding=\"async\" width=\"300\" height=\"127\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine.jpg\" class=\"webfeedsFeaturedVisual wp-post-image\" alt=\"\" style=\"margin: auto;margin-bottom: 5px;max-width: 100%\" loading=\"lazy\" \/><\/p>\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n<p>Writing a real-time audio plugin on Linux often conjures up images of a complex environment: C++, toolchains, CMake, CLAP \/ VST3 \/ LV2 SDK, ABI\u2026<\/p>\n<p>However, there is a much simpler approach\u00a0: JSFX <\/p>\n<p>This article offers a practical introduction to JSFX and YSFX on Fedora Linux: we&#8217;ll write some small examples, add a graphical VU meter, and then see how to use it as an CLAP \/ VST3 plugin in a native Linux workflow.<\/p>\n<p> <span id=\"more-43090\"><\/span> <\/p>\n<p>JSFX (JesuSonic Effects &#8211; created by REAPER [<a href=\"#reference_7\" id=\"#reference_7\">7<\/a>]) allows you to write audio plugins in just a few lines, without compilation, with instant reloading and live editing.<\/p>\n<p>Long associated with REAPER, they are now natively usable on Linux, thanks to YSFX [<a href=\"#reference_3\" id=\"#reference_3\">3<\/a>], available on Fedora Linux in CLAP and VST3 formats via the Audinux repository ([<a href=\"#reference_4\" id=\"#reference_4\">4<\/a>], [<a href=\"#reference_5\" id=\"#reference_5\">5<\/a>]).<\/p>\n<p>This means it&#8217;s possible to write a functional audio effect in ten lines, then immediately load it into Carla [<a href=\"#reference_8\" id=\"#reference_8\">8<\/a>], Ardour [<a href=\"#reference_9\" id=\"#reference_9\">9<\/a>], or any other compatible host, all within a PipeWire \/ JACK [<a href=\"#reference_11\" id=\"#reference_11\">11<\/a>] environment.<\/p>\n<p>A citation from [<a href=\"#reference_1\" id=\"#reference_1\">1<\/a>] (check the [<a href=\"#reference_1\" id=\"#reference_1\">1]<\/a> link for images):<\/p>\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>In 2004, before we started developing REAPER, we created software designed for creating and modifying FX live, primarily for use with guitar processing.<\/p>\n<p>The plan was that it could run on a minimal Linux distribution on dedicated hardware, for stage use. We built a couple of prototypes.<\/p>\n<p>These hand-built prototypes used mini-ITX mainboards with either Via or Intel P-M CPUs, cheap consumer USB audio devices, and Atmel AVR microcontrollers via RS-232 for the footboard controls.<\/p>\n<p>The cost for the parts used was around $600 each.<\/p>\n<p>In the end, however, we concluded that we preferred to be in the software business, not the hardware business, and our research into adding multi-track capabilities in JSFX led us to develop REAPER. Since then, REAPER has integrated much of JSFX&#8217;s functionality, and improved on it.<\/p>\n<\/blockquote>\n<p>So, as you can see, this technology is not that new. But the Linux support via YSFX [<a href=\"#reference_3\" id=\"#reference_3\">3<\/a>] is rather new (Nov 2021, started by Jean-Pierre Cimalando).<\/p>\n<p>A new programming language, but for what ? What would one would use JSFX for ?<\/p>\n<p>This language is dedicated to audio and with it, you can write audio effects like an amplifier, a chorus, a delay, a compressor, or you can write synthesizers.<\/p>\n<p>JSFX is good for rapid prototyping and, once everything is in place, you can then rewrite your project into a more efficient language like C, C++, or Rust.<\/p>\n<h2 class=\"wp-block-heading\">JSFX for developers<\/h2>\n<p>Developing an audio plugin on Linux often involves a substantial technical environment. This complexity can be a hindrance when trying out an idea quickly.<\/p>\n<p>JSFX (JesuSonic Effects) offers a different approach: writing audio effects in just a few lines of interpreted code, without compilation and with instant reloading.<\/p>\n<p>Thanks to YSFX, available on Fedora Linux in CLAP and VST3 formats, these scripts can be used as true plugins within the Linux audio ecosystem.<\/p>\n<p>This article will explore how to write a minimal amplifier in JSFX, add a graphical VU meter, and then load it into Carla as a CLAP \/ VST3 plugin.<\/p>\n<p>The goal is simple: to demonstrate that it is possible to prototype real-time audio processing on Fedora Linux in just a few minutes.<\/p>\n<p>No compilation environment is required: a text editor is all you need.<\/p>\n<h2 class=\"wp-block-heading\">YSFX plugin<\/h2>\n<p>On Fedora Linux, YSFX comes in 3 flavours\u00a0:<\/p>\n<ul class=\"wp-block-list\">\n<li> a standalone executable\u00a0;<\/li>\n<li> a VST3 plugin\u00a0;<\/li>\n<li> a CLAP plugin.<\/li>\n<\/ul>\n<p>YSFX is available in the Audinux [<a href=\"#reference_5\" id=\"#reference_5\">5<\/a>] repository. So, first, install the Audinux repository:<\/p>\n<pre class=\"wp-block-preformatted\"><kbd>$ dnf copr enable ycollet\/audinux<\/kbd><\/pre>\n<p>Then, you can install the version you want:<\/p>\n<pre class=\"wp-block-preformatted\">$ dnf install ysfx\n$ dnf install vst3-ysfx\n$ dnf install clap-ysfx<\/pre>\n<p>Here is a screenshot of YSFX as a VST3 plugin loaded in Carla Rack&nbsp;[<a href=\"#reference_8\" id=\"#reference_8\">8<\/a>]:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine.png\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"108\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine.png\" alt=\"Screenshot of YSFX effect VST3 plugin loaded in Carla-rack\" class=\"wp-image-43091\" \/><\/a><\/figure>\n<p>You can&nbsp;:<\/p>\n<ul class=\"wp-block-list\">\n<li>Load a file&nbsp;;<\/li>\n<li>Load a recent file&nbsp;;<\/li>\n<li>Reload a file modified via the Edit menu&nbsp;;<\/li>\n<li>Zoom \/ Unzoom via the <strong>1.0<\/strong> button\u00a0;<\/li>\n<li>Load presets&nbsp;;<\/li>\n<li>Switch between the\u00a0<strong>Graphics<\/strong> and <strong>Sliders<\/strong> view.<\/li>\n<\/ul>\n<p>Here is a screenshot of the Edit window:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1008\" height=\"634\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-1.png\" alt=\"Screenshot of the editor Window opened via the YSFX plugin.\" class=\"wp-image-43092\" \/><\/a><\/figure>\n<p>The \u00a0<strong>Variables<\/strong>\u00a0 column displays all the variables defined by the loaded file.<\/p>\n<h2 class=\"wp-block-heading\">Examples<\/h2>\n<p>We will use the JSFX documentation available at [<a href=\"#reference_4\" id=\"#reference_4\">4<\/a>].<\/p>\n<p>JSFX code is always divided into section.<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>@init&nbsp;<\/strong>: The code in the <strong>@init<\/strong> section gets executed on effect load, on samplerate changes, and on start of playback.<\/li>\n<li><strong>@slider<\/strong>&nbsp;: The code in the <strong>@slider<\/strong> section gets executed following an <strong>@init<\/strong>, or when a parameter (slider) changes<\/li>\n<li><strong>@block<\/strong>\u00a0: The code in the <strong>@block<\/strong> section is executed before processing each sample block. Typically a block is the length as defined by the audio hardware, or anywhere from 128-2048 samples.<\/li>\n<li><strong>@sample&nbsp;<\/strong>: The code in the <strong>@sample<\/strong> section is executed for every PCM (Pulse Code Modulation) audio sample.<\/li>\n<li><strong>@serialize<\/strong>&nbsp;: The code in the <strong>@serialize<\/strong> section is executed when the plug-in needs to load or save some extended state.<\/li>\n<li><strong>@gfx <\/strong>[width] [height]&nbsp;: The <strong>@gfx<\/strong> section gets executed around 30 times a second when the plug-ins GUI is open.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\">A simple amplifier<\/h3>\n<p>In this example, we will use a slider value to amplify the audio input.<\/p>\n<pre class=\"wp-block-preformatted\">desc:Simple Amplifier\nslider1:1&lt;0,4,0.01&gt;Gain @init\ngain = slider1; @slider\ngain = slider1; @sample\nspl0 *= gain;\nspl1 *= gain;<\/pre>\n<p>slider1, @init, @slider, @sample, spl0, spl1 are JSFX keywords [<a href=\"#reference_1\" id=\"#reference_1\">1<\/a>].<\/p>\n<p>Description:<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>slider1<\/strong>: create a user control (from 0 to 4 here);<\/li>\n<li><strong>@init<\/strong>: section executed during loading;<\/li>\n<li><strong>@slider<\/strong>: section executed when we move the slide;<\/li>\n<li><strong>@sample:<\/strong> section executed for each audio sample;<\/li>\n<li><strong>spl0<\/strong> and <strong>spl1<\/strong>: left and right channels.<\/li>\n<li>In this example, we just multiply the input signal by a gain.<\/li>\n<\/ul>\n<p>Here is a view of the result&nbsp;:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-2.png\"><img decoding=\"async\" loading=\"lazy\" width=\"700\" height=\"108\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-2.png\" alt=\"Screenshot of the simple gain example\" class=\"wp-image-43093\" \/><\/a><\/figure>\n<h3 class=\"wp-block-heading\">An amplifier with a gain in dB<\/h3>\n<p>This example will create a slider that will produce a gain in dB.<\/p>\n<pre class=\"wp-block-preformatted\">desc:Simple Amplifier (dB)\nslider1:0&lt;-60,24,0.1&gt;Gain (dB) @init\ngain = 10^(slider1\/20); @slider\ngain = 10^(slider1\/20); @sample\nspl0 *= gain;\nspl1 *= gain;<\/pre>\n<p>Only the way we compute the gain changes.<\/p>\n<p>Here is a view of the result&nbsp;:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-3.png\"><img decoding=\"async\" loading=\"lazy\" width=\"700\" height=\"108\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-3.png\" alt=\"Screenshot of the simple gain in dB example\" class=\"wp-image-43094\" \/><\/a><\/figure>\n<h3 class=\"wp-block-heading\">An amplifier with an anti-clipping protection<\/h3>\n<p>This example adds protection against clipping and uses a JSFX function for that.<\/p>\n<pre class=\"wp-block-preformatted\">desc:Simple Amplifier with Soft Clip\nslider1:0&lt;-60,24,0.1&gt;Gain (dB) @init\ngain = 10^(slider1\/20); @slider\ngain = 10^(slider1\/20);\nfunction softclip(x) ( x \/ (1 + abs(x));\n); @sample\nspl0 = softclip(spl0 * gain);\nspl1 = softclip(spl1 * gain);<\/pre>\n<p>Here is a view of the result&nbsp;:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-4.png\"><img decoding=\"async\" loading=\"lazy\" width=\"700\" height=\"108\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-4.png\" alt=\"Screenshot of the simple gain in dB with. a soft clip example\" class=\"wp-image-43095\" \/><\/a><\/figure>\n<h3 class=\"wp-block-heading\">An amplifier with a VU meter<\/h3>\n<p>This example is the same as the one above, we just add a printed value of the gain.<\/p>\n<pre class=\"wp-block-preformatted\">desc:Simple Amplifier with VU Meter\nslider1:0&lt;-60,24,0.1&gt;Gain (dB) @init\nrms = 0;\ncoeff = 0.999; \/\/ RMS smoothing\ngain = 10^(slider1\/20); @slider\ngain = 10^(slider1\/20); @sample\n\/\/ Apply the gain\nspl0 *= gain;\nspl1 *= gain;\n\/\/ Compute RMS (mean value of the 2 channels)\nmono = 0.5*(spl0 + spl1);\nrms = sqrt((coeff * rms * rms) + ((1 - coeff) * mono * mono)); @gfx 300 200 \/\/ UI part\ngfx_r = 0.1; gfx_g = 0.1; gfx_b = 0.1;\ngfx_rect(0, 0, gfx_w, gfx_h); \/\/ Convert to dB\nrms_db = 20*log(rms)\/log(10);\nrms_db &lt; -60 ? rms_db = -60; \/\/ Normalisation for the display\nmeter = (rms_db + 60) \/ 60;\nmeter &gt; 1 ? meter = 1; \/\/ Green color\ngfx_r = 0;\ngfx_g = 1;\ngfx_b = 0; \/\/ Horizontal bar\ngfx_rect(10, gfx_h\/2 - 10, meter*(gfx_w-20), 20); \/\/ Text\ngfx_r = gfx_g = gfx_b = 1;\ngfx_x = 10;\ngfx_y = gfx_h\/2 + 20;\ngfx_printf(\"Level: %.1f dB\", rms_db);<\/pre>\n<p>The global structure of the code:<\/p>\n<ul class=\"wp-block-list\">\n<li>Apply the gain<\/li>\n<li>Compute a smoothed RMS value<\/li>\n<li>Convert to dB<\/li>\n<li>Display a horizontal bar<\/li>\n<li>Display a numerical value<\/li>\n<\/ul>\n<p>Here is a view of the result&nbsp;:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-5.png\"><img decoding=\"async\" loading=\"lazy\" width=\"700\" height=\"165\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-5.png\" alt=\"Screenshot of the simple example with a VU meter\" class=\"wp-image-43096\" \/><\/a><\/figure>\n<h3 class=\"wp-block-heading\">An amplifier using the UI lib from jsfx-ui-lib<\/h3>\n<p>In this example, we will use a JSFX UI library to produce a better representation of the amplifier\u2019s elements.<\/p>\n<p>First, clone the <a href=\"https:\/\/github.com\/geraintluff\/jsfx-ui-lib\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/geraintluff\/jsfx-ui-lib<\/a> repository and copy the file <strong>ui-lib.jsfx-inc<\/strong> into the directory where your JSFX files are saved.<\/p>\n<pre class=\"wp-block-preformatted\">desc:Simple Amplifier with UI Lib VU\nimport ui-lib.jsfx-inc\nslider1:0&lt;-60,24,0.1&gt;Gain (dB) @init\nfreemem = ui_setup(0);\nrms = 0;\ncoeff = 0.999;\ngfx_rate = 30; \/\/ 30 FPS @slider\ngain = 10^(slider1\/20); @sample\nspl0 *= gain;\nspl1 *= gain;\nmono = 0.5*(spl0 + spl1);\nrms = sqrt(coeff*rms*rms + (1-coeff)*mono*mono); \/\/ ---- RMS computation ----\nlevel_db = 20*log(rms)\/log(10);\nlevel_db &lt; -60 ? level_db = -60; @gfx 300 200\nui_start(\"main\"); \/\/ ---- Gain ----\ncontrol_start(\"main\",\"default\");\ncontrol_dial(slider1, 0, 1, 0);\ncut = (level_db + 100) \/ 200 * (ui_right() - ui_left()) + ui_left(); \/\/ ---- VU ----\nui_split_bottom(50);\nui_color(0, 0, 0);\nui_text(\"RMS Level: \");\ngfx_printf(\"%d\", level_db);\nui_split_bottom(10);\nuix_setgfxcolorrgba(0, 255, 0, 1);\ngfx_rect(ui_left(), ui_top(), ui_right() - ui_left(), ui_bottom() - ui_top());\nuix_setgfxcolorrgba(255, 0, 0, 1);\ngfx_rect(ui_left(), ui_top(), cut, ui_bottom() - ui_top());\nui_pop();<\/pre>\n<p>The global structure of the example:<\/p>\n<ul class=\"wp-block-list\">\n<li>Import and setup: The UI library is imported and then allocated memory (ui_setup) using @init;<\/li>\n<li>UI controls: control_dial creates a thematic potentiometer with a label, integrated into the library;<\/li>\n<li>Integrated VU meter: A small graph is drawn with ui_graph, normalizing the RMS value between 0 and 1;<\/li>\n<li>UI structure: ui_start(&#8220;main&#8221;) prepares the interface for each frame. ui_push_height \/ ui_pop organize the vertical space.<\/li>\n<\/ul>\n<p>Here is a view of the result&nbsp;:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-6.png\"><img decoding=\"async\" loading=\"lazy\" width=\"700\" height=\"303\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-6.png\" alt=\"Screenshot of the simple example with JSFX graphic elements\" class=\"wp-image-43097\" \/><\/a><\/figure>\n<h3 class=\"wp-block-heading\">A simple synthesizer<\/h3>\n<p>Now, produce some sound and use MIDI for that.<\/p>\n<p>The core of this example will be the ADSR envelope generator ([<a href=\"#reference_10\" id=\"#reference_10\">10<\/a>]).<\/p>\n<pre class=\"wp-block-preformatted\">desc:Simple MIDI Synth (Mono Sine)\n\/\/ Parameters\nslider1:0.01&lt;0.001,2,0.001&gt;Attack (s)\nslider2:0.2&lt;0.001,2,0.001&gt;Decay (s)\nslider3:0.8&lt;0,1,0.01&gt;Sustain\nslider4:0.5&lt;0.001,3,0.001&gt;Release (s)\nslider5:0.5&lt;0,1,0.01&gt;Volume @init\nphase = 0;\nnote_on = 0;\nenv = 0;\nstate = 0; \/\/ 0=idle,1=attack,2=decay,3=sustain,4=release @slider\n\/\/ Compute the increment \/ decrement for each states\nattack_inc = 1\/(slider1*srate);\ndecay_dec = (1-slider3)\/(slider2*srate);\nrelease_dec = slider3\/(slider4*srate); @block\nwhile ( midirecv(offset, msg1, msg23) ? ( status = msg1 &amp; 240; note = msg23 &amp; 127; vel = (msg23\/256)|0; \/\/ Note On status == 144 &amp;&amp; vel &gt; 0 ? ( freq = 440 * 2^((note-69)\/12); phase_inc = 2*$pi*freq\/srate; note_on = 1; state = 1; ); \/\/ Note Off (status == 128) || (status == 144 &amp;&amp; vel == 0) ? ( state = 4; ); );\n); @sample\n\/\/ ADSR Envelope [<a href=\"#reference_10\" id=\"#reference_10\">10<\/a>]\nstate == 1 ? ( \/\/ Attack env += attack_inc; env &gt;= 1 ? ( env = 1; state = 2; );\n); state == 2 ? ( \/\/ Decay env -= decay_dec; env &lt;= slider3 ? ( env = slider3; state = 3; );\n); state == 3 ? ( \/\/ Sustain env = slider3;\n); state == 4 ? ( \/\/ Release env -= release_dec; env &lt;= 0 ? ( env = 0; state = 0; );\n); \/\/ Sine oscillator\nsample = sin(phase) * env * slider5;\nphase += phase_inc;\nphase &gt; 2*$pi ? phase -= 2*$pi; \/\/ Stereo output\nspl0 = sample;\nspl1 = sample;<\/pre>\n<p>Global structure of the example:<\/p>\n<ul class=\"wp-block-list\">\n<li>Receives MIDI via <strong>@block<\/strong>;<\/li>\n<li>Converts MIDI note to frequency (A440 standard);<\/li>\n<li>Generates a sine wave;<\/li>\n<li>Applies an ADSR envelope;<\/li>\n<li>Outputs in stereo.<\/li>\n<\/ul>\n<p>Here is a view of the result&nbsp;:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-7.png\"><img decoding=\"async\" loading=\"lazy\" width=\"797\" height=\"253\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/03\/jsfx-on-fedora-linux-an-ultra-fast-audio-prototyping-engine-7.png\" alt=\"Screenshot of the synthesizer example\" class=\"wp-image-43098\" \/><\/a><\/figure>\n<h2 class=\"wp-block-heading\">Comparison with CLAP \/ VST3<\/h2>\n<h3 class=\"wp-block-heading\">JSFX + YSFX<\/h3>\n<p>Advantages of JSFX:<\/p>\n<ul class=\"wp-block-list\">\n<li>No compilation required;<\/li>\n<li>Instant reloading;<\/li>\n<li>Fast learning curve;<\/li>\n<li>Ideal for DSP prototyping;<\/li>\n<li>Portable between systems via YSFX.<\/li>\n<\/ul>\n<p>Limitations:<\/p>\n<ul class=\"wp-block-list\">\n<li>Less performant than native C++ for heavy processing;<\/li>\n<li>Less suitable for &#8220;industrial&#8221; distribution;<\/li>\n<li>Simpler API, therefore less low-level control.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\">CLAP \/ VST3 in C\/C++<\/h3>\n<p>Advantages:<\/p>\n<ul class=\"wp-block-list\">\n<li>Maximum performance;<\/li>\n<li>Fine-grained control over the architecture;<\/li>\n<li>Deep integration with the Linux audio ecosystem;<\/li>\n<li>Standardized distribution.<\/li>\n<\/ul>\n<p>Limitations:<\/p>\n<ul class=\"wp-block-list\">\n<li>Requires a complete toolchain;<\/li>\n<li>ABI management\/compilation;<\/li>\n<li>Longer development cycle.<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n<p>A functional audio effect can be written in just a few lines, adding a simple graphical interface, and then loaded this script as an CLAP \/ VST3 plugin on Fedora Linux. This requires no compilation, no complex SDK, no cumbersome toolchain.<\/p>\n<p>JSFX scripts don&#8217;t replace native C++ development when it comes to producing optimized, widely distributable plugins. However, they offer an exceptional environment for experimentation, learning signal processing, and rapid prototyping.<\/p>\n<p>Thanks to YSFX, JSFX scripts now integrate seamlessly into the Linux audio ecosystem, alongside Carla, Ardour, and a PipeWire-based audio system.<\/p>\n<p>For developers and curious musicians alike, JSFX provides a simple and immediate entry point into creating real-time audio effects on Fedora Linux.<\/p>\n<h2 class=\"wp-block-heading\">Available plugins<\/h2>\n<h3 class=\"wp-block-heading\">ysfx-chokehold<\/h3>\n<p>A free collection of JS (JesuSonic) plugins for Reaper.<\/p>\n<p>Code available at: <a href=\"https:\/\/github.com\/chkhld\/jsfx\">https:\/\/github.com\/chkhld\/jsfx<\/a><\/p>\n<p>To install this set of YSFX plugins:<\/p>\n<pre class=\"wp-block-preformatted\">$ dnf install ysfx-chokehold<\/pre>\n<p> YSFX plugins will be available at \/usr\/share\/ysfx-chokehold.<\/p>\n<h3 class=\"wp-block-heading\">ysfx-geraintluff<\/h3>\n<p>Collection of JSFX effects.<\/p>\n<p>Code available at: <a href=\"https:\/\/github.com\/geraintluff\/jsfx\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/geraintluff\/jsfx<\/a><\/p>\n<p>To install this set of YSFX plugins:<\/p>\n<pre class=\"wp-block-preformatted\">$ dnf install ysfx-geraintluff<\/pre>\n<p>YSFX plugins will be available at \/usr\/share\/ysfx-geraintluff.<\/p>\n<h3 class=\"wp-block-heading\">ysfx-jesusonic<\/h3>\n<p>Some JSFX effects from Cockos.<\/p>\n<p>Code available at: <a href=\"https:\/\/www.cockos.com\/jsfx\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.cockos.com\/jsfx<\/a><\/p>\n<p>To install this set of YSFX plugins:<\/p>\n<pre class=\"wp-block-preformatted\">$ dnf install ysfx-jesusonic<\/pre>\n<p>YSFX plugins will be available at \/usr\/share\/ysfx-jesusonic.<\/p>\n<h3 class=\"wp-block-heading\">ysfx-joepvanlier<\/h3>\n<p>A bundle of JSFX and scripts for reaper.<\/p>\n<p>Code available at: <a href=\"https:\/\/github.com\/JoepVanlier\/JSFX\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/JoepVanlier\/JSFX<\/a><\/p>\n<p>To install this set of YSFX plugins:<\/p>\n<pre class=\"wp-block-preformatted\">$ dnf install ysfx-joepvanlier<\/pre>\n<p>YSFX plugins will be available at \/usr\/share\/ysfx-joepvanlier.<\/p>\n<h3 class=\"wp-block-heading\">ysfx-lms<\/h3>\n<p>LMS Plugin Suite &#8211; Open source JSFX audio plugins<\/p>\n<p>Code available at: <a href=\"https:\/\/github.com\/LMSBAND\/LMS\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/LMSBAND\/LMS<\/a><\/p>\n<p>To install this set of YSFX plugins:<\/p>\n<pre class=\"wp-block-preformatted\">$ dnf install ysfx-lms<\/pre>\n<p>YSFX plugins will be available at \/usr\/share\/ysfx-lms.<\/p>\n<h3 class=\"wp-block-heading\">ysfx-reateam<\/h3>\n<p>Community-maintained collection of JS effects for REAPER<\/p>\n<p>Code available at: <a href=\"https:\/\/github.com\/ReaTeam\/JSFX\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/ReaTeam\/JSFX<\/a><\/p>\n<p>To install this set of YSFX plugins:<\/p>\n<pre class=\"wp-block-preformatted\">$ dnf install ysfx-reateam<\/pre>\n<p>YSFX plugins will be available at \/usr\/share\/ysfx-reateam.<\/p>\n<h3 class=\"wp-block-heading\">ysfx-rejj<\/h3>\n<p>Reaper JSFX Plugins.<\/p>\n<p>Code available at: <a href=\"https:\/\/github.com\/Justin-Johnson\/ReJJ\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/Justin-Johnson\/ReJJ<\/a><\/p>\n<p>To install this set of YSFX plugins:<\/p>\n<pre class=\"wp-block-preformatted\">$ dnf install ysfx-rejj<\/pre>\n<p>And all the YSFX plugins will be available at \/usr\/share\/ysfx-rejj.<\/p>\n<h3 class=\"wp-block-heading\">ysfx-sonic-anomaly<\/h3>\n<p>Sonic Anomaly JSFX scripts for Reaper<\/p>\n<p>Code available at: <a href=\"https:\/\/github.com\/Sonic-Anomaly\/Sonic-Anomaly-JSFX\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/Sonic-Anomaly\/Sonic-Anomaly-JSFX<\/a><\/p>\n<p>To install this set of YSFX plugins:<\/p>\n<pre class=\"wp-block-preformatted\">$ dnf install ysfx-sonic-anomaly<\/pre>\n<p>YSFX plugins will be available at \/usr\/share\/ysfx-sonic-anomaly.<\/p>\n<h3 class=\"wp-block-heading\">ysfx-tilr<\/h3>\n<p>TiagoLR collection of JSFX effects<\/p>\n<p>Code available at: <a href=\"https:\/\/github.com\/tiagolr\/tilr_jsfx\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/tiagolr\/tilr_jsfx<\/a><\/p>\n<p>To install this set of YSFX plugins:<\/p>\n<pre class=\"wp-block-preformatted\">$ dnf install ysfx-tilr<\/pre>\n<p>YSFX plugins will be available at \/usr\/share\/ysfx-tilr.<\/p>\n<h3 class=\"wp-block-heading\">ysfx-tukan-studio<\/h3>\n<p>JSFX Plugins for Reaper<\/p>\n<p>Code available at: <a href=\"https:\/\/github.com\/TukanStudios\/TUKAN_STUDIOS_PLUGINS\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/TukanStudios\/TUKAN_STUDIOS_PLUGINS<\/a><\/p>\n<p>To install this set of YSFX plugins:<\/p>\n<pre class=\"wp-block-preformatted\">$ dnf install ysfx-tukan-studio<\/pre>\n<p>YSFX plugins will be available at \/usr\/share\/ysfx-tukan-studio.<\/p>\n<h2 class=\"wp-block-heading\">Webography<\/h2>\n<p id=\"reference_1\">[1] &#8211; <a href=\"https:\/\/www.cockos.com\/jsfx\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.cockos.com\/jsfx<\/a><\/p>\n<p id=\"reference_2\">[2] &#8211; <a href=\"https:\/\/github.com\/geraintluff\/jsfx\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/geraintluff\/jsfx<\/a><\/p>\n<p id=\"reference_3\">[3] &#8211; <a href=\"https:\/\/github.com\/JoepVanlier\/ysfx\">https:\/\/github.com\/JoepVanlier\/ysfx<\/a><\/p>\n<p id=\"reference_4\">[4] &#8211; <a href=\"https:\/\/www.reaper.fm\/sdk\/js\/js.php\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.reaper.fm\/sdk\/js\/js.php<\/a><\/p>\n<p id=\"reference_5\">[5] &#8211; <a href=\"https:\/\/audinux.github.io\/\">https:\/\/aud<\/a><a href=\"https:\/\/audinux.github.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">i<\/a><a href=\"https:\/\/audinux.github.io\/\">nux.github.io<\/a><\/p>\n<p id=\"reference_6\">[6] &#8211; <a href=\"https:\/\/copr.fedorainfracloud.org\/coprs\/ycollet\/audinux\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/copr.fedorainfracloud.org\/coprs\/ycollet\/audinux<\/a><\/p>\n<p id=\"reference_7\">[7] &#8211; <a href=\"https:\/\/www.reaper.fm\/index.php\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.reaper.fm\/index.php<\/a><\/p>\n<p id=\"reference_8\">[8] &#8211; <a href=\"https:\/\/github.com\/falkTX\/Carla\">https:\/\/github.co<\/a><a href=\"https:\/\/github.com\/falkTX\/Carla\" target=\"_blank\" rel=\"noreferrer noopener\">m<\/a><a href=\"https:\/\/github.com\/falkTX\/Carla\">\/falkTX\/Carla<\/a><\/p>\n<p id=\"reference_9\">[9] &#8211; <a href=\"https:\/\/ardour.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/ardour.org<\/a><\/p>\n<p id=\"reference_10\">[10] &#8211; <a href=\"https:\/\/en.wikipedia.org\/wiki\/Envelope_(music)\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/en.wikipedia.org\/wiki\/Envelope_(music)<\/a><\/p>\n<p id=\"reference_11\">[11] &#8211; <a href=\"https:\/\/jackaudio.org\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/jackaudio.org<\/a><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Writing a real-time audio plugin on Linux often conjures up images of a complex environment: C++, toolchains, CMake, CLAP \/ VST3 \/ LV2 SDK, ABI\u2026 However, there is a much simpler approach\u00a0: JSFX This article offers a practical introduction to JSFX and YSFX on Fedora Linux: we&#8217;ll write some small examples, add a graphical [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":136425,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48,64],"tags":[1190,783,45,141,42,46,47,73],"class_list":["post-136424","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fedora-os","category-programming","tag-audio","tag-copr","tag-fedora","tag-fedora-contributor-community","tag-for-developers","tag-magazine","tag-news","tag-programming"],"_links":{"self":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/136424","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/comments?post=136424"}],"version-history":[{"count":0,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/136424\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/media\/136425"}],"wp:attachment":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/media?parent=136424"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/categories?post=136424"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/tags?post=136424"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}