Public
Edited
Jun 23, 2023
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
voicing = toDropTwo(chosenNotes)
Insert cell
Insert cell
Insert cell
Insert cell
function transposeChord(chordName) {
return pipe(
chord => Tonal.Chord.transpose(chord, transposition),
Tonal.Chord.get,
simplifyChord,
chord => chord.symbol
)(chordName)
}
Insert cell
Insert cell
Insert cell
function simplifyChord(chord) {
const enharmonic = Tonal.Note.enharmonic(chord.tonic);

if (fifthDistance[chord.tonic] > fifthDistance[enharmonic]) {
const chordQuality = chord.aliases.find(x => chord.symbol.includes(x)) || chord.symbol.replace(chord.tonic, "")
return Tonal.Chord.getChord(chordQuality, enharmonic)
}
return chord
}
Insert cell
Insert cell
Insert cell
Insert cell
Tonal.Chord.get("B7")
Insert cell
pipe = (...fns) => (x) => fns.reduce((v, f) => f(v), x);
Insert cell
import {Piano} from "@davidblurton/mini-piano"
Insert cell
import {rotate} from "11b0ce3a952fec11"
Insert cell
Barry Harris chord data - untitled-4.csv
Type Table, then Shift-Enter. Ctrl-space for more options.

Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more