Adafruit_Learning_System_Gu.../Wave_Freq_Generator/generator.py
Dave Astels 584bf5fd3a Increase lowest frequencey and decrease sample rate
This is so it will work on M0 boards
2018-10-17 15:53:54 -04:00

97 lines
2.3 KiB
Python

"""
Outpout generator code for signal generator.
Adafruit invests time and resources providing this open source code.
Please support Adafruit and open source hardware by purchasing
products from Adafruit!
Written by Dave Astels for Adafruit Industries
Copyright (c) 2018 Adafruit Industries
Licensed under the MIT license.
All text above must be included in any redistribution.
"""
import math
import array
import board
import audioio
import shapes
def length(frequency):
return int(32000 / frequency)
class Generator:
sample = None
dac = None
shape = None
frequency = None
def __init__(self):
self.dac = audioio.AudioOut(board.A0)
def reallocate(self, frequency):
self.sample = array.array("h", [0] * length(frequency))
def make_sine(self):
l = len(self.sample)
for i in range(l):
self.sample[i] = min(2 ** 15 - 1, int(math.sin(math.pi * 2 * i / l) * (2 ** 15)))
def make_square(self):
l = len(self.sample)
half_l = l // 2
for i in range(l):
if i < half_l:
self.sample[i] = -1 * ((2 ** 15) - 1)
else:
self.sample[i] = (2 ** 15) - 1
def make_triangle(self):
l = len(self.sample)
half_l = l // 2
s = 0
for i in range(l):
if i <= half_l:
s = int((i / half_l) * (2 ** 16)) - (2 ** 15)
else:
s = int((1 - ((i - half_l) / half_l)) * (2 ** 16)) - (2 ** 15)
self.sample[i] = min(2 ** 15 -1, s)
def make_sawtooth(self):
l = len(self.sample)
for i in range(l):
self.sample[i] = int((i / l) * (2 ** 16)) - (2 ** 15)
def update(self, shape, frequency):
if shape == self.shape and frequency == self.frequency:
return
if frequency != self.frequency:
self.reallocate(frequency)
self.frequency = frequency
self.shape = shape
if shape == shapes.SINE:
self.make_sine()
elif shape == shapes.SQUARE:
self.make_square()
elif shape == shapes.TRIANGLE:
self.make_triangle()
elif shape == shapes.SAWTOOTH:
self.make_sawtooth()
self.dac.stop()
self.dac.play(audioio.RawSample(self.sample, channel_count=1, sample_rate=64000), loop=True)