Live coding with SuperCollider patterns made easy (hopefully).
A set of tools and syntax sugar for easy live coding with synthdef and sample patterns in SuperCollider.
Živa was developed in a residency at Ljudmila (in Ljubljana, Slovenia) as part of the On-the-fly project.
Regular SuperCollider pattern and Ndef syntax can be used as parameters inside Živa functions.
WARNING: This software is still under heavy development and might considerably change in future versions.
- SuperCollider: https://github.com/supercollider/supercollider - tested with v3.12.2
- sc3-plugins: https://github.com/supercollider/sc3-plugins/
- optional, but recommended (for the Dirt-Samples library): SuperDirt quark: https://github.com/musikinformatik/SuperDirt
Windows users also need to install git: https://gitforwindows.org/
Quarks.install("https://github.com/loopier/ziva");
if you have already installed it before, and simply want to update:
Quarks.update("ziva");
(C) 2022- Roger Pibernat
Živa is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses/.
Ziva.boot;
~acid = Psynth(\acid);
~kick = Psample(\aekick);
~delia = Psample(\delia);
Ziva.track(0, \chorus, \reverbS);
(
[
~acid.faster.deg([0,2,4,7].choosen(16).tumbao.pseq).scale(\harmonicMinor).randpan,
~acid.fast.pizz.bj(7,12).deg([2,4]).oct(7).scale(\harmonicMinor) >> 0,
~acid.fast.deg([0,4,7,0].montuno.pseq).oct(3),
~delia.f.fast.n((..26).prand).chop(4,8).tape(0.4),
~kick.f.bpm(115),
].ziva;
)
boot the server
Ziva.boot;
optionally add custom samples – some are loaded by default
Ziva.loadSamples("path/to/your/samples/parent/directory"); // $HOME is prepended automatically
list available synths
Ziva.synths;
list avialable sounds (samples)
Ziva.sounds;
list available fx
Ziva.fx;
list available rhythms
Ziva.rhythms;
list available controls of a synth
Ziva.controls(\acid);
create a synth player
~nala = Psynth(\acid);
create a sample player
~lola = Psample(\aekick);
create a band – placeholder for sound players
(
[
~nala,
~lola
].ziva;
)
stop everything
(
[
// ~nala,
// ~lola
nil
].ziva;
)
or
Ziva.stop;
play an eighth-note arpeggio with the synth
(
[
~nala.deg([0,2,4].pseq),
~lola,
].ziva;
)
play same arpeggio in another scale
(
[
~nala.deg([0,2,4].pseq).scale(\diminished),
~lola,
].ziva;
)
play the synth faster than the kick drum
– other options are: slowest, slower, slow, fast, faster, fastest
(
[
~nala.fast.deg([0,2,4].pseq),
~lola,
].ziva;
)
play a rhythm with the kick drum
(
[
// ~nala.fast.deg([0,2,4].pseq),
~lola.faster.r([0].cascara.pseq), // *
nil
].ziva;
)
add a preset rhtythm to the arpegiated synth
(see Ziva.rhythms
for available rhythms)
(
[
~nala.faster.deg([0,2,4].tumbao.pseq), // *
~lola.faster.r([0].cascara.pseq),
nil
].ziva;
)
euclidean rhythms
(
[
~nala.faster.bj(5,8),
~lola.faster.bj(3,8),
nil
].ziva;
)
add a bass line with the same synth
(
[
~nala.faster.deg([0,2,4].tumbao.pseq),
~nala.faster.deg([0,4,7].montuno.pseq).oct(3), // *
~lola.faster.r([0].cascara.pseq),
nil
].ziva;
)
dynamics – play louder or softer
– options are: fff, ff, f, p, pp, ppp
(from fortissimo to pianissimo)
– .amp([0.0 .. 1.0])
for custom loudness – BE CAREFUL with values > 1.0
(
[
~nala.fast.p.oct(6),
~nala.ff.oct(3),
~nala.faster.amp([0.1,0.3].pseq),
].ziva;
)
add a pizzicato chord comp
– other options are:
stass
: staccatissimostacc
: staccatotenuto
legato
(orleg
)pedal
legato(value)
(
[
~nala.faster.pizz.deg([0,2,4]).r([0].clave.pseq).oct(6), // *
~nala.faster.deg([0,2,4].tumbao.pseq),
~nala.faster.deg([0,4,7].montuno.pseq).oct(3),
~lola.faster.r([0].cascara),
nil
].ziva;
)
pan things around with:
right
orleft
randpan
pan([-1.0 .. 1.0])
(
[
~nala.faster.pizz.deg([0,2,4]).r([0].clave.pseq).oct(6).randpan, // *
~nala.faster.deg([0,2,4].tumbao.pseq).right, // *
~nala.faster.deg([0,4,7].montuno.pseq).oct(3).pan(-0.2), // *
~lola.faster.r([0].cascara).pan(0.2),
nil
].ziva;
)
create a melody of any length from a note list (will change every time you evaluate)
(
[
~nala.faster.deg([0,2,4].choosen(8).tumbao.pseq),
nil
].ziva;
)
create a melody with a different approach using legato and rests (r
)
(
[
~nala.fast.deg([0,2,4,r].choosen(8).pseq).legato([0.1,0.5,1].choosen(8).pseq),
nil
].ziva;
)
create a melody with yet another approach using dur
(
[
~nala.dur([1,1/2,1/4].choosen(4).pseq).deg([0,2,4,7].choosen(8).pseq),
nil
].ziva;
)
play a longer sample
~del = Psample(\delia);
(
[
~del,
nil
].ziva;
)
play it for a longer time
(
[
~del.slow,
nil
].ziva;
)
choose a different sample
(
[
~del.dur(6).n(4),
nil
].ziva;
)
choose a random sample everytime
(
[
~del.slow.n((..8).prand),
nil
].ziva;
)
change the playing rate
(
[
~del.slow.n(4).speed(0.5),
nil
].ziva;
)
play the sample in a random sequence of speeds
- first argument is the length of the sequence
- second argument is the list of speeds to choose from
(
[
~del.fast.n(4).randspeeds(4,[-1,1,-0.5,0.5,2,-2]),
nil
].ziva;
)
old broken cassette tape effect
0.0
no effect- the higher the crazier
(
[
~del.slow.n(4).tape(0.5),
nil
].ziva;
)
start playing halfway in the sample
(
[
~del.slow.n(4).start(0.5),
nil
].ziva;
)
chop the sample and rearange the slices
- first argument is the number of slices used (randomly chosen from the chopped sample)
- second argument is the number of slices the sampled is chopped in
(
[
~del.fast.n(4).chop(4,8),
nil
].ziva;
)
change the tempo
- this changes the GLOBAL tempo. So changing it to any sound will affect all the others
(
[
~del.fast.n(4).chop(8,8).bpm(120),
~lola,
nil
].ziva;
)
combine them all
comment lines to mute them, and uncomment them to unmute them
(
[
~nala.faster.stacc.deg([0,2,4].choosen(8).tumbao.pseq).oct([4,5,6,7].choosen(8).pseq),
~nala.fast.deg([0,7].choosen(8).montuno.pseq).oct(3),
~lola.f.n((..4).choosen(4).pseq),
~del.f.fast.legato([0.5,1,2].choosen(8).pseq).n((..7).choosen(8).pseq).chop(8).randspeeds(5,[-1,-2,1,2]),
nil
].ziva;
)
Effects are set on tracks. Sounds can then be routed to those tracks using >>
Syntax: Ziva.track(nameOrNumber, effect1, effect2, ...);
. Order matters!
To list available effects: Ziva.fx
Ziva.track(0, \delay, \reverb);
(
[
~nala >> 0,
nil
].ziva;
)