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 ring
s within
live_loop
s. 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 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 visa 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_loop
s 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.mx_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.1* Support for programming Minecraft Pi Edition.
* sync
now accepts multiple cue ids and will sync on the first matching id.
* New fn pitch_ratio
for converting a midi note to a frequency
ratio. Useful for tuning samples.
* New fn line
for creating a line from start to finish with a specific
number of slices.
* New fn spark
for displaying lists of numbers in a fancy text-graph
(▁▃▅▇
) in the log.
* On stop, amplitude of output slides down over 1s to silence for a
smoother transition.
* 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.ring
s 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 param 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:
params.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 tilburg
control 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: true
at
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: 2
with_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
, :iv
chord_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
param 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)