def rhodes(total_time, freq=220.0, ampscale=0.5): partials = [ # Multiple, amplitude, duration [1, 0.6, 1.0], [2, 0.25, 0.35], [3, 0.08, 0.15], [4, 0.005, 0.04], ] layers = [] for plist in partials: partial = dsp.tone(freq=plist[0] * freq, length=total_time, amp=plist[1] * ampscale) env_length = (total_time * plist[2] * 2) / 32 wtable = dsp.wavetable('hann', int(env_length)) wtable = wtable[int(env_length / 2):] wtable.extend([0 for i in range(total_time - len(wtable))]) print env_length, len(wtable), dsp.flen(partial) partial = dsp.split(partial, 32) partial = [ dsp.amp(partial[i], wtable[i]) for i in range(len(partial)) ] layer = ''.join(partial) layers += [ layer ] out = dsp.mix(layers) noise = dsp.amp(dsp.bln(dsp.flen(out) * 2, 2000, 20000), 0.005) noise = dsp.fill(noise, dsp.flen(out)) out = dsp.mix([out, noise]) return out
def make_pulse(snd): snd_len = dsp.flen(snd) blip = dsp.cut(snd, 0, dsp.mstf(10)) blip = dsp.env(blip, 'sine') blip = dsp.pad(blip, 0, snd_len - dsp.flen(blip)) return blip
def rhodes(length=22050, freq=220.0, amp=0.5, wavetype='sine'): partials = [ # Multiple, amplitude, duration [1, 0.6, 1.0], [2, 0.25, 0.35], [3, 0.08, 0.15], [4, 0.005, 0.04], ] layers = [] for plist in partials: partial = dsp.tone(freq=plist[0] * freq, length=length, amp=plist[1], wavetype=wavetype) env_length = (length * plist[2] * 2) / 32 if env_length <= 2: env_length = 4 wtable = dsp.wavetable('hann', int(env_length)) wtable = wtable[int(env_length / 2):] wtable.extend([0 for i in range(length - len(wtable))]) partial = dsp.split(partial, 32) partial = [ dsp.amp(partial[i], wtable[i]) for i in range(len(partial)) ] layer = ''.join(partial) layers += [ layer ] out = dsp.mix(layers) noise = dsp.amp(dsp.bln(dsp.flen(out) * 2, 2000, 20000), 0.005) noise = dsp.fill(noise, dsp.flen(out)) out = dsp.mix([out, noise]) out = dsp.amp(out, amp) return out
def rhodes(total_time, freq=220.0, ampscale=0.5): partials = [ # Multiple, amplitude, duration [1, 0.6, 1.0], [2, 0.25, 0.35], [3, 0.08, 0.15], [4, 0.005, 0.04], ] layers = [] for plist in partials: partial = dsp.tone(freq=plist[0] * freq, length=total_time, amp=plist[1] * ampscale) env_length = (total_time * plist[2] * 2) / 32 wtable = dsp.wavetable('hann', int(env_length)) wtable = wtable[int(env_length / 2):] wtable.extend([0 for i in range(total_time - len(wtable))]) print env_length, len(wtable), dsp.flen(partial) partial = dsp.split(partial, 32) partial = [dsp.amp(partial[i], wtable[i]) for i in range(len(partial))] layer = ''.join(partial) layers += [layer] out = dsp.mix(layers) noise = dsp.amp(dsp.bln(dsp.flen(out) * 2, 2000, 20000), 0.005) noise = dsp.fill(noise, dsp.flen(out)) out = dsp.mix([out, noise]) return out
def play(voice_id): bpm = config('bpm') beat = dsp.bpm2frames(bpm) root = config('key') quality = getattr(tune, config('quality')) ratios = getattr(tune, config('tune')) bar = beat * dsp.randchoose([8, 16, 32]) groot = tune.ntf('c') scale = tune.fromdegrees([1,3,5,6,8,9], root=root, octave=2, ratios=ratios) v = dsp.read('sounds/vibesc1.wav').data out = '' # lens = [ bar / 5, bar / 8, bar / 12 ] lens = [ bar / 6, bar / 8, bar / 16 ] maxbend = 2 maxbend = 0.02 layers = [] for nlen in lens: layer = '' nlen /= 2 note = dsp.transpose(v, (dsp.randchoose(scale) * 2**dsp.randint(0, 3)) / groot) note = dsp.fill(note, nlen) note = dsp.env(note, 'phasor') note = dsp.amp(note, 0.125) nbeats = bar / nlen for b in range(nbeats): b = dsp.pan(note, dsp.rand()) b = dsp.drift(b, dsp.rand(0, dsp.rand(0.01, maxbend))) if dsp.flen(b) < nlen: b = dsp.pad(b, 0, nlen - dsp.flen(b)) # if dsp.rand() > 0.5: # b = dsp.vsplit(b, dsp.flen(b) / 3, dsp.flen(b) / 2) # b = dsp.randshuffle(b) # b = [ dsp.amp(bb, dsp.rand(0.5, 2)) for bb in b ] # b = ''.join(b) layer += b # layer = dsp.fill(layer, bar) layers += [ layer ] out = dsp.mix(layers) out = dsp.fill(out, bar) return out
def play(self, freq, length, amp=1): snd = dsp.transpose(self.snd, freq / self.freq) snd = dsp.taper(snd, 40) snd = dsp.amp(snd, amp) if self.direction == 'fw': snd = dsp.env(snd, self.env) snd = dsp.fill(snd, length, silence=True) if self.direction == 'fw-loop': snd = dsp.fill(snd, length, silence=False) snd = dsp.env(snd, self.env) if self.direction == 'fw-loop-rand': snd = dsp.env(snd, self.env) elapsed = 0 sndout = '' while elapsed < length: sndout += dsp.pad(snd, 0, dsp.randint(0, dsp.flen(snd))) elapsed = dsp.flen(sndout) snd = dsp.fill(sndout, length, silence=False) if self.direction == 'fw-bw-loop': snd = dsp.fill(snd + dsp.reverse(snd), length, silence=False) snd = dsp.env(snd, self.env) if self.tails: snd = dsp.mix([ snd, self.makeTails(freq, length) ]) return snd
def fade(snd, time=dsp.mstf(1)): first = dsp.cut(snd, 0, time) middle = dsp.cut(snd, time, dsp.flen(snd) - (time * 2)) last = dsp.cut(snd, dsp.flen(middle) + time, time) snd = dsp.env(first, 'line') + middle + dsp.env(last, 'phasor') return snd
def makeClaps(length, wobble): out = Tracks() onsets = makeOnsets(length, wobble, 2, 8, True) for onset in onsets: clap = dsp.stretch(c, int(dsp.flen(c) * log.get(1, 10)), grain_size=dsp.randint(20, 120)) out.add(clap, onset) out = out.mix() out = dsp.split(out, dsp.flen(out) / dsp.randchoose([2, 3, 4])) out = [ dsp.taper(o, 20) for o in out ] out = dsp.randshuffle(out) out = ''.join(out) out = dsp.fill(out, length, silence=False) return dsp.taper(out, 40)
def play(voice_id): tel = bot.getTel() degrees = [ dsp.randchoose([1, 2, 3, 5, 6, 8]) for f in range(dsp.randint(2, 20)) ] #degrees = [ dsp.randchoose([1, 5, 6, 7, 8]) for f in range(dsp.randint(2, 10)) ] octave = dsp.randint(1, 4) freqs = tune.fromdegrees(degrees, root='c', octave=octave, ratios=tune.terry) out = '' for r in range(dsp.randint(2, 20)): freq = dsp.randchoose(freqs) waveform = dsp.randchoose(['tri', 'sine2pi']) length = dsp.randint(dsp.mstf(1), dsp.mstf(4000)) #length = dsp.mstf(1500) #length = dsp.mstf(2500) pulsewidth = dsp.rand(0.01, 1) mod = dsp.breakpoint([ dsp.rand() for b in range(int(round(tel['density'])) + 3) ], 512) window = dsp.breakpoint([0] + [ dsp.rand() for b in range(int(round(tel['harmonicity'] * 2)) + 3) ] + [0], 512) waveform = dsp.breakpoint([0] + [ dsp.rand(-1, 1) for b in range(int(round(tel['roughness'] * dsp.randint(1, 4))) + 3) ] + [0], 512) modRange = dsp.rand(0.01, 100.08) modFreq = dsp.rand(0.0001, 5) volume = dsp.rand(0.2, 0.3) * (tel['density'] / 10.0) #volume = dsp.rand(0.2, 0.8) t = dsp.pulsar(freq, length, pulsewidth, waveform, window, mod, modRange, modFreq, volume) #t = dsp.tone(length, freq, waveform) t = dsp.pan(t, dsp.rand()) t = dsp.alias(t) t = dsp.amp(t, dsp.rand(0.5, 15.0)) t = dsp.pad(t, 0, dsp.randint(dsp.mstf(1), dsp.mstf(10))) t = dsp.amp(t, dsp.rand(0.5, 0.95)) t = dsp.env(t, 'sine') #t = dsp.env(t, 'phasor') #t = dsp.pine(t, dsp.flen(t) * 4, freq) out += t dsp.log('') dsp.log('boone') dsp.log('%s length: %.2f' % (voice_id, dsp.fts(dsp.flen(out)))) bot.show_telemetry(tel) return out
def makeGrains(): guitar = dsp.randchoose(guitars) guitar = dsp.transpose(guitar, dsp.randchoose([1, 2, 3, 4, 8])) max_grain_length = dsp.mstf(dsp.rand(10, 500)) positions = [ math.floor(pos * (dsp.flen(guitar) - max_grain_length)) for pos in makeShape() ] lengths = [ math.floor(length * (max_grain_length - 1) + 1) for length in makeShape() ] pans = makeShape() amps = [amp * dsp.rand(0, 10) for amp in makeShape()] num_grains = dsp.randint(500, 1000) grains = [] for i in range(num_grains): grain = dsp.cut(guitar, positions[i % len(positions)], lengths[i % len(lengths)]) grain = dsp.pan(grain, pans[i % len(pans)]) grain = dsp.amp(grain, amps[i % len(amps)]) grain = dsp.taper(grain, 20) grains += [grain] return ''.join(grains)
def fracture(snd): numpoints = dsp.randint(3, 20) poscurve = dsp.breakpoint([0] + [dsp.rand() for i in range(4)] + [0], numpoints) poscurve = [ p * (dsp.flen(snd) - dsp.mstf(210)) for p in poscurve ] lencurve = dsp.breakpoint([0] + [dsp.rand() for i in range(4)] + [0], numpoints) lencurve = [ l * dsp.mstf(200) + dsp.mstf(10) for l in lencurve ] pancurve = dsp.breakpoint([0] + [dsp.rand() for i in range(4)] + [0], numpoints) prepadcurve = dsp.breakpoint([0] + [dsp.rand() for i in range(4)] + [0], numpoints) prepadcurve = [ int(p * dsp.mstf(20)) for p in prepadcurve ] postpadcurve = dsp.breakpoint([0] + [dsp.rand() for i in range(4)] + [0], numpoints) postpadcurve = [ int(p * dsp.mstf(20)) for p in postpadcurve ] speeds = [1.0, 2.0, 0.5, 0.75] grains = [ dsp.cut(snd, poscurve[i], lencurve[i]) for i in range(numpoints) ] grains = [ dsp.pan(grains[i], pancurve[i]) for i in range(numpoints) ] grains = [ dsp.env(grain, 'gauss', True) for grain in grains ] grains = [ dsp.transpose(grain, dsp.randchoose(speeds)) for grain in grains ] grains = [ dsp.pad(grains[i], prepadcurve[i], postpadcurve[i]) for i in range(numpoints) ] for i in range(numpoints): if dsp.randint(0, 3) == 0: grains[i] = slurp(grains[i]) etypes = ['line', 'phasor', 'tri', 'sine', 'gauss'] snd = dsp.env(''.join(grains), dsp.randchoose(etypes)) snd = dsp.pad(snd, 0, dsp.mstf(dsp.rand(100, 400))) return snd
def clap2(beat): nlens = [ beat * 2, beat, beat / 2, ] # length of pattern (in beats) nbeats = dsp.randint(10, 15) # beat lengths (from a set of bpm-derived note lengths defined in the nlens list) blens = [dsp.randchoose(nlens) for b in range(nbeats)] out = '' # synthesize the tones for i in range(nbeats): beat = dsp.transpose(dsp.randchoose([c1, c2]), dsp.rand(0.25, 40.0)) beat = dsp.pad(beat, 0, blens[i] - dsp.flen(beat)) beat = dsp.amp(beat, dsp.rand(1, 4)) # add it to the output out += beat return out
def makeGlitch(length, i): g = dsp.cut(long_chord, dsp.randint(0, dsp.flen(long_chord) - length), length) g = dsp.alias(g) g = dsp.fill(g, length) return g
def makeSnare(length, i, amp): s = dsp.cut(snare, 0, dsp.randint(dsp.mstf(40), dsp.flen(snare))) s = dsp.alias(s, dsp.randint(4, 12)) s = dsp.taper(s) s = dsp.fill(s, length, silence=True) s = dsp.amp(s, dsp.rand(2, 4)) return s
def singit(lyrics, mult): words = text2wave(lyrics) root = config('key') quality = getattr(tune, config('quality')) ratios = getattr(tune, config('tune')) pitches = [dsp.randint(1, 9) for i in range(dsp.randint(2, 4))] pitches = tune.fromdegrees(pitches, octave=dsp.randint(1, 4), root=root, ratios=ratios, scale=quality) return words sings = [ dsp.pine(words, dsp.flen(words) * mult, pitch) for pitch in pitches ] sings = dsp.mix(sings) # sings = sox("sox %s %s tempo 1.0", sings) return sings
def makeRhodes(length, beat, freqs): root = tune.ntf(key, 2) for i, freq in enumerate(freqs): if freq > root * 2.5: freqs[i] = freq * 0.5 chord = [keys.rhodes(length, freq, dsp.rand(0.4, 0.6)) for freq in freqs] chord = dsp.randshuffle(chord) pause = 0 for i, c in enumerate(chord): pause = pause + (dsp.randint(1, 4) * beat) c = dsp.pan(c, dsp.rand()) chord[i] = dsp.pad(dsp.fill(c, length - pause), pause, 0) chord = dsp.mix(chord) chord = dsp.split(chord, dsp.flen(chord) / 16) chord = dsp.randshuffle(chord) chord = [dsp.env(ch, "phasor") for ch in chord] chord = [ dsp.mix( [ dsp.amp(dsp.pan(grain, dsp.rand()), dsp.rand(0.1, 0.8)), dsp.amp(dsp.pan(dsp.randchoose(chord), dsp.rand()), dsp.rand(0.1, 0.8)), ] ) for grain in chord ] chord = "".join(chord) return chord
def makeRhodes(length, beat, freqs): root = tune.ntf(key, 2) for i, freq in enumerate(freqs): if freq > root * 2.5: freqs[i] = freq * 0.5 chord = [ keys.rhodes(length, freq, dsp.rand(0.4, 0.6)) for freq in freqs ] chord = dsp.randshuffle(chord) pause = 0 for i, c in enumerate(chord): pause = pause + (dsp.randint(1, 4) * beat) c = dsp.pan(c, dsp.rand()) chord[i] = dsp.pad(dsp.fill(c, length - pause), pause, 0) chord = dsp.mix(chord) chord = dsp.split(chord, dsp.flen(chord) / 16) chord = dsp.randshuffle(chord) chord = [ dsp.env(ch, 'phasor') for ch in chord ] chord = [ dsp.mix([ dsp.amp(dsp.pan(grain, dsp.rand()), dsp.rand(0.1, 0.8)), dsp.amp(dsp.pan(dsp.randchoose(chord), dsp.rand()), dsp.rand(0.1, 0.8)) ]) for grain in chord ] chord = ''.join(chord) return chord
def play(ctl): freq = tune.ntf(dsp.randchoose(['eb']), octave=dsp.randint(0,2)) synth = keys.rhodes(dsp.stf(4), freq) s = dsp.vsplit(synth, dsp.mstf(50), dsp.mstf(2000)) s = dsp.randshuffle(s) #s = [ dsp.alias(ss) for ss in s ] s = [ dsp.amp(ss, dsp.rand(0.5, 0.75)) for ss in s ] s = [ dsp.pan(ss, dsp.rand(0, 1)) for ss in s ] s = ''.join(s) s = dsp.fill(s, dsp.flen(synth)) s2 = dsp.vsplit(synth, dsp.mstf(150), dsp.mstf(1500)) s2 = dsp.randshuffle(s2) s2 = [ dsp.transpose(ss, dsp.randchoose([1,1.5,2,3,4,8])) for ss in s2 ] s2 = [ dsp.env(ss, 'phasor') for ss in s2 ] s2 = ''.join(s2) out = dsp.mix([ s, s2 ]) out = dsp.amp(out, 1.5) out = dsp.transpose(out, 1.01) #synth = dsp.fill(synth, dsp.flen(main)) #out = synth return out
def spider(snd, numlayers=10, numgrains=20, minlen=40, lenranges=(300,500), reverse=False, env='hann'): layers = [] for layer in range(numlayers): lenrange = dsp.rand(lenranges[0], lenranges[1]) if reverse: lengths = dsp.wavetable(env, numgrains * 2)[numgrains:] else: lengths = dsp.wavetable(env, numgrains * 2)[:numgrains] lengths = [ dsp.mstf(l * lenrange + minlen) for l in lengths ] pans = dsp.breakpoint([ dsp.rand() for p in range(numgrains / 3)], numgrains) startpoint = dsp.randint(0, dsp.flen(snd) - max(lengths)) grains = '' for l, p in zip(lengths, pans): grain = dsp.cut(snd, startpoint, l) grain = dsp.env(grain, 'phasor') grain = dsp.taper(grain, dsp.mstf(10)) grain = dsp.pan(grain, p) grains += grain if reverse: layers += [ dsp.env(grains, 'line') ] else: layers += [ dsp.env(grains, 'phasor') ] return dsp.mix(layers)
def play(voice_id): """ Every generator script must define a play() function, which accepts a voice_id integer (so you can read and write params for each voice) and returns a sound. The shortname and name metadata above are optional, if you don't include them the name will be drawn from the filename and the shortname will be the first two characters of that name. """ # Get the current bpm set in our session bpm = C('bpm') # Convert it to a length in frames beat = dsp.bpm2frames(bpm) # Read per-instance param, with a default value volume = P(voice_id, 'volume', default=1.0) # Get a frequency for the beep freq = tune.ntf('a', octave=2) # Beep for a beat out = dsp.tone(length=beat, freq=freq, wavetype='sine2pi', amp=volume) # Be silent for a beat after the beep out = dsp.pad(out, 0, beat) # Log the length of the computed buffer. # I like to tail -f pippi.log during performance. dsp.log('voice %s length: %.2f' % (voice_id, dsp.fts(dsp.flen(out)))) # Pass along the final buffer for playback return out
def play(voice_id): tel = bot.getTel() b = dsp.read('sounds/birds.wav').data b = dsp.split(b, dsp.randint(100, 1000)) b = b[:dsp.randint(len(b) / 10, len(b))] blen = len(b) pans = dsp.breakpoint([ dsp.rand() for i in range(dsp.randint(10, 100)) ], blen) speeds = dsp.breakpoint([ dsp.rand(0.25, 1.5) for i in range(dsp.randint(10, 100)) ], blen) amps = dsp.breakpoint([ dsp.rand(0.05, 1.5) for i in range(dsp.randint(10, 100)) ], blen) b = [ dsp.pan(b[i], pans[i]) for i in range(blen) ] b = [ dsp.transpose(b[i], speeds[i]) for i in range(blen) ] b = [ dsp.amp(b[i], amps[i]) for i in range(blen) ] b = dsp.packet_shuffle(b, dsp.randint(4, 30)) for i, bb in enumerate(b): if dsp.rand(0, 100) > 60: b[i] = bb * dsp.randint(2, 10) out = ''.join(b) dsp.log('') dsp.log('birds') dsp.log(blen) dsp.log('%s length: %.2f' % (voice_id, dsp.fts(dsp.flen(out)))) bot.show_telemetry(tel) return out
def makeSnare(length, i, amp): s = dsp.cut(snare, 0, dsp.randint(dsp.mstf(40), dsp.flen(snare))) s = dsp.alias(s, dsp.randint(4, 12)) s = dsp.taper(s) s = dsp.fill(s, length, silence=True) s = dsp.amp(s, dsp.rand(2,4)) return s
def clap2(beat): nlens = [ beat * 2, beat, beat / 2, ] # length of pattern (in beats) nbeats = dsp.randint(10, 15) # beat lengths (from a set of bpm-derived note lengths defined in the nlens list) blens = [ dsp.randchoose(nlens) for b in range(nbeats) ] out = '' # synthesize the tones for i in range(nbeats): beat = dsp.transpose(dsp.randchoose([c1,c2]), dsp.rand(0.25, 40.0)) beat = dsp.pad(beat, 0, blens[i] - dsp.flen(beat)) beat = dsp.amp(beat, dsp.rand(1, 4)) # add it to the output out += beat return out
def test_tone(): out = dsp.tone(length=dsp.stf(1), freq=220, wavetype='sine2pi', amp=1, phase=0, offset=0) assert dsp.flen(out) == dsp.stf(1)
def makeClaps(length, wobble): out = Tracks() onsets = makeOnsets(length, wobble, 2, 8, True) for onset in onsets: clap = dsp.stretch(c, int(dsp.flen(c) * log.get(1, 10)), grain_size=dsp.randint(20, 120)) out.add(clap, onset) out = out.mix() out = dsp.split(out, dsp.flen(out) / dsp.randchoose([2, 3, 4])) out = [dsp.taper(o, 20) for o in out] out = dsp.randshuffle(out) out = ''.join(out) out = dsp.fill(out, length, silence=False) return dsp.taper(out, 40)
def clap(amp, length): # Two layers of noise: lowmid and high out = dsp.mix([ bln(int(length * 0.2), 600, 1200), bln(int(length * 0.2), 7000, 9000) ]) out = dsp.env(out, 'phasor') out = dsp.pad(out, 0, length - dsp.flen(out)) return out
def snare(amp, length): # Two layers of noise: lowmid and high out = dsp.mix([ bln(int(length * 0.2), 700, 3200, 'impulse'), bln(int(length * 0.01), 7000, 9000) ]) out = dsp.env(out, 'phasor') out = dsp.pad(out, 0, length - dsp.flen(out)) return out
def make(length, freq): freq *= dsp.rand(1 - (bendfactor / 2.0), 1 + (bendfactor / 2.0)) out = keys.chippy(length=int(length * dsp.rand(0.01, 0.4)), freq=freq, amp=0.7) out = dsp.env(out, 'phasor') out = dsp.pad(out, 0, length - dsp.flen(out)) return out
def play(ctl): mpk = ctl.get('midi').get('mpk') nk = ctl.get('midi').get('nk') amp = mpk.get(4, low=0, high=1, default=0) kick = dsp.read('/home/hecanjog/sounds/drums/Junglebd.wav').data klength = dsp.mstf(mpk.get(1, low=60, high=1500, default=100)) k = dsp.fill(kick, klength, silence=True) kamp = nk.get(0, low=0, high=1, default=1) k = dsp.amp(k, kamp) kpitch = nk.get(16, low=0.25, high=1, default=1) k = dsp.transpose(k, kpitch) snare = dsp.read('/home/hecanjog/sounds/drums/Hipclap1.wav').data slength = dsp.mstf(mpk.get(2, low=60, high=500, default=100)) s = dsp.fill(snare, slength, silence=True) soffset = dsp.mstf(mpk.get(6, low=0, high=500, default=0)) s = dsp.pad(s, soffset, 0) samp = nk.get(1, low=0, high=1, default=1) s = dsp.amp(s, samp) spitch = nk.get(17, low=0.25, high=2, default=1) s = dsp.transpose(s, spitch) hat = dsp.read('/home/hecanjog/sounds/drums/78ch.wav').data hlength = dsp.mstf(mpk.get(3, low=60, high=500, default=100)) h = dsp.fill(hat, hlength, silence=True) hoffset = dsp.mstf(mpk.get(7, low=0, high=500, default=0)) h = dsp.pad(h, hoffset, 0) hamp = nk.get(2, low=0, high=1, default=1) h = dsp.amp(h, hamp) hpitch = nk.get(18, low=0.25, high=2, default=1) h = dsp.transpose(h, hpitch) longest = max([ dsp.flen(k), dsp.flen(h), dsp.flen(s) ]) k = dsp.fill(k, longest) h = dsp.fill(h, longest) s = dsp.fill(s, longest) out = dsp.mix([k, s, h]) out = dsp.amp(out, amp) return out
def play(ctl): mpk = ctl.get('midi').get('mpk') nk = ctl.get('midi').get('nk') amp = mpk.get(4, low=0, high=1, default=0) kick = dsp.read('/home/hecanjog/sounds/drums/Junglebd.wav').data klength = dsp.mstf(mpk.get(1, low=60, high=1500, default=100)) k = dsp.fill(kick, klength, silence=True) kamp = nk.get(0, low=0, high=1, default=1) k = dsp.amp(k, kamp) kpitch = nk.get(16, low=0.25, high=1, default=1) k = dsp.transpose(k, kpitch) snare = dsp.read('/home/hecanjog/sounds/drums/Hipclap1.wav').data slength = dsp.mstf(mpk.get(2, low=60, high=500, default=100)) s = dsp.fill(snare, slength, silence=True) soffset = dsp.mstf(mpk.get(6, low=0, high=500, default=0)) s = dsp.pad(s, soffset, 0) samp = nk.get(1, low=0, high=1, default=1) s = dsp.amp(s, samp) spitch = nk.get(17, low=0.25, high=2, default=1) s = dsp.transpose(s, spitch) hat = dsp.read('/home/hecanjog/sounds/drums/78ch.wav').data hlength = dsp.mstf(mpk.get(3, low=60, high=500, default=100)) h = dsp.fill(hat, hlength, silence=True) hoffset = dsp.mstf(mpk.get(7, low=0, high=500, default=0)) h = dsp.pad(h, hoffset, 0) hamp = nk.get(2, low=0, high=1, default=1) h = dsp.amp(h, hamp) hpitch = nk.get(18, low=0.25, high=2, default=1) h = dsp.transpose(h, hpitch) longest = max([dsp.flen(k), dsp.flen(h), dsp.flen(s)]) k = dsp.fill(k, longest) h = dsp.fill(h, longest) s = dsp.fill(s, longest) out = dsp.mix([k, s, h]) out = dsp.amp(out, amp) return out
def makePaper(out): tail = dsp.cut(paper, dsp.mstf(60), dsp.flen(out) - dsp.mstf(60)) tail = [ dsp.transpose(tail, dsp.rand(0.95, 1.05)) for _ in range(dsp.randint(3,6)) ] tail = [ fx.penv(t) for t in tail ] out = dsp.mix(tail + [ out ]) return out
def mix(self, length=None): self.tracks = sorted(self.tracks, key=lambda x: dsp.flen(x)) #self.tracks.reverse() out = dsp.mix(self.tracks) if length is not None: out = dsp.fill(out, length) return out
def play(ctl): param = ctl.get('param') lpd = ctl.get('midi').get('lpd') freqs = [ (10000, 15000), (5000, 15000), (5000, 10000), ] low = dsp.rand(50, 100) high = dsp.rand(80, 120) low = 80 high = 120 wform = 'sine2pi' amp = lpd.get(5, low=0, high=1, default=0) low = dsp.rand(low * 0.9, low) high = dsp.rand(high, high * 1.1) length = dsp.mstf(lpd.get(1, low=10, high=900)) if dsp.rand() > 10.5: length = length / 2 pulselength = lpd.geti(2, low=dsp.mstf(10), high=length, default=length) out = dsp.bln(pulselength, low, high, wform) out = dsp.env(out, 'phasor') if dsp.rand() > 10.1: beep = dsp.tone(dsp.flen(out), dsp.rand(12000, 12000), amp=dsp.rand(0.5, 1)) out = dsp.mix([out, beep]) out = dsp.drift(out, dsp.rand(0, 1)) out = dsp.pad(out, 0, length - dsp.flen(out)) out = dsp.pan(out, dsp.rand()) out = dsp.amp(out, amp) return out
def hat(length): if dsp.randint(0, 6) == 0: out = bln(length, 9000, 14000) out = dsp.env(out, 'line') else: out = bln(int(length * 0.05), 9000, 14000) out = dsp.env(out, 'phasor') out = dsp.pad(out, 0, length - dsp.flen(out)) return out
def sing(lyrics, freqs, speed=0, voice='english'): """ sing it mad slow in chords """ out = speak(lyrics, speed, voice) layers = [] for freq in freqs: layer = dsp.transpose(out, 0.25) layer = dsp.pine(layer, dsp.flen(layer) * 4, freq) slop = int(dsp.flen(layer) * 0.12) layer = dsp.cut(layer, slop, dsp.flen(layer) - (slop * 2)) layer = dsp.transpose(layer, 4) layer = dsp.pan(layer, dsp.rand()) layer = dsp.amp(layer, 0.5) layers += [ layer ] out = dsp.mix(layers) return out
def slurp(snd): snd = dsp.split(snd, dsp.flen(snd) / 100) numcycles = len(snd) curve_a = dsp.breakpoint([1.0] + [dsp.rand(0.1, 1.0) for r in range(dsp.randint(2, 10))] + [0], numcycles) curve_b = dsp.wavetable('cos', numcycles) wtable = [ curve_a[i] * curve_b[i] for i in range(numcycles) ] wtable = [ math.fabs((f * 5) + 0.75) for f in wtable ] snd = [ dsp.transpose(snd[i], wtable[i]) for i in range(numcycles) ] return ''.join(snd)
def make_vary(snd): numpoints = dsp.flen(snd) / 40 curve = dsp.breakpoint([0] + [ dsp.rand(0, 1) for i in range(dsp.randint(5, numpoints / 100)) ] + [0], numpoints) snd = dsp.split(snd, 40) snd = [ dsp.amp(snd[i], curve[i]) for i in range(numpoints) ] snd = ''.join(snd) return snd
def makeBeat(pattern, lengths, callback, args=None): out = '' for i, length in enumerate(lengths): # Silence or beat? amp = pattern[i % len(pattern)] if amp > 0: if args is not None: out += callback(length, i, args) else: out += callback(length, i) else: out += dsp.pad('', 0, length) try: assert dsp.flen(out) == sum(lengths) except AssertionError: print 'doh', dsp.flen(out), sum(lengths), pattern return out
def snare(amp, length): if amp == 0: return dsp.pad('', 0, length) # Two layers of noise: lowmid and high out = dsp.mix([ dsp.bln(int(length * 0.2), 700, 3200, 'impulse'), dsp.bln(int(length * 0.01), 7000, 9000) ]) out = dsp.env(out, 'phasor') out = dsp.pad(out, 0, length - dsp.flen(out)) out = dsp.amp(out, amp) return out
def singit(lyrics, mult): words = text2wave(lyrics) pitches = [ dsp.randint(1, 10) for i in range(dsp.randint(2, 4)) ] pitches = tune.fromdegrees(pitches, octave=dsp.randint(1, 4), root='a') sings = [ dsp.pine(words, dsp.flen(words) * mult, pitch) for pitch in pitches ] sings = dsp.mix(sings) sings = sox("sox %s %s tempo 5.0", sings) return sings
def play(voice_id): bpm = C('bpm') beat = dsp.bpm2frames(bpm) volume = P(voice_id, 'volume', default=1.0) chord = dsp.read('sounds/sag1.wav').data bass = dsp.read('sounds/sag2.wav').data out = '' for i in range(32): b = dsp.amp(bass, 0.5) b = dsp.transpose(b, 2) b *= 2 bar = dsp.flen(b) / 2 blayers = [] for blayer in range(3): blayer = dsp.split(b, bar / dsp.randchoose([6, 12])) blayer = dsp.randshuffle(blayer) blayer = blayer[:2] blayer = ''.join(blayer) blayer = dsp.pan(blayer, dsp.rand()) # blayer *= dsp.randint(2, 8) blayers += [ blayer ] b = dsp.mix(blayers) c = dsp.amp(chord, 0.5) c = dsp.fill(c, bar / dsp.randchoose([8, 16, 12, 24])) c = dsp.fill(c, dsp.flen(b)) out += dsp.mix([ b, c ]) dsp.log('voice %s length: %.2f' % (voice_id, dsp.fts(dsp.flen(out)))) return out
def make_tracks(numtracks): tracks = range(numtracks) g.db.execute('delete from `blocks`;') # Testing out display of rendered blocks for i, track in enumerate(tracks): blocks = range(dsp.randint(1, 5)) # for each sound: for j, snd in enumerate(blocks): # render it. snd = dsp.tone(dsp.stf(dsp.rand(0.5, 5))) # filename is track_id-block_id.wav for now filename = "%i-%i-%i" % (i, j, 0) # write it to disk dsp.write(snd, 'static/sounds/%s' % filename) # Calc length in pixels from frames length = dsp.flen(snd) pxlength = "%ipx" % (length / 441,) slength = "%02fs" % dsp.fts(length) offset = dsp.stf(dsp.rand(0, 60)) # save in the db block = ( 0, 0, i, length, length, offset, filename, ) g.db.execute('insert into `blocks` (version, generator_id, track_id, length, range, offset, filename) values (?, ?, ?, ?, ?, ?, ?)', block) c = g.db.cursor() block_id = c.lastrowid() # block is a tuple: # (block index, filename, length in pixels, offset in pixels) blocks[j] = (block_id, filename, slength, ftpx(length), ftpx(offset)) tracks[i] = blocks g.db.commit() return tracks
def makeHats(length, wobble): out = Tracks() onsets = makeOnsets(length, wobble, 1, 16, True) for onset in onsets: out.add(h, onset) out = out.mix() out = dsp.split(out, dsp.flen(out) / dsp.randchoose([2, 3, 4])) out = dsp.randshuffle(out) out = ''.join(out) out = dsp.fill(out, length, silence=False) return dsp.taper(out, 40)
def slurp(snd): snd = dsp.split(snd, dsp.flen(snd) / 100) numcycles = len(snd) curve_a = dsp.breakpoint( [1.0] + [dsp.rand(0.1, 1.0) for r in range(dsp.randint(2, 10))] + [0], numcycles) curve_b = dsp.wavetable('cos', numcycles) wtable = [curve_a[i] * curve_b[i] for i in range(numcycles)] wtable = [math.fabs((f * 5) + 0.75) for f in wtable] snd = [dsp.transpose(snd[i], wtable[i]) for i in range(numcycles)] return ''.join(snd)
def hat(length): lowf = dsp.rand(6000, 11000) highf = dsp.rand(11000, 17000) if dsp.randint(0, 6) == 0: out = bln(length, lowf, highf) out = dsp.env(out, 'line') else: out = bln(int(length * 0.05), lowf, highf) out = dsp.env(out, 'phasor') out = dsp.pad(out, 0, length - dsp.flen(out)) return out
def clap1(beat): c = dsp.read('sounds/mikeclap.wav').data c = dsp.transpose(c, dsp.rand(1, 2.5)) c = dsp.fill(c, dsp.mstf(dsp.rand(10, 100))) c = dsp.env(c, 'phasor') c = dsp.amp(c, dsp.rand(1, 3)) c = dsp.pad(c, 0, beat - dsp.flen(c)) blen = beat / dsp.randchoose([1, 2]) c = dsp.pad(c, blen, 0) c *= 4 return c
def snare(amp, length): if amp == 0: return dsp.pad('', 0, length) # Two layers of noise: lowmid and high out = dsp.mix([ bln(int(length * 0.2), 700, 3200, 'impulse'), bln(int(length * 0.01), 7000, 9000) ]) out = dsp.env(out, 'phasor') out = dsp.pad(out, 0, length - dsp.flen(out)) return out
def clap(amp, length): if amp == 0: return dsp.pad('', 0, length) # Two layers of noise: lowmid and high out = dsp.mix([ bln(int(length * 0.2), 600, 1200), bln(int(length * 0.2), 7000, 9000) ]) out = dsp.env(out, 'phasor') out = dsp.pad(out, 0, length - dsp.flen(out)) return out
def play(voice_id): bpm = C('bpm') beat = dsp.bpm2frames(bpm) volume = P(voice_id, 'volume', default=1.0) crinkle = dsp.read('sounds/s/crinkle.wav').data glass1 = dsp.read('sounds/s/glass1.wav').data glass2 = dsp.read('sounds/s/glass2.wav').data toys = dsp.read('sounds/s/rolling.wav').data c = dsp.vsplit(crinkle, dsp.mstf(10), dsp.stf(3)) c = dsp.randshuffle(c) c = c[:40] c = [dsp.pan(cc, dsp.rand()) for cc in c] c = [dsp.env(cc, 'sine') for cc in c] c = [dsp.transpose(cc, dsp.rand(0.25, 0.5)) for cc in c] t = dsp.vsplit(toys, dsp.mstf(10), dsp.stf(1)) t = dsp.randshuffle(t) t = t[:40] t = [dsp.amp(tt, dsp.rand(0.1, 0.8)) for tt in t] t = [dsp.pan(tt, dsp.rand(0, 1)) for tt in t] t = [dsp.env(tt, 'sine') for tt in t] t = [dsp.transpose(tt, 0.5) for tt in t] g = dsp.vsplit(glass2, dsp.mstf(1), dsp.mstf(100)) g = dsp.randshuffle(g) g = g[:40] g = [dsp.amp(gg, dsp.rand(0.35, 0.95)) for gg in g] g = [dsp.transpose(gg, dsp.rand(0.5, 1.75)) for gg in g] g = [gg * dsp.randint(1, 8) for gg in g] things = [c, t, g] out = [ dsp.mix([ dsp.randchoose(dsp.randchoose(things)) for l in range(dsp.randint(2, 4)) ]) for i in range(4) ] out = ''.join(out) dsp.log('voice %s length: %.2f' % (voice_id, dsp.fts(dsp.flen(out)))) return out
def hat(beat): length = beat * 4 nbeats = 16 blen = length / nbeats out = '' for b in range(nbeats): h = dsp.transpose(tape1, 9) h = dsp.fill(h, dsp.mstf(dsp.rand(1, 20))) h = dsp.env(h, 'phasor') h = dsp.amp(h, dsp.rand(0, 0.8)) h = dsp.pad(h, 0, blen - dsp.flen(h)) out += h out *= 8 return out
def fracture(snd): numpoints = dsp.randint(3, 20) poscurve = dsp.breakpoint([0] + [dsp.rand() for i in range(4)] + [0], numpoints) poscurve = [p * (dsp.flen(snd) - dsp.mstf(210)) for p in poscurve] lencurve = dsp.breakpoint([0] + [dsp.rand() for i in range(4)] + [0], numpoints) lencurve = [l * dsp.mstf(200) + dsp.mstf(10) for l in lencurve] pancurve = dsp.breakpoint([0] + [dsp.rand() for i in range(4)] + [0], numpoints) prepadcurve = dsp.breakpoint([0] + [dsp.rand() for i in range(4)] + [0], numpoints) prepadcurve = [int(p * dsp.mstf(20)) for p in prepadcurve] postpadcurve = dsp.breakpoint([0] + [dsp.rand() for i in range(4)] + [0], numpoints) postpadcurve = [int(p * dsp.mstf(20)) for p in postpadcurve] speeds = [1.0, 2.0, 0.5, 0.75] grains = [dsp.cut(snd, poscurve[i], lencurve[i]) for i in range(numpoints)] grains = [dsp.pan(grains[i], pancurve[i]) for i in range(numpoints)] grains = [dsp.env(grain, 'gauss', True) for grain in grains] grains = [dsp.transpose(grain, dsp.randchoose(speeds)) for grain in grains] grains = [ dsp.pad(grains[i], prepadcurve[i], postpadcurve[i]) for i in range(numpoints) ] for i in range(numpoints): if dsp.randint(0, 3) == 0: grains[i] = slurp(grains[i]) etypes = ['line', 'phasor', 'tri', 'sine', 'gauss'] snd = dsp.env(''.join(grains), dsp.randchoose(etypes)) snd = dsp.pad(snd, 0, dsp.mstf(dsp.rand(100, 400))) return snd
def make(length, i): r = dsp.transpose(guitar, getRatio(scale[i % len(scale)])) r = dsp.mix([ dsp.pan(r, dsp.rand()), dsp.drift(dsp.pan(r, dsp.rand()), dsp.rand(0.001, 0.02)) ]) if dsp.rand() > 0.5: r = dsp.alias(r) if dsp.rand() > 0.5: r = dsp.split(r, dsp.flen(r) / dsp.randint(2, 5)) r = dsp.randshuffle(r) r = ''.join(r) r = dsp.amp(r, dsp.rand(0.1, 0.75)) g = dsp.fill(r, length, silence=True) return g
def kick(amp, length): if amp == 0: return dsp.pad('', 0, length) fhigh = 160.0 flow = 60.0 fdelta = fhigh - flow target = length pos = 0 fpos = fhigh out = '' while pos < target: # Add single cycle # Decrease pitch by amount relative to cycle len cycle = dsp.cycle(fpos) #cycle = ''.join([ str(v) for v in dsp.curve(0, dsp.htf(fpos), math.pi * 2) ]) pos += dsp.flen(cycle) #fpos = fpos - (fhigh * (length / dsp.htf(fpos))) fpos = fpos - 30.0 out += cycle return dsp.env(out, 'phasor')
def play(ctl): param = ctl.get('param') lpd = ctl.get('midi').get('lpd') pc = ctl.get('midi').get('pc') #pc.setOffset(111) gamut = { 'high': [ (10000, 15000), (5000, 15000), (5000, 10000), ], 'mid': [ (1000, 5000), (1000, 2000), ], 'pitch': [ tuple([ dsp.rand(500, 2000) for p in range(2) ]), tuple([ dsp.rand(100, 1000) for p in range(2) ]), tuple([ dsp.rand(1000, 5000) for p in range(2) ]), ], 'low': [ (20, 5000), (30, 10000), (40, 10000), ] } area = param.get('wash-area', default='high') area = dsp.randchoose(['high', 'mid', 'pitch', 'low']) area = 'pitch' dsp.log(area) freqs = dsp.randchoose(gamut[area]) freqscale = pc.get(16, low=0.125, high=2, default=1) #freqscale = dsp.rand(0.125, 2) low = freqs[0] * freqscale high = freqs[1] * freqscale wform = dsp.randchoose(['sine2pi', 'tri', 'vary', 'square']) timescale = pc.get(17, low=1, high=4, default=1) #timescale = dsp.rand(1, 4) lengthscale = pc.get(18, low=0.125, high=2.5) #lengthscale = dsp.rand(0.125, 2.5) amp = pc.get(0, low=0, high=0.5, default=0.5) #amp = dsp.rand(0, 0.5) if area == 'high': low = dsp.rand(low * 0.9, low) high = dsp.rand(high, high * 1.1) length = dsp.stf(dsp.rand(0.01, 0.3) * lengthscale) out = dsp.bln(length, low, high, wform) out = dsp.env(out, 'phasor') if dsp.rand() > 10.5: beep = dsp.tone(dsp.flen(out), high * 2, amp=dsp.rand(0.5, 1)) out = dsp.mix([out, beep]) out = dsp.pad(out, 0, dsp.mstf(dsp.rand(1, 400) * timescale)) out = out * dsp.randint(1, 3) out = dsp.drift(out, dsp.rand(0, 1)) elif area == 'mid': low = dsp.rand(low * 0.9, low) high = dsp.rand(high, high * 1.1) length = dsp.stf(dsp.rand(0.01, 0.5) * lengthscale) out = dsp.bln(length, low, high, wform) out = dsp.env(out, 'random') if timescale > 1: out = dsp.pad(out, 0, dsp.mstf(500 * timescale * dsp.rand(0.5, 1.5))) elif area == 'pitch': low = dsp.rand(low * 0.9, low) high = dsp.rand(high, high * 1.1) length = dsp.stf(dsp.rand(0.01, 0.5) * lengthscale) out = dsp.bln(length, low, high, wform) out = dsp.env(out, 'random') if timescale > 1: out = dsp.pad(out, 0, dsp.mstf(500 * timescale * dsp.rand(0.5, 1.5))) elif area == 'low': low = dsp.rand(low * 0.9, low) high = dsp.rand(high, high * 1.1) length = dsp.stf(dsp.rand(0.2, 2) * lengthscale) out = dsp.bln(length, low, high, wform) out = dsp.env(out, 'random') out = dsp.mix([out, dsp.tone(length, low)]) if dsp.rand() > 0.5: beep = dsp.tone(dsp.flen(out), high, amp=dsp.rand(0.015, 0.1), wavetype=dsp.randchoose(['hann', 'impulse', 'square', 'vary', 'sine'])) out = dsp.mix([out, beep]) if timescale > 1: out = dsp.pad(out, 0, dsp.mstf(500 * timescale * dsp.rand(0.5, 1.5))) if dsp.rand() > pc.get(19, low=0, high=1, default=0.75): plength = length * dsp.randint(2, 6) freq = tune.ntf(param.get('key', default='c'), octave=dsp.randint(0, 4)) out = dsp.mix([ dsp.pine(out, plength, freq), dsp.pine(out, plength, freq * 1.25) ]) out = dsp.fill(out, length) out = dsp.pan(out, dsp.rand()) out = dsp.amp(out, amp) return out
for layer in range(numlayers): minlen = 40 lenrange = dsp.rand(300, 500) lengths = dsp.wavetable('hann', numgrains * 2)[:numgrains] lengths = [ dsp.mstf(l * lenrange + minlen) for l in lengths ] pans = dsp.breakpoint([ dsp.rand() for p in range(numgrains / 3)], numgrains) layers += [ (lengths, pans) ] sections += [ layers ] out = '' for section in sections: layers = [] for layer in section: startpoint = dsp.randint(0, dsp.flen(g) - max(layer[0])) grains = '' for l, p in zip(layer[0], layer[1]): grain = dsp.cut(g, startpoint, l) grain = dsp.env(grain, 'phasor') grain = dsp.taper(grain, dsp.mstf(10)) grain = dsp.pan(grain, p) grains += grain layers += [ dsp.env(grains, 'phasor') ] out += dsp.mix(layers) dsp.write(out, 'spiderfall')
wform=dsp.randchoose(['hann', 'sine2pi', 'tri'])) p = dsp.env(p, 'hann') p = dsp.taper(p, 20) p = dsp.amp(p, amp) p = dsp.pan(p, pan) layer += p layers += [layer] freqs = tune.fromdegrees([dsp.randint(1, 9) for _ in range(nlayers)], octave=1, root='a') for i, freq in enumerate(freqs): layers[i] = dsp.pine(layer, dsp.flen(layer) * 10, freq) section = dsp.fill(dsp.mix(layers), sectionlength) plen = dsp.randint(16, 32) pattern = dsp.eu(plen, dsp.randint(4, plen)) pattern = ['x' if h == 1 else '.' for h in pattern] beat = dsp.flen(section) / plen kicks = ctl.makeBeat(pattern, [beat for _ in range(plen)], makeKick) pattern = 'x..' rimshots = ctl.makeBeat(pattern, [dsp.flen(section) / 16 for _ in range(16)], makeRimshot) pattern = ctl.parseBeat('xxxx')
def play(voice_id): bpm = config('bpm') beat = dsp.bpm2frames(bpm) dsl = P(voice_id, 'drum', '["c","k","h"]') dsp.log(dsl) dsl = json.loads(dsl) def hat(beat): length = beat * 4 nbeats = 16 blen = length / nbeats out = '' for b in range(nbeats): h = dsp.transpose(tape1, 9) h = dsp.fill(h, dsp.mstf(dsp.rand(1, 20))) h = dsp.env(h, 'phasor') h = dsp.amp(h, dsp.rand(0, 0.8)) h = dsp.pad(h, 0, blen - dsp.flen(h)) out += h out *= 8 return out def kick(beat): out = drums.sinekick(length=beat, amp=dsp.rand(0.8, 1)) out = dsp.pad(out, 0, beat * dsp.randint(1, 2)) out *= 2 return out def clap1(beat): c = dsp.read('sounds/mikeclap.wav').data c = dsp.transpose(c, dsp.rand(1, 2.5)) c = dsp.fill(c, dsp.mstf(dsp.rand(10, 100))) c = dsp.env(c, 'phasor') c = dsp.amp(c, dsp.rand(1, 3)) c = dsp.pad(c, 0, beat - dsp.flen(c)) blen = beat / dsp.randchoose([1, 2]) c = dsp.pad(c, blen, 0) c *= 4 return c def clap2(beat): nlens = [ beat * 2, beat, beat / 2, ] # length of pattern (in beats) nbeats = dsp.randint(10, 15) # beat lengths (from a set of bpm-derived note lengths defined in the nlens list) blens = [dsp.randchoose(nlens) for b in range(nbeats)] out = '' # synthesize the tones for i in range(nbeats): beat = dsp.transpose(dsp.randchoose([c1, c2]), dsp.rand(0.25, 40.0)) beat = dsp.pad(beat, 0, blens[i] - dsp.flen(beat)) beat = dsp.amp(beat, dsp.rand(1, 4)) # add it to the output out += beat return out all = [] if 'c' in dsl: clapper = dsp.randchoose([clap1, clap2]) all += [clapper(beat)] if 'k' in dsl: all += [kick(beat)] if 'h' in dsl: all += [hat(beat)] out = dsp.mix(all) # out = dsp.vsplit(out, dsp.mstf(dsp.rand(8, 140)), dsp.mstf(500)) # out = dsp.randshuffle(out) # out = ''.join(out) out = dsp.vsplit(out, 10, 1000) out = [dsp.amp(o, dsp.rand(0, 4)) for o in out] out = [dsp.env(o, 'random') for o in out] out = [dsp.transpose(o, dsp.rand(0.25, 1)) for o in out] out = dsp.randshuffle(out) out = ''.join(out) out = dsp.pine(out, int(dsp.flen(out) * dsp.rand(1.5, 4)), dsp.rand(10, 2000), dsp.randint(0, 2), dsp.rand(1, 3), dsp.randint(0, 2), dsp.rand(1, 3)) out = dsp.amp(out, 0.65) glass = dsp.read('sounds/s/glass2.wav').data glass = dsp.vsplit(glass, dsp.mstf(1), dsp.mstf(100)) glass = dsp.randshuffle(glass) # glass = [ dsp.pad(g, 0, dsp.randint(10, 1000)) for g in glass ] # glass = [ dsp.transpose(g, dsp.rand(0.5, 1.5)) * dsp.randint(1, 3) for g in glass ] glass = ''.join(glass) glass = dsp.fill(glass, dsp.flen(out)) out = dsp.mix([out, glass]) return out
def play(ctl): param = ctl.get('param') lpd = ctl.get('midi').get('lpd') scale = [ dsp.randchoose([1, 3, 5, 6, 8]) for s in range(dsp.randint(2, 4)) ] #scale = [ dsp.randchoose([1, 2, 4, 6, 8]) for s in range(dsp.randint(2, 4)) ] freqs = tune.fromdegrees(scale, root='a', octave=dsp.randint(2,3), scale=tune.minor) freq = dsp.randchoose(freqs) pw = lpd.get(2, low=0.01, high=1, default=1) pw = dsp.rand(0.01, 1) modr = lpd.get(6, low=0.001, high=0.1) modr = dsp.rand(0.001, 0.05) #modr = dsp.rand(0.1, 10.5) #modr = dsp.rand(0.001, 0.01) modr = dsp.rand(0, modr) modf = dsp.rand(0.01, 0.05) amp = lpd.get(1, low=0, high=2, default=0) #amp = dsp.rand(0.1, 0.5) #amp = 0 length = dsp.stf(lpd.get(5, low=0.5, high=14, default=1) * dsp.rand(0.75, 2)) length = dsp.stf(dsp.rand(5.5, 24) * dsp.rand(0.75, 2)) #length = dsp.stf(dsp.rand(0.5, 0.75) * dsp.rand(0.75, 2)) wf = dsp.breakpoint([0] + [ dsp.rand(-1, 1) for w in range(10) ] + [0], 512) #wf = dsp.wavetable('sine2pi', 512) #wf = dsp.wavetable('sine2pi', 512) #win = dsp.wavetable('sine', 512) win = dsp.breakpoint([0] + [ dsp.rand(0, 1) for w in range(5) ] + [0], 512) mod = dsp.breakpoint([0] + [ dsp.rand(0, 1) for m in range(5) ] + [0], 512) layers = [] harmonics = [1, 2, 3, 4] for harmonic in harmonics: f = freq * harmonic if harmonic > 4: a = dsp.rand(0.05, 0.1) else: a = amp * dsp.rand(0.1, 0.5) layer = dsp.pulsar(f, length, pw, wf, win, mod, modr, modf, a * 2) layer = dsp.env(layer, dsp.randchoose(['sine', 'tri', 'line', 'phasor'])) layer = dsp.taper(layer) layer = dsp.pan(layer, dsp.rand()) layer = dsp.mix([ dsp.drift(layer, dsp.rand(0.01, 0.03)), layer ]) if dsp.rand() > 0.5: layer = dsp.vsplit(layer, dsp.mstf(50), dsp.mstf(500)) bit = dsp.randchoose(layer) bit = bit * dsp.randint(1, 3) bit = dsp.transpose(bit, dsp.randchoose([1, 2, 4, 8])) layer = ''.join(layer) layer = dsp.insert_into(layer, bit, dsp.randint(0, dsp.flen(layer) - dsp.flen(bit))) layers += [ layer ] out = dsp.mix(layers) out = dsp.env(out, 'sine') out = dsp.env(out, 'hann') #out = dsp.env(out, 'phasor') out = dsp.taper(out) return out