• Stars
    star
    176
  • Rank 216,987 (Top 5 %)
  • Language
    C++
  • License
    Other
  • Created almost 12 years ago
  • Updated over 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Genesis Digital Audio Workstation

Genesis Digital Audio Workstation

Genesis is a cross-platform digital audio workstation with ambitious goals: peer-to-peer multiplayer editing, complete plugin safety, and a built-in community which shares plugins, projects, and samples.

Genesis aims to make music creation collaborative, global, free, and open source.

Genesis is not ready for serious users yet. If you're excited about the project, follow the development blog or sustain development with financial support.

Status

Core Library (libgenesis)

  • Load and save any format audio file.
  • Multi-threaded audio pipeline working.
  • MIDI Keyboard support.
  • Basic synthesizer plugin. YouTube Demo
  • Basic delay plugin.
  • Resampling and channel remapping plugin.

Examples

  • delay.c - default recording device connected to a delay effect connected to default playback device.
  • synth.c - default midi keyboard connected to a synth connected to default playback device.
  • list_devices.c - list available audio and midi devices and watch for when devices are added or removed.
  • list_supported_formats.c - list available audio import and export formats.
  • normalize_audio.c - open an audio file, normalize it, and export it as a new file.

GUI

  • Display recording and playback devices in a tree view.
  • Browse sample files in a tree widget and hear file previews.
  • Drag audio clips into the track editor.

Screenshots

Contributing

libgenesis is programmed in a tiny subset of C++:

  • No STL.
  • No new or delete.
  • No exceptions or run-time type information.
  • Pass pointers instead of references.
  • No linking against libstdc++.
  • All fields and methods in structs and classes are public.
  • Avoid constructor initialization lists.

Dependencies

Building and Running

mkdir build
cd build
cmake ..
make
./genesis

Running the Tests

make test

Generate Test Coverage Report

sudo apt-get install lcov
make coverage
# view `coverage/index.html` in a browser

Enable Optimizations

When you build, you have 2 choices:

  • Debug: slower, but contains useful information for reporting and fixing bugs. This is the default configuration.
  • Release: generates optimized code, but if the software crashes or misbehaves, it is difficult to troubleshoot.

To build in Release mode:

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
./genesis

Roadmap

  1. playback: sometimes doesn't activate all the audio clip segments
  2. assertion failure / memory corruption when multithreading on?
  3. rendering multiple jobs freezes with multithreading on
  4. UI spacing on render jobs is weirdo
  5. ability to update audio graph without stopping pipeline
  6. make a playback selection
  7. sequencer / piano roll
  8. make sure recording works and is stable
  9. drag samples directly to track editor
  10. audio clip segment: display waveform
  11. audio clip segment: drag to move
  12. right click to delete audio clip segments
  13. drag audio clip: display clip even while drag ongoing
  14. quantization when dragging (hold alt to disable)
  15. resample node needed for audio clip nodes
  16. undo/redo crash

Design

Real-time Safety and Multithreading

Most operating systems do not attempt to make any real-time guarantees. This means that various operations do not guarantee a maximum bound on how long it might take. For example, when you allocate memory, it might be very quick, or the kernel might have to do some memory defragmentation and cache invalidation to make room for your new segment of memory. Writing to a hard drive might cause it to have to warm up and start spinning.

This can be a disaster if one of these non-bounded operations is in the audio rendering pipeline, especially if the latency is low. The buffer of audio going to the sound card might empty before it gets filled up, causing a nasty audio glitch sound known as a "buffer underrun".

In general, all syscalls are suspect when it comes to real-time guarantees. The careful audio programmer will avoid them all.

libgenesis meets this criteria with one exception. libgenesis takes advantage of hardware concurrency by using one worker thread per CPU core to render audio. It carefully uses a lock-free queue data structure to avoid making syscalls, but when there is not enough work to do and some threads are sitting idly by, those threads need to suspend execution until there is work to do.

