- New PolyBLEP oscillator opcodes
poly_saw
,poly_saw_hz
,poly_square
,poly_square_hz
,poly_pulse
andpoly_pulse_hz
. - Noise functions now accept seed as
u64
instead ofi64
. sine_phase
,ramp_phase
andramp_hz_phase
opcodes were removed: there is a new builder notation for setting the initial phase, for example,sine().phase(0.0)
.- New builder notation for setting noise generator seed, for example,
noise().seed(1)
. - New opcode
biquad_bank()
. BiquadBank
parameters for channeli
are now set with the syntaxSetting::biquad(...).index(i)
.- New
Wave
methodsmix
andmix_channel
. - New builder notation for setting envelope sampling interval, for example,
lfo(|t| exp(-t)).interval(0.01)
. - New
Wave
methodsappend
,amplify
andretain
.
Net::chain
is more robust now.- Ring buffer component in the module
ring
. - New method
Net::fade_in
for adding a node with a fade-in. Net::pipe
is nowNet::pipe_all
and can no longer panic.Net::pipe_op
is nowNet::pipe
,Net::bus_op
isNet::bus
,Net::bin_op
isNet::binary
,Net::stack_op
isNet::stack
,Net::branch_op
isNet::branch
, andNet::thru_op
isNet::thru
.- New methods
Net::can_pipe
,Net::can_bus
,Net::can_binary
,Net::can_stack
,Net::can_branch
,Net::can_thru
,Net::can_sum
andNet::can_product
. - New methods
Net::sum
andNet::product
. Net::pipe_input
andNet::pipe_output
can no longer panic.- New method
Net::ids
for iterating over contained node IDs. - New method
Net::contains
for checking existence of a node. - New methods
Net::source
andNet::output_source
for retrieving network edge information. - New methods
Net::inputs_in
andNet::outputs_in
for querying contained node arity. - New methods
Net::set_source
andNet::set_output_source
for setting network edges. - New type
net::NetError
and methodNet::error
for detecting errors. Cycles no longer cause a panic, but trigger an error condition instead.
- Fixed
no_std
support.
- Added choice of interpolation algorithm to
AtomicSynth
. - New opcode
sine_phase
. - Opcodes
delay
andtap_linear
now support zero sample delays. - New method
Net::crossfade
for replacing a unit with a smooth crossfade. - Clarified latency: it only applies to involuntary causal latencies.
AdaptiveTanh
is now genericAdaptive
distortion with an inner shape. To migrate, tryAdaptive::new(timescale, Tanh(hardness))
.Clip
shape now has a hardness parameter.Clip(1.0)
to migrate.SvfCoeffs
is nowSvfCoefs
.- Implemented denormal prevention for
x86
inside feedback loops. - The resonator now accepts a Q parameter instead of bandwidth in Hz. To migrate, Q = center / bandwidth.
- Feedback biquads and dirty biquads by Jatin Chowdhury.
- Sine oscillator has now generic inner state. To migrate, use
Sine<f32>
if speed is important orSine<f64>
if steady maintenance of phase is important. - Non-bandlimited ramp node with opcodes
ramp
,ramp_hz
,ramp_phase
andramp_hz_phase
.
- 64-bit atomics were removed in order to support 32-bit targets.
- Fixed
no_std
support.
- Denormal flushing was removed for now.
- This release involves a major rewrite and many changes.
- 64-bit sample support is gone. All samples are now
f32
. - The 64-bit prelude presents a 32-bit interface now, with 64-bit internal state.
- All types and traits with
32/64
suffix are replaced with the 32-bit version with the suffix removed. - Explicit SIMD support in block processing via the
wide
crate. no_std
support can be enabled by disabling thestd
feature.- Buffers for the
process
method have been rewritten. Both stack and heap allocation is supported. - Settings have been rewritten, to make them compatible with the
AudioUnit
system. - Waveshaping is done using a trait now. Remove
Shape::
prefix from shapes to migrate, except forAdaptiveTanh
, which is created usingAdaptiveTanh::new
. - The
Atan
shape was tweaked to return values in -1...1 while retaining a slope of 1 at the origin. - Asymmetric follow filters are now explicitly declared:
follow((a, r))
is nowafollow(a, r)
. - Functions corresponding to operators are now available as an option, for example,
A >> B
can now be writtenpipe(A, B)
. What used to bepipe
etc. now has ani
suffix, for example,pipei
. rnd
function is nowrnd1
.hash
function is nowhash1
. Added new hash functionhash2
.- Wavetable oscillator now accepts an
Arc<Wavetable>
in the constructor. - Denormals are now flushed to zero in feedback loops.
Wave32/64
:silence
is nowzero
.- New opcode
impulse
. - Attempted optimization of reverb delay times in the example
optimize
. - New opcodes
node64
andnode32
for converting anAudioUnit
into anAudioNode
. - New reverb opcodes
reverb2_stereo
andreverb3_stereo
. - New opcodes
allnest
andallnest_c
for nested allpass filters. - New opcodes
tap_linear
andmultitap_linear
for delay lines with linear interpolation. - High frequency damping parameter was added to
reverb_stereo
. Damping used to be hardcoded to 1. - New opcode
rotate
for rotating a stereo signal.
AudioNode
now requiresSend
andSync
.- Feedback units
Feedback64
andFeedback32
. Shape::Atan
was contributed by Serdnad.- New opcode
resynth
for frequency domain resynthesis.
- Snoop node for sharing audio data with a frontend thread.
- Meter smoothing parameters are now timescales specified in seconds.
Shape::SoftCrush
was tweaked.- New adaptive distortion mode
Shape::AdaptiveTanh
. - Oversampling now employs a minimum phase halfband filter.
Net64Backend
andNet32Backend
are now calledNetBackend64
andNetBackend32
.Sequencer64Backend
andSequencer32Backend
are now calledSequencerBackend64
andSequencerBackend32
.Slot32/64
is a real-time updatable audio unit slot with crossfading between units.- "Hammond" wavetable, which emphasizes the first three partials.
- Reverb time calculation was tweaked to take into account room size.
- New math functions
sqr_hz
andtri_hz
for non-bandlimited square and triangle waves. - Lorenz and Rössler chaotic system oscillators as opcodes
lorenz
androssler
. swap_stereo
is now genericreverse
, which reverses channel order.- Resonant two-pole filter by Paul Kellett as
bandrez
andlowrez
. - Sample-and-hold opcodes
hold
andhold_hz
. - Fixed inbuilt waveform phases.
- Reduced number of all-pass stages in
phaser
to 10. - Sequencer
add
andadd_duration
are nowpush
andpush_duration
. - Reseting a node and setting its sample rate are now two distinct operations.
- Sequencer can now have a real-time safe backend.
- Fade curves for Sequencer events. To migrate, use the curve
Fade::Smooth
. Net32/64
now operates on stable node IDs of typeNodeId
. Other improvements.swap
opcode is nowswap_stereo
, to avoid possible conflicts withstd::mem::swap
.- New method
AudioNode::allocate
for preallocating everything. - Identity function has been renamed from
id
toidentity
, to match the standard library. - Setting system MPSC channels were async by mistake; they are now blocking.
Net32/64
can now have a real-time safe backend.
- More settings implemented.
- Signal routing is now an exclusive operation, for practical reasons.
- Granular synthesizer. FunUTD is now a dependency.
- Block rate adapter that converts calls to block processing.
- New random function
rnd2
from Krull64 output stage.
- Composable setting system for making it easier to control basic settings in real time.
system
opcode was renamedupdate
.- New waveforms, organ and soft saw.
- New envelope opcodes with any number of inputs:
envelope_in
andlfo_in
.
- New opcode
resample
for variable speed cubic resampling. Wave32/64
improvements. Symphonia integration for reading audio files.- Tagged constants were removed. They were not scaleable.
- Callbacks were removed from
Sequencer32/64
andNet32/64
. Will reimplement if requested. - The
follow
filter now jumps immediately to the very first input value.
detector
was removed (it did not work).- New opcode
biquad
for an arbitrary biquad filter. Net32/64
methodadd
was renamedpush
(it conflicted with the operator implementation).- Graph syntax was implemented for
Net32/64
. They can also be combined with components from the preludes.
semitone
is nowsemitone_ratio
.- New opcodes
feedback2
andfdn2
, which include extra feedback loop processing. The extra processing is not applied in the feedforward path. - Wetness argument was removed from
reverb_stereo
. Room size argument was added. An average room size is 10 meters. To migrate, replacereverb_stereo(wet, time)
withwet * reverb_stereo(10.0, time) & (1.0 - wet) * multipass()
. goertzel
is nowdetector
.chorus
gain was adjusted.flanger
was tweaked.- New opcode
system
with a user provided callback. See thesound
module for an example. - Ability to replace nodes in
Net32
andNet64
. Improved chaining method. Sequencer
has been replaced withSequencer32
andSequencer64
.Au
has been removed.- Callback functionality was added to the sequencer and network components.
- Ability to jump in time was added to the sequencer.