I wrote a sine oscillator as a Python iterator class. Not the fastest digital oscillator in the world. Though for now, doing prototype work in pure Python will do just fine, even if it means slow render times. In the long run, Slipmat will require a powerhouse of an engine for real-time audio synthesis and DSP, probably written in C. All in good time.
Here’s the script:
#!/usr/bin/env python
import math
import itertools
class Sine:
'''A sine wave oscillator.'''
sr = 44100
ksmps = 10
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 >= self.ksmps:
raise StopIteration
self.index += 1
v = math.sin(self.phase * 2 * math.pi)
self.phase += self.freq / self.sr
return v * self.amp
if __name__ == "__main__":
a1 = Sine(1, 4410, 0.25)
a2 = Sine(0.5, 8820)
amix = (i + j for i, j in itertools.izip(a1, a2))
for i in amix:
print i
Currently, it produces the same sound as a tree falling in the woods with no one around to hear it; It doesn’t write to a DAC or sound file. At least we can still view the results:
1.0 1.28454525252 0.602909620521 -0.602909620521 -1.28454525252 -1.0 -0.333488736227 -0.0151243682287 0.0151243682287 0.333488736227
Near the bottom of the code is a very simple graph, where two sine wave generators (a1 & a2) are patched into a mixer generator (amix), creating a very rudimentary additive synthesizer. The signals aren’t generated until the for-block at the very end. The script only prints one control-block’s worth of data, 10 samples, which coincides with the value of ksmps found in class Sine. The sample rate and control rate is built right into class Sine, and needs to be moved out.
Pingback: Slipmat » Rendering 1 Second of Audio Data