Changelog
Release Notes
2.0.0 - Beta 4
Breaking Changes
Flip-flopped back to using strings for name lookups when calling from python. (Internally flags are still used in many places for performance.)
So use eg dsp.wt('sine') instead of dsp.wt(dsp.SINE) or sound.pan(0.1, method='gogins') etc.
Wavetable / window options are:
sinesineinsineoutcostrisawphasorrsawhannhammblackorblackmanbartorbartlettkaiserrndlinehanninhannoutgaussgaussingaussoutpluckin-
pluckout -
square sinc
Panning types:
constantlinearsinegogins
Features
- Removed all the old examples and wrote the first tutorial script.
- The first set of soundpipe modules are now available via the
fxmodule!fx.lpf,fx.hpf,fx.bpf, andfx.brfbutterworth filters.fx.compressor... a compressor.fx.mincera phase vocoder with independent control over pitch and speed.fx.paulstretch... paulstretch.fx.saturatora saturation distortion.
- A new
Wavesetdatatype for Trevor Wishart-style microsound synthesis and easy creation of wavetable stacks for 2d oscs. Featuring:- Waveset substitution
- Single waveform substitution (replace all wavesets with a sinewave, for example)
- Waveset collection substitution (replace wavesets with a collection of wavetables or another waveset)
- Waveform morph substitution (replace wavesets with an lfo-controlled morph through a wavetable stack) (in progress)
- Waveset normalization
- Waveset time-stretching
- Waveset reversal
- Waveset retrograde (reversing the contents of the wavesets while preserving their order)
- Waveset harmonic distortion (in progress)
- Waveset transposition (in progress)
- Waveset morphing (in progress)
- Waveset inversion (in progress)
- Waveset substitution
- Broke oscs up into smaller units and added a few new ones consisting of:
Oscwhich is a simple wavetable oscOsc2da simple 2d wavetable oscPulsara pulsar synthesis implementation (now with pulsewidth modulation!)Pulsar2dthe same which accepts optional wavetable stacks for the wavetable and window paramsFoldan implementation of an infinite wavetable folderPlucka basic implementation of a plucked string physical model which can be fed with an arbitrary wavetable impulseDSSan implementation of dynamic stochastic synthesis (in progress)Aliasa single-sample aliasing pulsetrain osc
- Total rewrite of
grains.GrainCloud, nowgrains.Cloud(andSoundBuffer.cloud)- Uses
mincerfor pitch shifting - Grainlength and grain density are no longer tightly coupled: no more
densityparam. It is replaced with agrainlengthvalue/wavetable and agridvalue/wavetable. - Grain masking
- Uses
- Many params can be given as either a fixed-value float (like
1.3), a built-in wavetable flag (likehannoutorrnd), or a wavetable-like object (a list, numpy array, sound buffer, etc). EG a cloud frozen in timeCloud(position=0.75), advancing linearly through timeCloud(position='phasor'), or interpolated through four points in timeCloud(position=[0, 1, 0.25, 0.75]). - A simple envelope follower interface on
SoundBufferwhich produces aWavetableviaSoundBuffer.toenv(), also available asfx.envelope_follower() - A
SoundBuffer-to-Wavetableshortcut viaSoundBuffer.towavetable()
Bugfixes
- Some cython extension packaging improvements
- Many misc bugfixes, I lost track... probably also at least a few shiny new bugs as well
2.0.0 - Beta 3
Features
- Basic FIR filter with
filters.firorfx.convolve - SoundBuffer normalization with
fx.norm - Get SoundBuffer magnitude with
dsp.mag - Single and multitap delays with
fx.delayandfx.mdelay - Some new built-in
wavetable.windowtypes:dsp.SINEIN/dsp.SINEOUT,dsp.HANNIN/dsp.HANNOUTfor fades - More flexible frequency table creation from arbitrary scales, tunings and scale bitmasks with
tune.tofreqs
Bugfixes
- Fix phase overflow in
interpolation._linear_point - Fixed a nasty bug when loading mono soundfiles from disk.
2.0.0 - Beta 2
Features
- Point interpolation with
interpolation.linear_point
Bugfixes
- Examples can be run from anywhere
- Interpolation fixes
Performance Optimizations
- Faster ADSR wavetable generation
- Faster pitch shifting
- Faster interpolation
- Faster grain cloud generation
- Some misc
SoundBufferperformance improvements (more to come)
2.0.0 - Beta 1
Features
- Added
fxmodule - Added first pass
fx.gogranular overdrive effect. Seeexamples/fxgo_example.pyfor usage.
Bugfixes
- Fixed a packaging issue preventing the
tunemodule from loading. - Better overflow handling in
SoundBuffer.adsrandwavetables.adsr - Fixed a bug with
SoundBuffer.remixwhen mixing to a single channel - Fixed a bug during
Wavetableinitialization when using wavetable flags to create a window.
2.0.0 - Alpha 9
Final feature releases / big api changes before going to beta.
- Breaking changes:
- Durations for most APIs are now given in seconds (floats) rather than
integer frames.
len(SoundBuffer)still returns a length in frames per python convention, and slicing into aSoundBufferis also still done by frame (and channel) but there is a newSoundBuffer.durproperty to get duration in seconds as well. - Wavetables are no longer specified with string names, instead built-in
flags which are available on both the
wavetableanddspmodules are used. Eg to apply a sinewave envelop:sound.env(dsp.SINE)instead ofsound.env('sine'). The wavetypes available areSINE,COS,TRI,SAW(which is also aliased toPHASOR),RSAW(reverse sawtooth),HANN,HAMM,BLACKorBLACKMAN,BARTorBARTLETT,KAISER,SQUARE, and theRNDflag to select one at random.
- Durations for most APIs are now given in seconds (floats) rather than
integer frames.
Oscchanges:- Added 2d wavetable synthesis (similar to max/msp
2d.wave~) toOscplus example script - To create a 2d
Osc, use thestackkeyword arg on initialization:Osc(stack=[dsp.RND, [0,1], dsp.SINE], lfo=dsp.SINE) Oscwavetables may be:- an int flag for standard wavetables (
dsp.SINE,dsp.TRI, etc) - a python list of floats (
[0,1,0.5,0.3]) - a wavetable (
wavetables.Wavetable([0,1,0,1])) - a soundbuffer (
soundbuffer.SoundBuffer(filename='something.flac'))
- an int flag for standard wavetables (
- 2d wavetable stacks are a python list of any combination of the above.
- The same types are acceptable for:
wavetable(the basic waveform)window(an optional window to apply to the waveform wavetable - useful for eg pulsar synthesis)mod(the frequency modulation wavetable)- and
lfo(the 2d modulation wavetable)
- Added 2d wavetable synthesis (similar to max/msp
SoundBufferchanges:- Added
remixfor remixing a soundbuffer from N channels to N channels. - Panning algorithms operate on arbitrary numbers of channels (but use same algorithms applied to odd & even numbered channels instead of left & right)
- Return a reversed copy of a soundbuffer with
sound.reversed()or reverse in place withsound.reverse() - New ADSR envelopes with
sound.adsr(a=1, d=1, s=0.5, r=1) - Generate a
GrainCloudfrom aSoundBufferwithsound.cloud() - Clip samples to min/max with
sound.clip(minval=-1, maxval=1) - Taper ends of sounds (linear fade-in, fade-out) with
sound.taper(length)
- Added
- ADSR wavetable generator with
wavetables.adsr(a=100, d=100, s=0.5, r=100, 1024) - New
Wavetabletype forSoundBuffer-like operator-overloaded wavetable manipulation & composition - New
GrainCloudwavetable-driven granulator. See theexamples/swarmy_graincloud.pyexample for more. GrainCloud-driven pitch shift without time change (sound.transpose(speed)) and time stretch without pitch shift (sound.stretch(length)) methods forSoundBuffer.dsp.cloud(SoundBuffer, *args, **kwargs)shortcut forGrainCloudcreation.- Read wavetables from 1 channel sound files with
wavetables.fromfile - Added a simple helper for async rendering with
multiprocessing.Pool SoundBuffers can now be pickled (enables passing them between processes)SoundBuffercan be initialized (and spread across channels) from a normal python list
2.0.0 - Alpha 6-8
This was meant to be a feature-only release, to add the final round of features before going into beta / bugfix mode. Instead I switched from using numpy arrays directly to a first pass of a more general typed memoryview approach, and moved some more things into cython.
Also, hoo boy was pip install pippi ever broken.
It should be working now.
2.0.0 - Alpha 5
Bugfix release. Fixed an idiotic regression in SoundBuffer.
2.0.0 - Alpha 4
New in alpha 4:
- More speed improvements!
- Linear interpolation option for pitch shifting
- Pulsar synthesis with
Osc - Support for importing Scala
.scltuning files (Mapping file support coming later...) - Waveform visualization with
graph.waveform SoundBuffer.fillreturns a copy of the sound instead of altering it in placeSamplerabstraction forOsc-like treatment of samples and banks of samples
2.0.0 - Alpha 3
Optimizations and improvements in this release:
- Much better performance for wavetable and granular synthesis
- Improvements and additions to the
rhythmmodules- Better handling of
rhythm.curvewhich now takes a length param instead of an obscure combination of multipliers rhythm.curvecan now be provided a custom wavetable- Added MPC swing helper for onset lists (via
rhythm.swing) - Added a euclidean rhythm generator
rhythm.eu - Added a pattern generation helper
rhythm.pattern - Added pattern-to-onset and string-to-pattern helpers
- Patterns are the same as pippi 1 (I may even just port some code) and can be in a few forms:
- String literals with ascii notation eg: 'xx x- x' which is the same as 'xx.x-.x'
- Lists of 'truthy' and 'falsey' values eg: ['1', True, 0, False] which is the same as 'xx..'
- Patterns are the same as pippi 1 (I may even just port some code) and can be in a few forms:
- Better handling of
- Misc bugfixes:
- Fix
randomparam forwavetable.windowandwavetable.window - Fix bad params for
wavetable.windowandwavetable.window-- falls back to sine in both cases
- Fix
2.0.0 - Alpha 2
This release includes a few missing pieces to core functionality including:
- A crude squarewave wavetype for the wavetable osc!
- Custom wavetables for the wavetable osc and window/wavetable generators!
See the
simple_custom_wavetable.pyexample for use with the wavetable osc. - A simple non-interpolating
speedmethod onSoundBufferfor pitch shifting sounds - A set of rhythm helpers in the
rhythmmodule useful for constructing onset / timing lists.rhythm.curvewhich lets you map any of the window types to a list of onsets -- check out thesimple_snare_bounce.pyexample in the examples directory.
- Some more example scripts including:
simple_snare_bounce.pyDemoing therhythm.curvehelpermulti_snare_bounce.pyA more interesting variation on the snare bounce examplesimple_custom_wavetable.pyShowing a user-defined wavetable used withOscsynth_chords.pyUsing thetunemodule withOscto create a simple chord progression
2.0.0 - Alpha 1
This is the initial alpha release of pippi 2 -- which is very barebones at the moment, but already pretty functional!
Beware: the behavior of core functionality and features will probably change throughout the alpha releases of pippi 2. I'll try to document it here in the release notes.
This release provides:
- SoundBuffer abstraction for reading/writing soundfiles and doing basic operations on sounds.
- Osc abstraction for simple wavetable synthesis.
- Initial set of built-in wavetables for windowing (sine, triangle, saw, inverse saw) and synthesis (sine, cosine, triangle, saw inverse saw)
- Set of panning algorithms and other built-in sound operations like addition, subtraction,
multiplication, mixing (and operater-overloaded mixing via
sound &= sound), dubbing, concatenation. - A small set of helpers and shortcuts via the
dspmodule for loading, mixing, and concatenating (viadsp.join) sounds. - Basic granular synthesis and wavetable synthesis examples.