So if there is more work to be done than worker threads, no syscalls are made. However, if a worker thread has nothing to do and needs to suspend execution, it makes a FUTEX_WAIT syscall, and then is woken up by another worker thread making a FUTEX_WAKE syscall.

Compatibility

libgenesis follows semver. Major version is bumped when API or ABI compatibility is broken. Minor version is bumped when new features are added. Patch version is bumped only for bug fixes. Until 1.0.0 is released no effort is made toward backward compatibility whatsoever.

Genesis Audio Studio has an independent version from libgenesis. Major version is bumped when a project file will no longer generate the same output audio as the previous version. Minor version is bumped when new features are added. Patch version is bumped only for bug fixes. Until 1.0.0 is released no effort is made toward project files being backward compatible to previous versions.

Coordinates

Positions in the audio project are in floating point whole notes. This is to take into account the fact that the tempo and time signature could change at any point in the audio project. You can convert from whole notes to frames by calling a utility function which takes into account tempo and time signature changes.

Project File Format

The first 16 bytes of every Genesis project file are:

ca2f 5ef5 00d8 ef0b 8074 18d0 e40b 7a4f

This uniquely identifies the file as a Genesis project file. The default file extension is .gdaw.

After this contains an ordered list of transactions. A transaction is a set of edits. There are 2 types of edits: put and delete.

A put contains a key and a value, each of which is a variable number of bytes. A delete contains only a key, which is a variable number of bytes.

A transaction looks like this:

Offset | Description
-------+------------
     0 | uint32be crc32 of this transaction, everything excluding this field
     4 | uint32be length of transaction in bytes including this and crc32
     8 | uint32be number of put edits in this transaction
    12 | uint32be number of delete edits in this transaction
    16 | the put edits in this transaction
     - | the delete edits in this transaction

A put edit looks like:

Offset | Description
-------+------------
     0 | uint32be key length in bytes
     4 | uint32be value length in bytes
     8 | key bytes
     - | value bytes

A delete edit looks like:

Offset | Description
-------+------------
     0 | uint32be key length in bytes
     4 | key bytes

That's it. To read the file, apply the transactions in order. To update a file, append a transaction. Periodically "garbage collect" by creating a new project file with a single transaction with all the data, and then atomically rename the new project file over the old one.

License

Genesis is licensed with the General Public License. A full copy of the license text is included in the LICENSE file, but here's a non-normative summary:

As a user you have access to the source code, and if you are willing to compile from source yourself, you can get the software for free.

As a company you may use the source code in your software as long as you publish your software's source code under a free software license.

More Repositories

1

libsoundio

C library for cross-platform real-time audio input and output
C
1,933
star
2

groovebasin

Music player server with a web-based user interface.
JavaScript
1,851
star
3

node-s3-client

high level amazon s3 client for node.js
JavaScript
1,003
star
4

poop

Performance Optimizer Observation Platform
Zig
882
star
5

naught

Zero downtime deployment for your Node.js server using builtin cluster API
JavaScript
793
star
6

jamulator

(unmaintained) recompiling NES roms into native executables
Go
388
star
7

tetris

A simple tetris clone written in zig programming language.
Zig
381
star
8

libgroove

streaming audio processing library
C
290
star
9

HellOS

"hello world" x86 kernel example
Zig
262
star
10

node-diacritics

remove diacritics from strings ("ascii folding") - Node.js module
JavaScript
259
star
11

waveform

simultaneously transcode and generate visuals for an audio file
C
251
star
12

clashos

multiplayer arcade game for bare metal Raspberry Pi 3 B+
Zig
216
star
13

chem

2d canvas-based rapid prototyping game engine
JavaScript
176
star
14

swig-email-templates

Node.js module for rendering emails with swig templates and email-friendly inline CSS using boost.
JavaScript
162
star
15

node-groove

