### r4 - Cool is cool * `toFrequency` accepts notes by name (i.e. `"C4"`) * Envelope no longer accepts exponential scaling, only Tone.ScaledEnvelope * Buffer progress and load events which tracks the progress of all downloads * Buffer only accepts a single url * Sampler accepts multiple samples as an object. * `setPitch` in sampler -> `setNote` * Deprecated MultiSampler - use Sampler with PolySynth instead * Added [cdn](cdn.tonejs.org/latest/Tone.min.js) - please don't use for production code * Renamed DryWet to CrossFade * Functions return `this` to allow for chaining. i.e. `player.toMaster().start(2)`. * Added `units` to Signal class which allows signals to be set in terms of Tone.Time, Tone.Frequency, Numbers, or Decibels. * Replaced set/get method with ES5 dot notation. i.e. `player.setVolume(-10)` is now `player.volume.value = -10`. To ramp the volume use either `player.volume.linearRampToValueNow(-10, "4n")`, or the new `rampTo` method which automaically selects the ramp (linear|exponential) based on the type of data. * set/get methods for all Effects and Instruments * syncSignal and unsyncSignal moved from Signal to Transport BREAKING API CHANGES: The API has been changed consistently to use `.attribute` for getting and setting instead of `getAttribute` and `setAttribute` methods. The reasoning for this is twofold: firstly, Tone.Signal attributes were previously limited in their scheduling capabilities when set through a setter function. For exactly, it was not possible to do a setValueAtTime on the `bpm` of the Transport. Secondly, the new EcmaScript 5 getter/setter approach resembles the Web Audio API much more closely, which will make intermixing the two APIs even easier. If you're using Sublime Text, one way to transition from the old API to the new one is with a regex find/replace: find `Tone.Transport.setBpm\((\d+)\)` and replace it with `Tone.Transport.bpm.value = $1`. Or if setBpm was being invoked with a rampTime: find `Tone.Transport.setBpm\((\d+)\, (\d+)\)` and replace it with `Tone.Transport.bpm.rampTo($1, $2)`. ### r3 - Expressive Signal Core Change: * Swing parameter on Transport * Player loop positions stay in tempo-relative terms even with tempo changes * Envelope ASDR stay in tempo-relative terms even with tempo changes * Modified build script to accommodate using requirejs with build and minified version Signal Processing: * Tone.Expr: signal processing expression parser for Tone.Signal math * All signal binary operators accept two signals as inputs * Deprecated Tone.Threshold - new class Tone.GreaterThanZero * NOT, OR, AND, and IfThenElse signal logic operators * Additional signal classes: Inverse, Divide, Pow, AudioToGain, Subtract * Scale no longer accepts input min/max. Assumes [0,1] range. * Normalize class if scaling needs to happen from other input ranges * WaveShaper function wraps the WaveShaperNode Effects: * Distortion and Chebyshev distortion effects * Compressor and MultibandCompressor * MidSide effect type and StereoWidener * Convolver effect and example Synths: * Setters on PluckSynth and PulseOscillator * new PWMOscillator * OmniOscillator which combines PWMOscillator, Oscillator, and PulseOscillator into one * NoiseSynth ### r2 - Getting Physical * PluckSynth - Karplus-Strong Plucked String modeling synth * Freeverb * John Chowning Reverb (JCReverb) * LowpassCombFilter and FeedbackCombFilter * Sampler with pitch control * Clock tick callback is out of the audio thread using setTimeout * Optimized Tone.Modulo * Tests run using OfflineRenderingContext * Fixed Transport bug where timeouts/intervals and timelines were on a different tick counter * AmplitudeEnvelope + triggerAttackDecay on Envelope * Instruments inherit from Tone.Instrument base-class * midi<-->note conversions ### r1 - First!