no anti-alias suit required

[Edit] this blog has moved so if you want to know more about my experiments running audio on the beagleboard, please follow here

After a few experience with the Arduino, I’ve always been looking out for other small devices that would be more powerful and allow me to do custom sound code. The idea was to have simple board I could just connect to a usb midi device, boot and have a ‘hardware’ digital synth ready -Pretty much the same experience as the DMS-20, except smaller and more handy.

As such, the beagleboard has always been very tempting to try but it’s only since Chris Randall’s recent post about the beepcat project that I thought it was time to dive in.

It’s been a few years probably that I had been extracting code from LittleGPTracker in order to build a cross platform synth architecture.
First I just wanted to be able to do small experiments on simple audio building blocks that could spawn into synth parts or other audio goodies but with time, it’s finally evolved into a modular framework where modules can be defined and connected together in various ways.

For example, here’s the code that builds a synth made of two detuned oscillators, fed to a mixer, a filter and an envelope:

MGEPiggyOsc *piggyOsc1=new MGEPiggyOsc(“oscillator”) ;
Insert(piggyOsc1) ;

MGEPiggyOsc *piggyOsc2=new MGEPiggyOsc(“suboscillator”) ;
piggyOsc2->Detune(-24) ;
Insert(piggyOsc2) ;

MGEPiggyFilter *filter = new MGEPiggyFilter(“filter”) ;

MGEMixer *mixer=new MGEMixer(“mixer”,2) ;
Insert(mixer) ;

envelope_ = new MGEAREnvelope(“envelope”) ;
Insert(envelope_) ;

// Init graph
MGraph::Init(params) ;

// Handle graph connections
this->Connect(*mixer->GetInPin(0),*piggyOsc1->GetOutPin()) ;
this->Connect(*mixer->GetInPin(1),*piggyOsc2->GetOutPin()) ;
this->Connect(*filter->GetInPin(),*mixer->GetOutPin()) ;
this->Connect(*envelope_->GetInPin(),*filter->GetOutPin()) ;
SetOutputPin(*envelope_->GetOutPin()) ;
// Hardwired parameter initialisation
mixer->SetParameterValue(“gain1″,0.5f) ;
mixer->SetParameterValue(“gain2″,0.5f) ;
mixer->SetParameterValue(“master”,1.0f) ; piggyOsc1->SetParameterValue(“shape”,0.2f) ;

Of course, this was a prime candidate to be run in the Beagleboard so I dove in, bought one and started the quest of porting the framework to it’s architecture.

It ended up being not too much hassle. Beside the usual setup problems, toolchain woes, cross-compiling issues and library madness it took me only about a few hours (spread over 2 weeks) to get it all running. And yes, it works:

No need to say,I do still have a few issues to fix to get it to works smoothly: For some reason gnome starts pulse audio that prevents me to access ALSA so I have to kill it manually and the MIDI library I’m using relies on alsa_seq which isn’t present under angstrom so I have to find another way to do the connection (/dev/midiX is pumping midi so should be pretty simple) but all in all it’s an excellent startup.

The performances are not too bad either. The process runs at 10% of cpu in idle mode and seems to consume between 3 and 5% of cpu with the two-osc/filter/envelope setup providing for the possibility of 15 voices for a very simple synth. NOT BAD AT ALL !

I haven’t looked yet a the minimum latency I could get out of it in its current form but I’m already very excited about what this will bring.

More to come, certainly !

Midi device in caanoo

by Marc Nostromo

After recompiling the proper ALSA module through the caanoo kernel, it seems finally midi interfaces show up:

Plugging a NanoKontrol

root@wiz:/mnt/sd/ko_s# dmesg

usb 1-1: new full speed USB device using UBI9032 Test HCD and address 2
usb 1-1: configuration #1 chosen from 1 choice
MIDIStreaming version 01.00
EP 82: 1 jack(s)
EP 02: 1 jack(s)
created 1 output and 1 input ports

root@wiz:/mnt/sd/ko_s# cat /proc/asound/*

