# @tonaljs/core

> Music theory library

Latest version **5.0.2** (published 2025-01-03) · MIT license · 0 weekly downloads

## Install

```sh
npm install @tonaljs/core
pnpm add @tonaljs/core
yarn add @tonaljs/core
bun add @tonaljs/core
```

## Health

**Score 35/100 (D)** — status: maintenance-mode.

Positive: has types; esm support; no vulnerabilities.

Warnings: low downloads.

Negative: stale; low maintenance score.

## Facts

| | |
|---|---|
| Version | 5.0.2 |
| Published | 2025-01-03 |
| First published | 2020-03-11 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 4 |
| Unpacked size | 11.9 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | danigb@gmail.com |
| Maintainers | danigb |
| Keywords | music, theory |

## Links

- npm: https://www.npmjs.com/package/@tonaljs/core
- npm.io page: https://npm.io/package/@tonaljs/core

## Dependencies (4)

- [@tonaljs/pitch](https://npm.io/package/@tonaljs/pitch.md) 5.0.2
- [@tonaljs/pitch-note](https://npm.io/package/@tonaljs/pitch-note.md) 6.1.0
- [@tonaljs/pitch-distance](https://npm.io/package/@tonaljs/pitch-distance.md) 5.0.5
- [@tonaljs/pitch-interval](https://npm.io/package/@tonaljs/pitch-interval.md) 6.1.0

## Recent versions

- 5.0.2 (latest) — 2025-01-03
- 5.0.1 — 2024-07-23
- 5.0.0 — 2024-02-03
- 4.10.4 — 2024-02-03
- 4.10.3 — 2024-01-04
- 4.10.2 — 2023-11-29
- 4.10.0 — 2023-01-20
- 4.9.0 — 2023-01-12
- 4.8.0 — 2022-11-29
- 4.7.3 — 2022-11-29
- 4.7.2 — 2022-11-29
- 4.6.12 — 2022-11-29
- 4.6.11 — 2022-11-28
- 4.6.10 — 2022-11-18
- 4.6.5 — 2021-09-05
- … 9 more at https://npm.io/package/@tonaljs/core/versions

## README

# @tonaljs/core ![tonal](https://img.shields.io/badge/@tonaljs-tonal-yellow.svg?style=flat-square) [![npm version](https://img.shields.io/npm/v/@tonaljs/core.svg?style=flat-square)](https://www.npmjs.com/package/@tonaljs/core)

> Parse notes and interval names. Calculate distances and transpositions

`@tonaljs/core` is the core module of the `tonal` music theory library.

Normally you don't use this module directly.

## Example

Get note and interval properties:

```js
import { note, interval } from "@tonaljs/core";
note("c4"); // => { name: 'C4', oct: 4, ...}
interval("p5"); // => { name: '5P', semitones: 7, ...}
```

Transpose notes and calculate intervals:

```js
import { transpose, distance } from "@tonaljs/core";
transpose("C4", "5P"); // => "G4"
distance("C4", "G4"); // => "5P"
```

## API

### `note(name: string) => Note`

Given a note name, it returns an object with the following properties:

- name: the note name
- pc: the pitch class name
- letter: the note letter
- step: the letter number (0..6)
- acc: the note accidentals
- alt: the accidental number (..., -1 = 'b', 0 = '', 1 = '#', ...)
- oct: the octave (or null if not present)
- chroma: the note chroma (0..11)
- midi: the note midi or null if octave is not present
- freq: the note frequency in Hertzes, or null if the octave is note present

Example:

```js
note("ab4");
// =>
// {
//   name: "Ab4",
//   pc: "Ab",
//   letter: "A",
//   acc: "b",
//   step: 5,
//   alt: -1,
//   oct: 4,
//   chroma: 8,
//   midi: 68,
//   freq: 415.3046975799451,
// }
```

This function always returns an object:

```js
note("hello"); // => { empty: true, name: "" }
```

### `interval(name: string) => Interval`

Given an interval name, ite returns an object with the following properties:

- name: the interval name
- type: perfectable | majorable
- dir: direction: 1 | -1
- num: the interval number
- q: quality (...| 'dd' | 'd' | 'm' | 'M' | 'A' | ...)
- alt: the quality number as a number
- oct: the number of octaves it spans
- semitones: the number of semitones it spans
- simple: the simplified number

Example:

```js
interval("4d");
// =>
// {
//   name: "4d",
//   type: "perfectable",
//   dir: 1,
//   num: 4,
//   q: "d",
//   alt: -1,
//   chroma: 4,
//   oct: 0,
//   semitones: 4,
//   simple: 4,
// }
```

This function always returns an object:

```js
interval("hello"); // => { empty: true, name: "" }
```

### `transpose(note: string, interval: string) => string`

Transpose a note by an interval. It returns the note name or "" if not valid parameters.

Examples:

```js
transpose("d3", "3M"); // => "F#3"
transpose("D", "3M"); // => "F#"
["C", "D", "E", "F", "G"].map((pc) => transpose(pc, "M3"));
// => ["E", "F#", "G#", "A", "B"]
```

This function always returns a string:

```js
transpose("one", "two"); // => ""
```

### `distance(from: string, to: string) => string`

Find the distance between two notes. It returns the interval name, or "" if not valid parameters.

Examples:

```js
distance("C3", "E4"); // => "10M"
```

If one of the note is a pitch class, the interval will be simple:

```js
distance("C", "E"); // => "3M"
distance("C", "E4"); // => "3M"
distance("C4", "E"); // => "3M"
```

This function always returns a string:

```js
distance("today", "tomorrow"); // => ""
```

## Want more?

Take a look to [@tonaljs/note](/packages/note) or [@tonaljs/interval](/packages/interval) modules.

## FAQ

#### How do I get the note frequency and midi number?

```js
note("C4").octave; // => 4
note("C4").midi; // => 60
```

#### How do I know if a note name is valid?

```js
note("C4").empty; // => false
note("x").empty; // => true
note("x").name; // => ""
note("x").octave; // => undefined
// remove all invalid note names
[...].map(note).filter(n => !n.empty).map(n => n.name)
```

#### How do I know if two notes are enharmonics?

You can test the midi numbers:

```js
note("Cb4").midi === note("B3").midi;
```

Or better yet, use the `height` property that is also present on pitch classes (in notes without octaves midi property is `null`):

```js
note("Cb").height === note("B").height;
```

### How do I change the octave of a note?

```js
note("Cb4").pc + 5; // => "Cb5"
```

---
_Source: https://npm.io/package/@tonaljs/core · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
