From e05f74cef1620856d2c13549195e62ec787e51a0 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 13 Jul 2023 10:49:08 +0200 Subject: [PATCH] docs + rename under -> duck, quak quak --- packages/tonal/tonal.mjs | 12 +- packages/tonal/tonleiter.mjs | 4 +- packages/tonal/voicings.mjs | 54 +++- test/__snapshots__/examples.test.mjs.snap | 214 ++++++++++------ test/__snapshots__/tunes.test.mjs.snap | 284 +++++++++++----------- website/src/pages/learn/tonal.mdx | 17 +- website/src/repl/tunes.mjs | 2 +- 7 files changed, 340 insertions(+), 247 deletions(-) diff --git a/packages/tonal/tonal.mjs b/packages/tonal/tonal.mjs index 9ba8ad24..3fd8a5da 100644 --- a/packages/tonal/tonal.mjs +++ b/packages/tonal/tonal.mjs @@ -127,18 +127,18 @@ export const scaleTranspose = register('scaleTranspose', function (offset /* : n * * The root note defaults to octave 3, if no octave number is given. * - * @memberof Pattern * @name scale * @param {string} scale Name of scale * @returns Pattern * @example - * "0 2 4 6 4 2".scale("C2:major").note() + * n("0 2 4 6 4 2").scale("C:major") * @example - * "0 2 4 6 4 2" - * .scale("C2:") - * .note() + * n("[0,7] 4 [2,7] 4") + * .scale("C:/2") + * .s("piano") * @example - * "0 1 2 3 4 5 6 7".rev().scale("C2:").note() + * n(rand.range(0,12).segment(8).round()) + * .scale("C:ritusen") * .s("folkharp") */ diff --git a/packages/tonal/tonleiter.mjs b/packages/tonal/tonleiter.mjs index c337a2b3..d4937b4a 100644 --- a/packages/tonal/tonleiter.mjs +++ b/packages/tonal/tonleiter.mjs @@ -86,7 +86,7 @@ export function scaleStep(notes, offset) { // different ways to resolve the note to compare the anchor to (see renderVoicing) let modeTarget = { below: (v) => v.slice(-1)[0], - under: (v) => v.slice(-1)[0], + duck: (v) => v.slice(-1)[0], above: (v) => v[0], }; @@ -122,7 +122,7 @@ export function renderVoicing({ chord, dictionary, offset = 0, n, mode = 'below' if (n !== undefined) { return [scaleStep(notes, n)]; } - if (mode === 'under') { + if (mode === 'duck') { notes = notes.filter((n) => x2midi(n) !== noteToMidi(anchor)); } return notes; diff --git a/packages/tonal/voicings.mjs b/packages/tonal/voicings.mjs index 87eac740..30d5b3e5 100644 --- a/packages/tonal/voicings.mjs +++ b/packages/tonal/voicings.mjs @@ -50,10 +50,33 @@ const triads = { aug: ['1P 3m 5A', '3m 5A 8P', '5A 8P 10m'], }; +const defaultDictionary = { + // triads + '': ['1P 3M 5P', '3M 5P 8P', '5P 8P 10M'], + M: ['1P 3M 5P', '3M 5P 8P', '5P 8P 10M'], + m: ['1P 3m 5P', '3m 5P 8P', '5P 8P 10m'], + o: ['1P 3m 5d', '3m 5d 8P', '5d 8P 10m'], + aug: ['1P 3m 5A', '3m 5A 8P', '5A 8P 10m'], + // sevenths chords + m7: ['3m 5P 7m 9M', '7m 9M 10m 12P'], + 7: ['3M 6M 7m 9M', '7m 9M 10M 13M'], + '^7': ['3M 5P 7M 9M', '7M 9M 10M 12P'], + 69: ['3M 5P 6A 9M'], + m7b5: ['3m 5d 7m 8P', '7m 8P 10m 12d'], + '7b9': ['3M 6m 7m 9m', '7m 9m 10M 13m'], + '7b13': ['3M 6m 7m 9m', '7m 9m 10M 13m'], + o7: ['1P 3m 5d 6M', '5d 6M 8P 10m'], + '7#11': ['7m 9M 11A 13A'], + '7#9': ['3M 7m 9A'], + mM7: ['3m 5P 7M 9M', '7M 9M 10m 12P'], + m6: ['3m 5P 6M 9M', '6M 9M 10m 12P'], +}; + export const voicingRegistry = { lefthand: { dictionary: lefthand, range: ['F3', 'A4'], mode: 'below', anchor: 'a4' }, triads: { dictionary: triads, mode: 'below', anchor: 'a4' }, guidetones: { dictionary: guidetones, mode: 'above', anchor: 'a4' }, + default: { dictionary: defaultDictionary, mode: 'below', anchor: 'a4' }, }; export const setVoicingRange = (name, range) => addVoicings(name, voicingRegistry[name].dictionary, range); @@ -99,6 +122,7 @@ const getVoicing = (chord, dictionaryName, lastVoicing) => { }; /** + * DEPRECATED: still works, but it is recommended you use .voicing instead (without s). * Turns chord symbols into voicings, using the smoothest voice leading possible. * Uses [chord-voicings package](https://github.com/felixroos/chord-voicings#chord-voicings). * @@ -141,13 +165,35 @@ export const rootNotes = register('rootNotes', function (octave, pat) { }); }); +/** + * Turns chord symbols into voicings. You can use the following control params: + * + * - `chord`: Note, followed by chord symbol, e.g. C Am G7 Bb^7 + * - `dict`: voicing dictionary to use, falls back to default dictionary + * - `anchor`: the note that is used to align the chord + * - `mode`: how the voicing is aligned to the anchor + * - `below`: top note <= anchor + * - `duck`: top note <= anchor, anchor excluded + * - `above`: bottom note >= anchor + * - `offset`: whole number that shifts the voicing up or down to the next voicing + * - `n`: if set, the voicing is played like a scale. Overshooting numbers will be octaved + * + * All of the above controls are optional, except `chord` + * + * @name voicing + * @param {string} dictionary which voicing dictionary to use. + * @returns Pattern + * @example + * chord("").voicing() + * @example + * n("0 1 2 3 4 5 6 7").chord("").voicing() + */ export const voicing = register('voicing', function (pat) { return pat .fmap((value) => { - let { dictionary, ...rest } = value; - if (typeof dictionary === 'string') { - dictionary = voicingRegistry[dictionary]; - } + let { dictionary = 'default', ...rest } = value; + dictionary = + typeof dictionary === 'string' ? voicingRegistry[dictionary] : { dictionary, mode: 'below', anchor: 'c5' }; let notes = renderVoicing({ ...dictionary, ...rest }); return stack(...notes) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 89b50c3c..103e8c36 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -3545,96 +3545,96 @@ exports[`runs examples > example "saw" example index 1 1`] = ` exports[`runs examples > example "scale" example index 0 1`] = ` [ - "[ 0/1 → 1/6 | note:C2 ]", - "[ 1/6 → 1/3 | note:E2 ]", - "[ 1/3 → 1/2 | note:G2 ]", - "[ 1/2 → 2/3 | note:B2 ]", - "[ 2/3 → 5/6 | note:G2 ]", - "[ 5/6 → 1/1 | note:E2 ]", - "[ 1/1 → 7/6 | note:C2 ]", - "[ 7/6 → 4/3 | note:E2 ]", - "[ 4/3 → 3/2 | note:G2 ]", - "[ 3/2 → 5/3 | note:B2 ]", - "[ 5/3 → 11/6 | note:G2 ]", - "[ 11/6 → 2/1 | note:E2 ]", - "[ 2/1 → 13/6 | note:C2 ]", - "[ 13/6 → 7/3 | note:E2 ]", - "[ 7/3 → 5/2 | note:G2 ]", - "[ 5/2 → 8/3 | note:B2 ]", - "[ 8/3 → 17/6 | note:G2 ]", - "[ 17/6 → 3/1 | note:E2 ]", - "[ 3/1 → 19/6 | note:C2 ]", - "[ 19/6 → 10/3 | note:E2 ]", - "[ 10/3 → 7/2 | note:G2 ]", - "[ 7/2 → 11/3 | note:B2 ]", - "[ 11/3 → 23/6 | note:G2 ]", - "[ 23/6 → 4/1 | note:E2 ]", + "[ 0/1 → 1/6 | n:0 note:C3 ]", + "[ 1/6 → 1/3 | n:2 note:E3 ]", + "[ 1/3 → 1/2 | n:4 note:G3 ]", + "[ 1/2 → 2/3 | n:6 note:B3 ]", + "[ 2/3 → 5/6 | n:4 note:G3 ]", + "[ 5/6 → 1/1 | n:2 note:E3 ]", + "[ 1/1 → 7/6 | n:0 note:C3 ]", + "[ 7/6 → 4/3 | n:2 note:E3 ]", + "[ 4/3 → 3/2 | n:4 note:G3 ]", + "[ 3/2 → 5/3 | n:6 note:B3 ]", + "[ 5/3 → 11/6 | n:4 note:G3 ]", + "[ 11/6 → 2/1 | n:2 note:E3 ]", + "[ 2/1 → 13/6 | n:0 note:C3 ]", + "[ 13/6 → 7/3 | n:2 note:E3 ]", + "[ 7/3 → 5/2 | n:4 note:G3 ]", + "[ 5/2 → 8/3 | n:6 note:B3 ]", + "[ 8/3 → 17/6 | n:4 note:G3 ]", + "[ 17/6 → 3/1 | n:2 note:E3 ]", + "[ 3/1 → 19/6 | n:0 note:C3 ]", + "[ 19/6 → 10/3 | n:2 note:E3 ]", + "[ 10/3 → 7/2 | n:4 note:G3 ]", + "[ 7/2 → 11/3 | n:6 note:B3 ]", + "[ 11/3 → 23/6 | n:4 note:G3 ]", + "[ 23/6 → 4/1 | n:2 note:E3 ]", ] `; exports[`runs examples > example "scale" example index 1 1`] = ` [ - "[ 0/1 → 1/6 | note:C2 ]", - "[ 1/6 → 1/3 | note:E2 ]", - "[ 1/3 → 1/2 | note:G2 ]", - "[ 1/2 → 2/3 | note:B2 ]", - "[ 2/3 → 5/6 | note:G2 ]", - "[ 5/6 → 1/1 | note:E2 ]", - "[ 1/1 → 7/6 | note:C2 ]", - "[ 7/6 → 4/3 | note:Eb2 ]", - "[ 4/3 → 3/2 | note:G2 ]", - "[ 3/2 → 5/3 | note:Bb2 ]", - "[ 5/3 → 11/6 | note:G2 ]", - "[ 11/6 → 2/1 | note:Eb2 ]", - "[ 2/1 → 13/6 | note:C2 ]", - "[ 13/6 → 7/3 | note:E2 ]", - "[ 7/3 → 5/2 | note:G2 ]", - "[ 5/2 → 8/3 | note:B2 ]", - "[ 8/3 → 17/6 | note:G2 ]", - "[ 17/6 → 3/1 | note:E2 ]", - "[ 3/1 → 19/6 | note:C2 ]", - "[ 19/6 → 10/3 | note:Eb2 ]", - "[ 10/3 → 7/2 | note:G2 ]", - "[ 7/2 → 11/3 | note:Bb2 ]", - "[ 11/3 → 23/6 | note:G2 ]", - "[ 23/6 → 4/1 | note:Eb2 ]", + "[ 0/1 → 1/4 | n:0 note:C3 s:piano ]", + "[ 0/1 → 1/4 | n:7 note:C4 s:piano ]", + "[ 1/4 → 1/2 | n:4 note:G3 s:piano ]", + "[ 1/2 → 3/4 | n:2 note:E3 s:piano ]", + "[ 1/2 → 3/4 | n:7 note:C4 s:piano ]", + "[ 3/4 → 1/1 | n:4 note:G3 s:piano ]", + "[ 1/1 → 5/4 | n:0 note:C3 s:piano ]", + "[ 1/1 → 5/4 | n:7 note:C4 s:piano ]", + "[ 5/4 → 3/2 | n:4 note:G3 s:piano ]", + "[ 3/2 → 7/4 | n:2 note:E3 s:piano ]", + "[ 3/2 → 7/4 | n:7 note:C4 s:piano ]", + "[ 7/4 → 2/1 | n:4 note:G3 s:piano ]", + "[ 2/1 → 9/4 | n:0 note:C3 s:piano ]", + "[ 2/1 → 9/4 | n:7 note:C4 s:piano ]", + "[ 9/4 → 5/2 | n:4 note:G3 s:piano ]", + "[ 5/2 → 11/4 | n:2 note:Eb3 s:piano ]", + "[ 5/2 → 11/4 | n:7 note:C4 s:piano ]", + "[ 11/4 → 3/1 | n:4 note:G3 s:piano ]", + "[ 3/1 → 13/4 | n:0 note:C3 s:piano ]", + "[ 3/1 → 13/4 | n:7 note:C4 s:piano ]", + "[ 13/4 → 7/2 | n:4 note:G3 s:piano ]", + "[ 7/2 → 15/4 | n:2 note:Eb3 s:piano ]", + "[ 7/2 → 15/4 | n:7 note:C4 s:piano ]", + "[ 15/4 → 4/1 | n:4 note:G3 s:piano ]", ] `; exports[`runs examples > example "scale" example index 2 1`] = ` [ - "[ 0/1 → 1/8 | note:C3 s:folkharp ]", - "[ 1/8 → 1/4 | note:B2 s:folkharp ]", - "[ 1/4 → 3/8 | note:A2 s:folkharp ]", - "[ 3/8 → 1/2 | note:G2 s:folkharp ]", - "[ 1/2 → 5/8 | note:F2 s:folkharp ]", - "[ 5/8 → 3/4 | note:E2 s:folkharp ]", - "[ 3/4 → 7/8 | note:D2 s:folkharp ]", - "[ 7/8 → 1/1 | note:C2 s:folkharp ]", - "[ 1/1 → 9/8 | note:C3 s:folkharp ]", - "[ 9/8 → 5/4 | note:Bb2 s:folkharp ]", - "[ 5/4 → 11/8 | note:Ab2 s:folkharp ]", - "[ 11/8 → 3/2 | note:G2 s:folkharp ]", - "[ 3/2 → 13/8 | note:F2 s:folkharp ]", - "[ 13/8 → 7/4 | note:Eb2 s:folkharp ]", - "[ 7/4 → 15/8 | note:D2 s:folkharp ]", - "[ 15/8 → 2/1 | note:C2 s:folkharp ]", - "[ 2/1 → 17/8 | note:C3 s:folkharp ]", - "[ 17/8 → 9/4 | note:B2 s:folkharp ]", - "[ 9/4 → 19/8 | note:A2 s:folkharp ]", - "[ 19/8 → 5/2 | note:G2 s:folkharp ]", - "[ 5/2 → 21/8 | note:F2 s:folkharp ]", - "[ 21/8 → 11/4 | note:E2 s:folkharp ]", - "[ 11/4 → 23/8 | note:D2 s:folkharp ]", - "[ 23/8 → 3/1 | note:C2 s:folkharp ]", - "[ 3/1 → 25/8 | note:C3 s:folkharp ]", - "[ 25/8 → 13/4 | note:Bb2 s:folkharp ]", - "[ 13/4 → 27/8 | note:Ab2 s:folkharp ]", - "[ 27/8 → 7/2 | note:G2 s:folkharp ]", - "[ 7/2 → 29/8 | note:F2 s:folkharp ]", - "[ 29/8 → 15/4 | note:Eb2 s:folkharp ]", - "[ 15/4 → 31/8 | note:D2 s:folkharp ]", - "[ 31/8 → 4/1 | note:C2 s:folkharp ]", + "[ 0/1 → 1/8 | n:10 note:C5 s:folkharp ]", + "[ 1/8 → 1/4 | n:2 note:F3 s:folkharp ]", + "[ 1/4 → 3/8 | n:7 note:F4 s:folkharp ]", + "[ 3/8 → 1/2 | n:4 note:A3 s:folkharp ]", + "[ 1/2 → 5/8 | n:2 note:F3 s:folkharp ]", + "[ 5/8 → 3/4 | n:5 note:C4 s:folkharp ]", + "[ 3/4 → 7/8 | n:9 note:A4 s:folkharp ]", + "[ 7/8 → 1/1 | n:8 note:G4 s:folkharp ]", + "[ 1/1 → 9/8 | n:7 note:F4 s:folkharp ]", + "[ 9/8 → 5/4 | n:1 note:D3 s:folkharp ]", + "[ 5/4 → 11/8 | n:1 note:D3 s:folkharp ]", + "[ 11/8 → 3/2 | n:6 note:D4 s:folkharp ]", + "[ 3/2 → 13/8 | n:2 note:F3 s:folkharp ]", + "[ 13/8 → 7/4 | n:4 note:A3 s:folkharp ]", + "[ 7/4 → 15/8 | n:6 note:D4 s:folkharp ]", + "[ 15/8 → 2/1 | n:10 note:C5 s:folkharp ]", + "[ 2/1 → 17/8 | n:4 note:A3 s:folkharp ]", + "[ 17/8 → 9/4 | n:0 note:C3 s:folkharp ]", + "[ 9/4 → 19/8 | n:8 note:G4 s:folkharp ]", + "[ 19/8 → 5/2 | n:2 note:F3 s:folkharp ]", + "[ 5/2 → 21/8 | n:7 note:F4 s:folkharp ]", + "[ 21/8 → 11/4 | n:6 note:D4 s:folkharp ]", + "[ 11/4 → 23/8 | n:11 note:D5 s:folkharp ]", + "[ 23/8 → 3/1 | n:3 note:G3 s:folkharp ]", + "[ 3/1 → 25/8 | n:0 note:C3 s:folkharp ]", + "[ 25/8 → 13/4 | n:11 note:D5 s:folkharp ]", + "[ 13/4 → 27/8 | n:4 note:A3 s:folkharp ]", + "[ 27/8 → 7/2 | n:9 note:A4 s:folkharp ]", + "[ 7/2 → 29/8 | n:10 note:C5 s:folkharp ]", + "[ 29/8 → 15/4 | n:12 note:F5 s:folkharp ]", + "[ 15/4 → 31/8 | n:1 note:D3 s:folkharp ]", + "[ 31/8 → 4/1 | n:4 note:A3 s:folkharp ]", ] `; @@ -4377,6 +4377,60 @@ exports[`runs examples > example "velocity" example index 0 1`] = ` ] `; +exports[`runs examples > example "voicing" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | note:C4 chord:C ]", + "[ 0/1 → 1/1 | note:E4 chord:C ]", + "[ 0/1 → 1/1 | note:G4 chord:C ]", + "[ 1/1 → 2/1 | note:C4 chord:Am ]", + "[ 1/1 → 2/1 | note:E4 chord:Am ]", + "[ 1/1 → 2/1 | note:A4 chord:Am ]", + "[ 2/1 → 3/1 | note:C4 chord:F ]", + "[ 2/1 → 3/1 | note:F4 chord:F ]", + "[ 2/1 → 3/1 | note:A4 chord:F ]", + "[ 3/1 → 4/1 | note:B3 chord:G ]", + "[ 3/1 → 4/1 | note:D4 chord:G ]", + "[ 3/1 → 4/1 | note:G4 chord:G ]", +] +`; + +exports[`runs examples > example "voicing" example index 1 1`] = ` +[ + "[ 0/1 → 1/8 | note:60 n:0 chord:C ]", + "[ 1/8 → 1/4 | note:64 n:1 chord:C ]", + "[ 1/4 → 3/8 | note:67 n:2 chord:C ]", + "[ 3/8 → 1/2 | note:72 n:3 chord:C ]", + "[ 1/2 → 5/8 | note:76 n:4 chord:C ]", + "[ 5/8 → 3/4 | note:79 n:5 chord:C ]", + "[ 3/4 → 7/8 | note:84 n:6 chord:C ]", + "[ 7/8 → 1/1 | note:88 n:7 chord:C ]", + "[ 1/1 → 9/8 | note:60 n:0 chord:Am ]", + "[ 9/8 → 5/4 | note:64 n:1 chord:Am ]", + "[ 5/4 → 11/8 | note:69 n:2 chord:Am ]", + "[ 11/8 → 3/2 | note:72 n:3 chord:Am ]", + "[ 3/2 → 13/8 | note:76 n:4 chord:Am ]", + "[ 13/8 → 7/4 | note:81 n:5 chord:Am ]", + "[ 7/4 → 15/8 | note:84 n:6 chord:Am ]", + "[ 15/8 → 2/1 | note:88 n:7 chord:Am ]", + "[ 2/1 → 17/8 | note:60 n:0 chord:F ]", + "[ 17/8 → 9/4 | note:65 n:1 chord:F ]", + "[ 9/4 → 19/8 | note:69 n:2 chord:F ]", + "[ 19/8 → 5/2 | note:72 n:3 chord:F ]", + "[ 5/2 → 21/8 | note:77 n:4 chord:F ]", + "[ 21/8 → 11/4 | note:81 n:5 chord:F ]", + "[ 11/4 → 23/8 | note:84 n:6 chord:F ]", + "[ 23/8 → 3/1 | note:89 n:7 chord:F ]", + "[ 3/1 → 25/8 | note:59 n:0 chord:G ]", + "[ 25/8 → 13/4 | note:62 n:1 chord:G ]", + "[ 13/4 → 27/8 | note:67 n:2 chord:G ]", + "[ 27/8 → 7/2 | note:71 n:3 chord:G ]", + "[ 7/2 → 29/8 | note:74 n:4 chord:G ]", + "[ 29/8 → 15/4 | note:79 n:5 chord:G ]", + "[ 15/4 → 31/8 | note:83 n:6 chord:G ]", + "[ 31/8 → 4/1 | note:86 n:7 chord:G ]", +] +`; + exports[`runs examples > example "voicings" example index 0 1`] = ` [ "[ 0/1 → 1/1 | note:B3 ]", diff --git a/test/__snapshots__/tunes.test.mjs.snap b/test/__snapshots__/tunes.test.mjs.snap index fdb34dd5..6f994836 100644 --- a/test/__snapshots__/tunes.test.mjs.snap +++ b/test/__snapshots__/tunes.test.mjs.snap @@ -7335,236 +7335,236 @@ exports[`renders tunes > tune: flatrave 1`] = ` exports[`renders tunes > tune: giantSteps 1`] = ` [ "[ 0/1 → 5/8 | note:F#5 ]", - "[ 0/1 → 5/8 | note:Bb4 chord:B^7 anchor:{note:F#5} mode:under ]", - "[ 0/1 → 5/8 | note:Db5 chord:B^7 anchor:{note:F#5} mode:under ]", - "[ 0/1 → 5/8 | note:Eb5 chord:B^7 anchor:{note:F#5} mode:under ]", + "[ 0/1 → 5/8 | note:Bb4 chord:B^7 anchor:{note:F#5} mode:duck ]", + "[ 0/1 → 5/8 | note:Db5 chord:B^7 anchor:{note:F#5} mode:duck ]", + "[ 0/1 → 5/8 | note:Eb5 chord:B^7 anchor:{note:F#5} mode:duck ]", "[ 0/1 → 5/8 | note:B2 ]", "[ (5/8 → 1/1) ⇝ 5/4 | note:D5 ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:C4 chord:D7 anchor:{note:D5} mode:under ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:E4 chord:D7 anchor:{note:D5} mode:under ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:Gb4 chord:D7 anchor:{note:D5} mode:under ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:B4 chord:D7 anchor:{note:D5} mode:under ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:C4 chord:D7 anchor:{note:D5} mode:duck ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:E4 chord:D7 anchor:{note:D5} mode:duck ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:Gb4 chord:D7 anchor:{note:D5} mode:duck ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:B4 chord:D7 anchor:{note:D5} mode:duck ]", "[ (5/8 → 1/1) ⇝ 5/4 | note:D2 ]", "[ 5/8 ⇜ (1/1 → 5/4) | note:D5 ]", - "[ 5/8 ⇜ (1/1 → 5/4) | note:C4 chord:D7 anchor:{note:D5} mode:under ]", - "[ 5/8 ⇜ (1/1 → 5/4) | note:E4 chord:D7 anchor:{note:D5} mode:under ]", - "[ 5/8 ⇜ (1/1 → 5/4) | note:Gb4 chord:D7 anchor:{note:D5} mode:under ]", - "[ 5/8 ⇜ (1/1 → 5/4) | note:B4 chord:D7 anchor:{note:D5} mode:under ]", + "[ 5/8 ⇜ (1/1 → 5/4) | note:C4 chord:D7 anchor:{note:D5} mode:duck ]", + "[ 5/8 ⇜ (1/1 → 5/4) | note:E4 chord:D7 anchor:{note:D5} mode:duck ]", + "[ 5/8 ⇜ (1/1 → 5/4) | note:Gb4 chord:D7 anchor:{note:D5} mode:duck ]", + "[ 5/8 ⇜ (1/1 → 5/4) | note:B4 chord:D7 anchor:{note:D5} mode:duck ]", "[ 5/8 ⇜ (1/1 → 5/4) | note:D2 ]", "[ 5/4 → 15/8 | note:B4 ]", - "[ 5/4 → 15/8 | note:B3 chord:G^7 anchor:{note:B4} mode:under ]", - "[ 5/4 → 15/8 | note:D4 chord:G^7 anchor:{note:B4} mode:under ]", - "[ 5/4 → 15/8 | note:Gb4 chord:G^7 anchor:{note:B4} mode:under ]", - "[ 5/4 → 15/8 | note:A4 chord:G^7 anchor:{note:B4} mode:under ]", + "[ 5/4 → 15/8 | note:B3 chord:G^7 anchor:{note:B4} mode:duck ]", + "[ 5/4 → 15/8 | note:D4 chord:G^7 anchor:{note:B4} mode:duck ]", + "[ 5/4 → 15/8 | note:Gb4 chord:G^7 anchor:{note:B4} mode:duck ]", + "[ 5/4 → 15/8 | note:A4 chord:G^7 anchor:{note:B4} mode:duck ]", "[ 5/4 → 15/8 | note:G2 ]", "[ (15/8 → 2/1) ⇝ 5/2 | note:G4 ]", - "[ (15/8 → 2/1) ⇝ 5/2 | note:Ab3 chord:Bb7 anchor:{note:G4} mode:under ]", - "[ (15/8 → 2/1) ⇝ 5/2 | note:C4 chord:Bb7 anchor:{note:G4} mode:under ]", - "[ (15/8 → 2/1) ⇝ 5/2 | note:D4 chord:Bb7 anchor:{note:G4} mode:under ]", + "[ (15/8 → 2/1) ⇝ 5/2 | note:Ab3 chord:Bb7 anchor:{note:G4} mode:duck ]", + "[ (15/8 → 2/1) ⇝ 5/2 | note:C4 chord:Bb7 anchor:{note:G4} mode:duck ]", + "[ (15/8 → 2/1) ⇝ 5/2 | note:D4 chord:Bb7 anchor:{note:G4} mode:duck ]", "[ (15/8 → 2/1) ⇝ 5/2 | note:Bb2 ]", "[ 15/8 ⇜ (2/1 → 5/2) | note:G4 ]", - "[ 15/8 ⇜ (2/1 → 5/2) | note:Ab3 chord:Bb7 anchor:{note:G4} mode:under ]", - "[ 15/8 ⇜ (2/1 → 5/2) | note:C4 chord:Bb7 anchor:{note:G4} mode:under ]", - "[ 15/8 ⇜ (2/1 → 5/2) | note:D4 chord:Bb7 anchor:{note:G4} mode:under ]", + "[ 15/8 ⇜ (2/1 → 5/2) | note:Ab3 chord:Bb7 anchor:{note:G4} mode:duck ]", + "[ 15/8 ⇜ (2/1 → 5/2) | note:C4 chord:Bb7 anchor:{note:G4} mode:duck ]", + "[ 15/8 ⇜ (2/1 → 5/2) | note:D4 chord:Bb7 anchor:{note:G4} mode:duck ]", "[ 15/8 ⇜ (2/1 → 5/2) | note:Bb2 ]", "[ (5/2 → 3/1) ⇝ 25/8 | note:Eb2 ]", "[ (5/2 → 3/1) ⇝ 15/4 | note:Bb4 ]", - "[ (5/2 → 3/1) ⇝ 15/4 | note:D4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", - "[ (5/2 → 3/1) ⇝ 15/4 | note:F4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", - "[ (5/2 → 3/1) ⇝ 15/4 | note:G4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", + "[ (5/2 → 3/1) ⇝ 15/4 | note:D4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", + "[ (5/2 → 3/1) ⇝ 15/4 | note:F4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", + "[ (5/2 → 3/1) ⇝ 15/4 | note:G4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", "[ 5/2 ⇜ (3/1 → 25/8) | note:Eb2 ]", "[ 5/2 ⇜ (3/1 → 15/4) | note:Bb4 ]", - "[ 5/2 ⇜ (3/1 → 15/4) | note:D4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", - "[ 5/2 ⇜ (3/1 → 15/4) | note:F4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", - "[ 5/2 ⇜ (3/1 → 15/4) | note:G4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", + "[ 5/2 ⇜ (3/1 → 15/4) | note:D4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", + "[ 5/2 ⇜ (3/1 → 15/4) | note:F4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", + "[ 5/2 ⇜ (3/1 → 15/4) | note:G4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", "[ 25/8 → 15/4 | note:Bb3 ]", "[ (15/4 → 4/1) ⇝ 35/8 | note:B4 ]", - "[ (15/4 → 4/1) ⇝ 35/8 | note:C4 chord:Am7 anchor:{note:B4} mode:under ]", - "[ (15/4 → 4/1) ⇝ 35/8 | note:E4 chord:Am7 anchor:{note:B4} mode:under ]", - "[ (15/4 → 4/1) ⇝ 35/8 | note:G4 chord:Am7 anchor:{note:B4} mode:under ]", + "[ (15/4 → 4/1) ⇝ 35/8 | note:C4 chord:Am7 anchor:{note:B4} mode:duck ]", + "[ (15/4 → 4/1) ⇝ 35/8 | note:E4 chord:Am7 anchor:{note:B4} mode:duck ]", + "[ (15/4 → 4/1) ⇝ 35/8 | note:G4 chord:Am7 anchor:{note:B4} mode:duck ]", "[ (15/4 → 4/1) ⇝ 35/8 | note:A2 ]", "[ 15/4 ⇜ (4/1 → 35/8) | note:B4 ]", - "[ 15/4 ⇜ (4/1 → 35/8) | note:C4 chord:Am7 anchor:{note:B4} mode:under ]", - "[ 15/4 ⇜ (4/1 → 35/8) | note:E4 chord:Am7 anchor:{note:B4} mode:under ]", - "[ 15/4 ⇜ (4/1 → 35/8) | note:G4 chord:Am7 anchor:{note:B4} mode:under ]", + "[ 15/4 ⇜ (4/1 → 35/8) | note:C4 chord:Am7 anchor:{note:B4} mode:duck ]", + "[ 15/4 ⇜ (4/1 → 35/8) | note:E4 chord:Am7 anchor:{note:B4} mode:duck ]", + "[ 15/4 ⇜ (4/1 → 35/8) | note:G4 chord:Am7 anchor:{note:B4} mode:duck ]", "[ 15/4 ⇜ (4/1 → 35/8) | note:A2 ]", "[ 35/8 → 5/1 | note:A4 ]", - "[ 35/8 → 5/1 | note:Gb3 chord:D7 anchor:{note:A4} mode:under ]", - "[ 35/8 → 5/1 | note:B3 chord:D7 anchor:{note:A4} mode:under ]", - "[ 35/8 → 5/1 | note:C4 chord:D7 anchor:{note:A4} mode:under ]", - "[ 35/8 → 5/1 | note:E4 chord:D7 anchor:{note:A4} mode:under ]", + "[ 35/8 → 5/1 | note:Gb3 chord:D7 anchor:{note:A4} mode:duck ]", + "[ 35/8 → 5/1 | note:B3 chord:D7 anchor:{note:A4} mode:duck ]", + "[ 35/8 → 5/1 | note:C4 chord:D7 anchor:{note:A4} mode:duck ]", + "[ 35/8 → 5/1 | note:E4 chord:D7 anchor:{note:A4} mode:duck ]", "[ 35/8 → 5/1 | note:D2 ]", "[ 5/1 → 45/8 | note:D5 ]", - "[ 5/1 → 45/8 | note:Gb4 chord:G^7 anchor:{note:D5} mode:under ]", - "[ 5/1 → 45/8 | note:A4 chord:G^7 anchor:{note:D5} mode:under ]", - "[ 5/1 → 45/8 | note:B4 chord:G^7 anchor:{note:D5} mode:under ]", + "[ 5/1 → 45/8 | note:Gb4 chord:G^7 anchor:{note:D5} mode:duck ]", + "[ 5/1 → 45/8 | note:A4 chord:G^7 anchor:{note:D5} mode:duck ]", + "[ 5/1 → 45/8 | note:B4 chord:G^7 anchor:{note:D5} mode:duck ]", "[ 5/1 → 45/8 | note:G2 ]", "[ (45/8 → 6/1) ⇝ 25/4 | note:Bb4 ]", - "[ (45/8 → 6/1) ⇝ 25/4 | note:Ab3 chord:Bb7 anchor:{note:Bb4} mode:under ]", - "[ (45/8 → 6/1) ⇝ 25/4 | note:C4 chord:Bb7 anchor:{note:Bb4} mode:under ]", - "[ (45/8 → 6/1) ⇝ 25/4 | note:D4 chord:Bb7 anchor:{note:Bb4} mode:under ]", - "[ (45/8 → 6/1) ⇝ 25/4 | note:G4 chord:Bb7 anchor:{note:Bb4} mode:under ]", + "[ (45/8 → 6/1) ⇝ 25/4 | note:Ab3 chord:Bb7 anchor:{note:Bb4} mode:duck ]", + "[ (45/8 → 6/1) ⇝ 25/4 | note:C4 chord:Bb7 anchor:{note:Bb4} mode:duck ]", + "[ (45/8 → 6/1) ⇝ 25/4 | note:D4 chord:Bb7 anchor:{note:Bb4} mode:duck ]", + "[ (45/8 → 6/1) ⇝ 25/4 | note:G4 chord:Bb7 anchor:{note:Bb4} mode:duck ]", "[ (45/8 → 6/1) ⇝ 25/4 | note:Bb2 ]", "[ 45/8 ⇜ (6/1 → 25/4) | note:Bb4 ]", - "[ 45/8 ⇜ (6/1 → 25/4) | note:Ab3 chord:Bb7 anchor:{note:Bb4} mode:under ]", - "[ 45/8 ⇜ (6/1 → 25/4) | note:C4 chord:Bb7 anchor:{note:Bb4} mode:under ]", - "[ 45/8 ⇜ (6/1 → 25/4) | note:D4 chord:Bb7 anchor:{note:Bb4} mode:under ]", - "[ 45/8 ⇜ (6/1 → 25/4) | note:G4 chord:Bb7 anchor:{note:Bb4} mode:under ]", + "[ 45/8 ⇜ (6/1 → 25/4) | note:Ab3 chord:Bb7 anchor:{note:Bb4} mode:duck ]", + "[ 45/8 ⇜ (6/1 → 25/4) | note:C4 chord:Bb7 anchor:{note:Bb4} mode:duck ]", + "[ 45/8 ⇜ (6/1 → 25/4) | note:D4 chord:Bb7 anchor:{note:Bb4} mode:duck ]", + "[ 45/8 ⇜ (6/1 → 25/4) | note:G4 chord:Bb7 anchor:{note:Bb4} mode:duck ]", "[ 45/8 ⇜ (6/1 → 25/4) | note:Bb2 ]", "[ 25/4 → 55/8 | note:G4 ]", - "[ 25/4 → 55/8 | note:G3 chord:Eb^7 anchor:{note:G4} mode:under ]", - "[ 25/4 → 55/8 | note:Bb3 chord:Eb^7 anchor:{note:G4} mode:under ]", - "[ 25/4 → 55/8 | note:D4 chord:Eb^7 anchor:{note:G4} mode:under ]", - "[ 25/4 → 55/8 | note:F4 chord:Eb^7 anchor:{note:G4} mode:under ]", + "[ 25/4 → 55/8 | note:G3 chord:Eb^7 anchor:{note:G4} mode:duck ]", + "[ 25/4 → 55/8 | note:Bb3 chord:Eb^7 anchor:{note:G4} mode:duck ]", + "[ 25/4 → 55/8 | note:D4 chord:Eb^7 anchor:{note:G4} mode:duck ]", + "[ 25/4 → 55/8 | note:F4 chord:Eb^7 anchor:{note:G4} mode:duck ]", "[ 25/4 → 55/8 | note:Eb2 ]", "[ (55/8 → 7/1) ⇝ 15/2 | note:Eb4 ]", - "[ (55/8 → 7/1) ⇝ 15/2 | note:E3 chord:F#7 anchor:{note:Eb4} mode:under ]", - "[ (55/8 → 7/1) ⇝ 15/2 | note:Ab3 chord:F#7 anchor:{note:Eb4} mode:under ]", - "[ (55/8 → 7/1) ⇝ 15/2 | note:Bb3 chord:F#7 anchor:{note:Eb4} mode:under ]", + "[ (55/8 → 7/1) ⇝ 15/2 | note:E3 chord:F#7 anchor:{note:Eb4} mode:duck ]", + "[ (55/8 → 7/1) ⇝ 15/2 | note:Ab3 chord:F#7 anchor:{note:Eb4} mode:duck ]", + "[ (55/8 → 7/1) ⇝ 15/2 | note:Bb3 chord:F#7 anchor:{note:Eb4} mode:duck ]", "[ (55/8 → 7/1) ⇝ 15/2 | note:F#2 ]", "[ 55/8 ⇜ (7/1 → 15/2) | note:Eb4 ]", - "[ 55/8 ⇜ (7/1 → 15/2) | note:E3 chord:F#7 anchor:{note:Eb4} mode:under ]", - "[ 55/8 ⇜ (7/1 → 15/2) | note:Ab3 chord:F#7 anchor:{note:Eb4} mode:under ]", - "[ 55/8 ⇜ (7/1 → 15/2) | note:Bb3 chord:F#7 anchor:{note:Eb4} mode:under ]", + "[ 55/8 ⇜ (7/1 → 15/2) | note:E3 chord:F#7 anchor:{note:Eb4} mode:duck ]", + "[ 55/8 ⇜ (7/1 → 15/2) | note:Ab3 chord:F#7 anchor:{note:Eb4} mode:duck ]", + "[ 55/8 ⇜ (7/1 → 15/2) | note:Bb3 chord:F#7 anchor:{note:Eb4} mode:duck ]", "[ 55/8 ⇜ (7/1 → 15/2) | note:F#2 ]", "[ (15/2 → 8/1) ⇝ 65/8 | note:B2 ]", "[ (15/2 → 8/1) ⇝ 35/4 | note:F#4 ]", - "[ (15/2 → 8/1) ⇝ 35/4 | note:Bb3 chord:B^7 anchor:{note:F#4} mode:under ]", - "[ (15/2 → 8/1) ⇝ 35/4 | note:Db4 chord:B^7 anchor:{note:F#4} mode:under ]", - "[ (15/2 → 8/1) ⇝ 35/4 | note:Eb4 chord:B^7 anchor:{note:F#4} mode:under ]", + "[ (15/2 → 8/1) ⇝ 35/4 | note:Bb3 chord:B^7 anchor:{note:F#4} mode:duck ]", + "[ (15/2 → 8/1) ⇝ 35/4 | note:Db4 chord:B^7 anchor:{note:F#4} mode:duck ]", + "[ (15/2 → 8/1) ⇝ 35/4 | note:Eb4 chord:B^7 anchor:{note:F#4} mode:duck ]", "[ 15/2 ⇜ (8/1 → 65/8) | note:B2 ]", "[ 15/2 ⇜ (8/1 → 35/4) | note:F#4 ]", - "[ 15/2 ⇜ (8/1 → 35/4) | note:Bb3 chord:B^7 anchor:{note:F#4} mode:under ]", - "[ 15/2 ⇜ (8/1 → 35/4) | note:Db4 chord:B^7 anchor:{note:F#4} mode:under ]", - "[ 15/2 ⇜ (8/1 → 35/4) | note:Eb4 chord:B^7 anchor:{note:F#4} mode:under ]", + "[ 15/2 ⇜ (8/1 → 35/4) | note:Bb3 chord:B^7 anchor:{note:F#4} mode:duck ]", + "[ 15/2 ⇜ (8/1 → 35/4) | note:Db4 chord:B^7 anchor:{note:F#4} mode:duck ]", + "[ 15/2 ⇜ (8/1 → 35/4) | note:Eb4 chord:B^7 anchor:{note:F#4} mode:duck ]", "[ 65/8 → 35/4 | note:F#2 ]", "[ (35/4 → 9/1) ⇝ 75/8 | note:G4 ]", - "[ (35/4 → 9/1) ⇝ 75/8 | note:Ab3 chord:Fm7 anchor:{note:G4} mode:under ]", - "[ (35/4 → 9/1) ⇝ 75/8 | note:C4 chord:Fm7 anchor:{note:G4} mode:under ]", - "[ (35/4 → 9/1) ⇝ 75/8 | note:Eb4 chord:Fm7 anchor:{note:G4} mode:under ]", + "[ (35/4 → 9/1) ⇝ 75/8 | note:Ab3 chord:Fm7 anchor:{note:G4} mode:duck ]", + "[ (35/4 → 9/1) ⇝ 75/8 | note:C4 chord:Fm7 anchor:{note:G4} mode:duck ]", + "[ (35/4 → 9/1) ⇝ 75/8 | note:Eb4 chord:Fm7 anchor:{note:G4} mode:duck ]", "[ (35/4 → 9/1) ⇝ 75/8 | note:F2 ]", "[ 35/4 ⇜ (9/1 → 75/8) | note:G4 ]", - "[ 35/4 ⇜ (9/1 → 75/8) | note:Ab3 chord:Fm7 anchor:{note:G4} mode:under ]", - "[ 35/4 ⇜ (9/1 → 75/8) | note:C4 chord:Fm7 anchor:{note:G4} mode:under ]", - "[ 35/4 ⇜ (9/1 → 75/8) | note:Eb4 chord:Fm7 anchor:{note:G4} mode:under ]", + "[ 35/4 ⇜ (9/1 → 75/8) | note:Ab3 chord:Fm7 anchor:{note:G4} mode:duck ]", + "[ 35/4 ⇜ (9/1 → 75/8) | note:C4 chord:Fm7 anchor:{note:G4} mode:duck ]", + "[ 35/4 ⇜ (9/1 → 75/8) | note:Eb4 chord:Fm7 anchor:{note:G4} mode:duck ]", "[ 35/4 ⇜ (9/1 → 75/8) | note:F2 ]", "[ 75/8 → 10/1 | note:F4 ]", - "[ 75/8 → 10/1 | note:D3 chord:Bb7 anchor:{note:F4} mode:under ]", - "[ 75/8 → 10/1 | note:G3 chord:Bb7 anchor:{note:F4} mode:under ]", - "[ 75/8 → 10/1 | note:Ab3 chord:Bb7 anchor:{note:F4} mode:under ]", - "[ 75/8 → 10/1 | note:C4 chord:Bb7 anchor:{note:F4} mode:under ]", + "[ 75/8 → 10/1 | note:D3 chord:Bb7 anchor:{note:F4} mode:duck ]", + "[ 75/8 → 10/1 | note:G3 chord:Bb7 anchor:{note:F4} mode:duck ]", + "[ 75/8 → 10/1 | note:Ab3 chord:Bb7 anchor:{note:F4} mode:duck ]", + "[ 75/8 → 10/1 | note:C4 chord:Bb7 anchor:{note:F4} mode:duck ]", "[ 75/8 → 10/1 | note:Bb2 ]", "[ 10/1 → 85/8 | note:Eb2 ]", "[ (10/1 → 11/1) ⇝ 45/4 | note:Bb4 ]", - "[ (10/1 → 11/1) ⇝ 45/4 | note:D4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", - "[ (10/1 → 11/1) ⇝ 45/4 | note:F4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", - "[ (10/1 → 11/1) ⇝ 45/4 | note:G4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", + "[ (10/1 → 11/1) ⇝ 45/4 | note:D4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", + "[ (10/1 → 11/1) ⇝ 45/4 | note:F4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", + "[ (10/1 → 11/1) ⇝ 45/4 | note:G4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", "[ (85/8 → 11/1) ⇝ 45/4 | note:Bb2 ]", "[ 10/1 ⇜ (11/1 → 45/4) | note:Bb4 ]", - "[ 10/1 ⇜ (11/1 → 45/4) | note:D4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", - "[ 10/1 ⇜ (11/1 → 45/4) | note:F4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", - "[ 10/1 ⇜ (11/1 → 45/4) | note:G4 chord:Eb^7 anchor:{note:Bb4} mode:under ]", + "[ 10/1 ⇜ (11/1 → 45/4) | note:D4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", + "[ 10/1 ⇜ (11/1 → 45/4) | note:F4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", + "[ 10/1 ⇜ (11/1 → 45/4) | note:G4 chord:Eb^7 anchor:{note:Bb4} mode:duck ]", "[ 85/8 ⇜ (11/1 → 45/4) | note:Bb2 ]", "[ 45/4 → 95/8 | note:B4 ]", - "[ 45/4 → 95/8 | note:C4 chord:Am7 anchor:{note:B4} mode:under ]", - "[ 45/4 → 95/8 | note:E4 chord:Am7 anchor:{note:B4} mode:under ]", - "[ 45/4 → 95/8 | note:G4 chord:Am7 anchor:{note:B4} mode:under ]", + "[ 45/4 → 95/8 | note:C4 chord:Am7 anchor:{note:B4} mode:duck ]", + "[ 45/4 → 95/8 | note:E4 chord:Am7 anchor:{note:B4} mode:duck ]", + "[ 45/4 → 95/8 | note:G4 chord:Am7 anchor:{note:B4} mode:duck ]", "[ 45/4 → 95/8 | note:A2 ]", "[ (95/8 → 12/1) ⇝ 25/2 | note:A4 ]", - "[ (95/8 → 12/1) ⇝ 25/2 | note:Gb3 chord:D7 anchor:{note:A4} mode:under ]", - "[ (95/8 → 12/1) ⇝ 25/2 | note:B3 chord:D7 anchor:{note:A4} mode:under ]", - "[ (95/8 → 12/1) ⇝ 25/2 | note:C4 chord:D7 anchor:{note:A4} mode:under ]", - "[ (95/8 → 12/1) ⇝ 25/2 | note:E4 chord:D7 anchor:{note:A4} mode:under ]", + "[ (95/8 → 12/1) ⇝ 25/2 | note:Gb3 chord:D7 anchor:{note:A4} mode:duck ]", + "[ (95/8 → 12/1) ⇝ 25/2 | note:B3 chord:D7 anchor:{note:A4} mode:duck ]", + "[ (95/8 → 12/1) ⇝ 25/2 | note:C4 chord:D7 anchor:{note:A4} mode:duck ]", + "[ (95/8 → 12/1) ⇝ 25/2 | note:E4 chord:D7 anchor:{note:A4} mode:duck ]", "[ (95/8 → 12/1) ⇝ 25/2 | note:D2 ]", "[ 95/8 ⇜ (12/1 → 25/2) | note:A4 ]", - "[ 95/8 ⇜ (12/1 → 25/2) | note:Gb3 chord:D7 anchor:{note:A4} mode:under ]", - "[ 95/8 ⇜ (12/1 → 25/2) | note:B3 chord:D7 anchor:{note:A4} mode:under ]", - "[ 95/8 ⇜ (12/1 → 25/2) | note:C4 chord:D7 anchor:{note:A4} mode:under ]", - "[ 95/8 ⇜ (12/1 → 25/2) | note:E4 chord:D7 anchor:{note:A4} mode:under ]", + "[ 95/8 ⇜ (12/1 → 25/2) | note:Gb3 chord:D7 anchor:{note:A4} mode:duck ]", + "[ 95/8 ⇜ (12/1 → 25/2) | note:B3 chord:D7 anchor:{note:A4} mode:duck ]", + "[ 95/8 ⇜ (12/1 → 25/2) | note:C4 chord:D7 anchor:{note:A4} mode:duck ]", + "[ 95/8 ⇜ (12/1 → 25/2) | note:E4 chord:D7 anchor:{note:A4} mode:duck ]", "[ 95/8 ⇜ (12/1 → 25/2) | note:D2 ]", "[ (25/2 → 13/1) ⇝ 105/8 | note:G2 ]", "[ (25/2 → 13/1) ⇝ 55/4 | note:D5 ]", - "[ (25/2 → 13/1) ⇝ 55/4 | note:Gb4 chord:G^7 anchor:{note:D5} mode:under ]", - "[ (25/2 → 13/1) ⇝ 55/4 | note:A4 chord:G^7 anchor:{note:D5} mode:under ]", - "[ (25/2 → 13/1) ⇝ 55/4 | note:B4 chord:G^7 anchor:{note:D5} mode:under ]", + "[ (25/2 → 13/1) ⇝ 55/4 | note:Gb4 chord:G^7 anchor:{note:D5} mode:duck ]", + "[ (25/2 → 13/1) ⇝ 55/4 | note:A4 chord:G^7 anchor:{note:D5} mode:duck ]", + "[ (25/2 → 13/1) ⇝ 55/4 | note:B4 chord:G^7 anchor:{note:D5} mode:duck ]", "[ 25/2 ⇜ (13/1 → 105/8) | note:G2 ]", "[ 25/2 ⇜ (13/1 → 55/4) | note:D5 ]", - "[ 25/2 ⇜ (13/1 → 55/4) | note:Gb4 chord:G^7 anchor:{note:D5} mode:under ]", - "[ 25/2 ⇜ (13/1 → 55/4) | note:A4 chord:G^7 anchor:{note:D5} mode:under ]", - "[ 25/2 ⇜ (13/1 → 55/4) | note:B4 chord:G^7 anchor:{note:D5} mode:under ]", + "[ 25/2 ⇜ (13/1 → 55/4) | note:Gb4 chord:G^7 anchor:{note:D5} mode:duck ]", + "[ 25/2 ⇜ (13/1 → 55/4) | note:A4 chord:G^7 anchor:{note:D5} mode:duck ]", + "[ 25/2 ⇜ (13/1 → 55/4) | note:B4 chord:G^7 anchor:{note:D5} mode:duck ]", "[ 105/8 → 55/4 | note:D2 ]", "[ (55/4 → 14/1) ⇝ 115/8 | note:D#5 ]", - "[ (55/4 → 14/1) ⇝ 115/8 | note:E4 chord:C#m7 anchor:{note:D#5} mode:under ]", - "[ (55/4 → 14/1) ⇝ 115/8 | note:Ab4 chord:C#m7 anchor:{note:D#5} mode:under ]", - "[ (55/4 → 14/1) ⇝ 115/8 | note:B4 chord:C#m7 anchor:{note:D#5} mode:under ]", + "[ (55/4 → 14/1) ⇝ 115/8 | note:E4 chord:C#m7 anchor:{note:D#5} mode:duck ]", + "[ (55/4 → 14/1) ⇝ 115/8 | note:Ab4 chord:C#m7 anchor:{note:D#5} mode:duck ]", + "[ (55/4 → 14/1) ⇝ 115/8 | note:B4 chord:C#m7 anchor:{note:D#5} mode:duck ]", "[ (55/4 → 14/1) ⇝ 115/8 | note:C#2 ]", "[ 55/4 ⇜ (14/1 → 115/8) | note:D#5 ]", - "[ 55/4 ⇜ (14/1 → 115/8) | note:E4 chord:C#m7 anchor:{note:D#5} mode:under ]", - "[ 55/4 ⇜ (14/1 → 115/8) | note:Ab4 chord:C#m7 anchor:{note:D#5} mode:under ]", - "[ 55/4 ⇜ (14/1 → 115/8) | note:B4 chord:C#m7 anchor:{note:D#5} mode:under ]", + "[ 55/4 ⇜ (14/1 → 115/8) | note:E4 chord:C#m7 anchor:{note:D#5} mode:duck ]", + "[ 55/4 ⇜ (14/1 → 115/8) | note:Ab4 chord:C#m7 anchor:{note:D#5} mode:duck ]", + "[ 55/4 ⇜ (14/1 → 115/8) | note:B4 chord:C#m7 anchor:{note:D#5} mode:duck ]", "[ 55/4 ⇜ (14/1 → 115/8) | note:C#2 ]", "[ 115/8 → 15/1 | note:C#5 ]", - "[ 115/8 → 15/1 | note:Bb3 chord:F#7 anchor:{note:C#5} mode:under ]", - "[ 115/8 → 15/1 | note:Eb4 chord:F#7 anchor:{note:C#5} mode:under ]", - "[ 115/8 → 15/1 | note:E4 chord:F#7 anchor:{note:C#5} mode:under ]", - "[ 115/8 → 15/1 | note:Ab4 chord:F#7 anchor:{note:C#5} mode:under ]", + "[ 115/8 → 15/1 | note:Bb3 chord:F#7 anchor:{note:C#5} mode:duck ]", + "[ 115/8 → 15/1 | note:Eb4 chord:F#7 anchor:{note:C#5} mode:duck ]", + "[ 115/8 → 15/1 | note:E4 chord:F#7 anchor:{note:C#5} mode:duck ]", + "[ 115/8 → 15/1 | note:Ab4 chord:F#7 anchor:{note:C#5} mode:duck ]", "[ 115/8 → 15/1 | note:F#2 ]", "[ 15/1 → 125/8 | note:B2 ]", "[ (15/1 → 16/1) ⇝ 65/4 | note:F#5 ]", - "[ (15/1 → 16/1) ⇝ 65/4 | note:Bb4 chord:B^7 anchor:{note:F#5} mode:under ]", - "[ (15/1 → 16/1) ⇝ 65/4 | note:Db5 chord:B^7 anchor:{note:F#5} mode:under ]", - "[ (15/1 → 16/1) ⇝ 65/4 | note:Eb5 chord:B^7 anchor:{note:F#5} mode:under ]", + "[ (15/1 → 16/1) ⇝ 65/4 | note:Bb4 chord:B^7 anchor:{note:F#5} mode:duck ]", + "[ (15/1 → 16/1) ⇝ 65/4 | note:Db5 chord:B^7 anchor:{note:F#5} mode:duck ]", + "[ (15/1 → 16/1) ⇝ 65/4 | note:Eb5 chord:B^7 anchor:{note:F#5} mode:duck ]", "[ (125/8 → 16/1) ⇝ 65/4 | note:F#2 ]", "[ 15/1 ⇜ (16/1 → 65/4) | note:F#5 ]", - "[ 15/1 ⇜ (16/1 → 65/4) | note:Bb4 chord:B^7 anchor:{note:F#5} mode:under ]", - "[ 15/1 ⇜ (16/1 → 65/4) | note:Db5 chord:B^7 anchor:{note:F#5} mode:under ]", - "[ 15/1 ⇜ (16/1 → 65/4) | note:Eb5 chord:B^7 anchor:{note:F#5} mode:under ]", + "[ 15/1 ⇜ (16/1 → 65/4) | note:Bb4 chord:B^7 anchor:{note:F#5} mode:duck ]", + "[ 15/1 ⇜ (16/1 → 65/4) | note:Db5 chord:B^7 anchor:{note:F#5} mode:duck ]", + "[ 15/1 ⇜ (16/1 → 65/4) | note:Eb5 chord:B^7 anchor:{note:F#5} mode:duck ]", "[ 125/8 ⇜ (16/1 → 65/4) | note:F#2 ]", "[ 65/4 → 135/8 | note:G5 ]", - "[ 65/4 → 135/8 | note:Ab4 chord:Fm7 anchor:{note:G5} mode:under ]", - "[ 65/4 → 135/8 | note:C5 chord:Fm7 anchor:{note:G5} mode:under ]", - "[ 65/4 → 135/8 | note:Eb5 chord:Fm7 anchor:{note:G5} mode:under ]", + "[ 65/4 → 135/8 | note:Ab4 chord:Fm7 anchor:{note:G5} mode:duck ]", + "[ 65/4 → 135/8 | note:C5 chord:Fm7 anchor:{note:G5} mode:duck ]", + "[ 65/4 → 135/8 | note:Eb5 chord:Fm7 anchor:{note:G5} mode:duck ]", "[ 65/4 → 135/8 | note:F2 ]", "[ (135/8 → 17/1) ⇝ 35/2 | note:F5 ]", - "[ (135/8 → 17/1) ⇝ 35/2 | note:D4 chord:Bb7 anchor:{note:F5} mode:under ]", - "[ (135/8 → 17/1) ⇝ 35/2 | note:G4 chord:Bb7 anchor:{note:F5} mode:under ]", - "[ (135/8 → 17/1) ⇝ 35/2 | note:Ab4 chord:Bb7 anchor:{note:F5} mode:under ]", - "[ (135/8 → 17/1) ⇝ 35/2 | note:C5 chord:Bb7 anchor:{note:F5} mode:under ]", + "[ (135/8 → 17/1) ⇝ 35/2 | note:D4 chord:Bb7 anchor:{note:F5} mode:duck ]", + "[ (135/8 → 17/1) ⇝ 35/2 | note:G4 chord:Bb7 anchor:{note:F5} mode:duck ]", + "[ (135/8 → 17/1) ⇝ 35/2 | note:Ab4 chord:Bb7 anchor:{note:F5} mode:duck ]", + "[ (135/8 → 17/1) ⇝ 35/2 | note:C5 chord:Bb7 anchor:{note:F5} mode:duck ]", "[ (135/8 → 17/1) ⇝ 35/2 | note:Bb2 ]", "[ 135/8 ⇜ (17/1 → 35/2) | note:F5 ]", - "[ 135/8 ⇜ (17/1 → 35/2) | note:D4 chord:Bb7 anchor:{note:F5} mode:under ]", - "[ 135/8 ⇜ (17/1 → 35/2) | note:G4 chord:Bb7 anchor:{note:F5} mode:under ]", - "[ 135/8 ⇜ (17/1 → 35/2) | note:Ab4 chord:Bb7 anchor:{note:F5} mode:under ]", - "[ 135/8 ⇜ (17/1 → 35/2) | note:C5 chord:Bb7 anchor:{note:F5} mode:under ]", + "[ 135/8 ⇜ (17/1 → 35/2) | note:D4 chord:Bb7 anchor:{note:F5} mode:duck ]", + "[ 135/8 ⇜ (17/1 → 35/2) | note:G4 chord:Bb7 anchor:{note:F5} mode:duck ]", + "[ 135/8 ⇜ (17/1 → 35/2) | note:Ab4 chord:Bb7 anchor:{note:F5} mode:duck ]", + "[ 135/8 ⇜ (17/1 → 35/2) | note:C5 chord:Bb7 anchor:{note:F5} mode:duck ]", "[ 135/8 ⇜ (17/1 → 35/2) | note:Bb2 ]", "[ (35/2 → 18/1) ⇝ 145/8 | note:Eb2 ]", "[ (35/2 → 18/1) ⇝ 75/4 | note:Bb5 ]", - "[ (35/2 → 18/1) ⇝ 75/4 | note:D5 chord:Eb^7 anchor:{note:Bb5} mode:under ]", - "[ (35/2 → 18/1) ⇝ 75/4 | note:F5 chord:Eb^7 anchor:{note:Bb5} mode:under ]", - "[ (35/2 → 18/1) ⇝ 75/4 | note:G5 chord:Eb^7 anchor:{note:Bb5} mode:under ]", + "[ (35/2 → 18/1) ⇝ 75/4 | note:D5 chord:Eb^7 anchor:{note:Bb5} mode:duck ]", + "[ (35/2 → 18/1) ⇝ 75/4 | note:F5 chord:Eb^7 anchor:{note:Bb5} mode:duck ]", + "[ (35/2 → 18/1) ⇝ 75/4 | note:G5 chord:Eb^7 anchor:{note:Bb5} mode:duck ]", "[ 35/2 ⇜ (18/1 → 145/8) | note:Eb2 ]", "[ 35/2 ⇜ (18/1 → 75/4) | note:Bb5 ]", - "[ 35/2 ⇜ (18/1 → 75/4) | note:D5 chord:Eb^7 anchor:{note:Bb5} mode:under ]", - "[ 35/2 ⇜ (18/1 → 75/4) | note:F5 chord:Eb^7 anchor:{note:Bb5} mode:under ]", - "[ 35/2 ⇜ (18/1 → 75/4) | note:G5 chord:Eb^7 anchor:{note:Bb5} mode:under ]", + "[ 35/2 ⇜ (18/1 → 75/4) | note:D5 chord:Eb^7 anchor:{note:Bb5} mode:duck ]", + "[ 35/2 ⇜ (18/1 → 75/4) | note:F5 chord:Eb^7 anchor:{note:Bb5} mode:duck ]", + "[ 35/2 ⇜ (18/1 → 75/4) | note:G5 chord:Eb^7 anchor:{note:Bb5} mode:duck ]", "[ 145/8 → 75/4 | note:Bb3 ]", "[ (75/4 → 19/1) ⇝ 155/8 | note:F#5 ]", - "[ (75/4 → 19/1) ⇝ 155/8 | note:E4 chord:C#m7 anchor:{note:F#5} mode:under ]", - "[ (75/4 → 19/1) ⇝ 155/8 | note:Ab4 chord:C#m7 anchor:{note:F#5} mode:under ]", - "[ (75/4 → 19/1) ⇝ 155/8 | note:B4 chord:C#m7 anchor:{note:F#5} mode:under ]", - "[ (75/4 → 19/1) ⇝ 155/8 | note:Eb5 chord:C#m7 anchor:{note:F#5} mode:under ]", + "[ (75/4 → 19/1) ⇝ 155/8 | note:E4 chord:C#m7 anchor:{note:F#5} mode:duck ]", + "[ (75/4 → 19/1) ⇝ 155/8 | note:Ab4 chord:C#m7 anchor:{note:F#5} mode:duck ]", + "[ (75/4 → 19/1) ⇝ 155/8 | note:B4 chord:C#m7 anchor:{note:F#5} mode:duck ]", + "[ (75/4 → 19/1) ⇝ 155/8 | note:Eb5 chord:C#m7 anchor:{note:F#5} mode:duck ]", "[ (75/4 → 19/1) ⇝ 155/8 | note:C#2 ]", "[ 75/4 ⇜ (19/1 → 155/8) | note:F#5 ]", - "[ 75/4 ⇜ (19/1 → 155/8) | note:E4 chord:C#m7 anchor:{note:F#5} mode:under ]", - "[ 75/4 ⇜ (19/1 → 155/8) | note:Ab4 chord:C#m7 anchor:{note:F#5} mode:under ]", - "[ 75/4 ⇜ (19/1 → 155/8) | note:B4 chord:C#m7 anchor:{note:F#5} mode:under ]", - "[ 75/4 ⇜ (19/1 → 155/8) | note:Eb5 chord:C#m7 anchor:{note:F#5} mode:under ]", + "[ 75/4 ⇜ (19/1 → 155/8) | note:E4 chord:C#m7 anchor:{note:F#5} mode:duck ]", + "[ 75/4 ⇜ (19/1 → 155/8) | note:Ab4 chord:C#m7 anchor:{note:F#5} mode:duck ]", + "[ 75/4 ⇜ (19/1 → 155/8) | note:B4 chord:C#m7 anchor:{note:F#5} mode:duck ]", + "[ 75/4 ⇜ (19/1 → 155/8) | note:Eb5 chord:C#m7 anchor:{note:F#5} mode:duck ]", "[ 75/4 ⇜ (19/1 → 155/8) | note:C#2 ]", "[ 155/8 → 20/1 | note:F#5 ]", - "[ 155/8 → 20/1 | note:E4 chord:F#7 anchor:{note:F#5} mode:under ]", - "[ 155/8 → 20/1 | note:Ab4 chord:F#7 anchor:{note:F#5} mode:under ]", - "[ 155/8 → 20/1 | note:Bb4 chord:F#7 anchor:{note:F#5} mode:under ]", - "[ 155/8 → 20/1 | note:Eb5 chord:F#7 anchor:{note:F#5} mode:under ]", + "[ 155/8 → 20/1 | note:E4 chord:F#7 anchor:{note:F#5} mode:duck ]", + "[ 155/8 → 20/1 | note:Ab4 chord:F#7 anchor:{note:F#5} mode:duck ]", + "[ 155/8 → 20/1 | note:Bb4 chord:F#7 anchor:{note:F#5} mode:duck ]", + "[ 155/8 → 20/1 | note:Eb5 chord:F#7 anchor:{note:F#5} mode:duck ]", "[ 155/8 → 20/1 | note:F#2 ]", ] `; diff --git a/website/src/pages/learn/tonal.mdx b/website/src/pages/learn/tonal.mdx index 658d6ad4..e010e143 100644 --- a/website/src/pages/learn/tonal.mdx +++ b/website/src/pages/learn/tonal.mdx @@ -10,20 +10,13 @@ import { JsDoc } from '../../docs/JsDoc'; These functions use [tonaljs](https://github.com/tonaljs/tonal) to provide helpers for musical operations. +### voicing() + + + ### scale(name) -Turns numbers into notes in the scale (zero indexed). Also sets scale for other scale operations, like scaleTranspose. - - - -Note that the scale root is octaved here. You can also omit the octave, then index zero will default to octave 3. - -All the available scale names can be found [here](https://github.com/tonaljs/tonal/blob/main/packages/scale-type/data.ts). + ### transpose(semitones) diff --git a/website/src/repl/tunes.mjs b/website/src/repl/tunes.mjs index 7a21873c..dd524283 100644 --- a/website/src/repl/tunes.mjs +++ b/website/src/repl/tunes.mjs @@ -86,7 +86,7 @@ stack( "Eb^7 [Am7 D7] G^7 [C#m7 F#7]", "B^7 [Fm7 Bb7] Eb^7 [C#m7 F#7]" ).dict('lefthand') - .anchor(melody).mode('under') + .anchor(melody).mode('duck') .voicing().color('#7ED321'), // bass note(