Multi-Track Music Recording Application — Version 0.1.1
2026-04-13
Musician's Canvas is a multi-track music recording application for desktop PCs. It supports audio recording from microphones and line-in devices, MIDI recording from keyboards and controllers, and mixing all tracks to a single WAV or FLAC file. A companion application, Virtual MIDI Keyboard, provides a software piano keyboard for sending MIDI notes.
Musician's Canvas is designed for ease of use while providing features commonly found in digital audio workstations (DAWs):
Run the musicians_canvas executable from the build directory or your installation
location:
./musicians_canvas
On first launch, the application opens with an empty project. You will need to set a project directory before recording.
On startup, the application applies the saved theme (dark or light) and, if a project
directory was previously used and contains a project.json file, the project is
automatically loaded.
Set the project directory: Enter or browse to a folder in the "Project Location" field at the top of the window. This is where recordings and the project file will be stored.
Add a track: Click the + Add Track button. A new track appears with default settings. If it is the only track in the project and has not been recorded yet, it is automatically armed for recording.
Name the track: Type a name in the text field next to the "Options" button. This name is used as the filename for the recorded audio file.

Just below the menu bar there is a toolbar with quick-access buttons:

The project file (project.json) stores track names, types, MIDI notes, audio file
references, and all project-specific settings. Audio files are stored in the same
directory as project.json and are named after their tracks (e.g., My_Track.flac).
If you close the application with unsaved changes, a confirmation dialog asks whether to save before exiting.
While a project is open, you can drag one or more supported audio files from your file manager (Windows Explorer, macOS Finder, Linux file manager, etc.) directly onto the Musician's Canvas window to add them as new audio tracks.
.wav and .flac. Files in any other format are
silently skipped, and a dialog at the end lists which files were skipped.Bass Line.wav creates an audio track
named "Bass Line".Each track can be configured as either Audio (for microphone/line-in recording) or MIDI (for keyboard/controller recording).
To change the track type:
This opens the Track Configuration dialog where you can select the input source.

Each track row provides the following controls:
When a project has exactly one track and that track has not been recorded yet, it is automatically armed for recording. This applies both when adding the first track to a new project and when opening an existing project that has a single empty track.
The recorded audio is saved as a FLAC file in the project directory, named after the track.
During recording and playback, all interactive controls (track buttons, settings, etc.) are disabled to prevent accidental changes.
Audio tracks have an Effects button directly under Options. It opens the Track effects dialog, where you can build an ordered chain of insert effects for recordings on that track:

You can add Reverb, Chorus, Flanger, Overdrive / distortion, Amp & cabinet (amplifier and speaker modeling: amp type, cabinet, gain, bass/mid/treble, air/presence, and wet/dry mix), and Vibrato (Tremolo).
Vibrato (Tremolo) is the classic Fender-style “Vibrato” found on many amplifiers: an oscillating change in volume over time. Use Speed to set how fast the volume pulses and Intensity (Depth) to set how strong the pulsing is (from subtle shimmer to full chop).
The following screenshots show the Amp & cabinet effect:


