1
0
mirror of https://github.com/sjlongland/atinysynth.git synced 2025-09-13 10:03:15 +10:00
Go to file
Stuart Longland f8346cdea9
Add ATTiny861 port.
The ATTiny85, as good as it is, has too few pins to really do a lot.
You can buy I²C GPIO expanders, but many cost more than programming an
ATTiny24A (which has more brains).

The nearest equivalent is the ATTiny861, it is basically the same core
as the ATTiny85, features the same PLL for high-speed PWM, but comes in
a 20-pin package.  They cost ~AU$3 in individual quantities.  (An
ATTiny85 costs AU$1.74, an ATTiny24A costs AU$1.57; thus you save about
20c and a lot of interfacing effort in going to the '861.)

Thus it can interface to 8 individual switches with ease.

The circuit here uses a 74374 D-latch to drive up to 8 LEDs with PWM and
two 4066s to isolate the 8 inputs.  Idea being, when the GPIO_EN signal
is high, the 4066s are turned on and port A sees the 8 GPIO lines on the
other side of the 4066s.

4066s were used because I have 4066s up the wazoo… bought a box of
random ICs off eBay many years ago and it came with 5 (!) tubes of
MM74HC4066s with 25 ICs each (amongst other parts, some hard-to-find).
The bonus being these can be ADC inputs too if desired, allowing sensing
of piezo sensors.

When we want to switch which LEDs are turned on, we bring GPIO_EN low,
switch port A's pins to outputs, assert the desired LEDs, then bring
GPIO_EN high again.  The 74374 latches those pins, and we are free to
put port A back to being inputs.

This happens with each sample from the synthesizer, alternating between
input and output.  Thus the effective rate seen on the LEDs and inputs
is half the sample rate.

A spare GPIO is available for turning on and off an amplifier (I use the
NJR NJM2113D) to save power.

The 74374's nOE pin is connected to the PWM output for the lights, thus
using pull resistors, one is able to use the one PWM channel for all 8
lights.  The lights are turned on in round-robin fashion, so effective
duty cycle is ⅛ and the refresh rate is ~500Hz.
2017-05-20 20:48:19 +10:00
ports Add ATTiny861 port. 2017-05-20 20:48:19 +10:00
.gitignore gensine: Add in sine wave generator. 2017-04-25 17:43:51 +10:00
adsr.c adsr: Add functions for configuring the ADSR. 2017-04-09 08:17:03 +10:00
adsr.h adsr: Add debugging 2017-04-09 10:06:38 +10:00
debug.h debug.h: Add debug helper 2017-04-08 20:26:45 +10:00
gensine.py gensine: Add in sine wave generator. 2017-04-25 17:43:51 +10:00
LICENSE ADSR-based synthesizer for microcontrollers 2017-04-08 18:57:37 +10:00
Makefile Makefile: Make object list configurable. 2017-05-01 17:36:56 +10:00
README.md ADSR-based synthesizer for microcontrollers 2017-04-08 18:57:37 +10:00
synth.h synth: Make enable/mute bits volatile. 2017-04-09 10:17:09 +10:00
voice.h voice: Add test for voice channel done. 2017-04-09 10:07:10 +10:00
waveform.c waveform: Fix logic errors in triangle synthesis 2017-04-09 07:26:16 +10:00
waveform.h waveform: Increase step to 16-bits. 2017-04-09 07:19:04 +10:00

ADSR-based Polyphonic Synthesizer

This project is intended to be a polyphonic synthesizer for use in embedded microcontrollers. It features multi-voice synthesis for multiple channels.

The synthesis is inspired from the highly regarded MOS Technologies 6581 "SID" chip, which supported up to 3 voices each producing either a square wave, triangle wave or sawtooth wave output and hardware attack/decay/sustain/release envelope generation.

This tries to achieve the same thing in software.

Code is presently a work-in-progress.