Sequencernow supports looping. Some fixes were also made.- New
AudioNodetree introspection system in the modulegraph. - In order to take effect,
Sequencerchanges must now be committed to the backend.
Sequencercan now have inputs.- New opcode
convolvefor FFT based convolution using thefft_convolvercrate. - Enhanced resampling with quality settings.
- New opcode
resample_firfor FIR based sinc resampling using theresamplercrate. - New
Waveresampling methodresample_fir. - The 64-bit hacker prelude is now
prelude64. - The 32-bit prelude is now
prelude32. - The
wavechopcode is nowplaywave. - The
wavech_atopcode is nowplaywave_at.
- New PolyBLEP oscillator opcodes
poly_saw,poly_saw_hz,poly_square,poly_square_hz,poly_pulseandpoly_pulse_hz. - Noise functions now accept seed as
u64instead ofi64. sine_phase,ramp_phaseandramp_hz_phaseopcodes 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(). BiquadBankparameters for channeliare now set with the syntaxSetting::biquad(...).index(i).- New
Wavemethodsmixandmix_channel. - New builder notation for setting envelope sampling interval, for example,
lfo(|t| exp(-t)).interval(0.01). - New
Wavemethodsappend,amplifyandretain. - Added math functions
wrapandmirror. - Added
Wavemethodsmultifilterandmultifilter_latency.
Net::chainis more robust now.- Ring buffer component in the module
ring. - New method
Net::fade_infor adding a node with a fade-in. Net::pipeis nowNet::pipe_alland can no longer panic.Net::pipe_opis nowNet::pipe,Net::bus_opisNet::bus,Net::bin_opisNet::binary,Net::stack_opisNet::stack,Net::branch_opisNet::branch, andNet::thru_opisNet::thru.- New methods
Net::can_pipe,Net::can_bus,Net::can_binary,Net::can_stack,Net::can_branch,Net::can_thru,Net::can_sumandNet::can_product. - New methods
Net::sumandNet::product. Net::pipe_inputandNet::pipe_outputcan no longer panic.- New method
Net::idsfor iterating over contained node IDs. - New method
Net::containsfor checking existence of a node. - New methods
Net::sourceandNet::output_sourcefor retrieving network edge information. - New methods
Net::inputs_inandNet::outputs_infor querying contained node arity. - New methods
Net::set_sourceandNet::set_output_sourcefor setting network edges. - New type
net::NetErrorand methodNet::errorfor detecting errors. Cycles no longer cause a panic, but trigger an error condition instead.
- Fixed
no_stdsupport.
- Added choice of interpolation algorithm to
AtomicSynth. - New opcode
sine_phase. - Opcodes
delayandtap_linearnow support zero sample delays. - New method
Net::crossfadefor replacing a unit with a smooth crossfade. - Clarified latency: it only applies to involuntary causal latencies.
AdaptiveTanhis now genericAdaptivedistortion with an inner shape. To migrate, tryAdaptive::new(timescale, Tanh(hardness)).Clipshape now has a hardness parameter.Clip(1.0)to migrate.SvfCoeffsis nowSvfCoefs.- Implemented denormal prevention for
x86inside 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_phaseandramp_hz_phase.
- 64-bit atomics were removed in order to support 32-bit targets.
- Fixed
no_stdsupport.
- 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/64suffix are replaced with the 32-bit version with the suffix removed. - Explicit SIMD support in block processing via the
widecrate. no_stdsupport can be enabled by disabling thestdfeature.- Buffers for the
processmethod have been rewritten. Both stack and heap allocation is supported. - Settings have been rewritten, to make them compatible with the
AudioUnitsystem. - Waveshaping is done using a trait now. Remove
Shape::prefix from shapes to migrate, except forAdaptiveTanh, which is created usingAdaptiveTanh::new. - The
Atanshape 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 >> Bcan now be writtenpipe(A, B). What used to bepipeetc. now has anisuffix, for example,pipei. rndfunction is nowrnd1.hashfunction 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:silenceis nowzero.- New opcode
impulse. - Attempted optimization of reverb delay times in the example
optimize. - New opcodes
node64andnode32for converting anAudioUnitinto anAudioNode. - New reverb opcodes
reverb2_stereoandreverb3_stereo. - New opcodes
allnestandallnest_cfor nested allpass filters. - New opcodes
tap_linearandmultitap_linearfor delay lines with linear interpolation. - High frequency damping parameter was added to
reverb_stereo. Damping used to be hardcoded to 1. - New opcode
rotatefor rotating a stereo signal.
AudioNodenow requiresSendandSync.- Feedback units
Feedback64andFeedback32. Shape::Atanwas contributed by Serdnad.- New opcode
resynthfor frequency domain resynthesis.
- Snoop node for sharing audio data with a frontend thread.
- Meter smoothing parameters are now timescales specified in seconds.
Shape::SoftCrushwas tweaked.- New adaptive distortion mode
Shape::AdaptiveTanh. - Oversampling now employs a minimum phase halfband filter.
Net64BackendandNet32Backendare now calledNetBackend64andNetBackend32.Sequencer64BackendandSequencer32Backendare now calledSequencerBackend64andSequencerBackend32.Slot32/64is 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_hzandtri_hzfor non-bandlimited square and triangle waves. - Lorenz and Rössler chaotic system oscillators as opcodes
lorenzandrossler. swap_stereois now genericreverse, which reverses channel order.- Resonant two-pole filter by Paul Kellett as
bandrezandlowrez. - Sample-and-hold opcodes
holdandhold_hz. - Fixed inbuilt waveform phases.
- Reduced number of all-pass stages in
phaserto 10. - Sequencer
addandadd_durationare nowpushandpush_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/64now operates on stable node IDs of typeNodeId. Other improvements.swapopcode is nowswap_stereo, to avoid possible conflicts withstd::mem::swap.- New method
AudioNode::allocatefor preallocating everything. - Identity function has been renamed from
idtoidentity, to match the standard library. - Setting system MPSC channels were async by mistake; they are now blocking.
Net32/64can 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
rnd2from Krull64 output stage.
- Composable setting system for making it easier to control basic settings in real time.
systemopcode was renamedupdate.- New waveforms, organ and soft saw.
- New envelope opcodes with any number of inputs:
envelope_inandlfo_in.
- New opcode
Resamplefor variable speed cubic resampling. Wave32/64improvements. Symphonia integration for reading audio files.- Tagged constants were removed. They were not scaleable.
- Callbacks were removed from
Sequencer32/64andNet32/64. Will reimplement if requested. - The
followfilter now jumps immediately to the very first input value.
detectorwas removed (it did not work).- New opcode
biquadfor an arbitrary biquad filter. Net32/64methodaddwas renamedpush(it conflicted with the operator implementation).- Graph syntax was implemented for
Net32/64. They can also be combined with components from the preludes.
semitoneis nowsemitone_ratio.- New opcodes
feedback2andfdn2, 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(). goertzelis nowdetector.chorusgain was adjusted.flangerwas tweaked.- New opcode
systemwith a user provided callback. See thesoundmodule for an example. - Ability to replace nodes in
Net32andNet64. Improved chaining method. Sequencerhas been replaced withSequencer32andSequencer64.Auhas been removed.- Callback functionality was added to the sequencer and network components.
- Ability to jump in time was added to the sequencer.