Effects are applied to audio when you stop recording—after the normal capture and
sample-rate conversion pipeline—so what you hear from the effect controls matches what gets
baked into the FLAC for that take. The effect configuration is stored in project.json
under that track’s audioEffectChain entry.
Project → Project Settings → Mix Effects lets you build the same kind of ordered effect chain as Track effects (Reverb, Chorus, Flanger, Overdrive / distortion, Amp & cabinet, Vibrato (Tremolo)), but applied to the entire mixed program: when you press Play to hear all enabled tracks together, and when you export with Mix tracks to file (toolbar or Tools menu). The chain is saved in project.json under projectSettings → mixEffectChain.
Project → Project Settings → Aux / Send Bus configures a shared effect chain fed by each track’s Aux send slider (on the track row). The dry mix of all tracks is summed, each track’s post-gain/post-pan signal is scaled by its Aux level and sent through this bus, then the wet aux output is added back to the dry sum before Mix Effects run. Use it for a single shared reverb/delay while keeping per-track insert effects independent.
To reduce harsh digital clipping when processing pushes peaks toward full scale, the effect engine applies a soft limiter to normalized float samples immediately before conversion to 16-bit PCM. The EffectWidget base class documents guardFloatSampleForInt16Pcm() and softLimitFloatSampleForInt16Pcm() for any new real-time code that writes to 16-bit audio.
Each track row includes a compact mixer strip:
Options → Track Configuration also offers Clip trim (non-destructive): Trim start and Trim end skip that many seconds from the beginning and end of the clip for playback, mix, and export without deleting the underlying recording.
MIDI tracks can carry control change (CC) automation stored in the project and in exported .mid files; offline playback and mix use these events when rendering MIDI to audio.
Edit → Undo / Redo (standard shortcuts) apply to mixer and trim changes made on tracks.
Next to the main time display, the Monitor audio while recording checkbox controls whether you hear live input through the project audio output while the transport is recording:
The choice is stored in the project (field monitorWhileRecording in project.json).
Turn monitoring off if you do not want to hear the input in your speakers or headphones
(for example to reduce feedback when using a microphone).
When recording a new track while other enabled tracks already contain audio or MIDI data, Musician's Canvas performs overdub recording: the existing tracks are mixed together and played back in real time while the new track is being recorded. This allows you to hear previously recorded parts while laying down a new one.
The mix of existing tracks is prepared before capture begins, so recording and playback start at approximately the same instant, keeping all tracks synchronized.
Musician's Canvas supports two audio capture backends:
The recording backend can be configured per-project in Project > Project Settings > Audio.
Musician's Canvas records at the audio input device's native sample rate and then automatically converts to the project's configured sample rate using high-quality resampling. This means you can set any project sample rate (e.g., 44100 Hz or 48000 Hz) regardless of the device's native rate. The conversion preserves pitch and duration exactly.
Some audio devices (e.g., USB webcam microphones) are physically mono but are advertised as stereo by the operating system. Musician's Canvas automatically detects this and adjusts the channel count accordingly. If the project is configured for stereo, the mono signal is duplicated to both channels.
MIDI notes are displayed in a piano roll visualization on the track.
Musician's Canvas includes a built-in metronome that can be used during recording to help keep time. Click the metronome button on the button bar (below the menu bar) to open the metronome settings dialog:

The dialog provides:
When the metronome is enabled, it begins ticking once recording actually starts (after the 3-second countdown completes), and stops when recording ends.
Click the Play button to mix and play back all enabled tracks. The button tooltip changes to indicate whether it will play or record based on whether a track is armed. Disabled tracks (unchecked) are excluded from playback.
During playback, audio tracks are decoded from their FLAC files and MIDI tracks are rendered to audio using the built-in FluidSynth synthesizer. All tracks are mixed together and played through the system's audio output device.
Click the Stop button to end playback at any time.
Use Tools > Mix tracks to file (Ctrl+M) to export all enabled tracks to a single audio file. A dialog lets you choose the output path and format:
The mix uses the project's configured sample rate. MIDI tracks are rendered using the configured SoundFont. Per-track gain, pan, mute/solo, aux send, and trim are applied the same way as during playback.
Tools → Export stems to folder writes one WAV file per track (enabled tracks that participate in the mix). Each stem reflects that track’s mixer settings and trim; master Mix Effects on the full program are not applied to individual stems.
Use Settings > Configuration (Ctrl+,) to set global defaults that apply to all projects:

recording_debug.txt in the
project directory. This includes the capture backend, device name, sample rate,
channel count, and timing data. This is disabled by default and is primarily useful
for troubleshooting recording issues.

.sf2 SoundFont file for MIDI synthesis. On Linux, a
system SoundFont may be auto-detected if the fluid-soundfont-gm package is
installed. On Windows and macOS, you must configure the SoundFont path manually.

Use Project > Project Settings (Ctrl+P) to override global defaults for the current
project only. This is useful for projects that need a specific sample rate, SoundFont,
or audio device. Project-specific settings are saved inside the project.json file.


