Retro-Vibes is a 21K Linux x64 intro. This is my very first demoscene production.

You can download the executable here: Download, Pouet Link

How is it done / How it works

Graphics

It is using OpenGL 3.3 and I’ve used some custom tools to develop it but they are pretty simple using imgui. Also I made a small separate project I called stringifile to process shaders so that I could hot reload them to iterate faster.

In order to create the window I used SDL. This is one of the few external resource exceptions usually allowed on Linux in order to make productions compatible with GTK, Qt, X11 or Wayland.

Everything is modeled and animated using raymarching & SDFs (Signed Distance Fields) which is pretty common on the demoscene. Since this was my first sizecoding experience I settled on just making finished production, so materials are usually pretty basic with just simple lighting and shading. Also there is just a little bit of post processing which could be setup using a simple DAG (directed acyclic graph) on the code. The only effects I used were Barrel / TV distortion, ScanLines, a little bit of Vignette & simple Chromatic aberration.

Sound

Actually I wanted to use something that was done already so that I could focus on the graphics a bit more. Unfortunatelly the only option I found was Tunefish which has a GPL license and I was not ready to show this code mesh xD.

About the synthesizer it is pretty simple:

  • Everything is realtime, nothing is baked
  • It has the usual oscillators (sine, triangle, square, saw and random noise)
  • I also implemented a simple ADSR envelope.
  • Added some biquad filters mainly for low pass filtering

As a DAW(Digital Audio Workstation) I’ve used LMMS:

  • I modeled instruments using the “triple oscillator” which then I manually reproduced in code.
  • I also created the actual song in there
  • Made a small utility to get the midi out of the LMMS project file and into the executable.

Compression

I am just using a shell drop: a shell script which decompressed the rests of the file and starts the actual binary execution. I decided to use lzcat or xz as it gave nice compression ratio, it was pretty fast and it was available by default (package | files | lzcat)