Signal processing to give real time feedback on music
Rust JavaScript HTML CSS Makefile
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Rusty Microphone


The goal of this project is to create a dashboard for real-time feedback to musicians while they are practicing. This is a personal needs project, and so will at least initially focus only on the trumpet and working on my intonation.

More information on how the project works can be read here.

Live demo

Getting started

Environment Setup

This is a Rust project. The latest version of the Rust compiler and Cargo are available from your system’s package manager, or from

The project depends on two native libraries: GTK and Portaudio. These need to be preinstalled.

On OSX, this can be done with Homebrew using

brew install pkg-config
brew install gtk+3
brew install portaudio

On Ubuntu, you can skip the portaudio install since it can be compiled as part of the build process. You still need to install GTK though, like so:

apt-get install libgtk-3-bin libgtk-3-dev libpango1.0-0

On Fedora

yum install gtk3-devel portaudio-devel

Compiling and running

To compile the project:

cargo build

To compile and run:

cargo run

To compile and run unit tests. Use this as the CI build command if setting up a CI server.

cargo test


This project also supports WebAssembly as a compilation target. To start, you need to install the nightly rust compiler toolchain and wasm32-unknown-unknown target. If you installed Rust using Rustup, then you can do this with

rustup toolchain install nightly
rustup target add wasm32-unknown-unknown --toolchain nightly

You can then compile the project with Make.

make build-web

If you choose not to use Make, you can look in Makefile for the instructions that make build-web is actually an alias for.

After compiling, open target/site/index.html in any modern web browser.

Project structure

File Structure

  • Dependencies are declared in Cargo.toml
  • The project main function for the project executable is in src/ This should only be an entry point. Any actual functionality should be part of the library build.
  • The other files to be included in the build are declared in src/
  • Unit tests are kept in the same files as the units they are testing.
  • The main function will launch the GUI in src/ From here, the GUI can call out to the other parts of the library as required.

General Architectural Guidelines

  • Try to keep functions pure when possible. If not possible, try to isolate the impure parts.
  • Split functionality into files based on their logical separation of concerns. Try to keep mathematical processing separate from presentation logic, so that the processing can be reused independently.

System Requirements

I have tested this project and found it to be working on a Linux system. It should also work under MacOS.

Unfortunately, Windows is not currently supported. If you wish to contribute to adding Windows support, the most useful approach would be to take a look at the open issue in rust-portaudio for supporting Windows in their build script.