The Mix Effects tab is a scrollable list with the same controls as Track effects (Add effect…, drag ≡ to reorder, ✕ to remove). Processing order is top to bottom on the combined mix of all enabled tracks. These effects run during whole-project playback and when mixing to a single WAV or FLAC file; they are not baked into individual track files on disk. An empty list leaves the mixed signal unchanged aside from the mixer’s own level handling.
Configure the shared aux effect chain (same effect types as track inserts). Each track’s Aux slider on the track row controls how much of that track’s signal is sent through this bus; the wet aux return is summed with the dry mix before Mix Effects are applied.
| Menu Item | Shortcut | Description |
|---|---|---|
| Save Project | Ctrl+S | Save current project to disk |
| Open Project | Ctrl+O | Open an existing project file |
| Close | Ctrl+Q | Quit the application |
| Menu Item | Shortcut | Description |
|---|---|---|
| Project Settings | Ctrl+P | Configure project-specific settings (includes Aux / Send Bus) |
| Tempo map | Edit tempo changes (seconds vs BPM) used for metronome timing hints and MIDI quantization | |
| Add Demo Data to Selected Track | Add sample MIDI notes for demonstration |
| Menu Item | Shortcut | Description |
|---|---|---|
| Configuration | Ctrl+, | Open global application settings |
| Menu Item | Shortcut | Description |
|---|---|---|
| Undo | Ctrl+Z | Undo recent mixer/trim edits on tracks |
| Redo | Ctrl+Shift+Z | Redo |
| Menu Item | Shortcut | Description |
|---|---|---|
| Mix tracks to file | Ctrl+M | Export all enabled tracks to a file |
| Export stems to folder | Write one WAV stem per track (with mixer gain/pan/trim; no master Mix Effects) | |
| Recording options | Punch-in region for audio retakes; loop playback region for whole-project play | |
| Quantize MIDI | Snap MIDI note starts to a grid (all MIDI tracks or armed track only) | |
| Add drum track | D | Add a MIDI drum track and write a .mid groove (see below) |
| Virtual MIDI Keyboard | Launch the companion keyboard app |
| Menu Item | Shortcut | Description |
|---|---|---|
| Manual | Alt+M | Open the PDF user manual in the currently selected language |
| About | Show version and application information |
Tools → Add drum track (shortcut D) creates a new MIDI track intended for percussion: notes are on MIDI channel 10 (General MIDI drums; internally channel index 9). The track is given a default name such as Drums (with a numeric suffix if that name is already taken).
A Standard MIDI File (.mid) is written into the project directory immediately, containing a two-bar 4/4 pattern with kick, snare, and closed hi-hat at a tempo chosen as follows:
Save the project (File → Save Project) so project.json references the new .mid file like any other MIDI track.
Note: BPM detection is a simple onset-autocorrelation helper; it works best on rhythmic material and may pick half/double time on some sources—adjust the metronome and re-add the track, or edit the MIDI file in another tool if needed.
Further reading (external): Audient — How to program realistic MIDI drum tracks, MeldaProduction — MDrummer (see also Melda’s MDrummer overview video), Reddit — generating MIDI drum patterns from audio, the overview paper Automated Music Track Generation (Stanford CS229), and an informal video on playing drum-like MIDI from a keyboard controller.
| Shortcut | Action |
|---|---|
| Ctrl+S | Save project |
| Ctrl+O | Open project |
| Ctrl+Z | Undo (mixer/trim) |
| Ctrl+Shift+Z | Redo |
| Ctrl+M | Mix tracks to file |
| D | Add drum track (Tools menu) |
| Ctrl+P | Project Settings |
| Ctrl+, | Settings / Configuration |
| Alt+M | Open PDF manual (Help) |
| Ctrl+Q / Alt+F4 | Quit |
The Virtual MIDI Keyboard is a companion application (virtual_midi_keyboard) that
provides an on-screen piano keyboard for sending MIDI notes. It can be launched from the
Tools > Virtual MIDI Keyboard menu in the main application, or run independently.

