def stretch(snd, length=None, speed=None, grain_size=20): """ Crude granular time stretching and pitch shifting """ original_length = dsp.flen(snd) if speed is not None: snd = dsp.transpose(snd, speed) current_length = dsp.flen(snd) if original_length != current_length or length is not None: grain_size = dsp.mstf(grain_size) numgrains = length / (grain_size / 2) numgrains = numgrains if numgrains > 0 else 1 block_size = current_length / numgrains grains = [] original_position = 0 count = 0 while count <= numgrains: grain = dsp.cut(snd, original_position, grain_size) grains += [ grain ] original_position += block_size count += 1 snd = dsp.cross(grains, dsp.ftms(grain_size / 2)) return snd
def stretch(snd, length=None, speed=None, grain_size=20): """ Crude granular time stretching and pitch shifting """ original_length = dsp.flen(snd) if speed is not None: snd = dsp.transpose(snd, speed) current_length = dsp.flen(snd) if original_length != current_length or length is not None: grain_size = dsp.mstf(grain_size) numgrains = length / (grain_size / 2) numgrains = numgrains if numgrains > 0 else 1 block_size = current_length / numgrains grains = [] original_position = 0 count = 0 while count <= numgrains: grain = dsp.cut(snd, original_position, grain_size) grains += [grain] original_position += block_size count += 1 snd = dsp.cross(grains, dsp.ftms(grain_size / 2)) return snd
def play(args): length = dsp.stf(dsp.rand(5, 10)) volume = 0.2 octave = 2 note = 'd' quality = tune.major reps = dsp.randint(3, 11) glitch = False superglitch = False pulse = False ratios = tune.terry rhodes = dsp.read('sounds/220rhodes.wav').data #scale = [1,3,5,4] scale = [1,5,8,6] for arg in args: a = arg.split(':') if a[0] == 't': length = dsp.stf(float(a[1])) if a[0] == 'v': volume = float(a[1]) / 100.0 if a[0] == 'o': octave = int(a[1]) if a[0] == 'n': note = a[1] if a[0] == 'q': if a[1] == 'M': quality = tune.major elif a[1] == 'm': quality = tune.minor else: quality = tune.major if a[0] == 'r': reps = int(a[1]) if a[0] == 'p': pulse = True if a[0] == 'g': glitch = True if a[0] == 'gg': glitch = True superglitch = True if a[0] == 'tr': if a[1] == 'young': ratios = tune.young elif a[1] == 'terry': ratios = tune.terry if a[0] == 's': scale = [int(s) for s in a[1].split('.')] out = '' for i in range(reps): freq = tune.step(i, note, octave, scale, quality, ratios) diff = freq / 440.0 n = dsp.transpose(rhodes, diff) n = dsp.fill(n, length) o = [dsp.tone(length, freq * i * 0.5) for i in range(4)] o = [dsp.env(oo) for oo in o] o = [dsp.pan(oo, dsp.rand()) for oo in o] o = dsp.mix([dsp.amp(oo, dsp.rand(0.05, 0.1)) for oo in o]) out += dsp.mix([n, o]) if glitch == True: if superglitch == True: mlen = dsp.mstf(100) else: mlen = dsp.flen(out) / 8 out = dsp.vsplit(out, dsp.mstf(1), mlen) out = [dsp.pan(o, dsp.rand()) for o in out] out = ''.join(dsp.randshuffle(out)) if pulse == True: plen = dsp.mstf(dsp.rand(80, 500)) out = dsp.split(out, plen) mpul = len(out) / dsp.randint(4, 8) out = [dsp.env(o) * mpul for i, o in enumerate(out) if i % mpul == 0] opads = dsp.wavetable('sine', len(out), dsp.rand(plen * 0.25, plen)) out = [dsp.pad(o, 0, int(opads[i])) for i, o in enumerate(out)] out = dsp.env(''.join(out)) return dsp.cache(dsp.amp(out, volume))