Skip to content

Examples

Usage patterns beyond the basics covered in Getting Started.

DSP Introspection

Metadata

from cyfaust.interp import create_dsp_factory_from_string

code = '''
declare name "TestSynth";
declare author "Test Author";
declare version "1.0";
import("stdfaust.lib");
process = os.osc(440) * 0.1;
'''

factory = create_dsp_factory_from_string("synth", code)
dsp = factory.create_dsp_instance()
dsp.init(44100)

metadata = dsp.metadata()
print(metadata["name"])    # "TestSynth"
print(metadata["author"])  # "Test Author"

Factory Properties

factory = create_dsp_factory_from_file("synth.dsp")

print(factory.get_name())
print(factory.get_sha_key())
print(factory.get_dsp_code())
print(factory.get_compile_options())
print(factory.get_library_list())
print(factory.get_include_pathnames())

Parameter Control

DSP with UI Elements

code = """
import("stdfaust.lib");
freq = hslider("frequency", 440, 50, 2000, 1);
gain = vslider("gain", 0.5, 0, 1, 0.01);
gate = button("gate");

envelope = gate : en.adsr(0.01, 0.1, 0.8, 0.2);
process = os.osc(freq) * gain * envelope;
"""

factory = create_dsp_factory_from_string("synth", code)
dsp = factory.create_dsp_instance()
dsp.init(44100)

# Build UI to register parameters
dsp.build_user_interface()

# Reset all parameters to their defaults
dsp.instance_reset_user_interface()

Audio Processing

Frame-by-Frame (Single Sample)

import numpy as np

dsp.init(44100)

inputs = np.zeros(dsp.get_numinputs(), dtype=np.float32)
outputs = np.zeros(dsp.get_numoutputs(), dtype=np.float32)

inputs[0] = 0.5
dsp.frame(inputs, outputs)
# outputs now contains one processed sample

Timestamped Computation

For sample-accurate automation with microsecond timestamps:

import numpy as np

buffer_size = 64
inputs = np.zeros((dsp.get_numinputs(), buffer_size), dtype=np.float32)
outputs = np.zeros((dsp.get_numoutputs(), buffer_size), dtype=np.float32)

timestamp_usec = 1000000.0  # 1 second
dsp.compute_timestamped(timestamp_usec, buffer_size, inputs, outputs)

Cloning DSP Instances

dsp = factory.create_dsp_instance()
dsp.init(44100)

# Clone for parallel processing with independent state
cloned = dsp.clone()
cloned.init(44100)

Real-Time Audio

from cyfaust.interp import create_dsp_factory_from_file, RtAudioDriver
import time

factory = create_dsp_factory_from_file("osc.dsp")
dsp = factory.create_dsp_instance()
dsp.init(48000)

driver = RtAudioDriver(48000, 256)
driver.init(dsp)
driver.start()

time.sleep(2)  # play for 2 seconds

driver.stop()

Box API

UI Widgets as Boxes

from cyfaust.box import (
    box_context, box_hslider, box_vslider, box_button,
    box_int, box_real, box_soundfile
)

with box_context():
    freq = box_hslider("frequency",
        box_int(440), box_int(50), box_int(2000), box_int(1))
    gain = box_vslider("gain",
        box_real(0.5), box_real(0), box_real(1), box_real(0.01))
    gate = box_button("gate")

    combined = freq * gain * gate

Code Generation from Boxes

from cyfaust.box import box_context, box_wire, box_float, box_seq, box_par
from cyfaust.interp import create_dsp_factory_from_boxes

with box_context():
    # input * 0.5
    gain = box_seq(box_wire(), box_par(box_wire(), box_float(0.5)))

    factory = create_dsp_factory_from_boxes("gain", gain)
    dsp = factory.create_dsp_instance()

Signal API

Programmatic DSP Construction

from cyfaust.signal import (
    signal_context, SignalVector,
    sig_input, sig_real, sig_mul, sig_delay, sig_int
)
from cyfaust.interp import create_dsp_factory_from_signals

with signal_context():
    input_sig = sig_input(0)
    output = sig_mul(input_sig, sig_real(0.5))

    signals = SignalVector()
    signals.add(output)

    factory = create_dsp_factory_from_signals("gain", signals)
    dsp = factory.create_dsp_instance()

Cross-Compilation from Signals

from cyfaust.signal import signal_context, SignalVector, sig_input, sig_real, sig_mul

with signal_context():
    output = sig_mul(sig_input(0), sig_real(0.5))

    signals = SignalVector()
    signals.add(output)

    cpp_code = signals.create_source("my_dsp", "cpp")
    c_code = signals.create_source("my_dsp", "c")

Initialization Lifecycle

The full DSP initialization sequence, for cases where you need fine-grained control:

sample_rate = 44100

# Factory-level class init (once per factory)
factory.class_init(sample_rate)

# Instance-level init
dsp.init(sample_rate)

# Or granular initialization:
dsp.instance_constants(sample_rate)    # set sample-rate-dependent constants
dsp.instance_reset_user_interface()    # reset parameters to defaults
dsp.instance_clear()                   # clear internal buffers/state