def adder(rate=11025, duration=1, sources=[], amplitude=1): samples = int(duration*rate) data = np.zeros(samples) d_amplitude = get_buffer(samples, amplitude) signals = [get_buffer(samples, source) for source in sources] for i in range(samples): val = 0 for signal in signals: val += signal[i] data[i] = val*d_amplitude[i] return data
def sample_and_hold(rate=11025, duration=1, source=1, trigger=1): samples = int(duration * rate) data = np.zeros(samples) d_source = get_buffer(samples, source) d_trigger = get_buffer(samples, trigger) data[0] = d_source[0] for i in range(1, samples): if d_trigger[i - 1] > 0 and d_trigger[i] <= 0: data[i] = d_source[i] else: data[i] = data[i - 1] return data
def sine_wave(rate=11025, duration=1, frequency=400, amplitude=1, ratio=0.5, offset=0): samples = int(duration*rate) data = np.zeros(samples) t = 0 d_frequency = get_buffer(samples, frequency) d_amplitude = get_buffer(samples, amplitude) d_offset = get_buffer(samples, offset) for i in range(samples): t += d_frequency[i]/rate t %= 1 data[i] = d_offset[i] + d_amplitude[i]*math.sin(t*2*math.pi) return data
def square_wave(rate=11025, duration=1, frequency=400, amplitude=1, ratio=0.5, offset=0): samples = int(duration*rate) data = np.zeros(samples) t = 0 d_frequency = get_buffer(samples, frequency) d_amplitude = get_buffer(samples, amplitude) d_ratio = get_buffer(samples, ratio) d_offset = get_buffer(samples, offset) for i in range(samples): t += d_frequency[i]/rate t %= 1 data[i] = d_offset[i] + d_amplitude[i]*(1 if t < d_ratio[i] else -1) return data
def ramp(rate=11025, duration=1, source=1, start=0, end=1): samples = int(duration*rate) data = np.zeros(samples) d_source = get_buffer(samples, source) for i in range(samples): t = i/samples data[i] = d_source[i]*(start + (end-start)*t) return data
def saw_wave(rate=11025, duration=1, frequency=400, amplitude=1, ratio=0.5, offset=0): samples = int(duration*rate) data = np.zeros(samples) t = 0 d_frequency = get_buffer(samples, frequency) d_amplitude = get_buffer(samples, amplitude) d_ratio = get_buffer(samples, ratio) d_offset = get_buffer(samples, offset) for i in range(samples): t += d_frequency[i]/rate t %= 1 if t < d_ratio[i]: v = -1 + 2*t/d_ratio[i] else: v = 1 - 2*(t-d_ratio[i])/(1-d_ratio[i]) data[i] = d_offset[i] + d_amplitude[i]*v return data
def modulator(rate=11025, duration=1, sources=[]): samples = int(duration*rate) data = np.zeros(samples) signals = [get_buffer(samples, source) for source in sources] for i in range(samples): val = 1 for signal in signals: val *= signal[i] data[i] = val return data
def attack_decay(rate=11025, duration=1, source=1, attack_time=1): samples = int(duration*rate) data = np.zeros(samples) d_source = get_buffer(samples, source) for i in range(samples): t = i/rate if t < attack_time: data[i] = d_source[i]*t / attack_time else: data[i] = d_source[i]*(duration-t)/(duration - attack_time) return data
def sequencer(rate=11025, duration=1, inputs=[]): # Calculate the total number of output samples. This will be *at least* duration*rate, # but may be more if any input signals extend beyond that. samples = int(duration * rate) for source, start in inputs: if is_buffer_signal(source): end = int(start * rate) + get_signal_length(source) if end > samples: samples = end; else: raise TypeError('sequencer sources cannot be constants') data = np.zeros(samples) for source, start in inputs: start_sample = int(start * rate) transfer_samples = get_signal_length(source) signal = get_buffer(transfer_samples, source) for i in range(transfer_samples): data[i + start_sample] += signal[i] return data