Shelford Hill
Sessions
This is where he plays, a log, of things tried, and failed, and tried again, as the saying goes. Musical waves lap against the rocks of defeat. And yet, sometimes, the undertow is strong enough, and one emerges on the other side, beaten yet undefeated.
Late November - early December 2021
Getting back into Ableton Live and the Madrona suite of instruments. Kaivo is particularly inspiring right now. It is difficult to avoid, on the one hand, just making noise, and on the other, coming too close to cheesy and overdone sounds. I need to work on my understanding of these instruments, while taking the time to play. Using a velocity-sensitive keyboard has made it much more expressive: there were indeed moments when I felt what I was playing. Thinking of looking into a Soundplane (from Madrona) when the new model is released. At the same time, burdened with a desire to shed some more weight in terms of equipment. I am starting to consider how to rationalise (at least, in procedural and meta terms) my music practice.
Overthought and overwrought, but I think I am getting somewhere.
23 November 2021
d1 $ slow 4
$ jux(rev)
$ n "[2*2 [7 5/2] <[9 7] 12_>, -10 <-12 -3>]"
# s "supersaw"
# lfo "0.5 0.1 1"
# ring "1 0.5"
# freeze "0 1"
# distort "0 0.5 1"
# crush 16
# waveloss (range 50 100 $ sine)
6 November 2021
s = sequins
function init()
clock.tempo = 40
end
-- macro
macro = s{ s{1}:count(48), s{2}:count(12),s{3}:count(24)}
-- f-maj scale =
-- {-7, -5, -3, -2, 0, 2, 4, 5}
-- {5, 7, 9, 10, 12, 14, 16, 17}
-- {17, 19, 21, 22, 24, 26, 29}
-- starters
a = {}
b = {}
a.notes = {}
a.dynamics = {}
a.rhythm = {}
b.notes = {}
b.dynamics = {}
b.rhythm = {}
-- macro 1
a.notes[1] = s{ s{ 5, 9, 12}:count(9)
, s{ 5, 9, 14}:count(3)
, s{ 5,10, s{14,16}}:count(9)
, s{ 7,10, s{14,16}}:count(3)
}
a.dynamics[1] = {}
a.dynamics[1].att = s{0.1, 0.2, 0.3}
a.dynamics[1].rel = s{0.1, 0.05, 0.1}
a.dynamics[1].lvl = s{7, 4, 5}
a.rhythm[1] = s{1/2}
b.notes[1] = s{ s{ -2, 2}:count(8)
, s{ -2, 2}:count(4)
, s{ -2, 5}:count(8)
, s{ -2, 7}:count(4)
}
b.dynamics[1] = {}
b.dynamics[1].att = s{0.1, 0.2}
b.dynamics[1].rel = s{0.1, 0.05}
b.dynamics[1].lvl = s{7, 4}
b.rhythm[1] = s{1}
-- macro 2
a.notes[2] = s{ s{16,19}
, s{19,22}
}
-- a.notes[2]:settable{ s{21}
-- , s{24}
-- }
a.dynamics[2] = {}
a.dynamics[2].att = s{1, 0.3}
a.dynamics[2].rel = s{0.3,1}
a.dynamics[2].lvl = s{7, 4, 5}
a.rhythm[2] = s{1, 3/4, 1, 1/2, 1, 1/8}
b.notes[2] = s{ s{ -5}:count(4)
, s{ -2}:count(4)
}
b.dynamics[2] = {}
b.dynamics[2].att = s{0.1, 0.2}
b.dynamics[2].rel = s{0.1, 0.05}
b.dynamics[2].lvl = s{7, 5}
b.rhythm[2] = s{1/8}
-- macro 3
a.notes[3] = s{ s{7, 10, s{14,16}}:count(9)
, s{7, 10, s{16,17}}:count(3)
, s{7, 12, s{16,19}}:count(9)
, s{9, 12, s{16,19}}:count(3)
}
a.dynamics[3] = {}
a.dynamics[3].att = s{0.1, 0.2, 0.3}
a.dynamics[3].rel = s{0.1, 0.05, 0.1}
a.dynamics[3].lvl = s{7, 4, 5}
a.rhythm[3] = s{1, 1/2, 1/4}
b.notes[3] = s{ s{ 24}:count(1)
, s{ 29}:count(1)
}
b.dynamics[3] = {}
b.dynamics[3].att = s{1.2}
b.dynamics[3].rel = s{0.5}
b.dynamics[3].lvl = s{7}
b.rhythm[3] = s{4}
-- play a (starts on load script)
clock.run(
function()
while true do
local ma = macro()
clock.sync(a.rhythm[ma]())
local playnote = a.notes[ma]()
output[1].volts = playnote/12
print(playnote)
local att = a.dynamics[ma].att()
local rel = a.dynamics[ma].rel()
local lvl = a.dynamics[ma].lvl()
output[2](ar(att, rel, lvl))
end
end
)
-- play b
clock.run(
function()
while true do
local ma = macro()
if not b.notes[ma] then
print('no notes here')
else
clock.sync(b.rhythm[ma]())
local playnote = b.notes[ma]()
output[3].volts = playnote/12
print(playnote)
local att = b.dynamics[ma].att()
local rel = b.dynamics[ma].rel()
local lvl = b.dynamics[ma].lvl()
output[4](ar(att, rel, lvl))
end
end
end
)
-- transpose
function transpose(vox, macro, meso, st)
if meso == 'all' then
for k,v in ipairs(vox.notes[macro]) do
for i,j in ipairs(vox.notes[macro][k]) do
vox.notes[macro][k][i] = j + st
end
end
else
for k,v in ipairs(vox.notes[macro][meso]) do
vox.notes[macro][meso][k] = v + st
end
end
end
-- fnl
function fnl(fn, origin, dest_ms, fps)
return clock.run(function()
fps = fps or 15
local spf = 1/fps
fn(origin)
for _,v in ipairs(dest_ms) do
local count = math.floor(v[3] * fps)
local stepsize = (v[2]-origin)/count
while count > 0 do
clock.sleep(spf)
origin = origin + stepsize
count = count - 1
fn(origin)
end
end
end)
end
29 October 2021
s = sequins
function init()
output[1].scale{14, 17, 21}
end
scales = { {14, 17, 21}
, {14, 18, 21}
, {14, 18, 22}
, {15, 18, 22}
, {15, 19, 22}
}
notes = s{ 2, 9}
count = s{ 1, 2, 3, 4, 5}
function voice1()
output[2]( { to( 5, 2)
, to( 0, 15)
})
output[1].action =
loop{ to( dyn{height=1}:step(1)
:wrap(1,4), 2)
, to( 0, 0.01)
}
output[1]()
end
function voice2()
while true do
clock.sync(1)
output[3].volts = notes()/12
output[4](ar(0.1,0.5))
end
end
function progression()
local num = count()
output[1].scale = scales[num]
end
28 October 2021
s = sequins
a = {}
a.t = s{1/4}
a.n = s{24,28,31}
a.cv = 1
a.env = 2
b = {}
b.t = s{1/2}
b.n = s{12,s{16,19}}
b.cv = 3
b.env = 4
up_count = s{3,1,2}
down_count = s{3,2,1}
function voice(id)
while true do
clock.sync(id.t())
output[id.cv].volts = id.n()/12
output[id.env](ar(0.01,0.5))
end
end
function play(id)
id.coro = clock.run(voice,id)
end
function stop(id)
clock.cancel(id.coro)
end
function up()
-- on the first pass, add one to third note
-- on the second pass, add one to first note
-- on the third pass, add one to second note
local num = up_count()
a.n[num] = a.n[num] + 1
if num == 1 then
local new_b = {a.n[num]-12,s{a.n[num]-8,a.n[num]-5}}
b.n:settable(new_b)
end
end
function down()
local num = down_count()
a.n[num] = a.n[num] - 1
if num == 1 then
local new_b = {a.n[num]-12,s{a.n[num]-8,a.n[num]-5}}
b.n:settable(new_b)
end
end
27 October 2021
Modulating "shape" with outs 2 and 4 of Quadrax.
s = sequins
meta_a = s{1,2,3}
a_prog = {{12,16,21},
{12,16,20},
{12,16,19}}
a = s{12,16,21}
ta = s{4}
aa = s{0.01,0.3}
ra = s{0.5}
la = s{5,4,5}
meta_b = s{1,2,3,4}
b_prog = {{-3,4},
{-3,5},
{-3,6},
{-3,5,}}
b = s{-3,4}
ab = s{0.01}
rb = s{0.5}
tb = s{2}
lb = s{5}
function play_a()
while true do
clock.sync(ta())
output[1].volts = a()/12
output[2](ar(aa(),ra(),la()))
end
end
function play_b()
while true do
clock.sync(tb())
output[3].volts = b()/12
output[4](ar(ab(),rb(),lb()))
end
end
function move_a()
a:settable(a_prog[meta_a()])
end
function move_b()
b:settable(b_prog[meta_b()])
end
function start_a()
coro_a = clock.run(play_a)
end
function stop_a()
clock.cancel(coro_a)
end
function toggle_a()
if coro_a then stop_a() coro_a = nil else start_a() end
end
function start_b()
coro_b = clock.run(play_b)
end
function stop_b()
clock.cancel(coro_b)
end
function toggle_b()
if coro_b then stop_b() coro_b = nil else start_b() end
end
function transpose_a(st)
local temp_a = {}
for k,v in ipairs(a) do
temp_a[k] = v + st
end
a:settable(temp_a)
end
26 October 2021
s = sequins
meta_a = s{1,2,3}
a_prog = {{12,16,21},
{12,16,20},
{12,16,19}}
a = s{12,16,21}
ta = s{1}
aa = s{0.01,0.3}
ra = s{0.5}
la = s{5,4,5}
meta_b = s{1,2,3,4}
b_prog = {{0,2,4},
{0,2,5},
{0,2,12},
{0,2,7,}}
b = s{0,2,4}
ab = s{0.01}
rb = s{0.5}
tb = s{1}
lb = s{5}
function play_a()
while true do
clock.sync(ta())
output[1].volts = a()/12
output[2](ar(aa(),ra(),la()))
end
end
function play_b()
while true do
clock.sync(tb())
output[3].volts = b()/12
output[4](ar(ab(),rb(),lb()))
end
end
function move_a()
a:settable(a_prog[meta_a()])
end
function move_b()
b:settable(b_prog[meta_b()])
end
function start_a()
coro_a = clock.run(play_a)
end
25 October 2021
Unrecorded.
Modified druid with keybindings, crow + quadrax on the Modular
Quite satisfied with how this little hack worked out. The code is quite ugly, but this opens the doors to a lot more expressiveness even in livecoding. The concept is simple, but I think it helps a lot as a helper in livecoding.
s = sequins
t = s{1}
notes = s{0,2,5,7,9,11}
attack = s{0.01,0.1}
release = s{0.3,0.5}
level = s{5,3,4}
function init()
clock.tempo = 110
end
function vox()
while true do
clock.sync(t())
output[1].volts = notes()/12
output[2](ar(attack(),release(),level()))
end
end
function transpose(st)
for k,v in ipairs(notes) do
notes[k] = v + st
end
end
clock.run(vox)
23 October 2021
Unrecorded.
Arpeggios via crow on the Modular, and Cheat Codes 2 on norns.
Need to find a way to be more expressive. Have found a number of sweet spots in terms of notes that I like, essentially Glass. Feeling slightly stuck with the live-coding aspects of crow. Need to consider what else can be done other than simply using sequins. One idea is meta-controlling. Limited palette given that only Quadrax is the voice, hopefully will be able to find a way to remedy this.
s = sequins
function init()
clock.tempo = 80
end
-- {12,16}, {12,17}, {12,21}, {12,24}, {12,36}, {12,28}, {12,29}
a = s{}
ta = s{1/2}
b = s{s{2,9,4}:count(12),s{7,4,9}:count(12)}
tb = s{1}
function arp()
while true do
clock.sync(ta())
output[1].volts = a()/12
output[2](pulse())
end
end
function bass()
while true do
clock.sync(tb())
output[3].volts = b()/12
output[4](pulse())
end
end
clock.run(bass)
16 October 2021
Tape 0103.wav
Zippers, crow on the Modular, and Cheat Codes 2 on the norns.
Lessons: (a) the bassline was too repetitive and needed some more dynamism; (b) some of the transitions were not smooth enough (for the context); (c) the sounds were ultimately quite stale after a while (need more modulation on the timbre).
12 October 2021
Unrecorded.
Zippers: see Maps, S2E1.
s = sequins
function init()
clock.tempo = 80
output[1].scale({0,4,5,7,9})
end
bn = s{4,7,9}
bt = s{1,1,1/2}
function play_bass()
while true do
clock.sync(bt())
output[3].volts = bn()/12
output[4](pulse())
end
end
bass = clock.run(play_bass)
--see s2e2 of maps
stages = s{
{2,2}
,{1.8,0.2}
,{1.3,0.5}
,{0.8,1}
}
-- use melody(1,math.random(1,4))
function melody(octave,stretch)
local o = octave or 1 --not quite octave but close enough
local st = stretch or 1
output[2](ar(0.1,7.4*st))
clock.run(function()
for i=1,8 do
local stage = stages()
output[1].slew = stage[2]/2 * st
output[1].volts = stage[1] * o
if stage[3] then
output[1].shape = stage[3]
else
output[1].shape = 'linear'
end
clock.sleep(stage[2] * st)
end
end)
end
11 October 2021
Unrecorded.
Lessons in (a) music theory (scales, arpeggios); (b) use of true
and false
to create timing; (c) attempts at modulation.
Quadrax Channel 1 voice, Channel 2 envelope, into VCA, into FX Aid. PNW modulating Shape 1 and Fall 2.
s = sequins
clock.tempo = 180
-- scale reference: {0,2,3,5,7,9}
-- s{s{0,3,7}:count(9),s{0,4,7}:count(6)}
-- s{s{2,5,9}:count(6),s{2,4,9}:count(3),s{2,6,9}:count(6)}
-- s{4,6,7,9,11,13}
-- s{4,6,11}
-- s{4,6,s{11,13,15}}
a = s{s{2,5,9}:count(6),s{2,4,9}:count(3),s{2,6,9}:count(6)}
b = s{0,4}
X = true
O = false
p = s{X,X,X,0}
t = s{1/2}
function play()
while true do
clock.sync(t())
if p() then
output[1].volts = a()/12
output[2](pulse())
end
end
end
function mod()
output[3].slew = 0.5
output[3].volts = b()
clock.sleep(8/3)
end
clock.run(play)
Early October 2021
Tape 102 and many more unrecorded
Sessions with
- crow
- the modular (yet to be named: as of 9 October 2021)
- the old T420, given new life
19 June 2021
Tapes 0072, 0074
Sessions with:
- norns+ grid
- cheat codes
- granchild
- subsets
- Field recordings
- Voice live input
14 to 15 June
Tapes 0052, 0060, 0062
Sessions with:
- norns + grid
- cheat codes
- granchild
- subsets
- Field recordings
Late May-Early June 2021
Tapes 0028 to 0040
Sessions with:
- norns
- twine (granulator)
- subsets
- Field recordings (water down a drain)
- Samples - glia's yelidek
Layering using tape:
- Subsets piano
- Field recordings through twine
- Samples through twine
8 May 2021
Session with:
- norns
- twine (granulator)
- Hologram Microcosm (Mosaic mode, mostly)
- Field recordings (water down a drain)
- Samples - glia's yelidek
Sound vs music; textures; micro-sounds; sounds within sounds. Bubbling waters, underwater, submerged, filtering, clicks.
5 May 2021
Session with:
- norns
- twine (granulator)
- subsets
- Field recordings ('field' meaning the bathroom -- there was a most amazing sound when the water was emptying from O's bathtub)
Thinking about: (a) how to combine sounds & music; (b) what is the significance of discovering sounds within sounds; (c) how to listen, how to perform, how to listen when not performing.
27 April 2021
Gurgles - rivulets - water - streams - depths - underground - life
Session with:
- norns
- twine (granulator)
- Field recordings (water_under_the_fridge_edited.wav)
24 April 2021
Session with:
- norns
- subsets
- ableton
- prosody
- confetti, "chopper"
10 April 2021
Session with:
- norns
- subsets
- ableton
- prosody