# rudiments [![Crates.io](https://img.shields.io/crates/v/rudiments?style=flat-square)](https://crates.io/crates/rudiments) [![Crates.io](https://img.shields.io/crates/d/rudiments?style=flat-square)](https://crates.io/crates/rudiments) [![License](https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square)](https://github.com/jonasrmichel/rudiments/blob/main/LICENSE-APACHE) [![License](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](https://github.com/jonasrmichel/rudiments/blob/main/LICENSE-MIT) *rudiments* is a step-sequencing drum machine that plays rhythm patterns using audio samples. muppets animal, personal use license # Features - 16-step programmable measures. - Configurable per-track amplitude. - Adjustable tempo. - Playback once or on repeat. - Supports several audio file formats: - MP3 - WAV - Vorbis - Flac Playback and audio file decoding are handled by [rodio](https://github.com/RustAudio/rodio). # Usage ```text rudiments 0.1.1 A step-sequencing drum machine USAGE: rudiments [FLAGS] [OPTIONS] --pattern --instrumentation --samples FLAGS: -h, --help Prints help information -r, --repeat Repeat the pattern until stopped -V, --version Prints version information OPTIONS: -i, --instrumentation Path to instrumentation file -p, --pattern Path to pattern file -s, --samples Search path for sample files -t, --tempo Playback tempo [default: 120] ``` ## Inputs rudiments loads a *pattern* file and binds the pattern's tracks to audio files in a *samples* directory per an *instrumentation* file. ### Pattern file (`--pattern`) Each line of a pattern file represents a track. There is no limit to the number of tracks in a pattern. A track contains an instrument name, a 16-step sequence, and an optional amplitude. The instrument name is an identifier and can only appear once per pattern. Each sequence represents a single measure in 4/4 time divided into 16th note steps (`x` for *play* and `-` for *silent*). A track may optionally include an amplitude in the range of [0,1] inclusive. By default, a track plays at full volume. This is an example of a pattern file's contents for a standard 8th note groove with the hi-hat track played at half volume. ```text hi-hat |x-x-|x-x-|x-x-|x-x-| 0.5 snare |----|x---|----|x---| kick |x---|----|x---|----| ``` ### Instrumentation file (`--instrumentation`) An instrumentation file binds the instruments from a pattern file to audio sample files. Each line of an instrumentation file contains an instrument name and an audio file name. Each instrument may only appear once, but a single audio file may be bound to multiple instruments. This is an example of an instrumentation file's contents that binds five instruments to four audio sample files. > Note that `tom.wav` is used for both `tom-1` and `tom-2`. ```text hi-hat hh.wav tom-1 tom.wav tom-2 tom.wav snare snare.wav kick kick.wav ``` ### Samples directory (`--samples`) rudiments will look in the samples directory for the audio files listed in the instrumentation file. ### Tempo (`--tempo`) This adjusts the playback tempo (aka beats per minute). The default playback tempo is 120. # Installation rudiments can be installed with `cargo`. ```bash $ cargo install rudiments ``` # Upcoming features - [ ] Swing - [ ] Reverb - [ ] Record to output audio file - [ ] Pattern composition - [ ] Prevent clipping - [ ] Trigger inputs - [ ] Different time signatures - [ ] Terminal-based UI - [ ] Playback tracking - [ ] Live pattern editing Missing a fun or useful feature? Feel free to submit feature requests and PRs! # Demos :drum: The [`assets`](./assets) directory contains several example patterns as well as audio samples from the [LinnDrum](https://en.wikipedia.org/wiki/LinnDrum) drum machine. ## Standard 8th note groove ```bash $ rudiments \ --pattern ./assets/patterns/standard \ --instrumentation ./assets/instrumentations/linndrum \ --samples ./assets/samples/linndrum \ --repeat ``` ## [Burning Up (Madonna)](https://www.youtube.com/watch?v=pufec0Hps00) ```bash $ rudiments \ --pattern ./assets/patterns/burning-up \ --instrumentation ./assets/instrumentations/linndrum \ --samples ./assets/samples/linndrum \ --tempo 140 \ --repeat ``` ## [Thriller (Michael Jackson)](https://www.youtube.com/watch?v=sOnqjkJTMaA) ```bash $ rudiments \ --pattern ./assets/patterns/thriller \ --instrumentation ./assets/instrumentations/linndrum \ --samples ./assets/samples/linndrum \ --tempo 118 \ --repeat ``` ## [Get a Little (Patrick Cowley)](https://www.youtube.com/watch?v=meZK5GlLy98) ```bash $ rudiments \ --pattern ./assets/patterns/get-a-little \ --instrumentation ./assets/instrumentations/linndrum \ --samples ./assets/samples/linndrum \ --repeat ``` ## [I Wanna Dance With Somebody (Whitney Houston)](https://www.youtube.com/watch?v=eH3giaIzONA) ```bash $ rudiments \ --pattern ./assets/patterns/i-wanna-dance-with-somebody \ --instrumentation ./assets/instrumentations/linndrum \ --samples ./assets/samples/linndrum \ --tempo 118 \ --repeat ``` ## [Tom Sawyer (Rush)](https://www.youtube.com/watch?v=auLBLk4ibAk) ```bash $ rudiments \ --pattern ./assets/patterns/tom-sawyer \ --instrumentation ./assets/instrumentations/linndrum \ --samples ./assets/samples/linndrum \ --tempo 180 ``` ## [Never Gonna Give You Up (Rick Astley)](https://www.youtube.com/watch?v=dQw4w9WgXcQ) ```bash $ rudiments \ --pattern ./assets/patterns/never-gonna-give-you-up \ --instrumentation ./assets/instrumentations/linndrum \ --samples ./assets/samples/linndrum ```