The Easiest Way to Save and Share Code Snippets on the web

Rendering 1 Second of Audio Data

python

posted: Apr, 28th 2010 | jump to bottom

#!/usr/bin/env python
# Copyright (c) 2010 Jacob Joaquin, jacobjoaquin@gmail.com
# Slipmat -- http://slipmat.noisepages.com/
 
import math
import itertools
 
sr = 44100
ksmps = 10    
 
class Mixer:
    '''A simple mixer.'''
 
    def __init__(self, source1, source2):
        self.s1 = source1
        self.s2 = source2
 
    def __iter__(self):
        self.index = 0
        self.iter_1 = (i for i in self.s1)
        self.iter_2 = (i for i in self.s2)
        return self
 
    def next(self): 
        if self.index >= ksmps:
            raise StopIteration
 
        self.index += 1
        return self.iter_1.next() + self.iter_2.next()
 
class Run:
    '''Render frames over time.'''
 
    def __init__(self, dur=1.0):
        self.dur = dur  
 
    def __iter__(self):
        self.index = 0
        return self
 
    def next(self): 
        if self.index >= (self.dur * sr) / ksmps:
            raise StopIteration
 
        self.index += 1
        return self.index
 
class Sine:
    '''A sine wave oscillator.'''
 
    def __init__(self, amp=1.0, freq=440, phase=0.0):
        self.amp = amp
        self.freq = float(freq)
        self.phase = phase
 
    def __iter__(self):
        self.index = 0
        return self
 
    def next(self):
        if self.index >= ksmps:
            raise StopIteration
 
        self.index += 1
        v = math.sin(self.phase * 2 * math.pi)
        self.phase += self.freq / sr
        return v * self.amp
 
if __name__ == "__main__":
    a1 = Sine(0.5, 440)
    a2 = Sine(0.5, 440 * 2 ** (7 / 12.0))
    amix = Mixer(a1, a2)
 
    for frame in Run(1.0):
        print frame, ':'
        for sample in amix:
            print '\t', sample
 
172 views