bindings to libgroove - music player backend library
C++
157
star
16

node-mv

Like `fs.rename`, but works across devices, and works with directories. Think of the unix utility `mv`.
JavaScript
155
star
17

ffmpeg

FFmpeg Zig package
C
137
star
18

zig-window

window client library
C++
116
star
19

sdl-zig-demo

SDL2 hello world in zig
Zig
115
star
20

node-waveform

simultaneously transcode audio and generate visuals - Node.js module
C
101
star
21

zig-vulkan-triangle

simple triangle displayed using vulkan, xcb, and zig
Zig
98
star
22

node-s3-cli

command line utility to go along with node s3 module
JavaScript
97
star
23

malcheck

Test your code with malcheck to make sure it handles out of memory conditions correctly.
C
96
star
24

zig-wasi

Minimal WASI interpreter
C
91
star
25

zasm

multi-target assembler and disassembler
Zig
90
star
26

mpd.js

Connect to a music player daemon server, send commands, emit events.
JavaScript
89
star
27

PyDaw

python library to mess with Digital Audio Workstations. FL Studio project files (.flp) supported.
C++
87
star
28

node-flp

FL Studio project file parser for node.js
JavaScript
77
star
29

node-tmx-parser

node.js module to parse and load tiled map editor maps (see mapeditor.org)
JavaScript
71
star
30

node-astar

Generic A* algorithm for node.js
JavaScript
67
star
31

node-sox

(unmaintained) node.js interface to the sox audio utility
JavaScript
61
star
32

zig-async-demo

Comparing concurrent code example programs between other languages and Zig
Zig
55
star
33

mcserve

wraps minecraft server and gives you a web interface
JavaScript
54
star
34

StaticHttpFileServer

Zig module for serving a directory of files from memory via HTTP
Zig
49
star
35

zig-general-purpose-allocator

work-in-progress general purpose allocator intended to be eventually merged into Zig standard library. live streamed development
Zig
46
star
36

autodoc

Zig Documentation Generator
Zig
45
star
37

liblaxjson

C library for parsing JSON config files
C
33
star
38

node-perlin-noise

perlin noise generator for node.js
JavaScript
33
star
39

lua-in-the-browser

using zig to build lua for webassembly
C
32
star
40

node-fd-slicer

safely create multiple ReadStream or WriteStream objects from the same file descriptor
JavaScript
30
star
41

flag2struct

simple CLI tool for converting zig source code using flags-style declarations to packed structs
Zig
29
star
42

rucksack

texture packer and resource bundler
C
28
star
43

mime

zig package for mapping extensions to mime types
Zig
28
star
44

connect-sse

connect middleware for server sent events (EventSource)
JavaScript
27
star
45

PyWaveform

Python library to create an image of a song's waveform
C
26
star
46

zig-stage1

Exploring replacing Zig's stage1 compiler with pure C code that outputs pure C code
C
25
star
47

xml

Tokenize XML
Zig
24
star
48

libavfilter-example

small example of using libavfilter to filter audio
C
23
star
49

node-plan

(unmaintained, deprecated, abandoned) Execute a complicated dependency graph of tasks with smooth progress events.
JavaScript
20
star
50

connect-static

static file server middleware for connect. loads files once at startup and saves gzipped versions in memory
JavaScript
19
star
51

dotfiles

linux yo
Nix
18
star
52

pyedsdk

Python library to control cameras via EDSDK
C
18
star
53

groove-rs

rust bindings to libgroove - streaming audio processing library
Rust
16
star
54

node-pend

dead-simple optimistic async helper in javascript
JavaScript
16
star
55

evo

specification, reference implementation, and examples of Evo, the programming language made for being the DNA of genetic algorithms
Zig
15
star
56

mediablast

(unmaintained, deprecated, abandoned) open source media processing server
JavaScript
14
star
57

purgatory

escape from the circles of hell - 7 hour game jam
JavaScript
14
star
58

