harmonic-entropy

harmonic-entropy

Compute harmonic entropy of a musical interval

Installation

npm i harmonic-entropy

Documentation

Documentation is hosted at the project Github pages.

To generate documentation locally run:

npm run doc

Other resources

You can read about how harmonic entropy relates to musical concodrance in the XenWiki article.

Examples

Compute the entropy graph for the range from 0 cents to 2400 cents (two octaves).

import {
type HarmonicEntropyOptions,
precalculateRatios,
harmonicEntropy
} from 'harmonic-entropy';

const options: HarmonicEntropyOptions = {
N: 10000, // Maximum Benedetti height of rationals to consider (default)
s: 0.01, // Gaussian frequency deviation (default)
a: 1, // Rényi order (defaults to Shanon entropy)
series: 'tenney', // Series of rationals to use (default)
minCents: 0, // Lower bound of tabulation (default)
maxCents: 2400, // Upper bound of tabulation (default)
res: 1, // Tabulation delta in cents (default)
normalize: false, // Boolean flag to normalize the result by Hartley entropy (no normalization by default)
};

// Compute the set of rational numbers to consider.
const ratios = precalculateRatios(options);

// Compute the table of [cents, entropy] pairs. Entropy is measured in natural units.
const table = harmonicEntropy(options, ratios);

// This would be replaced by passing the table your favorite plotting library.
console.log(table);

/*
[
[0, 2.465367706139234],
[1, 2.4695232705775982],
[2, 2.481975530994572],
[3, 2.5026079139822173],
[4, 2.5312627678840913],
[5, 2.5676902925403278],
...
[2399, 3.900196510219676],
[2400, 3.898697709259859],
]
*/

Compute harmonic entropy of individual musical intervals.

import {EntropyCalculator} from 'harmonic-entropy';

const options = {maxCents: 1200};

// Preparing the internal tables takes some time.
const entropy = new EntropyCalculator(options);

// Evaluating entropy is fast.
const pureFifthEntropy = entropy.ofFraction(3/2);
console.log(pureFifthEntropy); // 4.121900707092091

// Tablulated values are linearly interpolated
const majorSixthEntropy = entropy.ofFraction('5/3');
console.log(majorSixthEntropy); // 4.42017406844399

// Intervals measured in cents are also supported in addition to frequency ratios.
const perfectFifthEntropy = entropy.ofCents(700);
console.log(perfectFifthEntropy); // 4.126342260377048

// Store internal tables for later.
const SERIALIZED = JSON.stringify(entropy);

Revive a serialized entropy calculator.

import {EntropyCalculator} from 'harmonic-entropy';

// Obtain SERIALIZED string from previous example.

// Revification is fast.
const entropy = JSON.parse(SERIALIZED, EntropyCalculator.reviver);

// Revived instance works like the original.
const perfectFifthEntropy = entropy.ofCents(700);
console.log(perfectFifthEntropy); // 4.126342260377048