Signal-Flow Scripting Language for Music

Sorbis

Sorbis is a domain-specific scripting language designed for synthesizing audio through modular signal-flow chains. It allows composers to define complex synthesis architectures—from oscillators and filters to rhythmic sequencers—using a concise, text-based syntax.

Overview

Sorbis operates on a "left-to-right" signal flow paradigm. Chains are composed of generators and processors, then mixed into a final output and rendered to a high-fidelity WAV file.

   _____              __     _     
  / ___/ ____  _____ / /_   (_)____
  \__ \ / __ \/ ___// __ \ / // ___/
 ___/ // /_/ / /   / /_/ // /(__  ) 
/____/ \____/_/   /_.___//_//____/  >> >> >> 
                                    
  ~ SIGNAL FLOW COMPUTER MUSIC ENGINE ~

Core Syntax

A Sorbis script consists of named assignments. The renderer resolves all dependencies and outputs the special chain o.

// Global tempo
bpm 120

// A simple modulation chain
~lfo: lfo 0.5 >> mul 400 >> add 600

// The output chain
o: saw 55 >> moog ~lfo 0.6 >> mul 0.5

Signal Flow Operator (>>)

Nodes pass audio forward. Use | or , as whitespace to make long chains more readable. ~filtered: noise >> bpf 2000 1.2 >> mul 0.4

Glob References

Sum multiple related chains instantly using the .. suffix: o: mix ~voice.. // Sums ~voice1, ~voice2, etc.


Synthesis Nodes

Oscillators & Noise

Sorbis includes standard periodic waveforms (antialiased) and colored noise generators for subtractive and FM synthesis.

~sweep: lfo 0.1 >> mul 10000
o: squ ~sweep >> mul 0.1
0-10000Hz square wave sweep

Filters

A comprehensive suite of filters for spectral shaping:

Math & Utilities


Sequencing System

Sorbis separates melody into three distinct components to provide maximum flexibility:

  1. Pitch: A cycling list of MIDI notes.
  2. Rhythm: A looping pattern of beat durations (supports tuplets and repeats).
  3. Combine: Merges the two into .freq (Hz) and .gate (on/off) signals.
// AM Synthesis (telphone tone)
bpm 60
~ts: pitch 72
~tr: rhythm 1 -1
~telephone: combine ~ts ~tr
~t_env: adsr ~telephone.gate 0.1 0.1 1 0.
~carrier: sin ~ts.freq >> mul ~t_env
~modulator: sin 30 >> mul 10
~fm: mix ~carrier >> mul ~modulator
o: mix ~fm >> mul 0.1
AM synthesis

Envelopes

ADSR

Triggered by a gate signal (typically from combine). adsr gate attack_s decay_s sustain_level release_s

Breakpoint (Env)

A multi-point envelope that triggers once at the start of rendering. env value1 time_ms1 value2 time_ms2 ... curve


Performance Characteristics


Technical Specifications

FeatureDetails
ImplementationRust
Output FormatWAV (32-bit float)
Enginefundsp / cpal
LicensingAGPLv3 (Software) / CC BY-NC-ND 4.0 (Docs)

View on Codeberg