예제 #1
0
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
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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
예제 #6
0
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
예제 #7
0
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
예제 #8
0
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
예제 #9
0
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