0 [nanoKONTROL    ]: USB-Audio – nanoKONTROL
KORG INC. nanoKONTROL at usb-ubisys-usb-1, full speed
0: [ 0]   : control
1:        : sequencer
8: [ 0- 0]: raw midi
33:        : timer 0 snd_usb_audio
G0: system timer : 10000.000us (10000000 ticks)
Advanced Linux Sound Architecture Driver Version 1.0.15 (Tue Nov 20 19:16:42 2007 UTC).

Nice !


Rolling down the river

by Marc Nostromo

usb 1-1: new full speed USB device using UBI9032 Test HCD and address 3
usb 1-1: configuration #1 chosen from 1 choice
input,hidraw0: USB HID v1.00 Device [C-Media USB Audio Device   ] on usb-ubisys-usb-1

root@wiz:/mnt/sd/ko_s# more /proc/asound/*

0 [default        ]: USB-Audio – C-Media USB Audio Device
C-Media USB Audio Device    at usb-ubisys-usb-1, full speed
0: [ 0]   : control
16: [ 0- 0]: digital audio playback
24: [ 0- 0]: digital audio capture
33:        : timer
0 snd_usb_audio
00-00: USB Audio : USB Audio : playback 1 : capture 1
G0: system timer : 10000.000us (10000000 ticks)
P0-0-0: PCM playback 0-0-0 : SLAVE
P0-0-1: PCM capture 0-0-1 : SLAVE
Advanced Linux Sound Architecture Driver Version 1.0.15 (Tue Nov 20 19:16:42 2007 UTC).



Having to do a remix where the original track has been recorded live with no sort of click track, I’ve been doing a bit of research on how to do warping across multiple stems in ableton live.

Yesterday I had found this pretty good video summarizing what I knew about selecting multi tracks and applying warp points on all of them at the same time. I was already happy but I had a feeling there had to be a way to first concentrate only on the drum track, do all of the warps and then “‘apply them” to the other stems. It took me a bit of time to understand how but this great summary (points 1-7) made it all obvious.

The beginning is simple:

1- Find a rough tempo of the original song

2- Import the drum track with warp off

3- turn warp on

4- Tune the warp locations to sync your drum track

Here you got your drum track running nicely alongside the song’s metronome… all we need to do is to apply the same warping points to all of the other stems. To do so:

5 Make a copy of the drum track

6 Select the clip containing the copy

7 Drap a new stem into the clip display at the bottom

Bingo, it changed the wave file but none of the warp settings leaving you with a perfectly sync’ed stem ! Repeat.


MidiVox tek

by Marc Nostromo

Since I’ve finally been able to spend some time with the Midivox (and actually make it work), I’ve started to update Colin’s HealerSynth code (originally based on my own Squealer code for the arduino piano) and tweak it to my own purpose.

The first thing I’ve done is to restore my own set of waveforms. They might be a little more ‘odd’ than Colin’s original choice but some of them deliver troumendous digital harshness, just the way I like it.

Being able to control & sequence via MIDI the piggy-derived oscillators is a brand new world for me and it certainly gives me the kick I was expected out of it.

Here’s a little demo loop after 15 minutes of fiddling with Ableton.

[soundcloud width="100%" height="18" params="auto_play=false&player_type=tiny&font=Arial&color=ff7700" url=""]



by Marc Nostromo

I’ve started collecting small stuff I like or feel worthy of being remembered over at tumbl. No specific topic .

While I haven’t been really posting, I’ll keep this place for in depth article and tumblr as notepad/bookmarks.

See you there


by Marc Nostromo

Following Paul Maddox’s blog, and it’s progress on Zira, I’ve discovered there’s a new community web site dedicated to synth lover that opened recently. is not yet populated but might become an awesome resource on synthesis and some awesome personal project.

In itself the web site is highly effective and has a LOT of features, including forums, facebook-type member chat, picture album, sound albums, and so on.

If you’re anything like a synth lover… got an register !