Skip to content

Instantly share code, notes, and snippets.

@hecanjog
Last active August 25, 2021 02:34
Show Gist options
  • Save hecanjog/d98a57b9c514be1fec27791caf26281e to your computer and use it in GitHub Desktop.
Save hecanjog/d98a57b9c514be1fec27791caf26281e to your computer and use it in GitHub Desktop.
import aubio
import numpy as np
from pippi import dsp, fx, oscs, shapes, tune, rhythm, noise
from pippi.wavesets import Waveset
from pathlib import Path
RN = 56
dsp.seed(RN)
WINSIZE = 4096
HOPSIZE = WINSIZE//2
SR = 44100
KEY = 'e'
c3 = dsp.read('/home/hecanjog/sounds/kits/001/clap3.wav')
sn = dsp.read('/home/hecanjog/sounds/kits/001/snap1.wav')
snr = dsp.read('/home/hecanjog/sounds/kits/001/snare4.wav')
kik = dsp.read('/home/hecanjog/sounds/kits/002/707 KICK 1.wav')
rhodes = dsp.read('sounds/nycrhodesC.wav')
suite = dsp.read('sounds/suitetoneC#.wav').remix(2).speed(0.99)
rolls = dsp.read('sounds/melonpans.wav')
pour = dsp.read('sounds/melonpour.wav')
hat_lfo = dsp.win(shapes.win('sine'), 0.01, 0.1)
kick_lfo = dsp.win(shapes.win('sine'), 0.05, 0.1)
clap_lfo = dsp.win(shapes.win('sine'), 0.01, 0.07)
snar_lfo = dsp.win(shapes.win('sine'), 0.01, 0.07)
time_lfo = dsp.win('hann', 0.001, 0.2)
segs = [ dsp.read(s) for s in Path('./segments').glob('seg-*.wav') ]
chords = ['ii6', 'V', 'V7', 'i11', 'I', 'I11', 'vi9']
chords = ['ii11', 'ii11', 'III7', 'ii11', 'i11', 'i11', 'vii*9']
chords = ['ii7', 'ii9', 'ii7', 'ii11', 'IV9', 'vii*9']
chords = ['ii7']
#freqs = tune.chord('i11', octave=2, key='e')
##########
# SEGMENTS
##########
def flatten(snd):
return np.asarray(snd.remix(1).frames, dtype='f').flatten()
def divide(snd, lpf=None, hpf=None):
o = aubio.onset('specflux', WINSIZE, HOPSIZE, SR)
# Filters
if lpf is not None:
snd = fx.hpf(snd, 200)
if hpf is not None:
snd = fx.lpf(snd, 12000)
pos = 0
length = len(snd)
start = None
while pos < length - HOPSIZE:
frames = flatten(snd[pos:pos+HOPSIZE])
if o(frames):
# Found onset
onset = o.get_last()
#print(count, onset, start, pos)
if start is not None:
yield snd[start:onset]
start = onset
pos += HOPSIZE
def chop():
segcount = 0
for s in divide(g):
s.write('segments/seg-%00d.wav' % segcount)
segcount += 1
#######
# DRUMS
#######
def makehat(pos, count):
length = hat_lfo.interp(pos)
lowhz = dsp.win('rnd', 5000, 6000)
highhz = dsp.win('rnd', 6000, 14000)
h = noise.bln('sine', length, lowhz, highhz).env('pluckout') * dsp.rand(0.2, 0.4)
basehz = dsp.rand(3000, 10000)
widthz = dsp.rand(100, 3000)
curve = dsp.win(shapes.win('hann'), basehz, basehz + widthz)
return fx.hpf(h, curve, dsp.rand())
def makekick(pos, count):
return kik.copy().env(dsp.choice(['pluckout', 'hannout', 'sineout'])) * dsp.rand(1.2, 1.5)
def makeclap(pos, count):
length = clap_lfo.interp(pos)
lowhz = dsp.win('rnd', 3000, 6000)
highhz = dsp.win('rnd', 2000, 8000)
out = noise.bln('tri', length, lowhz, highhz).env('pluckout') * 2
out = fx.fold(out, amp=dsp.win(shapes.win('hann', length=length/2), 1, 8))
out = fx.lpf(out, 6000).vspeed([1, 0.4])
out.dub(c3)
if dsp.rand() > 0.5:
out.dub(sn)
if dsp.rand() > 0.4:
if dsp.rand() > 0.4:
out = fx.delay(out, dsp.rand(0.01, 2), dsp.rand(0.25, 0.5))
elif dsp.rand() > 0.8:
out = fx.mdelay(out, [ dsp.rand(0, 8) for _ in range(dsp.randint(3, 10)) ], 0.7)
basehz = dsp.rand(300, 2000)
widthz = dsp.rand(100, 3000)
curve = dsp.win(shapes.win('hann'), basehz, basehz + widthz)
out = fx.lpf(out, curve)
return out * 0.7
def makesnare(pos, count):
length = snar_lfo.interp(pos)
lowhz = dsp.win('rnd', 3000, 6000)
highhz = dsp.win('rnd', 2000, 8000)
out = noise.bln('tri', length, lowhz, highhz).env('pluckout') * 2
out = fx.fold(out, amp=dsp.win(shapes.win('hann', length=length/2), 1, 8))
out = fx.lpf(out, 6000)
if dsp.rand() > 0.9:
out = out.vspeed([1, 0.4])
s = snr.copy()
s = s.cut(0, dsp.rand(s.dur/4, s.dur)).env('pluckout')
s = s.speed(dsp.rand(1.5, 2))
out.dub(s)
return out * 2
###################
# PITCHED / MELODIC
###################
def makecrd(pos, count):
def make_imp(freqs, segs):
seg = dsp.choice(segs)
ilen = dsp.rand(0.3, 3)
imp = dsp.buffer(length=ilen)
stack = Waveset(seg, offset=dsp.randint(50, 100), limit=dsp.randint(10, 40))
stack.normalize()
for _ in range(dsp.randint(2,6)):
freq = dsp.choice(freqs) * 2**dsp.randint(0, 3)
i = oscs.Pulsar2d(stack, windows=['hann'], freq=freq).play(ilen).pan(dsp.rand()).env('pluckout') * dsp.rand()
#i = i.env(dsp.choice(['hannout', 'sineout', 'saw', 'rsaw', 'pluckout']))
imp.dub(i)
if dsp.rand() > 0.5:
imp.dub(imp.rcut(dsp.rand()).repeat(dsp.randint(2, 30)).env('pluckout'))
#curve = dsp.win('rnd', dsp.choice(freqs) * 2, max(freqs) * 2)
#imp = fx.lpf(imp, curve)
return imp * 1.5
def make_src(freqs, segs):
seg = dsp.choice(segs)
src = fx.norm(seg, 1).env('pluckout')
src = src.vspeed(dsp.win('rnd', 0.75, 1))
if dsp.rand() > 0.5:
src = src.rcut(dsp.rand()).repeat(dsp.randint(2, 30)).env('pluckout')
return src
freqs = tune.chord(chords[0], octave=2, key=KEY)
out = make_src(freqs, segs)
imp = make_imp(freqs, segs)
out.dub(imp)
out = fx.norm(out, dsp.rand(0.7, 1))
return out.env('pluckout') * 1.6
def makebas(pos, count):
s = ['e1', 'e1', 'e1', 'e1', 'd1', 'd1', 'c1']
freq = tune.ntf(s[count % len(s)]) * 1.5
if dsp.rand() > 0.8 and count % 3 == 0:
freq *= 2
blength = dsp.rand(0.4, 0.6)
out = dsp.buffer(length=blength)
for o in range(3):
amp = abs(1 - (o/3)) + 0.15
b = oscs.Osc('square', freq=freq * 2**o, quality=8, phase=dsp.rand()).play(blength).pan(dsp.rand()) * amp
out.dub(b)
out = fx.fold(out, amp=dsp.win('rnd', 10, dsp.rand(30,100)))
out = fx.lpf(out, freq*dsp.rand(3,7))
out = fx.norm(out, dsp.rand(0.7, 0.9))
return out.env('pluckout') * 5
def makeswell(pos, count):
swelllength = dsp.rand(4, 10)
out = dsp.buffer(length=swelllength)
freq = dsp.choice(tune.chord(chords[0], key=KEY, octave=dsp.randint(4, 10)))
rfreq = False
if dsp.rand() > 0.5:
rfreq = True
for _ in range(dsp.randint(1,4)):
if rfreq:
freq = dsp.choice(tune.chord(chords[0], key='e', octave=dsp.randint(1, 4)))
o = oscs.Osc('sine', freq=freq, phase=dsp.rand(), quality=6).play(swelllength) * dsp.rand(0.04, 0.1)
o = o.pan(dsp.rand())
out.dub(o)
out = out.env(dsp.win(shapes.win('hann'), 0.4, 0.8)).env('sine').env('hann')
out = out.pad(start=dsp.rand())
return out
def makebells(pos, count):
#freqs = tune.chord(chords[0], octave=2, key=KEY)
freqs = tune.fromdegrees([2,4,2,4,2,3,6,7,2,4,7,8], octave=3, root=KEY)
freq = freqs[count % len(freqs)]
r = rhodes.copy().speed(freq / tune.ntf('c3'))
r = r.cut(0.05, dsp.rand(1, 4)).env('pluckout')
r = r.pan(dsp.rand())
if dsp.rand() > 0.4:
rd = fx.delay(r, dsp.rand(0.01, 2), dsp.rand(0.25, 0.5))
elif dsp.rand() > 0.8:
rd = fx.mdelay(r, [ dsp.rand(0, 8) for _ in range(dsp.randint(3, 10)) ], 0.7)
else:
rd = r.copy()
rd = rd.cut(0, 0.5).cloud(rd.dur,
grainlength=dsp.win(shapes.win('hann'), dsp.MS*40, dsp.MS*400),
grid=dsp.win(shapes.win('hann'), dsp.MS*40, dsp.MS*4000),
)
rd = fx.hpf(rd, dsp.win(shapes.win('hann'), freq, freq*4))
r.dub(rd)
s = suite.copy().speed(freq / tune.ntf('c#4')) * dsp.rand(0.2, 0.5)
s = s.cut(0.05, dsp.rand(1, 4)).env('pluckout')
s = s.pan(dsp.rand())
#if dsp.rand() > 0.5:
# s = s.speed(dsp.choice([2,4]))
if dsp.rand() > 0.4:
sd = fx.delay(s, dsp.rand(0.01, 2), dsp.rand(0.25, 0.5))
elif dsp.rand() > 0.8:
sd = fx.mdelay(s, [ dsp.rand(0, 8) for _ in range(dsp.randint(3, 10)) ], 0.7)
else:
sd = s.copy()
sd = sd.cut(0, 0.5).cloud(sd.dur,
grainlength=dsp.win(shapes.win('hann'), dsp.MS*40, dsp.MS*400),
grid=dsp.win(shapes.win('hann'), dsp.MS*40, dsp.MS*4000),
)
sd = fx.hpf(sd, dsp.win(shapes.win('hann'), freq, freq*4))
s.dub(sd)
out = r & s
for o in range(3):
amp = abs(1 - (o/3)) + 0.15
b = oscs.Osc('square', freq=freq * 2**o, quality=8, phase=dsp.rand()).play(out.dur).pan(dsp.rand()) * amp * 0.25
b = fx.lpf(b, freq * 2**o * 2).env('pluckout')
out.dub(b)
if dsp.rand() > 0.5:
out = fx.fold(out, amp=dsp.win(shapes.win('hann'), 2, 20))
out = out.env('pluckout')
if dsp.rand() > 0.8:
out = fx.hpf(out, dsp.win(shapes.win('hann'), freq, freq*4))
return out
def makerolls(pos, count):
return rolls.cloud(dsp.rand(2,rolls.dur),
grainlength=dsp.win(shapes.win('hann'), 1, rolls.dur/2),
speed=dsp.win(shapes.win('hann'), 0.5, 1.5),
spread=1
).env(dsp.win(shapes.win('hann'), 0, 0.3)) * 2
def makepour(pos, count):
return pour.cloud(dsp.rand(2,pour.dur),
grainlength=dsp.win(shapes.win('hann'), 1, rolls.dur/2),
speed=dsp.win(shapes.win('hann'), 0.25, 1.5),
spread=1
).env(dsp.win(shapes.win('hann'), 0, 0.75))
def makebeat():
hatpat = {'a': 'x..x..x..'}
ha2pat = {'a': 'x.x.'}
kikpat = {'a': 'x..x..'}
clapat = {'a': '.x..x'}
snarat = {'a': '...x..', 'b': '...xx.', 'c': '..x.'}
crdpat = {'a': 'x...x.', 'b': 'xx..xx', 'c': 'xx.xx.'}
baspat = {'a': 'x...' '....' '....' '..x.'}
swellpat = {'a': 'x.x.'}
bellpat = {'a': 'xx..xx', 'b': 'xxx', 'c': 'xx.'}
rollpat = {'a': 'x..'}
pourpat = {'a': 'x.'}
score = {
# sections
'a': {
'swell': 'aaaa' 'aaaa',
'hats': '----' 'aa--',
'hatsalt': 'aaaa' 'aaaa',
'kicks': '--aa' 'a-aa',
'claps': '----' '----',
'snr': '----' '----',
'crd': 'aaaa' 'aaaa',
'bass': 'aaaa' 'aaa-',
'pour': 'aaaa' 'aaaa',
},
'b': {
'swell': 'aaaa' 'aaaa',
'hats': 'aaaa' 'aaa-',
'hatsalt': 'aaaa' 'aaa-',
'kicks': 'aaaa' 'aaaa',
'claps': 'aaaa' 'aaaa',
'snr': 'aaab' 'aaab',
'crd': 'bbbb' 'cccc',
'bass': 'aaaa' 'a-a-',
'pour': 'aaaa' 'aaaa',
'roll': '----' '---aa',
},
'c': {
'swell': 'aaaa' 'aaaa',
'hats': 'aaaa' '----',
'hatsalt': 'aaaa' '----',
'kicks': '--aa' 'a-a-',
'claps': '----' '----',
'snr': 'cccc' '----',
'crd': 'aaaa' 'aaa-',
'bass': 'aaaa' 'aaaa',
'bell': 'cccc' 'aac-',
'roll': 'aaaa' '----',
},
'z': {
'swell': 'aaaa' 'aaaa',
'hats': 'aaaa' '----',
'kicks': '--aa' 'a-a-',
'bass': 'aaaa' 'aaaa',
'bell': 'cccc' 'bbaa',
'roll': 'a---' '----',
},
'seq': 'aabbccaabbccz', # section sequence
#'seq': 'abccz',
}
beat = dsp.win(shapes.win('hann'), 60 / 90., 60 / 130.)
#beat = 60 / 100.0
dm = rhythm.Seq(beat)
dm.add('swell', swellpat, makeswell, div=1)
dm.add('hats', hatpat, makehat, div=6)
dm.add('hatsalt', ha2pat, makehat, div=4)
dm.add('kicks', kikpat, makekick, div=2)
dm.add('claps', clapat, makeclap, div=2)
dm.add('snr', snarat, makesnare, div=4)
dm.add('crd', crdpat, makecrd, div=6)
dm.add('bass', baspat, makebas, div=4)
dm.add('bell', bellpat, makebells, div=1.5)
dm.add('roll', rollpat, makerolls, div=3)
dm.add('pour', pourpat, makepour, div=2)
return dm.score(score, barlength=4, stems=True, stemsdir='stems/', pool=True)
def main():
#g = dsp.read('soup.flac')
out = makebeat()
out = fx.compressor(out, 15, -15)
out = fx.norm(out, 1).trim()
out.write('renders/soup-breaks%03d.wav' % RN)
if __name__ == '__main__':
exit(main())
(..sions/happy-little-lines) % ls -R . Tue 24 9:33PM lake
.:
bellscripts process002.py process.py profileprocess.py __pycache__ renders score043.png sounds stems
'happy little lines codes.csv' process-7.py profile profile.prof radiopost score035.png segments splitter.py
./bellscripts:
chorale.py ingest.py megasort.py mixture.py wtcompose.py
./__pycache__:
process.cpython-38.pyc
./radiopost:
radiopost
./radiopost/radiopost:
graph.py __init__.py recipes.py render.py segments.py synth.py waves.py
./renders:
soup-bits11.mp3 soup-bits.mp3 soup-breaks007.wav soup-breaks014.wav soup-breaks019.wav soup-breaks026.wav soup-breaks031.wav soup-breaks037.wav soup-breaks043.wav soup-breaks051.wav soup-breaks-320-056.mp3
soup-bits11.wav soup-bits.wav soup-breaks008.wav soup-breaks015.mp3 soup-breaks020.wav soup-breaks027.wav soup-breaks032.wav soup-breaks038.wav soup-breaks044.wav soup-breaks052.wav soup.flac
soup-bits12.wav soup-breaks003.wav soup-breaks009.wav soup-breaks015.wav soup-breaks021.wav soup-breaks028.wav soup-breaks033.wav soup-breaks039.wav soup-breaks045.wav soup-breaks053.wav
soup-bits13.wav soup-breaks004.wav soup-breaks010.wav soup-breaks016.mp3 soup-breaks022.wav soup-breaks029.wav soup-breaks034.wav soup-breaks040.wav soup-breaks046.wav soup-breaks054.wav
soup-bits14.wav soup-breaks005.wav soup-breaks011.wav soup-breaks016.wav soup-breaks023.wav soup-breaks030.wav soup-breaks035.mp3 soup-breaks041.wav soup-breaks048.wav soup-breaks055.wav
soup-bits15.wav soup-breaks006.wav soup-breaks012.wav soup-breaks017.wav soup-breaks024.wav soup-breaks031a.mp3 soup-breaks035.wav soup-breaks042.wav soup-breaks049.wav soup-breaks056.mp3
soup-bits16.wav soup-breaks007.mp3 soup-breaks013.wav soup-breaks018.wav soup-breaks025.wav soup-breaks031.mp3 soup-breaks036.wav soup-breaks043.mp3 soup-breaks050.wav soup-breaks056.wav
./segments:
seg-0.wav seg-118.wav seg-136.wav seg-154.wav seg-172.wav seg-190.wav seg-208.wav seg-226.wav seg-244.wav seg-262.wav seg-280.wav seg-299.wav seg-316.wav seg-36.wav seg-54.wav seg-72.wav seg-90.wav
seg-100.wav seg-119.wav seg-137.wav seg-155.wav seg-173.wav seg-191.wav seg-209.wav seg-227.wav seg-245.wav seg-263.wav seg-281.wav seg-29.wav seg-317.wav seg-37.wav seg-55.wav seg-73.wav seg-91.wav
seg-101.wav seg-11.wav seg-138.wav seg-156.wav seg-174.wav seg-192.wav seg-20.wav seg-228.wav seg-246.wav seg-264.wav seg-282.wav seg-2.wav seg-318.wav seg-38.wav seg-56.wav seg-74.wav seg-92.wav
seg-102.wav seg-120.wav seg-139.wav seg-157.wav seg-175.wav seg-193.wav seg-210.wav seg-229.wav seg-247.wav seg-265.wav seg-283.wav seg-300.wav seg-319.wav seg-39.wav seg-57.wav seg-75.wav seg-93.wav
seg-103.wav seg-121.wav seg-13.wav seg-158.wav seg-176.wav seg-194.wav seg-211.wav seg-22.wav seg-248.wav seg-266.wav seg-284.wav seg-301.wav seg-31.wav seg-3.wav seg-58.wav seg-76.wav seg-94.wav
seg-104.wav seg-122.wav seg-140.wav seg-159.wav seg-177.wav seg-195.wav seg-212.wav seg-230.wav seg-249.wav seg-267.wav seg-285.wav seg-302.wav seg-320.wav seg-40.wav seg-59.wav seg-77.wav seg-95.wav
seg-105.wav seg-123.wav seg-141.wav seg-15.wav seg-178.wav seg-196.wav seg-213.wav seg-231.wav seg-24.wav seg-268.wav seg-286.wav seg-303.wav seg-321.wav seg-41.wav seg-5.wav seg-78.wav seg-96.wav
seg-106.wav seg-124.wav seg-142.wav seg-160.wav seg-179.wav seg-197.wav seg-214.wav seg-232.wav seg-250.wav seg-269.wav seg-287.wav seg-304.wav seg-322.wav seg-42.wav seg-60.wav seg-79.wav seg-97.wav
seg-107.wav seg-125.wav seg-143.wav seg-161.wav seg-17.wav seg-198.wav seg-215.wav seg-233.wav seg-251.wav seg-26.wav seg-288.wav seg-305.wav seg-323.wav seg-43.wav seg-61.wav seg-7.wav seg-98.wav
seg-108.wav seg-126.wav seg-144.wav seg-162.wav seg-180.wav seg-199.wav seg-216.wav seg-234.wav seg-252.wav seg-270.wav seg-289.wav seg-306.wav seg-324.wav seg-44.wav seg-62.wav seg-80.wav seg-99.wav
seg-109.wav seg-127.wav seg-145.wav seg-163.wav seg-181.wav seg-19.wav seg-217.wav seg-235.wav seg-253.wav seg-271.wav seg-28.wav seg-307.wav seg-325.wav seg-45.wav seg-63.wav seg-81.wav seg-9.wav
seg-10.wav seg-128.wav seg-146.wav seg-164.wav seg-182.wav seg-1.wav seg-218.wav seg-236.wav seg-254.wav seg-272.wav seg-290.wav seg-308.wav seg-326.wav seg-46.wav seg-64.wav seg-82.wav
seg-110.wav seg-129.wav seg-147.wav seg-165.wav seg-183.wav seg-200.wav seg-219.wav seg-237.wav seg-255.wav seg-273.wav seg-291.wav seg-309.wav seg-327.wav seg-47.wav seg-65.wav seg-83.wav
seg-111.wav seg-12.wav seg-148.wav seg-166.wav seg-184.wav seg-201.wav seg-21.wav seg-238.wav seg-256.wav seg-274.wav seg-292.wav seg-30.wav seg-328.wav seg-48.wav seg-66.wav seg-84.wav
seg-112.wav seg-130.wav seg-149.wav seg-167.wav seg-185.wav seg-202.wav seg-220.wav seg-239.wav seg-257.wav seg-275.wav seg-293.wav seg-310.wav seg-329.wav seg-49.wav seg-67.wav seg-85.wav
seg-113.wav seg-131.wav seg-14.wav seg-168.wav seg-186.wav seg-203.wav seg-221.wav seg-23.wav seg-258.wav seg-276.wav seg-294.wav seg-311.wav seg-32.wav seg-4.wav seg-68.wav seg-86.wav
seg-114.wav seg-132.wav seg-150.wav seg-169.wav seg-187.wav seg-204.wav seg-222.wav seg-240.wav seg-259.wav seg-277.wav seg-295.wav seg-312.wav seg-330.wav seg-50.wav seg-69.wav seg-87.wav
seg-115.wav seg-133.wav seg-151.wav seg-16.wav seg-188.wav seg-205.wav seg-223.wav seg-241.wav seg-25.wav seg-278.wav seg-296.wav seg-313.wav seg-33.wav seg-51.wav seg-6.wav seg-88.wav
seg-116.wav seg-134.wav seg-152.wav seg-170.wav seg-189.wav seg-206.wav seg-224.wav seg-242.wav seg-260.wav seg-279.wav seg-297.wav seg-314.wav seg-34.wav seg-52.wav seg-70.wav seg-89.wav
seg-117.wav seg-135.wav seg-153.wav seg-171.wav seg-18.wav seg-207.wav seg-225.wav seg-243.wav seg-261.wav seg-27.wav seg-298.wav seg-315.wav seg-35.wav seg-53.wav seg-71.wav seg-8.wav
./sounds:
melonpans.wav melonpour.wav nycrhodesC.wav soup.flac suitetoneC#.wav
./stems:
stem-bass.wav stem-bell.wav stem-claps.wav stem-crd.wav stem-hatsalt.wav stem-hats.wav stem-kicks.wav stem-pour.wav stem-roll.wav stem-snr.wav stem-swell.wav
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment