def violin_filter(sig, length, freq): sigs=[] bodies = violinIRs for body in bodies: sigs.append(convolve(+sig,+body)) sig = sf.Mix( sf.FixSize(sf.Clean(sf.Mix(sigs))), sig ) if length > 250: # TODO feels a bit crushed - more stages? vibStart = length*0.5 if length>600 else vibAbove*0.75 vibMiddle = length*0.75 if length>600 else vibAbove vibAmount = 0.5 if length > 1000 else 0.25 trueLen = sf.Length(+sig) l = trueLen env = sf.NumericShape((0, 0), (vibStart, 0), (vibMiddle, 1), (length, 0.75), (l, 0)) env = sf.NumericVolume(env, vibAmount) trem = sf.SineWave(l,2.0 + random.random()) trem = sf.Multiply(env, trem) vib = +trem trem = sf.DirectMix(1, sf.Pcnt50(trem)) sig = sf.Multiply(trem, sig) vib = sf.DirectMix(1, sf.NumericVolume(vib, 0.01)) sig = sf.Resample(vib, sig) return sf.FixSize(sf.Clean(sig))
def violin_filter(sig, freq): with SFMemoryZone(): length = sf.Length(sig) sigs = [] bodies = violinIRs for body in bodies: sigs.append(convolve(+sig, +body)) sig = sf.Mix(sf.FixSize(sf.Clean(sf.Mix(sigs))), sig) vibAbove = 250 if length > vibAbove: # TODO feels a bit crushed - more stages? vibStart = length * 0.5 if length > 600 else vibAbove * 0.75 vibMiddle = length * 0.75 if length > 600 else vibAbove vibAmount = 0.5 if length > 1000 else 0.25 trueLen = sf.Length(+sig) l = trueLen env = sf.LinearShape((0, 0), (vibStart, 0), (vibMiddle, 1), (length, 0.75), (l, 0)) env = sf.LinearVolume(env, vibAmount) trem = sf.SineWave(l, 2.0 + random.random()) trem = sf.Multiply(env, trem) vib = +trem trem = sf.DirectMix(1, sf.Pcnt50(trem)) sig = sf.Multiply(trem, sig) vib = sf.DirectMix(1, sf.LinearVolume(vib, 0.01)) sig = sf.Resample(vib, sig) return sf.FixSize(sf.Clean(sig)).keep()
def echo_division(sig_): sig = sig_ m1 = sf.Magnitude(sig) if m1 == 0.0: return sig length = sf.Length(sig) convol = sf.ReadFile("temp/impulses/swell.wav")[0] sigW = None if sf.Length(sig) > sf.Length(convol) * 2.0: sigW = reverberate(sig, convol) else: sigW = convolve(sig, convol) sig = realise(sig, sigW) m2 = sf.Magnitude(sig) sig = realise(sf.LinearVolume(sig, m1 / m2)) return sig
def echo_division(sig_): sig = sig_ m1=sf.Magnitude(sig) if m1 == 0.0: return sig length=sf.Length(sig) convol=sf.ReadFile("temp/impulses/swell.wav")[0] sigW = None if sf.Length(sig) > sf.Length(convol) * 2.0: sigW = reverberate(sig, convol) else: sigW = convolve(sig, convol) sig = realise(sig, sigW) m2 = sf.Magnitude(sig) sig = realise(sf.LinearVolume(sig, m1/m2)) return sig
def tremolate(sig_, rate, mag): sig = sig_ m1 = sf.Magnitude(sig) if m1 == 0.0: return sig length=sf.Length(sig) ev=sf.LinearVolume(sf.MakeTriangle(sf.PhasedSineWave(length+64, rate, random.random())), mag) ev=sf.Cut(0, length, ev) fv=sf.Pcnt2(ev) ev=sf.DirectMix(1.0, ev) sig=sf.FrequencyModulate(sig, fv) sig=sf.Multiply(ev, sig) convol=sf.ReadFile("temp/impulses/swell.wav")[0] sigW = None if sf.Length(sig) > sf.Length(convol) * 2.0: sigW = reverberate(sig, convol) else: sigW = convolve(sig, convol) sig=mix(sig, sigW) m2=sf.Magnitude(sig) sig=realise(sf.LinearVolume(sig, m1/m2)) return sig
def tremolate(sig_, rate, mag): sig = sig_ m1 = sf.Magnitude(sig) if m1 == 0.0: return sig length = sf.Length(sig) ev = sf.LinearVolume( sf.MakeTriangle(sf.PhasedSineWave(length + 64, rate, random.random())), mag) ev = sf.Cut(0, length, ev) fv = sf.Pcnt2(ev) ev = sf.DirectMix(1.0, ev) sig = sf.FrequencyModulate(sig, fv) sig = sf.Multiply(ev, sig) convol = sf.ReadFile("temp/impulses/swell.wav")[0] sigW = None if sf.Length(sig) > sf.Length(convol) * 2.0: sigW = reverberate(sig, convol) else: sigW = convolve(sig, convol) sig = mix(sig, sigW) m2 = sf.Magnitude(sig) sig = realise(sf.LinearVolume(sig, m1 / m2)) return sig
def sing( hint, pitch, lengthIn, v, vl, vr, voice, velocity_correct_, quick_factor, sub_bass, flat_env, pure, raw_bass, decay, bend, mellow, smooth, slope, ): if pitch > 20000: raise ValueError('Pitch too great {0}'.format(pitch)) with SFMemoryZone(): velocity_correct=velocity_correct_ length=lengthIn tp=0 # minimum play time if length<192: length=192 tp=0 elif length<363: length+=128 tp=1 elif length<512: length+=256 tp=2 elif length<1024: length+=128 tp=3 else: tp=4 sig=[] if pure: x=1 else: if pitch<330: x=5 elif pitch<880: x=6 else: x=3 for x in range(0,x): vc=voice(length,pitch*(1.0+random.random()*0.005)) if quick_factor: vc=sf.Multiply( linearEnv( vc, [ (0,0), (24,1), (sf.Length(vc)-24,1), (sf.Length(vc),0) ] ), vc ) sig.append( sf.LinearVolume( sf.Concatenate( sf.Silence(24*random.random()), vc ) ,random.random()+0.25 ) ) else: sig.append(sf.LinearVolume(vc, random.random()+0.25)) sig = sf.FixSize(sf.Mix(sig)) length=sf.Length(sig) if decay: # -60 db at 1 minute dbs=-60.0*float(length)/float(decay) env=sf.ExponentialShape((0,0),(length,dbs)) sig=sf.Multiply(sig,env) pHint = hint[0] nHint = hint[1] shine = False env = None if quick_factor: if tp==0: if pHint=="T": q=32 else: q=64 if nHint=="T": p=32 else: p=64 q*=quick_factor env=linearEnv(sig,[(0,0),(q,1),(192-p,0.5),(length,0)]) if hint=="TT": velocity_correct*=0.8 elif hint=="NN" and pitch>660: shine=True velocity_correct*=0.5 elif tp==1 or flat_env: if pHint=="T": q=48 else: q=96 if nHint=="T": p=64 else: p=128 q*=quick_factor env=linearEnv(sig,[(0,0),(q,0.75),(length-p,1.0),(length,0)]) if hint=="TT": velocity_correct*=0.8 if hint=="TT": velocity_correct*=0.8 elif hint=="NN" and pitch>880: shine=True velocity_correct*=0.6 elif tp==2: env=linearEnv(sig,[(0,0),(96*quick_factor,0.75),(length-256,1.0),(length,0)]) elif tp==3: if length<1280: env=linearEnv(sig,[(0,0),(64*quick_factor,0.5),(256,1),(512,0.75),((length-512)/2.0+512,0.5),(length,0)]) else: env=linearEnv(sig,[(0,0),(64*quick_factor,0.5),(256,1),(512,0.75),(length-512,0.75),(length,0)]) else: env=linearEnv(sig,[(0,0),(64*quick_factor,0.25),(512,1),(length/2,0.75),(length,0)]) if bend: mod=sf.LinearShape((0,0.995),(length,1.005)) if env: mod=sf.Mix(mod,sf.LinearVolume(+env,0.01)) # if we have envelope extension then we don't do this as # it get really hard to get the lengths correct and make # sense of what we are trying to do. KISS if sf.Length(+sig)==sf.Length(+mod): sig=sf.FrequencyModulate(sig,mod) sig=sf.FixSize(sig) if mellow: if pitch<256: if sub_bass: if pitch < 128: sig=sf.Mix( granular_reverberate(+sig,ratio=0.501 ,delay=256,density=32,length=256,stretch=1,vol=0.20), granular_reverberate(+sig,ratio=0.2495,delay=256,density=32,length=256,stretch=1,vol=0.10), sig ) elif pitch < 192: sig=sf.Mix( granular_reverberate(+sig,ratio=0.501,delay=256,density=32,length=256,stretch=1,vol=0.25), sig ) else: sig=sf.Mix( granular_reverberate(+sig,ratio=0.501,delay=256,density=32,length=256,stretch=1,vol=0.15), sig ) if raw_bass: sig=sf.BesselLowPass(sig,pitch*8.0,1) else: sig=sf.BesselLowPass(sig,pitch*8.0,2) if pitch<392: sig=sf.BesselLowPass(sig,pitch*6.0,2) elif pitch<512: sig=sf.Mix( sf.BesselLowPass(+sig,pitch*6.0, 2), sf.BesselLowPass( sig,pitch*3.0, 2) ) elif pitch<640: sig=sf.BesselLowPass(sig,pitch*3.5, 2) elif pitch<1280: sig=sf.Mix( sf.BesselLowPass(+sig,pitch*3.5, 2), sf.BesselLowPass( sig,pitch*5.0, 2) ) else: sig=sf.Mix( sf.BesselLowPass(+sig,pitch*5, 2), sf.BesselLowPass( sig,5000, 1) ) if env: sig=sf.Multiply(sig,env) # Aggressively clean up an dc offset or other issue on the tail. sig = sf.RTrim(sig) length = sf.Length(sig) sig = sf.Multiply( sf.LinearShape(((0,1), (length - 10, 1), (length, 0))), sig ) sig=sf.FixSize(sig) if smooth: cnv=sf.WhiteNoise(10240) cnv=sf.ButterworthHighPass(cnv,32,4) if shine: q=640 print "Shine" else: q=256 cnv=sf.Cut(5000,5000+q,cnv) cnv=sf.Multiply(cnv,sf.LinearShape((0,0),(32,1),(q,0))) sigr=convolve(+sig,cnv) length = sf.Length(sigr) env = None if length > 300: env = linearEnv(sigr,[(0,0),(256,1),( length - 20,1.5), (length, 0)]) else: env = linearEnv(sigr,[(0,0),(length / 2.0, 1), (length, 0)]) sigr=sf.Multiply(env, sigr) sig=sf.Mix( sf.Pcnt20(sigr), sf.Pcnt80(sig) ) slopeEnv = sf.ExponentialShape(slope) velocity_correct *= sf.ValueAt(slopeEnv, pitch) print 'VCorrect: {0}'.format(velocity_correct) note = sf.LinearVolume(sf.FixSize(sig), v) notel = sf.LinearVolume(note, vl*velocity_correct).keep() noter = sf.LinearVolume(note, vr*velocity_correct).keep() return notel, noter
def sing( hint, pitch, lengthIn, v, vl, vr, voice, velocity_correct_, quick_factor, sub_bass, flat_env, pure, raw_bass, decay, bend, mellow, smooth, slope, ): if pitch > 20000: raise ValueError('Pitch too great {0}'.format(pitch)) with SFMemoryZone(): velocity_correct = velocity_correct_ length = lengthIn tp = 0 # minimum play time if length < 192: length = 192 tp = 0 elif length < 363: length += 128 tp = 1 elif length < 512: length += 256 tp = 2 elif length < 1024: length += 128 tp = 3 else: tp = 4 sig = [] if pure: x = 1 else: if pitch < 330: x = 5 elif pitch < 880: x = 6 else: x = 3 for x in range(0, x): vc = voice(length, pitch * (1.0 + random.random() * 0.005)) if quick_factor: vc = sf.Multiply( linearEnv(vc, [(0, 0), (24, 1), (sf.Length(vc) - 24, 1), (sf.Length(vc), 0)]), vc) sig.append( sf.LinearVolume( sf.Concatenate(sf.Silence(24 * random.random()), vc), random.random() + 0.25)) else: sig.append(sf.LinearVolume(vc, random.random() + 0.25)) sig = sf.FixSize(sf.Mix(sig)) length = sf.Length(sig) if decay: # -60 db at 1 minute dbs = -60.0 * float(length) / float(decay) env = sf.ExponentialShape((0, 0), (length, dbs)) sig = sf.Multiply(sig, env) pHint = hint[0] nHint = hint[1] shine = False env = None if quick_factor: if tp == 0: if pHint == "T": q = 32 else: q = 64 if nHint == "T": p = 32 else: p = 64 q *= quick_factor env = linearEnv(sig, [(0, 0), (q, 1), (192 - p, 0.5), (length, 0)]) if hint == "TT": velocity_correct *= 0.8 elif hint == "NN" and pitch > 660: shine = True velocity_correct *= 0.5 elif tp == 1 or flat_env: if pHint == "T": q = 48 else: q = 96 if nHint == "T": p = 64 else: p = 128 q *= quick_factor env = linearEnv(sig, [(0, 0), (q, 0.75), (length - p, 1.0), (length, 0)]) if hint == "TT": velocity_correct *= 0.8 if hint == "TT": velocity_correct *= 0.8 elif hint == "NN" and pitch > 880: shine = True velocity_correct *= 0.6 elif tp == 2: env = linearEnv(sig, [(0, 0), (96 * quick_factor, 0.75), (length - 256, 1.0), (length, 0)]) elif tp == 3: if length < 1280: env = linearEnv(sig, [(0, 0), (64 * quick_factor, 0.5), (256, 1), (512, 0.75), ((length - 512) / 2.0 + 512, 0.5), (length, 0)]) else: env = linearEnv(sig, [(0, 0), (64 * quick_factor, 0.5), (256, 1), (512, 0.75), (length - 512, 0.75), (length, 0)]) else: env = linearEnv(sig, [(0, 0), (64 * quick_factor, 0.25), (512, 1), (length / 2, 0.75), (length, 0)]) if bend: mod = sf.LinearShape((0, 0.995), (length, 1.005)) if env: mod = sf.Mix(mod, sf.LinearVolume(+env, 0.01)) # if we have envelope extension then we don't do this as # it get really hard to get the lengths correct and make # sense of what we are trying to do. KISS if sf.Length(+sig) == sf.Length(+mod): sig = sf.FrequencyModulate(sig, mod) sig = sf.FixSize(sig) if mellow: if pitch < 256: if sub_bass: if pitch < 128: sig = sf.Mix( granular_reverberate(+sig, ratio=0.501, delay=256, density=32, length=256, stretch=1, vol=0.20), granular_reverberate(+sig, ratio=0.2495, delay=256, density=32, length=256, stretch=1, vol=0.10), sig) elif pitch < 192: sig = sf.Mix( granular_reverberate(+sig, ratio=0.501, delay=256, density=32, length=256, stretch=1, vol=0.25), sig) else: sig = sf.Mix( granular_reverberate(+sig, ratio=0.501, delay=256, density=32, length=256, stretch=1, vol=0.15), sig) if raw_bass: sig = sf.BesselLowPass(sig, pitch * 8.0, 1) else: sig = sf.BesselLowPass(sig, pitch * 8.0, 2) if pitch < 392: sig = sf.BesselLowPass(sig, pitch * 6.0, 2) elif pitch < 512: sig = sf.Mix(sf.BesselLowPass(+sig, pitch * 6.0, 2), sf.BesselLowPass(sig, pitch * 3.0, 2)) elif pitch < 640: sig = sf.BesselLowPass(sig, pitch * 3.5, 2) elif pitch < 1280: sig = sf.Mix(sf.BesselLowPass(+sig, pitch * 3.5, 2), sf.BesselLowPass(sig, pitch * 5.0, 2)) else: sig = sf.Mix(sf.BesselLowPass(+sig, pitch * 5, 2), sf.BesselLowPass(sig, 5000, 1)) if env: sig = sf.Multiply(sig, env) # Aggressively clean up an dc offset or other issue on the tail. sig = sf.RTrim(sig) length = sf.Length(sig) sig = sf.Multiply( sf.LinearShape(((0, 1), (length - 10, 1), (length, 0))), sig) sig = sf.FixSize(sig) if smooth: cnv = sf.WhiteNoise(10240) cnv = sf.ButterworthHighPass(cnv, 32, 4) if shine: q = 640 print "Shine" else: q = 256 cnv = sf.Cut(5000, 5000 + q, cnv) cnv = sf.Multiply(cnv, sf.LinearShape((0, 0), (32, 1), (q, 0))) sigr = convolve(+sig, cnv) length = sf.Length(sigr) env = None if length > 300: env = linearEnv(sigr, [(0, 0), (256, 1), (length - 20, 1.5), (length, 0)]) else: env = linearEnv(sigr, [(0, 0), (length / 2.0, 1), (length, 0)]) sigr = sf.Multiply(env, sigr) sig = sf.Mix(sf.Pcnt20(sigr), sf.Pcnt80(sig)) slopeEnv = sf.ExponentialShape(slope) velocity_correct *= sf.ValueAt(slopeEnv, pitch) print 'VCorrect: {0}'.format(velocity_correct) note = sf.LinearVolume(sf.FixSize(sig), v) notel = sf.LinearVolume(note, vl * velocity_correct).keep() noter = sf.LinearVolume(note, vr * velocity_correct).keep() return notel, noter
def sing(hint,pitch,lengthIn,v,vl,vr,voice,velocity_correct_,quick_factor, sub_bass,flat_env,pure,raw_bass,decay,bend,mellow): d_log('Playing note:',NOTE_COUNTER.incrementAndGet(),voice) velocity_correct=velocity_correct_ length=lengthIn tp=0 # minimum play time if length<192: length=192 tp=0 elif length<363: length+=128 tp=1 elif length<512: length+=256 tp=2 elif length<1024: length+=128 tp=3 else: tp=4 sig=[] if pure: x=1 else: if pitch<330: x=5 elif pitch<880: x=6 else: x=3 for x in range(0,x): vc=voice(length,pitch*(1.0+random.random()*0.005)) vc=sf.Multiply( safe_env( vc, [ (0,0), (24,1), (sf.Length(+vc)-24,1), (sf.Length(+vc),0) ] ), vc ) sig.append( sf.NumericVolume( sf.Concatenate( sf.Silence(24*random.random()), vc ) ,random.random()+0.25 ) ) sig=sf.Realise(sf.Mix(sig)) sig = sf.FixSize(sig) length=sf.Length(+sig) if decay: # -60 db at 1 minute dbs=-60.0*float(length)/float(decay) env=sf.SimpleShape((0,0),(length,dbs)) sig=sf.Multiply(sig,env) pHint=hint[0] nHint=hint[1] shine=False if quick_factor: if tp==0: if pHint=="T": q=32 else: q=64 if nHint=="T": p=32 else: p=64 q*=quick_factor env=safe_env(sig,[(0,0),(q,1),(192-p,0.5),(length,0)]) if hint=="TT": velocity_correct*=0.8 elif hint=="NN" and pitch>660: shine=True velocity_correct*=0.5 elif tp==1 or flat_env: if pHint=="T": q=48 else: q=96 if nHint=="T": p=64 else: p=128 q*=quick_factor env=safe_env(sig,[(0,0),(q,0.75),(length-p,1.0),(length,0)]) if hint=="TT": velocity_correct*=0.8 if hint=="TT": velocity_correct*=0.8 elif hint=="NN" and pitch>880: shine=True velocity_correct*=0.6 elif tp==2: env=safe_env(sig,[(0,0),(96*quick_factor,0.75),(length-256,1.0),(length,0)]) elif tp==3: if length<1280: env=safe_env(sig,[(0,0),(64*quick_factor,0.5),(256,1),(512,0.75),((length-512)/2.0+512,0.5),(length,0)]) else: env=safe_env(sig,[(0,0),(64*quick_factor,0.5),(256,1),(512,0.75),(length-512,0.75),(length,0)]) else: env=safe_env(sig,[(0,0),(64*quick_factor,0.25),(512,1),(length/2,0.75),(length,0)]) else: env=safe_env(sig,[(0,1),(length,1)]) if bend: mod=sf.NumericShape((0,0.995),(length,1.005)) mod=sf.Mix(mod,sf.NumericVolume(+env,0.01)) # if we have envelope extension then we don't do this as # it get really hard to get the lengths correct and make # sense of what we are trying to do. KISS if sf.Length(+sig)==sf.Length(+mod): sig=sf.FrequencyModulate(sig,mod) else: -mod sig=sf.FixSize(sig) if mellow: if pitch<256: if sub_bass: if pitch < 128: sig=sf.Mix( granular_reverberate(+sig,ratio=0.501 ,delay=256,density=32,length=256,stretch=1,vol=0.20), granular_reverberate(+sig,ratio=0.2495,delay=256,density=32,length=256,stretch=1,vol=0.10), sig ) elif pitch < 192: sig=sf.Mix( granular_reverberate(+sig,ratio=0.501,delay=256,density=32,length=256,stretch=1,vol=0.25), sig ) else: sig=sf.Mix( granular_reverberate(+sig,ratio=0.501,delay=256,density=32,length=256,stretch=1,vol=0.15), sig ) if raw_bass: sig=sf.BesselLowPass(sig,pitch*8.0,1) else: sig=sf.BesselLowPass(sig,pitch*8.0,2) if pitch<392: sig=sf.BesselLowPass(sig,pitch*6.0,2) elif pitch<512: sig=sf.Mix( sf.BesselLowPass(+sig,pitch*6.0, 2), sf.BesselLowPass( sig,pitch*3.0, 2) ) elif pitch<640: sig=sf.BesselLowPass(sig,pitch*3.5, 2) elif pitch<1280: sig=sf.Mix( sf.BesselLowPass(+sig,pitch*3.5, 2), sf.BesselLowPass( sig,pitch*5.0, 2) ) else: sig=sf.Mix( sf.BesselLowPass(+sig,pitch*5, 2), sf.BesselLowPass( sig,5000, 1) ) sig=sf.Multiply(sig,env) sig=sf.FixSize(sig) cnv=sf.WhiteNoise(10240) cnv=sf.ButterworthHighPass(cnv,32,4) if shine: q=640 print "Shine" else: q=256 cnv=sf.Cut(5000,5000+q,cnv) cnv=sf.Multiply(cnv,sf.NumericShape((0,0),(32,1),(q,0))) sigr=convolve(+sig,cnv) sigr=sf.Multiply( safe_env(sigr,[(0,0),(256,1),(sf.Length(+sigr),1.5)]), sigr ) sig=sf.Mix( sf.Pcnt20(sigr), sf.Pcnt80(sig) ) note=sf.NumericVolume(sf.FixSize(sig),v) notel=sf.Realise(sf.NumericVolume(+note,vl*velocity_correct)) noter=sf.Realise(sf.NumericVolume( note,vr*velocity_correct)) return notel,noter
def play_string_clean(a, length, freq, whiteAmount, body): def rsd(): return raw_string(length, freq) signal = 0 if (freq > 500): signal = sf.FixSize(sf.Mix(rsd(), rsd(), rsd())) else: signal = sf.FixSize(sf.Mix(rsd(), rsd())) if not bright: if (freq > 440): signal = sf.ButterworthHighPass(signal, freq * 0.5, 6) signal = sf.ButterworthHighPass(signal, 2000, 1) signal = sf.ButterworthLowPass(signal, 8000, 1) if (freq < 128): signal = sf.ButterworthHighPass(signal, freq * 0.5, 1) signal = sf.ButterworthHighPass(signal, 500, 1) signal = sf.ButterworthLowPass(signal, 2000, 1) else: signal = sf.ButterworthHighPass(signal, freq * 0.5, 3) signal = sf.ButterworthHighPass(signal, 1500, 1) signal = sf.ButterworthLowPass(signal, 4000, 1) signal = sf.ButterworthLowPass(signal, freq * 10.0, 1) signal = sf.Mix(sf.Pcnt25(+signal), sf.Pcnt75(sf.RBJNotch(signal, freq, 0.5))) white = sf.WhiteNoise(length) white = sf.ButterworthHighPass(white, freq * 2.0, 2) white = sf.ButterworthLowPass(white, freq * 6.0, 1) white = sf.FixSize(white) white = sf.Multiply(white, +signal) white = sf.LinearVolume(white, whiteAmount) signal = sf.LinearVolume(signal, 1.0 - whiteAmount) signal = sf.FixSize(sf.Mix(signal, white)) sq = sf.Mix(sf.PhasedSineWave(length, freq * 0.95, random.random()), sf.PhasedSineWave(length, freq * 1.05, random.random())) envb = sf.LinearShape((0, 0.25), (a, 0), (length, 0)) sq = sf.Multiply(envb, sf.FixSize(sq)) enva = sf.LinearShape((0, 0.75), (a, 1), (length, 1)) signal = sf.Multiply(enva, signal) signal = sf.Mix(sq, sf.FixSize(signal)) sigs = [] bodies = [] if body is None: if (freq < 128): bodies = bassIRs elif (freq < 440): bodies = celloIRs else: bodies = violinIRs else: bodies = { 'bass': bassIRs, 'cello': celloIRs, 'violin': violinIRs }[body] if bright: bs = [] for b in bodies: bs.append(sf.Power(b, 1.25)) bodies = bs if freq < 256: signal = sf.Power(signal, 1.5) elif freq < 512: signal = sf.Power(signal, 1.25) elif freq < 1024: signal = sf.Power(signal, 1.15) else: signal = sf.Power(signal, 1.05) env = sf.LinearShape((0, 0), (16, 1), (length - 16, 1), (length, 0)) signal = sf.Multiply(env, signal) for body in bodies: sigs.append(convolve(+signal, +body)) signal = sf.Mix(sf.FixSize(sf.Mix(sigs)), sf.LinearVolume(sf.FixSize(signal), 0.05)) return sf.FixSize(sf.Clean(signal))
def play_string_clean(a,length,freq,whiteAmount,body): def rsd(): return raw_string(length,freq) signal=0 if(freq>500): signal=sf.FixSize(sf.Mix(rsd(),rsd(),rsd())) else: signal=sf.FixSize(sf.Mix(rsd(),rsd())) if not bright: if(freq>440): signal=sf.ButterworthHighPass(signal,freq*0.5,6) signal=sf.ButterworthHighPass(signal,2000,1) signal=sf.ButterworthLowPass(signal,8000,1) if(freq<128): signal=sf.ButterworthHighPass(signal,freq*0.5,1) signal=sf.ButterworthHighPass(signal,500,1) signal=sf.ButterworthLowPass(signal,2000,1) else: signal=sf.ButterworthHighPass(signal,freq*0.5,3) signal=sf.ButterworthHighPass(signal,1500,1) signal=sf.ButterworthLowPass(signal,4000,1) signal=sf.ButterworthLowPass(signal,freq*10.0,1) signal=sf.Mix( sf.Pcnt25(+signal), sf.Pcnt75(sf.RBJNotch(signal,freq,0.5)) ) white=sf.WhiteNoise(length) white=sf.ButterworthHighPass(white,freq*2.0,2) white=sf.ButterworthLowPass(white,freq*6.0,1) white=sf.FixSize(white) white=sf.Multiply(white,+signal) white=sf.LinearVolume(white,whiteAmount) signal=sf.LinearVolume(signal,1.0-whiteAmount) signal=sf.FixSize(sf.Mix(signal,white)) sq=sf.Mix( sf.PhasedSineWave(length,freq*0.95,random.random()), sf.PhasedSineWave(length,freq*1.05,random.random()) ) envb=sf.LinearShape((0,0.25),(a,0),(length,0)) sq=sf.Multiply(envb,sf.FixSize(sq)) enva=sf.LinearShape((0,0.75),(a,1),(length,1)) signal=sf.Multiply(enva,signal) signal=sf.Mix(sq,sf.FixSize(signal)) sigs=[] bodies=[] if body is None: if(freq<128): bodies=bassIRs elif(freq<440): bodies=celloIRs else: bodies=violinIRs else: bodies={ 'bass' : bassIRs, 'cello' : celloIRs, 'violin': violinIRs }[body] if bright: bs=[] for b in bodies: bs.append(sf.Power(b,1.25)) bodies=bs if freq<256: signal=sf.Power(signal,1.5) elif freq<512: signal=sf.Power(signal,1.25) elif freq<1024: signal=sf.Power(signal,1.15) else: signal=sf.Power(signal,1.05) env=sf.LinearShape((0,0),(16,1),(length-16,1),(length,0)) signal=sf.Multiply(env,signal) for body in bodies: sigs.append(convolve(+signal,+body)) signal=sf.Mix( sf.FixSize(sf.Mix(sigs)), sf.LinearVolume(sf.FixSize(signal),0.05) ) return sf.FixSize(sf.Clean(signal))