midi_fundsp

Live performance synthesizer library

This crate assembles and integrates code from the midir, midi-msg, and cpal crates to enable the easy creation of live synthesizer software using fundsp for sound synthesis.

Using the crate involves setting up the following: * An input thread to monitor MIDI events * An output thread generating sounds that correspond to those events * A table of fundsp sounds for the output thread to employ * A SegQueue that enables those threads to communicate

Putting these pieces together yields the following introductory example program:

```rust use std::sync::{Arc, Mutex};

use crossbeamqueue::SegQueue; use crossbeamutils::atomic::AtomicCell; use midifundsp::{ io::{getfirstmididevice, startinputthread, startoutputthread}, sounds::options, }; use midir::MidiInput; use read_input::{shortcut::input, InputBuild};

fn main() -> anyhow::Result<()> { let mut midiin = MidiInput::new("midir reading input")?; let inport = getfirstmididevice(&mut midiin)?; let midi_msgs = Arc::new(SegQueue::new()); let quit = Arc::new(AtomicCell::new(false));

start_input_thread(midi_msgs.clone(), midi_in, in_port, quit.clone());
start_output_thread::<10>(midi_msgs, Arc::new(Mutex::new(options())), quit);

input::<String>().msg("Press any key to exit\n").get();
Ok(())

} ```

The first four lines set up: * A handle to the first MIDI input device it finds * A messaging queue to connect the input and output threads * A flag to instruct the threads to quit

The next two lines call start_input_thread() and start_output_thread() to start the corresponding threads. The table of fundsp sounds comes from midi_fundsp::sounds::options(), but a user can easily assemble their own custom table of sounds as well.

Once the threads start, the program continues until the user enters a key, handling any incoming MIDI events as they arrive.

Other example programs show how to send different sounds to the left and right stereo channels and how to change the selection of synthesizer sound and MIDI input device while running.

Notes