Genesis Digital Audio Workstation

Interesting Commits

2015 Mar 26

commit e17a50a491851c19158b0908102ea81b1c700564
Author: Andrew Kelley <>
Date:   Thu Mar 5 16:34:02 2015 -0700

    RingBuffer implementation

I use mmap to put the same slice of memory in two places so that each write and read from the ring buffer only takes one memcpy.

commit f3581e6989e98b8aeddd66d3ad452ec622a713a9
Author: Andrew Kelley <>
Date:   Sat Mar 7 19:13:58 2015 -0700

    alright C++ you win. gimme dat inheritance

When working on widget user interface code, I realized that I was implementing inheritence without actually using C++'s inheritance features, and it was more error prone than just giving in and depending on libstdc++.

The core backend and the GUI are decoupled. The core backend is in a shared library called libgenesis which does not link against any GUI-related libraries - not even libstdc++.

Meanwhile, the GUI depends on libgenesis and puts a user-interface on top of it.

libgenesis is intended to be a general-purpose utility library for doing digital audio workstation related things, such as using it as the backend for a headless computer-created music stream.

Author: Andrew Kelley <>
Date:   Tue Mar 10 12:45:51 2015 -0700

    32-bit floats in memory instead of 64

I'm still not sure about this one. I've read some conflicting things about whether to use 32-bit float or 64-bit float for audio processing.

I made this commit when I found out that JACK uses exclusively 32-bit floats for audio samples.

commit bdaca9bea4fb046cdb7357da7476cb455ab5d5c1
Author: Andrew Kelley <>
Date:   Tue Mar 10 19:37:00 2015 -0700

    GLFW instead of SDL2

I experienced 2 issues with SDL:

GLFW has a narrower focus and smaller footprint. I hoped that this meant the bug surface area would be smaller.

Sadly, it has the same bugs. However it is under more active development with a faster release schedule, and less bloat in between Genesis and the hardware is nice.

Next I got a list_devices example program working:

$ ./list_devices 
playback device: 44100 Hz GK104 HDMI Audio Controller Digital Stereo (HDMI)
playback device: 44100 Hz Built-in Audio Analog Stereo (default)
recording device: 44100 Hz Monitor of GK104 HDMI Audio Controller Digital Stereo (HDMI)
recording device: 44100 Hz Monitor of Built-in Audio Analog Stereo
recording device: 44100 Hz Built-in Audio Analog Stereo (default)
controller device: Midi Through Port-0 (default)
6 devices found

And a normalize_audio example which reads an audio file of any format, increases the volume as much as possible without clipping, and then saves to any format. This demonstrates the audio import and export capabilities.

$ ./normalize_audio ~/tmp/quiet.ogg ~/tmp/out.flac
Channels: 2 (Stereo)
222208 frames (5.04 seconds)
Amplification factor: 18.638
out codec: FLAC (Free Lossless Audio Codec)
out sample format: signed 24-bit integer
out sample rate: 44100

Previous Post: Vaporware Grand Plans

Next Post: Thread Safe Lock Free Queue Implementation

Genesis on GitHub