browserify-lite

browserify, minus some of the advanced features and heavy dependencies
JavaScript
14
star
59

pillagers

Real time strategy game with space physics
JavaScript
12
star
60

hackerrank

my solutions to hackerrank puzzles
Go
11
star
61

connect-nocache

connect middleware to insert no cache headers
JavaScript
11
star
62

andrewkelley.me

my personal site
HTML
11
star
63

pulseaudio

pulseaudio with the build system replaced by zig
C
11
star
64

SIMD-test

exploring SIMD optimization
C
10
star
65

truthfinder

TruthFinder.org website
Python
10
star
66

mc-bot-server

(unmaintained) server that spins up minecraft bots
JavaScript
9
star
67

zig-mandelbrot-gl

mandelbrot set in zig
Zig
9
star
68

node-yawl

yet another websockets library for Node.js
JavaScript
8
star
69

clashproto

prototyping the game for andrewrk/clashos
Zig
8
star
70

planet-evo

evolution simulation software
C++
8
star
71

advent-of-code

https://adventofcode.com
Zig
8
star
72

node-music-library-index

node module to build a searchable javascript object model given track metadata objects
JavaScript
7
star
73

github-popularity-contest

see who has the most collective stars
JavaScript
7
star
74

node-human-size

tiny node.js module to get human readable file size from byte count
JavaScript
7
star
75

libmp3lame

libmp3lame with the build system replaced by zig
C
7
star
76

node-stream-counter

node.js module to keep track of how many bytes have been written to a stream
JavaScript
7
star
77

mpd

a fork of mpd to add library management, better search, and a sophisticated dynamic playlist
C
7
star
78

boost

Inline CSS into your HTML source
JavaScript
6
star
79

Secure-WordVault

(unmaintained, deprecated, abandoned) Enables you to store sensitive information in a portable manner
C++
6
star
80

dominion

Node.js module and command line program to play Dominion, the card game by Donald X. Vaccarino.
JavaScript
6
star
81

TrenchBowl

simple music player UI to demonstrate libgroove
C++
6
star
82

node-spritesheet

node.js module: given a list of image files, create a spritesheet using cairo
JavaScript
6
star
83

chem-cli

html5 canvas game engine optimized for rapid development - command line interface
JavaScript
5
star
84

face-the-music

indie speed run game jam
JavaScript
5
star
85

ruff

little tool to help my dad quickly find info in a .csv file
C++
5
star
86

gbremote

Groove Basin remote control command line app and Node.js module
JavaScript
5
star
87

planetarius

Ludum Dare 30 Entry. networked multiplayer arcade shooter
JavaScript
5
star
88

archerbot

mineflayer bot that engages you in a gentlemanly duel
JavaScript
5
star
89

holocaust

html5 video game - rebuild society after a nuclear holocaust ravages the world
JavaScript
4
star
90

Camlift-Controller

Controls a Canon camera and operates a motorized lift
Visual Basic
4
star
91

swig-dummy-context

given a swig template, create a dummy context which is useful for template composing tools
JavaScript
4
star
92

node-passthrough-truncate

truncate the last N bytes of a stream - Node.js module
JavaScript
3
star
93

scrabble

Scrabble solving AI
3
star
94

spacefight

vaporware 3D space-dogfighting simulator game
C++
3
star
95

math3d-rs

computer-graphics matrix calculations for dummies like me
Rust
3
star
96

lemming-js

PyWeek #12 entry ported to JavaScript with chem
JavaScript
3
star
97

pypowerusb

Python library to control a PowerUSB
C
3
star
98

opengl-multi-window-test

see if multiple windows in opengl causes a framerate issue
C
3
star
99

disinfecticide

A game about controlling a disease outbreak.
JavaScript
2
star
100

socketio-ssl-test

test whether we can use socket.io with xhr requests securely on an insecure page
JavaScript
2
star