Goal of this project is to develop a fully open, minimalist hardware/software platform capable of running a powerful audio synthesis engine.
Hardware is making good progress (see pictures for hand-assembled prototype - also, screenshot of current PCB layout); Total BOM cost expected below EUR 10, low enough to stack a whole bunch of those little bricks for a polyphonic system :-)
Firmware will run an object-oriented engine where signals can be routed between a bunch of dynamically allocatable synthesis modules. Or whatever you like.
Key specs:
PCB: 30mm x 30mm, top/btm copper, 6mil litho, 1mm thick (designed in EAGLE and fine-tuned in TopoR)
MCU: NXP LPC1347 (ARM Cortex-M3, 64K flash, 8K RAM, 72MHz)
Codec: Freescale SGTL5000
Connectivity: Audio in, Audio out, MIDI in/out, USB, I2C
Case: 35mm x 35mm x 8 mm, 4 laser-cut layers (1mm, 3mm, 3mm, 1mm)
Contributors wanted! Contact me if you have a background in audio and/or general DSP and embedded programming (C/C++)
Components
1×
NXP LPC1347
ARM Cortex-M3, QFN-32 7x7
1×
Freescale SGTL5000
Audio CODEC, QFN-32 5x5
2×
CUI SJ-3523
Stereo 3.5mm jack, SMT
1×
CUI SJ1-42534
4-pin 2.5mm jack, SMT
1×
USB mini-B connector
Standard SMD type, 4.4mm drll spacing
... DAC is playing digital noise through the modular structure.
// Declare modules
noise_white m1; // Signal generator module (0 inputs, 1 output)
audio_out m2; // Wrapper module for DAC (2 inputs, 0 outputs)
// Connect both DAC inputs 0, 1 (left+right) to output 0 of noise module:
m2.connect_input(0, &m1, 0);
m2.connect_input(1, &m1, 0);
/* ... set up hardware ... */while (1) {
if (refresh) { // Interrupt from I2S interface requests refresh when output buffer is less than half full.
m1.render(); // Produce another buffer full of audio
m2.render();
refresh = false;
}
// Interrupt-driven I2S service routine takes audio data from m2
}
... Module class structure sadly still a bit fragmented. There is a base class, module, from which all other modules are derived. In the long run, I would love to have a self-registration mechanism in place, so new modules can be integrated more easily. Anyone care to give this a try?
Just implemented Antti Huovilainen's 4-pole ladder filter (as described in http://dafx04.na.infn.it/WebProc/Proc/P_061.pdf, basic version without the extra tuning), and it sounds quite nice and smooth. No self-oscillation, though - hope that will come with the tuning. Fixed-point version, with hard saturation instead of tanh(), also operational and sounding good, but will require more tweaking.
Note, this is not tested on the device yet - only on the host system, but using the same basic audio engine in a different build configuration. There likely is a lot of room for improving sound and compute efficiency.
Looking at the PCB layout - what do you think? Stick to square shape and 90deg aligned connectors, or go for something completely odd? :) Panelization fill factor, of course, doesn't get better than for rectangles