mirror of
https://github.com/sjlongland/atinysynth.git
synced 2025-11-03 23:09:00 +10:00
I left this out because I thought the idea of modulus and division on a
MCU that lacks a hardware multiplier would be too much for it… and
indeed it was too much with my other project.
Thinking about it this afternoon, I had an idea. If I have 2^N samples,
then the modulus can be optimised to:
```
mod = sample & ((2**n)-1)
```
and the segment can be figured out by:
```
segment = sample >> n
```
The segment is two bits. A function that returns the scaled sine value
for a given scaled angle can be given as:
```
int8_t fp_sine(uint8_t angle) {
uint8_t segment = (angle >> POLY_SINE_SZ_BITS) & 3;
uint8_t offset = angle & ((1 << POLY_SINE_SZ_BITS)-1);
switch (segment) {
case 0:
return _poly_sine[offset];
case 1:
return _poly_sine[
POLY_SINE_SZ - offset];
case 2:
return -_poly_sine[offset];
case 3:
return -_poly_sine[
POLY_SINE_SZ - offset];
}
}
```
… or something like that. If `POLY_SINE_SZ_BITS=6`, then `angle=255`
represents 360°.
|
||
|---|---|---|
| ports | ||
| .gitignore | ||
| adsr.c | ||
| adsr.h | ||
| debug.h | ||
| gensine.py | ||
| LICENSE | ||
| Makefile | ||
| README.md | ||
| synth.h | ||
| voice.h | ||
| waveform.c | ||
| waveform.h | ||
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.