Tonal Functions
These functions use tonaljs to provide helpers for musical operations.
voicing()
Turns chord symbols into voicings. You can use the following control params:
chord: Note, followed by chord symbol, e.g. C Am G7 Bb^7dict: voicing dictionary to use, falls back to default dictionaryanchor: the note that is used to align the chordmode: how the voicing is aligned to the anchorbelow: top note <= anchorduck: top note <= anchor, anchor excludedabove: bottom note >= anchor
offset: whole number that shifts the voicing up or down to the next voicingn: if set, the voicing is played like a scale. Overshooting numbers will be octaved
All of the above controls are optional, except chord.
If you pass a pattern of strings to voicing, they will be interpreted as chords.
n("0 1 2 3").chord("<C Am F G>").voicing()Hereโs an example of how you can play chords and a bassline:
chord("<C^7 A7b13 Dm7 G7>*2")
.dict('ireal').layer(
x=>x.struct("[~ x]*2").voicing()
,
x=>n("0*4").set(x).mode("root:g2").voicing()
.s('sawtooth').cutoff("800:4:2")
)scale(name)
Turns numbers into notes in the scale (zero indexed). Also sets scale for other scale operations, like Pattern#scaleTranspose.
A scale consists of a root note (e.g. c4, c, f#, bb4) followed by semicolon (':') and then a scale type.
The root note defaults to octave 3, if no octave number is given.
- scale (string): Name of scale
n("0 2 4 6 4 2").scale("C:major")n("[0,7] 4 [2,7] 4")
.scale("C:<major minor>/2")
.s("piano")n(rand.range(0,12).segment(8))
.scale("C:ritusen")
.s("piano")transpose(semitones)
Transposes all notes to the given number of semitones:
This method gets really exciting when we use it with a pattern as above.
Instead of numbers, scientific interval notation can be used as well:
scaleTranspose(steps)
Transposes notes inside the scale by the number of steps:
"[-8 [2,4,6]]*2"
.scale('C4 bebop major')
.scaleTranspose("<0 -1 -2 -3 -4 -5 -6 -4>*2")
.note()rootNotes(octave = 2)
Turns chord symbols into root notes of chords in given octave.
Together with layer, struct and voicings, this can be used to create a basic backing track:
"<C^7 A7b13 Dm7 G7>*2".layer(
x => x.voicings('lefthand').struct("[~ x]*2").note(),
x => x.rootNotes(2).note().s('sawtooth').cutoff(800)
)