Friday 15th April, 2016 (view commits)
“I gotta have more cowbell!” - The Bruce Dickinson
The main feature in this release is the completely new sample system for
working with large folders of samples. You can now easily index into and
filter over whole folders of samples with a simple yet powerful filter
system. This system has been in development for over a year now and has
been tuned and tweaked over many performances and practice sessions. See
the documentation and examples for sample as well as the new tutorial
section 3.7 for details.
We also have a number of exciting new sounds to play with including some beautifully sounding chiptune synths, fun retro FX and new drum samples including a full tabla set and a cowbell.
Finally, even more boot issues on both OS X and Windows that have been fixed making this the most polished and stable release to date.
Now go and get your live code on!
use_sample_pack_as and with_sample_pack_as have been removed.nil now no longer resolves to 0.0. Instead it
masks any defaults and ensures the downstream default (for the actual
synthdef itself) is honoured. This allows you to override any existing
synth defaults specified via use_synth_defaults for a given synth
trigger.current_random_seed - Get the current seed value of the random generator.set_cent_tuning! - global tuning.on - similar to if but behaves the same as the on: opt for
synths and samples.halves - create a ring of successive halves.doubles - create a ring of successive doubles.pick - similar to shuffle but allows duplicates. You may also
specify how many items to pick.fx_names - create a ring of all available FX.:dtri - detuned triangle waves.:pluck - a lovely synthesised plucked string.:chiplead - retro NES style lead synth.:chipbass - retro NES style bass synth.:chipnoise - retro NES style noise synth.:whammy - low-tech transposition effect similar to the
Digitech Whammy guitar pedal.:octaver - low-tech octave effect similar to early guitar
pedals.:vowel - modifies incoming signal to match human vowel
sounds.:mono - mono effect for summing stereo channels.:tanh FX is now more crunchy by default.:compressor and :krush FX now correctly honour the mix: opt.sample fn gained source and filter pre-opts. You may now specify
a number of parameters directly before the opts which describe both
folders containing samples and filters over those folders to allow you
to easily and quickly work with large sample sets. See Section 3.7 of
the tutorial for more information.hpf: and lpf: opts. Any cutoff: opts are
automatically switched to lpf: and any errors will be reported with
an lpf: prefix.compress:
opt. This means you can now compress any triggered sample directly
without the need to reach for an FX.pre_amp: opt which applies the amp at the
beginning of its internal signal chain. You can use this to overload
the new compressor.hpf_ and lpf_ prefix (such as
hpf_attack, lpf_decay_level and friends).load_samples will now load all the
samples within that directory.free_samples will now free all the
loaded samples within that directory.:tabla_ sample group with a range of tabla drum sounds.:vinyl_ sample group with a range of vinyl scratches and
hisses.:drum_cowbell, :drum_roll, :misc_cros,
:misc_cineboom, :perc_swash, :perc_till, :loop_safari,
:loop_tabla.C-k now nukes over trailing whitespace.load_sample now has sample autocompletion.RETURN now auto-indents the buffer - ensuring that the
cursor is moved to the correct indentation on the following line.sample fn have been completely rewritten and extended.scale and chord can now handle being passed no tonic such as:
(chord :minor) which will return a ring of offsets from 0.chord learned new variants: add2, add4, add9, add11,
add13, madd2, madd4, madd9, madd11, madd13.take method can now take more elements than the original
ring by wrapping around:
(ring 1, 2, 3).take(5) #=> (ring 1, 2, 3, 1, 2)(ring 1, 2, 3) + (ring 4) #=> (ring 1, 2, 3, 4)(ring 1, 2, 3) - 1 #=> (ring 0.0, 1.0, 2.0)(ring 1, 2, 3).take(0) will now return an empty ring.density now complains if it isn’t passed a do/end block.use/with_synth when accidentally passed opts.C-i doc lookup shortcut to work with :tb303 synth docs.C-i now always displays docs where available (previously it was
possible for docs not to be displayed).Thursday 31st December, 2015 (view commits)
Hot on the heels of the previous release comes v2.9 codenamed
Venster (Dutch for window). This release has a specific focus on
fixing all the known issues with Sonic Pi running on Windows. If you’ve
tried Sonic Pi on Windows before and had issues, make sure to try it
again with v2.9. If you’re still having issues on Windows please do
let us know so we can fix it as soon as possible.
For all you Raspberry Pi and Mac OS X users - you’re not left out. Sonic
Pi is just as stable as it was before (if not more stable) and v2.9
comes with a surprising amount of tweaks and features for its short 1
month development cycle. There’s two new FX to play with: tanh and
gverb as well as a heavily revamped logging system which is much
clearer about printing which opts are actually being used for your
synths and samples. Finally, we now include of all the published MagPi
magazine articles in the tutorial. We also now have Hungarian and
Norwegian translations of the GUI.
Happy Live Coding!
invert_chord to chord_invertrate: and pitch_stretch: opts. It’s now
possible to set the rate: independent of the pitch: modification
caused by pitch_stretch.block_duration - returns the duration of the given block in seconds (not scaled with the BPM).block_slept? - returns true if the contents of the block slept or synced.synth_names - returns a list of all the available synthsreset_mixer! - resets the main mixer back to its default values.sample_free - unload a sample from memory to free up memory usage.sample_free_all - unload all samples from memory.use_octave - similar to use_transpose but for whole octaves.with_octave - similar to with_transpose but for whole octaves.use_merged_sample_defaults - similar to use_merged_synth_defaults
but for sampleswith_merged_sample_defaults - similar to
with_merged_synth_defaults but for samplesuse_cent_tuning - uniformly tune all subsequent notes in centswith_cent_tuning - uniformly tune all notes in cents within the blocktanh - for more distortion goodness.gverb - a different reverb FX to play with.use_synth_defaults
and friends.C-k will now kill multiple lines if lines end with ,..txt extension is automatically added to the
file name if none specified.sync: opt to live_loop and in_thread. This now syncs the
live loop once on creation. Similar to the delay: opt. If both
sync: and delay: are specified then the delay happens before the
sync.synth fn can now play chords with the notes: opt such as:
synth :dsaw, notes: (chord :e3, :minor). This will return a single
controllable synth node representing all the notes similar to
play_chord.on: opt is now honoured when playing chords.with_fx "my_shiny_effect". This needs to be
loaded manually via load_synthdefs.~/.sonic-pi/init.rb on launch if it exists. SONIC_PI_HOME is set it will be used over
~ as the root of the user’s .sonic-pi directory (used to auto-save
files and store logs).sample_duration now correctly takes account of TL defaults set by
use_sample_defaults.pitch_stretch, beat_stretch and rpitch can now be
used in TL defaults.Friday 20th November, 2015 (view commits)
This release, named after Karlsruhe, one of the home cities of live coding, is mainly a maintenance release with a strong focus on both performance, stability and documentation. This is therefore the fastest and most stable release of Sonic Pi ever with a massive 10% performance improvement on the original Raspberry Pi 1. It also ships with new translations in Polish, Japanese and French. Many of these improvements (such as the complete rewrite of the OSC stack) are not documented in this release list but can instead be found in the commit logs over on Github.
However, not to go unnoticed are a number of exciting new features. For
example we now have a new Band EQ FX, the ability to use MIDI note names
such as :e5 as values for opts such as cutoff:, and new powerful
cutoff envelopes on the sampler.
M-{ and
M-} for switching left and right respectively.sync no longer inherits BPM by default. Set the bpm_sync: opt to
true to enable BPM inheritance.use_random_seed.octs - returns a ring of successive octaves.assert - for raising an exception if the argument is not true.assert_equal - for raising an exception if the two arguments are not
equal.bt - converts the specified time w.r.t. the current BPM.inspect - similar to print but prints the inspected version of the argument.M-RET is now a duplicate shortcut for running the code.sample_duration.cutoff_ prefix
(such as cutoff_attack, cutoff_decay_level and friends).cutoff opt.on: for both sample and synth. This acts like
if but ensures all the opt vals are evaluated (useful if wanting to
keep the consumption of random streams or ticks consistent even when
not triggering a synth.cutoff: can now accept note names such as :c4.slide: opt to match synths.play_pattern_timed to handle rings.current_transpose now returns 0 if there is no current
transposition.with_fx* fns now return the result of their block.spark now handles rings correctly.spark now treats booleans as 1s and 0s so you can now spark rings of bools.puts, print and mc_message now handle multiple message argumentswith_fx doesn’t swallow TL modifications such as
transposition, current synth etc.with_fx doesn’t affect random seed.pre_amp: opt is no longer scaled w.r.t. the current BPM.Thursday 10th September, 2015 (view commits)
This release brings a substantial change to the random number
generator. This has the unfortunate side effect of breaking backwards
compatibility. If you have been using rand, choose, shuffle and
friends to create predictable patterns for your riffs, your code will
produce different results in this release. Please let me apologise and
say it’s for a good cause. So what is this good cause? Well, you can
now jump backwards and forwards through the random stream giving you way
more creative control than before! The random stream is now also unified
with the random stream on the synthesis server allowing you to sync
behaviour between synths and code. Exciting times.
The sampler has also been super charged. We can now easily change the
rate via MIDI note intervals with rpitch: and stretch the sample whilst
preserving pitch via pitch_stretch: (although with variable results
;-)).
Finally you can now control the global mixer with set_mixer_control!
for those full filter sweeps over the entire sound…
Have fun and happy live coding!
use_random_seed with randomisation to create
predictable melodies/rhythms/timbral manipulations you will
unfortunately get different results in v2.7. This change is to
synchronise both the Ruby rand stream with the one in SuperCollider as
well as enabling the reversal of calls to rand via rand_back.sync now causes the BPM to be inherited from the thread calling the
matching cue. This may be disabled with the new bpm_sync: opt.rrand and rand now return 0 if called with 0.invert_chord now handles negative inversions in a more musically
appropriate manner..ratio_to_pitch which provides the inverse of pitch_to_ratiomidi_notes - returns a ring of numbers (mapping the source
ring/array through the fn note).rand_back - reverse the random stream and ‘undo’ calls to randrand_skip - skip forward through the random stream.rand_reset- reset the random stream to the last seed.M-/.decay_level opt to allow the sustain phase to
shift between two distinct values. The default value for decay_level
is to mirror sustain_level: thus preserving current behaviour.play and synth have now learned the pitch: opt to match
sample. This just increments or decrements the final note.sample now correctly validates opts.sample learned the pitch_stretch: opt which combines rate:
modification (similar to beat_stretch: with pitch:. Attempts to
maintain the pitch whilst simultaneously changing the rate. The
underlying implementation is very basic and can easily destroy the
sound.sample learned the rpitch: opt for simple rate pitch
modulation. This modifies the rate to match the specified number of
MIDI notes relative from the current pitch. For example, a rpitch:
of 12 would double the rate.:echo’s decay: opt is now beats and the value
is scaled with the BPM.live_loop learned the seed: opt which will set the new thread with
the specified seed prior to initial run.density has now been taught to handle values between 0 and 1 which
will now stretch time for the specified block.in_thread and live_loop have now learned the delay: opt
which will delay the initial execution by the specified number of
beats.sample_duration now understands all the opts that you can pass to sample :r + 3 returns :r (a rest plus any MIDI note shift is still
a rest).note_info now correctly handles octaves.C-v.invert_chord how to properly handle out of range index ranges.Thursday 30th July, 2015 (view commits)
The laser beams sliced through the wafts of smoke as the subwoofer pumped bass deep into the bodies of the crowd. The atmosphere was ripe with a heady mix of synths and dancing. However something wasn’t quite right in this nightclub. Projected in bright colours above the DJ booth was futuristic text, moving, dancing, flashing. This wasn’t fancy visuals, it was merely a projection of Sonic Pi running on a Raspberry Pi. The occupant of the DJ booth wasn’t spinning disks or playing MP3s, she was writing, editing and evaluating code. She was live coding and this was an Algorave.
This release is codenamed Algorave to
celebrate that Sonic Pi is now ready to be performed within nightclubs
as well as still being a fantastic tool for learning how to code
creatively. There are many improvements as detailed below. However,
let’s just take a brief look at some of the most fun. Firstly we have
the new error reporting system to make it easier to find and debug your
errors. Syntax errors are now blue and runtime errors pink. We also have
a new look and feel including a new dark mode for performing in dark
places. We also have some fantastic new synths, FX and have even
improved the standard synths. For example, sample now lets you stretch
to match the beat with the beat_stretch: opt and change pitch with
pitch:. The slicer FX now sports a fantastic deterministic
probability: opt for creating and manipulating rhythmic structures
with ease. Finally there’s the new thread local tick/look system
which will revolutionise the way you work with rings within
live_loops. Of course there’s so much more too!
Enjoy this release and happy Algoraving!
res: opt for all synths and FX now has range 0->1 rather than
1->0. This means that a higher res value results in more
resonance. This will hopefully be more intuitive to beginners and less
surprising for people with existing synth knowledge.stop has been renamed to kill for killing specific
synths. In its place a new fn stop has been added to stop a given
thread or live_loop.invert_wave opts are now inverted. The default is now 0 which
has the same behaviour as the old 1. This means that it’s more
intuitive to use the opt as to invert the current wave, you now
specify: invert_wave: true, rather than invert_wave: false. This
shouldn’t affect any code which doesn’t explicitly set the invert_wave:
opt. Pieces which have explicit inversion need to swap all 0s for 1s
and vice versa.res: opt for rrand and rdist has been renamed to step: to
avoid confusion with the resonance opt for cutoff filters.pitch_ratio to pitch_to_ratio to keep in line with other
similar fns such as midi_to_hz.tick
and look.vector which creates a new kind of Array - an immutable
vector (SPVector) which is now the default base class for all rings.use_sample_defaults and with_sample_defaults which act
similarly as their *_synth_defaults counterparts but for samples not
synths.use_tuning and with_tuning for exploring other tuning
systems such as :just, :pythagorean, and :meantone.invert_chord for chord inversions. current_beat_duration for returning the duration of the
current beat in seconds.note_range for returning a range of notes between two notes
with a pitches: opt for constraining the choice of filler notes.scale_names and chord_names for returning a ring of all
chords and scales.rerezzed - strongly influenced by Daft Punk’s track
derezzed.reich phase - a nice way of combining live_loops and
tick to create sophisticated polyrhythms.use_cue_logging and with_cue_logging for enabling and
disabling the logging of cue messages.krush for krushing the sound.panslicer similar to slicer and wobble but modulates
the stereo panning of the audio.subpulse for a full range pulse with extra bass.blade - a moody Blade Runner-esque synth violinpiano - a basic piano emulation. Only capable of whole notes.slicer and wobble now have a wonderful new probability: opt
which will only slice on (or off depending on wave inversion) with the
specified probability. The behaviour is deterministic, so repeated
calls with the same seed: and probability: opts will result in the
same behaviour. Great for adding interesting rhythmic variation to
sound.slicer and wobble now have smoothing opts for even more
control over the resulting wave form.sample the opt beat_stretch: for modifying the rate of the
sample to make sure the duration of the sample is n beats long (with
respect to the current bpm). Note: stretching the beat does change
the pitch.sample the opt pitch to enable pitch shifting on any sample. flanger’s feedback mixing is now more fair and is less likely to
hike up the amplitude.note_info to also handle a number as its param.factor? to handle division by 0.load_sample to throw exception when passed an empty path.use_sample_bpm the opt num_beats: to indicate that a given
sample consists of a specific number of beats.comment and uncomment to require blocks. chord the new opt invert: as a shortcut to the new
invert_chord fn.sample_duration about the opts start: and finish: and
envelope opts such as attack: and release:. This allows you to
replace any call to sample with sample_duration to get the exact
duration of that call.chord the opt num_octaves to enable the easy creation of
arpeggios.with_sample_pack_as to now correctly accept a block.mc_surface_teleport no longer throws an error.Array#shuffle now works correctly with the random seeds for
deterministic behaviour.*_sample_bpm.Monday 13th April, 2015 (view commits)
This release comes with support for Minecraft: Pi Edition installed on the Raspberry Pi. You can now create music with Minecraft visuals or even code up a synth score in Minecraft blocks and read and play the score from Sonic Pi! Another exciting aspect of this release is much improved editor functionality for navigating around and manipulating code via keyboard shortcuts. This means that live coding just got a lot more fun. The keyboard shortcuts are based on the standard shortcuts provided by GNU Emacs - the oldest and most powerful text editor in use by wizard programmers today.
invert_wave now defaults to 1 everywhere. I found I always inverted
the wave every time I used a synth/fx where wave inversion was
key. This seemed like such a better default I’ve broken compatibility
for it. Apologies if this has affected you.flanger FX now defaults the optional arg stereo_invert_wave to
1.ring to ring_mod to reduce the potential for confusion
with the ring datastructure.Tab now indents current line or selection rather than inserting a
useless tab character.sync now accepts multiple cue ids and will sync on the first matching id.pitch_ratio for converting a midi note to a frequency
ratio. Useful for tuning samples.line for creating a line from start to finish with a specific
number of slices.spark for displaying lists of numbers in a fancy text-graph
(▁▃▅▇) in the log.sample_duration now scales result based on current BPM.range now accepts optional args: inclusive: and step:.M-< and M-> for switching workspaces.:pitch_shift reverb FX caused a serious audio overload.*_sample_bpm:bpf.use_sample_pack_as (ring 1, 2, 3) rather than [1, 2, 3].C-k keyboard shortcut now copies text into the clipboard.rings rather than ring-like
things.with_fx are now raised correctly.Wednesday 11th February, 2015 (view commits)
A quick release following v2.3 to address an issue with the GUI
freezing on specific CPUs. However, although this release has had a
small development cycle, it ships with three fantastic features. Firstly
we now have the spread fn which provides an amazing way to create
interesting rhythms with very little code. Secondly we can now use
cutoff: on any sample massively increasing their timbral range and
finally we have three exciting new synths for you to play with. Have
fun!
spread for creating rings of Euclidean distributions. Great
for quickly creating interesting rhythms.: to the FX opt autocomplete list └─ ├─ characters when printing in the log
on RP.:dark_ambience, an ambient bass trying to escape the
darkness.:hollow, a hollow breathy sound.:growl, a deep rumbling growl.rlpf and normaliser FX. These
are disabled by default (i.e. won’t affect sound of the sample) and
can by enabled via the new cutoff:, res: and norm: opts.Wednesday 28th January, 2015 (view commits)
chord now divides the amplitude of each
resulting synth by the number of notes in the chord. This ensures the
resulting amplitude isn’t excessive and is normalised.at from
being identical.range is now exclusive: (range 1, 5) #=> (ring 1, 2, 3, 4)density for compressing and repeating time Dr Who style. For
example, wrapping some code with a call to density of 2 will double
the bpm for that block as well as repeating it twice. This ensures the
block takes the same amount of time to execute while doing double the
work.with_bpm_mul and use_bpm_mul which will multiply the
current bpm by a specified amount. Useful for slowing down and
speeding up the execution of a specific thread or live_loop.rdist - generate a random number with a centred distributionsquare skit, shufflit and tilburgcontrol nil, amp: 3 will do
nothing.3.4.times {|v| puts v} will yield 0.0, 1.0 and 2.0.true
resolves to 1.0 and false, nil resolve to 0.0. This allows you
to write code such as: play :e3, invert_wave: trueat to handle varying block arities differently. See docs for
more detail. Original behaviour is preserved and only extended.:reverb FX to extend its kill delay time with larger room
sizes to reduce the chance of clipping.bitcrusher - for crunching and destroying those hi-fi sounds.flanger - a classic swhooshing effect typically used with
vocals and guitars.ring - ring modulation for that friendly Dalek soundbpf - a band pass filterrbpf - a resonant band pass filternbpf - a normalised band pass filternrbpf - a normalised resonant band pass filterperc_snap - a finger snapperc_snap2 - another finger snapbd_ada - a bass drumguit_em9 - a lovely guitar arpeggio over Em9live_loop fn and thread names to stop them clashing with
standard user defined threads and fns.with_fx now returns the result of the blockThursday 18th December, 2014 (view commits)
This release brings a number of nice enhancements. However the main feature is the accurate timing for triggering FX. This means you can now reliably use FX for accurate rhythmic purposes such as wobbling, slicing and echoes.
use_sample_pack_as now uses a double underscore __ as a separator
between the user-specified alias and the sample name.play 50, {amp: 0.5}, {release: 2}, amp: 2with_fx FX synths are now triggered using virtual time rather than
real time. This means that FX can now be used for rhythmical purposes.RingArray datastructure. This is essentially an array
that wraps its indexes so you can use indexes larger than the array size.ring - (ring 1, 2, 3) creates a new ring array.knit - (knit :a1, 2, :c1, 1) returns (ring :a1, :a1, :c1)bools - (bools 1, 0, 1) returns (ring true, false, true)range - (range 70, 100, 10) returns (ring 70, 80, 90, 100)sample_loaded? - to detect whether a specific sample has been loaded:tb303 synth - sound is reverted to v2.0 behaviour:square - Pure square wavebd_tek - Bass drumone_in now returns false if num is < 1live_loop’s no-sleep detector works within nested with_fx blockschord now returns a ring.Tuesday 25th November, 2014 (view commits)
Friday 21st November, 2014 (view commits)
The focus of release is very much on technical improvements, efficiency and general polish.
The most obvious and exciting change is the introduction of the
live_loop which will change the way you work with Sonic Pi. For more
information on live_loop take a look at the new section in the
tutorial. Another very exciting development is that v2.1 marks the
official support for Windows thanks to the excellent work by Jeremy
Weatherford. Finally, this release is also the first release where Sonic
Pi has a Core Team of developers. Please give a warm welcome to Xavier
Riley, Jeremy Weatherford and Joseph Wilk.
live_loop - A loop for live codinginc - incrementdec - decrementquantise - quantise a value to resolutionfactor? - Factor testat - Run a block at the given timesdegree - for resolving a note in a scale by degree such as :i, :ivchord_degree - Construct chords based on scale degreesuse_sample_bpm - for changing the BPM based on a sample’s durationrest? - Determine if note or args is a restvt - Get virtual timeset_control_delta! - Set control delta globallywait now handles both sleep and sync functionalityplay to be a proc or lambda. In which case simple call it and use the result as the noteplay to accept a single map argument (in which case it will extract :note key out if it exists.play and synth now treat ‘notes’ nil, :r and :rest as rests and don’t trigger any synths.C-i over a function name now opens up the doc system at the relevant placerand_i and rrand_i now correctly return integers rather than floatsmod_range: opt to have negative values (for oscillating with lower notes)_slide_shape and _slide_curve args.cutoff_attack:,cutoff_sustain:,cutoff_decay:,cutoff_release:,cutoff_min_slide:,cutoff_attack_level:,cutoff_sustain_level:,cutoff_env_curve:Tuesday 9th September, 2014 (view commits)
alt-* prefixedcmd-* prefixedcue/sync messages are more clearly highlighted)Tuesday 2nd September, 2014 (view commits)