The computer keyboard is mapped to piano keys across two octaves:
Lower octave (starting at the current octave):
| Key | Note |
|---|---|
| Z | C |
| S | C#/Db |
| X | D |
| D | D#/Eb |
| C | E |
| V | F |
| G | F#/Gb |
| B | G |
| H | G#/Ab |
| N | A |
| J | A#/Bb |
| M | B |
Upper octave (one octave higher):
| Key | Note |
|---|---|
| Q | C |
| 2 | C#/Db |
| W | D |
| 3 | D#/Eb |
| E | E |
| R | F |
| 5 | F#/Gb |
| T | G |
| 6 | G#/Ab |
| Y | A |
| 7 | A#/Bb |
| U | B |
| I | C (next octave) |
| 9 | C#/Db |
| O | D |
| 0 | D#/Eb |
| P | E |
Keys light up visually when pressed (white keys turn light blue, black keys darken).
Open the Configuration dialog (Settings > Configuration, Ctrl+,) to set up MIDI and audio devices:

.sf2 SoundFont file for the built-in synthesizer.| Shortcut | Action |
|---|---|
| Ctrl+, | Configuration dialog |
| Ctrl+U | Help / Usage info |
| Ctrl+Q | Close |
.sf2) for playback later.Notes are shown in the piano roll. Use File > Save Project so a .mid file (and project.json) is written in the project folder.
Playback uses the built-in FluidSynth synthesizer with the SoundFont from your settings. Check Settings > Configuration > MIDI (or Project > Project Settings if you override per project): a valid .sf2 path must be set. On Linux a system SoundFont may be found automatically; on Windows and macOS you usually need to browse to a SoundFont file manually.
They are separate programs. Launch Virtual MIDI Keyboard from Tools > Virtual MIDI Keyboard (or run it on its own). To send notes from the on-screen keyboard into Musician's Canvas while recording a MIDI track, your operating system must route the keyboard’s MIDI output to an input port that Musician's Canvas is using—often via a virtual MIDI cable (e.g. loopback driver) or by selecting matching ports in both apps. The apps do not auto-connect to each other.
Settings > Configuration sets global defaults (theme, language, default MIDI/audio devices, SoundFont, etc.) stored in the application’s own settings. Project > Project Settings overrides some of those choices for the current project only and is stored inside project.json. If a field is left at the project default, the global Configuration value is used.
Dropping files is only accepted when a project directory is set, and Musician's Canvas is not playing or recording. Supported types are .wav and .flac; other extensions are skipped and listed in a dialog. Each dropped file becomes a new audio track named from the file’s base name.
Audio recordings are saved in the project directory as <track_name>.flac (with characters like / \ : * ? " < > | turned into underscores). The project file is project.json in the same folder. MIDI tracks are saved as <track_name>.mid when you save the project (alongside note data in project.json).
When you mix or play back, MIDI is synthesized to a temporary WAV internally. If the project path is known, Musician's Canvas also writes a cached FLAC in the project folder named <sanitized_track_name>.flac (same sanitization as other track files). This helps reuse renders; the important rule is that it matches the track name, not an internal ID.
No. Only one track can be armed at a time; that track receives the next recording. You can build a song by recording tracks one after another (overdub plays existing tracks while you record a new one).
No. When enabled, the metronome plays through system audio for your timing only. It is not mixed into the recorded file.
On Windows the main application expects an ASIO driver for reliable low-latency audio. Install a driver such as ASIO4ALL or one from your interface manufacturer if you see startup or audio errors.
When you use the .app bundle, the Virtual MIDI Keyboard executable is copied inside Musician's Canvas.app (under Contents/MacOS/) so you can distribute a single app folder. You can still run it from Tools > Virtual MIDI Keyboard in the menu.
amixer or your desktop's sound settings to check volume levels..sf2 file) is configured in Settings > Configuration > MIDI.fluid-soundfont-gm package
is installed.libpipewire-0.3-dev package is installed (needed
for PipeWire integration with the FluidSynth synthesizer).See the README for complete build instructions for Linux, macOS, and Windows, including all required dependencies.