Time and Rhythm
Rhythm Patterns
Generate and manipulate rhythmic patterns
A rhythmic pattern is an array of 1
and 0
indicating beats or rests (respectively). They are dimension-less:
import { RhythmPattern } from "tonal";
RhythmPattern.euclid(8, 3); // => [1, 0, 0, 1, 0, 0, 1, 0]
Generate patterns
binary(numbers) ⇒ number[]
Create a rhythm pattern from a number or concatenation of numbers in binary form: first the numbers are converted to binary, and the result is concatenated:
RhythmPattern.binary(13); // => [1, 1, 0, 1]
RhythmPattern.binary(12, 13); // => [1, 1, 0, 0, 1, 1, 0, 1]
hex(hexNumber) ⇒ number[]
Create a rhythmic pattern using an hexadecimal numbers. Same as before, but using hexadecimal numbers:
RhythmPattern.hex("8f"); // => [1, 0, 0, 0, 1, 1, 1, 1]
onsets(numbers) ⇒ number[]
Create a rhythm pattern from the onsets. The onsets is the space between beats:
RhythmPattern.onsets(1, 2, 2, 1); // => [1, 0, 1, 0, 0, 1, 0, 0, 1, 0]
random(length, probability, rnd) ⇒ number[]
Create a random rhythm pattern with a specified length
Param | Description |
---|---|
length | length of the pattern |
probability | Threshold where random number is considered a beat (defaults to 0.5) |
rnd | A random function (Math.random by default) |
RhythmPattern.random(4); // => [1, 0, 0, 1]
probability(probabilities, rnd) ⇒ number[]
Create a rhythm pattern based on the given probability thresholds
Param | Description |
---|---|
probabilities | An array with the probability of each step to be a beat |
rnd | A random function (Math.random by default) |
RhythmPattern.probability([0.6, 0, 0.2, 0.5]); // => [0, 0, 0, 1]
euclid(steps, beats) ⇒ number[]
Generates an euclidean rhythm pattern
Param | Description |
---|---|
steps | The length of the pattern |
beats | The number of beats |
RhythmPattern.euclid(8, 3); // => [1, 0, 0, 1, 0, 0, 1, 0]
Manipulate
rotate(pattern, rotations) ⇒ number[]
Rotate a pattern to the right:
Param | Description |
---|---|
pattern | the pattern to rotate |
rotations | the number of steps to rotate |
RhythmPattern.rotate([1, 0, 0, 1], 2); // => [0, 1, 1, 0]