gemuPG

A Generative Music Poly* Grid

gif showing gemuPG in action

Abstract

Conventional music software, like Digital Audio Workstations (DAWs) and notation tools, adhere to established rules of traditional Western music composition, which limits creative composition in rhythmic and tonal dimensions. The new open-source music environment gemuPG aims to explore the capabilities of a software-centric approach to music-making that is not bound to traditional approaches. The design focuses on inherent use of polymeters, polyrhythms, and microtonality. The term poly* (pronounced 'poly asterisk' or simply 'poly') is therefore introduced, which groups these concepts together. A grid-based interface rethinks audio tracks as areas on a two-dimensional grid. Generator blocks can be placed within these areas to create virtual instruments through additive synthesis. Sequencer blocks are placed on the sides of the areas to create the respective area's sequence. The length of each area's sequence therefore corresponds to its circumference.

Areas

Areas in gemuPG substitute tracks in conventional DAWs. They can be created by placing the grey area blocks in the grid. Orthogonally adjacent blocks are connected and form a single area. Areas offer settings for changing their amplitude, as well as glissando, attack and release times of the individual notes. Additionally, the subdivision of the area can be set, which allows for easy polyrhythmic music patterns.
gif showing areas being placed along with their settings windows

Sequencers

gif showing sequencer blocks being placed along with their settings windows
Sequencer blocks are placed on the sides of the areas to create the area's sequence. The length of which corresponds to the area circumference, allowing for easy creation of polymeters.
There are four types of sequencer blocks, designed to encourage microtonality. The 'absolute' type sets the current frequency to a set value. The 'relative' block adds or subtracts an offset from the previously set frequency. Sequencer blocks of type 'note' allow for selecting a note from the twelve-tone equal temperament system (mainly for accessibility). Lastly, 'interval' blocks transpose the last frequency by a number of steps in a configurable edo (equal division of the octave) scale.

Generators

Generator blocks create sound through additive synthesis. They can either be placed outside of areas to play continuously or within areas to be triggered by the area's sequence. A selection of simple waveforms is available to choose from. Additionally, WAV files can be loaded, allowing for more complex sound creation. When a generator block is placed within an area, relative frequency and frequency factor values can also be set. Loading a sample furthermore lets the user decide between one-shot or looped playback of the samples.
gif showing generator blocks being placed along with their settings windows

Demo Video

Future Additions

Some planned features are yet to be implemented. Namely, effect blocks, which would affect areas as a whole, parallel sequencer blocks, allowing for chords, and (at least) stereo audio with panning settings for generator blocks. Furthermore, modulator blocks, which could affect variables of up to four adjacent generator, effect, or other modulator blocks would allow for frequency or ring modulation synthesis. Additionally, conditional statements - possibly also implemented in the form of blocks within areas - could toggle other blocks or variables based on various factors, such as the amount of loop iterations passed, the current frequency, or even just based on a random distribution. Lastly, selectable mute groups for areas and generator blocks would allow gemuPG to be used as a versatile live performance instrument.

Compile instructions...

I wrote gemuPG in C++20 using SDL3 and Dear ImGui. It is distributed under the GNU AGPLv3 license and is available on Github: https://github.com/sly-roccoon/gemuPG/releases

git clone https://git.iem.at/aronpetritz/gemupg.git --recurse-submodules
#recurse-submodules is important!!
cd gemupg
mkdir build
cd build
cmake -S .. -B .
make -j$(nproc)

Try it out!

This emscripten build is very experimental... File I/O does not work here and things run very poorly...


I made gemuPG for my bachelor's thesis which can be read here if you're interested. :)
A shorter paper written for the AES Europe 2025 Student Project Expo can be downloaded here.

Contact