#music #composition #midi #score #midi-file #sheet #track

rust-music

A library for programmatic music manipulation and composition with MIDI export

6 releases

0.1.6 Dec 21, 2023
0.1.5 Dec 21, 2023
0.1.3 Sep 5, 2023

#155 in Audio

32 downloads per month

MIT license

45KB
883 lines

Rust Music   checks_status version

A framework for programmatic music manipulation and composition.

Overview

It provides all the needed types and values to describe or generate complex music pieces, with multiple tracks and instruments, melodic phrases, chords, complex rhythms etc.

The Score type that carries this information can be fully exported as a playable MIDI file.

Usage

Add rust-music to the dependencies in your Cargo.toml.

rust-music = "0.1.6"

Then you can start creating music.

use std::error::Error;
use std::fs::File;
use std::result::Result;

use rust_music::{
    compute_pitch, dynamic::*, rhythm::*, Accidental, Instrument, Note, NoteName, Part, Phrase,
    Score, Tempo,
};

fn main() -> Result<(), Box<dyn Error>> {
    // Create a musical phrase that plays C-E-G (arpeggiated C Major chord)
    // with crotchets, at MezzoForte volume
    let mut phrase_to_repeat = Phrase::new();
    phrase_to_repeat.add_note(Note::new(
        compute_pitch(NoteName::C, Accidental::Natural, 4)?,
        CROTCHET,
        MF,
    )?);
    phrase_to_repeat.add_note(Note::new(
        compute_pitch(NoteName::E, Accidental::Natural, 4)?,
        CROTCHET,
        MF,
    )?);
    phrase_to_repeat.add_note(Note::new(
        compute_pitch(NoteName::G, Accidental::Natural, 4)?,
        CROTCHET,
        MF,
    )?);

    // Create a piano part that plays the phrase from beat 0
    let mut piano_part = Part::new(Instrument::AcousticGrandPiano);
    piano_part.add_phrase(phrase_to_repeat.clone(), 0.);

    // Create a Strings part that plays the phrase from beat 0.5
    // (at the same time as the piano but shifted half a beat)
    let mut violins_part = Part::new(Instrument::StringEnsemble1);
    violins_part.add_phrase(phrase_to_repeat, 0.5);

    // Create a score with a tempo of 60 (one beat per second) and add both parts
    let mut score = Score::new("my score", Tempo::new(60)?, None);
    score.add_part(piano_part);
    score.add_part(violins_part);

    // Write the score to a MIDI file for playback
    score.write_midi_file(File::create("readme_example.mid")?)?;
    Ok(())
}

Listen to the output of this example

More complex examples are available in the examples directory of the rust-music Github repository.

Development Roadmap

  • Write more unit tests and examples
  • Improve and reorganize the crate's API for a less verbose and more idiomatic experience
  • Add a module with composition helpers (scale/chord generators, rhythm building systems, etc.)
  • Write a separate music procedural generation crate?
  • Read from MIDI files?
  • Export to ABC files?

License

rust-music is distributed under the terms of the MIT License.

See LICENSE.txt for details.

Dependencies

~0.4–0.9MB
~20K SLoC