Grustnify (from the Russian word "грусть" — sadness) is an audio-processing tool that transforms any audio file into a “sadified” version of itself. The application slows down audio, lowers the pitch, adds spacious reverb, and exports the processed result in the original format (typically WAV).
The project is implemented in C++, using:
- FFmpeg for decoding and encoding
- Qt for UI and application framework
- Custom DSP algorithms for reverb and time-stretching
- GoogleTest for unit testing
- spdlog for logging
Supports common audio formats such as WAV, MP3, FLAC, AAC, etc.
- Reverb (Schroeder reverb architecture: comb filters + allpass filters)
- Slow-down with pitch drop (time stretching resampling)
Currently outputs to WAV (float PCM).
Load → Process → Save workflow.
Audio decoding and processing are unit-tested using generated or stored WAV samples.
The audio is transformed through the following stages:
-
Decode → AudioBuffer The input file is decoded into an interleaved floating-point sample buffer.
-
Reverb A room-like reverb tail is generated using parallel comb filters followed by allpass diffusion.
-
Slowdown (Pitch Down) A simple resampling-based time-stretch algorithm stretches the audio by a factor (e.g. ×1.5).
-
Encode & Save The processed audio is written back as a WAV file, using the same sample rate and channel layout.
Input:
song.mp3
Output:
song_grustnified.wav
A slower, deeper, reverberated version designed to sound melancholic or atmospheric.
- C++20 compiler
- CMake
- FFmpeg development libraries
- Qt 6 (Widgets)
- GoogleTest (automatically fetched or system-installed)
- spdlog
cmake -B build
cmake --build build./build/tests/run_testssrc/
core/
audio_decoder.cpp/hpp
audio_encoder.cpp/hpp
audio_buffer.cpp/hpp
reverb / time-stretch algorithms
app/
app.cpp/hpp
main.cpp
ui/
main_window.cpp/hpp
log/
log.cpp/hpp
tests/
test_audio_decoder.cpp
data/
sine_440.wav
Based on the classic Schroeder reverberator:
- 4 parallel comb filters (≈30–45 ms delays)
- 2 serial allpass filters
- Mix, room-size, and damping parameters
Produces a smooth, diffuse reverb tail.
Simple resampling approach:
[ y(n) = x(n / \text{speed}) ]
Result:
- longer audio
- lower pitch
- more melancholic tone
- MP3/OGG encoding support
- Adjustable effect parameters in the UI
Created as an experimental project to explore FFmpeg, DSP, Qt development, and emotional audio transformation.