Bachelor Thesis
This page tracks my bachelor's thesis work on the theme - composition and reconstruction of music with the help of an evolutionary algorithm.
The Goal
The Goal is to study the creativity limits of AI in the field of music using evolutionary algorithms.
Rationale
Evolutionary Algorithms were selected because we believe they are the closest to the approach humans take during the creative process - iterative refinement, experiments, selection, feature spreading, etc.
The ultimate challenge, as with any problem to be solved with EA, is to find the fitness function. Depending on the goal (reconstruction vs. creation), this function must drive the process toward a state that is highly desirable based on human rating. That is to say, the process itself is not governed by humans and happens to be fully automatic. That is because EA allows for looking through a broad space of solutions, and having a human critique in the middle makes less sense.
Most works dealing with generative audio either generate standard musical notation or directly produce sound waves. While generating notation allows for easy algorithmic refinement, its expressiveness is highly limited. Conversely, direct soundwave production is incredibly expressive, but it is severely limited in how it can be analyzed, modified, and refined.
Approach
The approach taken is to move away from implementing EA by hand and concentrate on fitness function design - for that, we use a framework for EA programming - deap. Furthermore, we designed a custom notation system inspired by analog hardware synthesis. The notation is encoded as a graph where each node acts as an oscillation processing unit. This structure bridges the gap between expressiveness and ease of algorithmic manipulation. To render the audio, we utilize SuperCollider.
Tech Stack
- Python: The core programming language used to build the application and manage the experimental logic.
- DEAP: Distributed Evolutionary Algorithms in Python, the framework used for rapid prototyping and execution of our evolutionary algorithms.
- SuperCollider: The audio synthesis engine used to process our custom graph notation and render the oscillation nodes into sound.
Source Code & Experiments
The project is structured as a centralized Python application. It contains the shared core logic, such as the graph-based notation encoding and the SuperCollider integration, alongside a suite of one-off scripts representing the various evolutionary experiments done during this research.
You can explore the source code, track the progress, and view the experiment scripts here: view the project repository