From 5b04f1358dc9b9071d0fca9d522d8df51016a144 Mon Sep 17 00:00:00 2001 From: Anton Duda Date: Wed, 22 Oct 2025 02:06:58 +0300 Subject: [PATCH] Initial --- src/strudel/core/clockworker.js | 161 ++ src/strudel/core/controls.mjs | 2376 ++++++++++++++++ src/strudel/core/cyclist.mjs | 140 + src/strudel/core/drawLine.mjs | 62 + src/strudel/core/euclid.mjs | 221 ++ src/strudel/core/evaluate.mjs | 54 + src/strudel/core/fraction.mjs | 147 + src/strudel/core/hap.mjs | 178 ++ src/strudel/core/index.mjs | 40 + src/strudel/core/logger.mjs | 35 + src/strudel/core/neocyclist.mjs | 105 + src/strudel/core/pattern.mjs | 3626 +++++++++++++++++++++++++ src/strudel/core/pick.mjs | 213 ++ src/strudel/core/repl.mjs | 279 ++ src/strudel/core/signal.mjs | 839 ++++++ src/strudel/core/speak.mjs | 38 + src/strudel/core/state.mjs | 28 + src/strudel/core/time.mjs | 11 + src/strudel/core/timespan.mjs | 117 + src/strudel/core/ui.mjs | 32 + src/strudel/core/util.mjs | 499 ++++ src/strudel/core/value.mjs | 64 + src/strudel/core/zyklus.mjs | 54 + src/strudel/draw/animate.mjs | 69 + src/strudel/draw/color.mjs | 175 ++ src/strudel/draw/draw.mjs | 219 ++ src/strudel/draw/index.mjs | 6 + src/strudel/draw/pianoroll.mjs | 316 +++ src/strudel/draw/pitchwheel.mjs | 144 + src/strudel/draw/spiral.mjs | 157 ++ src/strudel/midi/index.mjs | 3 + src/strudel/midi/midi.mjs | 511 ++++ src/strudel/mini/index.mjs | 2 + src/strudel/mini/krill-parser.js | 2497 +++++++++++++++++ src/strudel/mini/krill.pegjs | 303 +++ src/strudel/mini/mini.mjs | 261 ++ src/strudel/soundfonts/convert.js | 13 + src/strudel/soundfonts/fontloader.mjs | 184 ++ src/strudel/soundfonts/gm.mjs | 1787 ++++++++++++ src/strudel/soundfonts/index.mjs | 6 + src/strudel/soundfonts/list.mjs | 2028 ++++++++++++++ src/strudel/soundfonts/sfumato.mjs | 49 + src/strudel/tonal/index.mjs | 9 + src/strudel/tonal/ireal.mjs | 523 ++++ src/strudel/tonal/tonal.mjs | 306 +++ src/strudel/tonal/tonleiter.mjs | 238 ++ src/strudel/tonal/voicings.mjs | 251 ++ src/strudel/transpiler/index.mjs | 5 + src/strudel/transpiler/transpiler.mjs | 329 +++ src/strudel/webaudio/index.mjs | 11 + src/strudel/webaudio/scope.mjs | 149 + src/strudel/webaudio/spectrum.mjs | 69 + src/strudel/webaudio/supradough.mjs | 130 + src/strudel/webaudio/webaudio.mjs | 40 + src/strudel/xen/index.mjs | 4 + src/strudel/xen/tune.mjs | 20 + src/strudel/xen/tunejs.js | 244 ++ src/strudel/xen/xen.mjs | 64 + 58 files changed, 20441 insertions(+) create mode 100644 src/strudel/core/clockworker.js create mode 100644 src/strudel/core/controls.mjs create mode 100644 src/strudel/core/cyclist.mjs create mode 100644 src/strudel/core/drawLine.mjs create mode 100644 src/strudel/core/euclid.mjs create mode 100644 src/strudel/core/evaluate.mjs create mode 100644 src/strudel/core/fraction.mjs create mode 100644 src/strudel/core/hap.mjs create mode 100644 src/strudel/core/index.mjs create mode 100644 src/strudel/core/logger.mjs create mode 100644 src/strudel/core/neocyclist.mjs create mode 100644 src/strudel/core/pattern.mjs create mode 100644 src/strudel/core/pick.mjs create mode 100644 src/strudel/core/repl.mjs create mode 100644 src/strudel/core/signal.mjs create mode 100644 src/strudel/core/speak.mjs create mode 100644 src/strudel/core/state.mjs create mode 100644 src/strudel/core/time.mjs create mode 100644 src/strudel/core/timespan.mjs create mode 100644 src/strudel/core/ui.mjs create mode 100644 src/strudel/core/util.mjs create mode 100644 src/strudel/core/value.mjs create mode 100644 src/strudel/core/zyklus.mjs create mode 100644 src/strudel/draw/animate.mjs create mode 100644 src/strudel/draw/color.mjs create mode 100644 src/strudel/draw/draw.mjs create mode 100644 src/strudel/draw/index.mjs create mode 100644 src/strudel/draw/pianoroll.mjs create mode 100644 src/strudel/draw/pitchwheel.mjs create mode 100644 src/strudel/draw/spiral.mjs create mode 100644 src/strudel/midi/index.mjs create mode 100644 src/strudel/midi/midi.mjs create mode 100644 src/strudel/mini/index.mjs create mode 100644 src/strudel/mini/krill-parser.js create mode 100644 src/strudel/mini/krill.pegjs create mode 100644 src/strudel/mini/mini.mjs create mode 100644 src/strudel/soundfonts/convert.js create mode 100644 src/strudel/soundfonts/fontloader.mjs create mode 100644 src/strudel/soundfonts/gm.mjs create mode 100644 src/strudel/soundfonts/index.mjs create mode 100644 src/strudel/soundfonts/list.mjs create mode 100644 src/strudel/soundfonts/sfumato.mjs create mode 100644 src/strudel/tonal/index.mjs create mode 100644 src/strudel/tonal/ireal.mjs create mode 100644 src/strudel/tonal/tonal.mjs create mode 100644 src/strudel/tonal/tonleiter.mjs create mode 100644 src/strudel/tonal/voicings.mjs create mode 100644 src/strudel/transpiler/index.mjs create mode 100644 src/strudel/transpiler/transpiler.mjs create mode 100644 src/strudel/webaudio/index.mjs create mode 100644 src/strudel/webaudio/scope.mjs create mode 100644 src/strudel/webaudio/spectrum.mjs create mode 100644 src/strudel/webaudio/supradough.mjs create mode 100644 src/strudel/webaudio/webaudio.mjs create mode 100644 src/strudel/xen/index.mjs create mode 100644 src/strudel/xen/tune.mjs create mode 100644 src/strudel/xen/tunejs.js create mode 100644 src/strudel/xen/xen.mjs diff --git a/src/strudel/core/clockworker.js b/src/strudel/core/clockworker.js new file mode 100644 index 0000000..77a4536 --- /dev/null +++ b/src/strudel/core/clockworker.js @@ -0,0 +1,161 @@ +// eslint-disable-next-line no-undef +// TODO: swap below line with above one when firefox supports esm imports in service workers +// see https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker?retiredLocale=de#browser_compatibility +// import createClock from './zyklus.mjs'; + +function getTime() { + const seconds = performance.now() * 0.001; + return seconds; + // return Math.round(seconds * precision) / precision; +} + +let num_cycles_at_cps_change = 0; +let num_ticks_since_cps_change = 0; +let num_seconds_at_cps_change = 0; +let cps = 0.5; +// {id: {started: boolean}} +const clients = new Map(); +const duration = 0.1; +const channel = new BroadcastChannel('strudeltick'); + +const sendMessage = (type, payload) => { + channel.postMessage({ type, payload }); +}; + +const sendTick = (phase, duration, tick, time) => { + const num_seconds_since_cps_change = num_ticks_since_cps_change * duration; + const tickdeadline = phase - time; + const lastTick = time + tickdeadline; + const num_cycles_since_cps_change = num_seconds_since_cps_change * cps; + const begin = num_cycles_at_cps_change + num_cycles_since_cps_change; + const secondsSinceLastTick = time - lastTick - duration; + const eventLength = duration * cps; + const end = begin + eventLength; + const cycle = begin + secondsSinceLastTick * cps; + + sendMessage('tick', { + begin, + end, + cps, + time, + cycle, + }); + num_ticks_since_cps_change++; +}; + +//create clock method from zyklus +const clock = createClock(getTime, sendTick, duration); +let started = false; + +const startClock = (id) => { + clients.set(id, { started: true }); + if (started) { + return; + } + clock.start(); + started = true; +}; +const stopClock = async (id) => { + clients.set(id, { started: false }); + + const otherClientStarted = Array.from(clients.values()).some((c) => c.started); + //dont stop the clock if other instances are running... + if (!started || otherClientStarted) { + return; + } + + clock.stop(); + setCycle(0); + started = false; +}; + +const setCycle = (cycle) => { + num_ticks_since_cps_change = 0; + num_cycles_at_cps_change = cycle; +}; + +const processMessage = (message) => { + const { type, payload } = message; + + switch (type) { + case 'cpschange': { + if (payload.cps !== cps) { + const num_seconds_since_cps_change = num_ticks_since_cps_change * duration; + num_cycles_at_cps_change = num_cycles_at_cps_change + num_seconds_since_cps_change * cps; + num_seconds_at_cps_change = num_seconds_at_cps_change + num_seconds_since_cps_change; + cps = payload.cps; + num_ticks_since_cps_change = 0; + } + break; + } + case 'setcycle': { + setCycle(payload.cycle); + break; + } + case 'toggle': { + if (payload.started) { + startClock(message.id); + } else { + stopClock(message.id); + } + break; + } + } +}; + +self.onconnect = function (e) { + // the incoming port + const port = e.ports[0]; + + port.addEventListener('message', function (e) { + processMessage(e.data); + }); + port.start(); // Required when using addEventListener. Otherwise called implicitly by onmessage setter. +}; + +// used to consistently schedule events, for use in a service worker - see +function createClock( + getTime, + callback, // called slightly before each cycle + duration = 0.05, // duration of each cycle + interval = 0.1, // interval between callbacks + overlap = 0.1, // overlap between callbacks +) { + let tick = 0; // counts callbacks + let phase = 0; // next callback time + let precision = 10 ** 4; // used to round phase + let minLatency = 0.01; + const setDuration = (setter) => (duration = setter(duration)); + overlap = overlap || interval / 2; + const onTick = () => { + const t = getTime(); + const lookahead = t + interval + overlap; // the time window for this tick + if (phase === 0) { + phase = t + minLatency; + } + // callback as long as we're inside the lookahead + while (phase < lookahead) { + phase = Math.round(phase * precision) / precision; + phase >= t && callback(phase, duration, tick, t); + phase < t && console.log('TOO LATE', phase); // what if latency is added from outside? + phase += duration; // increment phase by duration + tick++; + } + }; + let intervalID; + const start = () => { + clear(); // just in case start was called more than once + onTick(); + intervalID = setInterval(onTick, interval * 1000); + }; + const clear = () => intervalID !== undefined && clearInterval(intervalID); + const pause = () => clear(); + const stop = () => { + tick = 0; + phase = 0; + clear(); + }; + const getPhase = () => phase; + // setCallback + return { setDuration, start, stop, pause, duration, interval, getPhase, minLatency }; +} diff --git a/src/strudel/core/controls.mjs b/src/strudel/core/controls.mjs new file mode 100644 index 0000000..3475fc2 --- /dev/null +++ b/src/strudel/core/controls.mjs @@ -0,0 +1,2376 @@ +/* +controls.mjs - Registers audio controls for pattern manipulation and effects. +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { Pattern, register, reify } from './pattern.mjs'; + +export function createParam(names) { + let isMulti = Array.isArray(names); + names = !isMulti ? [names] : names; + const name = names[0]; + + // todo: make this less confusing + const withVal = (xs) => { + let bag; + // check if we have an object with an unnamed control (.value) + if (typeof xs === 'object' && xs.value !== undefined) { + bag = { ...xs }; // grab props that are already there + xs = xs.value; // grab the unnamed control for this one + delete bag.value; + } + if (isMulti && Array.isArray(xs)) { + const result = bag || {}; + xs.forEach((x, i) => { + if (i < names.length) { + result[names[i]] = x; + } + }); + return result; + } else if (bag) { + bag[name] = xs; + return bag; + } else { + return { [name]: xs }; + } + }; + + // todo: make this less confusing + const func = function (value, pat) { + if (!pat) { + return reify(value).withValue(withVal); + } + if (typeof value === 'undefined') { + return pat.fmap(withVal); + } + return pat.set(reify(value).withValue(withVal)); + }; + Pattern.prototype[name] = function (value) { + return func(value, this); + }; + return func; +} + +// maps control alias names to the "main" control name +const controlAlias = new Map(); + +export function isControlName(name) { + return controlAlias.has(name); +} + +export function registerControl(names, ...aliases) { + const name = Array.isArray(names) ? names[0] : names; + let bag = {}; + bag[name] = createParam(names); + controlAlias.set(name, name); + aliases.forEach((alias) => { + bag[alias] = bag[name]; + controlAlias.set(alias, name); + Pattern.prototype[alias] = Pattern.prototype[name]; + }); + return bag; +} + +/** + * Select a sound / sample by name. When using mininotation, you can also optionally supply 'n' and 'gain' parameters + * separated by ':'. + * + * @name s + * @param {string | Pattern} sound The sound / pattern of sounds to pick + * @synonyms sound + * @example + * s("bd hh") + * @example + * s("bd:0 bd:1 bd:0:0.3 bd:1:1.4") + * + */ +export const { s, sound } = registerControl(['s', 'n', 'gain'], 'sound'); + +/** + * Position in the wavetable of the wavetable oscillator + * + * @name wt + * @param {number | Pattern} position Position in the wavetable from 0 to 1 + * @synonyms wavetablePosition + * @example + * s("squelch").bank("wt_digital").seg(8).note("F1").wt("0 0.25 0.5 0.75 1") + */ +export const { wt, wavetablePosition } = registerControl('wt', 'wavetablePosition'); + +/** + * Amount of envelope applied wavetable oscillator's position envelope + * + * @name wtenv + * @param {number | Pattern} amount between 0 and 1 + */ +export const { wtenv } = registerControl('wtenv'); +/** + * Attack time of the wavetable oscillator's position envelope + * + * @name wtattack + * @synonyms wtatt + * @param {number | Pattern} time attack time in seconds + */ +export const { wtattack, wtatt } = registerControl('wtattack', 'wtatt'); + +/** + * Decay time of the wavetable oscillator's position envelope + * + * @name wtdecay + * @synonyms wtdec + * @param {number | Pattern} time decay time in seconds + */ +export const { wtdecay, wtdec } = registerControl('wtdecay', 'wtdec'); + +/** + * Sustain time of the wavetable oscillator's position envelope + * + * @name wtsustain + * @synonyms wtsus + * @param {number | Pattern} gain sustain level (0 to 1) + */ +export const { wtsustain, wtsus } = registerControl('wtsustain', 'wtsus'); + +/** + * Release time of the wavetable oscillator's position envelope + * + * @name wtrelease + * @synonyms wtrel + * @param {number | Pattern} time release time in seconds + */ +export const { wtrelease, wtrel } = registerControl('wtrelease', 'wtrel'); + +/** + * Rate of the LFO for the wavetable oscillator's position + * + * @name wtrate + * @param {number | Pattern} rate rate in hertz + */ +export const { wtrate } = registerControl('wtrate'); +/** + * cycle synced rate of the LFO for the wavetable oscillator's position + * + * @name wtsync + * @param {number | Pattern} rate rate in cycles + */ +export const { wtsync } = registerControl('wtsync'); + +/** + * Depth of the LFO for the wavetable oscillator's position + * + * @name wtdepth + * @param {number | Pattern} depth depth of modulation + */ +export const { wtdepth } = registerControl('wtdepth'); + +/** + * Shape of the LFO for the wavetable oscillator's position + * + * @name wtshape + * @param {number | Pattern} shape Shape of the lfo (0, 1, 2, ..) + */ +export const { wtshape } = registerControl('wtshape'); + +/** + * DC offset of the LFO for the wavetable oscillator's position + * + * @name wtdc + * @param {number | Pattern} dcoffset dc offset. set to 0 for unipolar + */ +export const { wtdc } = registerControl('wtdc'); + +/** + * Skew of the LFO for the wavetable oscillator's position + * + * @name wtskew + * @param {number | Pattern} skew How much to bend the LFO shape + */ +export const { wtskew } = registerControl('wtskew'); + +/** + * Amount of warp (alteration of the waveform) to apply to the wavetable oscillator + * + * @name warp + * @param {number | Pattern} amount Warp of the wavetable from 0 to 1 + * @synonyms wavetableWarp + * @example + * s("basique").bank("wt_digital").seg(8).note("F1").warp("0 0.25 0.5 0.75 1") + * .warpmode("spin") + */ +export const { warp, wavetableWarp } = registerControl('warp', 'wavetableWarp'); + +/** + * Attack time of the wavetable oscillator's warp envelope + * + * @name warpattack + * @synonyms warpatt + * @param {number | Pattern} time attack time in seconds + */ +export const { warpattack, warpatt } = registerControl('warpattack', 'warpatt'); + +/** + * Decay time of the wavetable oscillator's warp envelope + * + * @name warpdecay + * @synonyms warpdec + * @param {number | Pattern} time decay time in seconds + */ +export const { warpdecay, warpdec } = registerControl('warpdecay', 'warpdec'); + +/** + * Sustain time of the wavetable oscillator's warp envelope + * + * @name warpsustain + * @synonyms warpsus + * @param {number | Pattern} gain sustain level (0 to 1) + */ +export const { warpsustain, warpsus } = registerControl('warpsustain', 'warpsus'); + +/** + * Release time of the wavetable oscillator's warp envelope + * + * @name warprelease + * @synonyms warprel + * @param {number | Pattern} time release time in seconds + */ +export const { warprelease, warprel } = registerControl('warprelease', 'warprel'); + +/** + * Rate of the LFO for the wavetable oscillator's warp + * + * @name warprate + * @param {number | Pattern} rate rate in hertz + */ +export const { warprate } = registerControl('warprate'); + +/** + * Depth of the LFO for the wavetable oscillator's warp + * + * @name warpdepth + * @param {number | Pattern} depth depth of modulation + */ +export const { warpdepth } = registerControl('warpdepth'); + +/** + * Shape of the LFO for the wavetable oscillator's warp + * + * @name warpshape + * @param {number | Pattern} shape Shape of the lfo (0, 1, 2, ..) + */ +export const { warpshape } = registerControl('warpshape'); + +/** + * DC offset of the LFO for the wavetable oscillator's warp + * + * @name warpdc + * @param {number | Pattern} dcoffset dc offset. set to 0 for unipolar + */ +export const { warpdc } = registerControl('warpdc'); + +/** + * Skew of the LFO for the wavetable oscillator's warp + * + * @name warpskew + * @param {number | Pattern} skew How much to bend the LFO shape + */ +export const { warpskew } = registerControl('warpskew'); + +/** + * Type of warp (alteration of the waveform) to apply to the wavetable oscillator. + * + * The current options are: none, asym, bendp, bendm, bendmp, sync, quant, fold, pwm, orbit, + * spin, chaos, primes, binary, brownian, reciprocal, wormhole, logistic, sigmoid, fractal, flip + * + * @name warpmode + * @param {number | string | Pattern} mode Warp mode + * @synonyms wavetableWarpMode + * @example + * s("morgana").bank("wt_digital").seg(8).note("F1").warp("0 0.25 0.5 0.75 1") + * .warpmode("*2") + * + */ +export const { warpmode, wavetableWarpMode } = registerControl('warpmode', 'wavetableWarpMode'); + +/** + * Amount of randomness of the initial phase of the wavetable oscillator. + * + * @name wtphaserand + * @param {number | Pattern} amount Randomness of the initial phase. Between 0 (not random) and 1 (fully random) + * @synonyms wavetablePhaseRand + * @example + * s("basique").bank("wt_digital").seg(16).wtphaserand("<0 1>") + * + */ +export const { wtphaserand, wavetablePhaseRand } = registerControl('wtphaserand', 'wavetablePhaseRand'); + +/** + * Amount of envelope applied wavetable oscillator's position envelope + * + * @name warpenv + * @param {number | Pattern} amount between 0 and 1 + */ +export const { warpenv } = registerControl('warpenv'); + +/** + * cycle synced rate of the LFO for the wavetable warp position + * + * @name warpsync + * @param {number | Pattern} rate rate in cycles + */ +export const { warpsync } = registerControl('warpsync'); + +/** + * Define a custom webaudio node to use as a sound source. + * + * @name source + * @synonyms src + * @param {function} getSource + * @synonyms src + * + */ +export const { source, src } = registerControl('source', 'src'); +/** + * Selects the given index from the sample map. + * Numbers too high will wrap around. + * `n` can also be used to play midi numbers, but it is recommended to use `note` instead. + * + * @name n + * @param {number | Pattern} value sample index starting from 0 + * @example + * s("bd sd [~ bd] sd,hh*6").n("<0 1>") + */ +// also see https://codeberg.org/uzu/strudel/pulls/63 +export const { n } = registerControl('n'); +/** + * Plays the given note name or midi number. A note name consists of + * + * - a letter (a-g or A-G) + * - optional accidentals (b or #) + * - optional (possibly negative) octave number (0-9). Defaults to 3 + * + * Examples of valid note names: `c`, `bb`, `Bb`, `f#`, `c3`, `A4`, `Eb2`, `c#5` + * + * You can also use midi numbers instead of note names, where 69 is mapped to A4 440Hz in 12EDO. + * + * @name note + * @example + * note("c a f e") + * @example + * note("c4 a4 f4 e4") + * @example + * note("60 69 65 64") + * @example + * note("fbb1 a#0 cbbb-1 e##-2").sound("saw") + */ +export const { note } = registerControl(['note', 'n']); + +/** + * A pattern of numbers that speed up (or slow down) samples while they play. Currently only supported by osc / superdirt. + * + * @name accelerate + * @param {number | Pattern} amount acceleration. + * @superdirtOnly + * @example + * s("sax").accelerate("<0 1 2 4 8 16>").slow(2).osc() + * + */ +export const { accelerate } = registerControl('accelerate'); +/** + * Sets the velocity from 0 to 1. Is multiplied together with gain. + * + * @name velocity + * @example + * s("hh*8") + * .gain(".4!2 1 .4!2 1 .4 1") + * .velocity(".4 1") + */ +export const { velocity } = registerControl('velocity'); +/** + * Controls the gain by an exponential amount. + * + * @name gain + * @param {number | Pattern} amount gain. + * @example + * s("hh*8").gain(".4!2 1 .4!2 1 .4 1").fast(2) + * + */ +export const { gain } = registerControl('gain'); +/** + * Gain applied after all effects have been processed. + * + * @name postgain + * @example + * s("bd sd [~ bd] sd,hh*8") + * .compressor("-20:20:10:.002:.02").postgain(1.5) + * + */ +export const { postgain } = registerControl('postgain'); +/** + * Like `gain`, but linear. + * + * @name amp + * @param {number | Pattern} amount gain. + * @superdirtOnly + * @example + * s("bd*8").amp(".1*2 .5 .1*2 .5 .1 .5").osc() + * + */ +export const { amp } = registerControl('amp'); +/** + * Amplitude envelope attack time: Specifies how long it takes for the sound to reach its peak value, relative to the onset. + * + * @name attack + * @param {number | Pattern} attack time in seconds. + * @synonyms att + * @example + * note("c3 e3 f3 g3").attack("<0 .1 .5>") + * + */ +export const { attack, att } = registerControl('attack', 'att'); + +/** + * Sets the Frequency Modulation Harmonicity Ratio. + * Controls the timbre of the sound. + * Whole numbers and simple ratios sound more natural, + * while decimal numbers and complex ratios sound metallic. + * + * @name fmh + * @param {number | Pattern} harmonicity + * @example + * note("c e g b g e") + * .fm(4) + * .fmh("<1 2 1.5 1.61>") + * ._scope() + * + */ +export const { fmh } = registerControl(['fmh', 'fmi'], 'fmh'); +/** + * Sets the Frequency Modulation of the synth. + * Controls the modulation index, which defines the brightness of the sound. + * + * @name fm + * @param {number | Pattern} brightness modulation index + * @synonyms fmi + * @example + * note("c e g b g e") + * .fm("<0 1 2 8 32>") + * ._scope() + * + */ +export const { fmi, fm } = registerControl(['fmi', 'fmh'], 'fm'); +// fm envelope +/** + * Ramp type of fm envelope. Exp might be a bit broken.. + * + * @name fmenv + * @param {number | Pattern} type lin | exp + * @example + * note("c e g b g e") + * .fm(4) + * .fmdecay(.2) + * .fmsustain(0) + * .fmenv("") + * ._scope() + * + */ +export const { fmenv } = registerControl('fmenv'); +/** + * Attack time for the FM envelope: time it takes to reach maximum modulation + * + * @name fmattack + * @param {number | Pattern} time attack time + * @example + * note("c e g b g e") + * .fm(4) + * .fmattack("<0 .05 .1 .2>") + * ._scope() + * + */ +export const { fmattack } = registerControl('fmattack'); + +/** + * Waveform of the fm modulator + * + * @name fmwave + * @param {number | Pattern} wave waveform + * @example + * n("0 1 2 3".fast(4)).scale("d:minor").s("sine").fmwave("").fm(4).fmh(2.01) + * @example + * n("0 1 2 3".fast(4)).chord("").voicing().s("sawtooth").fmwave("brown").fm(.6) + * + */ +export const { fmwave } = registerControl('fmwave'); + +/** + * Decay time for the FM envelope: seconds until the sustain level is reached after the attack phase. + * + * @name fmdecay + * @param {number | Pattern} time decay time + * @example + * note("c e g b g e") + * .fm(4) + * .fmdecay("<.01 .05 .1 .2>") + * .fmsustain(.4) + * ._scope() + * + */ +export const { fmdecay } = registerControl('fmdecay'); +/** + * Sustain level for the FM envelope: how much modulation is applied after the decay phase + * + * @name fmsustain + * @param {number | Pattern} level sustain level + * @example + * note("c e g b g e") + * .fm(4) + * .fmdecay(.1) + * .fmsustain("<1 .75 .5 0>") + * ._scope() + * + */ +export const { fmsustain } = registerControl('fmsustain'); +// these are not really useful... skipping for now +export const { fmrelease } = registerControl('fmrelease'); +export const { fmvelocity } = registerControl('fmvelocity'); + +/** + * Select the sound bank to use. To be used together with `s`. The bank name (+ "_") will be prepended to the value of `s`. + * + * @name bank + * @param {string | Pattern} bank the name of the bank + * @example + * s("bd sd [~ bd] sd").bank('RolandTR909') // = s("RolandTR909_bd RolandTR909_sd") + * + */ +export const { bank } = registerControl('bank'); + +/** + * mix control for the chorus effect + * + * @name chorus + * @param {string | Pattern} chorus mix amount between 0 and 1 + * @example + * note("d d a# a").s("sawtooth").chorus(.5) + * + */ +export const { chorus } = registerControl('chorus'); + +// analyser node send amount 0 - 1 (used by scope) +export const { analyze } = registerControl('analyze'); +// fftSize of analyser +export const { fft } = registerControl('fft'); + +/** + * Amplitude envelope decay time: the time it takes after the attack time to reach the sustain level. + * Note that the decay is only audible if the sustain value is lower than 1. + * + * @name decay + * @param {number | Pattern} time decay time in seconds + * @synonyms dec + * @example + * note("c3 e3 f3 g3").decay("<.1 .2 .3 .4>").sustain(0) + * + */ +export const { decay, dec } = registerControl('decay', 'dec'); +/** + * Amplitude envelope sustain level: The level which is reached after attack / decay, being sustained until the offset. + * + * @name sustain + * @param {number | Pattern} gain sustain level between 0 and 1 + * @synonyms sus + * @example + * note("c3 e3 f3 g3").decay(.2).sustain("<0 .1 .4 .6 1>") + * + */ +export const { sustain, sus } = registerControl('sustain', 'sus'); +/** + * Amplitude envelope release time: The time it takes after the offset to go from sustain level to zero. + * + * @name release + * @param {number | Pattern} time release time in seconds + * @synonyms rel + * @example + * note("c3 e3 g3 c4").release("<0 .1 .4 .6 1>/2") + * + */ +export const { release, rel } = registerControl('release', 'rel'); +export const { hold } = registerControl('hold'); +// TODO: in tidal, it seems to be normalized +/** + * Sets the center frequency of the **b**and-**p**ass **f**ilter. When using mininotation, you + * can also optionally supply the 'bpq' parameter separated by ':'. + * + * @name bpf + * @param {number | Pattern} frequency center frequency + * @synonyms bandf, bp + * @example + * s("bd sd [~ bd] sd,hh*6").bpf("<1000 2000 4000 8000>") + * + */ +export const { bandf, bpf, bp } = registerControl(['bandf', 'bandq', 'bpenv'], 'bpf', 'bp'); +// TODO: in tidal, it seems to be normalized +/** + * Sets the **b**and-**p**ass **q**-factor (resonance). + * + * @name bpq + * @param {number | Pattern} q q factor + * @synonyms bandq + * @example + * s("bd sd [~ bd] sd").bpf(500).bpq("<0 1 2 3>") + * + */ +// currently an alias of 'bandq' https://codeberg.org/uzu/strudel/issues/496 +// ['bpq'], +export const { bandq, bpq } = registerControl('bandq', 'bpq'); +/** + * A pattern of numbers from 0 to 1. Skips the beginning of each sample, e.g. `0.25` to cut off the first quarter from each sample. + * + * @memberof Pattern + * @name begin + * @param {number | Pattern} amount between 0 and 1, where 1 is the length of the sample + * @example + * samples({ rave: 'rave/AREUREADY.wav' }, 'github:tidalcycles/dirt-samples') + * s("rave").begin("<0 .25 .5 .75>").fast(2) + * + */ +export const { begin } = registerControl('begin'); +/** + * The same as .begin, but cuts off the end off each sample. + * + * @memberof Pattern + * @name end + * @param {number | Pattern} length 1 = whole sample, .5 = half sample, .25 = quarter sample etc.. + * @example + * s("bd*2,oh*4").end("<.1 .2 .5 1>").fast(2) + * + */ +export const { end } = registerControl('end'); +/** + * Loops the sample. + * Note that the tempo of the loop is not synced with the cycle tempo. + * To change the loop region, use loopBegin / loopEnd. + * + * @name loop + * @param {number | Pattern} on If 1, the sample is looped + * @example + * s("casio").loop(1) + * + */ +export const { loop } = registerControl('loop'); +/** + * Begin to loop at a specific point in the sample (inbetween `begin` and `end`). + * Note that the loop point must be inbetween `begin` and `end`, and before `loopEnd`! + * Note: Samples starting with wt_ will automatically loop! (wt = wavetable) + * + * @name loopBegin + * @param {number | Pattern} time between 0 and 1, where 1 is the length of the sample + * @synonyms loopb + * @example + * s("space").loop(1) + * .loopBegin("<0 .125 .25>")._scope() + */ +export const { loopBegin, loopb } = registerControl('loopBegin', 'loopb'); +/** + * + * End the looping section at a specific point in the sample (inbetween `begin` and `end`). + * Note that the loop point must be inbetween `begin` and `end`, and after `loopBegin`! + * + * @name loopEnd + * @param {number | Pattern} time between 0 and 1, where 1 is the length of the sample + * @synonyms loope + * @example + * s("space").loop(1) + * .loopEnd("<1 .75 .5 .25>")._scope() + */ +export const { loopEnd, loope } = registerControl('loopEnd', 'loope'); +/** + * Bit crusher effect. + * + * @name crush + * @param {number | Pattern} depth between 1 (for drastic reduction in bit-depth) to 16 (for barely no reduction). + * @example + * s(",hh*3").fast(2).crush("<16 8 7 6 5 4 3 2>") + * + */ +// ['clhatdecay'], +export const { crush } = registerControl('crush'); +/** + * Fake-resampling for lowering the sample rate. Caution: This effect seems to only work in chromium based browsers + * + * @name coarse + * @param {number | Pattern} factor 1 for original 2 for half, 3 for a third and so on. + * @example + * s("bd sd [~ bd] sd,hh*8").coarse("<1 4 8 16 32>") + * + */ +export const { coarse } = registerControl('coarse'); + +/** + * Modulate the amplitude of a sound with a continuous waveform + * + * @name tremolo + * @synonyms trem + * @param {number | Pattern} speed modulation speed in HZ + * @example + * note("d d d# d".fast(4)).s("supersaw").tremolo("<3 2 100> ").tremoloskew("<.5>") + * + */ +export const { tremolo } = registerControl(['tremolo', 'tremolodepth', 'tremoloskew', 'tremolophase'], 'trem'); + +/** + * Modulate the amplitude of a sound with a continuous waveform + * + * @name tremolosync + * @synonyms tremsync + * @param {number | Pattern} cycles modulation speed in cycles + * @example + * note("d d d# d".fast(4)).s("supersaw").tremolosync("4").tremoloskew("<1 .5 0>") + * + */ +export const { tremolosync } = registerControl( + ['tremolosync', 'tremolodepth', 'tremoloskew', 'tremolophase'], + 'tremsync', +); + +/** + * Depth of amplitude modulation + * + * @name tremolodepth + * @synonyms tremdepth + * @param {number | Pattern} depth + * @example + * note("a1 a1 a#1 a1".fast(4)).s("pulse").tremsync(4).tremolodepth("<1 2 .7>") + * + */ +export const { tremolodepth } = registerControl('tremolodepth', 'tremdepth'); +/** + * Alter the shape of the modulation waveform + * + * @name tremoloskew + * @synonyms tremskew + * @param {number | Pattern} amount between 0 & 1, the shape of the waveform + * @example + * note("{f a c e}%16").s("sawtooth").tremsync(4).tremoloskew("<.5 0 1>") + * + */ +export const { tremoloskew } = registerControl('tremoloskew', 'tremskew'); + +/** + * Alter the phase of the modulation waveform + * + * @name tremolophase + * @synonyms tremphase + * @param {number | Pattern} offset the offset in cycles of the modulation + * @example + * note("{f a c e}%16").s("sawtooth").tremsync(4).tremolophase("<0 .25 .66>") + * + */ +export const { tremolophase } = registerControl('tremolophase', 'tremphase'); + +/** + * Shape of amplitude modulation + * + * @name tremoloshape + * @synonyms tremshape + * @param {number | Pattern} shape tri | square | sine | saw | ramp + * @example + * note("{f g c d}%16").tremsync(4).tremoloshape("").s("sawtooth") + * + */ +export const { tremoloshape } = registerControl('tremoloshape', 'tremshape'); +/** + * Filter overdrive for supported filter types + * + * @name drive + * @param {number | Pattern} amount + * @example + * note("{f g g c d a a#}%16".sub(17)).s("supersaw").lpenv(8).lpf(150).lpq(.8).ftype('ladder').drive("<.5 4>") + * + */ +export const { drive } = registerControl('drive'); + +/** + * Modulate the amplitude of an orbit to create a "sidechain" like effect. + * + * Can be applied to multiple orbits with the ':' mininotation, e.g. `duckorbit("2:3")` + * + * @name duckorbit + * @synonyms duck + * @param {number | Pattern} orbit target orbit + * @example + * $: n(run(16)).scale("c:minor:pentatonic").s("sawtooth").delay(.7).orbit(2) + * $: s("bd:4!4").beat("0,4,8,11,14",16).duckorbit(2).duckattack(0.2).duckdepth(1) + * @example + * $: n(run(16)).scale("c:minor:pentatonic").s("sawtooth").delay(.7).orbit(2) + * $: s("hh*16").orbit(3) + * $: s("bd:4!4").beat("0,4,8,11,14",16).duckorbit("2:3").duckattack(0.2).duckdepth(1) + * + */ +export const { duck } = registerControl('duckorbit', 'duck'); + +/** + * The amount of ducking applied to target orbit + * + * Can vary across orbits with the ':' mininotation, e.g. `duckdepth("0.3:0.1")`. + * Note: this requires first applying the effect to multiple orbits with e.g. `duckorbit("2:3")`. + * + * @name duckdepth + * @param {number | Pattern} depth depth of modulation from 0 to 1 + * @example + * stack( n(run(8)).scale("c:minor").s("sawtooth").delay(.7).orbit(2), s("bd:4!4").beat("0,4,8,11,14",16).duckorbit(2).duckattack(0.2).duckdepth("<1 .9 .6 0>")) + * @example + * $: n(run(16)).scale("c:minor:pentatonic").s("sawtooth").delay(.7).orbit(2) + * $: s("hh*16").orbit(3) + * $: s("bd:4!4").beat("0,4,8,11,14",16).duckorbit("2:3").duckattack(0.2).duckdepth("1:0.5") + * + */ +export const { duckdepth } = registerControl('duckdepth'); + +/** + * The time required for the ducked signal(s) to reach their lowest volume. + * Can be used to prevent clicking or for creative rhythmic effects. + * + * Can vary across orbits with the ':' mininotation, e.g. `duckonset("0:0.003")`. + * Note: this requires first applying the effect to multiple orbits with e.g. `duckorbit("2:3")`. + * + * @name duckonset + * @synonyms duckons + * + * @param {number | Pattern} time The onset time in seconds + * @example + * // Clicks + * sound: freq("63.2388").s("sine").orbit(2).gain(4) + * duckerWithClick: s("bd*4").duckorbit(2).duckattack(0.3).duckonset(0).postgain(0) + * @example + * // No clicks + * sound: freq("63.2388").s("sine").orbit(2).gain(4) + * duckerWithoutClick: s("bd*4").duckorbit(2).duckattack(0.3).duckonset(0.01).postgain(0) + * @example + * // Rhythmic + * noise: s("pink").distort("2:1").orbit(4) // used rhythmically with 0.3 onset below + * hhat: s("hh*16").orbit(7) + * ducker: s("bd*4").bank("tr909").duckorbit("4:7").duckonset("0.3:0.003").duckattack(0.25) + * + */ +export const { duckonset } = registerControl('duckonset', 'duckons'); + +/** + * The time required for the ducked signal(s) to return to their normal volume. + * + * Can vary across orbits with the ':' mininotation, e.g. `duckonset("0:0.003")`. + * Note: this requires first applying the effect to multiple orbits with e.g. `duckorbit("2:3")`. + * + * @name duckattack + * @synonyms duckatt + * + * @param {number | Pattern} time The attack time in seconds + * @example + * sound: n(run(8)).scale("c:minor").s("sawtooth").delay(.7).orbit(2) + * ducker: s("bd:4!4").beat("0,4,8,11,14",16).duckorbit(2).duckattack("<0.2 0 0.4>").duckdepth(1) + * @example + * moreduck: n(run(8)).scale("c:minor").s("sawtooth").delay(.7).orbit(2) + * lessduck: s("hh*16").orbit(5) + * ducker: s("bd:4!4").beat("0,4,8,11,14",16).duckorbit("2:5").duckattack("0.4:0.1") + * + */ +export const { duckattack } = registerControl('duckattack', 'duckatt'); + +/** + * Create byte beats with custom expressions + * + * @name byteBeatExpression + * @synonyms bbexpr + * + * @param {number | Pattern} byteBeatExpression bitwise expression for creating bytebeat + * @example + * s("bytebeat").bbexpr('t*(t>>15^t>>66)') + * + */ +export const { byteBeatExpression, bbexpr } = registerControl('byteBeatExpression', 'bbexpr'); + +/** + * Create byte beats with custom expressions + * + * @name byteBeatStartTime + * @synonyms bbst + * + * @param {number | Pattern} byteBeatStartTime in samples (t) + * @example + * note("c3!8".add("{0 0 12 0 7 5 3}%8")).s("bytebeat:5").bbst("<3 1>".mul(10000))._scope() + * + */ +export const { byteBeatStartTime, bbst } = registerControl('byteBeatStartTime', 'bbst'); + +/** + * Allows you to set the output channels on the interface + * + * @name channels + * @synonyms ch + * + * @param {number | Pattern} channels pattern the output channels + * @example + * note("e a d b g").channels("3:4") + * + */ +export const { channels, ch } = registerControl('channels', 'ch'); + +/** + * Controls the pulsewidth of the pulse oscillator + * + * @name pw + * @param {number | Pattern} pulsewidth + * @example + * note("{f a c e}%16").s("pulse").pw(".8:1:.2") + * @example + * n(run(8)).scale("D:pentatonic").s("pulse").pw("0 .75 .5 1") + */ +export const { pw } = registerControl(['pw', 'pwrate', 'pwsweep']); + +/** + * Controls the lfo rate for the pulsewidth of the pulse oscillator + * + * @name pwrate + * @param {number | Pattern} rate + * @example + * n(run(8)).scale("D:pentatonic").s("pulse").pw("0.5").pwrate("<5 .1 25>").pwsweep("<0.3 .8>") + + * + */ +export const { pwrate } = registerControl('pwrate'); + +/** + * Controls the lfo sweep for the pulsewidth of the pulse oscillator + * + * @name pwsweep + * @param {number | Pattern} sweep + * @example + * n(run(8)).scale("D:pentatonic").s("pulse").pw("0.5").pwrate("<5 .1 25>").pwsweep("<0.3 .8>") + * + */ +export const { pwsweep } = registerControl('pwsweep'); + +/** + * Phaser audio effect that approximates popular guitar pedals. + * + * @name phaser + * @synonyms ph + * @param {number | Pattern} speed speed of modulation + * @example + * n(run(8)).scale("D:pentatonic").s("sawtooth").release(0.5) + * .phaser("<1 2 4 8>") + * + */ +export const { phaserrate, ph, phaser } = registerControl( + ['phaserrate', 'phaserdepth', 'phasercenter', 'phasersweep'], + 'ph', + 'phaser', +); + +/** + * The frequency sweep range of the lfo for the phaser effect. Defaults to 2000 + * + * @name phasersweep + * @synonyms phs + * @param {number | Pattern} phasersweep most useful values are between 0 and 4000 + * @example + * n(run(8)).scale("D:pentatonic").s("sawtooth").release(0.5) + * .phaser(2).phasersweep("<800 2000 4000>") + * + */ +export const { phasersweep, phs } = registerControl('phasersweep', 'phs'); + +/** + * The center frequency of the phaser in HZ. Defaults to 1000 + * + * @name phasercenter + * @synonyms phc + * @param {number | Pattern} centerfrequency in HZ + * @example + * n(run(8)).scale("D:pentatonic").s("sawtooth").release(0.5) + * .phaser(2).phasercenter("<800 2000 4000>") + * + */ + +export const { phasercenter, phc } = registerControl('phasercenter', 'phc'); + +/** + * The amount the signal is affected by the phaser effect. Defaults to 0.75 + * + * @name phaserdepth + * @synonyms phd, phasdp + * @param {number | Pattern} depth number between 0 and 1 + * @example + * n(run(8)).scale("D:pentatonic").s("sawtooth").release(0.5) + * .phaser(2).phaserdepth("<0 .5 .75 1>") + * + */ +// also a superdirt control +export const { phaserdepth, phd, phasdp } = registerControl('phaserdepth', 'phd', 'phasdp'); + +/** + * Choose the channel the pattern is sent to in superdirt + * + * @name channel + * @param {number | Pattern} channel channel number + * + */ +export const { channel } = registerControl('channel'); +/** + * In the style of classic drum-machines, `cut` will stop a playing sample as soon as another samples with in same cutgroup is to be played. An example would be an open hi-hat followed by a closed one, essentially muting the open. + * + * @name cut + * @param {number | Pattern} group cut group number + * @example + * s("[oh hh]*4").cut(1) + * + */ +export const { cut } = registerControl('cut'); +/** + * Applies the cutoff frequency of the **l**ow-**p**ass **f**ilter. + * + * When using mininotation, you can also optionally add the 'lpq' parameter, separated by ':'. + * + * @name lpf + * @param {number | Pattern} frequency audible between 0 and 20000 + * @synonyms cutoff, ctf, lp + * @example + * s("bd sd [~ bd] sd,hh*6").lpf("<4000 2000 1000 500 200 100>") + * @example + * s("bd*16").lpf("1000:0 1000:10 1000:20 1000:30") + * + */ +export const { cutoff, ctf, lpf, lp } = registerControl(['cutoff', 'resonance', 'lpenv'], 'ctf', 'lpf', 'lp'); + +/** + * Sets the lowpass filter envelope modulation depth. + * @name lpenv + * @param {number | Pattern} modulation depth of the lowpass filter envelope between 0 and _n_ + * @synonyms lpe + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .lpf(300) + * .lpa(.5) + * .lpenv("<4 2 1 0 -1 -2 -4>/4") + */ +export const { lpenv, lpe } = registerControl('lpenv', 'lpe'); +/** + * Sets the highpass filter envelope modulation depth. + * @name hpenv + * @param {number | Pattern} modulation depth of the highpass filter envelope between 0 and _n_ + * @synonyms hpe + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .hpf(500) + * .hpa(.5) + * .hpenv("<4 2 1 0 -1 -2 -4>/4") + */ +export const { hpenv, hpe } = registerControl('hpenv', 'hpe'); +/** + * Sets the bandpass filter envelope modulation depth. + * @name bpenv + * @param {number | Pattern} modulation depth of the bandpass filter envelope between 0 and _n_ + * @synonyms bpe + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .bpf(500) + * .bpa(.5) + * .bpenv("<4 2 1 0 -1 -2 -4>/4") + */ +export const { bpenv, bpe } = registerControl('bpenv', 'bpe'); +/** + * Sets the attack duration for the lowpass filter envelope. + * @name lpattack + * @param {number | Pattern} attack time of the filter envelope + * @synonyms lpa + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .lpf(300) + * .lpa("<.5 .25 .1 .01>/4") + * .lpenv(4) + */ +export const { lpattack, lpa } = registerControl('lpattack', 'lpa'); +/** + * Sets the attack duration for the highpass filter envelope. + * @name hpattack + * @param {number | Pattern} attack time of the highpass filter envelope + * @synonyms hpa + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .hpf(500) + * .hpa("<.5 .25 .1 .01>/4") + * .hpenv(4) + */ +export const { hpattack, hpa } = registerControl('hpattack', 'hpa'); +/** + * Sets the attack duration for the bandpass filter envelope. + * @name bpattack + * @param {number | Pattern} attack time of the bandpass filter envelope + * @synonyms bpa + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .bpf(500) + * .bpa("<.5 .25 .1 .01>/4") + * .bpenv(4) + */ +export const { bpattack, bpa } = registerControl('bpattack', 'bpa'); +/** + * Sets the decay duration for the lowpass filter envelope. + * @name lpdecay + * @param {number | Pattern} decay time of the filter envelope + * @synonyms lpd + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .lpf(300) + * .lpd("<.5 .25 .1 0>/4") + * .lpenv(4) + */ +export const { lpdecay, lpd } = registerControl('lpdecay', 'lpd'); +/** + * Sets the decay duration for the highpass filter envelope. + * @name hpdecay + * @param {number | Pattern} decay time of the highpass filter envelope + * @synonyms hpd + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .hpf(500) + * .hpd("<.5 .25 .1 0>/4") + * .hps(0.2) + * .hpenv(4) + */ +export const { hpdecay, hpd } = registerControl('hpdecay', 'hpd'); +/** + * Sets the decay duration for the bandpass filter envelope. + * @name bpdecay + * @param {number | Pattern} decay time of the bandpass filter envelope + * @synonyms bpd + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .bpf(500) + * .bpd("<.5 .25 .1 0>/4") + * .bps(0.2) + * .bpenv(4) + */ +export const { bpdecay, bpd } = registerControl('bpdecay', 'bpd'); +/** + * Sets the sustain amplitude for the lowpass filter envelope. + * @name lpsustain + * @param {number | Pattern} sustain amplitude of the lowpass filter envelope + * @synonyms lps + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .lpf(300) + * .lpd(.5) + * .lps("<0 .25 .5 1>/4") + * .lpenv(4) + */ +export const { lpsustain, lps } = registerControl('lpsustain', 'lps'); +/** + * Sets the sustain amplitude for the highpass filter envelope. + * @name hpsustain + * @param {number | Pattern} sustain amplitude of the highpass filter envelope + * @synonyms hps + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .hpf(500) + * .hpd(.5) + * .hps("<0 .25 .5 1>/4") + * .hpenv(4) + */ +export const { hpsustain, hps } = registerControl('hpsustain', 'hps'); +/** + * Sets the sustain amplitude for the bandpass filter envelope. + * @name bpsustain + * @param {number | Pattern} sustain amplitude of the bandpass filter envelope + * @synonyms bps + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .bpf(500) + * .bpd(.5) + * .bps("<0 .25 .5 1>/4") + * .bpenv(4) + */ +export const { bpsustain, bps } = registerControl('bpsustain', 'bps'); +/** + * Sets the release time for the lowpass filter envelope. + * @name lprelease + * @param {number | Pattern} release time of the filter envelope + * @synonyms lpr + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .clip(.5) + * .lpf(300) + * .lpenv(4) + * .lpr("<.5 .25 .1 0>/4") + * .release(.5) + */ +export const { lprelease, lpr } = registerControl('lprelease', 'lpr'); +/** + * Sets the release time for the highpass filter envelope. + * @name hprelease + * @param {number | Pattern} release time of the highpass filter envelope + * @synonyms hpr + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .clip(.5) + * .hpf(500) + * .hpenv(4) + * .hpr("<.5 .25 .1 0>/4") + * .release(.5) + */ +export const { hprelease, hpr } = registerControl('hprelease', 'hpr'); +/** + * Sets the release time for the bandpass filter envelope. + * @name bprelease + * @param {number | Pattern} release time of the bandpass filter envelope + * @synonyms bpr + * @example + * note("c2 e2 f2 g2") + * .sound('sawtooth') + * .clip(.5) + * .bpf(500) + * .bpenv(4) + * .bpr("<.5 .25 .1 0>/4") + * .release(.5) + */ +export const { bprelease, bpr } = registerControl('bprelease', 'bpr'); +/** + * Sets the filter type. The ladder filter is more aggressive. More types might be added in the future. + * @name ftype + * @param {number | Pattern} type 12db (0), ladder (1), or 24db (2) + * @example + * note("{f g g c d a a#}%8").s("sawtooth").lpenv(4).lpf(500).ftype("<0 1 2>").lpq(1) + * @example + * note("c f g g a c d4").fast(2) + * .sound('sawtooth') + * .lpf(200).fanchor(0) + * .lpenv(3).lpq(1) + * .ftype("") + */ +export const { ftype } = registerControl('ftype'); + +/** + * controls the center of the filter envelope. 0 is unipolar positive, .5 is bipolar, 1 is unipolar negative + * @name fanchor + * @param {number | Pattern} center 0 to 1 + * @example + * note("{f g g c d a a#}%8").s("sawtooth").lpf("{1000}%2") + * .lpenv(8).fanchor("<0 .5 1>") + */ +export const { fanchor } = registerControl('fanchor'); +/** + * Applies the cutoff frequency of the **h**igh-**p**ass **f**ilter. + * + * When using mininotation, you can also optionally add the 'hpq' parameter, separated by ':'. + * + * @name hpf + * @param {number | Pattern} frequency audible between 0 and 20000 + * @synonyms hp, hcutoff + * @example + * s("bd sd [~ bd] sd,hh*8").hpf("<4000 2000 1000 500 200 100>") + * @example + * s("bd sd [~ bd] sd,hh*8").hpf("<2000 2000:25>") + * + */ +// currently an alias of 'hcutoff' https://codeberg.org/uzu/strudel/issues/496 +// ['hpf'], +/** + * Applies a vibrato to the frequency of the oscillator. + * + * @name vib + * @synonyms vibrato, v + * @param {number | Pattern} frequency of the vibrato in hertz + * @example + * note("a e") + * .vib("<.5 1 2 4 8 16>") + * ._scope() + * @example + * // change the modulation depth with ":" + * note("a e") + * .vib("<.5 1 2 4 8 16>:12") + * ._scope() + */ +export const { vib, vibrato, v } = registerControl(['vib', 'vibmod'], 'vibrato', 'v'); +/** + * Adds pink noise to the mix + * + * @name noise + * @param {number | Pattern} wet wet amount + * @example + * sound("/2") + */ +export const { noise } = registerControl('noise'); +/** + * Sets the vibrato depth in semitones. Only has an effect if `vibrato` | `vib` | `v` is is also set + * + * @name vibmod + * @synonyms vmod + * @param {number | Pattern} depth of vibrato (in semitones) + * @example + * note("a e").vib(4) + * .vibmod("<.25 .5 1 2 12>") + * ._scope() + * @example + * // change the vibrato frequency with ":" + * note("a e") + * .vibmod("<.25 .5 1 2 12>:8") + * ._scope() + */ +export const { vibmod, vmod } = registerControl(['vibmod', 'vib'], 'vmod'); +export const { hcutoff, hpf, hp } = registerControl(['hcutoff', 'hresonance', 'hpenv'], 'hpf', 'hp'); +/** + * Controls the **h**igh-**p**ass **q**-value. + * + * @name hpq + * @param {number | Pattern} q resonance factor between 0 and 50 + * @synonyms hresonance + * @example + * s("bd sd [~ bd] sd,hh*8").hpf(2000).hpq("<0 10 20 30>") + * + */ +export const { hresonance, hpq } = registerControl('hresonance', 'hpq'); +/** + * Controls the **l**ow-**p**ass **q**-value. + * + * @name lpq + * @param {number | Pattern} q resonance factor between 0 and 50 + * @synonyms resonance + * @example + * s("bd sd [~ bd] sd,hh*8").lpf(2000).lpq("<0 10 20 30>") + * + */ +// currently an alias of 'resonance' https://codeberg.org/uzu/strudel/issues/496 +export const { resonance, lpq } = registerControl('resonance', 'lpq'); +/** + * DJ filter, below 0.5 is low pass filter, above is high pass filter. + * + * @name djf + * @param {number | Pattern} cutoff below 0.5 is low pass filter, above is high pass filter + * @example + * n(irand(16).seg(8)).scale("d:phrygian").s("supersaw").djf("<.5 .3 .2 .75>") + * + */ +export const { djf } = registerControl('djf'); +// ['cutoffegint'], +// TODO: does not seem to work +/** + * Sets the level of the delay signal. + * + * When using mininotation, you can also optionally add the 'delaytime' and 'delayfeedback' parameter, + * separated by ':'. + * + * + * @name delay + * @param {number | Pattern} level between 0 and 1 + * @example + * s("bd bd").delay("<0 .25 .5 1>") + * @example + * s("bd bd").delay("0.65:0.25:0.9 0.65:0.125:0.7") + * + */ +export const { delay } = registerControl(['delay', 'delaytime', 'delayfeedback']); +/** + * Sets the level of the signal that is fed back into the delay. + * Caution: Values >= 1 will result in a signal that gets louder and louder! Don't do it + * + * @name delayfeedback + * @param {number | Pattern} feedback between 0 and 1 + * @synonyms delayfb, dfb + * @example + * s("bd").delay(.25).delayfeedback("<.25 .5 .75 1>") + * + */ +export const { delayfeedback, delayfb, dfb } = registerControl('delayfeedback', 'delayfb', 'dfb'); + +/** + * Sets the level of the signal that is fed back into the delay. + * Caution: Values >= 1 will result in a signal that gets louder and louder! Don't do it + * + * @name delayfeedback + * @param {number | Pattern} feedback between 0 and 1 + * @synonyms delayfb, dfb + * @example + * s("bd").delay(.25).delayfeedback("<.25 .5 .75 1>") + * + */ +export const { delayspeed } = registerControl('delayspeed'); +/** + * Sets the time of the delay effect. + * + * @name delayspeed + * @param {number | Pattern} delayspeed controls the pitch of the delay feedback + * @synonyms delayt, dt + * @example + * note("d d a# a".fast(2)).s("sawtooth").delay(.8).delaytime(1/2).delayspeed("<2 .5 -1 -2>") + * + */ +export const { delaytime, delayt, dt } = registerControl('delaytime', 'delayt', 'dt'); + +/** + * Sets the time of the delay effect in cycles. + * + * @name delaysync + * @param {number | Pattern} cycles delay length in cycles + * @synonyms delayt, dt + * @example + * s("bd bd").delay(.25).delaysync("<1 2 3 5>".div(8)) + * + */ +export const { delaysync } = registerControl('delaysync'); + +/** + * Specifies whether delaytime is calculated relative to cps. + * + * @name lock + * @param {number | Pattern} enable When set to 1, delaytime is a direct multiple of a cycle. + * @superdirtOnly + * @example + * s("sd").delay().lock(1).osc() + * + * + */ + +export const { lock } = registerControl('lock'); +/** + * Set detune for stacked voices of supported oscillators + * + * @name detune + * @param {number | Pattern} amount + * @synonyms det + * @example + * note("d f a a# a d3").fast(2).s("supersaw").detune("<.1 .2 .5 24.1>") + * + */ +export const { detune, det } = registerControl('detune', 'det'); +/** + * Set number of stacked voices for supported oscillators + * + * @name unison + * @param {number | Pattern} numvoices + * @example + * note("d f a a# a d3").fast(2).s("supersaw").unison("<1 2 7>") + * + */ +export const { unison } = registerControl('unison'); + +/** + * Set the stereo pan spread for supported oscillators + * + * @name spread + * @param {number | Pattern} spread between 0 and 1 + * @example + * note("d f a a# a d3").fast(2).s("supersaw").spread("<0 .3 1>") + * + */ +export const { spread } = registerControl('spread'); +/** + * Set dryness of reverb. See `room` and `size` for more information about reverb. + * + * @name dry + * @param {number | Pattern} dry 0 = wet, 1 = dry + * @example + * n("[0,3,7](3,8)").s("superpiano").room(.7).dry("<0 .5 .75 1>").osc() + * @superdirtOnly + * + */ +export const { dry } = registerControl('dry'); +// TODO: does not seem to do anything +/* + * Used when using `begin`/`end` or `chop`/`striate` and friends, to change the fade out time of the 'grain' envelope. + * + * @name fadeTime + * @synonyms fadeOutTime + * @param {number | Pattern} time between 0 and 1 + * @example + * s("oh*4").end(.1).fadeTime("<0 .2 .4 .8>").osc() + * + */ +export const { fadeTime, fadeOutTime } = registerControl('fadeTime', 'fadeOutTime'); +// TODO: see above +export const { fadeInTime } = registerControl('fadeInTime'); +/** + * Set frequency of sound. + * + * @name freq + * @param {number | Pattern} frequency in Hz. the audible range is between 20 and 20000 Hz + * @example + * freq("220 110 440 110").s("superzow").osc() + * @example + * freq("110".mul.out(".5 1.5 .6 [2 3]")).s("superzow").osc() + * + */ +export const { freq } = registerControl('freq'); +// pitch envelope +/** + * Attack time of pitch envelope. + * + * @name pattack + * @synonyms patt + * @param {number | Pattern} time time in seconds + * @example + * note("c eb g bb").pattack("0 .1 .25 .5").slow(2) + * + */ +export const { pattack, patt } = registerControl('pattack', 'patt'); +/** + * Decay time of pitch envelope. + * + * @name pdecay + * @synonyms pdec + * @param {number | Pattern} time time in seconds + * @example + * note("").pdecay("<0 .1 .25 .5>") + * + */ +export const { pdecay, pdec } = registerControl('pdecay', 'pdec'); +// TODO: how to use psustain?! +export const { psustain, psus } = registerControl('psustain', 'psus'); +/** + * Release time of pitch envelope + * + * @name prelease + * @synonyms prel + * @param {number | Pattern} time time in seconds + * @example + * note(" ~") + * .release(.5) // to hear the pitch release + * .prelease("<0 .1 .25 .5>") + * + */ +export const { prelease, prel } = registerControl('prelease', 'prel'); +/** + * Amount of pitch envelope. Negative values will flip the envelope. + * If you don't set other pitch envelope controls, `pattack:.2` will be the default. + * + * @name penv + * @param {number | Pattern} semitones change in semitones + * @example + * note("c") + * .penv("<12 7 1 .5 0 -1 -7 -12>") + * + */ +export const { penv } = registerControl('penv'); +/** + * Curve of envelope. Defaults to linear. exponential is good for kicks + * + * @name pcurve + * @param {number | Pattern} type 0 = linear, 1 = exponential + * @example + * note("g1*4") + * .s("sine").pdec(.5) + * .penv(32) + * .pcurve("<0 1>") + * + */ +export const { pcurve } = registerControl('pcurve'); +/** + * Sets the range anchor of the envelope: + * - anchor 0: range = [note, note + penv] + * - anchor 1: range = [note - penv, note] + * If you don't set an anchor, the value will default to the psustain value. + * + * @name panchor + * @param {number | Pattern} anchor anchor offset + * @example + * note("c c4").penv(12).panchor("<0 .5 1 .5>") + * + */ +export const { panchor } = registerControl('panchor'); +// TODO: https://tidalcycles.org/docs/configuration/MIDIOSC/control-voltage/#gate +export const { gate, gat } = registerControl('gate', 'gat'); +// ['hatgrain'], +// ['lagogo'], +// ['lclap'], +// ['lclaves'], +// ['lclhat'], +// ['lcrash'], +// TODO: +// https://tidalcycles.org/docs/reference/audio_effects/#leslie-1 +// https://tidalcycles.org/docs/reference/audio_effects/#leslie +/** + * Emulation of a Leslie speaker: speakers rotating in a wooden amplified cabinet. + * + * @name leslie + * @param {number | Pattern} wet between 0 and 1 + * @example + * n("0,4,7").s("supersquare").leslie("<0 .4 .6 1>").osc() + * @superdirtOnly + * + */ +export const { leslie } = registerControl('leslie'); +/** + * Rate of modulation / rotation for leslie effect + * + * @name lrate + * @param {number | Pattern} rate 6.7 for fast, 0.7 for slow + * @example + * n("0,4,7").s("supersquare").leslie(1).lrate("<1 2 4 8>").osc() + * @superdirtOnly + * + */ +// TODO: the rate seems to "lag" (in the example, 1 will be fast) +export const { lrate } = registerControl('lrate'); +/** + * Physical size of the cabinet in meters. Be careful, it might be slightly larger than your computer. Affects the Doppler amount (pitch warble) + * + * @name lsize + * @param {number | Pattern} meters somewhere between 0 and 1 + * @example + * n("0,4,7").s("supersquare").leslie(1).lrate(2).lsize("<.1 .5 1>").osc() + * @superdirtOnly + * + */ +export const { lsize } = registerControl('lsize'); +/** + * Sets the displayed text for an event on the pianoroll + * + * @name label + * @param {string} label text to display + */ +export const { activeLabel } = registerControl('activeLabel'); +export const { label } = registerControl(['label', 'activeLabel']); +// ['lfo'], +// ['lfocutoffint'], +// ['lfodelay'], +// ['lfoint'], +// ['lfopitchint'], +// ['lfoshape'], +// ['lfosync'], +// ['lhitom'], +// ['lkick'], +// ['llotom'], +// ['lophat'], +// ['lsnare'], +// TODO: what is this? not found in tidal doc +export const { degree } = registerControl('degree'); +// TODO: what is this? not found in tidal doc +export const { mtranspose } = registerControl('mtranspose'); +// TODO: what is this? not found in tidal doc +export const { ctranspose } = registerControl('ctranspose'); +// TODO: what is this? not found in tidal doc +export const { harmonic } = registerControl('harmonic'); +// TODO: what is this? not found in tidal doc +export const { stepsPerOctave } = registerControl('stepsPerOctave'); +// TODO: what is this? not found in tidal doc +export const { octaveR } = registerControl('octaveR'); +// TODO: why is this needed? what's the difference to late / early? Answer: it's in seconds, and delays the message at +// OSC time (so can't be negative, at least not beyond the latency value) +export const { nudge } = registerControl('nudge'); +// TODO: the following doc is just a guess, it's not documented in tidal doc. +/** + * Sets the default octave of a synth. + * + * @name octave + * @param {number | Pattern} octave octave number + * @example + * n("0,4,7").s('supersquare').octave("<3 4 5 6>").osc() + * @superDirtOnly + */ +export const { octave } = registerControl('octave'); + +// ['ophatdecay'], +// TODO: example +/** + * An `orbit` is a global parameter context for patterns. Patterns with the same orbit will share the same global effects. + * + * @name orbit + * @param {number | Pattern} number + * @example + * stack( + * s("hh*6").delay(.5).delaytime(.25).orbit(1), + * s("~ sd ~ sd").delay(.5).delaytime(.125).orbit(2) + * ) + */ +export const { orbit } = registerControl('orbit'); +// TODO: what is this? not found in tidal doc Answer: gain is limited to maximum of 2. This allows you to go over that +export const { overgain } = registerControl('overgain'); +// TODO: what is this? not found in tidal doc. Similar to above, but limited to 1 +export const { overshape } = registerControl('overshape'); +/** + * Sets position in stereo. + * + * @name pan + * @param {number | Pattern} pan between 0 and 1, from left to right (assuming stereo), once round a circle (assuming multichannel) + * @example + * s("[bd hh]*2").pan("<.5 1 .5 0>") + * @example + * s("bd rim sd rim bd ~ cp rim").pan(sine.slow(2)) + * + */ +export const { pan } = registerControl('pan'); +// TODO: this has no effect (see example) +/* + * Controls how much multichannel output is fanned out + * + * @name panspan + * @param {number | Pattern} span between -inf and inf, negative is backwards ordering + * @example + * s("[bd hh]*2").pan("<.5 1 .5 0>").panspan("<0 .5 1>").osc() + * + */ +export const { panspan } = registerControl('panspan'); +// TODO: this has no effect (see example) +/* + * Controls how much multichannel output is spread + * + * @name pansplay + * @param {number | Pattern} spread between 0 and 1 + * @example + * s("[bd hh]*2").pan("<.5 1 .5 0>").pansplay("<0 .5 1>").osc() + * + */ +export const { pansplay } = registerControl('pansplay'); +export const { panwidth } = registerControl('panwidth'); +export const { panorient } = registerControl('panorient'); +// ['pitch1'], +// ['pitch2'], +// ['pitch3'], +// ['portamento'], +// TODO: LFO rate see https://tidalcycles.org/docs/patternlib/tutorials/synthesizers/#supersquare +export const { rate } = registerControl('rate'); +// TODO: slide param for certain synths +export const { slide } = registerControl('slide'); +// TODO: detune? https://tidalcycles.org/docs/patternlib/tutorials/synthesizers/#supersquare +export const { semitone } = registerControl('semitone'); + +// TODO: synth param +export const { voice } = registerControl('voice'); +// voicings // https://codeberg.org/uzu/strudel/issues/506 +// chord to voice, like C Eb Fm7 G7. the symbols can be defined via addVoicings +export const { chord } = registerControl('chord'); +// which dictionary to use for the voicings +export const { dictionary, dict } = registerControl('dictionary', 'dict'); +// the top note to align the voicing to, defaults to c5 +export const { anchor } = registerControl('anchor'); +// how the voicing is offset from the anchored position +export const { offset } = registerControl('offset'); +// how many octaves are voicing steps spread apart, defaults to 1 +export const { octaves } = registerControl('octaves'); +// below = anchor note will be removed from the voicing, useful for melody harmonization +export const { mode } = registerControl(['mode', 'anchor']); + +/** + * Sets the level of reverb. + * + * When using mininotation, you can also optionally add the 'size' parameter, separated by ':'. + * + * @name room + * @param {number | Pattern} level between 0 and 1 + * @example + * s("bd sd [~ bd] sd").room("<0 .2 .4 .6 .8 1>") + * @example + * s("bd sd [~ bd] sd").room("<0.9:1 0.9:4>") + * + */ +export const { room } = registerControl(['room', 'size']); +/** + * Reverb lowpass starting frequency (in hertz). + * When this property is changed, the reverb will be recaculated, so only change this sparsely.. + * + * @name roomlp + * @synonyms rlp + * @param {number} frequency between 0 and 20000hz + * @example + * s("bd sd [~ bd] sd").room(0.5).rlp(10000) + * @example + * s("bd sd [~ bd] sd").room(0.5).rlp(5000) + */ +export const { roomlp, rlp } = registerControl('roomlp', 'rlp'); +/** + * Reverb lowpass frequency at -60dB (in hertz). + * When this property is changed, the reverb will be recaculated, so only change this sparsely.. + * + * @name roomdim + * @synonyms rdim + * @param {number} frequency between 0 and 20000hz + * @example + * s("bd sd [~ bd] sd").room(0.5).rlp(10000).rdim(8000) + * @example + * s("bd sd [~ bd] sd").room(0.5).rlp(5000).rdim(400) + * + */ +export const { roomdim, rdim } = registerControl('roomdim', 'rdim'); +/** + * Reverb fade time (in seconds). + * When this property is changed, the reverb will be recaculated, so only change this sparsely.. + * + * @name roomfade + * @synonyms rfade + * @param {number} seconds for the reverb to fade + * @example + * s("bd sd [~ bd] sd").room(0.5).rlp(10000).rfade(0.5) + * @example + * s("bd sd [~ bd] sd").room(0.5).rlp(5000).rfade(4) + * + */ +export const { roomfade, rfade } = registerControl('roomfade', 'rfade'); +/** + * Sets the sample to use as an impulse response for the reverb. + * @name iresponse + * @param {string | Pattern} sample to use as an impulse response + * @synonyms ir + * @example + * s("bd sd [~ bd] sd").room(.8).ir("") + * + */ +export const { ir, iresponse } = registerControl(['ir', 'i'], 'iresponse'); + +/** + * Sets speed of the sample for the impulse response. + * @name irspeed + * @param {string | Pattern} speed + * @example + * samples('github:switchangel/pad') + * $: s("brk/2").fit().scrub(irand(16).div(16).seg(8)).ir("swpad:4").room(.2).irspeed("<2 1 .5>/2").irbegin(.5).roomsize(.5) + * + */ +export const { irspeed } = registerControl('irspeed'); + +/** + * Sets the beginning of the IR response sample + * @name irbegin + * @param {string | Pattern} begin between 0 and 1 + * @synonyms ir + * @example + * samples('github:switchangel/pad') + * $: s("brk/2").fit().scrub(irand(16).div(16).seg(8)).ir("swpad:4").room(.65).irspeed("-2").irbegin("<0 .5 .75>/2").roomsize(.6) + * + */ +export const { irbegin } = registerControl('irbegin'); +/** + * Sets the room size of the reverb, see `room`. + * When this property is changed, the reverb will be recaculated, so only change this sparsely.. + * + * @name roomsize + * @param {number | Pattern} size between 0 and 10 + * @synonyms rsize, sz, size + * @example + * s("bd sd [~ bd] sd").room(.8).rsize(1) + * @example + * s("bd sd [~ bd] sd").room(.8).rsize(4) + * + */ +// TODO: find out why : +// s("bd sd [~ bd] sd").room(.8).roomsize("<0 .2 .4 .6 .8 [1,0]>").osc() +// .. does not work. Is it because room is only one effect? +export const { roomsize, size, sz, rsize } = registerControl('roomsize', 'size', 'sz', 'rsize'); +// ['sagogo'], +// ['sclap'], +// ['sclaves'], +// ['scrash'], +/** + * (Deprecated) Wave shaping distortion. WARNING: can suddenly get unpredictably loud. + * Please use distort instead, which has a more predictable response curve + * second option in optional array syntax (ex: ".9:.5") applies a postgain to the output + * + * + * @name shape + * @param {number | Pattern} distortion between 0 and 1 + * @example + * s("bd sd [~ bd] sd,hh*8").shape("<0 .2 .4 .6 .8>") + * + */ +export const { shape } = registerControl(['shape', 'shapevol']); +/** + * Wave shaping distortion. CAUTION: it can get loud. + * Second option in optional array syntax (ex: ".9:.5") applies a postgain to the output. Third option sets the waveshaping type. + * Most useful values are usually between 0 and 10 (depending on source gain). If you are feeling adventurous, you can turn it up to 11 and beyond ;) + * + * @name distort + * @synonyms dist + * @param {number | Pattern} distortion amount of distortion to apply + * @param {number | Pattern} volume linear postgain of the distortion + * @param {number | string | Pattern} type type of distortion to apply + * @example + * s("bd sd [~ bd] sd,hh*8").distort("<0 2 3 10:.5>") + * @example + * note("d1!8").s("sine").penv(36).pdecay(.12).decay(.23).distort("8:.4") + * @example + * s("bd:4*4").bank("tr808").distort("3:0.5:diode") + * + */ +export const { distort, dist } = registerControl(['distort', 'distortvol', 'distorttype'], 'dist'); + +/** + * Postgain for waveshaping distortion. + * + * @name distortvol + * @synonyms distvol + * @param {number | Pattern} volume linear postgain of the distortion + * @example + * s("bd*4").bank("tr909").distort(2).distortvol(0.8) + */ +export const { distortvol } = registerControl('distortvol', 'distvol'); + +/** + * Type of waveshaping distortion to apply. + * + * @name distorttype + * @synonyms disttype + * @param {number | string | Pattern} type type of distortion to apply + * @example + * s("bd*4").bank("tr909").distort(2).distorttype("<0 1 2>") + * + * @example + * s("sine").note("F1*2").release(1) + * .penv(24).pdecay(0.05) + * .distort(rand.range(1, 8)) + * .distorttype("") + */ +export const { distorttype } = registerControl('distorttype', 'disttype'); + +/** + * Dynamics Compressor. The params are `compressor("threshold:ratio:knee:attack:release")` + * More info [here](https://developer.mozilla.org/en-US/docs/Web/API/DynamicsCompressorNode?retiredLocale=de#instance_properties) + * + * @name compressor + * @example + * s("bd sd [~ bd] sd,hh*8") + * .compressor("-20:20:10:.002:.02") + * + */ +export const { compressor } = registerControl([ + 'compressor', + 'compressorRatio', + 'compressorKnee', + 'compressorAttack', + 'compressorRelease', +]); +export const { compressorKnee } = registerControl('compressorKnee'); +export const { compressorRatio } = registerControl('compressorRatio'); +export const { compressorAttack } = registerControl('compressorAttack'); +export const { compressorRelease } = registerControl('compressorRelease'); +/** + * Changes the speed of sample playback, i.e. a cheap way of changing pitch. + * + * @name speed + * @param {number | Pattern} speed -inf to inf, negative numbers play the sample backwards. + * @example + * s("bd*6").speed("1 2 4 1 -2 -4") + * @example + * speed("1 1.5*2 [2 1.1]").s("piano").clip(1) + * + */ +export const { speed } = registerControl('speed'); + +/** + * Changes the speed of sample playback, i.e. a cheap way of changing pitch. + * + * @name stretch + * @param {number | Pattern} factor -inf to inf, negative numbers play the sample backwards. + * @example + * s("gm_flute").stretch("1 2 .5") + * + */ +export const { stretch } = registerControl('stretch'); +/** + * Used in conjunction with `speed`, accepts values of "r" (rate, default behavior), "c" (cycles), or "s" (seconds). Using `unit "c"` means `speed` will be interpreted in units of cycles, e.g. `speed "1"` means samples will be stretched to fill a cycle. Using `unit "s"` means the playback speed will be adjusted so that the duration is the number of seconds specified by `speed`. + * + * @name unit + * @param {number | string | Pattern} unit see description above + * @example + * speed("1 2 .5 3").s("bd").unit("c").osc() + * @superdirtOnly + * + */ + +export const { unit } = registerControl('unit'); +/** + * Made by Calum Gunn. Reminiscent of some weird mixture of filter, ring-modulator and pitch-shifter. The SuperCollider manual defines Squiz as: + * + * "A simplistic pitch-raising algorithm. It's not meant to sound natural; its sound is reminiscent of some weird mixture of filter, ring-modulator and pitch-shifter, depending on the input. The algorithm works by cutting the signal into fragments (delimited by upwards-going zero-crossings) and squeezing those fragments in the time domain (i.e. simply playing them back faster than they came in), leaving silences inbetween. All the parameters apart from memlen can be modulated." + * + * @name squiz + * @param {number | Pattern} squiz Try passing multiples of 2 to it - 2, 4, 8 etc. + * @example + * squiz("2 4/2 6 [8 16]").s("bd").osc() + * @superdirtOnly + * + */ +export const { squiz } = registerControl('squiz'); +// TODO: what is this? not found in tidal doc +// ['stutterdepth'], +// TODO: what is this? not found in tidal doc +// ['stuttertime'], +// TODO: what is this? not found in tidal doc +// ['timescale'], +// TODO: what is this? not found in tidal doc +// ['timescalewin'], +// ['tomdecay'], +// ['vcfegint'], +// ['vcoegint'], +// TODO: Use a rest (~) to override the effect <- vowel +/** + * + * Formant filter to make things sound like vowels. + * + * @name vowel + * @param {string | Pattern} vowel You can use a e i o u ae aa oe ue y uh un en an on, corresponding to [a] [e] [i] [o] [u] [æ] [ɑ] [ø] [y] [ɯ] [ʌ] [œ̃] [ɛ̃] [ɑ̃] [ɔ̃]. Aliases: aa = å = ɑ, oe = ø = ö, y = ı, ae = æ. + * @example + * note("[c2 >]*2").s('sawtooth') + * .vowel(">") + * @example + * s("bd sd mt ht bd [~ cp] ht lt").vowel("[a|e|i|o|u]") + * + */ +export const { vowel } = registerControl('vowel'); +/* // TODO: find out how it works + * Made by Calum Gunn. Divides an audio stream into tiny segments, using the signal's zero-crossings as segment boundaries, and discards a fraction of them. Takes a number between 1 and 100, denoted the percentage of segments to drop. The SuperCollider manual describes the Waveloss effect this way: + * + * Divide an audio stream into tiny segments, using the signal's zero-crossings as segment boundaries, and discard a fraction of them (i.e. replace them with silence of the same length). The technique was described by Trevor Wishart in a lecture. Parameters: the filter drops drop out of out of chunks. mode can be 1 to drop chunks in a simple deterministic fashion (e.g. always dropping the first 30 out of a set of 40 segments), or 2 to drop chunks randomly but in an appropriate proportion.) + * + * mode: ? + * waveloss: ? + * + * @name waveloss + */ +export const { waveloss } = registerControl('waveloss'); +/** + * Noise crackle density + * + * @name density + * @param {number | Pattern} density between 0 and x + * @example + * s("crackle*4").density("<0.01 0.04 0.2 0.5>".slow(4)) + * + */ +export const { density } = registerControl('density'); +// ['modwheel'], +export const { expression } = registerControl('expression'); +export const { sustainpedal } = registerControl('sustainpedal'); + +export const { fshift } = registerControl('fshift'); +export const { fshiftnote } = registerControl('fshiftnote'); +export const { fshiftphase } = registerControl('fshiftphase'); + +export const { triode } = registerControl('triode'); +export const { krush } = registerControl('krush'); +export const { kcutoff } = registerControl('kcutoff'); +export const { octer } = registerControl('octer'); +export const { octersub } = registerControl('octersub'); +export const { octersubsub } = registerControl('octersubsub'); +export const { ring } = registerControl('ring'); +export const { ringf } = registerControl('ringf'); +export const { ringdf } = registerControl('ringdf'); +export const { freeze } = registerControl('freeze'); +export const { xsdelay } = registerControl('xsdelay'); +export const { tsdelay } = registerControl('tsdelay'); +export const { real } = registerControl('real'); +export const { imag } = registerControl('imag'); +export const { enhance } = registerControl('enhance'); +export const { partials } = registerControl('partials'); +export const { comb } = registerControl('comb'); +export const { smear } = registerControl('smear'); +export const { scram } = registerControl('scram'); +export const { binshift } = registerControl('binshift'); +export const { hbrick } = registerControl('hbrick'); +export const { lbrick } = registerControl('lbrick'); + +export const { frameRate } = registerControl('frameRate'); +export const { frames } = registerControl('frames'); +export const { hours } = registerControl('hours'); +export const { minutes } = registerControl('minutes'); +export const { seconds } = registerControl('seconds'); +export const { songPtr } = registerControl('songPtr'); +export const { uid } = registerControl('uid'); +export const { val } = registerControl('val'); +export const { cps } = registerControl('cps'); +/** + * Multiplies the duration with the given number. Also cuts samples off at the end if they exceed the duration. + * + * @name clip + * @synonyms legato + * @param {number | Pattern} factor >= 0 + * @example + * note("c a f e").s("piano").clip("<.5 1 2>") + * + */ +export const { clip, legato } = registerControl('clip', 'legato'); + +/** + * Sets the duration of the event in cycles. Similar to clip / legato, it also cuts samples off at the end if they exceed the duration. + * + * @name duration + * @synonyms dur + * @param {number | Pattern} seconds >= 0 + * @example + * note("c a f e").s("piano").dur("<.5 1 2>") + * + */ +export const { duration, dur } = registerControl('duration', 'dur'); + +// ZZFX +export const { zrand } = registerControl('zrand'); +export const { curve } = registerControl('curve'); +// superdirt duplicate +// export const {slide]} = registerControl('slide']); +export const { deltaSlide } = registerControl('deltaSlide'); +export const { pitchJump } = registerControl('pitchJump'); +export const { pitchJumpTime } = registerControl('pitchJumpTime'); +export const { lfo, repeatTime } = registerControl('lfo', 'repeatTime'); +// noise on the frequency or as bubo calls it "frequency fog" :) +export const { znoise } = registerControl('znoise'); +export const { zmod } = registerControl('zmod'); +// like crush but scaled differently +export const { zcrush } = registerControl('zcrush'); +export const { zdelay } = registerControl('zdelay'); +export const { zzfx } = registerControl('zzfx'); + +/** + * Sets the color of the hap in visualizations like pianoroll or highlighting. + * @name color + * @synonyms colour + * @param {string} color Hexadecimal or CSS color name + */ +export const { color, colour } = registerControl(['color', 'colour']); + +// TODO: slice / splice https://www.youtube.com/watch?v=hKhPdO0RKDQ&list=PL2lW1zNIIwj3bDkh-Y3LUGDuRcoUigoDs&index=13 + +export let createParams = (...names) => + names.reduce((acc, name) => Object.assign(acc, { [name]: createParam(name) }), {}); + +/** + * ADSR envelope: Combination of Attack, Decay, Sustain, and Release. + * + * @name adsr + * @param {number | Pattern} time attack time in seconds + * @param {number | Pattern} time decay time in seconds + * @param {number | Pattern} gain sustain level (0 to 1) + * @param {number | Pattern} time release time in seconds + * @example + * note("[c3 bb2 f3 eb3]*2").sound("sawtooth").lpf(600).adsr(".1:.1:.5:.2") + */ +export const adsr = register('adsr', (adsr, pat) => { + adsr = !Array.isArray(adsr) ? [adsr] : adsr; + const [attack, decay, sustain, release] = adsr; + return pat.set({ attack, decay, sustain, release }); +}); +export const ad = register('ad', (t, pat) => { + t = !Array.isArray(t) ? [t] : t; + const [attack, decay = attack] = t; + return pat.attack(attack).decay(decay); +}); +export const ds = register('ds', (t, pat) => { + t = !Array.isArray(t) ? [t] : t; + const [decay, sustain = 0] = t; + return pat.set({ decay, sustain }); +}); +export const ar = register('ar', (t, pat) => { + t = !Array.isArray(t) ? [t] : t; + const [attack, release = attack] = t; + return pat.set({ attack, release }); +}); + +//MIDI + +/** + * MIDI channel: Sets the MIDI channel for the event. + * + * @name midichan + * @param {number | Pattern} channel MIDI channel number (0-15) + * @example + * note("c4").midichan(1).midi() + */ +export const { midichan } = registerControl('midichan'); + +export const { midimap } = registerControl('midimap'); + +/** + * MIDI port: Sets the MIDI port for the event. + * + * @name midiport + * @param {number | Pattern} port MIDI port + * @example + * note("c a f e").midiport("<0 1 2 3>").midi() + */ +export const { midiport } = registerControl('midiport'); + +/** + * MIDI command: Sends a MIDI command message. + * + * @name midicmd + * @param {number | Pattern} command MIDI command + * @example + * midicmd("clock*48,/2").midi() + */ +export const { midicmd } = registerControl('midicmd'); + +/** + * MIDI control: Sends a MIDI control change message. + * + * @name control + * @param {number | Pattern} MIDI control number (0-127) + * @param {number | Pattern} MIDI controller value (0-127) + */ +export const control = register('control', (args, pat) => { + if (!Array.isArray(args)) { + throw new Error('control expects an array of [ccn, ccv]'); + } + const [_ccn, _ccv] = args; + return pat.ccn(_ccn).ccv(_ccv); +}); + +/** + * MIDI control number: Sends a MIDI control change message. + * + * @name ccn + * @param {number | Pattern} MIDI control number (0-127) + */ +export const { ccn } = registerControl('ccn'); +/** + * MIDI control value: Sends a MIDI control change message. + * + * @name ccv + * @param {number | Pattern} MIDI control value (0-127) + */ +export const { ccv } = registerControl('ccv'); +export const { ctlNum } = registerControl('ctlNum'); +// TODO: ctlVal? + +/** + * MIDI NRPN non-registered parameter number: Sends a MIDI NRPN non-registered parameter number message. + * @name nrpnn + * @param {number | Pattern} nrpnn MIDI NRPN non-registered parameter number (0-127) + * @example + * note("c4").nrpnn("1:8").nrpv("123").midichan(1).midi() + */ +export const { nrpnn } = registerControl('nrpnn'); +/** + * MIDI NRPN non-registered parameter value: Sends a MIDI NRPN non-registered parameter value message. + * @name nrpv + * @param {number | Pattern} nrpv MIDI NRPN non-registered parameter value (0-127) + * @example + * note("c4").nrpnn("1:8").nrpv("123").midichan(1).midi() + */ +export const { nrpv } = registerControl('nrpv'); + +/** + * MIDI program number: Sends a MIDI program change message. + * + * @name progNum + * @param {number | Pattern} program MIDI program number (0-127) + * @example + * note("c4").progNum(10).midichan(1).midi() + */ +export const { progNum } = registerControl('progNum'); + +/** + * MIDI sysex: Sends a MIDI sysex message. + * @name sysex + * @param {number | Pattern} id Sysex ID + * @param {number | Pattern} data Sysex data + * @example + * note("c4").sysex(["0x77", "0x01:0x02:0x03:0x04"]).midichan(1).midi() + */ +export const sysex = register('sysex', (args, pat) => { + if (!Array.isArray(args)) { + throw new Error('sysex expects an array of [id, data]'); + } + const [id, data] = args; + return pat.sysexid(id).sysexdata(data); +}); +/** + * MIDI sysex ID: Sends a MIDI sysex identifier message. + * @name sysexid + * @param {number | Pattern} id Sysex ID + * @example + * note("c4").sysexid("0x77").sysexdata("0x01:0x02:0x03:0x04").midichan(1).midi() + */ +export const { sysexid } = registerControl('sysexid'); +/** + * MIDI sysex data: Sends a MIDI sysex message. + * @name sysexdata + * @param {number | Pattern} data Sysex data + * @example + * note("c4").sysexid("0x77").sysexdata("0x01:0x02:0x03:0x04").midichan(1).midi() + */ +export const { sysexdata } = registerControl('sysexdata'); + +/** + * MIDI pitch bend: Sends a MIDI pitch bend message. + * @name midibend + * @param {number | Pattern} midibend MIDI pitch bend (-1 - 1) + * @example + * note("c4").midibend(sine.slow(4).range(-0.4,0.4)).midi() + */ +export const { midibend } = registerControl('midibend'); +/** + * MIDI key after touch: Sends a MIDI key after touch message. + * @name miditouch + * @param {number | Pattern} miditouch MIDI key after touch (0-1) + * @example + * note("c4").miditouch(sine.slow(4).range(0,1)).midi() + */ +export const { miditouch } = registerControl('miditouch'); + +// TODO: what is this? +export const { polyTouch } = registerControl('polyTouch'); + +export const getControlName = (alias) => { + if (controlAlias.has(alias)) { + return controlAlias.get(alias); + } + return alias; +}; + +/** + * Sets properties in a batch. + * + * @name as + * @param {String | Array} mapping the control names that are set + * @example + * "c:.5 a:1 f:.25 e:.8".as("note:clip") + * @example + * "{0@2 0.25 0 0.5 .3 .5}%8".as("begin").s("sax_vib").clip(1) + */ +export const as = register('as', (mapping, pat) => { + mapping = Array.isArray(mapping) ? mapping : [mapping]; + return pat.fmap((v) => { + v = Array.isArray(v) ? v : [v]; + v = Object.fromEntries(mapping.map((prop, i) => [getControlName(prop), v[i]])); + return v; + }); +}); + +/** + * Allows you to scrub an audio file like a tape loop by passing values that represents the position in the audio file + * in the optional array syntax ex: "0.5:2", the second value controls the speed of playback + * @name scrub + * @memberof Pattern + * @returns Pattern + * @example + * samples('github:switchangel/pad') + * s("swpad:0").scrub("{0.1!2 .25@3 0.7!2 <0.8:1.5>}%8") + * @example + * samples('github:yaxu/clean-breaks/main'); + * s("amen/4").fit().scrub("{0@3 0@2 4@3}%8".div(16)) + */ + +export const scrub = register( + 'scrub', + (beginPat, pat) => { + return beginPat.outerBind((v) => { + if (!Array.isArray(v)) { + v = [v]; + } + const [beginVal, speedMultiplier = 1] = v; + + return pat.begin(beginVal).mul(speed(speedMultiplier)).clip(1); + }); + }, + false, +); diff --git a/src/strudel/core/cyclist.mjs b/src/strudel/core/cyclist.mjs new file mode 100644 index 0000000..59e410c --- /dev/null +++ b/src/strudel/core/cyclist.mjs @@ -0,0 +1,140 @@ +/* +cyclist.mjs - event scheduler for a single strudel instance. for multi-instance scheduler, see - see +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import createClock from './zyklus.mjs'; +import { errorLogger, logger } from './logger.mjs'; + +export class Cyclist { + constructor({ + interval, + onTrigger, + onToggle, + onError, + getTime, + latency = 0.1, + setInterval, + clearInterval, + beforeStart, + }) { + this.started = false; + this.beforeStart = beforeStart; + this.cps = 0.5; + this.num_ticks_since_cps_change = 0; + this.lastTick = 0; // absolute time when last tick (clock callback) happened + this.lastBegin = 0; // query begin of last tick + this.lastEnd = 0; // query end of last tick + this.getTime = getTime; // get absolute time + this.num_cycles_at_cps_change = 0; + this.seconds_at_cps_change; // clock phase when cps was changed + this.onToggle = onToggle; + this.latency = latency; // fixed trigger time offset + this.clock = createClock( + getTime, + // called slightly before each cycle + (phase, duration, _, t) => { + if (this.num_ticks_since_cps_change === 0) { + this.num_cycles_at_cps_change = this.lastEnd; + this.seconds_at_cps_change = phase; + } + this.num_ticks_since_cps_change++; + const seconds_since_cps_change = this.num_ticks_since_cps_change * duration; + const num_cycles_since_cps_change = seconds_since_cps_change * this.cps; + + try { + const begin = this.lastEnd; + this.lastBegin = begin; + const end = this.num_cycles_at_cps_change + num_cycles_since_cps_change; + this.lastEnd = end; + this.lastTick = phase; + + if (phase < t) { + // avoid querying haps that are in the past anyway + console.log(`skip query: too late`); + return; + } + + // query the pattern for events + const haps = this.pattern.queryArc(begin, end, { _cps: this.cps, cyclist: 'cyclist' }); + + haps.forEach((hap) => { + if (hap.hasOnset()) { + const targetTime = + (hap.whole.begin - this.num_cycles_at_cps_change) / this.cps + this.seconds_at_cps_change + latency; + const duration = hap.duration / this.cps; + // the following line is dumb and only here for backwards compatibility + // see https://codeberg.org/uzu/strudel/pulls/1004 + const deadline = targetTime - phase; + // this onTrigger has another signature + onTrigger?.(hap, deadline, duration, this.cps, targetTime); + if (hap.value.cps !== undefined && this.cps != hap.value.cps) { + this.cps = hap.value.cps; + this.num_ticks_since_cps_change = 0; + } + } + }); + } catch (e) { + errorLogger(e); + onError?.(e); + } + }, + interval, // duration of each cycle + 0.1, + 0.1, + setInterval, + clearInterval, + ); + } + now() { + if (!this.started) { + return 0; + } + const secondsSinceLastTick = this.getTime() - this.lastTick - this.clock.duration; + return this.lastBegin + secondsSinceLastTick * this.cps; // + this.clock.minLatency; + } + setStarted(v) { + this.started = v; + this.onToggle?.(v); + } + async start() { + await this.beforeStart?.(); + this.num_ticks_since_cps_change = 0; + this.num_cycles_at_cps_change = 0; + if (!this.pattern) { + throw new Error('Scheduler: no pattern set! call .setPattern first.'); + } + logger('[cyclist] start'); + this.clock.start(); + this.setStarted(true); + } + pause() { + logger('[cyclist] pause'); + this.clock.pause(); + this.setStarted(false); + } + stop() { + logger('[cyclist] stop'); + this.clock.stop(); + this.lastEnd = 0; + this.setStarted(false); + } + async setPattern(pat, autostart = false) { + this.pattern = pat; + if (autostart && !this.started) { + await this.start(); + } + } + setCps(cps = 0.5) { + if (this.cps === cps) { + return; + } + this.cps = cps; + this.num_ticks_since_cps_change = 0; + } + log(begin, end, haps) { + const onsets = haps.filter((h) => h.hasOnset()); + console.log(`${begin.toFixed(4)} - ${end.toFixed(4)} ${Array(onsets.length).fill('I').join('')}`); + } +} diff --git a/src/strudel/core/drawLine.mjs b/src/strudel/core/drawLine.mjs new file mode 100644 index 0000000..7509c0f --- /dev/null +++ b/src/strudel/core/drawLine.mjs @@ -0,0 +1,62 @@ +/* +drawLine.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import Fraction, { gcd } from './fraction.mjs'; + +/** + * Intended for a debugging, drawLine renders the pattern as a string, where each character represents the same time span. + * Should only be used with single characters as values, otherwise the character slots will be messed up. + * Character legend: + * + * - "|" cycle separator + * - "-" hold previous value + * - "." silence + * + * @param {Pattern} pattern the pattern to use + * @param {number} chars max number of characters (approximately) + * @returns string + * @example + * const line = drawLine("0 [1 2 3]", 10); // |0--123|0--123 + * console.log(line); + * silence; + */ +function drawLine(pat, chars = 60) { + let cycle = 0; + let pos = Fraction(0); + let lines = ['']; + let emptyLine = ''; // this will be the "reference" empty line, which will be copied into extra lines + while (lines[0].length < chars) { + const haps = pat.queryArc(cycle, cycle + 1); + const durations = haps.filter((hap) => hap.hasOnset()).map((hap) => hap.duration); + const charFraction = gcd(...durations); + const totalSlots = charFraction.inverse(); // number of character slots for the current cycle + lines = lines.map((line) => line + '|'); // add pipe character before each cycle + emptyLine += '|'; + for (let i = 0; i < totalSlots; i++) { + const [begin, end] = [pos, pos.add(charFraction)]; + const matches = haps.filter((hap) => hap.whole.begin.lte(begin) && hap.whole.end.gte(end)); + const missingLines = matches.length - lines.length; + if (missingLines > 0) { + lines = lines.concat(Array(missingLines).fill(emptyLine)); + } + lines = lines.map((line, i) => { + const hap = matches[i]; + if (hap) { + const isOnset = hap.whole.begin.eq(begin); + const char = isOnset ? '' + hap.value : '-'; + return line + char; + } + return line + '.'; + }); + emptyLine += '.'; + pos = pos.add(charFraction); + } + cycle++; + } + return lines.join('\n'); +} + +export default drawLine; diff --git a/src/strudel/core/euclid.mjs b/src/strudel/core/euclid.mjs new file mode 100644 index 0000000..44ab07f --- /dev/null +++ b/src/strudel/core/euclid.mjs @@ -0,0 +1,221 @@ +/* +euclid.mjs - Bjorklund/Euclidean/Diaspora rhythms +Copyright (C) 2023 Rohan Drape and strudel contributors + +See for authors of this file. + +The Bjorklund algorithm implementation is ported from the Haskell Music Theory Haskell module by Rohan Drape - +https://rohandrape.net/?t=hmt + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { timeCat, register, silence, stack, pure, _morph } from './pattern.mjs'; +import { rotate, flatten, splitAt, zipWith } from './util.mjs'; +import Fraction, { lcm } from './fraction.mjs'; + +const left = function (n, x) { + const [ons, offs] = n; + const [xs, ys] = x; + const [_xs, __xs] = splitAt(offs, xs); + return [ + [offs, ons - offs], + [zipWith((a, b) => a.concat(b), _xs, ys), __xs], + ]; +}; + +const right = function (n, x) { + const [ons, offs] = n; + const [xs, ys] = x; + const [_ys, __ys] = splitAt(ons, ys); + const result = [ + [ons, offs - ons], + [zipWith((a, b) => a.concat(b), xs, _ys), __ys], + ]; + return result; +}; + +const _bjork = function (n, x) { + const [ons, offs] = n; + return Math.min(ons, offs) <= 1 ? [n, x] : _bjork(...(ons > offs ? left(n, x) : right(n, x))); +}; + +export const bjork = function (ons, steps) { + const inverted = ons < 0; + const absOns = Math.abs(ons); + const offs = steps - absOns; + const ones = Array(absOns).fill([1]); + const zeros = Array(offs).fill([0]); + const result = _bjork([absOns, offs], [ones, zeros]); + const pattern = flatten(result[1][0]).concat(flatten(result[1][1])); + return inverted ? pattern.map((x) => 1 - x) : pattern; +}; + +/** + * Changes the structure of the pattern to form an Euclidean rhythm. + * Euclidean rhythms are rhythms obtained using the greatest common + * divisor of two numbers. They were described in 2004 by Godfried + * Toussaint, a Canadian computer scientist. Euclidean rhythms are + * really useful for computer/algorithmic music because they can + * describe a large number of rhythms with a couple of numbers. + * + * @memberof Pattern + * @name euclid + * @param {number} pulses the number of onsets/beats + * @param {number} steps the number of steps to fill + * @returns Pattern + * @example + * // The Cuban tresillo pattern. + * note("c3").euclid(3,8) + */ + +/** + * Like `euclid`, but has an additional parameter for 'rotating' the resulting sequence. + * @memberof Pattern + * @name euclidRot + * @param {number} pulses the number of onsets/beats + * @param {number} steps the number of steps to fill + * @param {number} rotation offset in steps + * @returns Pattern + * @example + * // A Samba rhythm necklace from Brazil + * note("c3").euclidRot(3,16,14) + */ + +/** + * @example // A thirteenth-century Persian rhythm called Khafif-e-ramal. + * note("c3").euclid(2,5) + * @example // The archetypal pattern of the Cumbia from Colombia, as well as a Calypso rhythm from Trinidad. + * note("c3").euclid(3,4) + * @example // Another thirteenth century Persian rhythm by the name of Khafif-e-ramal, as well as a Rumanian folk-dance rhythm. + * note("c3").euclidRot(3,5,2) + * @example // A Ruchenitza rhythm used in a Bulgarian folk dance. + * note("c3").euclid(3,7) + * @example // The Cuban tresillo pattern. + * note("c3").euclid(3,8) + * @example // Another Ruchenitza Bulgarian folk-dance rhythm. + * note("c3").euclid(4,7) + * @example // The Aksak rhythm of Turkey. + * note("c3").euclid(4,9) + * @example // The metric pattern used by Frank Zappa in his piece titled Outside Now. + * note("c3").euclid(4,11) + * @example // Yields the York-Samai pattern, a popular Arab rhythm. + * note("c3").euclid(5,6) + * @example // The Nawakhat pattern, another popular Arab rhythm. + * note("c3").euclid(5,7) + * @example // The Cuban cinquillo pattern. + * note("c3").euclid(5,8) + * @example // A popular Arab rhythm called Agsag-Samai. + * note("c3").euclid(5,9) + * @example // The metric pattern used by Moussorgsky in Pictures at an Exhibition. + * note("c3").euclid(5,11) + * @example // The Venda clapping pattern of a South African children’s song. + * note("c3").euclid(5,12) + * @example // The Bossa-Nova rhythm necklace of Brazil. + * note("c3").euclid(5,16) + * @example // A typical rhythm played on the Bendir (frame drum). + * note("c3").euclid(7,8) + * @example // A common West African bell pattern. + * note("c3").euclid(7,12) + * @example // A Samba rhythm necklace from Brazil. + * note("c3").euclidRot(7,16,14) + * @example // A rhythm necklace used in the Central African Republic. + * note("c3").euclid(9,16) + * @example // A rhythm necklace of the Aka Pygmies of Central Africa. + * note("c3").euclidRot(11,24,14) + * @example // Another rhythm necklace of the Aka Pygmies of the upper Sangha. + * note("c3").euclidRot(13,24,5) + */ + +const _euclidRot = function (pulses, steps, rotation) { + const b = bjork(pulses, steps); + if (rotation) { + return rotate(b, -rotation); + } + return b; +}; + +export const euclid = register('euclid', function (pulses, steps, pat) { + return pat.struct(_euclidRot(pulses, steps, 0)); +}); + +export const e = register('e', function (euc, pat) { + if (!Array.isArray(euc)) { + euc = [euc]; + } + const [pulses, steps = pulses, rot = 0] = euc; + return pat.struct(_euclidRot(pulses, steps, rot)); +}); + +export const { euclidrot, euclidRot } = register(['euclidrot', 'euclidRot'], function (pulses, steps, rotation, pat) { + return pat.struct(_euclidRot(pulses, steps, rotation)); +}); + +/** + * Similar to `euclid`, but each pulse is held until the next pulse, + * so there will be no gaps. + * @name euclidLegato + * @memberof Pattern + * @param {number} pulses the number of onsets/beats + * @param {number} steps the number of steps to fill + * @param rotation offset in steps + * @param pat + * @example + * note("c3").euclidLegato(3,8) + */ + +const _euclidLegato = function (pulses, steps, rotation, pat) { + if (pulses < 1) { + return silence; + } + const bin_pat = _euclidRot(pulses, steps, 0); + const gapless = bin_pat + .join('') + .split('1') + .slice(1) + .map((s) => [s.length + 1, true]); + return pat.struct(timeCat(...gapless)).late(Fraction(rotation).div(steps)); +}; + +export const euclidLegato = register(['euclidLegato'], function (pulses, steps, pat) { + return _euclidLegato(pulses, steps, 0, pat); +}); + +/** + * Similar to `euclid`, but each pulse is held until the next pulse, + * so there will be no gaps, and has an additional parameter for 'rotating' + * the resulting sequence + * @name euclidLegatoRot + * @memberof Pattern + * @param {number} pulses the number of onsets/beats + * @param {number} steps the number of steps to fill + * @param {number} rotation offset in steps + * @example + * note("c3").euclidLegatoRot(3,5,2) + */ +export const euclidLegatoRot = register(['euclidLegatoRot'], function (pulses, steps, rotation, pat) { + return _euclidLegato(pulses, steps, rotation, pat); +}); + +/** + * A 'euclid' variant with an additional parameter that morphs the resulting + * rhythm from 0 (no morphing) to 1 (completely 'even'). For example + * `sound("bd").euclidish(3,8,0)` would be the same as + * `sound("bd").euclid(3,8)`, and `sound("bd").euclidish(3,8,1)` would be the + * same as `sound("bd bd bd")`. `sound("bd").euclidish(3,8,0.5)` would have a + * groove somewhere between. + * Inspired by the work of Malcom Braff. + * @name euclidish + * @synonyms eish + * @memberof Pattern + * @param {number} pulses the number of onsets + * @param {number} steps the number of steps to fill + * @param {number} groove exists between the extremes of 0 (straight euclidian) and 1 (straight pulse) + * @example + * sound("hh").euclidish(7,12,sine.slow(8)) + * .pan(sine.slow(8)) + */ +export const { euclidish, eish } = register(['euclidish', 'eish'], function (pulses, steps, perc, pat) { + const morphed = _morph(bjork(pulses, steps), new Array(pulses).fill(1), perc); + return pat.struct(morphed).setSteps(steps); +}); diff --git a/src/strudel/core/evaluate.mjs b/src/strudel/core/evaluate.mjs new file mode 100644 index 0000000..0599d86 --- /dev/null +++ b/src/strudel/core/evaluate.mjs @@ -0,0 +1,54 @@ +/* +evaluate.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +export const strudelScope = {}; + +export const evalScope = async (...args) => { + const results = await Promise.allSettled(args); + const modules = results.filter((result) => result.status === 'fulfilled').map((r) => r.value); + results.forEach((result, i) => { + if (result.status === 'rejected') { + console.warn(`evalScope: module with index ${i} could not be loaded:`, result.reason); + } + }); + // Object.assign(globalThis, ...modules); + // below is a fix for above commented out line + // same error as https://github.com/vitest-dev/vitest/issues/1807 when running this on astro server + modules.forEach((module) => { + Object.entries(module).forEach(([name, value]) => { + globalThis[name] = value; + strudelScope[name] = value; + }); + }); + return modules; +}; + +function safeEval(str, options = {}) { + const { wrapExpression = true, wrapAsync = true } = options; + if (wrapExpression) { + str = `{${str}}`; + } + if (wrapAsync) { + str = `(async ()=>${str})()`; + } + const body = `"use strict";return (${str})`; + return Function(body)(); +} + +export const evaluate = async (code, transpiler, transpilerOptions) => { + let meta = {}; + + if (transpiler) { + // transform syntactically correct js code to semantically usable code + const transpiled = transpiler(code, transpilerOptions); + code = transpiled.output; + meta = transpiled; + } + // if no transpiler is given, we expect a single instruction (!wrapExpression) + const options = { wrapExpression: !!transpiler }; + let evaluated = await safeEval(code, options); + return { mode: 'javascript', pattern: evaluated, meta }; +}; diff --git a/src/strudel/core/fraction.mjs b/src/strudel/core/fraction.mjs new file mode 100644 index 0000000..076fbad --- /dev/null +++ b/src/strudel/core/fraction.mjs @@ -0,0 +1,147 @@ +/* +fraction.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import Fraction from 'fraction.js'; +import { TimeSpan } from './timespan.mjs'; +import { removeUndefineds } from './util.mjs'; + +// Returns the start of the cycle. +Fraction.prototype.sam = function () { + return this.floor(); +}; + +// Returns the start of the next cycle. +Fraction.prototype.nextSam = function () { + return this.sam().add(1); +}; + +// Returns a TimeSpan representing the begin and end of the Time value's cycle +Fraction.prototype.wholeCycle = function () { + return new TimeSpan(this.sam(), this.nextSam()); +}; + +// The position of a time value relative to the start of its cycle. +Fraction.prototype.cyclePos = function () { + return this.sub(this.sam()); +}; + +Fraction.prototype.lt = function (other) { + return this.compare(other) < 0; +}; + +Fraction.prototype.gt = function (other) { + return this.compare(other) > 0; +}; + +Fraction.prototype.lte = function (other) { + return this.compare(other) <= 0; +}; + +Fraction.prototype.gte = function (other) { + return this.compare(other) >= 0; +}; + +Fraction.prototype.eq = function (other) { + return this.compare(other) == 0; +}; + +Fraction.prototype.ne = function (other) { + return this.compare(other) != 0; +}; + +Fraction.prototype.max = function (other) { + return this.gt(other) ? this : other; +}; + +Fraction.prototype.maximum = function (...others) { + others = others.map((x) => new Fraction(x)); + return others.reduce((max, other) => other.max(max), this); +}; + +Fraction.prototype.min = function (other) { + return this.lt(other) ? this : other; +}; + +Fraction.prototype.mulmaybe = function (other) { + return other !== undefined ? this.mul(other) : undefined; +}; + +Fraction.prototype.divmaybe = function (other) { + return other !== undefined ? this.div(other) : undefined; +}; + +Fraction.prototype.addmaybe = function (other) { + return other !== undefined ? this.add(other) : undefined; +}; + +Fraction.prototype.submaybe = function (other) { + return other !== undefined ? this.sub(other) : undefined; +}; + +Fraction.prototype.show = function (/* excludeWhole = false */) { + // return this.toFraction(excludeWhole); + return this.s * this.n + '/' + this.d; +}; + +Fraction.prototype.or = function (other) { + return this.eq(0) ? other : this; +}; + +const fraction = (n) => { + if (typeof n === 'number') { + /* + https://github.com/infusion/Fraction.js/#doubles + „If you pass a double as it is, Fraction.js will perform a number analysis based on Farey Sequences." + „If you want to keep the number as it is, convert it to a string, as the string parser will not perform any further observations“ + + -> those farey sequences turn out to make pattern querying ~20 times slower! always use strings! + -> still, some optimizations could be done: .mul .div .add .sub calls still use numbers + */ + // n = String(n); // this is actually faster but imprecise... + } + return Fraction(n); +}; + +export const gcd = (...fractions) => { + fractions = removeUndefineds(fractions); + if (fractions.length === 0) { + return undefined; + } + + return fractions.reduce((gcd, fraction) => gcd.gcd(fraction), fraction(1)); +}; + +export const lcm = (...fractions) => { + fractions = removeUndefineds(fractions); + if (fractions.length === 0) { + return undefined; + } + const x = fractions.pop(); + return fractions.reduce( + (lcm, fraction) => (lcm === undefined || fraction === undefined ? undefined : lcm.lcm(fraction)), + x, + ); +}; + +export const isFraction = (x) => x instanceof Fraction; + +fraction._original = Fraction; + +export default fraction; + +// "If you concern performance, cache Fraction.js objects and pass arrays/objects.“ +// -> tested memoized version, but it's slower than unmemoized, even with repeated evaluation +/* const memo = {}; +const memoizedFraction = (n) => { + if (typeof n === 'number') { + n = String(n); + } + if (memo[n] !== undefined) { + return memo[n]; + } + memo[n] = Fraction(n); + return memo[n]; +}; */ diff --git a/src/strudel/core/hap.mjs b/src/strudel/core/hap.mjs new file mode 100644 index 0000000..5f820d6 --- /dev/null +++ b/src/strudel/core/hap.mjs @@ -0,0 +1,178 @@ +/* +hap.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ +import Fraction from './fraction.mjs'; +import { stringifyValues } from './util.mjs'; + +export class Hap { + /* + Event class, representing a value active during the timespan + 'part'. This might be a fragment of an event, in which case the + timespan will be smaller than the 'whole' timespan, otherwise the + two timespans will be the same. The 'part' must never extend outside of the + 'whole'. If the event represents a continuously changing value + then the whole will be returned as None, in which case the given + value will have been sampled from the point halfway between the + start and end of the 'part' timespan. + The context is to store a list of source code locations causing the event. + + The word 'Event' is more or less a reserved word in javascript, hence this + class is named called 'Hap'. + */ + + constructor(whole, part, value, context = {}, stateful = false) { + this.whole = whole; + this.part = part; + this.value = value; + this.context = context; + this.stateful = stateful; + if (stateful) { + console.assert(typeof this.value === 'function', 'Stateful values must be functions'); + } + } + + get duration() { + let duration; + if (typeof this.value?.duration === 'number') { + duration = Fraction(this.value.duration); + } else { + duration = this.whole.end.sub(this.whole.begin); + } + if (typeof this.value?.clip === 'number') { + return duration.mul(this.value.clip); + } + return duration; + } + + get endClipped() { + return this.whole.begin.add(this.duration); + } + + isActive(currentTime) { + return this.whole.begin <= currentTime && this.endClipped >= currentTime; + } + + isInPast(currentTime) { + return currentTime > this.endClipped; + } + isInNearPast(margin, currentTime) { + return currentTime - margin <= this.endClipped; + } + + isInFuture(currentTime) { + return currentTime < this.whole.begin; + } + isInNearFuture(margin, currentTime) { + return currentTime < this.whole.begin && currentTime > this.whole.begin - margin; + } + isWithinTime(min, max) { + return this.whole.begin <= max && this.endClipped >= min; + } + + wholeOrPart() { + return this.whole ? this.whole : this.part; + } + + withSpan(func) { + // Returns a new hap with the function f applies to the hap timespan. + const whole = this.whole ? func(this.whole) : undefined; + return new Hap(whole, func(this.part), this.value, this.context); + } + + withValue(func) { + // Returns a new hap with the function f applies to the hap value. + return new Hap(this.whole, this.part, func(this.value), this.context); + } + + hasOnset() { + // Test whether the hap contains the onset, i.e that + // the beginning of the part is the same as that of the whole timespan.""" + return this.whole != undefined && this.whole.begin.equals(this.part.begin); + } + + hasTag(tag) { + return this.context.tags?.includes(tag); + } + + resolveState(state) { + if (this.stateful && this.hasOnset()) { + console.log('stateful'); + const func = this.value; + const [newState, newValue] = func(state); + return [newState, new Hap(this.whole, this.part, newValue, this.context, false)]; + } + return [state, this]; + } + + spanEquals(other) { + return (this.whole == undefined && other.whole == undefined) || this.whole.equals(other.whole); + } + + equals(other) { + return ( + this.spanEquals(other) && + this.part.equals(other.part) && + // TODO would == be better ?? + this.value === other.value + ); + } + + show(compact = false) { + const value = + typeof this.value === 'object' + ? compact + ? JSON.stringify(this.value).slice(1, -1).replaceAll('"', '').replaceAll(',', ' ') + : JSON.stringify(this.value) + : this.value; + var spans = ''; + if (this.whole == undefined) { + spans = '~' + this.part.show; + } else { + var is_whole = this.whole.begin.equals(this.part.begin) && this.whole.end.equals(this.part.end); + if (!this.whole.begin.equals(this.part.begin)) { + spans = this.whole.begin.show() + ' ⇜ '; + } + if (!is_whole) { + spans += '('; + } + spans += this.part.show(); + if (!is_whole) { + spans += ')'; + } + if (!this.whole.end.equals(this.part.end)) { + spans += ' ⇝ ' + this.whole.end.show(); + } + } + return '[ ' + spans + ' | ' + value + ' ]'; + } + + showWhole(compact = false) { + return `${this.whole == undefined ? '~' : this.whole.show()}: ${stringifyValues(this.value, compact)}`; + } + + combineContext(b) { + const a = this; + return { ...a.context, ...b.context, locations: (a.context.locations || []).concat(b.context.locations || []) }; + } + + setContext(context) { + return new Hap(this.whole, this.part, this.value, context); + } + + ensureObjectValue() { + /* if (isNote(hap.value)) { + // supports primitive hap values that look like notes + hap.value = { note: hap.value }; + } */ + if (typeof this.value !== 'object') { + throw new Error( + `expected hap.value to be an object, but got "${this.value}". Hint: append .note() or .s() to the end`, + 'error', + ); + } + } +} + +export default Hap; diff --git a/src/strudel/core/index.mjs b/src/strudel/core/index.mjs new file mode 100644 index 0000000..e4daf44 --- /dev/null +++ b/src/strudel/core/index.mjs @@ -0,0 +1,40 @@ +/* +index.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import * as controls from './controls.mjs'; // legacy +export * from './euclid.mjs'; +import Fraction from './fraction.mjs'; +import createClock from './zyklus.mjs'; +import { logger } from './logger.mjs'; +export { Fraction, controls, createClock }; +export * from './controls.mjs'; +export * from './hap.mjs'; +export * from './pattern.mjs'; +export * from './signal.mjs'; +export * from './pick.mjs'; +export * from './state.mjs'; +export * from './timespan.mjs'; +export * from './util.mjs'; +export * from './speak.mjs'; +export * from './evaluate.mjs'; +export * from './repl.mjs'; +export * from './cyclist.mjs'; +export * from './logger.mjs'; +export * from './time.mjs'; +export * from './ui.mjs'; +export { default as drawLine } from './drawLine.mjs'; +// below won't work with runtime.mjs (json import fails) +/* import * as p from './package.json'; +export const version = p.version; */ +logger('🌀 @strudel/core loaded 🌀'); +if (globalThis._strudelLoaded) { + console.warn( + `@strudel/core was loaded more than once... +This might happen when you have multiple versions of strudel installed. +Please check with "npm ls @strudel/core".`, + ); +} +globalThis._strudelLoaded = true; diff --git a/src/strudel/core/logger.mjs b/src/strudel/core/logger.mjs new file mode 100644 index 0000000..6727c24 --- /dev/null +++ b/src/strudel/core/logger.mjs @@ -0,0 +1,35 @@ +export const logKey = 'strudel.log'; + +let debounce = 1000, + lastMessage, + lastTime; + +export function errorLogger(e, origin = 'cyclist') { + if (process.env.NODE_ENV === 'development') { + console.error(e); + } + logger(`[${origin}] error: ${e.message}`); +} + +export function logger(message, type, data = {}) { + let t = performance.now(); + if (lastMessage === message && t - lastTime < debounce) { + return; + } + lastMessage = message; + lastTime = t; + console.log(`%c${message}`, 'background-color: black;color:white;border-radius:15px'); + if (typeof document !== 'undefined' && typeof CustomEvent !== 'undefined') { + document.dispatchEvent( + new CustomEvent(logKey, { + detail: { + message, + type, + data, + }, + }), + ); + } +} + +logger.key = logKey; diff --git a/src/strudel/core/neocyclist.mjs b/src/strudel/core/neocyclist.mjs new file mode 100644 index 0000000..3e41207 --- /dev/null +++ b/src/strudel/core/neocyclist.mjs @@ -0,0 +1,105 @@ +/* +neocyclist.mjs - event scheduler like cyclist, except recieves clock pulses from clockworker in order to sync across multiple instances. +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { logger } from './logger.mjs'; +import { ClockCollator, cycleToSeconds } from './util.mjs'; + +export class NeoCyclist { + constructor({ onTrigger, onToggle, getTime }) { + this.started = false; + this.cps = 0.5; + this.getTime = getTime; // get absolute time + this.time_at_last_tick_message = 0; + // the clock of the worker and the audio context clock can drift apart over time + // aditionally, the message time of the worker pinging the callback to process haps can be inconsistent. + // we need to keep a rolling average of the time difference between the worker clock and audio context clock + // in order to schedule events consistently. + this.collator = new ClockCollator({ getTargetClockTime: getTime }); + this.onToggle = onToggle; + this.latency = 0.1; // fixed trigger time offset + this.cycle = 0; + this.id = Math.round(Date.now() * Math.random()); + this.worker = new SharedWorker(new URL('./clockworker.js', import.meta.url)); + this.worker.port.start(); + this.channel = new BroadcastChannel('strudeltick'); + const tickCallback = (payload) => { + const { cps, begin, end, cycle, time } = payload; + this.cps = cps; + this.cycle = cycle; + const currentTime = this.collator.calculateOffset(time) + time; + processHaps(begin, end, currentTime); + this.time_at_last_tick_message = currentTime; + }; + + const processHaps = (begin, end, currentTime) => { + if (this.started === false) { + return; + } + const haps = this.pattern.queryArc(begin, end, { _cps: this.cps, cyclist: 'neocyclist' }); + haps.forEach((hap) => { + if (hap.hasOnset()) { + const timeUntilTrigger = cycleToSeconds(hap.whole.begin - this.cycle, this.cps); + const targetTime = timeUntilTrigger + currentTime + this.latency; + const duration = cycleToSeconds(hap.duration, this.cps); + onTrigger?.(hap, 0, duration, this.cps, targetTime); + } + }); + }; + + // receive messages from worker clock and process them + this.channel.onmessage = (message) => { + if (!this.started) { + return; + } + const { payload, type } = message.data; + + switch (type) { + case 'tick': { + tickCallback(payload); + } + } + }; + } + sendMessage(type, payload) { + this.worker.port.postMessage({ type, payload, id: this.id }); + } + + now() { + const gap = (this.getTime() - this.time_at_last_tick_message) * this.cps; + return this.cycle + gap; + } + setCps(cps = 1) { + this.sendMessage('cpschange', { cps }); + } + setCycle(cycle) { + this.sendMessage('setcycle', { cycle }); + } + setStarted(started) { + this.sendMessage('toggle', { started }); + this.started = started; + this.onToggle?.(started); + } + start() { + logger('[cyclist] start'); + this.setStarted(true); + } + stop() { + logger('[cyclist] stop'); + this.collator.reset(); + this.setStarted(false); + } + setPattern(pat, autostart = false) { + this.pattern = pat; + if (autostart && !this.started) { + this.start(); + } + } + + log(begin, end, haps) { + const onsets = haps.filter((h) => h.hasOnset()); + console.log(`${begin.toFixed(4)} - ${end.toFixed(4)} ${Array(onsets.length).fill('I').join('')}`); + } +} diff --git a/src/strudel/core/pattern.mjs b/src/strudel/core/pattern.mjs new file mode 100644 index 0000000..f5b0c67 --- /dev/null +++ b/src/strudel/core/pattern.mjs @@ -0,0 +1,3626 @@ +/* +pattern.mjs - Core pattern representation for strudel +Copyright (C) 2025 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import TimeSpan from './timespan.mjs'; +import Fraction, { isFraction, lcm } from './fraction.mjs'; +import Hap from './hap.mjs'; +import State from './state.mjs'; +import { unionWithObj } from './value.mjs'; + +import { + uniqsortr, + removeUndefineds, + flatten, + id, + listRange, + curry, + _mod, + numeralArgs, + parseNumeral, + pairs, + zipWith, + stringifyValues, +} from './util.mjs'; +import drawLine from './drawLine.mjs'; +import { logger } from './logger.mjs'; + +let stringParser; + +let __steps = true; + +export const calculateSteps = function (x) { + __steps = x ? true : false; +}; + +// parser is expected to turn a string into a pattern +// if set, the reify function will parse all strings with it +// intended to use with mini to automatically interpret all strings as mini notation +export const setStringParser = (parser) => (stringParser = parser); + +/** @class Class representing a pattern. */ +export class Pattern { + /** + * Create a pattern. As an end user, you will most likely not create a Pattern directly. + * + * @param {function} query - The function that maps a `State` to an array of `Hap`. + * @noAutocomplete + */ + constructor(query, steps = undefined) { + this.query = query; + this._Pattern = true; // this property is used to detectinstance of another Pattern + this._steps = steps; // in terms of number of steps per cycle + } + + get _steps() { + return this.__steps; + } + + set _steps(steps) { + this.__steps = steps === undefined ? undefined : Fraction(steps); + } + + setSteps(steps) { + this._steps = steps; + return this; + } + + withSteps(f) { + if (!__steps) { + return this; + } + return new Pattern(this.query, this._steps === undefined ? undefined : f(this._steps)); + } + + get hasSteps() { + return this._steps !== undefined; + } + + ////////////////////////////////////////////////////////////////////// + // Haskell-style functor, applicative and monadic operations + + /** + * Returns a new pattern, with the function applied to the value of + * each hap. It has the alias `fmap`. + * @synonyms fmap + * @param {Function} func to to apply to the value + * @returns Pattern + * @example + * "0 1 2".withValue(v => v + 10).log() + */ + withValue(func) { + const result = new Pattern((state) => this.query(state).map((hap) => hap.withValue(func))); + result._steps = this._steps; + return result; + } + + // runs func on query state + withState(func) { + return new Pattern((state) => this.query(func(state))); + } + + /** + * see `withValue` + * @noAutocomplete + */ + fmap(func) { + return this.withValue(func); + } + + /** + * Assumes 'this' is a pattern of functions, and given a function to + * resolve wholes, applies a given pattern of values to that + * pattern of functions. + * @param {Function} whole_func + * @param {Function} func + * @noAutocomplete + * @returns Pattern + */ + appWhole(whole_func, pat_val) { + const pat_func = this; + const query = function (state) { + const hap_funcs = pat_func.query(state); + const hap_vals = pat_val.query(state); + const apply = function (hap_func, hap_val) { + const s = hap_func.part.intersection(hap_val.part); + if (s == undefined) { + return undefined; + } + return new Hap( + whole_func(hap_func.whole, hap_val.whole), + s, + hap_func.value(hap_val.value), + hap_val.combineContext(hap_func), + ); + }; + return flatten( + hap_funcs.map((hap_func) => removeUndefineds(hap_vals.map((hap_val) => apply(hap_func, hap_val)))), + ); + }; + return new Pattern(query); + } + + /** + * When this method is called on a pattern of functions, it matches its haps + * with those in the given pattern of values. A new pattern is returned, with + * each matching value applied to the corresponding function. + * + * In this `_appBoth` variant, where timespans of the function and value haps + * are not the same but do intersect, the resulting hap has a timespan of the + * intersection. This applies to both the part and the whole timespan. + * @param {Pattern} pat_val + * @noAutocomplete + * @returns Pattern + */ + appBoth(pat_val) { + const pat_func = this; + + // Tidal's <*> + const whole_func = function (span_a, span_b) { + if (span_a == undefined || span_b == undefined) { + return undefined; + } + return span_a.intersection_e(span_b); + }; + const result = pat_func.appWhole(whole_func, pat_val); + if (__steps) { + result._steps = lcm(pat_val._steps, pat_func._steps); + } + return result; + } + + /** + * As with `appBoth`, but the `whole` timespan is not the intersection, + * but the timespan from the function of patterns that this method is called + * on. In practice, this means that the pattern structure, including onsets, + * are preserved from the pattern of functions (often referred to as the left + * hand or inner pattern). + * @param {Pattern} pat_val + * @noAutocomplete + * @returns Pattern + */ + appLeft(pat_val) { + const pat_func = this; + + const query = function (state) { + const haps = []; + for (const hap_func of pat_func.query(state)) { + const hap_vals = pat_val.query(state.setSpan(hap_func.wholeOrPart())); + for (const hap_val of hap_vals) { + const new_whole = hap_func.whole; + const new_part = hap_func.part.intersection(hap_val.part); + if (new_part) { + const new_value = hap_func.value(hap_val.value); + const new_context = hap_val.combineContext(hap_func); + const hap = new Hap(new_whole, new_part, new_value, new_context); + haps.push(hap); + } + } + } + return haps; + }; + const result = new Pattern(query); + result._steps = this._steps; + return result; + } + + /** + * As with `appLeft`, but `whole` timespans are instead taken from the + * pattern of values, i.e. structure is preserved from the right hand/outer + * pattern. + * @param {Pattern} pat_val + * @noAutocomplete + * @returns Pattern + */ + appRight(pat_val) { + const pat_func = this; + + const query = function (state) { + const haps = []; + for (const hap_val of pat_val.query(state)) { + const hap_funcs = pat_func.query(state.setSpan(hap_val.wholeOrPart())); + for (const hap_func of hap_funcs) { + const new_whole = hap_val.whole; + const new_part = hap_func.part.intersection(hap_val.part); + if (new_part) { + const new_value = hap_func.value(hap_val.value); + const new_context = hap_val.combineContext(hap_func); + const hap = new Hap(new_whole, new_part, new_value, new_context); + haps.push(hap); + } + } + } + return haps; + }; + const result = new Pattern(query); + result._steps = pat_val._steps; + return result; + } + + bindWhole(choose_whole, func) { + const pat_val = this; + const query = function (state) { + const withWhole = function (a, b) { + return new Hap( + choose_whole(a.whole, b.whole), + b.part, + b.value, + Object.assign({}, a.context, b.context, { + locations: (a.context.locations || []).concat(b.context.locations || []), + }), + ); + }; + const match = function (a) { + return func(a.value) + .query(state.setSpan(a.part)) + .map((b) => withWhole(a, b)); + }; + return flatten(pat_val.query(state).map((a) => match(a))); + }; + return new Pattern(query); + } + + bind(func) { + const whole_func = function (a, b) { + if (a == undefined || b == undefined) { + return undefined; + } + return a.intersection_e(b); + }; + return this.bindWhole(whole_func, func); + } + + join() { + // Flattens a pattern of patterns into a pattern, where wholes are + // the intersection of matched inner and outer haps. + return this.bind(id); + } + + outerBind(func) { + return this.bindWhole((a) => a, func).setSteps(this._steps); + } + + outerJoin() { + // Flattens a pattern of patterns into a pattern, where wholes are + // taken from outer haps. + return this.outerBind(id); + } + + innerBind(func) { + return this.bindWhole((_, b) => b, func); + } + + innerJoin() { + // Flattens a pattern of patterns into a pattern, where wholes are + // taken from inner haps. + return this.innerBind(id); + } + + // Flatterns patterns of patterns, by retriggering/resetting inner patterns at onsets of outer pattern haps + resetJoin(restart = false) { + const pat_of_pats = this; + return new Pattern((state) => { + return ( + pat_of_pats + // drop continuous haps from the outer pattern. + .discreteOnly() + .query(state) + .map((outer_hap) => { + return ( + outer_hap.value + // reset = align the inner pattern cycle start to outer pattern haps + // restart = align the inner pattern cycle zero to outer pattern haps + .late(restart ? outer_hap.whole.begin : outer_hap.whole.begin.cyclePos()) + .query(state) + .map((inner_hap) => + new Hap( + // Supports continuous haps in the inner pattern + inner_hap.whole ? inner_hap.whole.intersection(outer_hap.whole) : undefined, + inner_hap.part.intersection(outer_hap.part), + inner_hap.value, + ).setContext(outer_hap.combineContext(inner_hap)), + ) + // Drop haps that didn't intersect + .filter((hap) => hap.part) + ); + }) + .flat() + ); + }); + } + + restartJoin() { + return this.resetJoin(true); + } + + // Like the other joins above, joins a pattern of patterns of values, into a flatter + // pattern of values. In this case it takes whole cycles of the inner pattern to fit each event + // in the outer pattern. + squeezeJoin() { + // A pattern of patterns, which we call the 'outer' pattern, with patterns + // as values which we call the 'inner' patterns. + const pat_of_pats = this; + function query(state) { + // Get the events with the inner patterns. Ignore continuous events (without 'wholes') + const haps = pat_of_pats.discreteOnly().query(state); + // A function to map over the events from the outer pattern. + function flatHap(outerHap) { + // Get the inner pattern, slowed and shifted so that the 'whole' + // timespan of the outer event corresponds to the first cycle of the + // inner event + const inner_pat = outerHap.value._focusSpan(outerHap.wholeOrPart()); + // Get the inner events, from the timespan of the outer event's part + const innerHaps = inner_pat.query(state.setSpan(outerHap.part)); + // A function to map over the inner events, to combine them with the + // outer event + function munge(outer, inner) { + let whole = undefined; + if (inner.whole && outer.whole) { + whole = inner.whole.intersection(outer.whole); + if (!whole) { + // The wholes are present, but don't intersect + return undefined; + } + } + const part = inner.part.intersection(outer.part); + if (!part) { + // The parts don't intersect + return undefined; + } + const context = inner.combineContext(outer); + return new Hap(whole, part, inner.value, context); + } + return innerHaps.map((innerHap) => munge(outerHap, innerHap)); + } + const result = flatten(haps.map(flatHap)); + // remove undefineds + return result.filter((x) => x); + } + return new Pattern(query); + } + + squeezeBind(func) { + return this.fmap(func).squeezeJoin(); + } + + polyJoin = function () { + const pp = this; + return pp.fmap((p) => p.extend(pp._steps.div(p._steps))).outerJoin(); + }; + + polyBind(func) { + return this.fmap(func).polyJoin(); + } + + ////////////////////////////////////////////////////////////////////// + // Utility methods mainly for internal use + + /** + * Query haps inside the given time span. + * + * @param {Fraction | number} begin from time + * @param {Fraction | number} end to time + * @returns Hap[] + * @example + * const pattern = sequence('a', ['b', 'c']) + * const haps = pattern.queryArc(0, 1) + * console.log(haps) + * silence + * @noAutocomplete + */ + queryArc(begin, end, controls = {}) { + try { + return this.query(new State(new TimeSpan(begin, end), controls)); + } catch (err) { + logger(`[query]: ${err.message}`, 'error'); + return []; + } + } + + /** + * Returns a new pattern, with queries split at cycle boundaries. This makes + * some calculations easier to express, as all haps are then constrained to + * happen within a cycle. + * @returns Pattern + * @noAutocomplete + */ + splitQueries() { + const pat = this; + const q = (state) => { + return flatten(state.span.spanCycles.map((subspan) => pat.query(state.setSpan(subspan)))); + }; + return new Pattern(q); + } + + /** + * Returns a new pattern, where the given function is applied to the query + * timespan before passing it to the original pattern. + * @param {Function} func the function to apply + * @returns Pattern + * @noAutocomplete + */ + withQuerySpan(func) { + return new Pattern((state) => this.query(state.withSpan(func))); + } + + withQuerySpanMaybe(func) { + const pat = this; + return new Pattern((state) => { + const newState = state.withSpan(func); + if (!newState.span) { + return []; + } + return pat.query(newState); + }); + } + + /** + * As with `withQuerySpan`, but the function is applied to both the + * begin and end time of the query timespan. + * @param {Function} func the function to apply + * @returns Pattern + * @noAutocomplete + */ + withQueryTime(func) { + return new Pattern((state) => this.query(state.withSpan((span) => span.withTime(func)))); + } + + /** + * Similar to `withQuerySpan`, but the function is applied to the timespans + * of all haps returned by pattern queries (both `part` timespans, and where + * present, `whole` timespans). + * @param {Function} func + * @returns Pattern + * @noAutocomplete + */ + withHapSpan(func) { + return new Pattern((state) => this.query(state).map((hap) => hap.withSpan(func))); + } + + /** + * As with `withHapSpan`, but the function is applied to both the + * begin and end time of the hap timespans. + * @param {Function} func the function to apply + * @returns Pattern + * @noAutocomplete + */ + withHapTime(func) { + return this.withHapSpan((span) => span.withTime(func)); + } + + /** + * Returns a new pattern with the given function applied to the list of haps returned by every query. + * @param {Function} func + * @returns Pattern + * @noAutocomplete + */ + withHaps(func) { + const result = new Pattern((state) => func(this.query(state), state)); + result._steps = this._steps; + return result; + } + + /** + * As with `withHaps`, but applies the function to every hap, rather than every list of haps. + * @param {Function} func + * @returns Pattern + * @noAutocomplete + */ + withHap(func) { + return this.withHaps((haps) => haps.map(func)); + } + + /** + * Returns a new pattern with the context field set to every hap set to the given value. + * @param {*} context + * @returns Pattern + * @noAutocomplete + */ + setContext(context) { + return this.withHap((hap) => hap.setContext(context)); + } + + /** + * Returns a new pattern with the given function applied to the context field of every hap. + * @param {Function} func + * @returns Pattern + * @noAutocomplete + */ + withContext(func) { + const result = this.withHap((hap) => hap.setContext(func(hap.context))); + if (this.__pure !== undefined) { + result.__pure = this.__pure; + result.__pure_loc = this.__pure_loc; + } + return result; + } + + /** + * Returns a new pattern with the context field of every hap set to an empty object. + * @returns Pattern + * @noAutocomplete + */ + stripContext() { + return this.withHap((hap) => hap.setContext({})); + } + + /** + * Returns a new pattern with the given location information added to the + * context of every hap. + * @param {Number} start start offset + * @param {Number} end end offset + * @returns Pattern + * @noAutocomplete + */ + withLoc(start, end) { + const location = { + start, + end, + }; + const result = this.withContext((context) => { + const locations = (context.locations || []).concat([location]); + return { ...context, locations }; + }); + if (this.__pure) { + result.__pure = this.__pure; + result.__pure_loc = location; + } + return result; + } + + /** + * Returns a new Pattern, which only returns haps that meet the given test. + * @param {Function} hap_test - a function which returns false for haps to be removed from the pattern + * @returns Pattern + * @noAutocomplete + */ + filterHaps(hap_test) { + return new Pattern((state) => this.query(state).filter(hap_test)); + } + + /** + * As with `filterHaps`, but the function is applied to values + * inside haps. + * @param {Function} value_test + * @returns Pattern + * @noAutocomplete + */ + filterValues(value_test) { + return new Pattern((state) => this.query(state).filter((hap) => value_test(hap.value))).setSteps(this._steps); + } + + /** + * Returns a new pattern, with haps containing undefined values removed from + * query results. + * @returns Pattern + * @noAutocomplete + */ + removeUndefineds() { + return this.filterValues((val) => val != undefined); + } + + /** + * Returns a new pattern, with all haps without onsets filtered out. A hap + * with an onset is one with a `whole` timespan that begins at the same time + * as its `part` timespan. + * @returns Pattern + * @noAutocomplete + */ + onsetsOnly() { + // Returns a new pattern that will only return haps where the start + // of the 'whole' timespan matches the start of the 'part' + // timespan, i.e. the haps that include their 'onset'. + return this.filterHaps((hap) => hap.hasOnset()); + } + + /** + * Returns a new pattern, with 'continuous' haps (those without 'whole' + * timespans) removed from query results. + * @returns Pattern + * @noAutocomplete + */ + discreteOnly() { + // removes continuous haps that don't have a 'whole' timespan + return this.filterHaps((hap) => hap.whole); + } + + /** + * Combines adjacent haps with the same value and whole. Only + * intended for use in tests. + * @noAutocomplete + */ + defragmentHaps() { + // remove continuous haps + const pat = this.discreteOnly(); + + return pat.withHaps((haps) => { + const result = []; + for (var i = 0; i < haps.length; ++i) { + var searching = true; + var a = haps[i]; + while (searching) { + const a_value = JSON.stringify(haps[i].value); + var found = false; + + for (var j = i + 1; j < haps.length; j++) { + const b = haps[j]; + + if (a.whole.equals(b.whole)) { + if (a.part.begin.eq(b.part.end)) { + if (a_value === JSON.stringify(b.value)) { + // eat the matching hap into 'a' + a = new Hap(a.whole, new TimeSpan(b.part.begin, a.part.end), a.value); + haps.splice(j, 1); + // restart the search + found = true; + break; + } + } else if (b.part.begin.eq(a.part.end)) { + if (a_value == JSON.stringify(b.value)) { + // eat the matching hap into 'a' + a = new Hap(a.whole, new TimeSpan(a.part.begin, b.part.end), a.value); + haps.splice(j, 1); + // restart the search + found = true; + break; + } + } + } + } + + searching = found; + } + result.push(a); + } + return result; + }); + } + + /** + * Queries the pattern for the first cycle, returning Haps. Mainly of use when + * debugging a pattern. + * @param {Boolean} with_context - set to true, otherwise the context field + * will be stripped from the resulting haps. + * @returns [Hap] + * @noAutocomplete + */ + firstCycle(with_context = false) { + var self = this; + if (!with_context) { + self = self.stripContext(); + } + return self.query(new State(new TimeSpan(Fraction(0), Fraction(1)))); + } + + /** + * Accessor for a list of values returned by querying the first cycle. + * @noAutocomplete + */ + get firstCycleValues() { + return this.firstCycle().map((hap) => hap.value); + } + + /** + * More human-readable version of the `firstCycleValues` accessor. + * @noAutocomplete + */ + get showFirstCycle() { + return this.firstCycle().map( + (hap) => `${hap.value}: ${hap.whole.begin.toFraction()} - ${hap.whole.end.toFraction()}`, + ); + } + + /** + * Returns a new pattern, which returns haps sorted in temporal order. Mainly + * of use when comparing two patterns for equality, in tests. + * @returns Pattern + * @noAutocomplete + */ + sortHapsByPart() { + return this.withHaps((haps) => + haps.sort((a, b) => + a.part.begin + .sub(b.part.begin) + .or(a.part.end.sub(b.part.end)) + .or(a.whole.begin.sub(b.whole.begin).or(a.whole.end.sub(b.whole.end))), + ), + ); + } + + asNumber() { + return this.fmap(parseNumeral); + } + + ////////////////////////////////////////////////////////////////////// + // Operators - see 'make composers' later.. + + _opIn(other, func) { + return this.fmap(func).appLeft(reify(other)); + } + _opOut(other, func) { + return this.fmap(func).appRight(reify(other)); + } + _opMix(other, func) { + return this.fmap(func).appBoth(reify(other)); + } + _opSqueeze(other, func) { + const otherPat = reify(other); + return this.fmap((a) => otherPat.fmap((b) => func(a)(b))).squeezeJoin(); + } + _opSqueezeOut(other, func) { + const thisPat = this; + const otherPat = reify(other); + return otherPat.fmap((a) => thisPat.fmap((b) => func(b)(a))).squeezeJoin(); + } + _opReset(other, func) { + const otherPat = reify(other); + return otherPat.fmap((b) => this.fmap((a) => func(a)(b))).resetJoin(); + } + _opRestart(other, func) { + const otherPat = reify(other); + return otherPat.fmap((b) => this.fmap((a) => func(a)(b))).restartJoin(); + } + _opPoly(other, func) { + const otherPat = reify(other); + return this.fmap((b) => otherPat.fmap((a) => func(a)(b))).polyJoin(); + } + + ////////////////////////////////////////////////////////////////////// + // End-user methods. + // Those beginning with an underscore (_) are 'patternified', + // i.e. versions are created without the underscore, that are + // magically transformed to accept patterns for all their arguments. + + ////////////////////////////////////////////////////////////////////// + // Methods without corresponding toplevel functions + + /** + * Layers the result of the given function(s). Like `superimpose`, but without the original pattern: + * @name layer + * @memberof Pattern + * @synonyms apply + * @returns Pattern + * @example + * "<0 2 4 6 ~ 4 ~ 2 0!3 ~!5>*8" + * .layer(x=>x.add("0,2")) + * .scale('C minor').note() + */ + layer(...funcs) { + return stack(...funcs.map((func) => func(this))); + } + + /** + * Superimposes the result of the given function(s) on top of the original pattern: + * @name superimpose + * @memberof Pattern + * @returns Pattern + * @example + * "<0 2 4 6 ~ 4 ~ 2 0!3 ~!5>*8" + * .superimpose(x=>x.add(2)) + * .scale('C minor').note() + */ + superimpose(...funcs) { + return this.stack(...funcs.map((func) => func(this))); + } + + ////////////////////////////////////////////////////////////////////// + // Multi-pattern functions + + stack(...pats) { + return stack(this, ...pats); + } + + sequence(...pats) { + return sequence(this, ...pats); + } + + seq(...pats) { + return sequence(this, ...pats); + } + cat(...pats) { + return cat(this, ...pats); + } + + fastcat(...pats) { + return fastcat(this, ...pats); + } + + slowcat(...pats) { + return slowcat(this, ...pats); + } + + ////////////////////////////////////////////////////////////////////// + // Context methods - ones that deal with metadata + + onTrigger(onTrigger, dominant = true) { + return this.withHap((hap) => + hap.setContext({ + ...hap.context, + onTrigger: (...args) => { + // run previously set trigger, if it exists + hap.context.onTrigger?.(...args); + onTrigger(...args); + }, + // if dominantTrigger is set to true, the default output (webaudio) will be disabled + // when using multiple triggers, you cannot flip this flag to false again! + // example: x.csound('CooLSynth').log() as well as x.log().csound('CooLSynth') should work the same + dominantTrigger: hap.context.dominantTrigger || dominant, + }), + ); + } + + /** + * Writes the content of the current event to the console (visible in the side menu). + * @name log + * @memberof Pattern + * @example + * s("bd sd").log() + */ + log(func = (hap) => `[hap] ${hap.showWhole(true)}`, getData = (hap) => ({ hap })) { + return this.onTrigger((...args) => { + logger(func(...args), undefined, getData(...args)); + }, false); + } + + /** + * A simplified version of `log` which writes all "values" (various configurable parameters) + * within the event to the console (visible in the side menu). + * @name logValues + * @memberof Pattern + * @example + * s("bd sd").gain("0.25 0.5 1").n("2 1 0").logValues() + */ + logValues(func = (value) => `[hap] ${stringifyValues(value, true)}`) { + return this.log((hap) => func(hap.value)); + } + + ////////////////////////////////////////////////////////////////////// + // Visualisation + + drawLine() { + console.log(drawLine(this)); + return this; + } + + ////////////////////////////////////////////////////////////////////// + // methods relating to breaking patterns into subcycles + + // Breaks a pattern into a pattern of patterns, according to the structure of the given binary pattern. + unjoin(pieces, func = id) { + return pieces.withHap((hap) => + hap.withValue((v) => (v ? func(this.ribbon(hap.whole.begin, hap.whole.duration)) : this)), + ); + } + + /** + * Breaks a pattern into pieces according to the structure of a given pattern. + * True values in the given pattern cause the corresponding subcycle of the + * source pattern to be looped, and for an (optional) given function to be + * applied. False values result in the corresponding part of the source pattern + * to be played unchanged. + * @name into + * @memberof Pattern + * @example + * sound("bd sd ht lt").into("1 0", hurry(2)) + */ + into(pieces, func) { + return this.unjoin(pieces, func).innerJoin(); + } +} + +////////////////////////////////////////////////////////////////////// +// functions relating to chords/patterns of lists/lists of patterns + +// returns Array where each list of haps satisfies eq +function groupHapsBy(eq, haps) { + let groups = []; + haps.forEach((hap) => { + const match = groups.findIndex(([other]) => eq(hap, other)); + if (match === -1) { + groups.push([hap]); + } else { + groups[match].push(hap); + } + }); + return groups; +} + +// congruent haps = haps with equal spans +const congruent = (a, b) => a.spanEquals(b); +// Pattern> -> Pattern> +// returned pattern contains arrays of congruent haps +Pattern.prototype.collect = function () { + return this.withHaps((haps) => + groupHapsBy(congruent, haps).map((_haps) => new Hap(_haps[0].whole, _haps[0].part, _haps, {})), + ); +}; + +/** + * Selects indices in in stacked notes. + * @example + * note("<[c,eb,g]!2 [c,f,ab] [d,f,ab]>") + * .arpWith(haps => haps[2]) + * */ +export const arpWith = register('arpWith', (func, pat) => { + return pat + .collect() + .fmap((v) => reify(func(v))) + .innerJoin() + .withHap((h) => new Hap(h.whole, h.part, h.value.value, h.combineContext(h.value))); +}); + +/** + * Selects indices in in stacked notes. + * @example + * note("<[c,eb,g]!2 [c,f,ab] [d,f,ab]>") + * .arp("0 [0,2] 1 [0,2]") + * */ +export const arp = register( + 'arp', + (indices, pat) => pat.arpWith((haps) => reify(indices).fmap((i) => haps[i % haps.length])), + false, +); + +/* + * Takes a time duration followed by one or more patterns, and shifts the given patterns in time, so they are + * distributed equally over the given time duration. They are then combined with the pattern 'weave' is called on, after it has been stretched out (i.e. slowed down by) the time duration. + * @name weave + * @memberof Pattern + * @example pan(saw).weave(4, s("bd(3,8)"), s("~ sd")) + * @example n("0 1 2 3 4 5 6 7").weave(8, s("bd(3,8)"), s("~ sd")) + +addToPrototype('weave', function (t, ...pats) { + return this.weaveWith(t, ...pats.map((x) => set.out(x))); +}); + +*/ +/* + * Like 'weave', but accepts functions rather than patterns, which are applied to the pattern. + * @name weaveWith + * @memberof Pattern + +addToPrototype('weaveWith', function (t, ...funcs) { + const pat = this; + const l = funcs.length; + t = Fraction(t); + if (l == 0) { + return silence; + } + return stack(...funcs.map((func, i) => pat.inside(t, func).early(Fraction(i).div(l))))._slow(t); +}); +*/ + +////////////////////////////////////////////////////////////////////// +// compose matrix functions + +function _nonArrayObject(x) { + return !Array.isArray(x) && typeof x === 'object' && !isFraction(x); +} +function _composeOp(a, b, func) { + if (_nonArrayObject(a) || _nonArrayObject(b)) { + if (!_nonArrayObject(a)) { + a = { value: a }; + } + if (!_nonArrayObject(b)) { + b = { value: b }; + } + return unionWithObj(a, b, func); + } + return func(a, b); +} + +// Make composers +(function () { + // pattern composers + const composers = { + set: [(a, b) => b], + keep: [(a) => a], + keepif: [(a, b) => (b ? a : undefined)], + + // numerical functions + /** + * + * Assumes a pattern of numbers. Adds the given number to each item in the pattern. + * @name add + * @memberof Pattern + * @example + * // Here, the triad 0, 2, 4 is shifted by different amounts + * n("0 2 4".add("<0 3 4 0>")).scale("C:major") + * // Without add, the equivalent would be: + * // n("<[0 2 4] [3 5 7] [4 6 8] [0 2 4]>").scale("C:major") + * @example + * // You can also use add with notes: + * note("c3 e3 g3".add("<0 5 7 0>")) + * // Behind the scenes, the notes are converted to midi numbers: + * // note("48 52 55".add("<0 5 7 0>")) + */ + add: [numeralArgs((a, b) => a + b)], // support string concatenation + /** + * + * Like add, but the given numbers are subtracted. + * @name sub + * @memberof Pattern + * @example + * n("0 2 4".sub("<0 1 2 3>")).scale("C4:minor") + * // See add for more information. + */ + sub: [numeralArgs((a, b) => a - b)], + /** + * + * Multiplies each number by the given factor. + * @name mul + * @memberof Pattern + * @example + * "<1 1.5 [1.66, <2 2.33>]>*4".mul(150).freq() + */ + mul: [numeralArgs((a, b) => a * b)], + /** + * + * Divides each number by the given factor. + * @name div + * @memberof Pattern + */ + div: [numeralArgs((a, b) => a / b)], + mod: [numeralArgs(_mod)], + pow: [numeralArgs(Math.pow)], + log2: [numeralArgs(Math.log2)], + band: [numeralArgs((a, b) => a & b)], + bor: [numeralArgs((a, b) => a | b)], + bxor: [numeralArgs((a, b) => a ^ b)], + blshift: [numeralArgs((a, b) => a << b)], + brshift: [numeralArgs((a, b) => a >> b)], + + // TODO - force numerical comparison if both look like numbers? + lt: [(a, b) => a < b], + gt: [(a, b) => a > b], + lte: [(a, b) => a <= b], + gte: [(a, b) => a >= b], + eq: [(a, b) => a == b], + eqt: [(a, b) => a === b], + ne: [(a, b) => a != b], + net: [(a, b) => a !== b], + and: [(a, b) => a && b], + or: [(a, b) => a || b], + + // bitwise ops + func: [(a, b) => b(a)], + }; + + const hows = ['In', 'Out', 'Mix', 'Squeeze', 'SqueezeOut', 'Reset', 'Restart', 'Poly']; + + // generate methods to do what and how + for (const [what, [op, preprocess]] of Object.entries(composers)) { + // make plain version, e.g. pat._add(value) adds that plain value + // to all the values in pat + Pattern.prototype['_' + what] = function (value) { + return this.fmap((x) => op(x, value)); + }; + + // make patternified monster version + Object.defineProperty(Pattern.prototype, what, { + // a getter that returns a function, so 'pat' can be + // accessed by closures that are methods of that function.. + get: function () { + const pat = this; + + // wrap the 'in' function as default behaviour + const wrapper = (...other) => pat[what]['in'](...other); + + // add methods to that function for each behaviour + for (const how of hows) { + wrapper[how.toLowerCase()] = function (...other) { + var howpat = pat; + other = sequence(other); + if (preprocess) { + howpat = preprocess(howpat); + other = preprocess(other); + } + var result; + // hack to remove undefs when doing 'keepif' + if (what === 'keepif') { + // avoid union, as we want to throw away the value of 'b' completely + result = howpat['_op' + how](other, (a) => (b) => op(a, b)); + result = result.removeUndefineds(); + } else { + result = howpat['_op' + how](other, (a) => (b) => _composeOp(a, b, op)); + } + return result; + }; + } + wrapper.squeezein = wrapper.squeeze; + + return wrapper; + }, + }); + + // Default op to 'set', e.g. pat.squeeze(pat2) = pat.set.squeeze(pat2) + for (const how of hows) { + Pattern.prototype[how.toLowerCase()] = function (...args) { + return this.set[how.toLowerCase()](args); + }; + } + } + + // binary composers + /** + * Applies the given structure to the pattern: + * + * @example + * note("c,eb,g") + * .struct("x ~ x ~ ~ x ~ x ~ ~ ~ x ~ x ~ ~") + * .slow(2) + */ + Pattern.prototype.struct = function (...args) { + return this.keepif.out(...args); + }; + Pattern.prototype.structAll = function (...args) { + return this.keep.out(...args); + }; + /** + * Returns silence when mask is 0 or "~" + * + * @example + * note("c [eb,g] d [eb,g]").mask("<1 [0 1]>") + */ + Pattern.prototype.mask = function (...args) { + return this.keepif.in(...args); + }; + Pattern.prototype.maskAll = function (...args) { + return this.keep.in(...args); + }; + /** + * Resets the pattern to the start of the cycle for each onset of the reset pattern. + * + * @example + * s("[ sd]*2, hh*8").reset("") + */ + Pattern.prototype.reset = function (...args) { + return this.keepif.reset(...args); + }; + Pattern.prototype.resetAll = function (...args) { + return this.keep.reset(...args); + }; + /** + * Restarts the pattern for each onset of the restart pattern. + * While reset will only reset the current cycle, restart will start from cycle 0. + * + * @example + * s("[ sd]*2, hh*8").restart("") + */ + Pattern.prototype.restart = function (...args) { + return this.keepif.restart(...args); + }; + Pattern.prototype.restartAll = function (...args) { + return this.keep.restart(...args); + }; +})(); + +// aliases +export const polyrhythm = stack; +export const pr = stack; + +export const pm = polymeter; + +// methods that create patterns, which are added to patternified Pattern methods +// TODO: remove? this is only used in old transpiler (shapeshifter) +// Pattern.prototype.factories = { +// pure, +// stack, +// slowcat, +// fastcat, +// cat, +// timecat, +// sequence, +// seq, +// polymeter, +// pm, +// polyrhythm, +// pr, +// }; +// the magic happens in Pattern constructor. Keeping this in prototype enables adding methods from the outside (e.g. see tonal.ts) + +// Elemental patterns + +/** + * Does absolutely nothing, but with a given metrical 'steps' + * @name gap + * @param {number} steps + * @example + * gap(3) // "~@3" + */ +export const gap = (steps) => new Pattern(() => [], steps); + +/** + * Does absolutely nothing.. + * @name silence + * @example + * silence // "~" + */ +export const silence = gap(1); + +/* Like silence, but with a 'steps' (relative duration) of 0 */ +export const nothing = gap(0); + +/** + * A discrete value that repeats once per cycle. + * + * @returns {Pattern} + * @example + * pure('e4') // "e4" + * @noAutocomplete + */ +export function pure(value) { + function query(state) { + return state.span.spanCycles.map((subspan) => new Hap(Fraction(subspan.begin).wholeCycle(), subspan, value)); + } + const result = new Pattern(query, 1); + result.__pure = value; + return result; +} + +export function isPattern(thing) { + // thing?.constructor?.name !== 'Pattern' // <- this will fail when code is mangled + const is = thing instanceof Pattern || thing?._Pattern; + // TODO: find out how to check wrong core dependency. below will never work !thing === 'undefined' + // wrapping it in (..) will result other checks to log that warning (e.g. isPattern('kalimba')) + /* if (!thing instanceof Pattern) { + console.warn( + `Found Pattern that fails "instanceof Pattern" check. + This may happen if you are using multiple versions of @strudel/core. + Please check by running "npm ls @strudel/core".`, + ); + console.log(thing); + } */ + return is; +} + +export function reify(thing) { + // Turns something into a pattern, unless it's already a pattern + if (isPattern(thing)) { + return thing; + } + if (stringParser && typeof thing === 'string') { + return stringParser(thing); + } + return pure(thing); +} + +/** Takes a list of patterns, and returns a pattern of lists. + */ +export function sequenceP(pats) { + let result = pure([]); + for (const pat of pats) { + result = result.bind((list) => pat.fmap((v) => list.concat([v]))); + } + return result; +} + +/** + * The given items are played at the same time at the same length. + * + * @return {Pattern} + * @synonyms polyrhythm, pr + * @example + * stack("g3", "b3", ["e4", "d4"]).note() + * // "g3,b3,[e4 d4]".note() + * + * @example + * // As a chained function: + * s("hh*4").stack( + * note("c4(5,8)") + * ) + */ +export function stack(...pats) { + // Array test here is to avoid infinite recursions.. + pats = pats.map((pat) => (Array.isArray(pat) ? sequence(...pat) : reify(pat))); + const query = (state) => flatten(pats.map((pat) => pat.query(state))); + const result = new Pattern(query); + if (__steps) { + result._steps = lcm(...pats.map((pat) => pat._steps)); + } + return result; +} + +function _stackWith(func, pats) { + pats = pats.map((pat) => (Array.isArray(pat) ? sequence(...pat) : reify(pat))); + if (pats.length === 0) { + return silence; + } + if (pats.length === 1) { + return pats[0]; + } + const [left, ...right] = pats.map((pat) => pat._steps); + const steps = __steps ? left.maximum(...right) : undefined; + return stack(...func(steps, pats)); +} + +export function stackLeft(...pats) { + return _stackWith( + (steps, pats) => pats.map((pat) => (pat._steps.eq(steps) ? pat : stepcat(pat, gap(steps.sub(pat._steps))))), + pats, + ); +} + +export function stackRight(...pats) { + return _stackWith( + (steps, pats) => pats.map((pat) => (pat._steps.eq(steps) ? pat : stepcat(gap(steps.sub(pat._steps)), pat))), + pats, + ); +} + +export function stackCentre(...pats) { + return _stackWith( + (steps, pats) => + pats.map((pat) => { + if (pat._steps.eq(steps)) { + return pat; + } + const g = gap(steps.sub(pat._steps).div(2)); + return stepcat(g, pat, g); + }), + pats, + ); +} + +export function stackBy(by, ...pats) { + const [left, ...right] = pats.map((pat) => pat._steps); + const steps = left.maximum(...right); + const lookup = { + centre: stackCentre, + left: stackLeft, + right: stackRight, + expand: stack, + repeat: (...args) => polymeter(...args).steps(steps), + }; + return by + .inhabit(lookup) + .fmap((func) => func(...pats)) + .innerJoin() + .setSteps(steps); +} + +/** + * Concatenation: combines a list of patterns, switching between them successively, one per cycle. + * + * @return {Pattern} + * @synonyms cat + * @example + * slowcat("e5", "b4", ["d5", "c5"]) + * + */ +export function slowcat(...pats) { + // Array test here is to avoid infinite recursions.. + pats = pats.map((pat) => (Array.isArray(pat) ? fastcat(...pat) : reify(pat))); + + if (pats.length == 1) { + return pats[0]; + } + + const query = function (state) { + const span = state.span; + const pat_n = _mod(span.begin.sam(), pats.length); + const pat = pats[pat_n]; + if (!pat) { + // pat_n can be negative, if the span is in the past.. + return []; + } + // A bit of maths to make sure that cycles from constituent patterns aren't skipped. + // For example if three patterns are slowcat-ed, the fourth cycle of the result should + // be the second (rather than fourth) cycle from the first pattern. + const offset = span.begin.floor().sub(span.begin.div(pats.length).floor()); + return pat.withHapTime((t) => t.add(offset)).query(state.setSpan(span.withTime((t) => t.sub(offset)))); + }; + const steps = __steps ? lcm(...pats.map((x) => x._steps)) : undefined; + return new Pattern(query).splitQueries().setSteps(steps); +} + +/** Concatenation: combines a list of patterns, switching between them successively, one per cycle. Unlike slowcat, this version will skip cycles. + * @param {...any} items - The items to concatenate + * @return {Pattern} + */ +export function slowcatPrime(...pats) { + pats = pats.map(reify); + const query = function (state) { + const pat_n = Math.floor(state.span.begin) % pats.length; + const pat = pats[pat_n]; // can be undefined for same cases e.g. /#cHVyZSg0MikKICAuZXZlcnkoMyxhZGQoNykpCiAgLmxhdGUoLjUp + return pat?.query(state) || []; + }; + return new Pattern(query).splitQueries(); +} + +/** The given items are con**cat**enated, where each one takes one cycle. + * + * @param {...any} items - The items to concatenate + * @synonyms slowcat + * @return {Pattern} + * @example + * cat("e5", "b4", ["d5", "c5"]).note() + * // "".note() + * + * @example + * // As a chained function: + * s("hh*4").cat( + * note("c4(5,8)") + * ) + */ +export function cat(...pats) { + return slowcat(...pats); +} + +/** + * Allows to arrange multiple patterns together over multiple cycles. + * Takes a variable number of arrays with two elements specifying the number of cycles and the pattern to use. + * + * @return {Pattern} + * @example + * arrange( + * [4, "(3,8)"], + * [2, "(5,8)"] + * ).note() + */ +export function arrange(...sections) { + const total = sections.reduce((sum, [cycles]) => sum + cycles, 0); + sections = sections.map(([cycles, section]) => [cycles, section.fast(cycles)]); + return stepcat(...sections).slow(total); +} + +/** + * Similarly to `arrange`, allows you to arrange multiple patterns together over multiple cycles. + * Unlike `arrange`, you specify a start and stop time for each pattern rather than duration, which + * means that patterns can overlap. + * @return {Pattern} + * @example +seqPLoop([0, 2, "bd(3,8)"], + [1, 3, "cp(3,8)"] + ) + .sound() + */ +export function seqPLoop(...parts) { + let total = Fraction(0); + const pats = []; + for (let part of parts) { + if (part.length == 2) { + part.unshift(total); + } + total = part[1]; + } + + return stack( + ...parts.map(([start, stop, pat]) => + pure(reify(pat)).compress(Fraction(start).div(total), Fraction(stop).div(total)), + ), + ) + .slow(total) + .innerJoin(); // or resetJoin or restartJoin ?? +} + +export function fastcat(...pats) { + let result = slowcat(...pats); + if (pats.length > 1) { + result = result._fast(pats.length); + result._steps = pats.length; + } + if (pats.length == 1 && pats[0].__steps_source) { + pats._steps = pats[0]._steps; + } + return result; +} + +/** See `fastcat` */ +export function sequence(...pats) { + return fastcat(...pats); +} + +/** Like **cat**, but the items are crammed into one cycle. + * @synonyms sequence, fastcat + * @example + * seq("e5", "b4", ["d5", "c5"]).note() + * // "e5 b4 [d5 c5]".note() + * + * @example + * // As a chained function: + * s("hh*4").seq( + * note("c4(5,8)") + * ) + */ + +export function seq(...pats) { + return fastcat(...pats); +} + +function _sequenceCount(x) { + if (Array.isArray(x)) { + if (x.length == 0) { + return [silence, 0]; + } + if (x.length == 1) { + return _sequenceCount(x[0]); + } + return [fastcat(...x.map((a) => _sequenceCount(a)[0])), x.length]; + } + return [reify(x), 1]; +} + +export const mask = curry((a, b) => reify(b).mask(a)); +export const struct = curry((a, b) => reify(b).struct(a)); +export const superimpose = curry((a, b) => reify(b).superimpose(...a)); +export const withValue = curry((a, b) => reify(b).withValue(a)); + +export const bind = curry((a, b) => reify(b).bind(a)); +export const innerBind = curry((a, b) => reify(b).innerBind(a)); +export const outerBind = curry((a, b) => reify(b).outerBind(a)); +export const squeezeBind = curry((a, b) => reify(b).squeezeBind(a)); +export const stepBind = curry((a, b) => reify(b).stepBind(a)); +export const polyBind = curry((a, b) => reify(b).polyBind(a)); + +// operators +export const set = curry((a, b) => reify(b).set(a)); +export const keep = curry((a, b) => reify(b).keep(a)); +export const keepif = curry((a, b) => reify(b).keepif(a)); +export const add = curry((a, b) => reify(b).add(a)); +export const sub = curry((a, b) => reify(b).sub(a)); +export const mul = curry((a, b) => reify(b).mul(a)); +export const div = curry((a, b) => reify(b).div(a)); +export const mod = curry((a, b) => reify(b).mod(a)); +export const pow = curry((a, b) => reify(b).pow(a)); +export const band = curry((a, b) => reify(b).band(a)); +export const bor = curry((a, b) => reify(b).bor(a)); +export const bxor = curry((a, b) => reify(b).bxor(a)); +export const blshift = curry((a, b) => reify(b).blshift(a)); +export const brshift = curry((a, b) => reify(b).brshift(a)); +export const lt = curry((a, b) => reify(b).lt(a)); +export const gt = curry((a, b) => reify(b).gt(a)); +export const lte = curry((a, b) => reify(b).lte(a)); +export const gte = curry((a, b) => reify(b).gte(a)); +export const eq = curry((a, b) => reify(b).eq(a)); +export const eqt = curry((a, b) => reify(b).eqt(a)); +export const ne = curry((a, b) => reify(b).ne(a)); +export const net = curry((a, b) => reify(b).net(a)); +export const and = curry((a, b) => reify(b).and(a)); +export const or = curry((a, b) => reify(b).or(a)); +export const func = curry((a, b) => reify(b).func(a)); + +/** + * Registers a new pattern method. The method is added to the Pattern class + the standalone function is returned from register. + * + * @param {string | string[]} name name of the function, or an array of names to be used as synonyms + * @param {function} func function with 1 or more params, where last is the current pattern + * @noAutocomplete + * + */ +export function register(name, func, patternify = true, preserveSteps = false, join = (x) => x.innerJoin()) { + if (Array.isArray(name)) { + const result = {}; + for (const name_item of name) { + result[name_item] = register(name_item, func, patternify, preserveSteps, join); + } + return result; + } + const arity = func.length; + var pfunc; // the patternified function + + if (patternify) { + pfunc = function (...args) { + args = args.map(reify); + const pat = args[args.length - 1]; + let result; + + if (arity === 1) { + result = func(pat); + } else { + const firstArgs = args.slice(0, -1); + + if (firstArgs.every((arg) => arg.__pure != undefined)) { + const pureArgs = firstArgs.map((arg) => arg.__pure); + const pureLocs = firstArgs.filter((arg) => arg.__pure_loc).map((arg) => arg.__pure_loc); + result = func(...pureArgs, pat); + result = result.withContext((context) => { + const locations = (context.locations || []).concat(pureLocs); + return { ...context, locations }; + }); + } else { + const [left, ...right] = firstArgs; + + let mapFn = (...args) => { + return func(...args, pat); + }; + mapFn = curry(mapFn, null, arity - 1); + result = join(right.reduce((acc, p) => acc.appLeft(p), left.fmap(mapFn))); + } + } + if (preserveSteps) { + result._steps = pat._steps; + } + return result; + }; + } else { + pfunc = function (...args) { + args = args.map(reify); + const result = func(...args); + if (preserveSteps) { + result._steps = args[args.length - 1]._steps; + } + return result; + }; + } + + Pattern.prototype[name] = function (...args) { + // For methods that take a single argument (plus 'this'), allow + // multiple arguments but sequence them + if (arity === 2 && args.length !== 1) { + args = [sequence(...args)]; + } else if (arity !== args.length + 1) { + throw new Error(`.${name}() expects ${arity - 1} inputs but got ${args.length}.`); + } + args = args.map(reify); + return pfunc(...args, this); + }; + + if (arity > 1) { + // There are patternified args, so lets make an unpatternified + // version, prefixed by '_' + Pattern.prototype['_' + name] = function (...args) { + const result = func(...args, this); + if (preserveSteps) { + result.setSteps(this._steps); + } + return result; + }; + } + + // toplevel functions get curried as well as patternified + // because pfunc uses spread args, we need to state the arity explicitly! + return curry(pfunc, null, arity); +} + +// Like register, but defaults to stepJoin +function stepRegister(name, func, patternify = true, preserveSteps = false, join = (x) => x.stepJoin()) { + return register(name, func, patternify, preserveSteps, join); +} + +////////////////////////////////////////////////////////////////////// +// Numerical transformations + +/** + * Assumes a numerical pattern. Returns a new pattern with all values rounded + * to the nearest integer. + * @name round + * @memberof Pattern + * @returns Pattern + * @example + * n("0.5 1.5 2.5".round()).scale("C:major") + */ +export const round = register('round', function (pat) { + return pat.asNumber().fmap((v) => Math.round(v)); +}); + +/** + * Assumes a numerical pattern. Returns a new pattern with all values set to + * their mathematical floor. E.g. `3.7` replaced with to `3`, and `-4.2` + * replaced with `-5`. + * @name floor + * @memberof Pattern + * @returns Pattern + * @example + * note("42 42.1 42.5 43".floor()) + */ +export const floor = register('floor', function (pat) { + return pat.asNumber().fmap((v) => Math.floor(v)); +}); + +/** + * Assumes a numerical pattern. Returns a new pattern with all values set to + * their mathematical ceiling. E.g. `3.2` replaced with `4`, and `-4.2` + * replaced with `-4`. + * @name ceil + * @memberof Pattern + * @returns Pattern + * @example + * note("42 42.1 42.5 43".ceil()) + */ +export const ceil = register('ceil', function (pat) { + return pat.asNumber().fmap((v) => Math.ceil(v)); +}); +/** + * Assumes a numerical pattern, containing unipolar values in the range 0 .. + * 1. Returns a new pattern with values scaled to the bipolar range -1 .. 1 + * @returns Pattern + * @noAutocomplete + */ +export const toBipolar = register('toBipolar', function (pat) { + return pat.fmap((x) => x * 2 - 1); +}); + +/** + * Assumes a numerical pattern, containing bipolar values in the range -1 .. 1 + * Returns a new pattern with values scaled to the unipolar range 0 .. 1 + * @returns Pattern + * @noAutocomplete + */ +export const fromBipolar = register('fromBipolar', function (pat) { + return pat.fmap((x) => (x + 1) / 2); +}); + +/** + * Assumes a numerical pattern, containing unipolar values in the range 0 .. 1. + * Returns a new pattern with values scaled to the given min/max range. + * Most useful in combination with continuous patterns. + * @name range + * @memberof Pattern + * @returns Pattern + * @example + * s("[bd sd]*2,hh*8") + * .cutoff(sine.range(500,4000)) + */ +export const range = register('range', function (min, max, pat) { + return pat.mul(max - min).add(min); +}); + +/** + * Assumes a numerical pattern, containing unipolar values in the range 0 .. 1 + * Returns a new pattern with values scaled to the given min/max range, + * following an exponential curve. + * @name rangex + * @memberof Pattern + * @returns Pattern + * @example + * s("[bd sd]*2,hh*8") + * .cutoff(sine.rangex(500,4000)) + */ +export const rangex = register('rangex', function (min, max, pat) { + return pat._range(Math.log(min), Math.log(max)).fmap(Math.exp); +}); + +/** + * Assumes a numerical pattern, containing bipolar values in the range -1 .. 1 + * Returns a new pattern with values scaled to the given min/max range. + * @name range2 + * @memberof Pattern + * @returns Pattern + * @example + * s("[bd sd]*2,hh*8") + * .cutoff(sine2.range2(500,4000)) + */ +export const range2 = register('range2', function (min, max, pat) { + return pat.fromBipolar()._range(min, max); +}); + +/** + * Allows dividing numbers via list notation using ":". + * Returns a new pattern with just numbers. + * @name ratio + * @memberof Pattern + * @returns Pattern + * @example + * ratio("1, 5:4, 3:2").mul(110) + * .freq().s("piano") + */ +export const ratio = register('ratio', (pat) => + pat.fmap((v) => { + if (!Array.isArray(v)) { + return v; + } + return v.slice(1).reduce((acc, n) => acc / n, v[0]); + }), +); + +////////////////////////////////////////////////////////////////////// +// Structural and temporal transformations + +/** Compress each cycle into the given timespan, leaving a gap + * @example + * cat( + * s("bd sd").compress(.25,.75), + * s("~ bd sd ~") + * ) + */ +export const compress = register('compress', function (b, e, pat) { + b = Fraction(b); + e = Fraction(e); + if (b.gt(e) || b.gt(1) || e.gt(1) || b.lt(0) || e.lt(0)) { + return silence; + } + return pat._fastGap(Fraction(1).div(e.sub(b)))._late(b); +}); + +export const { compressSpan, compressspan } = register(['compressSpan', 'compressspan'], function (span, pat) { + return pat._compress(span.begin, span.end); +}); + +/** + * speeds up a pattern like fast, but rather than it playing multiple times as fast would it instead leaves a gap in the remaining space of the cycle. For example, the following will play the sound pattern "bd sn" only once but compressed into the first half of the cycle, i.e. twice as fast. + * @name fastGap + * @synonyms fastgap + * @example + * s("bd sd").fastGap(2) + */ +export const { fastGap, fastgap } = register(['fastGap', 'fastgap'], function (factor, pat) { + // A bit fiddly, to drop zero-width queries at the start of the next cycle + const qf = function (span) { + const cycle = span.begin.sam(); + const bpos = span.begin.sub(cycle).mul(factor).min(1); + const epos = span.end.sub(cycle).mul(factor).min(1); + if (bpos >= 1) { + return undefined; + } + return new TimeSpan(cycle.add(bpos), cycle.add(epos)); + }; + // Also fiddly, to maintain the right 'whole' relative to the part + const ef = function (hap) { + const begin = hap.part.begin; + const end = hap.part.end; + const cycle = begin.sam(); + const beginPos = begin.sub(cycle).div(factor).min(1); + const endPos = end.sub(cycle).div(factor).min(1); + const newPart = new TimeSpan(cycle.add(beginPos), cycle.add(endPos)); + const newWhole = !hap.whole + ? undefined + : new TimeSpan( + newPart.begin.sub(begin.sub(hap.whole.begin).div(factor)), + newPart.end.add(hap.whole.end.sub(end).div(factor)), + ); + return new Hap(newWhole, newPart, hap.value, hap.context); + }; + return pat.withQuerySpanMaybe(qf).withHap(ef).splitQueries(); +}); + +/** + * Similar to `compress`, but doesn't leave gaps, and the 'focus' can be bigger than a cycle + * @example + * s("bd hh sd hh").focus(1/4, 3/4) + */ +export const focus = register('focus', function (b, e, pat) { + b = Fraction(b); + e = Fraction(e); + return pat + ._early(b.sam()) + ._fast(Fraction(1).div(e.sub(b))) + ._late(b); +}); + +export const { focusSpan, focusspan } = register(['focusSpan', 'focusspan'], function (span, pat) { + return pat._focus(span.begin, span.end); +}); + +/** The ply function repeats each event the given number of times. + * @example + * s("bd ~ sd cp").ply("<1 2 3>") + */ +export const ply = register('ply', function (factor, pat) { + const result = pat.fmap((x) => pure(x)._fast(factor)).squeezeJoin(); + if (__steps) { + result._steps = Fraction(factor).mulmaybe(pat._steps); + } + return result; +}); + +/** + * Speed up a pattern by the given factor. Used by "*" in mini notation. + * + * @name fast + * @synonyms density + * @memberof Pattern + * @param {number | Pattern} factor speed up factor + * @returns Pattern + * @example + * s("bd hh sd hh").fast(2) // s("[bd hh sd hh]*2") + */ +export const { fast, density } = register( + ['fast', 'density'], + function (factor, pat) { + if (factor === 0) { + return silence; + } + factor = Fraction(factor); + const fastQuery = pat.withQueryTime((t) => t.mul(factor)); + return fastQuery.withHapTime((t) => t.div(factor)).setSteps(pat._steps); + }, + true, + true, +); + +/** + * Both speeds up the pattern (like 'fast') and the sample playback (like 'speed'). + * @example + * s("bd sd:2").hurry("<1 2 4 3>").slow(1.5) + */ +export const hurry = register('hurry', function (r, pat) { + return pat._fast(r).mul(pure({ speed: r })); +}); + +/** + * Slow down a pattern over the given number of cycles. Like the "/" operator in mini notation. + * + * @name slow + * @synonyms sparsity + * @memberof Pattern + * @param {number | Pattern} factor slow down factor + * @returns Pattern + * @example + * s("bd hh sd hh").slow(2) // s("[bd hh sd hh]/2") + */ +export const { slow, sparsity } = register(['slow', 'sparsity'], function (factor, pat) { + if (factor === 0) { + return silence; + } + return pat._fast(Fraction(1).div(factor)); +}); + +/** + * Carries out an operation 'inside' a cycle. + * @example + * "0 1 2 3 4 3 2 1".inside(4, rev).scale('C major').note() + * // "0 1 2 3 4 3 2 1".slow(4).rev().fast(4).scale('C major').note() + */ +export const inside = register('inside', function (factor, f, pat) { + return f(pat._slow(factor))._fast(factor); +}); + +/** + * Carries out an operation 'outside' a cycle. + * @example + * "<[0 1] 2 [3 4] 5>".outside(4, rev).scale('C major').note() + * // "<[0 1] 2 [3 4] 5>".fast(4).rev().slow(4).scale('C major').note() + */ +export const outside = register('outside', function (factor, f, pat) { + return f(pat._fast(factor))._slow(factor); +}); + +/** + * Applies the given function every n cycles, starting from the last cycle. + * @name lastOf + * @memberof Pattern + * @param {number} n how many cycles + * @param {function} func function to apply + * @returns Pattern + * @example + * note("c3 d3 e3 g3").lastOf(4, x=>x.rev()) + */ +export const lastOf = register('lastOf', function (n, func, pat) { + const pats = Array(n - 1).fill(pat); + pats.push(func(pat)); + return slowcatPrime(...pats); +}); + +/** + * Applies the given function every n cycles, starting from the first cycle. + * @name firstOf + * @memberof Pattern + * @param {number} n how many cycles + * @param {function} func function to apply + * @returns Pattern + * @example + * note("c3 d3 e3 g3").firstOf(4, x=>x.rev()) + */ + +/** + * An alias for `firstOf` + * @name every + * @memberof Pattern + * @param {number} n how many cycles + * @param {function} func function to apply + * @returns Pattern + * @example + * note("c3 d3 e3 g3").every(4, x=>x.rev()) + */ +export const { firstOf, every } = register(['firstOf', 'every'], function (n, func, pat) { + const pats = Array(n - 1).fill(pat); + pats.unshift(func(pat)); + return slowcatPrime(...pats); +}); + +/** + * Like layer, but with a single function: + * @name apply + * @memberof Pattern + * @example + * "".scale('C minor').apply(scaleTranspose("0,2,4")).note() + */ +// TODO: remove or dedupe with layer? +export const apply = register('apply', function (func, pat) { + return func(pat); +}); + +/** + * Plays the pattern at the given cycles per minute. + * @deprecated + * @example + * s(",hh*2").cpm(90) // = 90 bpm + */ +// this is redefined in repl.mjs, using the current cps as divisor +export const cpm = register('cpm', function (cpm, pat) { + return pat._fast(cpm / 60 / 1); +}); + +/** + * Nudge a pattern to start earlier in time. Equivalent of Tidal's <~ operator + * + * @name early + * @memberof Pattern + * @param {number | Pattern} cycles number of cycles to nudge left + * @returns Pattern + * @example + * "bd ~".stack("hh ~".early(.1)).s() + */ +export const early = register( + 'early', + function (offset, pat) { + offset = Fraction(offset); + return pat.withQueryTime((t) => t.add(offset)).withHapTime((t) => t.sub(offset)); + }, + true, + true, +); + +/** + * Nudge a pattern to start later in time. Equivalent of Tidal's ~> operator + * + * @name late + * @memberof Pattern + * @param {number | Pattern} cycles number of cycles to nudge right + * @returns Pattern + * @example + * "bd ~".stack("hh ~".late(.1)).s() + */ +export const late = register( + 'late', + function (offset, pat) { + offset = Fraction(offset); + return pat._early(Fraction(0).sub(offset)); + }, + true, + true, +); + +/** + * Plays a portion of a pattern, specified by the beginning and end of a time span. The new resulting pattern is played over the time period of the original pattern: + * + * @example + * s("bd*2 hh*3 [sd bd]*2 perc").zoom(0.25, 0.75) + * // s("hh*3 [sd bd]*2") // equivalent + */ +export const zoom = register('zoom', function (s, e, pat) { + e = Fraction(e); + s = Fraction(s); + if (s.gte(e)) { + return nothing; + } + const d = e.sub(s); + const steps = __steps ? pat._steps?.mulmaybe(d) : undefined; + return pat + .withQuerySpan((span) => span.withCycle((t) => t.mul(d).add(s))) + .withHapSpan((span) => span.withCycle((t) => t.sub(s).div(d))) + .splitQueries() + .setSteps(steps); +}); + +export const { zoomArc, zoomarc } = register(['zoomArc', 'zoomarc'], function (a, pat) { + return pat.zoom(a.begin, a.end); +}); + +/** + * Splits a pattern into the given number of slices, and plays them according to a pattern of slice numbers. + * Similar to `slice`, but slices up patterns rather than sound samples. + * @param {number} number of slices + * @param {number} slices to play + * @example + * note("0 1 2 3 4 5 6 7".scale('c:mixolydian')) + *.bite(4, "3 2 1 0") + * @example + * sound("bd - bd bd*2, - sd:6 - sd:5 sd:1 - [- sd:2] -, hh [- cp:7]") + .bank("RolandTR909").speed(1.2) + .bite(4, "0 0 [1 2] <3 2> 0 0 [2 1] 3") + */ +export const bite = register( + 'bite', + (npat, ipat, pat) => { + return ipat + .fmap((i) => (n) => { + const a = Fraction(i).div(n).mod(1); + const b = a.add(Fraction(1).div(n)); + return pat.zoom(a, b); + }) + .appLeft(npat) + .squeezeJoin(); + }, + false, +); + +/** + * Selects the given fraction of the pattern and repeats that part to fill the remainder of the cycle. + * @param {number} fraction fraction to select + * @example + * s("lt ht mt cp, [hh oh]*2").linger("<1 .5 .25 .125>") + */ +export const linger = register( + 'linger', + function (t, pat) { + if (t == 0) { + return silence; + } else if (t < 0) { + return pat._zoom(t.add(1), 1)._slow(t); + } + return pat._zoom(0, t)._slow(t); + }, + true, + true, +); + +/** + * Samples the pattern at a rate of n events per cycle. Useful for turning a continuous pattern into a discrete one. + * @name segment + * @synonyms seg + * @param {number} segments number of segments per cycle + * @example + * note(saw.range(40,52).segment(24)) + */ +export const { segment, seg } = register(['segment', 'seg'], function (rate, pat) { + return pat.struct(pure(true)._fast(rate)).setSteps(rate); +}); + +/** + * The function `swingBy x n` breaks each cycle into `n` slices, and then delays events in the second half of each slice by the amount `x`, which is relative to the size of the (half) slice. So if `x` is 0 it does nothing, `0.5` delays for half the note duration, and 1 will wrap around to doing nothing again. The end result is a shuffle or swing-like rhythm + * @param {number} subdivision + * @param {number} offset + * @example + * s("hh*8").swingBy(1/3, 4) + */ +export const swingBy = register('swingBy', (swing, n, pat) => pat.inside(n, late(seq(0, swing / 2)))); + +/** + * Shorthand for swingBy with 1/3: + * @param {number} subdivision + * @example + * s("hh*8").swing(4) + * // s("hh*8").swingBy(1/3, 4) + */ +export const swing = register('swing', (n, pat) => pat.swingBy(1 / 3, n)); + +/** + * Swaps 1s and 0s in a binary pattern. + * @name invert + * @synonyms inv + * @example + * s("bd").struct("1 0 0 1 0 0 1 0".lastOf(4, invert)) + */ +export const { invert, inv } = register( + ['invert', 'inv'], + function (pat) { + // Swap true/false in a binary pattern + return pat.fmap((x) => !x); + }, + true, + true, +); + +/** + * Applies the given function whenever the given pattern is in a true state. + * @name when + * @memberof Pattern + * @param {Pattern} binary_pat + * @param {function} func + * @returns Pattern + * @example + * "c3 eb3 g3".when("<0 1>/2", x=>x.sub("5")).note() + */ +export const when = register('when', function (on, func, pat) { + return on ? func(pat) : pat; +}); + +/** + * Superimposes the function result on top of the original pattern, delayed by the given time. + * @name off + * @memberof Pattern + * @param {Pattern | number} time offset time + * @param {function} func function to apply + * @returns Pattern + * @example + * "c3 eb3 g3".off(1/8, x=>x.add(7)).note() + */ +export const off = register('off', function (time_pat, func, pat) { + return stack(pat, func(pat.late(time_pat))); +}); + +/** + * Returns a new pattern where every other cycle is played once, twice as + * fast, and offset in time by one quarter of a cycle. Creates a kind of + * breakbeat feel. + * @returns Pattern + */ +export const brak = register('brak', function (pat) { + return pat.when(slowcat(false, true), (x) => fastcat(x, silence)._late(0.25)); +}); + +/** + * Reverse all haps in a pattern + * + * @name rev + * @memberof Pattern + * @returns Pattern + * @example + * note("c d e g").rev() + */ +export const rev = register( + 'rev', + function (pat) { + const query = function (state) { + const span = state.span; + const cycle = span.begin.sam(); + const next_cycle = span.begin.nextSam(); + const reflect = function (to_reflect) { + const reflected = to_reflect.withTime((time) => cycle.add(next_cycle.sub(time))); + // [reflected.begin, reflected.end] = [reflected.end, reflected.begin] -- didn't work + const tmp = reflected.begin; + reflected.begin = reflected.end; + reflected.end = tmp; + return reflected; + }; + const haps = pat.query(state.setSpan(reflect(span))); + return haps.map((hap) => hap.withSpan(reflect)); + }; + return new Pattern(query).splitQueries(); + }, + false, + true, +); + +/** Like press, but allows you to specify the amount by which each + * event is shifted. pressBy(0.5) is the same as press, while + * pressBy(1/3) shifts each event by a third of its timespan. + * @example + * stack(s("hh*4"), + * s("bd mt sd ht").pressBy("<0 0.5 0.25>") + * ).slow(2) + */ +export const pressBy = register('pressBy', function (r, pat) { + return pat.fmap((x) => pure(x).compress(r, 1)).squeezeJoin(); +}); + +/** + * Syncopates a rhythm, by shifting each event halfway into its timespan. + * @example + * stack(s("hh*4"), + * s("bd mt sd ht").every(4, press) + * ).slow(2) + */ +export const press = register('press', function (pat) { + return pat._pressBy(0.5); +}); + +/** + * Silences a pattern. + * @example + * stack( + * s("bd").hush(), + * s("hh*3") + * ) + */ +Pattern.prototype.hush = function () { + return silence; +}; + +/** + * Applies `rev` to a pattern every other cycle, so that the pattern alternates between forwards and backwards. + * @example + * note("c d e g").palindrome() + */ +export const palindrome = register( + 'palindrome', + function (pat) { + return pat.lastOf(2, rev); + }, + true, + true, +); + +/** + * Jux with adjustable stereo width. 0 = mono, 1 = full stereo. + * @name juxBy + * @synonyms juxby + * @example + * s("bd lt [~ ht] mt cp ~ bd hh").juxBy("<0 .5 1>/2", rev) + */ +export const { juxBy, juxby } = register(['juxBy', 'juxby'], function (by, func, pat) { + by /= 2; + const elem_or = function (dict, key, dflt) { + if (key in dict) { + return dict[key]; + } + return dflt; + }; + const left = pat.withValue((val) => Object.assign({}, val, { pan: elem_or(val, 'pan', 0.5) - by })); + const right = func(pat.withValue((val) => Object.assign({}, val, { pan: elem_or(val, 'pan', 0.5) + by }))); + + return stack(left, right).setSteps(__steps ? lcm(left._steps, right._steps) : undefined); +}); + +/** + * The jux function creates strange stereo effects, by applying a function to a pattern, but only in the right-hand channel. + * @example + * s("bd lt [~ ht] mt cp ~ bd hh").jux(rev) + * @example + * s("bd lt [~ ht] mt cp ~ bd hh").jux(press) + * @example + * s("bd lt [~ ht] mt cp ~ bd hh").jux(iter(4)) + */ +export const jux = register('jux', function (func, pat) { + return pat._juxBy(1, func, pat); +}); + +/** + * Superimpose and offset multiple times, applying the given function each time. + * @name echoWith + * @synonyms echowith, stutWith, stutwith + * @param {number} times how many times to repeat + * @param {number} time cycle offset between iterations + * @param {function} func function to apply, given the pattern and the iteration index + * @example + * "<0 [2 4]>" + * .echoWith(4, 1/8, (p,n) => p.add(n*2)) + * .scale("C:minor").note() + */ +export const { echoWith, echowith, stutWith, stutwith } = register( + ['echoWith', 'echowith', 'stutWith', 'stutwith'], + function (times, time, func, pat) { + return stack(...listRange(0, times - 1).map((i) => func(pat.late(Fraction(time).mul(i)), i))); + }, +); + +/** + * Superimpose and offset multiple times, gradually decreasing the velocity + * @name echo + * @memberof Pattern + * @returns Pattern + * @param {number} times how many times to repeat + * @param {number} time cycle offset between iterations + * @param {number} feedback velocity multiplicator for each iteration + * @example + * s("bd sd").echo(3, 1/6, .8) + */ +export const echo = register('echo', function (times, time, feedback, pat) { + return pat._echoWith(times, time, (pat, i) => pat.gain(Math.pow(feedback, i))); +}); + +/** + * Deprecated. Like echo, but the last 2 parameters are flipped. + * @name stut + * @param {number} times how many times to repeat + * @param {number} feedback velocity multiplicator for each iteration + * @param {number} time cycle offset between iterations + * @example + * s("bd sd").stut(3, .8, 1/6) + */ +export const stut = register('stut', function (times, feedback, time, pat) { + return pat._echoWith(times, time, (pat, i) => pat.gain(Math.pow(feedback, i))); +}); + +export const applyN = register('applyN', function (n, func, p) { + let result = p; + for (let i = 0; i < n; i++) { + result = func(result); + } + return result; +}); + +/** + * The plyWith function repeats each event the given number of times, applying the given function to each event.\n + * @name plyWith + * @synonyms plywith + * @param {number} factor how many times to repeat + * @param {function} func function to apply, given the pattern + * @example + * "<0 [2 4]>" + * .plyWith(4, (p) => p.add(2)) + * .scale("C:minor").note() + */ +export const plyWith = register(['plyWith', 'plywith'], function (factor, func, pat) { + const result = pat + .fmap((x) => cat(...listRange(0, factor - 1).map((i) => applyN(i, func, x)))._fast(factor)) + .squeezeJoin(); + if (__steps) { + result._steps = Fraction(factor).mulmaybe(pat._steps); + } + return result; +}); + +/** + * The plyForEach function repeats each event the given number of times, applying the given function to each event. + * This version of ply uses the iteration index as an argument to the function, similar to echoWith. + * @name plyForEach + * @synonyms plyforeach + * @param {number} factor how many times to repeat + * @param {function} func function to apply, given the pattern and the iteration index + * @example + * "<0 [2 4]>" + * .plyForEach(4, (p,n) => p.add(n*2)) + * .scale("C:minor").note() + */ +export const plyForEach = register(['plyForEach', 'plyforeach'], function (factor, func, pat) { + const result = pat + .fmap((x) => cat(cat(pure(x), ...listRange(1, factor - 1).map((i) => func(pure(x), i))))._fast(factor)) + .squeezeJoin(); + if (__steps) { + result._steps = Fraction(factor).mulmaybe(pat._steps); + } + return result; +}); + +/** + * Divides a pattern into a given number of subdivisions, plays the subdivisions in order, but increments the starting subdivision each cycle. The pattern wraps to the first subdivision after the last subdivision is played. + * @name iter + * @memberof Pattern + * @returns Pattern + * @example + * note("0 1 2 3".scale('A minor')).iter(4) + */ + +const _iter = function (times, pat, back = false) { + times = Fraction(times); + return slowcat( + ...listRange(0, times.sub(1)).map((i) => + back ? pat.late(Fraction(i).div(times)) : pat.early(Fraction(i).div(times)), + ), + ); +}; + +export const iter = register( + 'iter', + function (times, pat) { + return _iter(times, pat, false); + }, + true, + true, +); + +/** + * Like `iter`, but plays the subdivisions in reverse order. Known as iter' in tidalcycles + * @name iterBack + * @synonyms iterback + * @memberof Pattern + * @returns Pattern + * @example + * note("0 1 2 3".scale('A minor')).iterBack(4) + */ +export const { iterBack, iterback } = register( + ['iterBack', 'iterback'], + function (times, pat) { + return _iter(times, pat, true); + }, + true, + true, +); + +/** + * Repeats each cycle the given number of times. + * @name repeatCycles + * @memberof Pattern + * @returns Pattern + * @example + * note(irand(12).add(34)).segment(4).repeatCycles(2).s("gm_acoustic_guitar_nylon") + */ +export const { repeatCycles } = register( + 'repeatCycles', + function (n, pat) { + return new Pattern(function (state) { + const cycle = state.span.begin.sam(); + const source_cycle = cycle.div(n).sam(); + const delta = cycle.sub(source_cycle); + state = state.withSpan((span) => span.withTime((spant) => spant.sub(delta))); + return pat.query(state).map((hap) => hap.withSpan((span) => span.withTime((spant) => spant.add(delta)))); + }).splitQueries(); + }, + true, + true, +); + +/** + * Divides a pattern into a given number of parts, then cycles through those parts in turn, applying the given function to each part in turn (one part per cycle). + * @name chunk + * @synonyms slowChunk, slowchunk + * @memberof Pattern + * @returns Pattern + * @example + * "0 1 2 3".chunk(4, x=>x.add(7)) + * .scale("A:minor").note() + */ +const _chunk = function (n, func, pat, back = false, fast = false) { + const binary = Array(n - 1).fill(false); + binary.unshift(true); + // Invert the 'back' because we want to shift the pattern forwards, + // and so time backwards + const binary_pat = _iter(n, sequence(...binary), !back); + if (!fast) { + pat = pat.repeatCycles(n); + } + return pat.when(binary_pat, func); +}; + +export const { chunk, slowchunk, slowChunk } = register( + ['chunk', 'slowchunk', 'slowChunk'], + function (n, func, pat) { + return _chunk(n, func, pat, false, false); + }, + true, + true, +); + +/** + * Like `chunk`, but cycles through the parts in reverse order. Known as chunk' in tidalcycles + * @name chunkBack + * @synonyms chunkback + * @memberof Pattern + * @returns Pattern + * @example + * "0 1 2 3".chunkBack(4, x=>x.add(7)) + * .scale("A:minor").note() + */ +export const { chunkBack, chunkback } = register( + ['chunkBack', 'chunkback'], + function (n, func, pat) { + return _chunk(n, func, pat, true); + }, + true, + true, +); + +/** + * Like `chunk`, but the cycles of the source pattern aren't repeated + * for each set of chunks. + * @name fastChunk + * @synonyms fastchunk + * @memberof Pattern + * @returns Pattern + * @example + * "<0 8> 1 2 3 4 5 6 7" + * .fastChunk(4, x => x.color('red')).slow(2) + * .scale("C2:major").note() + */ +export const { fastchunk, fastChunk } = register( + ['fastchunk', 'fastChunk'], + function (n, func, pat) { + return _chunk(n, func, pat, false, true); + }, + true, + true, +); + +/** + * Like `chunk`, but the function is applied to a looped subcycle of the source pattern. + * @name chunkInto + * @synonyms chunkinto + * @memberof Pattern + * @example + * sound("bd sd ht lt bd - cp lt").chunkInto(4, hurry(2)) + * .bank("tr909") + */ +export const { chunkinto, chunkInto } = register(['chunkinto', 'chunkInto'], function (n, func, pat) { + return pat.into(fastcat(true, ...Array(n - 1).fill(false))._iterback(n), func); +}); + +/** + * Like `chunkInto`, but moves backwards through the chunks. + * @name chunkBackInto + * @synonyms chunkbackinto + * @memberof Pattern + * @example + * sound("bd sd ht lt bd - cp lt").chunkInto(4, hurry(2)) + * .bank("tr909") + */ +export const { chunkbackinto, chunkBackInto } = register(['chunkbackinto', 'chunkBackInto'], function (n, func, pat) { + return pat.into( + fastcat(true, ...Array(n - 1).fill(false)) + ._iter(n) + ._early(1), + func, + ); +}); + +// TODO - redefine elsewhere in terms of mask +export const bypass = register( + 'bypass', + function (on, pat) { + on = Boolean(parseInt(on)); + return on ? silence : pat; + }, + true, + true, +); + +/** + * Loops the pattern inside an `offset` for `cycles`. + * If you think of the entire span of time in cycles as a ribbon, you can cut a single piece and loop it. + * @name ribbon + * @synonyms rib + * @param {number} offset start point of loop in cycles + * @param {number} cycles loop length in cycles + * @example + * note("").ribbon(1, 2) + * @example + * // Looping a portion of randomness + * n(irand(8).segment(4)).scale("c:pentatonic").ribbon(1337, 2) + * @example + * // rhythm generator + * s("bd!16?").ribbon(29,.5) + */ +export const { ribbon, rib } = register(['ribbon', 'rib'], (offset, cycles, pat) => + pat.early(offset).restart(pure(1).slow(cycles)), +); + +export const hsla = register('hsla', (h, s, l, a, pat) => { + return pat.color(`hsla(${h}turn,${s * 100}%,${l * 100}%,${a})`); +}); + +export const hsl = register('hsl', (h, s, l, pat) => { + return pat.color(`hsl(${h}turn,${s * 100}%,${l * 100}%)`); +}); + +/** + * Tags each Hap with an identifier. Good for filtering. The function populates Hap.context.tags (Array). + * @name tag + * @noAutocomplete + * @param {string} tag anything unique + */ +Pattern.prototype.tag = function (tag) { + return this.withContext((ctx) => ({ ...ctx, tags: (ctx.tags || []).concat([tag]) })); +}; + +/** + * Filters haps using the given function + * @name filter + * @param {Function} test function to test Hap + * @example + * s("hh!7 oh").filter(hap => hap.value.s==='hh') + */ +export const filter = register('filter', (test, pat) => pat.withHaps((haps) => haps.filter(test))); + +/** + * Filters haps by their begin time + * @name filterWhen + * @noAutocomplete + * @param {Function} test function to test Hap.whole.begin + */ +export const filterWhen = register('filterWhen', (test, pat) => pat.filter((h) => test(h.whole.begin))); + +/** + * Use within to apply a function to only a part of a pattern. + * @name within + * @param {number} start start within cycle (0 - 1) + * @param {number} end end within cycle (0 - 1). Must be > start + * @param {Function} func function to be applied to the sub-pattern + */ +export const within = register('within', (a, b, fn, pat) => + stack( + fn(pat.filterWhen((t) => t.cyclePos() >= a && t.cyclePos() <= b)), + pat.filterWhen((t) => t.cyclePos() < a || t.cyclePos() > b), + ), +); + +////////////////////////////////////////////////////////////////////// +// Stepwise functions + +Pattern.prototype.stepJoin = function () { + const pp = this; + const first_t = stepcat(..._retime(_slices(pp.queryArc(0, 1))))._steps; + const q = function (state) { + const shifted = pp.early(state.span.begin.sam()); + const haps = shifted.query(state.setSpan(new TimeSpan(Fraction(0), Fraction(1)))); + const pat = stepcat(..._retime(_slices(haps))); + return pat.query(state); + }; + return new Pattern(q, first_t); +}; + +Pattern.prototype.stepBind = function (func) { + return this.fmap(func).stepJoin(); +}; + +export function _retime(timedHaps) { + const occupied_perc = timedHaps.filter((t, pat) => pat.hasSteps).reduce((a, b) => a.add(b), Fraction(0)); + const occupied_steps = removeUndefineds(timedHaps.map((t, pat) => pat._steps)).reduce( + (a, b) => a.add(b), + Fraction(0), + ); + const total_steps = occupied_perc.eq(0) ? undefined : occupied_steps.div(occupied_perc); + function adjust(dur, pat) { + if (pat._steps === undefined) { + return [dur.mulmaybe(total_steps), pat]; + } + return [pat._steps, pat]; + } + return timedHaps.map((x) => adjust(...x)); +} + +export function _slices(haps) { + // slices evs = map (\s -> ((snd s - fst s), stack $ map value $ fit s evs)) + // $ pairs $ sort $ nubOrd $ 0:1:concatMap (\ev -> start (part ev):stop (part ev):[]) evs + const breakpoints = flatten(haps.map((hap) => [hap.part.begin, hap.part.end])); + const unique = uniqsortr([Fraction(0), Fraction(1), ...breakpoints]); + const slicespans = pairs(unique); + return slicespans.map((s) => [ + s[1].sub(s[0]), + stack(..._fitslice(new TimeSpan(...s), haps).map((x) => x.value.withHap((h) => h.setContext(h.combineContext(x))))), + ]); +} + +export function _fitslice(span, haps) { + return removeUndefineds(haps.map((hap) => _match(span, hap))); +} + +export function _match(span, hap_p) { + const subspan = span.intersection(hap_p.part); + if (subspan == undefined) { + return undefined; + } + return new Hap(hap_p.whole, subspan, hap_p.value, hap_p.context); +} + +/** + * *Experimental* + * + * Speeds a pattern up or down, to fit to the given number of steps per cycle. + * @example + * sound("bd sd cp").pace(4) + * // The same as sound("{bd sd cp}%4") or sound("*4") + */ +export const pace = register('pace', function (targetSteps, pat) { + if (pat._steps === undefined) { + return pat; + } + if (pat._steps.eq(Fraction(0))) { + // avoid divide by zero.. + return nothing; + } + return pat._fast(Fraction(targetSteps).div(pat._steps)).setSteps(targetSteps); +}); + +export function _polymeterListSteps(steps, ...args) { + const seqs = args.map((a) => _sequenceCount(a)); + if (seqs.length == 0) { + return silence; + } + if (steps == 0) { + steps = seqs[0][1]; + } + const pats = []; + for (const seq of seqs) { + if (seq[1] == 0) { + continue; + } + if (steps == seq[1]) { + pats.push(seq[0]); + } else { + pats.push(seq[0]._fast(Fraction(steps).div(Fraction(seq[1])))); + } + } + return stack(...pats); +} + +/** + * *Experimental* + * + * Aligns the steps of the patterns, creating polymeters. The patterns are repeated until they all fit the cycle. For example, in the below the first pattern is repeated twice, and the second is repeated three times, to fit the lowest common multiple of six steps. + * @synonyms pm + * @example + * // The same as note("{c eb g, c2 g2}%6") + * polymeter("c eb g", "c2 g2").note() + * + */ +export function polymeter(...args) { + if (Array.isArray(args[0])) { + // Support old behaviour + return _polymeterListSteps(0, ...args); + } + + // TODO currently ignoring arguments without steps... + args = args.filter((arg) => arg.hasSteps); + + if (args.length == 0) { + return silence; + } + const steps = lcm(...args.map((x) => x._steps)); + if (steps.eq(Fraction(0))) { + return nothing; + } + + const result = stack(...args.map((x) => x.pace(steps))); + result._steps = steps; + return result; +} + +/** 'Concatenates' patterns like `fastcat`, but proportional to a number of steps per cycle. + * The steps can either be inferred from the pattern, or provided as a [length, pattern] pair. + * Has the alias `timecat`. + * @name stepcat + * @synonyms timeCat, timecat + * @return {Pattern} + * @example + * stepcat([3,"e3"],[1, "g3"]).note() + * // the same as "e3@3 g3".note() + * @example + * stepcat("bd sd cp","hh hh").sound() + * // the same as "bd sd cp hh hh".sound() + */ +export function stepcat(...timepats) { + if (timepats.length === 0) { + return nothing; + } + const findsteps = (x) => (Array.isArray(x) ? x : [x._steps ?? 1, x]); + timepats = timepats.map(findsteps); + if (timepats.find((x) => x[0] === undefined)) { + const times = timepats.map((a) => a[0]).filter((x) => x !== undefined); + if (times.length === 0) { + return fastcat(...timepats.map((x) => x[1])); + } + if (times.length === timepats.length) { + return nothing; + } + const avg = times.reduce((a, b) => a.add(b), Fraction(0)).div(times.length); + for (let timepat of timepats) { + if (timepat[0] === undefined) { + timepat[0] = avg; + } + } + } + if (timepats.length == 1) { + const result = reify(timepats[0][1]); + return result.withSteps((_) => timepats[0][0]); + } + + const total = timepats.map((a) => a[0]).reduce((a, b) => a.add(b), Fraction(0)); + let begin = Fraction(0); + const pats = []; + for (const [time, pat] of timepats) { + if (Fraction(time).eq(0)) { + continue; + } + const end = begin.add(time); + pats.push(reify(pat)._compress(begin.div(total), end.div(total))); + begin = end; + } + const result = stack(...pats); + result._steps = total; + return result; +} + +/** + * *Experimental* + * + * Concatenates patterns stepwise, according to an inferred 'steps per cycle'. + * Similar to `stepcat`, but if an argument is a list, the whole pattern will alternate between the elements in the list. + * + * @return {Pattern} + * @example + * stepalt(["bd cp", "mt"], "bd").sound() + * // The same as "bd cp bd mt bd".sound() + */ +export function stepalt(...groups) { + groups = groups.map((a) => (Array.isArray(a) ? a.map(reify) : [reify(a)])); + + const cycles = lcm(...groups.map((x) => Fraction(x.length))); + + let result = []; + for (let cycle = 0; cycle < cycles; ++cycle) { + result.push(...groups.map((x) => (x.length == 0 ? silence : x[cycle % x.length]))); + } + result = result.filter((x) => x.hasSteps && x._steps > 0); + const steps = result.reduce((a, b) => a.add(b._steps), Fraction(0)); + result = stepcat(...result); + result._steps = steps; + return result; +} + +/** + * *Experimental* + * + * Takes the given number of steps from a pattern (dropping the rest). + * A positive number will take steps from the start of a pattern, and a negative number from the end. + * @return {Pattern} + * @example + * "bd cp ht mt".take("2").sound() + * // The same as "bd cp".sound() + * @example + * "bd cp ht mt".take("1 2 3").sound() + * // The same as "bd bd cp bd cp ht".sound() + * @example + * "bd cp ht mt".take("-1 -2 -3").sound() + * // The same as "mt ht mt cp ht mt".sound() + */ +export const take = stepRegister('take', function (i, pat) { + if (!pat.hasSteps) { + return nothing; + } + if (pat._steps.lte(0)) { + return nothing; + } + i = Fraction(i); + if (i.eq(0)) { + return nothing; + } + const flip = i < 0; + if (flip) { + i = i.abs(); + } + const frac = i.div(pat._steps); + if (frac.lte(0)) { + return nothing; + } + if (frac.gte(1)) { + return pat; + } + if (flip) { + return pat.zoom(Fraction(1).sub(frac), 1); + } + return pat.zoom(0, frac); +}); + +/** + * *Experimental* + * + * Drops the given number of steps from a pattern. + * A positive number will drop steps from the start of a pattern, and a negative number from the end. + * @return {Pattern} + * @example + * "tha dhi thom nam".drop("1").sound().bank("mridangam") + * @example + * "tha dhi thom nam".drop("-1").sound().bank("mridangam") + * @example + * "tha dhi thom nam".drop("0 1 2 3").sound().bank("mridangam") + * @example + * "tha dhi thom nam".drop("0 -1 -2 -3").sound().bank("mridangam") + */ +export const drop = stepRegister('drop', function (i, pat) { + if (!pat.hasSteps) { + return nothing; + } + + i = Fraction(i); + if (i.lt(0)) { + return pat.take(pat._steps.add(i)); + } + return pat.take(Fraction(0).sub(pat._steps.sub(i))); +}); + +/** + * *Experimental* + * + * `extend` is similar to `fast` in that it increases its density, but it also increases the step count + * accordingly. So `stepcat("a b".extend(2), "c d")` would be the same as `"a b a b c d"`, whereas + * `stepcat("a b".fast(2), "c d")` would be the same as `"[a b] [a b] c d"`. + * @example + * stepcat( + * sound("bd bd - cp").extend(2), + * sound("bd - sd -") + * ).pace(8) + */ +export const extend = stepRegister('extend', function (factor, pat) { + return pat.fast(factor).expand(factor); +}); + +/** + * *Experimental* + * + * `replicate` is similar to `fast` in that it increases its density, but it also increases the step count + * accordingly. So `stepcat("a b".replicate(2), "c d")` would be the same as `"a b a b c d"`, whereas + * `stepcat("a b".fast(2), "c d")` would be the same as `"[a b] [a b] c d"`. + * + * TODO: find out how this function differs from extend + * @example + * stepcat( + * sound("bd bd - cp").replicate(2), + * sound("bd - sd -") + * ).pace(8) + */ +export const replicate = stepRegister('replicate', function (factor, pat) { + return pat.repeatCycles(factor).fast(factor).expand(factor); +}); + +/** + * *Experimental* + * + * Expands the step size of the pattern by the given factor. + * @example + * sound("tha dhi thom nam").bank("mridangam").expand("3 2 1 1 2 3").pace(8) + */ +export const expand = stepRegister('expand', function (factor, pat) { + return pat.withSteps((t) => t.mul(Fraction(factor))); +}); + +/** + * *Experimental* + * + * Contracts the step size of the pattern by the given factor. See also `expand`. + * @example + * sound("tha dhi thom nam").bank("mridangam").contract("3 2 1 1 2 3").pace(8) + */ +export const contract = stepRegister('contract', function (factor, pat) { + return pat.withSteps((t) => t.div(Fraction(factor))); +}); + +Pattern.prototype.shrinklist = function (amount) { + const pat = this; + + if (!pat.hasSteps) { + return [pat]; + } + + let [amountv, times] = Array.isArray(amount) ? amount : [amount, pat._steps]; + amountv = Fraction(amountv); + + if (times === 0 || amountv === 0) { + return [pat]; + } + + const fromstart = amountv > 0; + const ranges = []; + if (fromstart) { + const seg = Fraction(1).div(pat._steps).mul(amountv); + for (let i = 0; i < times; ++i) { + const s = seg.mul(i); + if (s.gt(1)) { + break; + } + ranges.push([s, 1]); + } + } else { + amountv = Fraction(0).sub(amountv); + const seg = Fraction(1).div(pat._steps).mul(amountv); + for (let i = 0; i < times; ++i) { + const e = Fraction(1).sub(seg.mul(i)); + if (e.lt(0)) { + break; + } + ranges.push([Fraction(0), e]); + } + } + return ranges.map((x) => pat.zoom(...x)); +}; + +export const shrinklist = (amount, pat) => pat.shrinklist(amount); + +/** + * *Experimental* + * + * Progressively shrinks the pattern by 'n' steps until there's nothing left, or if a second value is given (using mininotation list syntax with `:`), + * that number of times. + * A positive number will progressively drop steps from the start of a pattern, and a negative number from the end. + * @return {Pattern} + * @example + * "tha dhi thom nam".shrink("1").sound() + * .bank("mridangam") + * @example + * "tha dhi thom nam".shrink("-1").sound() + * .bank("mridangam") + * @example + * "tha dhi thom nam".shrink("1 -1").sound().bank("mridangam").pace(4) + * @example + * note("0 1 2 3 4 5 6 7".scale("C:ritusen")).sound("folkharp") + .shrink("1 -1").pace(8) + + */ + +export const shrink = register( + 'shrink', + function (amount, pat) { + if (!pat.hasSteps) { + return nothing; + } + + const list = pat.shrinklist(amount); + const result = stepcat(...list); + // TODO is this calculation needed? + result._steps = list.reduce((a, b) => a.add(b._steps), Fraction(0)); + return result; + }, + true, + false, + (x) => x.stepJoin(), +); + +/** + * *Experimental* + * + * Progressively grows the pattern by 'n' steps until the full pattern is played, or if a second value is given (using mininotation list syntax with `:`), + * that number of times. + * A positive number will progressively grow steps from the start of a pattern, and a negative number from the end. + * @return {Pattern} + * @example + * "tha dhi thom nam".grow("1").sound() + * .bank("mridangam") + * @example + * "tha dhi thom nam".grow("-1").sound() + * .bank("mridangam") + * @example + * "tha dhi thom nam".grow("1 -1").sound().bank("mridangam").pace(4) + * @example + * note("0 1 2 3 4 5 6 7".scale("C:ritusen")).sound("folkharp") + .grow("1 -1").pace(8) + */ + +export const grow = register( + 'grow', + function (amount, pat) { + if (!pat.hasSteps) { + return nothing; + } + + const list = pat.shrinklist(Fraction(0).sub(amount)); + list.reverse(); + const result = stepcat(...list); + // TODO is this calculation needed? + result._steps = list.reduce((a, b) => a.add(b._steps), Fraction(0)); + return result; + }, + true, + false, + (x) => x.stepJoin(), +); + +/** + * *Experimental* + * + * Inserts a pattern into a list of patterns. On the first repetition it will be inserted at the end of the list, then moved backwards through the list + * on successive repetitions. The patterns are added together stepwise, with all repetitions taking place over a single cycle. Using `pace` to set the + * number of steps per cycle is therefore usually recommended. + * + * @return {Pattern} + * @example + * "[c g]".tour("e f", "e f g", "g f e c").note() + .sound("folkharp") + .pace(8) + */ +export const tour = function (pat, ...many) { + return pat.tour(...many); +}; + +Pattern.prototype.tour = function (...many) { + return stepcat( + ...[].concat( + ...many.map((x, i) => [...many.slice(0, many.length - i), this, ...many.slice(many.length - i)]), + this, + ...many, + ), + ); +}; + +/** + * *Experimental* + * + * 'zips' together the steps of the provided patterns. This can create a long repetition, taking place over a single, dense cycle. + * Using `pace` to set the number of steps per cycle is therefore usually recommended. + * + * @returns {Pattern} + * @example + * zip("e f", "e f g", "g [f e] a f4 c").note() + .sound("folkharp") + .pace(8) + */ +export const zip = function (...pats) { + pats = pats.filter((pat) => pat.hasSteps); + const zipped = slowcat(...pats.map((pat) => pat._slow(pat._steps))); + const steps = lcm(...pats.map((x) => x._steps)); + return zipped._fast(steps).setSteps(steps); +}; + +/** Aliases for `stepcat` */ +export const timecat = stepcat; +export const timeCat = stepcat; + +// Deprecated stepwise aliases +export const s_cat = stepcat; +export const s_alt = stepalt; +export const s_polymeter = polymeter; +Pattern.prototype.s_polymeter = Pattern.prototype.polymeter; +export const s_taper = shrink; +Pattern.prototype.s_taper = Pattern.prototype.shrink; +export const s_taperlist = shrinklist; +Pattern.prototype.s_taperlist = Pattern.prototype.shrinklist; +export const s_add = take; +Pattern.prototype.s_add = Pattern.prototype.take; +export const s_sub = drop; +Pattern.prototype.s_sub = Pattern.prototype.drop; +export const s_expand = expand; +Pattern.prototype.s_expand = Pattern.prototype.expand; +export const s_extend = extend; +Pattern.prototype.s_extend = Pattern.prototype.extend; +export const s_contract = contract; +Pattern.prototype.s_contract = Pattern.prototype.contract; +export const s_tour = tour; +Pattern.prototype.s_tour = Pattern.prototype.tour; +export const s_zip = zip; +Pattern.prototype.s_zip = Pattern.prototype.zip; +export const steps = pace; +Pattern.prototype.steps = Pattern.prototype.pace; + +////////////////////////////////////////////////////////////////////// +// Control-related functions, i.e. ones that manipulate patterns of +// objects + +/** + * Cuts each sample into the given number of parts, allowing you to explore a technique known as 'granular synthesis'. + * It turns a pattern of samples into a pattern of parts of samples. + * @name chop + * @memberof Pattern + * @returns Pattern + * @example + * samples({ rhodes: 'https://cdn.freesound.org/previews/132/132051_316502-lq.mp3' }) + * s("rhodes") + * .chop(4) + * .rev() // reverse order of chops + * .loopAt(2) // fit sample into 2 cycles + * + */ +export const chop = register('chop', function (n, pat) { + const slices = Array.from({ length: n }, (x, i) => i); + const slice_objects = slices.map((i) => ({ begin: i / n, end: (i + 1) / n })); + const merge = function (a, b) { + if ('begin' in a && 'end' in a && a.begin !== undefined && a.end !== undefined) { + const d = a.end - a.begin; + b = { begin: a.begin + b.begin * d, end: a.begin + b.end * d }; + } + // return a; + return Object.assign({}, a, b); + }; + const func = function (o) { + return sequence(slice_objects.map((slice_o) => merge(o, slice_o))); + }; + return pat.squeezeBind(func).setSteps(__steps ? Fraction(n).mulmaybe(pat._steps) : undefined); +}); + +/** + * Cuts each sample into the given number of parts, triggering progressive portions of each sample at each loop. + * @name striate + * @memberof Pattern + * @returns Pattern + * @example + * s("numbers:0 numbers:1 numbers:2").striate(6).slow(3) + */ +export const striate = register('striate', function (n, pat) { + const slices = Array.from({ length: n }, (x, i) => i); + const slice_objects = slices.map((i) => ({ begin: i / n, end: (i + 1) / n })); + const slicePat = slowcat(...slice_objects); + return pat + .set(slicePat) + ._fast(n) + .setSteps(__steps ? Fraction(n).mulmaybe(pat._steps) : undefined); +}); + +/** + * Makes the sample fit the given number of cycles by changing the speed. + * @name loopAt + * @memberof Pattern + * @returns Pattern + * @example + * samples({ rhodes: 'https://cdn.freesound.org/previews/132/132051_316502-lq.mp3' }) + * s("rhodes").loopAt(2) + */ +// TODO - global cps clock +const _loopAt = function (factor, pat, cps = 0.5) { + return pat + .speed((1 / factor) * cps) + .unit('c') + .slow(factor); +}; + +/** + * Chops samples into the given number of slices, triggering those slices with a given pattern of slice numbers. + * Instead of a number, it also accepts a list of numbers from 0 to 1 to slice at specific points. + * @name slice + * @memberof Pattern + * @returns Pattern + * @example + * samples('github:tidalcycles/dirt-samples') + * s("breaks165").slice(8, "0 1 <2 2*2> 3 [4 0] 5 6 7".every(3, rev)).slow(0.75) + * @example + * samples('github:tidalcycles/dirt-samples') + * s("breaks125").fit().slice([0,.25,.5,.75], "0 1 1 <2 3>") + */ + +export const slice = register( + 'slice', + function (npat, ipat, opat) { + return npat + .innerBind((n) => + ipat.outerBind((i) => + opat.outerBind((o) => { + // If it's not an object, assume it's a string and make it a 's' control parameter + o = o instanceof Object ? o : { s: o }; + const begin = Array.isArray(n) ? n[i] : i / n; + const end = Array.isArray(n) ? n[i + 1] : (i + 1) / n; + return pure({ begin, end, _slices: n, ...o }); + }), + ), + ) + .setSteps(ipat._steps); + }, + false, // turns off auto-patternification +); + +/** + * + * make something happen on event time + * uses browser timeout which is innacurate for audio tasks + * @name onTriggerTime + * @memberof Pattern + * @returns Pattern + * @example + * s("bd!8").onTriggerTime((hap) => {console.log(hap)}) + */ +Pattern.prototype.onTriggerTime = function (func) { + return this.onTrigger((hap, currentTime, _cps, targetTime) => { + const diff = targetTime - currentTime; + window.setTimeout(() => { + func(hap); + }, diff * 1000); + }, false); +}; + +/** + * Works the same as slice, but changes the playback speed of each slice to match the duration of its step. + * @name splice + * @example + * samples('github:tidalcycles/dirt-samples') + * s("breaks165") + * .splice(8, "0 1 [2 3 0]@2 3 0@2 7") + */ + +export const splice = register( + 'splice', + function (npat, ipat, opat) { + const sliced = slice(npat, ipat, opat); + return new Pattern((state) => { + // TODO - default cps to 0.5 + const cps = state.controls._cps || 1; + const haps = sliced.query(state); + return haps.map((hap) => + hap.withValue((v) => ({ + ...{ + speed: (cps / v._slices / hap.whole.duration) * (v.speed || 1), + unit: 'c', + }, + ...v, + })), + ); + }).setSteps(ipat._steps); + }, + false, // turns off auto-patternification +); + +export const { loopAt, loopat } = register(['loopAt', 'loopat'], function (factor, pat) { + const steps = pat._steps ? pat._steps.div(factor) : undefined; + return new Pattern((state) => _loopAt(factor, pat, state.controls._cps).query(state), steps); +}); + +/** + * Makes the sample fit its event duration. Good for rhythmical loops like drum breaks. + * Similar to `loopAt`. + * @name fit + * @example + * samples({ rhodes: 'https://cdn.freesound.org/previews/132/132051_316502-lq.mp3' }) + * s("rhodes/2").fit() + */ +export const fit = register('fit', (pat) => + pat.withHaps((haps, state) => + haps.map((hap) => + hap.withValue((v) => { + const slicedur = ('end' in v ? v.end : 1) - ('begin' in v ? v.begin : 0); + return { + ...v, + speed: ((state.controls._cps || 1) / hap.whole.duration) * slicedur, + unit: 'c', + }; + }), + ), + ), +); + +/** + * Makes the sample fit the given number of cycles and cps value, by + * changing the speed. Please note that at some point cps will be + * given by a global clock and this function will be + * deprecated/removed. + * @name loopAtCps + * @memberof Pattern + * @returns Pattern + * @example + * samples({ rhodes: 'https://cdn.freesound.org/previews/132/132051_316502-lq.mp3' }) + * s("rhodes").loopAtCps(4,1.5).cps(1.5) + */ +// TODO - global cps clock +export const { loopAtCps, loopatcps } = register(['loopAtCps', 'loopatcps'], function (factor, cps, pat) { + return _loopAt(factor, pat, cps); +}); + +/** exposes a custom value at query time. basically allows mutating state without evaluation */ +export const ref = (accessor) => + pure(1) + .withValue(() => reify(accessor())) + .innerJoin(); + +let fadeGain = (p) => (p < 0.5 ? 1 : 1 - (p - 0.5) / 0.5); + +/** + * Cross-fades between left and right from 0 to 1: + * - 0 = (full left, no right) + * - .5 = (both equal) + * - 1 = (no left, full right) + * + * @name xfade + * @example + * xfade(s("bd*2"), "<0 .25 .5 .75 1>", s("hh*8")) + */ +export let xfade = (a, pos, b) => { + pos = reify(pos); + a = reify(a); + b = reify(b); + let gaina = pos.fmap((v) => ({ gain: fadeGain(v) })); + let gainb = pos.fmap((v) => ({ gain: fadeGain(1 - v) })); + return stack(a.mul(gaina), b.mul(gainb)); +}; + +// the prototype version is actually flipped so left/right makes sense +Pattern.prototype.xfade = function (pos, b) { + return xfade(this, pos, b); +}; + +/** + * creates a structure pattern from divisions of a cycle + * especially useful for creating rhythms + * @name beat + * @example + * s("bd").beat("0,7,10", 16) + * @example + * s("sd").beat("4,12", 16) + */ +const __beat = (join) => (t, div, pat) => { + t = Fraction(t).mod(div); + div = Fraction(div); + const b = t.div(div); + const e = t.add(1).div(div); + return join(pat.fmap((x) => pure(x)._compress(b, e))); +}; + +export const { beat } = register( + ['beat'], + __beat((x) => x.innerJoin()), +); + +export const _morph = (from, to, by) => { + by = Fraction(by); + const dur = Fraction(1).div(from.length); + const positions = (list) => { + const result = []; + for (const [pos, value] of list.entries()) { + if (value) { + result.push([Fraction(pos).div(list.length), value]); + } + } + return result; + }; + const arcs = zipWith( + ([posa, valuea], [posb, valueb]) => { + const b = by.mul(posb - posa).add(posa); + const e = b.add(dur); + return new TimeSpan(b, e); + }, + positions(from), + positions(to), + ); + function query(state) { + const cycle = state.span.begin.sam(); + const cycleArc = state.span.cycleArc(); + const result = []; + for (const whole of arcs) { + const part = whole.intersection(cycleArc); + if (part !== undefined) { + result.push( + new Hap( + whole.withTime((x) => x.add(cycle)), + part.withTime((x) => x.add(cycle)), + true, + ), + ); + } + } + return result; + } + return new Pattern(query).splitQueries(); +}; + +/** + * Takes two binary rhythms represented as lists of 1s and 0s, and a number + * between 0 and 1 that morphs between them. The two lists should contain the same + * number of true values. + * @example + * sound("hh").struct(morph([1,0,1,0,1,0,1,0], // straight rhythm + * [1,1,0,1,0,1,0], // wonky rhythm + * 0.25 // creates a slightly wonky rhythm + * ) + * ) + * @example + * sound("hh").struct(morph("1:0:1:0:1:0:1:0", // straight rhythm + * "1:1:0:1:0:1:0", // wonky rhythm + * sine.slow(8) // slowly morph between the rhythms + * ) + * ) + */ +export const morph = (frompat, topat, bypat) => { + frompat = reify(frompat); + topat = reify(topat); + bypat = reify(bypat); + return frompat.innerBind((from) => topat.innerBind((to) => bypat.innerBind((by) => _morph(from, to, by)))); +}; + +/** + * Soft-clipping distortion + * + * @name soft + * @param {number | Pattern} distortion amount of distortion to apply + * @param {number | Pattern} volume linear postgain of the distortion + * + */ +/** + * Hard-clipping distortion + * + * @name hard + * @param {number | Pattern} distortion amount of distortion to apply + * @param {number | Pattern} volume linear postgain of the distortion + * + */ +/** + * Cubic polynomial distortion + * + * @name cubic + * @param {number | Pattern} distortion amount of distortion to apply + * @param {number | Pattern} volume linear postgain of the distortion + * + */ +/** + * Diode-emulating distortion + * + * @name diode + * @param {number | Pattern} distortion amount of distortion to apply + * @param {number | Pattern} volume linear postgain of the distortion + * + */ +/** + * Asymmetrical diode distortion + * + * @name asym + * @param {number | Pattern} distortion amount of distortion to apply + * @param {number | Pattern} volume linear postgain of the distortion + * + */ +/** + * Wavefolding distortion + * + * @name fold + * @param {number | Pattern} distortion amount of distortion to apply + * @param {number | Pattern} volume linear postgain of the distortion + * + */ +/** + * Wavefolding distortion composed with sinusoid + * + * @name sinefold + * @param {number | Pattern} distortion amount of distortion to apply + * @param {number | Pattern} volume linear postgain of the distortion + * + */ +/** + * Distortion via Chebyshev polynomials + * + * @name chebyshev + * @param {number | Pattern} distortion amount of distortion to apply + * @param {number | Pattern} volume linear postgain of the distortion + * + */ +const distAlgoNames = ['scurve', 'soft', 'hard', 'cubic', 'diode', 'asym', 'fold', 'sinefold', 'chebyshev']; +for (const name of distAlgoNames) { + // Add aliases for distortion algorithms + Pattern.prototype[name] = function (args) { + const argsPat = reify(args).fmap((v) => (Array.isArray(v) ? [...v, name] : [v, 1, name])); + return this.distort(argsPat); + }; +} diff --git a/src/strudel/core/pick.mjs b/src/strudel/core/pick.mjs new file mode 100644 index 0000000..206fa61 --- /dev/null +++ b/src/strudel/core/pick.mjs @@ -0,0 +1,213 @@ +/* +pick.mjs - methods that use one pattern to pick events from other patterns. +Copyright (C) 2024 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { Pattern, reify, silence, register } from './pattern.mjs'; + +import { _mod, clamp, objectMap } from './util.mjs'; + +const _pick = function (lookup, pat, modulo = true) { + const array = Array.isArray(lookup); + const len = Object.keys(lookup).length; + + lookup = objectMap(lookup, reify); + + if (len === 0) { + return silence; + } + return pat.fmap((i) => { + let key = i; + if (array) { + key = modulo ? Math.round(key) % len : clamp(Math.round(key), 0, lookup.length - 1); + } + return lookup[key]; + }); +}; + +/** * Picks patterns (or plain values) either from a list (by index) or a lookup table (by name). + * Similar to `inhabit`, but maintains the structure of the original patterns. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + * @example + * note("<0 1 2!2 3>".pick(["g a", "e f", "f g f g" , "g c d"])) + * @example + * sound("<0 1 [2,0]>".pick(["bd sd", "cp cp", "hh hh"])) + * @example + * sound("<0!2 [0,1] 1>".pick(["bd(3,8)", "sd sd"])) + * @example + * s("".pick({a: "bd(3,8)", b: "sd sd"})) + */ + +export const pick = function (lookup, pat) { + // backward compatibility - the args used to be flipped + if (Array.isArray(pat)) { + [pat, lookup] = [lookup, pat]; + } + return __pick(lookup, pat); +}; + +const __pick = register('pick', function (lookup, pat) { + return _pick(lookup, pat, false).innerJoin(); +}); + +/** * The same as `pick`, but if you pick a number greater than the size of the list, + * it wraps around, rather than sticking at the maximum value. + * For example, if you pick the fifth pattern of a list of three, you'll get the + * second one. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ + +export const pickmod = register('pickmod', function (lookup, pat) { + return _pick(lookup, pat, true).innerJoin(); +}); + +/** * pickF lets you use a pattern of numbers to pick which function to apply to another pattern. + * @param {Pattern} pat + * @param {Pattern} lookup a pattern of indices + * @param {function[]} funcs the array of functions from which to pull + * @returns {Pattern} + * @example + * s("bd [rim hh]").pickF("<0 1 2>", [rev,jux(rev),fast(2)]) + * @example + * note("(3,8)").s("square") + * .pickF("<0 2> 1", [jux(rev),fast(2),x=>x.lpf(800)]) + */ +export const pickF = register('pickF', function (lookup, funcs, pat) { + return pat.apply(pick(lookup, funcs)); +}); + +/** * The same as `pickF`, but if you pick a number greater than the size of the functions list, + * it wraps around, rather than sticking at the maximum value. + * @param {Pattern} pat + * @param {Pattern} lookup a pattern of indices + * @param {function[]} funcs the array of functions from which to pull + * @returns {Pattern} + */ +export const pickmodF = register('pickmodF', function (lookup, funcs, pat) { + return pat.apply(pickmod(lookup, funcs)); +}); + +/** * Similar to `pick`, but it applies an outerJoin instead of an innerJoin. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const pickOut = register('pickOut', function (lookup, pat) { + return _pick(lookup, pat, false).outerJoin(); +}); + +/** * The same as `pickOut`, but if you pick a number greater than the size of the list, + * it wraps around, rather than sticking at the maximum value. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const pickmodOut = register('pickmodOut', function (lookup, pat) { + return _pick(lookup, pat, true).outerJoin(); +}); + +/** * Similar to `pick`, but the choosen pattern is restarted when its index is triggered. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const pickRestart = register('pickRestart', function (lookup, pat) { + return _pick(lookup, pat, false).restartJoin(); +}); + +/** * The same as `pickRestart`, but if you pick a number greater than the size of the list, + * it wraps around, rather than sticking at the maximum value. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + * @example + * "".pickRestart({ + a: n("0 1 2 0"), + b: n("2 3 4 ~"), + c: n("[4 5] [4 3] 2 0"), + d: n("0 -3 0 ~") + }).scale("C:major").s("piano") + */ +export const pickmodRestart = register('pickmodRestart', function (lookup, pat) { + return _pick(lookup, pat, true).restartJoin(); +}); + +/** * Similar to `pick`, but the choosen pattern is reset when its index is triggered. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const pickReset = register('pickReset', function (lookup, pat) { + return _pick(lookup, pat, false).resetJoin(); +}); + +/** * The same as `pickReset`, but if you pick a number greater than the size of the list, + * it wraps around, rather than sticking at the maximum value. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const pickmodReset = register('pickmodReset', function (lookup, pat) { + return _pick(lookup, pat, true).resetJoin(); +}); + +/** Picks patterns (or plain values) either from a list (by index) or a lookup table (by name). + * Similar to `pick`, but cycles are squeezed into the target ('inhabited') pattern. + * @name inhabit + * @synonyms pickSqueeze + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + * @example + * "".inhabit({a: s("bd(3,8)"), + b: s("cp sd") + }) + * @example + * s("a@2 [a b] a".inhabit({a: "bd(3,8)", b: "sd sd"})).slow(4) + */ +export const { inhabit, pickSqueeze } = register(['inhabit', 'pickSqueeze'], function (lookup, pat) { + return _pick(lookup, pat, false).squeezeJoin(); +}); + +/** * The same as `inhabit`, but if you pick a number greater than the size of the list, + * it wraps around, rather than sticking at the maximum value. + * For example, if you pick the fifth pattern of a list of three, you'll get the + * second one. + * @name inhabitmod + * @synonyms pickmodSqueeze + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ + +export const { inhabitmod, pickmodSqueeze } = register(['inhabitmod', 'pickmodSqueeze'], function (lookup, pat) { + return _pick(lookup, pat, true).squeezeJoin(); +}); + +/** + * Pick from the list of values (or patterns of values) via the index using the given + * pattern of integers. The selected pattern will be compressed to fit the duration of the selecting event + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + * @example + * note(squeeze("<0@2 [1!2] 2>", ["g a", "f g f g" , "g a c d"])) + */ + +export const squeeze = (pat, xs) => { + xs = xs.map(reify); + if (xs.length == 0) { + return silence; + } + return pat + .fmap((i) => { + const key = _mod(Math.round(i), xs.length); + return xs[key]; + }) + .squeezeJoin(); +}; diff --git a/src/strudel/core/repl.mjs b/src/strudel/core/repl.mjs new file mode 100644 index 0000000..171697e --- /dev/null +++ b/src/strudel/core/repl.mjs @@ -0,0 +1,279 @@ +import { NeoCyclist } from './neocyclist.mjs'; +import { Cyclist } from './cyclist.mjs'; +import { evaluate as _evaluate } from './evaluate.mjs'; +import { errorLogger, logger } from './logger.mjs'; +import { setTime } from './time.mjs'; +import { evalScope } from './evaluate.mjs'; +import { register, Pattern, isPattern, silence, stack } from './pattern.mjs'; + +export function repl({ + defaultOutput, + onEvalError, + beforeEval, + beforeStart, + afterEval, + getTime, + transpiler, + onToggle, + editPattern, + onUpdateState, + sync = false, + setInterval, + clearInterval, + id, + mondo = false, +}) { + const state = { + schedulerError: undefined, + evalError: undefined, + code: '// LOADING', + activeCode: '// LOADING', + pattern: undefined, + miniLocations: [], + widgets: [], + pending: false, + started: false, + }; + + const transpilerOptions = { + id, + }; + + const updateState = (update) => { + Object.assign(state, update); + state.isDirty = state.code !== state.activeCode; + state.error = state.evalError || state.schedulerError; + onUpdateState?.(state); + }; + + const schedulerOptions = { + onTrigger: getTrigger({ defaultOutput, getTime }), + getTime, + onToggle: (started) => { + updateState({ started }); + onToggle?.(started); + }, + setInterval, + clearInterval, + beforeStart, + }; + + // NeoCyclist uses a shared worker to communicate between instances, which is not supported on mobile chrome + const scheduler = + sync && typeof SharedWorker != 'undefined' ? new NeoCyclist(schedulerOptions) : new Cyclist(schedulerOptions); + let pPatterns = {}; + let anonymousIndex = 0; + let allTransform; + let eachTransform; + + const hush = function () { + pPatterns = {}; + anonymousIndex = 0; + allTransform = undefined; + eachTransform = undefined; + return silence; + }; + + // helper to get a patternified pure value out + function unpure(pat) { + if (pat._Pattern) { + return pat.__pure; + } + return pat; + } + + const setPattern = async (pattern, autostart = true) => { + pattern = editPattern?.(pattern) || pattern; + await scheduler.setPattern(pattern, autostart); + return pattern; + }; + setTime(() => scheduler.now()); // TODO: refactor? + + const stop = () => scheduler.stop(); + const start = () => scheduler.start(); + const pause = () => scheduler.pause(); + const toggle = () => scheduler.toggle(); + const setCps = (cps) => { + scheduler.setCps(unpure(cps)); + return silence; + }; + + /** + * Changes the global tempo to the given cycles per minute + * + * @name setcpm + * @alias setCpm + * @param {number} cpm cycles per minute + * @example + * setcpm(140/4) // =140 bpm in 4/4 + * $: s("bd*4,[- sd]*2").bank('tr707') + */ + const setCpm = (cpm) => { + scheduler.setCps(unpure(cpm) / 60); + return silence; + }; + + // TODO - not documented as jsdoc examples as the test framework doesn't simulate enough context for `each` and `all`.. + + /** Applies a function to all the running patterns. Note that the patterns are groups together into a single `stack` before the function is applied. This is probably what you want, but see `each` for + * a version that applies the function to each pattern separately. + * ``` + * $: sound("bd - cp sd") + * $: sound("hh*8") + * all(fast("<2 3>")) + * ``` + * ``` + * $: sound("bd - cp sd") + * $: sound("hh*8") + * all(x => x.pianoroll()) + * ``` + */ + let allTransforms = []; + const all = function (transform) { + allTransforms.push(transform); + return silence; + }; + /** Applies a function to each of the running patterns separately. This is intended for future use with upcoming 'stepwise' features. See `all` for a version that applies the function to all the patterns stacked together into a single pattern. + * ``` + * $: sound("bd - cp sd") + * $: sound("hh*8") + * each(fast("<2 3>")) + * ``` + */ + const each = function (transform) { + eachTransform = transform; + return silence; + }; + + // set pattern methods that use this repl via closure + const injectPatternMethods = () => { + Pattern.prototype.p = function (id) { + if (typeof id === 'string' && (id.startsWith('_') || id.endsWith('_'))) { + // allows muting a pattern x with x_ or _x + return silence; + } + if (id === '$') { + // allows adding anonymous patterns with $: + id = `$${anonymousIndex}`; + anonymousIndex++; + } + pPatterns[id] = this; + return this; + }; + Pattern.prototype.q = function (id) { + return silence; + }; + try { + for (let i = 1; i < 10; ++i) { + Object.defineProperty(Pattern.prototype, `d${i}`, { + get() { + return this.p(i); + }, + configurable: true, + }); + Object.defineProperty(Pattern.prototype, `p${i}`, { + get() { + return this.p(i); + }, + configurable: true, + }); + Pattern.prototype[`q${i}`] = silence; + } + } catch (err) { + console.warn('injectPatternMethods: error:', err); + } + const cpm = register('cpm', function (cpm, pat) { + return pat._fast(cpm / 60 / scheduler.cps); + }); + return evalScope({ + all, + each, + hush, + cpm, + setCps, + setcps: setCps, + setCpm, + setcpm: setCpm, + }); + }; + + const evaluate = async (code, autostart = true, shouldHush = true) => { + if (!code) { + throw new Error('no code to evaluate'); + } + try { + updateState({ code, pending: true }); + await injectPatternMethods(); + setTime(() => scheduler.now()); // TODO: refactor? + await beforeEval?.({ code }); + allTransforms = []; // reset all transforms + shouldHush && hush(); + + if (mondo) { + code = `mondolang\`${code}\``; + } + let { pattern, meta } = await _evaluate(code, transpiler, transpilerOptions); + if (Object.keys(pPatterns).length) { + let patterns = []; + for (const [key, value] of Object.entries(pPatterns)) { + patterns.push(value.withState((state) => state.setControls({ id: key }))); + } + if (eachTransform) { + // Explicit lambda so only element (not index and array) are passed + patterns = patterns.map((x) => eachTransform(x)); + } + pattern = stack(...patterns); + } else if (eachTransform) { + pattern = eachTransform(pattern); + } + if (allTransforms.length) { + for (let i in allTransforms) { + pattern = allTransforms[i](pattern); + } + } + + if (!isPattern(pattern)) { + const message = `got "${typeof evaluated}" instead of pattern`; + throw new Error(message + (typeof evaluated === 'function' ? ', did you forget to call a function?' : '.')); + } + logger(`[eval] code updated`); + pattern = await setPattern(pattern, autostart); + updateState({ + miniLocations: meta?.miniLocations || [], + widgets: meta?.widgets || [], + activeCode: code, + pattern, + evalError: undefined, + schedulerError: undefined, + pending: false, + }); + afterEval?.({ code, pattern, meta }); + return pattern; + } catch (err) { + logger(`[eval] error: ${err.message}`, 'error'); + console.error(err); + updateState({ evalError: err, pending: false }); + onEvalError?.(err); + } + }; + const setCode = (code) => updateState({ code }); + return { scheduler, evaluate, start, stop, pause, setCps, setPattern, setCode, toggle, state }; +} + +export const getTrigger = + ({ getTime, defaultOutput }) => + async (hap, deadline, duration, cps, t) => { + // ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger) + // TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004 + try { + if (!hap.context.onTrigger || !hap.context.dominantTrigger) { + await defaultOutput(hap, deadline, duration, cps, t); + } + if (hap.context.onTrigger) { + // call signature of output / onTrigger is different... + await hap.context.onTrigger(hap, getTime(), cps, t); + } + } catch (err) { + errorLogger(err, 'getTrigger'); + } + }; diff --git a/src/strudel/core/signal.mjs b/src/strudel/core/signal.mjs new file mode 100644 index 0000000..6bd6fde --- /dev/null +++ b/src/strudel/core/signal.mjs @@ -0,0 +1,839 @@ +/* +signal.mjs - continuous patterns +Copyright (C) 2024 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { Hap } from './hap.mjs'; +import { Pattern, fastcat, pure, register, reify, silence, stack, sequenceP } from './pattern.mjs'; +import Fraction from './fraction.mjs'; + +import { id, keyAlias, getCurrentKeyboardState } from './util.mjs'; + +export function steady(value) { + // A continuous value + return new Pattern((state) => [new Hap(undefined, state.span, value)]); +} + +export const signal = (func) => { + const query = (state) => [new Hap(undefined, state.span, func(state.span.begin))]; + return new Pattern(query); +}; + +/** + * A sawtooth signal between 0 and 1. + * + * @return {Pattern} + * @example + * note("*8") + * .clip(saw.slow(2)) + * @example + * n(saw.range(0,8).segment(8)) + * .scale('C major') + * + */ +export const saw = signal((t) => t % 1); + +/** + * A sawtooth signal between -1 and 1 (like `saw`, but bipolar). + * + * @return {Pattern} + */ +export const saw2 = saw.toBipolar(); + +/** + * A sawtooth signal between 1 and 0 (like `saw`, but flipped). + * + * @return {Pattern} + * @example + * note("*8") + * .clip(isaw.slow(2)) + * @example + * n(isaw.range(0,8).segment(8)) + * .scale('C major') + * + */ +export const isaw = signal((t) => 1 - (t % 1)); + +/** + * A sawtooth signal between 1 and -1 (like `saw2`, but flipped). + * + * @return {Pattern} + */ +export const isaw2 = isaw.toBipolar(); + +/** + * A sine signal between -1 and 1 (like `sine`, but bipolar). + * + * @return {Pattern} + */ +export const sine2 = signal((t) => Math.sin(Math.PI * 2 * t)); + +/** + * A sine signal between 0 and 1. + * @return {Pattern} + * @example + * n(sine.segment(16).range(0,15)) + * .scale("C:minor") + * + */ +export const sine = sine2.fromBipolar(); + +/** + * A cosine signal between 0 and 1. + * + * @return {Pattern} + * @example + * n(stack(sine,cosine).segment(16).range(0,15)) + * .scale("C:minor") + * + */ +export const cosine = sine._early(Fraction(1).div(4)); + +/** + * A cosine signal between -1 and 1 (like `cosine`, but bipolar). + * + * @return {Pattern} + */ +export const cosine2 = sine2._early(Fraction(1).div(4)); + +/** + * A square signal between 0 and 1. + * @return {Pattern} + * @example + * n(square.segment(4).range(0,7)).scale("C:minor") + * + */ +export const square = signal((t) => Math.floor((t * 2) % 2)); + +/** + * A square signal between -1 and 1 (like `square`, but bipolar). + * + * @return {Pattern} + */ +export const square2 = square.toBipolar(); + +/** + * A triangle signal between 0 and 1. + * + * @return {Pattern} + * @example + * n(tri.segment(8).range(0,7)).scale("C:minor") + * + */ +export const tri = fastcat(saw, isaw); + +/** + * A triangle signal between -1 and 1 (like `tri`, but bipolar). + * + * @return {Pattern} + */ +export const tri2 = fastcat(saw2, isaw2); + +/** + * An inverted triangle signal between 1 and 0 (like `tri`, but flipped). + * + * @return {Pattern} + * @example + * n(itri.segment(8).range(0,7)).scale("C:minor") + * + */ +export const itri = fastcat(isaw, saw); + +/** + * An inverted triangle signal between -1 and 1 (like `itri`, but bipolar). + * + * @return {Pattern} + */ +export const itri2 = fastcat(isaw2, saw2); + +/** + * A signal representing the cycle time. + * + * @return {Pattern} + */ +export const time = signal(id); + +/** + * The mouse's x position value ranges from 0 to 1. + * @name mousex + * @return {Pattern} + * @example + * n(mousex.segment(4).range(0,7)).scale("C:minor") + * + */ + +/** + * The mouse's y position value ranges from 0 to 1. + * @name mousey + * @return {Pattern} + * @example + * n(mousey.segment(4).range(0,7)).scale("C:minor") + * + */ +let _mouseY = 0, + _mouseX = 0; +if (typeof window !== 'undefined') { + //document.onmousemove = (e) => { + document.addEventListener('mousemove', (e) => { + _mouseY = e.clientY / document.body.clientHeight; + _mouseX = e.clientX / document.body.clientWidth; + }); +} + +export const mousey = signal(() => _mouseY); +export const mouseY = signal(() => _mouseY); +export const mousex = signal(() => _mouseX); +export const mouseX = signal(() => _mouseX); + +// random signals + +const xorwise = (x) => { + const a = (x << 13) ^ x; + const b = (a >> 17) ^ a; + return (b << 5) ^ b; +}; + +// stretch 300 cycles over the range of [0,2**29 == 536870912) then apply the xorshift algorithm +const _frac = (x) => x - Math.trunc(x); + +const timeToIntSeed = (x) => xorwise(Math.trunc(_frac(x / 300) * 536870912)); + +const intSeedToRand = (x) => (x % 536870912) / 536870912; + +const timeToRand = (x) => Math.abs(intSeedToRand(timeToIntSeed(x))); + +const timeToRandsPrime = (seed, n) => { + const result = []; + // eslint-disable-next-line + for (let i = 0; i < n; ++i) { + result.push(intSeedToRand(seed)); + seed = xorwise(seed); + } + return result; +}; + +const timeToRands = (t, n) => timeToRandsPrime(timeToIntSeed(t), n); + +/** + * + */ + +/** + * A discrete pattern of numbers from 0 to n-1 + * @example + * n(run(4)).scale("C4:pentatonic") + * // n("0 1 2 3").scale("C4:pentatonic") + */ +export const run = (n) => saw.range(0, n).round().segment(n); + +/** + * Creates a pattern from a binary number. + * + * @name binary + * @param {number} n - input number to convert to binary + * @example + * "hh".s().struct(binary(5)) + * // "hh".s().struct("1 0 1") + */ +export const binary = (n) => { + const nBits = reify(n).log2(0).floor().add(1); + return binaryN(n, nBits); +}; + +/** + * Creates a pattern from a binary number, padded to n bits long. + * + * @name binaryN + * @param {number} n - input number to convert to binary + * @param {number} nBits - pattern length, defaults to 16 + * @example + * "hh".s().struct(binaryN(55532, 16)) + * // "hh".s().struct("1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0") + */ +export const binaryN = (n, nBits = 16) => { + nBits = reify(nBits); + // Shift and mask, putting msb on the right-side + const bitPos = run(nBits).mul(-1).add(nBits.sub(1)); + return reify(n).segment(nBits).brshift(bitPos).band(pure(1)); +}; + +export const randrun = (n) => { + return signal((t) => { + // Without adding 0.5, the first cycle is always 0,1,2,3,... + const rands = timeToRands(t.floor().add(0.5), n); + const nums = rands + .map((n, i) => [n, i]) + .sort((a, b) => (a[0] > b[0]) - (a[0] < b[0])) + .map((x) => x[1]); + const i = t.cyclePos().mul(n).floor() % n; + return nums[i]; + })._segment(n); +}; + +const _rearrangeWith = (ipat, n, pat) => { + const pats = [...Array(n).keys()].map((i) => pat.zoom(Fraction(i).div(n), Fraction(i + 1).div(n))); + return ipat.fmap((i) => pats[i].repeatCycles(n)._fast(n)).innerJoin(); +}; + +/** + * Slices a pattern into the given number of parts, then plays those parts in random order. + * Each part will be played exactly once per cycle. + * @name shuffle + * @example + * note("c d e f").sound("piano").shuffle(4) + * @example + * seq("c d e f".shuffle(4), "g").note().sound("piano") + */ +export const shuffle = register('shuffle', (n, pat) => { + return _rearrangeWith(randrun(n), n, pat); +}); + +/** + * Slices a pattern into the given number of parts, then plays those parts at random. Similar to `shuffle`, + * but parts might be played more than once, or not at all, per cycle. + * @name scramble + * @example + * note("c d e f").sound("piano").scramble(4) + * @example + * seq("c d e f".scramble(4), "g").note().sound("piano") + */ +export const scramble = register('scramble', (n, pat) => { + return _rearrangeWith(_irand(n)._segment(n), n, pat); +}); + +/** + * A continuous pattern of random numbers, between 0 and 1. + * + * @name rand + * @example + * // randomly change the cutoff + * s("bd*4,hh*8").cutoff(rand.range(500,8000)) + * + */ +export const rand = signal(timeToRand); +/** + * A continuous pattern of random numbers, between -1 and 1 + */ +export const rand2 = rand.toBipolar(); + +export const _brandBy = (p) => rand.fmap((x) => x < p); + +/** + * A continuous pattern of 0 or 1 (binary random), with a probability for the value being 1 + * + * @name brandBy + * @param {number} probability - a number between 0 and 1 + * @example + * s("hh*10").pan(brandBy(0.2)) + */ +export const brandBy = (pPat) => reify(pPat).fmap(_brandBy).innerJoin(); + +/** + * A continuous pattern of 0 or 1 (binary random) + * + * @name brand + * @example + * s("hh*10").pan(brand) + */ +export const brand = _brandBy(0.5); + +export const _irand = (i) => rand.fmap((x) => Math.trunc(x * i)); + +/** + * A continuous pattern of random integers, between 0 and n-1. + * + * @name irand + * @param {number} n max value (exclusive) + * @example + * // randomly select scale notes from 0 - 7 (= C to C) + * n(irand(8)).struct("x x*2 x x*3").scale("C:minor") + * + */ +export const irand = (ipat) => reify(ipat).fmap(_irand).innerJoin(); + +export const __chooseWith = (pat, xs) => { + xs = xs.map(reify); + if (xs.length == 0) { + return silence; + } + + return pat.range(0, xs.length).fmap((i) => { + const key = Math.min(Math.max(Math.floor(i), 0), xs.length - 1); + return xs[key]; + }); +}; +/** + * Choose from the list of values (or patterns of values) using the given + * pattern of numbers, which should be in the range of 0..1 + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + * @example + * note("c2 g2!2 d2 f1").s(chooseWith(sine.fast(2), ["sawtooth", "triangle", "bd:6"])) + */ +export const chooseWith = (pat, xs) => { + return __chooseWith(pat, xs).outerJoin(); +}; + +/** + * As with {chooseWith}, but the structure comes from the chosen values, rather + * than the pattern you're using to choose with. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const chooseInWith = (pat, xs) => { + return __chooseWith(pat, xs).innerJoin(); +}; + +/** + * Chooses randomly from the given list of elements. + * @param {...any} xs values / patterns to choose from. + * @returns {Pattern} - a continuous pattern. + * @example + * note("c2 g2!2 d2 f1").s(choose("sine", "triangle", "bd:6")) + */ +export const choose = (...xs) => chooseWith(rand, xs); + +// todo: doc +export const chooseIn = (...xs) => chooseInWith(rand, xs); +export const chooseOut = choose; + +/** + * Chooses from the given list of values (or patterns of values), according + * to the pattern that the method is called on. The pattern should be in + * the range 0 .. 1. + * @param {...any} xs + * @returns {Pattern} + */ +Pattern.prototype.choose = function (...xs) { + return chooseWith(this, xs); +}; + +/** + * As with choose, but the pattern that this method is called on should be + * in the range -1 .. 1 + * @param {...any} xs + * @returns {Pattern} + */ +Pattern.prototype.choose2 = function (...xs) { + return chooseWith(this.fromBipolar(), xs); +}; + +/** + * Picks one of the elements at random each cycle. + * @synonyms randcat + * @returns {Pattern} + * @example + * chooseCycles("bd", "hh", "sd").s().fast(8) + * @example + * s("bd | hh | sd").fast(8) + */ +export const chooseCycles = (...xs) => chooseInWith(rand.segment(1), xs); + +export const randcat = chooseCycles; + +const _wchooseWith = function (pat, ...pairs) { + // A list of patterns of values + const values = pairs.map((pair) => reify(pair[0])); + + // A list of weight patterns + const weights = []; + + let total = pure(0); + for (const pair of pairs) { + // 'add' accepts either values or patterns of values here, so no need + // to explicitly reify + total = total.add(pair[1]); + // accumulate our list of weight patterns + weights.push(total); + } + // a pattern of lists of weights + const weightspat = sequenceP(weights); + + // Takes a number from 0-1, returns a pattern of patterns of values + const match = function (r) { + const findpat = total.mul(r); + return weightspat.fmap((weights) => (find) => values[weights.findIndex((x) => x > find, weights)]).appLeft(findpat); + }; + // This returns a pattern of patterns.. The innerJoin is in wchooseCycles + return pat.bind(match); +}; + +const wchooseWith = (...args) => _wchooseWith(...args).outerJoin(); + +/** + * Chooses randomly from the given list of elements by giving a probability to each element + * @param {...any} pairs arrays of value and weight + * @returns {Pattern} - a continuous pattern. + * @example + * note("c2 g2!2 d2 f1").s(wchoose(["sine",10], ["triangle",1], ["bd:6",1])) + */ +export const wchoose = (...pairs) => wchooseWith(rand, ...pairs); + +/** + * Picks one of the elements at random each cycle by giving a probability to each element + * @synonyms wrandcat + * @returns {Pattern} + * @example + * wchooseCycles(["bd",10], ["hh",1], ["sd",1]).s().fast(8) + * @example + * wchooseCycles(["bd bd bd",5], ["hh hh hh",3], ["sd sd sd",1]).fast(4).s() + * @example + * // The probability can itself be a pattern + * wchooseCycles(["bd(3,8)","<5 0>"], ["hh hh hh",3]).fast(4).s() + */ +export const wchooseCycles = (...pairs) => _wchooseWith(rand.segment(1), ...pairs).innerJoin(); + +export const wrandcat = wchooseCycles; + +function _perlin(t) { + let ta = Math.floor(t); + let tb = ta + 1; + const smootherStep = (x) => 6.0 * x ** 5 - 15.0 * x ** 4 + 10.0 * x ** 3; + const interp = (x) => (a) => (b) => a + smootherStep(x) * (b - a); + const v = interp(t - ta)(timeToRand(ta))(timeToRand(tb)); + return v; +} +export const perlinWith = (tpat) => { + return tpat.fmap(_perlin); +}; + +function _berlin(t) { + const prevRidgeStartIndex = Math.floor(t); + const nextRidgeStartIndex = prevRidgeStartIndex + 1; + + const prevRidgeBottomPoint = timeToRand(prevRidgeStartIndex); + const nextRidgeTopPoint = timeToRand(nextRidgeStartIndex) + prevRidgeBottomPoint; + + const currentPercent = (t - prevRidgeStartIndex) / (nextRidgeStartIndex - prevRidgeStartIndex); + const interp = (a, b, t) => { + return a + (b - a) * t; + }; + return interp(prevRidgeBottomPoint, nextRidgeTopPoint, currentPercent) / 2; +} + +export const berlinWith = (tpat) => { + return tpat.fmap(_berlin); +}; + +/** + * Generates a continuous pattern of [perlin noise](https://en.wikipedia.org/wiki/Perlin_noise), in the range 0..1. + * + * @name perlin + * @example + * // randomly change the cutoff + * s("bd*4,hh*8").cutoff(perlin.range(500,8000)) + * + */ +export const perlin = perlinWith(time.fmap((v) => Number(v))); + +/** + * Generates a continuous pattern of [berlin noise](conceived by Jame Coyne and Jade Rowland as a joke but turned out to be surprisingly cool and useful, + * like perlin noise but with sawtooth waves), in the range 0..1. + * + * @name berlin + * @example + * // ascending arpeggios + * n("0!16".add(berlin.fast(4).mul(14))).scale("d:minor") + * + */ +export const berlin = berlinWith(time.fmap((v) => Number(v))); + +export const degradeByWith = register( + 'degradeByWith', + (withPat, x, pat) => pat.fmap((a) => (_) => a).appLeft(withPat.filterValues((v) => v > x)), + true, + true, +); + +/** + * Randomly removes events from the pattern by a given amount. + * 0 = 0% chance of removal + * 1 = 100% chance of removal + * + * @name degradeBy + * @memberof Pattern + * @param {number} amount - a number between 0 and 1 + * @returns Pattern + * @example + * s("hh*8").degradeBy(0.2) + * @example + * s("[hh?0.2]*8") + * @example + * //beat generator + * s("bd").segment(16).degradeBy(.5).ribbon(16,1) + */ +export const degradeBy = register( + 'degradeBy', + function (x, pat) { + return pat._degradeByWith(rand, x); + }, + true, + true, +); + +/** + * + * Randomly removes 50% of events from the pattern. Shorthand for `.degradeBy(0.5)` + * + * @name degrade + * @memberof Pattern + * @returns Pattern + * @example + * s("hh*8").degrade() + * @example + * s("[hh?]*8") + */ +export const degrade = register('degrade', (pat) => pat._degradeBy(0.5), true, true); + +/** + * Inverse of `degradeBy`: Randomly removes events from the pattern by a given amount. + * 0 = 100% chance of removal + * 1 = 0% chance of removal + * Events that would be removed by degradeBy are let through by undegradeBy and vice versa (see second example). + * + * @name undegradeBy + * @memberof Pattern + * @param {number} amount - a number between 0 and 1 + * @returns Pattern + * @example + * s("hh*8").undegradeBy(0.2) + * @example + * s("hh*10").layer( + * x => x.degradeBy(0.2).pan(0), + * x => x.undegradeBy(0.8).pan(1) + * ) + */ +export const undegradeBy = register( + 'undegradeBy', + function (x, pat) { + return pat._degradeByWith( + rand.fmap((r) => 1 - r), + x, + ); + }, + true, + true, +); + +/** + * Inverse of `degrade`: Randomly removes 50% of events from the pattern. Shorthand for `.undegradeBy(0.5)` + * Events that would be removed by degrade are let through by undegrade and vice versa (see second example). + * + * @name undegrade + * @memberof Pattern + * @returns Pattern + * @example + * s("hh*8").undegrade() + * @example + * s("hh*10").layer( + * x => x.degrade().pan(0), + * x => x.undegrade().pan(1) + * ) + */ +export const undegrade = register('undegrade', (pat) => pat._undegradeBy(0.5), true, true); + +/** + * + * Randomly applies the given function by the given probability. + * Similar to `someCyclesBy` + * + * @name sometimesBy + * @memberof Pattern + * @param {number | Pattern} probability - a number between 0 and 1 + * @param {function} function - the transformation to apply + * @returns Pattern + * @example + * s("hh*8").sometimesBy(.4, x=>x.speed("0.5")) + */ + +export const sometimesBy = register('sometimesBy', function (patx, func, pat) { + return reify(patx) + .fmap((x) => stack(pat._degradeBy(x), func(pat._undegradeBy(1 - x)))) + .innerJoin(); +}); + +/** + * + * Applies the given function with a 50% chance + * + * @name sometimes + * @memberof Pattern + * @param {function} function - the transformation to apply + * @returns Pattern + * @example + * s("hh*8").sometimes(x=>x.speed("0.5")) + */ +export const sometimes = register('sometimes', function (func, pat) { + return pat._sometimesBy(0.5, func); +}); + +/** + * + * Randomly applies the given function by the given probability on a cycle by cycle basis. + * Similar to `sometimesBy` + * + * @name someCyclesBy + * @memberof Pattern + * @param {number | Pattern} probability - a number between 0 and 1 + * @param {function} function - the transformation to apply + * @returns Pattern + * @example + * s("bd,hh*8").someCyclesBy(.3, x=>x.speed("0.5")) + */ + +export const someCyclesBy = register('someCyclesBy', function (patx, func, pat) { + return reify(patx) + .fmap((x) => + stack( + pat._degradeByWith(rand._segment(1), x), + func(pat._degradeByWith(rand.fmap((r) => 1 - r)._segment(1), 1 - x)), + ), + ) + .innerJoin(); +}); + +/** + * + * Shorthand for `.someCyclesBy(0.5, fn)` + * + * @name someCycles + * @memberof Pattern + * @returns Pattern + * @example + * s("bd,hh*8").someCycles(x=>x.speed("0.5")) + */ +export const someCycles = register('someCycles', function (func, pat) { + return pat._someCyclesBy(0.5, func); +}); + +/** + * + * Shorthand for `.sometimesBy(0.75, fn)` + * + * @name often + * @memberof Pattern + * @returns Pattern + * @example + * s("hh*8").often(x=>x.speed("0.5")) + */ +export const often = register('often', function (func, pat) { + return pat.sometimesBy(0.75, func); +}); + +/** + * + * Shorthand for `.sometimesBy(0.25, fn)` + * + * @name rarely + * @memberof Pattern + * @returns Pattern + * @example + * s("hh*8").rarely(x=>x.speed("0.5")) + */ +export const rarely = register('rarely', function (func, pat) { + return pat.sometimesBy(0.25, func); +}); + +/** + * + * Shorthand for `.sometimesBy(0.1, fn)` + * + * @name almostNever + * @memberof Pattern + * @returns Pattern + * @example + * s("hh*8").almostNever(x=>x.speed("0.5")) + */ +export const almostNever = register('almostNever', function (func, pat) { + return pat.sometimesBy(0.1, func); +}); + +/** + * + * Shorthand for `.sometimesBy(0.9, fn)` + * + * @name almostAlways + * @memberof Pattern + * @returns Pattern + * @example + * s("hh*8").almostAlways(x=>x.speed("0.5")) + */ +export const almostAlways = register('almostAlways', function (func, pat) { + return pat.sometimesBy(0.9, func); +}); + +/** + * + * Shorthand for `.sometimesBy(0, fn)` (never calls fn) + * + * @name never + * @memberof Pattern + * @returns Pattern + * @example + * s("hh*8").never(x=>x.speed("0.5")) + */ +export const never = register('never', function (_, pat) { + return pat; +}); + +/** + * + * Shorthand for `.sometimesBy(1, fn)` (always calls fn) + * + * @name always + * @memberof Pattern + * @returns Pattern + * @example + * s("hh*8").always(x=>x.speed("0.5")) + */ +export const always = register('always', function (func, pat) { + return func(pat); +}); + +//keyname: string | Array +//keyname reference: https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values +export function _keyDown(keyname) { + if (Array.isArray(keyname) === false) { + keyname = [keyname]; + } + const keyState = getCurrentKeyboardState(); + return keyname.every((x) => { + const keyName = keyAlias.get(x) ?? x; + return keyState[keyName]; + }); +} + +/** + * + * Do something on a keypress, or array of keypresses + * [Key name reference](https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values) + * + * @name whenKey + * @memberof Pattern + * @returns Pattern + * @example + * s("bd(5,8)").whenKey("Control:j", x => x.segment(16).color("red")).whenKey("Control:i", x => x.fast(2).color("blue")) + */ + +export const whenKey = register('whenKey', function (input, func, pat) { + return pat.when(_keyDown(input), func); +}); + +/** + * + * returns true when a key or array of keys is held + * [Key name reference](https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values) + * + * @name keyDown + * @memberof Pattern + * @returns Pattern + * @example + * keyDown("Control:j").pick([s("bd(5,8)"), s("cp(3,8)")]) + */ + +export const keyDown = register('keyDown', function (pat) { + return pat.fmap(_keyDown); +}); diff --git a/src/strudel/core/speak.mjs b/src/strudel/core/speak.mjs new file mode 100644 index 0000000..e0f6018 --- /dev/null +++ b/src/strudel/core/speak.mjs @@ -0,0 +1,38 @@ +/* +speak.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { register } from './index.mjs'; + +let synth; +try { + synth = window?.speechSynthesis; +} catch (err) { + console.warn('cannot use window: not in browser?'); +} + +let allVoices = synth?.getVoices(); +// console.log('voices', allVoices); + +function triggerSpeech(words, lang, voice) { + synth.cancel(); + const utterance = new SpeechSynthesisUtterance(words); + utterance.lang = lang; + allVoices = synth.getVoices(); + const voices = allVoices.filter((v) => v.lang.includes(lang)); + if (typeof voice === 'number') { + utterance.voice = voices[voice % voices.length]; + } else if (typeof voice === 'string') { + utterance.voice = voices.find((voice) => voice.name === voice); + } + // console.log(utterance.voice?.name, utterance.voice?.lang); + speechSynthesis.speak(utterance); +} + +export const speak = register('speak', function (lang, voice, pat) { + return pat.onTrigger((hap) => { + triggerSpeech(hap.value, lang, voice); + }); +}); diff --git a/src/strudel/core/state.mjs b/src/strudel/core/state.mjs new file mode 100644 index 0000000..8aa5819 --- /dev/null +++ b/src/strudel/core/state.mjs @@ -0,0 +1,28 @@ +/* +state.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +export class State { + constructor(span, controls = {}) { + this.span = span; + this.controls = controls; + } + + // Returns new State with different span + setSpan(span) { + return new State(span, this.controls); + } + + withSpan(func) { + return this.setSpan(func(this.span)); + } + + // Returns new State with added controls. + setControls(controls) { + return new State(this.span, { ...this.controls, ...controls }); + } +} + +export default State; diff --git a/src/strudel/core/time.mjs b/src/strudel/core/time.mjs new file mode 100644 index 0000000..80daaf5 --- /dev/null +++ b/src/strudel/core/time.mjs @@ -0,0 +1,11 @@ +let time; +export function getTime() { + if (!time) { + throw new Error('no time set! use setTime to define a time source'); + } + return time(); +} + +export function setTime(func) { + time = func; +} diff --git a/src/strudel/core/timespan.mjs b/src/strudel/core/timespan.mjs new file mode 100644 index 0000000..446156b --- /dev/null +++ b/src/strudel/core/timespan.mjs @@ -0,0 +1,117 @@ +/* +timespan.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import Fraction from './fraction.mjs'; + +export class TimeSpan { + constructor(begin, end) { + this.begin = Fraction(begin); + this.end = Fraction(end); + } + + get spanCycles() { + const spans = []; + var begin = this.begin; + const end = this.end; + const end_sam = end.sam(); + + // Support zero-width timespans + if (begin.equals(end)) { + return [new TimeSpan(begin, end)]; + } + + while (end.gt(begin)) { + // If begin and end are in the same cycle, we're done. + if (begin.sam().equals(end_sam)) { + spans.push(new TimeSpan(begin, this.end)); + break; + } + // add a timespan up to the next sam + const next_begin = begin.nextSam(); + spans.push(new TimeSpan(begin, next_begin)); + + // continue with the next cycle + begin = next_begin; + } + return spans; + } + + get duration() { + return this.end.sub(this.begin); + } + + cycleArc() { + // Shifts a timespan to one of equal duration that starts within cycle zero. + // (Note that the output timespan probably does not start *at* Time 0 -- + // that only happens when the input Arc starts at an integral Time.) + const b = this.begin.cyclePos(); + const e = b.add(this.duration); + return new TimeSpan(b, e); + } + + withTime(func_time) { + // Applies given function to both the begin and end time of the timespan""" + return new TimeSpan(func_time(this.begin), func_time(this.end)); + } + + withEnd(func_time) { + // Applies given function to the end time of the timespan""" + return new TimeSpan(this.begin, func_time(this.end)); + } + + withCycle(func_time) { + // Like withTime, but time is relative to relative to the cycle (i.e. the + // sam of the start of the timespan) + const sam = this.begin.sam(); + const b = sam.add(func_time(this.begin.sub(sam))); + const e = sam.add(func_time(this.end.sub(sam))); + return new TimeSpan(b, e); + } + + intersection(other) { + // Intersection of two timespans, returns undefined if they don't intersect. + const intersect_begin = this.begin.max(other.begin); + const intersect_end = this.end.min(other.end); + + if (intersect_begin.gt(intersect_end)) { + return undefined; + } + if (intersect_begin.equals(intersect_end)) { + // Zero-width (point) intersection - doesn't intersect if it's at the end of a + // non-zero-width timespan. + if (intersect_begin.equals(this.end) && this.begin.lt(this.end)) { + return undefined; + } + if (intersect_begin.equals(other.end) && other.begin.lt(other.end)) { + return undefined; + } + } + return new TimeSpan(intersect_begin, intersect_end); + } + + intersection_e(other) { + // Like 'sect', but raises an exception if the timespans don't intersect. + const result = this.intersection(other); + if (result == undefined) { + throw 'TimeSpans do not intersect'; + } + return result; + } + + midpoint() { + return this.begin.add(this.duration.div(Fraction(2))); + } + + equals(other) { + return this.begin.equals(other.begin) && this.end.equals(other.end); + } + + show() { + return this.begin.show() + ' → ' + this.end.show(); + } +} + +export default TimeSpan; diff --git a/src/strudel/core/ui.mjs b/src/strudel/core/ui.mjs new file mode 100644 index 0000000..5a2c54a --- /dev/null +++ b/src/strudel/core/ui.mjs @@ -0,0 +1,32 @@ +/* +ui.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +export const backgroundImage = function (src, animateOptions = {}) { + const container = document.getElementById('code'); + const bg = 'background-image:url(' + src + ');background-size:contain;'; + container.style = bg; + const { className: initialClassName } = container; + const handleOption = (option, value) => { + ({ + style: () => (container.style = bg + ';' + value), + className: () => (container.className = value + ' ' + initialClassName), + })[option](); + }; + const funcOptions = Object.entries(animateOptions).filter(([_, v]) => typeof v === 'function'); + const stringOptions = Object.entries(animateOptions).filter(([_, v]) => typeof v === 'string'); + stringOptions.forEach(([option, value]) => handleOption(option, value)); + + if (funcOptions.length === 0) { + return; + } +}; + +export const cleanupUi = () => { + const container = document.getElementById('code'); + if (container) { + container.style = ''; + } +}; diff --git a/src/strudel/core/util.mjs b/src/strudel/core/util.mjs new file mode 100644 index 0000000..ef3f1e9 --- /dev/null +++ b/src/strudel/core/util.mjs @@ -0,0 +1,499 @@ +/* +util.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { logger } from './logger.mjs'; + +// returns true if the given string is a note +export const isNoteWithOctave = (name) => /^[a-gA-G][#bs]*[0-9]$/.test(name); +export const isNote = (name) => /^[a-gA-G][#bsf]*-?[0-9]?$/.test(name); +export const tokenizeNote = (note) => { + if (typeof note !== 'string') { + return []; + } + const [pc, acc = '', oct] = note.match(/^([a-gA-G])([#bsf]*)(-?[0-9]*)$/)?.slice(1) || []; + if (!pc) { + return []; + } + return [pc, acc, oct ? Number(oct) : undefined]; +}; + +const chromas = { c: 0, d: 2, e: 4, f: 5, g: 7, a: 9, b: 11 }; +const accs = { '#': 1, b: -1, s: 1, f: -1 }; + +// turns the given note into its midi number representation +export const noteToMidi = (note, defaultOctave = 3) => { + const [pc, acc, oct = defaultOctave] = tokenizeNote(note); + if (!pc) { + throw new Error('not a note: "' + note + '"'); + } + const chroma = chromas[pc.toLowerCase()]; + const offset = acc?.split('').reduce((o, char) => o + accs[char], 0) || 0; + return (Number(oct) + 1) * 12 + chroma + offset; +}; +export const midiToFreq = (n) => { + return Math.pow(2, (n - 69) / 12) * 440; +}; + +export const freqToMidi = (freq) => { + return (12 * Math.log(freq / 440)) / Math.LN2 + 69; +}; + +export const valueToMidi = (value, fallbackValue) => { + if (typeof value !== 'object') { + throw new Error('valueToMidi: expected object value'); + } + let { freq, note } = value; + if (typeof freq === 'number') { + return freqToMidi(freq); + } + if (typeof note === 'string') { + return noteToMidi(note); + } + if (typeof note === 'number') { + return note; + } + if (!fallbackValue) { + throw new Error('valueToMidi: expected freq or note to be set'); + } + return fallbackValue; +}; + +// used to schedule external event like midi and osc out +export const getEventOffsetMs = (targetTimeSeconds, currentTimeSeconds) => { + return (targetTimeSeconds - currentTimeSeconds) * 1000; +}; + +/** + * @deprecated does not appear to be referenced or invoked anywhere in the codebase + * @noAutocomplete + */ +export const getFreq = (noteOrMidi) => { + if (typeof noteOrMidi === 'number') { + return midiToFreq(noteOrMidi); + } + return midiToFreq(noteToMidi(noteOrMidi)); +}; + +const pcs = ['C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B']; +/** + * @deprecated only used in workshop (first-notes) + * @noAutocomplete + */ +export const midi2note = (n) => { + const oct = Math.floor(n / 12) - 1; + const pc = pcs[n % 12]; + return pc + oct; +}; + +// modulo that works with negative numbers e.g. _mod(-1, 3) = 2. Works on numbers (rather than patterns of numbers, as @mod@ from pattern.mjs does) +export const _mod = (n, m) => ((n % m) + m) % m; + +// average numbers in an array +export const averageArray = (arr) => arr.reduce((a, b) => a + b) / arr.length; + +export function nanFallback(value, fallback = 0) { + if (isNaN(Number(value))) { + logger(`"${value}" is not a number, falling back to ${fallback}`, 'warning'); + return fallback; + } + return value; +} +// round to nearest int, negative numbers will output a subtracted index +export const getSoundIndex = (n, numSounds) => { + return _mod(Math.round(nanFallback(n ?? 0, 0)), numSounds); +}; + +export const getPlayableNoteValue = (hap) => { + let { value, context } = hap; + let note = value; + if (typeof note === 'object' && !Array.isArray(note)) { + note = note.note || note.n || note.value; + if (note === undefined) { + throw new Error(`cannot find a playable note for ${JSON.stringify(value)}`); + } + } + // if value is number => interpret as midi number as long as its not marked as frequency + if (typeof note === 'number' && context.type !== 'frequency') { + note = midiToFreq(hap.value); + } else if (typeof note === 'number' && context.type === 'frequency') { + note = hap.value; // legacy workaround.. will be removed in the future + } else if (typeof note !== 'string' || !isNote(note)) { + throw new Error('not a note: ' + JSON.stringify(note)); + } + return note; +}; + +export const getFrequency = (hap) => { + let { value, context } = hap; + // if value is number => interpret as midi number as long as its not marked as frequency + if (typeof value === 'object') { + if (value.freq) { + return value.freq; + } + return getFreq(value.note || value.n || value.value); + } + if (typeof value === 'number' && context.type !== 'frequency') { + value = midiToFreq(hap.value); + } else if (typeof value === 'string' && isNote(value)) { + value = midiToFreq(noteToMidi(hap.value)); + } else if (typeof value !== 'number') { + throw new Error('not a note or frequency: ' + value); + } + return value; +}; + +// rotate array by n steps (to the left) +export const rotate = (arr, n) => arr.slice(n).concat(arr.slice(0, n)); + +export const pipe = (...funcs) => { + return funcs.reduce( + (f, g) => + (...args) => + f(g(...args)), + (x) => x, + ); +}; + +export const compose = (...funcs) => pipe(...funcs.reverse()); + +// Removes 'None' values from given list +export const removeUndefineds = (xs) => xs.filter((x) => x != undefined); + +// flattens by one level +export const flatten = (arr) => [].concat(...arr); + +export const id = (a) => a; +export const constant = (a, b) => a; + +export const listRange = (min, max) => Array.from({ length: max - min + 1 }, (_, i) => i + min); + +export function curry(func, overload, arity = func.length) { + const fn = function curried(...args) { + if (args.length >= arity) { + return func.apply(this, args); + } else { + const partial = function (...args2) { + return curried.apply(this, args.concat(args2)); + }; + if (overload) { + overload(partial, args); + } + return partial; + } + }; + if (overload) { + // overload function without args... needed for chordBass.transpose(2) + overload(fn, []); + } + return fn; +} + +export function parseNumeral(numOrString) { + const asNumber = Number(numOrString); + if (!isNaN(asNumber)) { + return asNumber; + } + if (isNote(numOrString)) { + return noteToMidi(numOrString); + } + throw new Error(`cannot parse as numeral: "${numOrString}"`); +} + +export function mapArgs(fn, mapFn) { + return (...args) => fn(...args.map(mapFn)); +} + +export function numeralArgs(fn) { + return mapArgs(fn, parseNumeral); +} + +export function parseFractional(numOrString) { + const asNumber = Number(numOrString); + if (!isNaN(asNumber)) { + return asNumber; + } + const specialValue = { + pi: Math.PI, + w: 1, + h: 0.5, + q: 0.25, + e: 0.125, + s: 0.0625, + t: 1 / 3, + f: 0.2, + x: 1 / 6, + }[numOrString]; + if (typeof specialValue !== 'undefined') { + return specialValue; + } + throw new Error(`cannot parse as fractional: "${numOrString}"`); +} + +export const fractionalArgs = (fn) => mapArgs(fn, parseFractional); + +export const splitAt = function (index, value) { + return [value.slice(0, index), value.slice(index)]; +}; + +// Uses the function f to combine the arrays xs, ys element-wise +export const zipWith = (f, xs, ys) => xs.map((n, i) => f(n, ys[i])); + +export const pairs = function (xs) { + const result = []; + for (let i = 0; i < xs.length - 1; ++i) { + result.push([xs[i], xs[i + 1]]); + } + return result; +}; + +export const clamp = (num, min, max) => Math.min(Math.max(num, min), max); + +/* solmization, not used yet */ +const solfeggio = ['Do', 'Reb', 'Re', 'Mib', 'Mi', 'Fa', 'Solb', 'Sol', 'Lab', 'La', 'Sib', 'Si']; /*solffegio notes*/ +const indian = [ + 'Sa', + 'Re', + 'Ga', + 'Ma', + 'Pa', + 'Dha', + 'Ni', +]; /*indian musical notes, seems like they do not use flats or sharps*/ +const german = ['C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Hb', 'H']; /*german & dutch musical notes*/ +const byzantine = [ + 'Ni', + 'Pab', + 'Pa', + 'Voub', + 'Vou', + 'Ga', + 'Dib', + 'Di', + 'Keb', + 'Ke', + 'Zob', + 'Zo', +]; /*byzantine musical notes*/ +const japanese = [ + 'I', + 'Ro', + 'Ha', + 'Ni', + 'Ho', + 'He', + 'To', +]; /*traditional japanese musical notes, seems like they do not use falts or sharps*/ + +const english = ['C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B']; + +export const sol2note = (n, notation = 'letters') => { + const pc = + notation === 'solfeggio' + ? solfeggio /*check if its is any of the following*/ + : notation === 'indian' + ? indian + : notation === 'german' + ? german + : notation === 'byzantine' + ? byzantine + : notation === 'japanese' + ? japanese + : english; /*if not use standard version*/ + const note = pc[n % 12]; /*calculating the midi value to the note*/ + const oct = Math.floor(n / 12) - 1; + return note + oct; +}; + +// Remove duplicates from list +export function uniq(a) { + var seen = {}; + return a.filter(function (item) { + return seen.hasOwn(item) ? false : (seen[item] = true); + }); +} + +// Remove duplicates from list, sorting in the process. Mutates argument! +export function uniqsort(a) { + return a.sort().filter(function (item, pos, ary) { + return !pos || item != ary[pos - 1]; + }); +} + +// rational version +export function uniqsortr(a) { + return a + .sort((x, y) => x.compare(y)) + .filter(function (item, pos, ary) { + return !pos || item.ne(ary[pos - 1]); + }); +} + +// code hashing helpers + +export function unicodeToBase64(text) { + const utf8Bytes = new TextEncoder().encode(text); + const base64String = btoa(String.fromCharCode(...utf8Bytes)); + return base64String; +} + +export function base64ToUnicode(base64String) { + const utf8Bytes = new Uint8Array( + atob(base64String) + .split('') + .map((char) => char.charCodeAt(0)), + ); + const decodedText = new TextDecoder().decode(utf8Bytes); + return decodedText; +} + +export function code2hash(code) { + return encodeURIComponent(unicodeToBase64(code)); + //return '#' + encodeURIComponent(btoa(code)); +} + +export function hash2code(hash) { + return base64ToUnicode(decodeURIComponent(hash)); + //return atob(decodeURIComponent(codeParam || '')); +} + +export function objectMap(obj, fn) { + if (Array.isArray(obj)) { + return obj.map(fn); + } + return Object.fromEntries(Object.entries(obj).map(([k, v], i) => [k, fn(v, k, i)])); +} +export function cycleToSeconds(cycle, cps) { + return cycle / cps; +} + +// utility for averaging two clocks together to account for drift +export class ClockCollator { + constructor({ + getTargetClockTime = getUnixTimeSeconds, + weight = 16, + offsetDelta = 0.005, + checkAfterTime = 2, + resetAfterTime = 8, + }) { + this.offsetTime; + this.timeAtPrevOffsetSample; + this.prevOffsetTimes = []; + this.getTargetClockTime = getTargetClockTime; + this.weight = weight; + this.offsetDelta = offsetDelta; + this.checkAfterTime = checkAfterTime; + this.resetAfterTime = resetAfterTime; + this.reset = () => { + this.prevOffsetTimes = []; + this.offsetTime = null; + this.timeAtPrevOffsetSample = null; + }; + } + calculateOffset(currentTime) { + const targetClockTime = this.getTargetClockTime(); + const diffBetweenTimeSamples = targetClockTime - this.timeAtPrevOffsetSample; + const newOffsetTime = targetClockTime - currentTime; + // recalcuate the diff from scratch if the clock has been paused for some time. + if (diffBetweenTimeSamples > this.resetAfterTime) { + this.reset(); + } + + if (this.offsetTime == null) { + this.offsetTime = newOffsetTime; + } + this.prevOffsetTimes.push(newOffsetTime); + if (this.prevOffsetTimes.length > this.weight) { + this.prevOffsetTimes.shift(); + } + + // after X time has passed, the average of the previous weight offset times is calculated and used as a stable reference + // for calculating the timestamp + if (this.timeAtPrevOffsetSample == null || diffBetweenTimeSamples > this.checkAfterTime) { + this.timeAtPrevOffsetSample = targetClockTime; + const rollingOffsetTime = averageArray(this.prevOffsetTimes); + //when the clock offsets surpass the delta, set the new reference time + if (Math.abs(rollingOffsetTime - this.offsetTime) > this.offsetDelta) { + this.offsetTime = rollingOffsetTime; + } + } + + return this.offsetTime; + } + + calculateTimestamp(currentTime, targetTime) { + return this.calculateOffset(currentTime) + targetTime; + } +} + +export function getPerformanceTimeSeconds() { + return performance.now() * 0.001; +} + +function getUnixTimeSeconds() { + return Date.now() * 0.001; +} + +export const keyAlias = new Map([ + ['control', 'Control'], + ['ctrl', 'Control'], + ['alt', 'Alt'], + ['shift', 'Shift'], + ['down', 'ArrowDown'], + ['up', 'ArrowUp'], + ['left', 'ArrowLeft'], + ['right', 'ArrowRight'], +]); +let keyState; + +export function getCurrentKeyboardState() { + if (keyState == null) { + if (typeof window === 'undefined') { + return; + } + keyState = {}; + // Listen for the keydown event to mark the key as pressed + window.addEventListener('keydown', (event) => { + keyState[event.key] = true; // Mark the key as pressed + }); + + // Listen for the keyup event to mark the key as released + window.addEventListener('keyup', (event) => { + keyState[event.key] = false; // Mark the key as released + }); + } + + return { ...keyState }; // Return a shallow copy of the key state object +} + +// Floating point versions, see Fraction for rational versions +// // greatest common divisor +// export const gcd = function (x, y, ...z) { +// if (!y && z.length > 0) { +// return gcd(x, ...z); +// } +// if (!y) { +// return x; +// } +// return gcd(y, x % y, ...z); +// }; + +// // lowest common multiple +// export const lcm = function (x, y, ...z) { +// if (z.length == 0) { +// return (x * y) / gcd(x, y); +// } +// return lcm((x * y) / gcd(x, y), ...z); +// }; + +// Takes values -- typically derived from events, i.e. `hap`s -- and renders them +// into a readable format +export function stringifyValues(value, compact = false) { + return typeof value === 'object' + ? compact + ? JSON.stringify(value).slice(1, -1).replaceAll('"', '').replaceAll(',', ' ') + : JSON.stringify(value) + : value; +} diff --git a/src/strudel/core/value.mjs b/src/strudel/core/value.mjs new file mode 100644 index 0000000..9496405 --- /dev/null +++ b/src/strudel/core/value.mjs @@ -0,0 +1,64 @@ +/* +value.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { curry } from './util.mjs'; +import { logger } from './logger.mjs'; + +export function unionWithObj(a, b, func) { + if (b?.value !== undefined && Object.keys(b).length === 1) { + // https://codeberg.org/uzu/strudel/issues/1026 + logger(`[warn]: Can't do arithmetic on control pattern.`); + return a; + } + const common = Object.keys(a).filter((k) => Object.keys(b).includes(k)); + return Object.assign({}, a, b, Object.fromEntries(common.map((k) => [k, func(a[k], b[k])]))); +} + +export const mul = curry((a, b) => a * b); + +export const valued = (value) => { + if (value?.constructor?.name === 'Value') { + return value; + } + return Value.of(value); +}; + +export class Value { + constructor(value) { + this.value = value; + } + static of(x) { + return new Value(x); + } + get isNothing() { + return this.value === null || this.value === undefined; + } + map(f) { + if (this.isNothing) { + return this; + } + return Value.of(f(this.value)); + } + mul(n) { + return this.map(mul).ap(n); + } + ap(other) { + return valued(other).map(this.value); + } + unionWith(other, func) { + const type = typeof this.value; + other = valued(other); + if (type !== typeof other.value) { + throw new Error('unionWith: both Values must have same type!'); + } + if (Array.isArray(type) || type !== 'object') { + throw new Error('unionWith: expected objects'); + } + return this.map((v) => unionWithObj(v, other.value, func)); + } +} + +export const map = curry((f, anyFunctor) => anyFunctor.map(f)); diff --git a/src/strudel/core/zyklus.mjs b/src/strudel/core/zyklus.mjs new file mode 100644 index 0000000..a09ace8 --- /dev/null +++ b/src/strudel/core/zyklus.mjs @@ -0,0 +1,54 @@ +// will move to https://github.com/felixroos/zyklus +// TODO: started flag + +function createClock( + getTime, + callback, // called slightly before each cycle + duration = 0.05, // duration of each cycle + interval = 0.1, // interval between callbacks + overlap = 0.1, // overlap between callbacks + setInterval = globalThis.setInterval, + clearInterval = globalThis.clearInterval, + round = true, +) { + let tick = 0; // counts callbacks + let phase = 0; // next callback time + let precision = 10 ** 4; // used to round phase + let minLatency = 0.01; + const setDuration = (setter) => (duration = setter(duration)); + overlap = overlap || interval / 2; + const onTick = () => { + const t = getTime(); + const lookahead = t + interval + overlap; // the time window for this tick + if (phase === 0) { + phase = t + minLatency; + } + // callback as long as we're inside the lookahead + while (phase < lookahead) { + phase = round ? Math.round(phase * precision) / precision : phase; + callback(phase, duration, tick, t); // callback has to skip / handle phase < t! + phase += duration; // increment phase by duration + tick++; + } + }; + let intervalID; + const start = () => { + clear(); // just in case start was called more than once + onTick(); + intervalID = setInterval(onTick, interval * 1000); + }; + const clear = () => { + intervalID !== undefined && clearInterval(intervalID); + intervalID = undefined; + }; + const pause = () => clear(); + const stop = () => { + tick = 0; + phase = 0; + clear(); + }; + const getPhase = () => phase; + // setCallback + return { setDuration, start, stop, pause, duration, interval, getPhase, minLatency }; +} +export default createClock; diff --git a/src/strudel/draw/animate.mjs b/src/strudel/draw/animate.mjs new file mode 100644 index 0000000..d850815 --- /dev/null +++ b/src/strudel/draw/animate.mjs @@ -0,0 +1,69 @@ +import { Pattern, silence, register, pure, createParams } from '@strudel/core'; +import { getDrawContext } from './draw.mjs'; + +let clearColor = '#22222210'; + +Pattern.prototype.animate = function ({ callback, sync = false, smear = 0.5 } = {}) { + window.frame && cancelAnimationFrame(window.frame); + const ctx = getDrawContext(); + let { clientWidth: ww, clientHeight: wh } = ctx.canvas; + ww *= window.devicePixelRatio; + wh *= window.devicePixelRatio; + let smearPart = smear === 0 ? '99' : Number((1 - smear) * 100).toFixed(0); + smearPart = smearPart.length === 1 ? `0${smearPart}` : smearPart; + clearColor = `#200010${smearPart}`; + const render = (t) => { + let frame; + /* if (sync) { + t = scheduler.now(); + frame = this.queryArc(t, t); + } else { */ + t = Math.round(t); + frame = this.slow(1000).queryArc(t, t); + // } + ctx.fillStyle = clearColor; + ctx.fillRect(0, 0, ww, wh); + frame.forEach((f) => { + let { x, y, w, h, s, r, angle = 0, fill = 'darkseagreen' } = f.value; + w *= ww; + h *= wh; + if (r !== undefined && angle !== undefined) { + const radians = angle * 2 * Math.PI; + const [cx, cy] = [(ww - w) / 2, (wh - h) / 2]; + x = cx + Math.cos(radians) * r * cx; + y = cy + Math.sin(radians) * r * cy; + } else { + x *= ww - w; + y *= wh - h; + } + const val = { ...f.value, x, y, w, h }; + ctx.fillStyle = fill; + if (s === 'rect') { + ctx.fillRect(x, y, w, h); + } else if (s === 'ellipse') { + ctx.beginPath(); + ctx.ellipse(x + w / 2, y + h / 2, w / 2, h / 2, 0, 0, 2 * Math.PI); + ctx.fill(); + } + callback && callback(ctx, val, f); + }); + window.frame = requestAnimationFrame(render); + }; + window.frame = requestAnimationFrame(render); + return silence; +}; + +export const { x, y, w, h, angle, r, fill, smear } = createParams('x', 'y', 'w', 'h', 'angle', 'r', 'fill', 'smear'); + +export const rescale = register('rescale', function (f, pat) { + return pat.mul(x(f).w(f).y(f).h(f)); +}); + +export const moveXY = register('moveXY', function (dx, dy, pat) { + return pat.add(x(dx).y(dy)); +}); + +export const zoomIn = register('zoomIn', function (f, pat) { + const d = pure(1).sub(f).div(2); + return pat.rescale(f).move(d, d); +}); diff --git a/src/strudel/draw/color.mjs b/src/strudel/draw/color.mjs new file mode 100644 index 0000000..faab900 --- /dev/null +++ b/src/strudel/draw/color.mjs @@ -0,0 +1,175 @@ +export const colorMap = { + aliceblue: '#f0f8ff', + antiquewhite: '#faebd7', + aqua: '#00ffff', + aquamarine: '#7fffd4', + azure: '#f0ffff', + beige: '#f5f5dc', + bisque: '#ffe4c4', + black: '#000000', + blanchedalmond: '#ffebcd', + blue: '#0000ff', + blueviolet: '#8a2be2', + brown: '#a52a2a', + burlywood: '#deb887', + cadetblue: '#5f9ea0', + chartreuse: '#7fff00', + chocolate: '#d2691e', + coral: '#ff7f50', + cornflowerblue: '#6495ed', + cornsilk: '#fff8dc', + crimson: '#dc143c', + cyan: '#00ffff', + darkblue: '#00008b', + darkcyan: '#008b8b', + darkgoldenrod: '#b8860b', + darkgray: '#a9a9a9', + darkgreen: '#006400', + darkgrey: '#a9a9a9', + darkkhaki: '#bdb76b', + darkmagenta: '#8b008b', + darkolivegreen: '#556b2f', + darkorange: '#ff8c00', + darkorchid: '#9932cc', + darkred: '#8b0000', + darksalmon: '#e9967a', + darkseagreen: '#8fbc8f', + darkslateblue: '#483d8b', + darkslategray: '#2f4f4f', + darkslategrey: '#2f4f4f', + darkturquoise: '#00ced1', + darkviolet: '#9400d3', + deeppink: '#ff1493', + deepskyblue: '#00bfff', + dimgray: '#696969', + dimgrey: '#696969', + dodgerblue: '#1e90ff', + firebrick: '#b22222', + floralwhite: '#fffaf0', + forestgreen: '#228b22', + fuchsia: '#ff00ff', + gainsboro: '#dcdcdc', + ghostwhite: '#f8f8ff', + gold: '#ffd700', + goldenrod: '#daa520', + gray: '#808080', + green: '#008000', + greenyellow: '#adff2f', + grey: '#808080', + honeydew: '#f0fff0', + hotpink: '#ff69b4', + indianred: '#cd5c5c', + indigo: '#4b0082', + ivory: '#fffff0', + khaki: '#f0e68c', + lavender: '#e6e6fa', + lavenderblush: '#fff0f5', + lawngreen: '#7cfc00', + lemonchiffon: '#fffacd', + lightblue: '#add8e6', + lightcoral: '#f08080', + lightcyan: '#e0ffff', + lightgoldenrodyellow: '#fafad2', + lightgray: '#d3d3d3', + lightgreen: '#90ee90', + lightgrey: '#d3d3d3', + lightpink: '#ffb6c1', + lightsalmon: '#ffa07a', + lightseagreen: '#20b2aa', + lightskyblue: '#87cefa', + lightslategray: '#778899', + lightslategrey: '#778899', + lightsteelblue: '#b0c4de', + lightyellow: '#ffffe0', + lime: '#00ff00', + limegreen: '#32cd32', + linen: '#faf0e6', + magenta: '#ff00ff', + maroon: '#800000', + mediumaquamarine: '#66cdaa', + mediumblue: '#0000cd', + mediumorchid: '#ba55d3', + mediumpurple: '#9370db', + mediumseagreen: '#3cb371', + mediumslateblue: '#7b68ee', + mediumspringgreen: '#00fa9a', + mediumturquoise: '#48d1cc', + mediumvioletred: '#c71585', + midnightblue: '#191970', + mintcream: '#f5fffa', + mistyrose: '#ffe4e1', + moccasin: '#ffe4b5', + navajowhite: '#ffdead', + navy: '#000080', + oldlace: '#fdf5e6', + olive: '#808000', + olivedrab: '#6b8e23', + orange: '#ffa500', + orangered: '#ff4500', + orchid: '#da70d6', + palegoldenrod: '#eee8aa', + palegreen: '#98fb98', + paleturquoise: '#afeeee', + palevioletred: '#db7093', + papayawhip: '#ffefd5', + peachpuff: '#ffdab9', + peru: '#cd853f', + pink: '#ffc0cb', + plum: '#dda0dd', + powderblue: '#b0e0e6', + purple: '#800080', + red: '#ff0000', + rosybrown: '#bc8f8f', + royalblue: '#4169e1', + saddlebrown: '#8b4513', + salmon: '#fa8072', + sandybrown: '#f4a460', + seagreen: '#2e8b57', + seashell: '#fff5ee', + sienna: '#a0522d', + silver: '#c0c0c0', + skyblue: '#87ceeb', + slateblue: '#6a5acd', + slategray: '#708090', + slategrey: '#708090', + snow: '#fffafa', + springgreen: '#00ff7f', + steelblue: '#4682b4', + tan: '#d2b48c', + teal: '#008080', + thistle: '#d8bfd8', + tomato: '#ff6347', + turquoise: '#40e0d0', + violet: '#ee82ee', + wheat: '#f5deb3', + white: '#ffffff', + whitesmoke: '#f5f5f5', + yellow: '#ffff00', + yellowgreen: '#9acd32', +}; + +export function convertColorToNumber(color) { + // Convert color to lowercase for easier matching + color = color.toLowerCase(); + + // If the color is a hex code, convert it to a number + if (color[0] === '#') { + return convertHexToNumber(color); + } + + // If the color is a named color, return the corresponding number + if (colorMap[color] !== undefined) { + return convertHexToNumber(colorMap[color]); + } + + // If the color is not recognized, return null + return -1; +} + +export function convertHexToNumber(hex) { + // Remove the leading '#' from the hex code + hex = hex.slice(1); + + // Convert the hex code to a number + return parseInt(hex, 16); +} diff --git a/src/strudel/draw/draw.mjs b/src/strudel/draw/draw.mjs new file mode 100644 index 0000000..a429395 --- /dev/null +++ b/src/strudel/draw/draw.mjs @@ -0,0 +1,219 @@ +/* +draw.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { Pattern, getTime, State, TimeSpan } from '@strudel/core'; + +export const getDrawContext = (id = 'test-canvas', options) => { + let { contextType = '2d', pixelated = false, pixelRatio = window.devicePixelRatio } = options || {}; + let canvas = document.querySelector('#' + id); + if (!canvas) { + canvas = document.createElement('canvas'); + canvas.id = id; + canvas.width = window.innerWidth * pixelRatio; + canvas.height = window.innerHeight * pixelRatio; + canvas.style = 'pointer-events:none;width:100%;height:100%;position:fixed;top:0;left:0'; + pixelated && (canvas.style.imageRendering = 'pixelated'); + document.body.prepend(canvas); + let timeout; + window.addEventListener('resize', () => { + timeout && clearTimeout(timeout); + timeout = setTimeout(() => { + canvas.width = window.innerWidth * pixelRatio; + canvas.height = window.innerHeight * pixelRatio; + }, 200); + }); + } + return canvas.getContext(contextType, { willReadFrequently: true }); +}; + +let animationFrames = {}; +function stopAnimationFrame(id) { + if (animationFrames[id] !== undefined) { + cancelAnimationFrame(animationFrames[id]); + delete animationFrames[id]; + } +} +function stopAllAnimations(replID) { + Object.keys(animationFrames).forEach((id) => (!replID || id.startsWith(replID)) && stopAnimationFrame(id)); +} + +let memory = {}; +Pattern.prototype.draw = function (fn, options) { + if (typeof window === 'undefined') { + return this; + } + let { id = 1, lookbehind = 0, lookahead = 0 } = options; + let __t = Math.max(getTime(), 0); + stopAnimationFrame(id); + lookbehind = Math.abs(lookbehind); + // init memory, clear future haps of old pattern + memory[id] = (memory[id] || []).filter((h) => !h.isInFuture(__t)); + let newFuture = this.queryArc(__t, __t + lookahead).filter((h) => h.hasOnset()); + memory[id] = memory[id].concat(newFuture); + + let last; + const animate = () => { + const _t = getTime(); + const t = _t + lookahead; + // filter out haps that are too far in the past + memory[id] = memory[id].filter((h) => h.isInNearPast(lookbehind, _t)); + // begin where we left off in last frame, but max -0.1s (inactive tab throttles to 1fps) + let begin = Math.max(last || t, t - 1 / 10); + const haps = this.queryArc(begin, t).filter((h) => h.hasOnset()); + memory[id] = memory[id].concat(haps); + last = t; // makes sure no haps are missed + fn(memory[id], _t, t, this); + animationFrames[id] = requestAnimationFrame(animate); + }; + animationFrames[id] = requestAnimationFrame(animate); + return this; +}; + +export const cleanupDraw = (clearScreen = true, id) => { + const ctx = getDrawContext(); + clearScreen && ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + stopAllAnimations(id); +}; + +Pattern.prototype.onPaint = function (painter) { + return this.withState((state) => { + if (!state.controls.painters) { + state.controls.painters = []; + } + state.controls.painters.push(painter); + }); +}; + +Pattern.prototype.getPainters = function () { + let painters = []; + this.queryArc(0, 0, { painters }); + return painters; +}; + +// const round = (x) => Math.round(x * 1000) / 1000; + +// encapsulates starting and stopping animation frames +export class Framer { + constructor(onFrame, onError) { + this.onFrame = onFrame; + this.onError = onError; + } + start() { + const self = this; + let frame = requestAnimationFrame(function updateHighlights(time) { + try { + self.onFrame(time); + } catch (err) { + self.onError(err); + } + frame = requestAnimationFrame(updateHighlights); + }); + self.cancel = () => { + cancelAnimationFrame(frame); + }; + } + stop() { + if (this.cancel) { + this.cancel(); + } + } +} + +// syncs animation frames to a cyclist scheduler +// see vite-vanilla-repl-cm6 for an example +export class Drawer { + constructor(onDraw, drawTime) { + this.visibleHaps = []; + this.lastFrame = null; + this.drawTime = drawTime; + this.painters = []; + this.framer = new Framer( + () => { + if (!this.scheduler) { + console.warn('Drawer: no scheduler'); + return; + } + const lookbehind = Math.abs(this.drawTime[0]); + const lookahead = this.drawTime[1]; + // calculate current frame time (think right side of screen for pianoroll) + const phase = this.scheduler.now() + lookahead; + // first frame just captures the phase + if (this.lastFrame === null) { + this.lastFrame = phase; + return; + } + // query haps from last frame till now. take last 100ms max + const haps = this.scheduler.pattern.queryArc(Math.max(this.lastFrame, phase - 1 / 10), phase); + this.lastFrame = phase; + this.visibleHaps = (this.visibleHaps || []) + // filter out haps that are too far in the past (think left edge of screen for pianoroll) + .filter((h) => h.whole && h.endClipped >= phase - lookbehind - lookahead) + // add new haps with onset (think right edge bars scrolling in) + .concat(haps.filter((h) => h.hasOnset())); + const time = phase - lookahead; + onDraw(this.visibleHaps, time, this, this.painters); + }, + (err) => { + console.warn('draw error', err); + }, + ); + } + setDrawTime(drawTime) { + this.drawTime = drawTime; + } + invalidate(scheduler = this.scheduler, t) { + if (!scheduler) { + return; + } + // TODO: scheduler.now() seems to move even when it's stopped, this hints at a bug... + t = t ?? scheduler.now(); + this.scheduler = scheduler; + let [_, lookahead] = this.drawTime; + // +0.1 = workaround for weird holes in query.. + const [begin, end] = [Math.max(t, 0), t + lookahead + 0.1]; + // remove all future haps + this.visibleHaps = this.visibleHaps.filter((h) => h.whole?.begin < t); + this.painters = []; // will get populated by .onPaint calls attached to the pattern + // query future haps + const futureHaps = scheduler.pattern.queryArc(begin, end, { painters: this.painters }); + // append future haps + this.visibleHaps = this.visibleHaps.concat(futureHaps); + } + start(scheduler) { + this.scheduler = scheduler; + this.invalidate(); + this.framer.start(); + } + stop() { + if (this.framer) { + this.framer.stop(); + } + } +} + +export function getComputedPropertyValue(name) { + if (typeof window === 'undefined') { + return '#fff'; + } + return getComputedStyle(document.documentElement).getPropertyValue(name); +} + +let theme = { + background: '#222', + foreground: '#75baff', + caret: '#ffcc00', + selection: 'rgba(128, 203, 196, 0.5)', + selectionMatch: '#036dd626', + lineHighlight: '#00000050', + gutterBackground: 'transparent', + gutterForeground: '#8a919966', +}; +export function getTheme() { + return theme; +} +export function setTheme(_theme) { + theme = _theme; +} diff --git a/src/strudel/draw/index.mjs b/src/strudel/draw/index.mjs new file mode 100644 index 0000000..506c615 --- /dev/null +++ b/src/strudel/draw/index.mjs @@ -0,0 +1,6 @@ +export * from './animate.mjs'; +export * from './color.mjs'; +export * from './draw.mjs'; +export * from './pianoroll.mjs'; +export * from './spiral.mjs'; +export * from './pitchwheel.mjs'; diff --git a/src/strudel/draw/pianoroll.mjs b/src/strudel/draw/pianoroll.mjs new file mode 100644 index 0000000..1cf218f --- /dev/null +++ b/src/strudel/draw/pianoroll.mjs @@ -0,0 +1,316 @@ +/* +pianoroll.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { Pattern, noteToMidi, freqToMidi, isPattern } from '@strudel/core'; +import { getTheme, getDrawContext } from './draw.mjs'; + +const scale = (normalized, min, max) => normalized * (max - min) + min; +const getValue = (e) => { + let { value } = e; + if (typeof e.value !== 'object') { + value = { value }; + } + let { note, n, freq, s } = value; + if (freq) { + return freqToMidi(freq); + } + note = note ?? n; + if (typeof note === 'string') { + try { + // TODO: n(run(32)).scale("D:minor") fails when trying to query negative time.. + return noteToMidi(note); + } catch (err) { + // console.warn(`error converting note to midi: ${err}`); // this spams to crazy + return 0; + } + } + if (typeof note === 'number') { + return note; + } + if (s) { + return '_' + s; + } + return value; +}; + +/** + * Visualises a pattern as a scrolling 'pianoroll', displayed in the background of the editor. To show a pianoroll for all running patterns, use `all(pianoroll)`. To have a pianoroll appear below + * a pattern instead, prefix with `_`, e.g.: `sound("bd sd")._pianoroll()`. + * + * @name pianoroll + * @synonyms punchcard + * @param {Object} options Object containing all the optional following parameters as key value pairs: + * @param {integer} cycles number of cycles to be displayed at the same time - defaults to 4 + * @param {number} playhead location of the active notes on the time axis - 0 to 1, defaults to 0.5 + * @param {boolean} vertical displays the roll vertically - 0 by default + * @param {boolean} labels displays labels on individual notes (see the label function) - 0 by default + * @param {boolean} flipTime reverse the direction of the roll - 0 by default + * @param {boolean} flipValues reverse the relative location of notes on the value axis - 0 by default + * @param {number} overscan lookup X cycles outside of the cycles window to display notes in advance - 1 by default + * @param {boolean} hideNegative hide notes with negative time (before starting playing the pattern) - 0 by default + * @param {boolean} smear notes leave a solid trace - 0 by default + * @param {boolean} fold notes takes the full value axis width - 0 by default + * @param {string} active hexadecimal or CSS color of the active notes - defaults to #FFCA28 + * @param {string} inactive hexadecimal or CSS color of the inactive notes - defaults to #7491D2 + * @param {string} background hexadecimal or CSS color of the background - defaults to transparent + * @param {string} playheadColor hexadecimal or CSS color of the line representing the play head - defaults to white + * @param {boolean} fill notes are filled with color (otherwise only the label is displayed) - 0 by default + * @param {boolean} fillActive active notes are filled with color - 0 by default + * @param {boolean} stroke notes are shown with colored borders - 0 by default + * @param {boolean} strokeActive active notes are shown with colored borders - 0 by default + * @param {boolean} hideInactive only active notes are shown - 0 by default + * @param {boolean} colorizeInactive use note color for inactive notes - 1 by default + * @param {string} fontFamily define the font used by notes labels - defaults to 'monospace' + * @param {integer} minMidi minimum note value to display on the value axis - defaults to 10 + * @param {integer} maxMidi maximum note value to display on the value axis - defaults to 90 + * @param {boolean} autorange automatically calculate the minMidi and maxMidi parameters - 0 by default + * @see _pianoroll + * @example + * note("c2 a2 eb2") + * .euclid(5,8) + * .s('sawtooth') + * .lpenv(4).lpf(300) + * .pianoroll({ labels: 1 }) + */ + +Pattern.prototype.pianoroll = function (options = {}) { + let { cycles = 4, playhead = 0.5, overscan = 0, hideNegative = false, ctx = getDrawContext(), id = 1 } = options; + + let from = -cycles * playhead; + let to = cycles * (1 - playhead); + const inFrame = (hap, t) => (!hideNegative || hap.whole.begin >= 0) && hap.isWithinTime(t + from, t + to); + this.draw( + (haps, time) => { + __pianoroll({ + ...options, + time, + ctx, + haps: haps.filter((hap) => inFrame(hap, time)), + }); + }, + { + lookbehind: from - overscan, + lookahead: to + overscan, + id, + }, + ); + return this; +}; + +export function pianoroll(arg) { + if (isPattern(arg)) { + // Single argument as a pattern + // (to support `all(pianoroll)`) + return arg.pianoroll(); + } + // Single argument with option - return function to get the pattern + // (to support `all(pianoroll(options))`) + return (pat) => pat.pianoroll(arg); +} + +export function __pianoroll({ + time, + haps, + cycles = 4, + playhead = 0.5, + flipTime = 0, + flipValues = 0, + hideNegative = false, + inactive = getTheme().foreground, + active = getTheme().foreground, + background = 'transparent', + smear = 0, + playheadColor = getTheme().foreground, + minMidi = 10, + maxMidi = 90, + autorange = 0, + timeframe: timeframeProp, + fold = 1, + vertical = 0, + labels = false, + fill = 1, + fillActive = false, + strokeActive = true, + stroke, + hideInactive = 0, + colorizeInactive = 1, + fontFamily, + ctx, + id, +} = {}) { + const w = ctx.canvas.width; + const h = ctx.canvas.height; + let from = -cycles * playhead; + let to = cycles * (1 - playhead); + + if (id) { + haps = haps.filter((hap) => hap.hasTag(id)); + } + + if (timeframeProp) { + console.warn('timeframe is deprecated! use from/to instead'); + from = 0; + to = timeframeProp; + } + const timeAxis = vertical ? h : w; + const valueAxis = vertical ? w : h; + let timeRange = vertical ? [timeAxis, 0] : [0, timeAxis]; // pixel range for time + const timeExtent = to - from; // number of seconds that fit inside the canvas frame + const valueRange = vertical ? [0, valueAxis] : [valueAxis, 0]; // pixel range for values + let valueExtent = maxMidi - minMidi + 1; // number of "slots" for values, overwritten if autorange true + let barThickness = valueAxis / valueExtent; // pixels per value, overwritten if autorange true + let foldValues = []; + flipTime && timeRange.reverse(); + flipValues && valueRange.reverse(); + + // onQuery + const { min, max, values } = haps.reduce( + ({ min, max, values }, e) => { + const v = getValue(e); + return { + min: v < min ? v : min, + max: v > max ? v : max, + values: values.includes(v) ? values : [...values, v], + }; + }, + { min: Infinity, max: -Infinity, values: [] }, + ); + if (autorange) { + minMidi = min; + maxMidi = max; + valueExtent = maxMidi - minMidi + 1; + } + foldValues = values.sort((a, b) => + typeof a === 'number' && typeof b === 'number' + ? a - b + : typeof a === 'number' + ? 1 + : String(a).localeCompare(String(b)), + ); + barThickness = fold ? valueAxis / foldValues.length : valueAxis / valueExtent; + ctx.fillStyle = background; + ctx.globalAlpha = 1; // reset! + if (!smear) { + ctx.clearRect(0, 0, w, h); + ctx.fillRect(0, 0, w, h); + } + haps.forEach((event) => { + const isActive = event.whole.begin <= time && event.endClipped > time; + let strokeCurrent = stroke ?? (strokeActive && isActive); + let fillCurrent = (!isActive && fill) || (isActive && fillActive); + if (hideInactive && !isActive) { + return; + } + let color = event.value?.color; + active = color || active; + inactive = colorizeInactive ? color || inactive : inactive; + color = isActive ? active : inactive; + ctx.fillStyle = fillCurrent ? color : 'transparent'; + ctx.strokeStyle = color; + const { velocity = 1, gain = 1 } = event.value || {}; + ctx.globalAlpha = velocity * gain; + const timeProgress = (event.whole.begin - (flipTime ? to : from)) / timeExtent; + const timePx = scale(timeProgress, ...timeRange); + let durationPx = scale(event.duration / timeExtent, 0, timeAxis); + const value = getValue(event); + const valueProgress = fold + ? foldValues.indexOf(value) / foldValues.length + : (Number(value) - minMidi) / valueExtent; + const valuePx = scale(valueProgress, ...valueRange); + let margin = 0; + const offset = scale(time / timeExtent, ...timeRange); + let coords; + if (vertical) { + coords = [ + valuePx + 1 - (flipValues ? barThickness : 0), // x + timeAxis - offset + timePx + margin + 1 - (flipTime ? 0 : durationPx), // y + barThickness - 2, // width + durationPx - 2, // height + ]; + } else { + coords = [ + timePx - offset + margin + 1 - (flipTime ? durationPx : 0), // x + valuePx + 1 - (flipValues ? 0 : barThickness), // y + durationPx - 2, // widith + barThickness - 2, // height + ]; + } + /* const xFactor = Math.sin(performance.now() / 500) + 1; + coords[0] *= xFactor; */ + + if (strokeCurrent) { + ctx.strokeRect(...coords); + } + if (fillCurrent) { + ctx.fillRect(...coords); + } + //ctx.ellipse(...ellipseFromRect(...coords)) + if (labels) { + const defaultLabel = event.value.note ?? event.value.s + (event.value.n ? `:${event.value.n}` : ''); + const { label: inactiveLabel, activeLabel } = event.value; + const customLabel = isActive ? activeLabel || inactiveLabel : inactiveLabel; + const label = customLabel ?? defaultLabel; + let measure = vertical ? durationPx : barThickness * 0.75; + ctx.font = `${measure}px ${fontFamily || 'monospace'}`; + // font color + ctx.fillStyle = /* isActive && */ !fillCurrent ? color : 'black'; + ctx.textBaseline = 'top'; + ctx.fillText(label, ...coords); + } + }); + ctx.globalAlpha = 1; // reset! + const playheadPosition = scale(-from / timeExtent, ...timeRange); + // draw playhead + ctx.strokeStyle = playheadColor; + ctx.beginPath(); + if (vertical) { + ctx.moveTo(0, playheadPosition); + ctx.lineTo(valueAxis, playheadPosition); + } else { + ctx.moveTo(playheadPosition, 0); + ctx.lineTo(playheadPosition, valueAxis); + } + ctx.stroke(); + return this; +} + +export function getDrawOptions(drawTime, options = {}) { + let [lookbehind, lookahead] = drawTime; + lookbehind = Math.abs(lookbehind); + const cycles = lookahead + lookbehind; + const playhead = cycles !== 0 ? lookbehind / cycles : 0; + return { fold: 1, ...options, cycles, playhead }; +} + +export const getPunchcardPainter = + (options = {}) => + (ctx, time, haps, drawTime) => + __pianoroll({ ctx, time, haps, ...getDrawOptions(drawTime, options) }); + +Pattern.prototype.punchcard = function (options) { + return this.onPaint(getPunchcardPainter(options)); +}; + +/** + * Displays a vertical pianoroll with event labels. + * Supports all the same options as pianoroll. + * + * @name wordfall + */ +Pattern.prototype.wordfall = function (options) { + return this.punchcard({ vertical: 1, labels: 1, stroke: 0, fillActive: 1, active: 'white', ...options }); +}; + +/* Pattern.prototype.pianoroll = function (options) { + return this.onPaint((ctx, time, haps, drawTime) => + pianoroll({ ctx, time, haps, ...getDrawOptions(drawTime, { fold: 0, ...options }) }), + ); +}; */ + +export function drawPianoroll(options) { + const { drawTime, ...rest } = options; + __pianoroll({ ...getDrawOptions(drawTime), ...rest }); +} diff --git a/src/strudel/draw/pitchwheel.mjs b/src/strudel/draw/pitchwheel.mjs new file mode 100644 index 0000000..ba76df0 --- /dev/null +++ b/src/strudel/draw/pitchwheel.mjs @@ -0,0 +1,144 @@ +import { Pattern, midiToFreq, getFrequency } from '@strudel/core'; +import { getTheme, getDrawContext } from './draw.mjs'; + +const c = midiToFreq(36); + +const circlePos = (cx, cy, radius, angle) => { + angle = angle * Math.PI * 2; + const x = Math.sin(angle) * radius + cx; + const y = Math.cos(angle) * radius + cy; + return [x, y]; +}; + +const freq2angle = (freq, root) => { + return 0.5 - (Math.log2(freq / root) % 1); +}; + +export function pitchwheel({ + haps, + ctx, + id, + hapcircles = 1, + circle = 0, + edo = 12, + root = c, + thickness = 3, + hapRadius = 6, + mode = 'flake', + margin = 10, +} = {}) { + const connectdots = mode === 'polygon'; + const centerlines = mode === 'flake'; + const w = ctx.canvas.width; + const h = ctx.canvas.height; + ctx.clearRect(0, 0, w, h); + const color = getTheme().foreground; + + const size = Math.min(w, h); + const radius = size / 2 - thickness / 2 - hapRadius - margin; + const centerX = w / 2; + const centerY = h / 2; + + if (id) { + haps = haps.filter((hap) => hap.hasTag(id)); + } + ctx.strokeStyle = color; + ctx.fillStyle = color; + ctx.globalAlpha = 1; + ctx.lineWidth = thickness; + + if (circle) { + ctx.beginPath(); + ctx.arc(centerX, centerY, radius, 0, 2 * Math.PI); + ctx.stroke(); + } + + if (edo) { + Array.from({ length: edo }, (_, i) => { + const angle = freq2angle(root * Math.pow(2, i / edo), root); + const [x, y] = circlePos(centerX, centerY, radius, angle); + ctx.beginPath(); + ctx.arc(x, y, hapRadius, 0, 2 * Math.PI); + ctx.fill(); + }); + ctx.stroke(); + } + + let shape = []; + ctx.lineWidth = hapRadius; + haps.forEach((hap) => { + let freq; + try { + freq = getFrequency(hap); + } catch (err) { + return; + } + const angle = freq2angle(freq, root); + const [x, y] = circlePos(centerX, centerY, radius, angle); + const hapColor = hap.value.color || color; + ctx.strokeStyle = hapColor; + ctx.fillStyle = hapColor; + const { velocity = 1, gain = 1 } = hap.value || {}; + const alpha = velocity * gain; + ctx.globalAlpha = alpha; + shape.push([x, y, angle, hapColor, alpha]); + ctx.beginPath(); + if (hapcircles) { + ctx.moveTo(x + hapRadius, y); + ctx.arc(x, y, hapRadius, 0, 2 * Math.PI); + ctx.fill(); + } + if (centerlines) { + ctx.moveTo(centerX, centerY); + ctx.lineTo(x, y); + } + ctx.stroke(); + }); + + ctx.strokeStyle = color; + ctx.globalAlpha = 1; + if (connectdots && shape.length) { + shape = shape.sort((a, b) => a[2] - b[2]); + ctx.beginPath(); + ctx.moveTo(shape[0][0], shape[0][1]); + shape.forEach(([x, y, _, color, alpha]) => { + ctx.strokeStyle = color; + ctx.globalAlpha = alpha; + ctx.lineTo(x, y); + }); + ctx.lineTo(shape[0][0], shape[0][1]); + ctx.stroke(); + } + + return; +} + +/** + * Renders a pitch circle to visualize frequencies within one octave + * @name pitchwheel + * @param {number} hapcircles + * @param {number} circle + * @param {number} edo + * @param {string} root + * @param {number} thickness + * @param {number} hapRadius + * @param {string} mode + * @param {number} margin + * @example + * n("0 .. 12").scale("C:chromatic") + * .s("sawtooth") + * .lpf(500) + * ._pitchwheel() + */ +Pattern.prototype.pitchwheel = function (options = {}) { + let { ctx = getDrawContext(), id = 1 } = options; + return this.tag(id).onPaint((_, time, haps) => + pitchwheel({ + ...options, + time, + ctx, + haps: haps.filter((hap) => hap.isActive(time)), + id, + }), + ); +}; diff --git a/src/strudel/draw/spiral.mjs b/src/strudel/draw/spiral.mjs new file mode 100644 index 0000000..cebf3d3 --- /dev/null +++ b/src/strudel/draw/spiral.mjs @@ -0,0 +1,157 @@ +import { Pattern } from '@strudel/core'; +import { getTheme } from './draw.mjs'; + +// polar coords -> xy +function fromPolar(angle, radius, cx, cy) { + const radians = ((angle - 90) * Math.PI) / 180; + return [cx + Math.cos(radians) * radius, cy + Math.sin(radians) * radius]; +} + +const xyOnSpiral = (angle, margin, cx, cy, rotate = 0) => fromPolar((angle + rotate) * 360, margin * angle, cx, cy); // TODO: logSpiral + +// draw spiral / segment of spiral +function spiralSegment(options) { + let { + ctx, + from = 0, + to = 3, + margin = 50, + cx = 100, + cy = 100, + rotate = 0, + thickness = margin / 2, + color = getTheme().foreground, + cap = 'round', + stretch = 1, + fromOpacity = 1, + toOpacity = 1, + } = options; + from *= stretch; + to *= stretch; + rotate *= stretch; + ctx.lineWidth = thickness; + ctx.lineCap = cap; + ctx.strokeStyle = color; + ctx.globalAlpha = fromOpacity; + + ctx.beginPath(); + let [sx, sy] = xyOnSpiral(from, margin, cx, cy, rotate); + ctx.moveTo(sx, sy); + + const increment = 1 / 60; + let angle = from; + while (angle <= to) { + const [x, y] = xyOnSpiral(angle, margin, cx, cy, rotate); + //ctx.lineWidth = angle*thickness; + ctx.globalAlpha = ((angle - from) / (to - from)) * toOpacity; + ctx.lineTo(x, y); + angle += increment; + } + ctx.stroke(); +} + +function drawSpiral(options) { + let { + stretch = 1, + size = 80, + thickness = size / 2, + cap = 'butt', // round butt squar, + inset = 3, // start angl, + playheadColor = '#ffffff', + playheadLength = 0.02, + playheadThickness = thickness, + padding = 0, + steady = 1, + activeColor = getTheme().foreground, + inactiveColor = getTheme().gutterForeground, + colorizeInactive = 0, + fade = true, + // logSpiral = true, + ctx, + time, + haps, + drawTime, + id, + } = options; + + if (id) { + haps = haps.filter((hap) => hap.hasTag(id)); + } + + const [w, h] = [ctx.canvas.width, ctx.canvas.height]; + ctx.clearRect(0, 0, w * 2, h * 2); + const [cx, cy] = [w / 2, h / 2]; + const settings = { + margin: size / stretch, + cx, + cy, + stretch, + cap, + thickness, + }; + + const playhead = { + ...settings, + thickness: playheadThickness, + from: inset - playheadLength, + to: inset, + color: playheadColor, + }; + + const [min] = drawTime; + const rotate = steady * time; + haps.forEach((hap) => { + const isActive = hap.whole.begin <= time && hap.endClipped > time; + const from = hap.whole.begin - time + inset; + const to = hap.endClipped - time + inset - padding; + const hapColor = hap.value?.color || activeColor; + const color = colorizeInactive || isActive ? hapColor : inactiveColor; + const opacity = fade ? 1 - Math.abs((hap.whole.begin - time) / min) : 1; + spiralSegment({ + ctx, + ...settings, + from, + to, + rotate, + color, + fromOpacity: opacity, + toOpacity: opacity, + }); + }); + spiralSegment({ + ctx, + ...playhead, + rotate, + }); +} + +/** + * Displays a spiral visual. + * + * @name spiral + * @param {Object} options Object containing all the optional following parameters as key value pairs: + * @param {number} stretch controls the rotations per cycle ratio, where 1 = 1 cycle / 360 degrees + * @param {number} size the diameter of the spiral + * @param {number} thickness line thickness + * @param {string} cap style of line ends: butt (default), round, square + * @param {string} inset number of rotations before spiral starts (default 3) + * @param {string} playheadColor color of playhead, defaults to white + * @param {number} playheadLength length of playhead in rotations, defaults to 0.02 + * @param {number} playheadThickness thickness of playheadrotations, defaults to thickness + * @param {number} padding space around spiral + * @param {number} steady steadyness of spiral vs playhead. 1 = spiral doesn't move, playhead does. + * @param {number} activeColor color of active segment. defaults to foreground of theme + * @param {number} inactiveColor color of inactive segments. defaults to gutterForeground of theme + * @param {boolean} colorizeInactive wether or not to colorize inactive segments, defaults to 0 + * @param {boolean} fade wether or not past and future should fade out. defaults to 1 + * @param {boolean} logSpiral wether or not the spiral should be logarithmic. defaults to 0 + * @example + * note("c2 a2 eb2") + * .euclid(5,8) + * .s('sawtooth') + * .lpenv(4).lpf(300) + * ._spiral({ steady: .96 }) + */ +Pattern.prototype.spiral = function (options = {}) { + return this.onPaint((ctx, time, haps, drawTime) => drawSpiral({ ctx, time, haps, drawTime, ...options })); +}; diff --git a/src/strudel/midi/index.mjs b/src/strudel/midi/index.mjs new file mode 100644 index 0000000..399227f --- /dev/null +++ b/src/strudel/midi/index.mjs @@ -0,0 +1,3 @@ +import './midi.mjs'; + +export * from './midi.mjs'; diff --git a/src/strudel/midi/midi.mjs b/src/strudel/midi/midi.mjs new file mode 100644 index 0000000..ae983d2 --- /dev/null +++ b/src/strudel/midi/midi.mjs @@ -0,0 +1,511 @@ +/* +midi.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import * as _WebMidi from 'webmidi'; +import { Pattern, getEventOffsetMs, isPattern, logger, ref } from '@strudel/core'; +import { noteToMidi, getControlName } from '@strudel/core'; +import { Note } from 'webmidi'; + +// if you use WebMidi from outside of this package, make sure to import that instance: +export const { WebMidi } = _WebMidi; + +function supportsMidi() { + return typeof navigator.requestMIDIAccess === 'function'; +} + +function getMidiDeviceNamesString(devices) { + return devices.map((o) => `'${o.name}'`).join(' | '); +} + +export function enableWebMidi(options = {}) { + const { onReady, onConnected, onDisconnected, onEnabled } = options; + if (WebMidi.enabled) { + return; + } + if (!supportsMidi()) { + throw new Error('Your Browser does not support WebMIDI.'); + } + WebMidi.addListener('connected', () => { + onConnected?.(WebMidi); + }); + WebMidi.addListener('enabled', () => { + onEnabled?.(WebMidi); + }); + // Reacting when a device becomes unavailable + WebMidi.addListener('disconnected', (e) => { + onDisconnected?.(WebMidi, e); + }); + return new Promise((resolve, reject) => { + if (WebMidi.enabled) { + // if already enabled, just resolve WebMidi + resolve(WebMidi); + return; + } + WebMidi.enable( + (err) => { + if (err) { + reject(err); + } + onReady?.(WebMidi); + resolve(WebMidi); + }, + { sysex: true }, + ); + }); +} + +function getDevice(indexOrName, devices) { + if (!devices.length) { + throw new Error(`🔌 No MIDI devices found. Connect a device or enable IAC Driver.`); + } + if (typeof indexOrName === 'number') { + return devices[indexOrName]; + } + const byName = (name) => devices.find((output) => output.name.includes(name)); + if (typeof indexOrName === 'string') { + return byName(indexOrName); + } + // attempt to default to first IAC device if none is specified + const IACOutput = byName('IAC'); + const device = IACOutput ?? devices[0]; + if (!device) { + throw new Error( + `🔌 MIDI device '${device ? device : ''}' not found. Use one of ${getMidiDeviceNamesString(devices)}`, + ); + } + + return IACOutput ?? devices[0]; +} + +// send start/stop messages to outputs when repl starts/stops +if (typeof window !== 'undefined') { + window.addEventListener('message', (e) => { + if (!WebMidi?.enabled) { + return; + } + if (e.data === 'strudel-stop') { + WebMidi.outputs.forEach((output) => output.sendStop()); + } + // cannot start here, since we have no timing info, see sendStart below + }); +} + +// registry for midi mappings, converting control names to cc messages +export const midicontrolMap = new Map(); + +// takes midimap and converts each control key to the main control name +function unifyMapping(mapping) { + return Object.fromEntries( + Object.entries(mapping).map(([key, mapping]) => { + if (typeof mapping === 'number') { + mapping = { ccn: mapping }; + } + return [getControlName(key), mapping]; + }), + ); +} + +function githubPath(base, subpath = '') { + if (!base.startsWith('github:')) { + throw new Error('expected "github:" at the start of pseudoUrl'); + } + let [_, path] = base.split('github:'); + path = path.endsWith('/') ? path.slice(0, -1) : path; + if (path.split('/').length === 2) { + // assume main as default branch if none set + path += '/main'; + } + return `https://raw.githubusercontent.com/${path}/${subpath}`; +} + +/** + * configures the default midimap, which is used when no "midimap" port is set + * @example + * defaultmidimap({ lpf: 74 }) + * $: note("c a f e").midi(); + * $: lpf(sine.slow(4).segment(16)).midi(); + */ +export function defaultmidimap(mapping) { + midicontrolMap.set('default', unifyMapping(mapping)); +} + +let loadCache = {}; + +/** + * Adds midimaps to the registry. Inside each midimap, control names (e.g. lpf) are mapped to cc numbers. + * @example + * midimaps({ mymap: { lpf: 74 } }) + * $: note("c a f e") + * .lpf(sine.slow(4)) + * .midimap('mymap') + * .midi() + * @example + * midimaps({ mymap: { + * lpf: { ccn: 74, min: 0, max: 20000, exp: 0.5 } + * }}) + * $: note("c a f e") + * .lpf(sine.slow(2).range(400,2000)) + * .midimap('mymap') + * .midi() + */ +export async function midimaps(map) { + if (typeof map === 'string') { + if (map.startsWith('github:')) { + map = githubPath(map, 'midimap.json'); + } + if (!loadCache[map]) { + loadCache[map] = fetch(map).then((res) => res.json()); + } + map = await loadCache[map]; + } + if (typeof map === 'object') { + Object.entries(map).forEach(([name, mapping]) => midicontrolMap.set(name, unifyMapping(mapping))); + } +} + +// registry for midi sounds, converting sound names to controls +export const midisoundMap = new Map(); + +// normalizes the given value from the given range and exponent +function normalize(value = 0, min = 0, max = 1, exp = 1) { + if (min === max) { + throw new Error('min and max cannot be the same value'); + } + let normalized = (value - min) / (max - min); + normalized = Math.min(1, Math.max(0, normalized)); + return Math.pow(normalized, exp); +} + +function mapCC(mapping, value) { + return Object.keys(value) + .filter((key) => !!mapping[getControlName(key)]) + .map((key) => { + const { ccn, min = 0, max = 1, exp = 1 } = mapping[key]; + const ccv = normalize(value[key], min, max, exp); + return { ccn, ccv }; + }); +} + +// sends a cc message to the given device on the given channel +function sendCC(ccn, ccv, device, midichan, timeOffsetString) { + if (typeof ccv !== 'number' || ccv < 0 || ccv > 1) { + throw new Error('expected ccv to be a number between 0 and 1'); + } + if (!['string', 'number'].includes(typeof ccn)) { + throw new Error('expected ccn to be a number or a string'); + } + const scaled = Math.round(ccv * 127); + device.sendControlChange(ccn, scaled, midichan, { time: timeOffsetString }); +} + +// sends a program change message to the given device on the given channel +function sendProgramChange(progNum, device, midichan, timeOffsetString) { + if (typeof progNum !== 'number' || progNum < 0 || progNum > 127) { + throw new Error('expected progNum (program change) to be a number between 0 and 127'); + } + device.sendProgramChange(progNum, midichan, { time: timeOffsetString }); +} + +// sends a sysex message to the given device on the given channel +function sendSysex(sysexid, sysexdata, device, timeOffsetString) { + if (Array.isArray(sysexid)) { + if (!sysexid.every((byte) => Number.isInteger(byte) && byte >= 0 && byte <= 255)) { + throw new Error('all sysexid bytes must be integers between 0 and 255'); + } + } else if (!Number.isInteger(sysexid) || sysexid < 0 || sysexid > 255) { + throw new Error('A:sysexid must be an number between 0 and 255 or an array of such integers'); + } + + if (!Array.isArray(sysexdata)) { + throw new Error('expected sysex to be an array of numbers (0-255)'); + } + if (!sysexdata.every((byte) => Number.isInteger(byte) && byte >= 0 && byte <= 255)) { + throw new Error('all sysex bytes must be integers between 0 and 255'); + } + device.sendSysex(sysexid, sysexdata, { time: timeOffsetString }); +} + +// sends a NRPN message to the given device on the given channel +function sendNRPN(nrpnn, nrpv, device, midichan, timeOffsetString) { + if (Array.isArray(nrpnn)) { + if (!nrpnn.every((byte) => Number.isInteger(byte) && byte >= 0 && byte <= 255)) { + throw new Error('all nrpnn bytes must be integers between 0 and 255'); + } + } else if (!Number.isInteger(nrpv) || nrpv < 0 || nrpv > 255) { + throw new Error('A:sysexid must be an number between 0 and 255 or an array of such integers'); + } + + device.sendNRPN(nrpnn, nrpv, midichan, { time: timeOffsetString }); +} + +// sends a pitch bend message to the given device on the given channel +function sendPitchBend(midibend, device, midichan, timeOffsetString) { + if (typeof midibend !== 'number' || midibend < -1 || midibend > 1) { + throw new Error('expected midibend to be a number between -1 and 1'); + } + device.sendPitchBend(midibend, midichan, { time: timeOffsetString }); +} + +// sends a channel aftertouch message to the given device on the given channel +function sendAftertouch(miditouch, device, midichan, timeOffsetString) { + if (typeof miditouch !== 'number' || miditouch < 0 || miditouch > 1) { + throw new Error('expected miditouch to be a number between 0 and 1'); + } + device.sendChannelAftertouch(miditouch, midichan, { time: timeOffsetString }); +} + +// sends a note message to the given device on the given channel +function sendNote(note, velocity, duration, device, midichan, timeOffsetString) { + if (note == null || note === '') { + throw new Error('note cannot be null or empty'); + } + if (velocity != null && (typeof velocity !== 'number' || velocity < 0 || velocity > 1)) { + throw new Error('velocity must be a number between 0 and 1'); + } + if (duration != null && (typeof duration !== 'number' || duration < 0)) { + throw new Error('duration must be a positive number'); + } + + const midiNumber = typeof note === 'number' ? note : noteToMidi(note); + const midiNote = new Note(midiNumber, { attack: velocity, duration }); + device.playNote(midiNote, midichan, { + time: timeOffsetString, + }); +} + +/** + * MIDI output: Opens a MIDI output port. + * @param {string | number} midiport MIDI device name or index defaulting to 0 + * @param {object} options Additional MIDI configuration options + * @example + * note("c4").midichan(1).midi('IAC Driver Bus 1') + * @example + * note("c4").midichan(1).midi('IAC Driver Bus 1', { controller: true, latency: 50 }) + */ + +Pattern.prototype.midi = function (midiport, options = {}) { + if (isPattern(midiport)) { + throw new Error( + `.midi does not accept Pattern input for midiport. Make sure to pass device name with single quotes. Example: .midi('${ + WebMidi.outputs?.[0]?.name || 'IAC Driver Bus 1' + }')`, + ); + } + + // For backward compatibility + if (typeof midiport === 'object') { + const { port, isController = false, ...configOptions } = midiport; + options = { + isController, + ...configOptions, + ...options, // Keep any options passed separately + }; + midiport = port; + } + + let midiConfig = { + // Default configuration values + isController: false, // Disable sending notes for midi controllers + latencyMs: 34, // Default latency to get audio engine to line up in ms + noteOffsetMs: 10, // Default note-off offset to prevent glitching in ms + midichannel: 1, // Default MIDI channel + velocity: 0.9, // Default velocity + gain: 1, // Default gain + midimap: 'default', // Default MIDI map + midiport: midiport, // Store the port in the config + ...options, // Override defaults with provided options + }; + + enableWebMidi({ + onEnabled: ({ outputs }) => { + const device = getDevice(midiConfig.midiport, outputs); + const otherOutputs = outputs.filter((o) => o.name !== device.name); + logger( + `Midi enabled! Using "${device.name}". ${ + otherOutputs?.length ? `Also available: ${getMidiDeviceNamesString(otherOutputs)}` : '' + }`, + ); + }, + onDisconnected: ({ outputs }) => + logger(`Midi device disconnected! Available: ${getMidiDeviceNamesString(outputs)}`), + }); + + return this.onTrigger((hap, currentTime, cps, targetTime) => { + if (!WebMidi.enabled) { + logger('Midi not enabled'); + return; + } + hap.ensureObjectValue(); + + //magic number to get audio engine to line up, can probably be calculated somehow + const latencyMs = midiConfig.latencyMs; + // passing a string with a +num into the webmidi api adds an offset to the current time https://webmidijs.org/api/classes/Output + const timeOffsetString = `+${getEventOffsetMs(targetTime, currentTime) + latencyMs}`; + + // midi event values from hap with configurable defaults + let { + note, + nrpnn, + nrpv, + ccn, + ccv, + midichan = midiConfig.midichannel, + midicmd, + midibend, + miditouch, + polyTouch, + gain = midiConfig.gain, + velocity = midiConfig.velocity, + progNum, + sysexid, + sysexdata, + midimap = midiConfig.midimap, + midiport = midiConfig.midiport, + } = hap.value; + + const device = getDevice(midiport, WebMidi.outputs); + if (!device) { + logger( + `[midi] midiport "${midiport}" not found! available: ${WebMidi.outputs.map((output) => `'${output.name}'`).join(', ')}`, + ); + return; + } + + velocity = gain * velocity; + + // Handle midimap + // if midimap is set, send a cc messages from defined controls + if (midicontrolMap.has(midimap)) { + const ccs = mapCC(midicontrolMap.get(midimap), hap.value); + ccs.forEach(({ ccn, ccv }) => sendCC(ccn, ccv, device, midichan, timeOffsetString)); + } else if (midimap !== 'default') { + // Add warning when a non-existent midimap is specified + logger(`[midi] midimap "${midimap}" not found! Available maps: ${[...midicontrolMap.keys()].join(', ')}`); + } + + // Handle note + if (note !== undefined && !midiConfig.isController) { + // note off messages will often a few ms arrive late, + // try to prevent glitching by subtracting noteOffsetMs from the duration length + const duration = (hap.duration.valueOf() / cps) * 1000 - midiConfig.noteOffsetMs; + + sendNote(note, velocity, duration, device, midichan, timeOffsetString); + } + + // Handle program change + if (progNum !== undefined) { + sendProgramChange(progNum, device, midichan, timeOffsetString); + } + + // Handle sysex + // sysex data is consist of 2 arrays, first is sysexid, second is sysexdata + // sysexid is a manufacturer id it is either a number or an array of 3 numbers. + // list of manufacturer ids can be found here : https://midi.org/sysexidtable + // if sysexid is an array the first byte is 0x00 + + if (sysexid !== undefined && sysexdata !== undefined) { + sendSysex(sysexid, sysexdata, device, timeOffsetString); + } + + // Handle control change + if (ccv !== undefined && ccn !== undefined) { + sendCC(ccn, ccv, device, midichan, timeOffsetString); + } + + // Handle NRPN non-registered parameter number + if (nrpnn !== undefined && nrpv !== undefined) { + sendNRPN(nrpnn, nrpv, device, midichan, timeOffsetString); + } + + // Handle midibend + if (midibend !== undefined) { + sendPitchBend(midibend, device, midichan, timeOffsetString); + } + + // Handle miditouch + if (miditouch !== undefined) { + sendAftertouch(miditouch, device, midichan, timeOffsetString); + } + + // Handle midicmd + if (hap.whole.begin + 0 === 0) { + // we need to start here because we have the timing info + device.sendStart({ time: timeOffsetString }); + } + if (['clock', 'midiClock'].includes(midicmd)) { + device.sendClock({ time: timeOffsetString }); + } else if (['start'].includes(midicmd)) { + device.sendStart({ time: timeOffsetString }); + } else if (['stop'].includes(midicmd)) { + device.sendStop({ time: timeOffsetString }); + } else if (['continue'].includes(midicmd)) { + device.sendContinue({ time: timeOffsetString }); + } else if (Array.isArray(midicmd)) { + if (midicmd[0] === 'progNum') { + sendProgramChange(midicmd[1], device, midichan, timeOffsetString); + } else if (midicmd[0] === 'cc') { + if (midicmd.length === 2) { + sendCC(midicmd[0], midicmd[1] / 127, device, midichan, timeOffsetString); + } + } else if (midicmd[0] === 'sysex') { + if (midicmd.length === 3) { + const [_, id, data] = midicmd; + sendSysex(id, data, device, timeOffsetString); + } + } + } + }); +}; + +let listeners = {}; +const refs = {}; + +/** + * MIDI input: Opens a MIDI input port to receive MIDI control change messages. + * @param {string | number} input MIDI device name or index defaulting to 0 + * @returns {Function} + * @example + * let cc = await midin('IAC Driver Bus 1') + * note("c a f e").lpf(cc(0).range(0, 1000)).lpq(cc(1).range(0, 10)).sound("sawtooth") + */ +export async function midin(input) { + if (isPattern(input)) { + throw new Error( + `midin: does not accept Pattern as input. Make sure to pass device name with single quotes. Example: midin('${ + WebMidi.outputs?.[0]?.name || 'IAC Driver Bus 1' + }')`, + ); + } + const initial = await enableWebMidi(); // only returns on first init + const device = getDevice(input, WebMidi.inputs); + if (!device) { + throw new Error( + `midiin: device "${input}" not found.. connected devices: ${getMidiDeviceNamesString(WebMidi.inputs)}`, + ); + } + if (initial) { + const otherInputs = WebMidi.inputs.filter((o) => o.name !== device.name); + logger( + `Midi enabled! Using "${device.name}". ${ + otherInputs?.length ? `Also available: ${getMidiDeviceNamesString(otherInputs)}` : '' + }`, + ); + } + // ensure refs for this input are initialized + if (!refs[input]) { + refs[input] = {}; + } + const cc = (cc) => ref(() => refs[input][cc] || 0); + + listeners[input] && device.removeListener('midimessage', listeners[input]); + listeners[input] = (e) => { + const cc = e.dataBytes[0]; + const v = e.dataBytes[1]; + refs[input] && (refs[input][cc] = v / 127); + }; + device.addListener('midimessage', listeners[input]); + return cc; +} diff --git a/src/strudel/mini/index.mjs b/src/strudel/mini/index.mjs new file mode 100644 index 0000000..d6bfae1 --- /dev/null +++ b/src/strudel/mini/index.mjs @@ -0,0 +1,2 @@ +export * from './mini.mjs'; +export * from './krill-parser.js'; diff --git a/src/strudel/mini/krill-parser.js b/src/strudel/mini/krill-parser.js new file mode 100644 index 0000000..0d855e4 --- /dev/null +++ b/src/strudel/mini/krill-parser.js @@ -0,0 +1,2497 @@ +// @generated by Peggy 4.2.0. +// +// https://peggyjs.org/ + + +function peg$subclass(child, parent) { + function C() { this.constructor = child; } + C.prototype = parent.prototype; + child.prototype = new C(); +} + +function peg$SyntaxError(message, expected, found, location) { + var self = Error.call(this, message); + // istanbul ignore next Check is a necessary evil to support older environments + if (Object.setPrototypeOf) { + Object.setPrototypeOf(self, peg$SyntaxError.prototype); + } + self.expected = expected; + self.found = found; + self.location = location; + self.name = "SyntaxError"; + return self; +} + +peg$subclass(peg$SyntaxError, Error); + +function peg$padEnd(str, targetLength, padString) { + padString = padString || " "; + if (str.length > targetLength) { return str; } + targetLength -= str.length; + padString += padString.repeat(targetLength); + return str + padString.slice(0, targetLength); +} + +peg$SyntaxError.prototype.format = function(sources) { + var str = "Error: " + this.message; + if (this.location) { + var src = null; + var k; + for (k = 0; k < sources.length; k++) { + if (sources[k].source === this.location.source) { + src = sources[k].text.split(/\r\n|\n|\r/g); + break; + } + } + var s = this.location.start; + var offset_s = (this.location.source && (typeof this.location.source.offset === "function")) + ? this.location.source.offset(s) + : s; + var loc = this.location.source + ":" + offset_s.line + ":" + offset_s.column; + if (src) { + var e = this.location.end; + var filler = peg$padEnd("", offset_s.line.toString().length, ' '); + var line = src[s.line - 1]; + var last = s.line === e.line ? e.column : line.length + 1; + var hatLen = (last - s.column) || 1; + str += "\n --> " + loc + "\n" + + filler + " |\n" + + offset_s.line + " | " + line + "\n" + + filler + " | " + peg$padEnd("", s.column - 1, ' ') + + peg$padEnd("", hatLen, "^"); + } else { + str += "\n at " + loc; + } + } + return str; +}; + +peg$SyntaxError.buildMessage = function(expected, found) { + var DESCRIBE_EXPECTATION_FNS = { + literal: function(expectation) { + return "\"" + literalEscape(expectation.text) + "\""; + }, + + class: function(expectation) { + var escapedParts = expectation.parts.map(function(part) { + return Array.isArray(part) + ? classEscape(part[0]) + "-" + classEscape(part[1]) + : classEscape(part); + }); + + return "[" + (expectation.inverted ? "^" : "") + escapedParts.join("") + "]"; + }, + + any: function() { + return "any character"; + }, + + end: function() { + return "end of input"; + }, + + other: function(expectation) { + return expectation.description; + } + }; + + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } + + function literalEscape(s) { + return s + .replace(/\\/g, "\\\\") + .replace(/"/g, "\\\"") + .replace(/\0/g, "\\0") + .replace(/\t/g, "\\t") + .replace(/\n/g, "\\n") + .replace(/\r/g, "\\r") + .replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); }) + .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); }); + } + + function classEscape(s) { + return s + .replace(/\\/g, "\\\\") + .replace(/\]/g, "\\]") + .replace(/\^/g, "\\^") + .replace(/-/g, "\\-") + .replace(/\0/g, "\\0") + .replace(/\t/g, "\\t") + .replace(/\n/g, "\\n") + .replace(/\r/g, "\\r") + .replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); }) + .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); }); + } + + function describeExpectation(expectation) { + return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); + } + + function describeExpected(expected) { + var descriptions = expected.map(describeExpectation); + var i, j; + + descriptions.sort(); + + if (descriptions.length > 0) { + for (i = 1, j = 1; i < descriptions.length; i++) { + if (descriptions[i - 1] !== descriptions[i]) { + descriptions[j] = descriptions[i]; + j++; + } + } + descriptions.length = j; + } + + switch (descriptions.length) { + case 1: + return descriptions[0]; + + case 2: + return descriptions[0] + " or " + descriptions[1]; + + default: + return descriptions.slice(0, -1).join(", ") + + ", or " + + descriptions[descriptions.length - 1]; + } + } + + function describeFound(found) { + return found ? "\"" + literalEscape(found) + "\"" : "end of input"; + } + + return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; +}; + +function peg$parse(input, options) { + options = options !== undefined ? options : {}; + + var peg$FAILED = {}; + var peg$source = options.grammarSource; + + var peg$startRuleFunctions = { start: peg$parsestart }; + var peg$startRuleFunction = peg$parsestart; + + var peg$c0 = "."; + var peg$c1 = "-"; + var peg$c2 = "+"; + var peg$c3 = "0"; + var peg$c4 = ","; + var peg$c5 = "|"; + var peg$c6 = "["; + var peg$c7 = "]"; + var peg$c8 = "{"; + var peg$c9 = "}"; + var peg$c10 = "%"; + var peg$c11 = "<"; + var peg$c12 = ">"; + var peg$c13 = "!"; + var peg$c14 = "("; + var peg$c15 = ")"; + var peg$c16 = "/"; + var peg$c17 = "*"; + var peg$c18 = "?"; + var peg$c19 = ":"; + var peg$c20 = ".."; + var peg$c21 = "^"; + var peg$c22 = "struct"; + var peg$c23 = "target"; + var peg$c24 = "euclid"; + var peg$c25 = "slow"; + var peg$c26 = "rotL"; + var peg$c27 = "rotR"; + var peg$c28 = "fast"; + var peg$c29 = "scale"; + var peg$c30 = "//"; + var peg$c31 = "cat"; + var peg$c32 = "$"; + var peg$c33 = "setcps"; + var peg$c34 = "setbpm"; + var peg$c35 = "hush"; + + var peg$r0 = /^[1-9]/; + var peg$r1 = /^[eE]/; + var peg$r2 = /^[+\-]/; + var peg$r3 = /^[0-9]/; + var peg$r4 = /^[ \n\r\t\xA0]/; + var peg$r5 = /^["']/; + var peg$r6 = /^[#\--.0-9A-Z\^-_a-z~\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376-\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06E5-\u06E6\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4-\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u09FC\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60-\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E46\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7B9\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD-\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/; + var peg$r7 = /^[@_]/; + var peg$r8 = /^[^\n]/; + var peg$r9 = /^[A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376-\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06E5-\u06E6\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4-\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u09FC\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60-\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E46\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7B9\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD-\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/; + var peg$r10 = /^[a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137-\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148-\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C-\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA-\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9-\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC-\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF-\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F-\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0-\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB-\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE-\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6-\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FC7\u1FD0-\u1FD3\u1FD6-\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6-\u1FF7\u210A\u210E-\u210F\u2113\u212F\u2134\u2139\u213C-\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65-\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73-\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3-\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A]/; + var peg$r11 = /^[\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5-\u06E6\u07F4-\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C-\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D-\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C-\uA69D\uA717-\uA71F\uA770\uA788\uA7F8-\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3-\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E-\uFF9F]/; + var peg$r12 = /^[\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05EF-\u05F2\u0620-\u063F\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u09FC\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60-\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A-\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD-\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/; + var peg$r13 = /^[\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC]/; + var peg$r14 = /^[A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178-\u0179\u017B\u017D\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018B\u018E-\u0191\u0193-\u0194\u0196-\u0198\u019C-\u019D\u019F-\u01A0\u01A2\u01A4\u01A6-\u01A7\u01A9\u01AC\u01AE-\u01AF\u01B1-\u01B3\u01B5\u01B7-\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A-\u023B\u023D-\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E-\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9-\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0-\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E-\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D-\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uFF21-\uFF3A]/; + var peg$r15 = /^[\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF]/; + + var peg$e0 = peg$otherExpectation("number"); + var peg$e1 = peg$literalExpectation(".", false); + var peg$e2 = peg$classExpectation([["1", "9"]], false, false); + var peg$e3 = peg$classExpectation(["e", "E"], false, false); + var peg$e4 = peg$classExpectation(["+", "-"], false, false); + var peg$e5 = peg$literalExpectation("-", false); + var peg$e6 = peg$literalExpectation("+", false); + var peg$e7 = peg$literalExpectation("0", false); + var peg$e8 = peg$classExpectation([["0", "9"]], false, false); + var peg$e9 = peg$otherExpectation("whitespace"); + var peg$e10 = peg$classExpectation([" ", "\n", "\r", "\t", "\xA0"], false, false); + var peg$e11 = peg$literalExpectation(",", false); + var peg$e12 = peg$literalExpectation("|", false); + var peg$e13 = peg$classExpectation(["\"", "'"], false, false); + var peg$e14 = peg$otherExpectation("a letter, a number, \"-\", \"#\", \".\", \"^\", \"_\""); + var peg$e15 = peg$classExpectation(["#", ["-", "."], ["0", "9"], ["A", "Z"], ["^", "_"], ["a", "z"], "~", "\xAA", "\xB5", "\xBA", ["\xC0", "\xD6"], ["\xD8", "\xF6"], ["\xF8", "\u02C1"], ["\u02C6", "\u02D1"], ["\u02E0", "\u02E4"], "\u02EC", "\u02EE", ["\u0370", "\u0374"], ["\u0376", "\u0377"], ["\u037A", "\u037D"], "\u037F", "\u0386", ["\u0388", "\u038A"], "\u038C", ["\u038E", "\u03A1"], ["\u03A3", "\u03F5"], ["\u03F7", "\u0481"], ["\u048A", "\u052F"], ["\u0531", "\u0556"], "\u0559", ["\u0560", "\u0588"], ["\u05D0", "\u05EA"], ["\u05EF", "\u05F2"], ["\u0620", "\u064A"], ["\u066E", "\u066F"], ["\u0671", "\u06D3"], "\u06D5", ["\u06E5", "\u06E6"], ["\u06EE", "\u06EF"], ["\u06FA", "\u06FC"], "\u06FF", "\u0710", ["\u0712", "\u072F"], ["\u074D", "\u07A5"], "\u07B1", ["\u07CA", "\u07EA"], ["\u07F4", "\u07F5"], "\u07FA", ["\u0800", "\u0815"], "\u081A", "\u0824", "\u0828", ["\u0840", "\u0858"], ["\u0860", "\u086A"], ["\u08A0", "\u08B4"], ["\u08B6", "\u08BD"], ["\u0904", "\u0939"], "\u093D", "\u0950", ["\u0958", "\u0961"], ["\u0971", "\u0980"], ["\u0985", "\u098C"], ["\u098F", "\u0990"], ["\u0993", "\u09A8"], ["\u09AA", "\u09B0"], "\u09B2", ["\u09B6", "\u09B9"], "\u09BD", "\u09CE", ["\u09DC", "\u09DD"], ["\u09DF", "\u09E1"], ["\u09F0", "\u09F1"], "\u09FC", ["\u0A05", "\u0A0A"], ["\u0A0F", "\u0A10"], ["\u0A13", "\u0A28"], ["\u0A2A", "\u0A30"], ["\u0A32", "\u0A33"], ["\u0A35", "\u0A36"], ["\u0A38", "\u0A39"], ["\u0A59", "\u0A5C"], "\u0A5E", ["\u0A72", "\u0A74"], ["\u0A85", "\u0A8D"], ["\u0A8F", "\u0A91"], ["\u0A93", "\u0AA8"], ["\u0AAA", "\u0AB0"], ["\u0AB2", "\u0AB3"], ["\u0AB5", "\u0AB9"], "\u0ABD", "\u0AD0", ["\u0AE0", "\u0AE1"], "\u0AF9", ["\u0B05", "\u0B0C"], ["\u0B0F", "\u0B10"], ["\u0B13", "\u0B28"], ["\u0B2A", "\u0B30"], ["\u0B32", "\u0B33"], ["\u0B35", "\u0B39"], "\u0B3D", ["\u0B5C", "\u0B5D"], ["\u0B5F", "\u0B61"], "\u0B71", "\u0B83", ["\u0B85", "\u0B8A"], ["\u0B8E", "\u0B90"], ["\u0B92", "\u0B95"], ["\u0B99", "\u0B9A"], "\u0B9C", ["\u0B9E", "\u0B9F"], ["\u0BA3", "\u0BA4"], ["\u0BA8", "\u0BAA"], ["\u0BAE", "\u0BB9"], "\u0BD0", ["\u0C05", "\u0C0C"], ["\u0C0E", "\u0C10"], ["\u0C12", "\u0C28"], ["\u0C2A", "\u0C39"], "\u0C3D", ["\u0C58", "\u0C5A"], ["\u0C60", "\u0C61"], "\u0C80", ["\u0C85", "\u0C8C"], ["\u0C8E", "\u0C90"], ["\u0C92", "\u0CA8"], ["\u0CAA", "\u0CB3"], ["\u0CB5", "\u0CB9"], "\u0CBD", "\u0CDE", ["\u0CE0", "\u0CE1"], ["\u0CF1", "\u0CF2"], ["\u0D05", "\u0D0C"], ["\u0D0E", "\u0D10"], ["\u0D12", "\u0D3A"], "\u0D3D", "\u0D4E", ["\u0D54", "\u0D56"], ["\u0D5F", "\u0D61"], ["\u0D7A", "\u0D7F"], ["\u0D85", "\u0D96"], ["\u0D9A", "\u0DB1"], ["\u0DB3", "\u0DBB"], "\u0DBD", ["\u0DC0", "\u0DC6"], ["\u0E01", "\u0E30"], ["\u0E32", "\u0E33"], ["\u0E40", "\u0E46"], ["\u0E81", "\u0E82"], "\u0E84", ["\u0E87", "\u0E88"], "\u0E8A", "\u0E8D", ["\u0E94", "\u0E97"], ["\u0E99", "\u0E9F"], ["\u0EA1", "\u0EA3"], "\u0EA5", "\u0EA7", ["\u0EAA", "\u0EAB"], ["\u0EAD", "\u0EB0"], ["\u0EB2", "\u0EB3"], "\u0EBD", ["\u0EC0", "\u0EC4"], "\u0EC6", ["\u0EDC", "\u0EDF"], "\u0F00", ["\u0F40", "\u0F47"], ["\u0F49", "\u0F6C"], ["\u0F88", "\u0F8C"], ["\u1000", "\u102A"], "\u103F", ["\u1050", "\u1055"], ["\u105A", "\u105D"], "\u1061", ["\u1065", "\u1066"], ["\u106E", "\u1070"], ["\u1075", "\u1081"], "\u108E", ["\u10A0", "\u10C5"], "\u10C7", "\u10CD", ["\u10D0", "\u10FA"], ["\u10FC", "\u1248"], ["\u124A", "\u124D"], ["\u1250", "\u1256"], "\u1258", ["\u125A", "\u125D"], ["\u1260", "\u1288"], ["\u128A", "\u128D"], ["\u1290", "\u12B0"], ["\u12B2", "\u12B5"], ["\u12B8", "\u12BE"], "\u12C0", ["\u12C2", "\u12C5"], ["\u12C8", "\u12D6"], ["\u12D8", "\u1310"], ["\u1312", "\u1315"], ["\u1318", "\u135A"], ["\u1380", "\u138F"], ["\u13A0", "\u13F5"], ["\u13F8", "\u13FD"], ["\u1401", "\u166C"], ["\u166F", "\u167F"], ["\u1681", "\u169A"], ["\u16A0", "\u16EA"], ["\u16EE", "\u16F8"], ["\u1700", "\u170C"], ["\u170E", "\u1711"], ["\u1720", "\u1731"], ["\u1740", "\u1751"], ["\u1760", "\u176C"], ["\u176E", "\u1770"], ["\u1780", "\u17B3"], "\u17D7", "\u17DC", ["\u1820", "\u1878"], ["\u1880", "\u1884"], ["\u1887", "\u18A8"], "\u18AA", ["\u18B0", "\u18F5"], ["\u1900", "\u191E"], ["\u1950", "\u196D"], ["\u1970", "\u1974"], ["\u1980", "\u19AB"], ["\u19B0", "\u19C9"], ["\u1A00", "\u1A16"], ["\u1A20", "\u1A54"], "\u1AA7", ["\u1B05", "\u1B33"], ["\u1B45", "\u1B4B"], ["\u1B83", "\u1BA0"], ["\u1BAE", "\u1BAF"], ["\u1BBA", "\u1BE5"], ["\u1C00", "\u1C23"], ["\u1C4D", "\u1C4F"], ["\u1C5A", "\u1C7D"], ["\u1C80", "\u1C88"], ["\u1C90", "\u1CBA"], ["\u1CBD", "\u1CBF"], ["\u1CE9", "\u1CEC"], ["\u1CEE", "\u1CF1"], ["\u1CF5", "\u1CF6"], ["\u1D00", "\u1DBF"], ["\u1E00", "\u1F15"], ["\u1F18", "\u1F1D"], ["\u1F20", "\u1F45"], ["\u1F48", "\u1F4D"], ["\u1F50", "\u1F57"], "\u1F59", "\u1F5B", "\u1F5D", ["\u1F5F", "\u1F7D"], ["\u1F80", "\u1FB4"], ["\u1FB6", "\u1FBC"], "\u1FBE", ["\u1FC2", "\u1FC4"], ["\u1FC6", "\u1FCC"], ["\u1FD0", "\u1FD3"], ["\u1FD6", "\u1FDB"], ["\u1FE0", "\u1FEC"], ["\u1FF2", "\u1FF4"], ["\u1FF6", "\u1FFC"], "\u2071", "\u207F", ["\u2090", "\u209C"], "\u2102", "\u2107", ["\u210A", "\u2113"], "\u2115", ["\u2119", "\u211D"], "\u2124", "\u2126", "\u2128", ["\u212A", "\u212D"], ["\u212F", "\u2139"], ["\u213C", "\u213F"], ["\u2145", "\u2149"], "\u214E", ["\u2160", "\u2188"], ["\u2C00", "\u2C2E"], ["\u2C30", "\u2C5E"], ["\u2C60", "\u2CE4"], ["\u2CEB", "\u2CEE"], ["\u2CF2", "\u2CF3"], ["\u2D00", "\u2D25"], "\u2D27", "\u2D2D", ["\u2D30", "\u2D67"], "\u2D6F", ["\u2D80", "\u2D96"], ["\u2DA0", "\u2DA6"], ["\u2DA8", "\u2DAE"], ["\u2DB0", "\u2DB6"], ["\u2DB8", "\u2DBE"], ["\u2DC0", "\u2DC6"], ["\u2DC8", "\u2DCE"], ["\u2DD0", "\u2DD6"], ["\u2DD8", "\u2DDE"], "\u2E2F", ["\u3005", "\u3007"], ["\u3021", "\u3029"], ["\u3031", "\u3035"], ["\u3038", "\u303C"], ["\u3041", "\u3096"], ["\u309D", "\u309F"], ["\u30A1", "\u30FA"], ["\u30FC", "\u30FF"], ["\u3105", "\u312F"], ["\u3131", "\u318E"], ["\u31A0", "\u31BA"], ["\u31F0", "\u31FF"], ["\u3400", "\u4DB5"], ["\u4E00", "\u9FEF"], ["\uA000", "\uA48C"], ["\uA4D0", "\uA4FD"], ["\uA500", "\uA60C"], ["\uA610", "\uA61F"], ["\uA62A", "\uA62B"], ["\uA640", "\uA66E"], ["\uA67F", "\uA69D"], ["\uA6A0", "\uA6EF"], ["\uA717", "\uA71F"], ["\uA722", "\uA788"], ["\uA78B", "\uA7B9"], ["\uA7F7", "\uA801"], ["\uA803", "\uA805"], ["\uA807", "\uA80A"], ["\uA80C", "\uA822"], ["\uA840", "\uA873"], ["\uA882", "\uA8B3"], ["\uA8F2", "\uA8F7"], "\uA8FB", ["\uA8FD", "\uA8FE"], ["\uA90A", "\uA925"], ["\uA930", "\uA946"], ["\uA960", "\uA97C"], ["\uA984", "\uA9B2"], "\uA9CF", ["\uA9E0", "\uA9E4"], ["\uA9E6", "\uA9EF"], ["\uA9FA", "\uA9FE"], ["\uAA00", "\uAA28"], ["\uAA40", "\uAA42"], ["\uAA44", "\uAA4B"], ["\uAA60", "\uAA76"], "\uAA7A", ["\uAA7E", "\uAAAF"], "\uAAB1", ["\uAAB5", "\uAAB6"], ["\uAAB9", "\uAABD"], "\uAAC0", "\uAAC2", ["\uAADB", "\uAADD"], ["\uAAE0", "\uAAEA"], ["\uAAF2", "\uAAF4"], ["\uAB01", "\uAB06"], ["\uAB09", "\uAB0E"], ["\uAB11", "\uAB16"], ["\uAB20", "\uAB26"], ["\uAB28", "\uAB2E"], ["\uAB30", "\uAB5A"], ["\uAB5C", "\uAB65"], ["\uAB70", "\uABE2"], ["\uAC00", "\uD7A3"], ["\uD7B0", "\uD7C6"], ["\uD7CB", "\uD7FB"], ["\uF900", "\uFA6D"], ["\uFA70", "\uFAD9"], ["\uFB00", "\uFB06"], ["\uFB13", "\uFB17"], "\uFB1D", ["\uFB1F", "\uFB28"], ["\uFB2A", "\uFB36"], ["\uFB38", "\uFB3C"], "\uFB3E", ["\uFB40", "\uFB41"], ["\uFB43", "\uFB44"], ["\uFB46", "\uFBB1"], ["\uFBD3", "\uFD3D"], ["\uFD50", "\uFD8F"], ["\uFD92", "\uFDC7"], ["\uFDF0", "\uFDFB"], ["\uFE70", "\uFE74"], ["\uFE76", "\uFEFC"], ["\uFF21", "\uFF3A"], ["\uFF41", "\uFF5A"], ["\uFF66", "\uFFBE"], ["\uFFC2", "\uFFC7"], ["\uFFCA", "\uFFCF"], ["\uFFD2", "\uFFD7"], ["\uFFDA", "\uFFDC"]], false, false); + var peg$e16 = peg$literalExpectation("[", false); + var peg$e17 = peg$literalExpectation("]", false); + var peg$e18 = peg$literalExpectation("{", false); + var peg$e19 = peg$literalExpectation("}", false); + var peg$e20 = peg$literalExpectation("%", false); + var peg$e21 = peg$literalExpectation("<", false); + var peg$e22 = peg$literalExpectation(">", false); + var peg$e23 = peg$classExpectation(["@", "_"], false, false); + var peg$e24 = peg$literalExpectation("!", false); + var peg$e25 = peg$literalExpectation("(", false); + var peg$e26 = peg$literalExpectation(")", false); + var peg$e27 = peg$literalExpectation("/", false); + var peg$e28 = peg$literalExpectation("*", false); + var peg$e29 = peg$literalExpectation("?", false); + var peg$e30 = peg$literalExpectation(":", false); + var peg$e31 = peg$literalExpectation("..", false); + var peg$e32 = peg$literalExpectation("^", false); + var peg$e33 = peg$literalExpectation("struct", false); + var peg$e34 = peg$literalExpectation("target", false); + var peg$e35 = peg$literalExpectation("euclid", false); + var peg$e36 = peg$literalExpectation("slow", false); + var peg$e37 = peg$literalExpectation("rotL", false); + var peg$e38 = peg$literalExpectation("rotR", false); + var peg$e39 = peg$literalExpectation("fast", false); + var peg$e40 = peg$literalExpectation("scale", false); + var peg$e41 = peg$literalExpectation("//", false); + var peg$e42 = peg$classExpectation(["\n"], true, false); + var peg$e43 = peg$literalExpectation("cat", false); + var peg$e44 = peg$literalExpectation("$", false); + var peg$e45 = peg$literalExpectation("setcps", false); + var peg$e46 = peg$literalExpectation("setbpm", false); + var peg$e47 = peg$literalExpectation("hush", false); + var peg$e48 = peg$classExpectation([["A", "Z"], ["a", "z"], "\xAA", "\xB5", "\xBA", ["\xC0", "\xD6"], ["\xD8", "\xF6"], ["\xF8", "\u02C1"], ["\u02C6", "\u02D1"], ["\u02E0", "\u02E4"], "\u02EC", "\u02EE", ["\u0370", "\u0374"], ["\u0376", "\u0377"], ["\u037A", "\u037D"], "\u037F", "\u0386", ["\u0388", "\u038A"], "\u038C", ["\u038E", "\u03A1"], ["\u03A3", "\u03F5"], ["\u03F7", "\u0481"], ["\u048A", "\u052F"], ["\u0531", "\u0556"], "\u0559", ["\u0560", "\u0588"], ["\u05D0", "\u05EA"], ["\u05EF", "\u05F2"], ["\u0620", "\u064A"], ["\u066E", "\u066F"], ["\u0671", "\u06D3"], "\u06D5", ["\u06E5", "\u06E6"], ["\u06EE", "\u06EF"], ["\u06FA", "\u06FC"], "\u06FF", "\u0710", ["\u0712", "\u072F"], ["\u074D", "\u07A5"], "\u07B1", ["\u07CA", "\u07EA"], ["\u07F4", "\u07F5"], "\u07FA", ["\u0800", "\u0815"], "\u081A", "\u0824", "\u0828", ["\u0840", "\u0858"], ["\u0860", "\u086A"], ["\u08A0", "\u08B4"], ["\u08B6", "\u08BD"], ["\u0904", "\u0939"], "\u093D", "\u0950", ["\u0958", "\u0961"], ["\u0971", "\u0980"], ["\u0985", "\u098C"], ["\u098F", "\u0990"], ["\u0993", "\u09A8"], ["\u09AA", "\u09B0"], "\u09B2", ["\u09B6", "\u09B9"], "\u09BD", "\u09CE", ["\u09DC", "\u09DD"], ["\u09DF", "\u09E1"], ["\u09F0", "\u09F1"], "\u09FC", ["\u0A05", "\u0A0A"], ["\u0A0F", "\u0A10"], ["\u0A13", "\u0A28"], ["\u0A2A", "\u0A30"], ["\u0A32", "\u0A33"], ["\u0A35", "\u0A36"], ["\u0A38", "\u0A39"], ["\u0A59", "\u0A5C"], "\u0A5E", ["\u0A72", "\u0A74"], ["\u0A85", "\u0A8D"], ["\u0A8F", "\u0A91"], ["\u0A93", "\u0AA8"], ["\u0AAA", "\u0AB0"], ["\u0AB2", "\u0AB3"], ["\u0AB5", "\u0AB9"], "\u0ABD", "\u0AD0", ["\u0AE0", "\u0AE1"], "\u0AF9", ["\u0B05", "\u0B0C"], ["\u0B0F", "\u0B10"], ["\u0B13", "\u0B28"], ["\u0B2A", "\u0B30"], ["\u0B32", "\u0B33"], ["\u0B35", "\u0B39"], "\u0B3D", ["\u0B5C", "\u0B5D"], ["\u0B5F", "\u0B61"], "\u0B71", "\u0B83", ["\u0B85", "\u0B8A"], ["\u0B8E", "\u0B90"], ["\u0B92", "\u0B95"], ["\u0B99", "\u0B9A"], "\u0B9C", ["\u0B9E", "\u0B9F"], ["\u0BA3", "\u0BA4"], ["\u0BA8", "\u0BAA"], ["\u0BAE", "\u0BB9"], "\u0BD0", ["\u0C05", "\u0C0C"], ["\u0C0E", "\u0C10"], ["\u0C12", "\u0C28"], ["\u0C2A", "\u0C39"], "\u0C3D", ["\u0C58", "\u0C5A"], ["\u0C60", "\u0C61"], "\u0C80", ["\u0C85", "\u0C8C"], ["\u0C8E", "\u0C90"], ["\u0C92", "\u0CA8"], ["\u0CAA", "\u0CB3"], ["\u0CB5", "\u0CB9"], "\u0CBD", "\u0CDE", ["\u0CE0", "\u0CE1"], ["\u0CF1", "\u0CF2"], ["\u0D05", "\u0D0C"], ["\u0D0E", "\u0D10"], ["\u0D12", "\u0D3A"], "\u0D3D", "\u0D4E", ["\u0D54", "\u0D56"], ["\u0D5F", "\u0D61"], ["\u0D7A", "\u0D7F"], ["\u0D85", "\u0D96"], ["\u0D9A", "\u0DB1"], ["\u0DB3", "\u0DBB"], "\u0DBD", ["\u0DC0", "\u0DC6"], ["\u0E01", "\u0E30"], ["\u0E32", "\u0E33"], ["\u0E40", "\u0E46"], ["\u0E81", "\u0E82"], "\u0E84", ["\u0E87", "\u0E88"], "\u0E8A", "\u0E8D", ["\u0E94", "\u0E97"], ["\u0E99", "\u0E9F"], ["\u0EA1", "\u0EA3"], "\u0EA5", "\u0EA7", ["\u0EAA", "\u0EAB"], ["\u0EAD", "\u0EB0"], ["\u0EB2", "\u0EB3"], "\u0EBD", ["\u0EC0", "\u0EC4"], "\u0EC6", ["\u0EDC", "\u0EDF"], "\u0F00", ["\u0F40", "\u0F47"], ["\u0F49", "\u0F6C"], ["\u0F88", "\u0F8C"], ["\u1000", "\u102A"], "\u103F", ["\u1050", "\u1055"], ["\u105A", "\u105D"], "\u1061", ["\u1065", "\u1066"], ["\u106E", "\u1070"], ["\u1075", "\u1081"], "\u108E", ["\u10A0", "\u10C5"], "\u10C7", "\u10CD", ["\u10D0", "\u10FA"], ["\u10FC", "\u1248"], ["\u124A", "\u124D"], ["\u1250", "\u1256"], "\u1258", ["\u125A", "\u125D"], ["\u1260", "\u1288"], ["\u128A", "\u128D"], ["\u1290", "\u12B0"], ["\u12B2", "\u12B5"], ["\u12B8", "\u12BE"], "\u12C0", ["\u12C2", "\u12C5"], ["\u12C8", "\u12D6"], ["\u12D8", "\u1310"], ["\u1312", "\u1315"], ["\u1318", "\u135A"], ["\u1380", "\u138F"], ["\u13A0", "\u13F5"], ["\u13F8", "\u13FD"], ["\u1401", "\u166C"], ["\u166F", "\u167F"], ["\u1681", "\u169A"], ["\u16A0", "\u16EA"], ["\u16EE", "\u16F8"], ["\u1700", "\u170C"], ["\u170E", "\u1711"], ["\u1720", "\u1731"], ["\u1740", "\u1751"], ["\u1760", "\u176C"], ["\u176E", "\u1770"], ["\u1780", "\u17B3"], "\u17D7", "\u17DC", ["\u1820", "\u1878"], ["\u1880", "\u1884"], ["\u1887", "\u18A8"], "\u18AA", ["\u18B0", "\u18F5"], ["\u1900", "\u191E"], ["\u1950", "\u196D"], ["\u1970", "\u1974"], ["\u1980", "\u19AB"], ["\u19B0", "\u19C9"], ["\u1A00", "\u1A16"], ["\u1A20", "\u1A54"], "\u1AA7", ["\u1B05", "\u1B33"], ["\u1B45", "\u1B4B"], ["\u1B83", "\u1BA0"], ["\u1BAE", "\u1BAF"], ["\u1BBA", "\u1BE5"], ["\u1C00", "\u1C23"], ["\u1C4D", "\u1C4F"], ["\u1C5A", "\u1C7D"], ["\u1C80", "\u1C88"], ["\u1C90", "\u1CBA"], ["\u1CBD", "\u1CBF"], ["\u1CE9", "\u1CEC"], ["\u1CEE", "\u1CF1"], ["\u1CF5", "\u1CF6"], ["\u1D00", "\u1DBF"], ["\u1E00", "\u1F15"], ["\u1F18", "\u1F1D"], ["\u1F20", "\u1F45"], ["\u1F48", "\u1F4D"], ["\u1F50", "\u1F57"], "\u1F59", "\u1F5B", "\u1F5D", ["\u1F5F", "\u1F7D"], ["\u1F80", "\u1FB4"], ["\u1FB6", "\u1FBC"], "\u1FBE", ["\u1FC2", "\u1FC4"], ["\u1FC6", "\u1FCC"], ["\u1FD0", "\u1FD3"], ["\u1FD6", "\u1FDB"], ["\u1FE0", "\u1FEC"], ["\u1FF2", "\u1FF4"], ["\u1FF6", "\u1FFC"], "\u2071", "\u207F", ["\u2090", "\u209C"], "\u2102", "\u2107", ["\u210A", "\u2113"], "\u2115", ["\u2119", "\u211D"], "\u2124", "\u2126", "\u2128", ["\u212A", "\u212D"], ["\u212F", "\u2139"], ["\u213C", "\u213F"], ["\u2145", "\u2149"], "\u214E", ["\u2160", "\u2188"], ["\u2C00", "\u2C2E"], ["\u2C30", "\u2C5E"], ["\u2C60", "\u2CE4"], ["\u2CEB", "\u2CEE"], ["\u2CF2", "\u2CF3"], ["\u2D00", "\u2D25"], "\u2D27", "\u2D2D", ["\u2D30", "\u2D67"], "\u2D6F", ["\u2D80", "\u2D96"], ["\u2DA0", "\u2DA6"], ["\u2DA8", "\u2DAE"], ["\u2DB0", "\u2DB6"], ["\u2DB8", "\u2DBE"], ["\u2DC0", "\u2DC6"], ["\u2DC8", "\u2DCE"], ["\u2DD0", "\u2DD6"], ["\u2DD8", "\u2DDE"], "\u2E2F", ["\u3005", "\u3007"], ["\u3021", "\u3029"], ["\u3031", "\u3035"], ["\u3038", "\u303C"], ["\u3041", "\u3096"], ["\u309D", "\u309F"], ["\u30A1", "\u30FA"], ["\u30FC", "\u30FF"], ["\u3105", "\u312F"], ["\u3131", "\u318E"], ["\u31A0", "\u31BA"], ["\u31F0", "\u31FF"], ["\u3400", "\u4DB5"], ["\u4E00", "\u9FEF"], ["\uA000", "\uA48C"], ["\uA4D0", "\uA4FD"], ["\uA500", "\uA60C"], ["\uA610", "\uA61F"], ["\uA62A", "\uA62B"], ["\uA640", "\uA66E"], ["\uA67F", "\uA69D"], ["\uA6A0", "\uA6EF"], ["\uA717", "\uA71F"], ["\uA722", "\uA788"], ["\uA78B", "\uA7B9"], ["\uA7F7", "\uA801"], ["\uA803", "\uA805"], ["\uA807", "\uA80A"], ["\uA80C", "\uA822"], ["\uA840", "\uA873"], ["\uA882", "\uA8B3"], ["\uA8F2", "\uA8F7"], "\uA8FB", ["\uA8FD", "\uA8FE"], ["\uA90A", "\uA925"], ["\uA930", "\uA946"], ["\uA960", "\uA97C"], ["\uA984", "\uA9B2"], "\uA9CF", ["\uA9E0", "\uA9E4"], ["\uA9E6", "\uA9EF"], ["\uA9FA", "\uA9FE"], ["\uAA00", "\uAA28"], ["\uAA40", "\uAA42"], ["\uAA44", "\uAA4B"], ["\uAA60", "\uAA76"], "\uAA7A", ["\uAA7E", "\uAAAF"], "\uAAB1", ["\uAAB5", "\uAAB6"], ["\uAAB9", "\uAABD"], "\uAAC0", "\uAAC2", ["\uAADB", "\uAADD"], ["\uAAE0", "\uAAEA"], ["\uAAF2", "\uAAF4"], ["\uAB01", "\uAB06"], ["\uAB09", "\uAB0E"], ["\uAB11", "\uAB16"], ["\uAB20", "\uAB26"], ["\uAB28", "\uAB2E"], ["\uAB30", "\uAB5A"], ["\uAB5C", "\uAB65"], ["\uAB70", "\uABE2"], ["\uAC00", "\uD7A3"], ["\uD7B0", "\uD7C6"], ["\uD7CB", "\uD7FB"], ["\uF900", "\uFA6D"], ["\uFA70", "\uFAD9"], ["\uFB00", "\uFB06"], ["\uFB13", "\uFB17"], "\uFB1D", ["\uFB1F", "\uFB28"], ["\uFB2A", "\uFB36"], ["\uFB38", "\uFB3C"], "\uFB3E", ["\uFB40", "\uFB41"], ["\uFB43", "\uFB44"], ["\uFB46", "\uFBB1"], ["\uFBD3", "\uFD3D"], ["\uFD50", "\uFD8F"], ["\uFD92", "\uFDC7"], ["\uFDF0", "\uFDFB"], ["\uFE70", "\uFE74"], ["\uFE76", "\uFEFC"], ["\uFF21", "\uFF3A"], ["\uFF41", "\uFF5A"], ["\uFF66", "\uFFBE"], ["\uFFC2", "\uFFC7"], ["\uFFCA", "\uFFCF"], ["\uFFD2", "\uFFD7"], ["\uFFDA", "\uFFDC"]], false, false); + var peg$e49 = peg$classExpectation([["a", "z"], "\xB5", ["\xDF", "\xF6"], ["\xF8", "\xFF"], "\u0101", "\u0103", "\u0105", "\u0107", "\u0109", "\u010B", "\u010D", "\u010F", "\u0111", "\u0113", "\u0115", "\u0117", "\u0119", "\u011B", "\u011D", "\u011F", "\u0121", "\u0123", "\u0125", "\u0127", "\u0129", "\u012B", "\u012D", "\u012F", "\u0131", "\u0133", "\u0135", ["\u0137", "\u0138"], "\u013A", "\u013C", "\u013E", "\u0140", "\u0142", "\u0144", "\u0146", ["\u0148", "\u0149"], "\u014B", "\u014D", "\u014F", "\u0151", "\u0153", "\u0155", "\u0157", "\u0159", "\u015B", "\u015D", "\u015F", "\u0161", "\u0163", "\u0165", "\u0167", "\u0169", "\u016B", "\u016D", "\u016F", "\u0171", "\u0173", "\u0175", "\u0177", "\u017A", "\u017C", ["\u017E", "\u0180"], "\u0183", "\u0185", "\u0188", ["\u018C", "\u018D"], "\u0192", "\u0195", ["\u0199", "\u019B"], "\u019E", "\u01A1", "\u01A3", "\u01A5", "\u01A8", ["\u01AA", "\u01AB"], "\u01AD", "\u01B0", "\u01B4", "\u01B6", ["\u01B9", "\u01BA"], ["\u01BD", "\u01BF"], "\u01C6", "\u01C9", "\u01CC", "\u01CE", "\u01D0", "\u01D2", "\u01D4", "\u01D6", "\u01D8", "\u01DA", ["\u01DC", "\u01DD"], "\u01DF", "\u01E1", "\u01E3", "\u01E5", "\u01E7", "\u01E9", "\u01EB", "\u01ED", ["\u01EF", "\u01F0"], "\u01F3", "\u01F5", "\u01F9", "\u01FB", "\u01FD", "\u01FF", "\u0201", "\u0203", "\u0205", "\u0207", "\u0209", "\u020B", "\u020D", "\u020F", "\u0211", "\u0213", "\u0215", "\u0217", "\u0219", "\u021B", "\u021D", "\u021F", "\u0221", "\u0223", "\u0225", "\u0227", "\u0229", "\u022B", "\u022D", "\u022F", "\u0231", ["\u0233", "\u0239"], "\u023C", ["\u023F", "\u0240"], "\u0242", "\u0247", "\u0249", "\u024B", "\u024D", ["\u024F", "\u0293"], ["\u0295", "\u02AF"], "\u0371", "\u0373", "\u0377", ["\u037B", "\u037D"], "\u0390", ["\u03AC", "\u03CE"], ["\u03D0", "\u03D1"], ["\u03D5", "\u03D7"], "\u03D9", "\u03DB", "\u03DD", "\u03DF", "\u03E1", "\u03E3", "\u03E5", "\u03E7", "\u03E9", "\u03EB", "\u03ED", ["\u03EF", "\u03F3"], "\u03F5", "\u03F8", ["\u03FB", "\u03FC"], ["\u0430", "\u045F"], "\u0461", "\u0463", "\u0465", "\u0467", "\u0469", "\u046B", "\u046D", "\u046F", "\u0471", "\u0473", "\u0475", "\u0477", "\u0479", "\u047B", "\u047D", "\u047F", "\u0481", "\u048B", "\u048D", "\u048F", "\u0491", "\u0493", "\u0495", "\u0497", "\u0499", "\u049B", "\u049D", "\u049F", "\u04A1", "\u04A3", "\u04A5", "\u04A7", "\u04A9", "\u04AB", "\u04AD", "\u04AF", "\u04B1", "\u04B3", "\u04B5", "\u04B7", "\u04B9", "\u04BB", "\u04BD", "\u04BF", "\u04C2", "\u04C4", "\u04C6", "\u04C8", "\u04CA", "\u04CC", ["\u04CE", "\u04CF"], "\u04D1", "\u04D3", "\u04D5", "\u04D7", "\u04D9", "\u04DB", "\u04DD", "\u04DF", "\u04E1", "\u04E3", "\u04E5", "\u04E7", "\u04E9", "\u04EB", "\u04ED", "\u04EF", "\u04F1", "\u04F3", "\u04F5", "\u04F7", "\u04F9", "\u04FB", "\u04FD", "\u04FF", "\u0501", "\u0503", "\u0505", "\u0507", "\u0509", "\u050B", "\u050D", "\u050F", "\u0511", "\u0513", "\u0515", "\u0517", "\u0519", "\u051B", "\u051D", "\u051F", "\u0521", "\u0523", "\u0525", "\u0527", "\u0529", "\u052B", "\u052D", "\u052F", ["\u0560", "\u0588"], ["\u10D0", "\u10FA"], ["\u10FD", "\u10FF"], ["\u13F8", "\u13FD"], ["\u1C80", "\u1C88"], ["\u1D00", "\u1D2B"], ["\u1D6B", "\u1D77"], ["\u1D79", "\u1D9A"], "\u1E01", "\u1E03", "\u1E05", "\u1E07", "\u1E09", "\u1E0B", "\u1E0D", "\u1E0F", "\u1E11", "\u1E13", "\u1E15", "\u1E17", "\u1E19", "\u1E1B", "\u1E1D", "\u1E1F", "\u1E21", "\u1E23", "\u1E25", "\u1E27", "\u1E29", "\u1E2B", "\u1E2D", "\u1E2F", "\u1E31", "\u1E33", "\u1E35", "\u1E37", "\u1E39", "\u1E3B", "\u1E3D", "\u1E3F", "\u1E41", "\u1E43", "\u1E45", "\u1E47", "\u1E49", "\u1E4B", "\u1E4D", "\u1E4F", "\u1E51", "\u1E53", "\u1E55", "\u1E57", "\u1E59", "\u1E5B", "\u1E5D", "\u1E5F", "\u1E61", "\u1E63", "\u1E65", "\u1E67", "\u1E69", "\u1E6B", "\u1E6D", "\u1E6F", "\u1E71", "\u1E73", "\u1E75", "\u1E77", "\u1E79", "\u1E7B", "\u1E7D", "\u1E7F", "\u1E81", "\u1E83", "\u1E85", "\u1E87", "\u1E89", "\u1E8B", "\u1E8D", "\u1E8F", "\u1E91", "\u1E93", ["\u1E95", "\u1E9D"], "\u1E9F", "\u1EA1", "\u1EA3", "\u1EA5", "\u1EA7", "\u1EA9", "\u1EAB", "\u1EAD", "\u1EAF", "\u1EB1", "\u1EB3", "\u1EB5", "\u1EB7", "\u1EB9", "\u1EBB", "\u1EBD", "\u1EBF", "\u1EC1", "\u1EC3", "\u1EC5", "\u1EC7", "\u1EC9", "\u1ECB", "\u1ECD", "\u1ECF", "\u1ED1", "\u1ED3", "\u1ED5", "\u1ED7", "\u1ED9", "\u1EDB", "\u1EDD", "\u1EDF", "\u1EE1", "\u1EE3", "\u1EE5", "\u1EE7", "\u1EE9", "\u1EEB", "\u1EED", "\u1EEF", "\u1EF1", "\u1EF3", "\u1EF5", "\u1EF7", "\u1EF9", "\u1EFB", "\u1EFD", ["\u1EFF", "\u1F07"], ["\u1F10", "\u1F15"], ["\u1F20", "\u1F27"], ["\u1F30", "\u1F37"], ["\u1F40", "\u1F45"], ["\u1F50", "\u1F57"], ["\u1F60", "\u1F67"], ["\u1F70", "\u1F7D"], ["\u1F80", "\u1F87"], ["\u1F90", "\u1F97"], ["\u1FA0", "\u1FA7"], ["\u1FB0", "\u1FB4"], ["\u1FB6", "\u1FB7"], "\u1FBE", ["\u1FC2", "\u1FC4"], ["\u1FC6", "\u1FC7"], ["\u1FD0", "\u1FD3"], ["\u1FD6", "\u1FD7"], ["\u1FE0", "\u1FE7"], ["\u1FF2", "\u1FF4"], ["\u1FF6", "\u1FF7"], "\u210A", ["\u210E", "\u210F"], "\u2113", "\u212F", "\u2134", "\u2139", ["\u213C", "\u213D"], ["\u2146", "\u2149"], "\u214E", "\u2184", ["\u2C30", "\u2C5E"], "\u2C61", ["\u2C65", "\u2C66"], "\u2C68", "\u2C6A", "\u2C6C", "\u2C71", ["\u2C73", "\u2C74"], ["\u2C76", "\u2C7B"], "\u2C81", "\u2C83", "\u2C85", "\u2C87", "\u2C89", "\u2C8B", "\u2C8D", "\u2C8F", "\u2C91", "\u2C93", "\u2C95", "\u2C97", "\u2C99", "\u2C9B", "\u2C9D", "\u2C9F", "\u2CA1", "\u2CA3", "\u2CA5", "\u2CA7", "\u2CA9", "\u2CAB", "\u2CAD", "\u2CAF", "\u2CB1", "\u2CB3", "\u2CB5", "\u2CB7", "\u2CB9", "\u2CBB", "\u2CBD", "\u2CBF", "\u2CC1", "\u2CC3", "\u2CC5", "\u2CC7", "\u2CC9", "\u2CCB", "\u2CCD", "\u2CCF", "\u2CD1", "\u2CD3", "\u2CD5", "\u2CD7", "\u2CD9", "\u2CDB", "\u2CDD", "\u2CDF", "\u2CE1", ["\u2CE3", "\u2CE4"], "\u2CEC", "\u2CEE", "\u2CF3", ["\u2D00", "\u2D25"], "\u2D27", "\u2D2D", "\uA641", "\uA643", "\uA645", "\uA647", "\uA649", "\uA64B", "\uA64D", "\uA64F", "\uA651", "\uA653", "\uA655", "\uA657", "\uA659", "\uA65B", "\uA65D", "\uA65F", "\uA661", "\uA663", "\uA665", "\uA667", "\uA669", "\uA66B", "\uA66D", "\uA681", "\uA683", "\uA685", "\uA687", "\uA689", "\uA68B", "\uA68D", "\uA68F", "\uA691", "\uA693", "\uA695", "\uA697", "\uA699", "\uA69B", "\uA723", "\uA725", "\uA727", "\uA729", "\uA72B", "\uA72D", ["\uA72F", "\uA731"], "\uA733", "\uA735", "\uA737", "\uA739", "\uA73B", "\uA73D", "\uA73F", "\uA741", "\uA743", "\uA745", "\uA747", "\uA749", "\uA74B", "\uA74D", "\uA74F", "\uA751", "\uA753", "\uA755", "\uA757", "\uA759", "\uA75B", "\uA75D", "\uA75F", "\uA761", "\uA763", "\uA765", "\uA767", "\uA769", "\uA76B", "\uA76D", "\uA76F", ["\uA771", "\uA778"], "\uA77A", "\uA77C", "\uA77F", "\uA781", "\uA783", "\uA785", "\uA787", "\uA78C", "\uA78E", "\uA791", ["\uA793", "\uA795"], "\uA797", "\uA799", "\uA79B", "\uA79D", "\uA79F", "\uA7A1", "\uA7A3", "\uA7A5", "\uA7A7", "\uA7A9", "\uA7AF", "\uA7B5", "\uA7B7", "\uA7B9", "\uA7FA", ["\uAB30", "\uAB5A"], ["\uAB60", "\uAB65"], ["\uAB70", "\uABBF"], ["\uFB00", "\uFB06"], ["\uFB13", "\uFB17"], ["\uFF41", "\uFF5A"]], false, false); + var peg$e50 = peg$classExpectation([["\u02B0", "\u02C1"], ["\u02C6", "\u02D1"], ["\u02E0", "\u02E4"], "\u02EC", "\u02EE", "\u0374", "\u037A", "\u0559", "\u0640", ["\u06E5", "\u06E6"], ["\u07F4", "\u07F5"], "\u07FA", "\u081A", "\u0824", "\u0828", "\u0971", "\u0E46", "\u0EC6", "\u10FC", "\u17D7", "\u1843", "\u1AA7", ["\u1C78", "\u1C7D"], ["\u1D2C", "\u1D6A"], "\u1D78", ["\u1D9B", "\u1DBF"], "\u2071", "\u207F", ["\u2090", "\u209C"], ["\u2C7C", "\u2C7D"], "\u2D6F", "\u2E2F", "\u3005", ["\u3031", "\u3035"], "\u303B", ["\u309D", "\u309E"], ["\u30FC", "\u30FE"], "\uA015", ["\uA4F8", "\uA4FD"], "\uA60C", "\uA67F", ["\uA69C", "\uA69D"], ["\uA717", "\uA71F"], "\uA770", "\uA788", ["\uA7F8", "\uA7F9"], "\uA9CF", "\uA9E6", "\uAA70", "\uAADD", ["\uAAF3", "\uAAF4"], ["\uAB5C", "\uAB5F"], "\uFF70", ["\uFF9E", "\uFF9F"]], false, false); + var peg$e51 = peg$classExpectation(["\xAA", "\xBA", "\u01BB", ["\u01C0", "\u01C3"], "\u0294", ["\u05D0", "\u05EA"], ["\u05EF", "\u05F2"], ["\u0620", "\u063F"], ["\u0641", "\u064A"], ["\u066E", "\u066F"], ["\u0671", "\u06D3"], "\u06D5", ["\u06EE", "\u06EF"], ["\u06FA", "\u06FC"], "\u06FF", "\u0710", ["\u0712", "\u072F"], ["\u074D", "\u07A5"], "\u07B1", ["\u07CA", "\u07EA"], ["\u0800", "\u0815"], ["\u0840", "\u0858"], ["\u0860", "\u086A"], ["\u08A0", "\u08B4"], ["\u08B6", "\u08BD"], ["\u0904", "\u0939"], "\u093D", "\u0950", ["\u0958", "\u0961"], ["\u0972", "\u0980"], ["\u0985", "\u098C"], ["\u098F", "\u0990"], ["\u0993", "\u09A8"], ["\u09AA", "\u09B0"], "\u09B2", ["\u09B6", "\u09B9"], "\u09BD", "\u09CE", ["\u09DC", "\u09DD"], ["\u09DF", "\u09E1"], ["\u09F0", "\u09F1"], "\u09FC", ["\u0A05", "\u0A0A"], ["\u0A0F", "\u0A10"], ["\u0A13", "\u0A28"], ["\u0A2A", "\u0A30"], ["\u0A32", "\u0A33"], ["\u0A35", "\u0A36"], ["\u0A38", "\u0A39"], ["\u0A59", "\u0A5C"], "\u0A5E", ["\u0A72", "\u0A74"], ["\u0A85", "\u0A8D"], ["\u0A8F", "\u0A91"], ["\u0A93", "\u0AA8"], ["\u0AAA", "\u0AB0"], ["\u0AB2", "\u0AB3"], ["\u0AB5", "\u0AB9"], "\u0ABD", "\u0AD0", ["\u0AE0", "\u0AE1"], "\u0AF9", ["\u0B05", "\u0B0C"], ["\u0B0F", "\u0B10"], ["\u0B13", "\u0B28"], ["\u0B2A", "\u0B30"], ["\u0B32", "\u0B33"], ["\u0B35", "\u0B39"], "\u0B3D", ["\u0B5C", "\u0B5D"], ["\u0B5F", "\u0B61"], "\u0B71", "\u0B83", ["\u0B85", "\u0B8A"], ["\u0B8E", "\u0B90"], ["\u0B92", "\u0B95"], ["\u0B99", "\u0B9A"], "\u0B9C", ["\u0B9E", "\u0B9F"], ["\u0BA3", "\u0BA4"], ["\u0BA8", "\u0BAA"], ["\u0BAE", "\u0BB9"], "\u0BD0", ["\u0C05", "\u0C0C"], ["\u0C0E", "\u0C10"], ["\u0C12", "\u0C28"], ["\u0C2A", "\u0C39"], "\u0C3D", ["\u0C58", "\u0C5A"], ["\u0C60", "\u0C61"], "\u0C80", ["\u0C85", "\u0C8C"], ["\u0C8E", "\u0C90"], ["\u0C92", "\u0CA8"], ["\u0CAA", "\u0CB3"], ["\u0CB5", "\u0CB9"], "\u0CBD", "\u0CDE", ["\u0CE0", "\u0CE1"], ["\u0CF1", "\u0CF2"], ["\u0D05", "\u0D0C"], ["\u0D0E", "\u0D10"], ["\u0D12", "\u0D3A"], "\u0D3D", "\u0D4E", ["\u0D54", "\u0D56"], ["\u0D5F", "\u0D61"], ["\u0D7A", "\u0D7F"], ["\u0D85", "\u0D96"], ["\u0D9A", "\u0DB1"], ["\u0DB3", "\u0DBB"], "\u0DBD", ["\u0DC0", "\u0DC6"], ["\u0E01", "\u0E30"], ["\u0E32", "\u0E33"], ["\u0E40", "\u0E45"], ["\u0E81", "\u0E82"], "\u0E84", ["\u0E87", "\u0E88"], "\u0E8A", "\u0E8D", ["\u0E94", "\u0E97"], ["\u0E99", "\u0E9F"], ["\u0EA1", "\u0EA3"], "\u0EA5", "\u0EA7", ["\u0EAA", "\u0EAB"], ["\u0EAD", "\u0EB0"], ["\u0EB2", "\u0EB3"], "\u0EBD", ["\u0EC0", "\u0EC4"], ["\u0EDC", "\u0EDF"], "\u0F00", ["\u0F40", "\u0F47"], ["\u0F49", "\u0F6C"], ["\u0F88", "\u0F8C"], ["\u1000", "\u102A"], "\u103F", ["\u1050", "\u1055"], ["\u105A", "\u105D"], "\u1061", ["\u1065", "\u1066"], ["\u106E", "\u1070"], ["\u1075", "\u1081"], "\u108E", ["\u1100", "\u1248"], ["\u124A", "\u124D"], ["\u1250", "\u1256"], "\u1258", ["\u125A", "\u125D"], ["\u1260", "\u1288"], ["\u128A", "\u128D"], ["\u1290", "\u12B0"], ["\u12B2", "\u12B5"], ["\u12B8", "\u12BE"], "\u12C0", ["\u12C2", "\u12C5"], ["\u12C8", "\u12D6"], ["\u12D8", "\u1310"], ["\u1312", "\u1315"], ["\u1318", "\u135A"], ["\u1380", "\u138F"], ["\u1401", "\u166C"], ["\u166F", "\u167F"], ["\u1681", "\u169A"], ["\u16A0", "\u16EA"], ["\u16F1", "\u16F8"], ["\u1700", "\u170C"], ["\u170E", "\u1711"], ["\u1720", "\u1731"], ["\u1740", "\u1751"], ["\u1760", "\u176C"], ["\u176E", "\u1770"], ["\u1780", "\u17B3"], "\u17DC", ["\u1820", "\u1842"], ["\u1844", "\u1878"], ["\u1880", "\u1884"], ["\u1887", "\u18A8"], "\u18AA", ["\u18B0", "\u18F5"], ["\u1900", "\u191E"], ["\u1950", "\u196D"], ["\u1970", "\u1974"], ["\u1980", "\u19AB"], ["\u19B0", "\u19C9"], ["\u1A00", "\u1A16"], ["\u1A20", "\u1A54"], ["\u1B05", "\u1B33"], ["\u1B45", "\u1B4B"], ["\u1B83", "\u1BA0"], ["\u1BAE", "\u1BAF"], ["\u1BBA", "\u1BE5"], ["\u1C00", "\u1C23"], ["\u1C4D", "\u1C4F"], ["\u1C5A", "\u1C77"], ["\u1CE9", "\u1CEC"], ["\u1CEE", "\u1CF1"], ["\u1CF5", "\u1CF6"], ["\u2135", "\u2138"], ["\u2D30", "\u2D67"], ["\u2D80", "\u2D96"], ["\u2DA0", "\u2DA6"], ["\u2DA8", "\u2DAE"], ["\u2DB0", "\u2DB6"], ["\u2DB8", "\u2DBE"], ["\u2DC0", "\u2DC6"], ["\u2DC8", "\u2DCE"], ["\u2DD0", "\u2DD6"], ["\u2DD8", "\u2DDE"], "\u3006", "\u303C", ["\u3041", "\u3096"], "\u309F", ["\u30A1", "\u30FA"], "\u30FF", ["\u3105", "\u312F"], ["\u3131", "\u318E"], ["\u31A0", "\u31BA"], ["\u31F0", "\u31FF"], ["\u3400", "\u4DB5"], ["\u4E00", "\u9FEF"], ["\uA000", "\uA014"], ["\uA016", "\uA48C"], ["\uA4D0", "\uA4F7"], ["\uA500", "\uA60B"], ["\uA610", "\uA61F"], ["\uA62A", "\uA62B"], "\uA66E", ["\uA6A0", "\uA6E5"], "\uA78F", "\uA7F7", ["\uA7FB", "\uA801"], ["\uA803", "\uA805"], ["\uA807", "\uA80A"], ["\uA80C", "\uA822"], ["\uA840", "\uA873"], ["\uA882", "\uA8B3"], ["\uA8F2", "\uA8F7"], "\uA8FB", ["\uA8FD", "\uA8FE"], ["\uA90A", "\uA925"], ["\uA930", "\uA946"], ["\uA960", "\uA97C"], ["\uA984", "\uA9B2"], ["\uA9E0", "\uA9E4"], ["\uA9E7", "\uA9EF"], ["\uA9FA", "\uA9FE"], ["\uAA00", "\uAA28"], ["\uAA40", "\uAA42"], ["\uAA44", "\uAA4B"], ["\uAA60", "\uAA6F"], ["\uAA71", "\uAA76"], "\uAA7A", ["\uAA7E", "\uAAAF"], "\uAAB1", ["\uAAB5", "\uAAB6"], ["\uAAB9", "\uAABD"], "\uAAC0", "\uAAC2", ["\uAADB", "\uAADC"], ["\uAAE0", "\uAAEA"], "\uAAF2", ["\uAB01", "\uAB06"], ["\uAB09", "\uAB0E"], ["\uAB11", "\uAB16"], ["\uAB20", "\uAB26"], ["\uAB28", "\uAB2E"], ["\uABC0", "\uABE2"], ["\uAC00", "\uD7A3"], ["\uD7B0", "\uD7C6"], ["\uD7CB", "\uD7FB"], ["\uF900", "\uFA6D"], ["\uFA70", "\uFAD9"], "\uFB1D", ["\uFB1F", "\uFB28"], ["\uFB2A", "\uFB36"], ["\uFB38", "\uFB3C"], "\uFB3E", ["\uFB40", "\uFB41"], ["\uFB43", "\uFB44"], ["\uFB46", "\uFBB1"], ["\uFBD3", "\uFD3D"], ["\uFD50", "\uFD8F"], ["\uFD92", "\uFDC7"], ["\uFDF0", "\uFDFB"], ["\uFE70", "\uFE74"], ["\uFE76", "\uFEFC"], ["\uFF66", "\uFF6F"], ["\uFF71", "\uFF9D"], ["\uFFA0", "\uFFBE"], ["\uFFC2", "\uFFC7"], ["\uFFCA", "\uFFCF"], ["\uFFD2", "\uFFD7"], ["\uFFDA", "\uFFDC"]], false, false); + var peg$e52 = peg$classExpectation(["\u01C5", "\u01C8", "\u01CB", "\u01F2", ["\u1F88", "\u1F8F"], ["\u1F98", "\u1F9F"], ["\u1FA8", "\u1FAF"], "\u1FBC", "\u1FCC", "\u1FFC"], false, false); + var peg$e53 = peg$classExpectation([["A", "Z"], ["\xC0", "\xD6"], ["\xD8", "\xDE"], "\u0100", "\u0102", "\u0104", "\u0106", "\u0108", "\u010A", "\u010C", "\u010E", "\u0110", "\u0112", "\u0114", "\u0116", "\u0118", "\u011A", "\u011C", "\u011E", "\u0120", "\u0122", "\u0124", "\u0126", "\u0128", "\u012A", "\u012C", "\u012E", "\u0130", "\u0132", "\u0134", "\u0136", "\u0139", "\u013B", "\u013D", "\u013F", "\u0141", "\u0143", "\u0145", "\u0147", "\u014A", "\u014C", "\u014E", "\u0150", "\u0152", "\u0154", "\u0156", "\u0158", "\u015A", "\u015C", "\u015E", "\u0160", "\u0162", "\u0164", "\u0166", "\u0168", "\u016A", "\u016C", "\u016E", "\u0170", "\u0172", "\u0174", "\u0176", ["\u0178", "\u0179"], "\u017B", "\u017D", ["\u0181", "\u0182"], "\u0184", ["\u0186", "\u0187"], ["\u0189", "\u018B"], ["\u018E", "\u0191"], ["\u0193", "\u0194"], ["\u0196", "\u0198"], ["\u019C", "\u019D"], ["\u019F", "\u01A0"], "\u01A2", "\u01A4", ["\u01A6", "\u01A7"], "\u01A9", "\u01AC", ["\u01AE", "\u01AF"], ["\u01B1", "\u01B3"], "\u01B5", ["\u01B7", "\u01B8"], "\u01BC", "\u01C4", "\u01C7", "\u01CA", "\u01CD", "\u01CF", "\u01D1", "\u01D3", "\u01D5", "\u01D7", "\u01D9", "\u01DB", "\u01DE", "\u01E0", "\u01E2", "\u01E4", "\u01E6", "\u01E8", "\u01EA", "\u01EC", "\u01EE", "\u01F1", "\u01F4", ["\u01F6", "\u01F8"], "\u01FA", "\u01FC", "\u01FE", "\u0200", "\u0202", "\u0204", "\u0206", "\u0208", "\u020A", "\u020C", "\u020E", "\u0210", "\u0212", "\u0214", "\u0216", "\u0218", "\u021A", "\u021C", "\u021E", "\u0220", "\u0222", "\u0224", "\u0226", "\u0228", "\u022A", "\u022C", "\u022E", "\u0230", "\u0232", ["\u023A", "\u023B"], ["\u023D", "\u023E"], "\u0241", ["\u0243", "\u0246"], "\u0248", "\u024A", "\u024C", "\u024E", "\u0370", "\u0372", "\u0376", "\u037F", "\u0386", ["\u0388", "\u038A"], "\u038C", ["\u038E", "\u038F"], ["\u0391", "\u03A1"], ["\u03A3", "\u03AB"], "\u03CF", ["\u03D2", "\u03D4"], "\u03D8", "\u03DA", "\u03DC", "\u03DE", "\u03E0", "\u03E2", "\u03E4", "\u03E6", "\u03E8", "\u03EA", "\u03EC", "\u03EE", "\u03F4", "\u03F7", ["\u03F9", "\u03FA"], ["\u03FD", "\u042F"], "\u0460", "\u0462", "\u0464", "\u0466", "\u0468", "\u046A", "\u046C", "\u046E", "\u0470", "\u0472", "\u0474", "\u0476", "\u0478", "\u047A", "\u047C", "\u047E", "\u0480", "\u048A", "\u048C", "\u048E", "\u0490", "\u0492", "\u0494", "\u0496", "\u0498", "\u049A", "\u049C", "\u049E", "\u04A0", "\u04A2", "\u04A4", "\u04A6", "\u04A8", "\u04AA", "\u04AC", "\u04AE", "\u04B0", "\u04B2", "\u04B4", "\u04B6", "\u04B8", "\u04BA", "\u04BC", "\u04BE", ["\u04C0", "\u04C1"], "\u04C3", "\u04C5", "\u04C7", "\u04C9", "\u04CB", "\u04CD", "\u04D0", "\u04D2", "\u04D4", "\u04D6", "\u04D8", "\u04DA", "\u04DC", "\u04DE", "\u04E0", "\u04E2", "\u04E4", "\u04E6", "\u04E8", "\u04EA", "\u04EC", "\u04EE", "\u04F0", "\u04F2", "\u04F4", "\u04F6", "\u04F8", "\u04FA", "\u04FC", "\u04FE", "\u0500", "\u0502", "\u0504", "\u0506", "\u0508", "\u050A", "\u050C", "\u050E", "\u0510", "\u0512", "\u0514", "\u0516", "\u0518", "\u051A", "\u051C", "\u051E", "\u0520", "\u0522", "\u0524", "\u0526", "\u0528", "\u052A", "\u052C", "\u052E", ["\u0531", "\u0556"], ["\u10A0", "\u10C5"], "\u10C7", "\u10CD", ["\u13A0", "\u13F5"], ["\u1C90", "\u1CBA"], ["\u1CBD", "\u1CBF"], "\u1E00", "\u1E02", "\u1E04", "\u1E06", "\u1E08", "\u1E0A", "\u1E0C", "\u1E0E", "\u1E10", "\u1E12", "\u1E14", "\u1E16", "\u1E18", "\u1E1A", "\u1E1C", "\u1E1E", "\u1E20", "\u1E22", "\u1E24", "\u1E26", "\u1E28", "\u1E2A", "\u1E2C", "\u1E2E", "\u1E30", "\u1E32", "\u1E34", "\u1E36", "\u1E38", "\u1E3A", "\u1E3C", "\u1E3E", "\u1E40", "\u1E42", "\u1E44", "\u1E46", "\u1E48", "\u1E4A", "\u1E4C", "\u1E4E", "\u1E50", "\u1E52", "\u1E54", "\u1E56", "\u1E58", "\u1E5A", "\u1E5C", "\u1E5E", "\u1E60", "\u1E62", "\u1E64", "\u1E66", "\u1E68", "\u1E6A", "\u1E6C", "\u1E6E", "\u1E70", "\u1E72", "\u1E74", "\u1E76", "\u1E78", "\u1E7A", "\u1E7C", "\u1E7E", "\u1E80", "\u1E82", "\u1E84", "\u1E86", "\u1E88", "\u1E8A", "\u1E8C", "\u1E8E", "\u1E90", "\u1E92", "\u1E94", "\u1E9E", "\u1EA0", "\u1EA2", "\u1EA4", "\u1EA6", "\u1EA8", "\u1EAA", "\u1EAC", "\u1EAE", "\u1EB0", "\u1EB2", "\u1EB4", "\u1EB6", "\u1EB8", "\u1EBA", "\u1EBC", "\u1EBE", "\u1EC0", "\u1EC2", "\u1EC4", "\u1EC6", "\u1EC8", "\u1ECA", "\u1ECC", "\u1ECE", "\u1ED0", "\u1ED2", "\u1ED4", "\u1ED6", "\u1ED8", "\u1EDA", "\u1EDC", "\u1EDE", "\u1EE0", "\u1EE2", "\u1EE4", "\u1EE6", "\u1EE8", "\u1EEA", "\u1EEC", "\u1EEE", "\u1EF0", "\u1EF2", "\u1EF4", "\u1EF6", "\u1EF8", "\u1EFA", "\u1EFC", "\u1EFE", ["\u1F08", "\u1F0F"], ["\u1F18", "\u1F1D"], ["\u1F28", "\u1F2F"], ["\u1F38", "\u1F3F"], ["\u1F48", "\u1F4D"], "\u1F59", "\u1F5B", "\u1F5D", "\u1F5F", ["\u1F68", "\u1F6F"], ["\u1FB8", "\u1FBB"], ["\u1FC8", "\u1FCB"], ["\u1FD8", "\u1FDB"], ["\u1FE8", "\u1FEC"], ["\u1FF8", "\u1FFB"], "\u2102", "\u2107", ["\u210B", "\u210D"], ["\u2110", "\u2112"], "\u2115", ["\u2119", "\u211D"], "\u2124", "\u2126", "\u2128", ["\u212A", "\u212D"], ["\u2130", "\u2133"], ["\u213E", "\u213F"], "\u2145", "\u2183", ["\u2C00", "\u2C2E"], "\u2C60", ["\u2C62", "\u2C64"], "\u2C67", "\u2C69", "\u2C6B", ["\u2C6D", "\u2C70"], "\u2C72", "\u2C75", ["\u2C7E", "\u2C80"], "\u2C82", "\u2C84", "\u2C86", "\u2C88", "\u2C8A", "\u2C8C", "\u2C8E", "\u2C90", "\u2C92", "\u2C94", "\u2C96", "\u2C98", "\u2C9A", "\u2C9C", "\u2C9E", "\u2CA0", "\u2CA2", "\u2CA4", "\u2CA6", "\u2CA8", "\u2CAA", "\u2CAC", "\u2CAE", "\u2CB0", "\u2CB2", "\u2CB4", "\u2CB6", "\u2CB8", "\u2CBA", "\u2CBC", "\u2CBE", "\u2CC0", "\u2CC2", "\u2CC4", "\u2CC6", "\u2CC8", "\u2CCA", "\u2CCC", "\u2CCE", "\u2CD0", "\u2CD2", "\u2CD4", "\u2CD6", "\u2CD8", "\u2CDA", "\u2CDC", "\u2CDE", "\u2CE0", "\u2CE2", "\u2CEB", "\u2CED", "\u2CF2", "\uA640", "\uA642", "\uA644", "\uA646", "\uA648", "\uA64A", "\uA64C", "\uA64E", "\uA650", "\uA652", "\uA654", "\uA656", "\uA658", "\uA65A", "\uA65C", "\uA65E", "\uA660", "\uA662", "\uA664", "\uA666", "\uA668", "\uA66A", "\uA66C", "\uA680", "\uA682", "\uA684", "\uA686", "\uA688", "\uA68A", "\uA68C", "\uA68E", "\uA690", "\uA692", "\uA694", "\uA696", "\uA698", "\uA69A", "\uA722", "\uA724", "\uA726", "\uA728", "\uA72A", "\uA72C", "\uA72E", "\uA732", "\uA734", "\uA736", "\uA738", "\uA73A", "\uA73C", "\uA73E", "\uA740", "\uA742", "\uA744", "\uA746", "\uA748", "\uA74A", "\uA74C", "\uA74E", "\uA750", "\uA752", "\uA754", "\uA756", "\uA758", "\uA75A", "\uA75C", "\uA75E", "\uA760", "\uA762", "\uA764", "\uA766", "\uA768", "\uA76A", "\uA76C", "\uA76E", "\uA779", "\uA77B", ["\uA77D", "\uA77E"], "\uA780", "\uA782", "\uA784", "\uA786", "\uA78B", "\uA78D", "\uA790", "\uA792", "\uA796", "\uA798", "\uA79A", "\uA79C", "\uA79E", "\uA7A0", "\uA7A2", "\uA7A4", "\uA7A6", "\uA7A8", ["\uA7AA", "\uA7AE"], ["\uA7B0", "\uA7B4"], "\uA7B6", "\uA7B8", ["\uFF21", "\uFF3A"]], false, false); + var peg$e54 = peg$classExpectation([["\u16EE", "\u16F0"], ["\u2160", "\u2182"], ["\u2185", "\u2188"], "\u3007", ["\u3021", "\u3029"], ["\u3038", "\u303A"], ["\uA6E6", "\uA6EF"]], false, false); + + var peg$f0 = function() { return parseFloat(text()); }; + var peg$f1 = function() { return parseInt(text()); }; + var peg$f2 = function(chars) { const s = chars.join(""); return (s === ".") || (s === "_") }; + var peg$f3 = function(chars) { return new AtomStub(chars.join("")) }; + var peg$f4 = function(s) { return s }; + var peg$f5 = function(s, stepsPerCycle) { s.arguments_.stepsPerCycle = stepsPerCycle ; return s; }; + var peg$f6 = function(a) { return a }; + var peg$f7 = function(s) { s.arguments_.alignment = 'polymeter_slowcat'; return s; }; + var peg$f8 = function(a) { return x => x.options_['weight'] = (x.options_['weight'] ?? 1) + (a ?? 2) - 1 }; + var peg$f9 = function(a) { return x => {// A bit fiddly, to support both x!4 and x!!! as equivalent.. + const reps = (x.options_['reps'] ?? 1) + (a ?? 2) - 1; + x.options_['reps'] = reps; + x.options_['ops'] = x.options_['ops'].filter(x => x.type_ !== "replicate"); + x.options_['ops'].push({ type_: "replicate", arguments_ :{ amount:reps }}); + x.options_['weight'] = reps; + } + }; + var peg$f10 = function(p, s, r) { return x => x.options_['ops'].push({ type_: "bjorklund", arguments_ :{ pulse: p, step:s, rotation:r }}) }; + var peg$f11 = function(a) { return x => x.options_['ops'].push({ type_: "stretch", arguments_ :{ amount:a, type: 'slow' }}) }; + var peg$f12 = function(a) { return x => x.options_['ops'].push({ type_: "stretch", arguments_ :{ amount:a, type: 'fast' }}) }; + var peg$f13 = function(a) { return x => x.options_['ops'].push({ type_: "degradeBy", arguments_ :{ amount:a, seed: seed++ } }) }; + var peg$f14 = function(s) { return x => x.options_['ops'].push({ type_: "tail", arguments_ :{ element:s } }) }; + var peg$f15 = function(s) { return x => x.options_['ops'].push({ type_: "range", arguments_ :{ element:s } }) }; + var peg$f16 = function(s, ops) { const result = new ElementStub(s, {ops: [], weight: 1, reps: 1}); + for (const op of ops) { + op(result); + } + return result; + }; + var peg$f17 = function(_steps, s) { return new PatternStub(s, 'fastcat', undefined, !!_steps); }; + var peg$f18 = function(tail) { return { alignment: 'stack', list: tail }; }; + var peg$f19 = function(tail) { return { alignment: 'rand', list: tail, seed: seed++ }; }; + var peg$f20 = function(tail) { return { alignment: 'feet', list: tail, seed: seed++ }; }; + var peg$f21 = function(head, tail) {if (tail && tail.list.length > 0) { return new PatternStub([head, ...tail.list], tail.alignment, tail.seed); } else { return head; } }; + var peg$f22 = function(head, tail) { return new PatternStub(tail ? [head, ...tail.list] : [head], 'polymeter'); }; + var peg$f23 = function(sc) { return sc; }; + var peg$f24 = function(s) { return { name: "struct", args: { mini:s }}}; + var peg$f25 = function(s) { return { name: "target", args : { name:s}}}; + var peg$f26 = function(p, s, r) { return { name: "bjorklund", args :{ pulse: p, step:parseInt(s) }}}; + var peg$f27 = function(a) { return { name: "stretch", args :{ amount: a}}}; + var peg$f28 = function(a) { return { name: "shift", args :{ amount: "-"+a}}}; + var peg$f29 = function(a) { return { name: "shift", args :{ amount: a}}}; + var peg$f30 = function(a) { return { name: "stretch", args :{ amount: "1/"+a}}}; + var peg$f31 = function(s) { return { name: "scale", args :{ scale: s.join("")}}}; + var peg$f32 = function(s, v) { return v}; + var peg$f33 = function(s, ss) { ss.unshift(s); return new PatternStub(ss, 'slowcat'); }; + var peg$f34 = function(sg) {return sg}; + var peg$f35 = function(o, soc) { return new OperatorStub(o.name,o.args,soc)}; + var peg$f36 = function(sc) { return sc }; + var peg$f37 = function(c) { return c }; + var peg$f38 = function(v) { return new CommandStub("setcps", { value: v})}; + var peg$f39 = function(v) { return new CommandStub("setcps", { value: (v/120/2)})}; + var peg$f40 = function() { return new CommandStub("hush")}; + var peg$currPos = options.peg$currPos | 0; + var peg$savedPos = peg$currPos; + var peg$posDetailsCache = [{ line: 1, column: 1 }]; + var peg$maxFailPos = peg$currPos; + var peg$maxFailExpected = options.peg$maxFailExpected || []; + var peg$silentFails = options.peg$silentFails | 0; + + var peg$result; + + if (options.startRule) { + if (!(options.startRule in peg$startRuleFunctions)) { + throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); + } + + peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; + } + + function text() { + return input.substring(peg$savedPos, peg$currPos); + } + + function offset() { + return peg$savedPos; + } + + function range() { + return { + source: peg$source, + start: peg$savedPos, + end: peg$currPos + }; + } + + function location() { + return peg$computeLocation(peg$savedPos, peg$currPos); + } + + function expected(description, location) { + location = location !== undefined + ? location + : peg$computeLocation(peg$savedPos, peg$currPos); + + throw peg$buildStructuredError( + [peg$otherExpectation(description)], + input.substring(peg$savedPos, peg$currPos), + location + ); + } + + function error(message, location) { + location = location !== undefined + ? location + : peg$computeLocation(peg$savedPos, peg$currPos); + + throw peg$buildSimpleError(message, location); + } + + function peg$literalExpectation(text, ignoreCase) { + return { type: "literal", text: text, ignoreCase: ignoreCase }; + } + + function peg$classExpectation(parts, inverted, ignoreCase) { + return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; + } + + function peg$anyExpectation() { + return { type: "any" }; + } + + function peg$endExpectation() { + return { type: "end" }; + } + + function peg$otherExpectation(description) { + return { type: "other", description: description }; + } + + function peg$computePosDetails(pos) { + var details = peg$posDetailsCache[pos]; + var p; + + if (details) { + return details; + } else { + if (pos >= peg$posDetailsCache.length) { + p = peg$posDetailsCache.length - 1; + } else { + p = pos; + while (!peg$posDetailsCache[--p]) {} + } + + details = peg$posDetailsCache[p]; + details = { + line: details.line, + column: details.column + }; + + while (p < pos) { + if (input.charCodeAt(p) === 10) { + details.line++; + details.column = 1; + } else { + details.column++; + } + + p++; + } + + peg$posDetailsCache[pos] = details; + + return details; + } + } + + function peg$computeLocation(startPos, endPos, offset) { + var startPosDetails = peg$computePosDetails(startPos); + var endPosDetails = peg$computePosDetails(endPos); + + var res = { + source: peg$source, + start: { + offset: startPos, + line: startPosDetails.line, + column: startPosDetails.column + }, + end: { + offset: endPos, + line: endPosDetails.line, + column: endPosDetails.column + } + }; + if (offset && peg$source && (typeof peg$source.offset === "function")) { + res.start = peg$source.offset(res.start); + res.end = peg$source.offset(res.end); + } + return res; + } + + function peg$fail(expected) { + if (peg$currPos < peg$maxFailPos) { return; } + + if (peg$currPos > peg$maxFailPos) { + peg$maxFailPos = peg$currPos; + peg$maxFailExpected = []; + } + + peg$maxFailExpected.push(expected); + } + + function peg$buildSimpleError(message, location) { + return new peg$SyntaxError(message, null, null, location); + } + + function peg$buildStructuredError(expected, found, location) { + return new peg$SyntaxError( + peg$SyntaxError.buildMessage(expected, found), + expected, + found, + location + ); + } + + function peg$parsestart() { + var s0; + + s0 = peg$parsestatement(); + + return s0; + } + + function peg$parsenumber() { + var s0, s1, s2, s3, s4; + + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parseminus(); + if (s1 === peg$FAILED) { + s1 = null; + } + s2 = peg$parseint(); + if (s2 !== peg$FAILED) { + s3 = peg$parsefrac(); + if (s3 === peg$FAILED) { + s3 = null; + } + s4 = peg$parseexp(); + if (s4 === peg$FAILED) { + s4 = null; + } + peg$savedPos = s0; + s0 = peg$f0(); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e0); } + } + + return s0; + } + + function peg$parsedecimal_point() { + var s0; + + if (input.charCodeAt(peg$currPos) === 46) { + s0 = peg$c0; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e1); } + } + + return s0; + } + + function peg$parsedigit1_9() { + var s0; + + s0 = input.charAt(peg$currPos); + if (peg$r0.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e2); } + } + + return s0; + } + + function peg$parsee() { + var s0; + + s0 = input.charAt(peg$currPos); + if (peg$r1.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e3); } + } + + return s0; + } + + function peg$parseexp() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parsee(); + if (s1 !== peg$FAILED) { + s2 = input.charAt(peg$currPos); + if (peg$r2.test(s2)) { + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e4); } + } + if (s2 === peg$FAILED) { + s2 = null; + } + s3 = []; + s4 = peg$parseDIGIT(); + if (s4 !== peg$FAILED) { + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parseDIGIT(); + } + } else { + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsefrac() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parsedecimal_point(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseDIGIT(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseDIGIT(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseint() { + var s0, s1, s2, s3; + + s0 = peg$parsezero(); + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parsedigit1_9(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseDIGIT(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseDIGIT(); + } + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseintneg() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$parseminus(); + if (s1 === peg$FAILED) { + s1 = null; + } + s2 = peg$parseint(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f1(); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseminus() { + var s0; + + if (input.charCodeAt(peg$currPos) === 45) { + s0 = peg$c1; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e5); } + } + + return s0; + } + + function peg$parseplus() { + var s0; + + if (input.charCodeAt(peg$currPos) === 43) { + s0 = peg$c2; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e6); } + } + + return s0; + } + + function peg$parsezero() { + var s0; + + if (input.charCodeAt(peg$currPos) === 48) { + s0 = peg$c3; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e7); } + } + + return s0; + } + + function peg$parseDIGIT() { + var s0; + + s0 = input.charAt(peg$currPos); + if (peg$r3.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e8); } + } + + return s0; + } + + function peg$parsews() { + var s0, s1; + + peg$silentFails++; + s0 = []; + s1 = input.charAt(peg$currPos); + if (peg$r4.test(s1)) { + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e10); } + } + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = input.charAt(peg$currPos); + if (peg$r4.test(s1)) { + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e10); } + } + } + peg$silentFails--; + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e9); } + + return s0; + } + + function peg$parsecomma() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 44) { + s2 = peg$c4; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e11); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parsews(); + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsepipe() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 124) { + s2 = peg$c5; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e12); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parsews(); + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsedot() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 46) { + s2 = peg$c0; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e1); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parsews(); + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsequote() { + var s0; + + s0 = input.charAt(peg$currPos); + if (peg$r5.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e13); } + } + + return s0; + } + + function peg$parsestep_char() { + var s0, s1; + + peg$silentFails++; + s0 = input.charAt(peg$currPos); + if (peg$r6.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e15); } + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e14); } + } + + return s0; + } + + function peg$parsestep() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parsews(); + s2 = []; + s3 = peg$parsestep_char(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsestep_char(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parsews(); + peg$savedPos = peg$currPos; + s4 = peg$f2(s2); + if (s4) { + s4 = peg$FAILED; + } else { + s4 = undefined; + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f3(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsesub_cycle() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 91) { + s2 = peg$c6; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e16); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parsews(); + s4 = peg$parsestack_or_choose(); + if (s4 !== peg$FAILED) { + s5 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 93) { + s6 = peg$c7; + peg$currPos++; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e17); } + } + if (s6 !== peg$FAILED) { + s7 = peg$parsews(); + peg$savedPos = s0; + s0 = peg$f4(s4); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsepolymeter() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; + + s0 = peg$currPos; + s1 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 123) { + s2 = peg$c8; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e18); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parsews(); + s4 = peg$parsepolymeter_stack(); + if (s4 !== peg$FAILED) { + s5 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 125) { + s6 = peg$c9; + peg$currPos++; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e19); } + } + if (s6 !== peg$FAILED) { + s7 = peg$parsepolymeter_steps(); + if (s7 === peg$FAILED) { + s7 = null; + } + s8 = peg$parsews(); + peg$savedPos = s0; + s0 = peg$f5(s4, s7); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsepolymeter_steps() { + var s0, s1, s2; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 37) { + s1 = peg$c10; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e20); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseslice(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f6(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseslow_sequence() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 60) { + s2 = peg$c11; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e21); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parsews(); + s4 = peg$parsepolymeter_stack(); + if (s4 !== peg$FAILED) { + s5 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 62) { + s6 = peg$c12; + peg$currPos++; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e22); } + } + if (s6 !== peg$FAILED) { + s7 = peg$parsews(); + peg$savedPos = s0; + s0 = peg$f7(s4); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseslice() { + var s0; + + s0 = peg$parsestep(); + if (s0 === peg$FAILED) { + s0 = peg$parsesub_cycle(); + if (s0 === peg$FAILED) { + s0 = peg$parsepolymeter(); + if (s0 === peg$FAILED) { + s0 = peg$parseslow_sequence(); + } + } + } + + return s0; + } + + function peg$parseslice_op() { + var s0; + + s0 = peg$parseop_weight(); + if (s0 === peg$FAILED) { + s0 = peg$parseop_bjorklund(); + if (s0 === peg$FAILED) { + s0 = peg$parseop_slow(); + if (s0 === peg$FAILED) { + s0 = peg$parseop_fast(); + if (s0 === peg$FAILED) { + s0 = peg$parseop_replicate(); + if (s0 === peg$FAILED) { + s0 = peg$parseop_degrade(); + if (s0 === peg$FAILED) { + s0 = peg$parseop_tail(); + if (s0 === peg$FAILED) { + s0 = peg$parseop_range(); + } + } + } + } + } + } + } + + return s0; + } + + function peg$parseop_weight() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parsews(); + s2 = input.charAt(peg$currPos); + if (peg$r7.test(s2)) { + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e23); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parsenumber(); + if (s3 === peg$FAILED) { + s3 = null; + } + peg$savedPos = s0; + s0 = peg$f8(s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseop_replicate() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 33) { + s2 = peg$c13; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e24); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parsenumber(); + if (s3 === peg$FAILED) { + s3 = null; + } + peg$savedPos = s0; + s0 = peg$f9(s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseop_bjorklund() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 40) { + s1 = peg$c14; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e25); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = peg$parseslice_with_ops(); + if (s3 !== peg$FAILED) { + s4 = peg$parsews(); + s5 = peg$parsecomma(); + if (s5 !== peg$FAILED) { + s6 = peg$parsews(); + s7 = peg$parseslice_with_ops(); + if (s7 !== peg$FAILED) { + s8 = peg$parsews(); + s9 = peg$parsecomma(); + if (s9 === peg$FAILED) { + s9 = null; + } + s10 = peg$parsews(); + s11 = peg$parseslice_with_ops(); + if (s11 === peg$FAILED) { + s11 = null; + } + s12 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 41) { + s13 = peg$c15; + peg$currPos++; + } else { + s13 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e26); } + } + if (s13 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f10(s3, s7, s11); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseop_slow() { + var s0, s1, s2; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 47) { + s1 = peg$c16; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e27); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseslice(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f11(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseop_fast() { + var s0, s1, s2; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 42) { + s1 = peg$c17; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e28); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseslice(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f12(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseop_degrade() { + var s0, s1, s2; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 63) { + s1 = peg$c18; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e29); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsenumber(); + if (s2 === peg$FAILED) { + s2 = null; + } + peg$savedPos = s0; + s0 = peg$f13(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseop_tail() { + var s0, s1, s2; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 58) { + s1 = peg$c19; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e30); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseslice(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f14(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseop_range() { + var s0, s1, s2; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c20) { + s1 = peg$c20; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e31); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseslice(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f15(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseslice_with_ops() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parseslice(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseslice_op(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseslice_op(); + } + peg$savedPos = s0; + s0 = peg$f16(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsesequence() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 94) { + s1 = peg$c21; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e32); } + } + if (s1 === peg$FAILED) { + s1 = null; + } + s2 = []; + s3 = peg$parseslice_with_ops(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseslice_with_ops(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f17(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsestack_tail() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = []; + s2 = peg$currPos; + s3 = peg$parsecomma(); + if (s3 !== peg$FAILED) { + s4 = peg$parsesequence(); + if (s4 !== peg$FAILED) { + s2 = s4; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$currPos; + s3 = peg$parsecomma(); + if (s3 !== peg$FAILED) { + s4 = peg$parsesequence(); + if (s4 !== peg$FAILED) { + s2 = s4; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } + } else { + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f18(s1); + } + s0 = s1; + + return s0; + } + + function peg$parsechoose_tail() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = []; + s2 = peg$currPos; + s3 = peg$parsepipe(); + if (s3 !== peg$FAILED) { + s4 = peg$parsesequence(); + if (s4 !== peg$FAILED) { + s2 = s4; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$currPos; + s3 = peg$parsepipe(); + if (s3 !== peg$FAILED) { + s4 = peg$parsesequence(); + if (s4 !== peg$FAILED) { + s2 = s4; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } + } else { + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f19(s1); + } + s0 = s1; + + return s0; + } + + function peg$parsedot_tail() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = []; + s2 = peg$currPos; + s3 = peg$parsedot(); + if (s3 !== peg$FAILED) { + s4 = peg$parsesequence(); + if (s4 !== peg$FAILED) { + s2 = s4; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$currPos; + s3 = peg$parsedot(); + if (s3 !== peg$FAILED) { + s4 = peg$parsesequence(); + if (s4 !== peg$FAILED) { + s2 = s4; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } + } else { + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f20(s1); + } + s0 = s1; + + return s0; + } + + function peg$parsestack_or_choose() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$parsesequence(); + if (s1 !== peg$FAILED) { + s2 = peg$parsestack_tail(); + if (s2 === peg$FAILED) { + s2 = peg$parsechoose_tail(); + if (s2 === peg$FAILED) { + s2 = peg$parsedot_tail(); + } + } + if (s2 === peg$FAILED) { + s2 = null; + } + peg$savedPos = s0; + s0 = peg$f21(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsepolymeter_stack() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$parsesequence(); + if (s1 !== peg$FAILED) { + s2 = peg$parsestack_tail(); + if (s2 === peg$FAILED) { + s2 = null; + } + peg$savedPos = s0; + s0 = peg$f22(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsemini() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + s1 = peg$parsews(); + s2 = peg$parsequote(); + if (s2 !== peg$FAILED) { + s3 = peg$parsews(); + s4 = peg$parsestack_or_choose(); + if (s4 !== peg$FAILED) { + s5 = peg$parsews(); + s6 = peg$parsequote(); + if (s6 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f23(s4); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseoperator() { + var s0; + + s0 = peg$parsescale(); + if (s0 === peg$FAILED) { + s0 = peg$parseslow(); + if (s0 === peg$FAILED) { + s0 = peg$parsefast(); + if (s0 === peg$FAILED) { + s0 = peg$parsetarget(); + if (s0 === peg$FAILED) { + s0 = peg$parsebjorklund(); + if (s0 === peg$FAILED) { + s0 = peg$parsestruct(); + if (s0 === peg$FAILED) { + s0 = peg$parserotR(); + if (s0 === peg$FAILED) { + s0 = peg$parserotL(); + } + } + } + } + } + } + } + + return s0; + } + + function peg$parsestruct() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c22) { + s1 = peg$c22; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e33); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = peg$parsemini_or_operator(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f24(s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsetarget() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c23) { + s1 = peg$c23; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e34); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = peg$parsequote(); + if (s3 !== peg$FAILED) { + s4 = peg$parsestep(); + if (s4 !== peg$FAILED) { + s5 = peg$parsequote(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f25(s4); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsebjorklund() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c24) { + s1 = peg$c24; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e35); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = peg$parseint(); + if (s3 !== peg$FAILED) { + s4 = peg$parsews(); + s5 = peg$parseint(); + if (s5 !== peg$FAILED) { + s6 = peg$parsews(); + s7 = peg$parseint(); + if (s7 === peg$FAILED) { + s7 = null; + } + peg$savedPos = s0; + s0 = peg$f26(s3, s5, s7); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseslow() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c25) { + s1 = peg$c25; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e36); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = peg$parsenumber(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f27(s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parserotL() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c26) { + s1 = peg$c26; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e37); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = peg$parsenumber(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f28(s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parserotR() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c27) { + s1 = peg$c27; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e38); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = peg$parsenumber(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f29(s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsefast() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c28) { + s1 = peg$c28; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e39); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = peg$parsenumber(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f30(s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsescale() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c29) { + s1 = peg$c29; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e40); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = peg$parsequote(); + if (s3 !== peg$FAILED) { + s4 = []; + s5 = peg$parsestep_char(); + if (s5 !== peg$FAILED) { + while (s5 !== peg$FAILED) { + s4.push(s5); + s5 = peg$parsestep_char(); + } + } else { + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s5 = peg$parsequote(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f31(s4); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsecomment() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c30) { + s1 = peg$c30; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e41); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = input.charAt(peg$currPos); + if (peg$r8.test(s3)) { + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e42); } + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = input.charAt(peg$currPos); + if (peg$r8.test(s3)) { + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e42); } + } + } + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsecat() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c31) { + s1 = peg$c31; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e43); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 91) { + s3 = peg$c6; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e16); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parsews(); + s5 = peg$parsemini_or_operator(); + if (s5 !== peg$FAILED) { + s6 = []; + s7 = peg$currPos; + s8 = peg$parsecomma(); + if (s8 !== peg$FAILED) { + s9 = peg$parsemini_or_operator(); + if (s9 !== peg$FAILED) { + peg$savedPos = s7; + s7 = peg$f32(s5, s9); + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + while (s7 !== peg$FAILED) { + s6.push(s7); + s7 = peg$currPos; + s8 = peg$parsecomma(); + if (s8 !== peg$FAILED) { + s9 = peg$parsemini_or_operator(); + if (s9 !== peg$FAILED) { + peg$savedPos = s7; + s7 = peg$f32(s5, s9); + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } + s7 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 93) { + s8 = peg$c7; + peg$currPos++; + } else { + s8 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e17); } + } + if (s8 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f33(s5, s6); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsemini_or_group() { + var s0; + + s0 = peg$parsecat(); + if (s0 === peg$FAILED) { + s0 = peg$parsemini(); + } + + return s0; + } + + function peg$parsemini_or_operator() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = peg$parsemini_or_group(); + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = []; + s4 = peg$parsecomment(); + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parsecomment(); + } + peg$savedPos = s0; + s0 = peg$f34(s1); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseoperator(); + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + if (input.charCodeAt(peg$currPos) === 36) { + s3 = peg$c32; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e44); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parsews(); + s5 = peg$parsemini_or_operator(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f35(s1, s5); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parsesequ_or_operator_or_comment() { + var s0, s1; + + s0 = peg$currPos; + s1 = peg$parsemini_or_operator(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f36(s1); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$parsecomment(); + } + + return s0; + } + + function peg$parsemini_definition() { + var s0; + + s0 = peg$parsesequ_or_operator_or_comment(); + + return s0; + } + + function peg$parsecommand() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parsews(); + s2 = peg$parsesetcps(); + if (s2 === peg$FAILED) { + s2 = peg$parsesetbpm(); + if (s2 === peg$FAILED) { + s2 = peg$parsehush(); + } + } + if (s2 !== peg$FAILED) { + s3 = peg$parsews(); + peg$savedPos = s0; + s0 = peg$f37(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsesetcps() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c33) { + s1 = peg$c33; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e45); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = peg$parsenumber(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f38(s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsesetbpm() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c34) { + s1 = peg$c34; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e46); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parsews(); + s3 = peg$parsenumber(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f39(s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsehush() { + var s0, s1; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c35) { + s1 = peg$c35; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e47); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f40(); + } + s0 = s1; + + return s0; + } + + function peg$parsestatement() { + var s0; + + s0 = peg$parsemini_definition(); + if (s0 === peg$FAILED) { + s0 = peg$parsecommand(); + } + + return s0; + } + + function peg$parseunicode_letter() { + var s0; + + s0 = input.charAt(peg$currPos); + if (peg$r9.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e48); } + } + + return s0; + } + + function peg$parseLl() { + var s0; + + s0 = input.charAt(peg$currPos); + if (peg$r10.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e49); } + } + + return s0; + } + + function peg$parseLm() { + var s0; + + s0 = input.charAt(peg$currPos); + if (peg$r11.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e50); } + } + + return s0; + } + + function peg$parseLo() { + var s0; + + s0 = input.charAt(peg$currPos); + if (peg$r12.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e51); } + } + + return s0; + } + + function peg$parseLt() { + var s0; + + s0 = input.charAt(peg$currPos); + if (peg$r13.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e52); } + } + + return s0; + } + + function peg$parseLu() { + var s0; + + s0 = input.charAt(peg$currPos); + if (peg$r14.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e53); } + } + + return s0; + } + + function peg$parseNl() { + var s0; + + s0 = input.charAt(peg$currPos); + if (peg$r15.test(s0)) { + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e54); } + } + + return s0; + } + + + var AtomStub = function(source) + { + this.type_ = "atom"; + this.source_ = source; + this.location_ = location(); + } + + var PatternStub = function(source, alignment, seed, _steps) + { + this.type_ = "pattern"; + this.arguments_ = { alignment: alignment, _steps: _steps }; + if (seed !== undefined) { + this.arguments_.seed = seed; + } + this.source_ = source; + } + + var OperatorStub = function(name, args, source) + { + this.type_ = name; + this.arguments_ = args; + this.source_ = source; + } + + var ElementStub = function(source, options) + { + this.type_ = "element"; + this.source_ = source; + this.options_ = options; + this.location_ = location(); + } + + var CommandStub = function(name, options) + { + this.type_ = "command"; + this.name_ = name; + this.options_ = options; + } + + var seed = 0; + + peg$result = peg$startRuleFunction(); + + if (options.peg$library) { + return /** @type {any} */ ({ + peg$result, + peg$currPos, + peg$FAILED, + peg$maxFailExpected, + peg$maxFailPos + }); + } + if (peg$result !== peg$FAILED && peg$currPos === input.length) { + return peg$result; + } else { + if (peg$result !== peg$FAILED && peg$currPos < input.length) { + peg$fail(peg$endExpectation()); + } + + throw peg$buildStructuredError( + peg$maxFailExpected, + peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, + peg$maxFailPos < input.length + ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) + : peg$computeLocation(peg$maxFailPos, peg$maxFailPos) + ); + } +} + +const peg$allowedStartRules = [ + "start" +]; + +export { + peg$allowedStartRules as StartRules, + peg$SyntaxError as SyntaxError, + peg$parse as parse +}; diff --git a/src/strudel/mini/krill.pegjs b/src/strudel/mini/krill.pegjs new file mode 100644 index 0000000..8af82ca --- /dev/null +++ b/src/strudel/mini/krill.pegjs @@ -0,0 +1,303 @@ +/* +krill.pegjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +// Some terminology: +// mini(notation) = a series of elements placed between quotes +// a stack = a series of vertically aligned slices sharing the same overall length +// a sequence = a series of horizontally aligned elements +// a choose = a series of elements, one of which is chosen at random + + +{ + var AtomStub = function(source) + { + this.type_ = "atom"; + this.source_ = source; + this.location_ = location(); + } + + var PatternStub = function(source, alignment, seed, _steps) + { + this.type_ = "pattern"; + this.arguments_ = { alignment: alignment, _steps: _steps }; + if (seed !== undefined) { + this.arguments_.seed = seed; + } + this.source_ = source; + } + + var OperatorStub = function(name, args, source) + { + this.type_ = name; + this.arguments_ = args; + this.source_ = source; + } + + var ElementStub = function(source, options) + { + this.type_ = "element"; + this.source_ = source; + this.options_ = options; + this.location_ = location(); + } + + var CommandStub = function(name, options) + { + this.type_ = "command"; + this.name_ = name; + this.options_ = options; + } + + var seed = 0; +} + +start = statement + +// ----- Numbers ----- + +number "number" + = minus? int frac? exp? { return parseFloat(text()); } + +decimal_point + = "." + +digit1_9 + = [1-9] + +e + = [eE] + +exp + = e (minus / plus)? DIGIT+ + +frac + = decimal_point DIGIT+ + +int + = zero / (digit1_9 DIGIT*) + +intneg + = minus? int { return parseInt(text()); } + +minus + = "-" + +plus + = "+" + +zero + = "0" + +DIGIT = [0-9] + +// ------------------ delimiters --------------------------- + +ws "whitespace" = [ \n\r\t\u00A0]* +comma = ws "," ws +pipe = ws "|" ws +dot = ws "." ws +quote = '"' / "'" + +// ------------------ steps and cycles --------------------------- + +// single step definition (e.g bd) +step_char "a letter, a number, \"-\", \"#\", \".\", \"^\", \"_\"" = + unicode_letter / [0-9~] / "-" / "#" / "." / "^" / "_" + +step = ws chars:step_char+ ws !{ const s = chars.join(""); return (s === ".") || (s === "_") } { return new AtomStub(chars.join("")) } + +// define a sub cycle e.g. [1 2, 3 [4]] +sub_cycle = ws "[" ws s:stack_or_choose ws "]" ws { return s } + +// define a polymeter e.g. {1 2, 3 4 5} +polymeter = ws "{" ws s:polymeter_stack ws "}" stepsPerCycle:polymeter_steps? ws + { s.arguments_.stepsPerCycle = stepsPerCycle ; return s; } + +polymeter_steps = "%"a:slice + { return a } + +// define a step-per-cycle timeline e.g <1 3 [3 5]>. We simply defer to a sequence and +// change the alignment to slowcat +slow_sequence = ws "<" ws s:polymeter_stack ws ">" ws + { s.arguments_.alignment = 'polymeter_slowcat'; return s; } + +// a slice is either a single step or a sub cycle +slice = step / sub_cycle / polymeter / slow_sequence + +// slice modifier affects the timing/size of a slice (e.g. [a b c]@3) +// at this point, we assume we can represent them as regular sequence operators +slice_op = op_weight / op_bjorklund / op_slow / op_fast / op_replicate / op_degrade / op_tail / op_range + +op_weight = ws ("@" / "_") a:number? + { return x => x.options_['weight'] = (x.options_['weight'] ?? 1) + (a ?? 2) - 1 } + +op_replicate = ws "!" a:number? + { return x => {// A bit fiddly, to support both x!4 and x!!! as equivalent.. + const reps = (x.options_['reps'] ?? 1) + (a ?? 2) - 1; + x.options_['reps'] = reps; + x.options_['ops'] = x.options_['ops'].filter(x => x.type_ !== "replicate"); + x.options_['ops'].push({ type_: "replicate", arguments_ :{ amount:reps }}); + x.options_['weight'] = reps; + } + } + +op_bjorklund = "(" ws p:slice_with_ops ws comma ws s:slice_with_ops ws comma? ws r:slice_with_ops? ws ")" + { return x => x.options_['ops'].push({ type_: "bjorklund", arguments_ :{ pulse: p, step:s, rotation:r }}) } + +op_slow = "/"a:slice + { return x => x.options_['ops'].push({ type_: "stretch", arguments_ :{ amount:a, type: 'slow' }}) } + +op_fast = "*"a:slice + { return x => x.options_['ops'].push({ type_: "stretch", arguments_ :{ amount:a, type: 'fast' }}) } + +op_degrade = "?"a:number? + { return x => x.options_['ops'].push({ type_: "degradeBy", arguments_ :{ amount:a, seed: seed++ } }) } + +op_tail = ":" s:slice + { return x => x.options_['ops'].push({ type_: "tail", arguments_ :{ element:s } }) } + +op_range = ".." s:slice + { return x => x.options_['ops'].push({ type_: "range", arguments_ :{ element:s } }) } + +// a slice with an modifier applied i.e [bd@4 sd@3]@2 hh] +slice_with_ops = s:slice ops:slice_op* + { const result = new ElementStub(s, {ops: [], weight: 1, reps: 1}); + for (const op of ops) { + op(result); + } + return result; + } + +// a sequence is a combination of one or more successive slices (as an array) +sequence = _steps:'^'? s:(slice_with_ops)+ + { return new PatternStub(s, 'fastcat', undefined, !!_steps); } + +// a stack is a series of vertically aligned sequence, separated by a comma +stack_tail = tail:(comma @sequence)+ + { return { alignment: 'stack', list: tail }; } + +// a choose is a series of pipe-separated sequence, one of which is +// chosen at random, each cycle +choose_tail = tail:(pipe @sequence)+ + { return { alignment: 'rand', list: tail, seed: seed++ }; } + +// a foot separates subsequences, as an alternative to wrapping them in [] +dot_tail = tail:(dot @sequence)+ + { return { alignment: 'feet', list: tail, seed: seed++ }; } + +// if the stack contains only one element, we don't create a stack but return the +// underlying element +stack_or_choose = head:sequence tail:(stack_tail / choose_tail / dot_tail)? + {if (tail && tail.list.length > 0) { return new PatternStub([head, ...tail.list], tail.alignment, tail.seed); } else { return head; } } + +polymeter_stack = head:sequence tail:stack_tail? + { return new PatternStub(tail ? [head, ...tail.list] : [head], 'polymeter'); } + + +// Mini-notation innards ends +// ---------->8---------->8---------->8---------->8---------->8---------- +// Experimental haskellish parser begins + +// mini-notation = a quoted stack +mini = ws quote ws sc:stack_or_choose ws quote + { return sc; } + +// ------------------ operators --------------------------- + +operator = scale / slow / fast / target / bjorklund / struct / rotR / rotL + +struct = "struct" ws s:mini_or_operator + { return { name: "struct", args: { mini:s }}} + +target = "target" ws quote s:step quote + { return { name: "target", args : { name:s}}} + +bjorklund = "euclid" ws p:int ws s:int ws r:int? + { return { name: "bjorklund", args :{ pulse: p, step:parseInt(s) }}} + +slow = "slow" ws a:number + { return { name: "stretch", args :{ amount: a}}} + +rotL = "rotL" ws a:number + { return { name: "shift", args :{ amount: "-"+a}}} + +rotR = "rotR" ws a:number + { return { name: "shift", args :{ amount: a}}} + +fast = "fast" ws a:number + { return { name: "stretch", args :{ amount: "1/"+a}}} + +scale = "scale" ws quote s:(step_char)+ quote +{ return { name: "scale", args :{ scale: s.join("")}}} + +comment = '//' p:([^\n]*) + +// ---------------- grouping -------------------------------- + +group_operator = cat + +// cat is another form of timeline +cat = "cat" ws "[" ws s:mini_or_operator ss:(comma v:mini_or_operator { return v})* ws "]" + { ss.unshift(s); return new PatternStub(ss, 'slowcat'); } + +// ------------------ high level mini --------------------------- + +mini_or_group = + group_operator / + mini + +mini_or_operator = + sg:mini_or_group ws (comment)* + {return sg} + / o:operator ws "$" ws soc:mini_or_operator + { return new OperatorStub(o.name,o.args,soc)} + +sequ_or_operator_or_comment = + sc: mini_or_operator + { return sc } + / comment + +mini_definition = s:sequ_or_operator_or_comment + +// ---------------------- statements ---------------------------- + +command = ws c:(setcps / setbpm / hush) ws + { return c } + +setcps = "setcps" ws v:number + { return new CommandStub("setcps", { value: v})} + +setbpm = "setbpm" ws v:number + { return new CommandStub("setcps", { value: (v/120/2)})} + +hush = "hush" + { return new CommandStub("hush")} + +// ---------------------- statements ---------------------------- + +statement = mini_definition / command + +// ---------------------- unicode ---------------------------- + +unicode_letter = Lu / Ll / Lt / Lm / Lo / Nl + +// Letter, Lowercase +Ll = [\u0061-\u007A\u00B5\u00DF-\u00F6\u00F8-\u00FF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137-\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148-\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C-\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA-\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9-\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC-\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF-\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F-\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0-\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB-\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE-\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6-\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FC7\u1FD0-\u1FD3\u1FD6-\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6-\u1FF7\u210A\u210E-\u210F\u2113\u212F\u2134\u2139\u213C-\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65-\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73-\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3-\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A] + +// Letter, Modifier +Lm = [\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5-\u06E6\u07F4-\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C-\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D-\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C-\uA69D\uA717-\uA71F\uA770\uA788\uA7F8-\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3-\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E-\uFF9F] + +// Letter, Other +Lo = [\u00AA\u00BA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05EF-\u05F2\u0620-\u063F\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u09FC\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60-\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A-\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD-\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC] + +// Letter, Titlecase +Lt = [\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC] + +// Letter, Uppercase +Lu = [\u0041-\u005A\u00C0-\u00D6\u00D8-\u00DE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178-\u0179\u017B\u017D\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018B\u018E-\u0191\u0193-\u0194\u0196-\u0198\u019C-\u019D\u019F-\u01A0\u01A2\u01A4\u01A6-\u01A7\u01A9\u01AC\u01AE-\u01AF\u01B1-\u01B3\u01B5\u01B7-\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A-\u023B\u023D-\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E-\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9-\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0-\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E-\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D-\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uFF21-\uFF3A] + +// Number, Letter +Nl = [\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF] diff --git a/src/strudel/mini/mini.mjs b/src/strudel/mini/mini.mjs new file mode 100644 index 0000000..d138d9f --- /dev/null +++ b/src/strudel/mini/mini.mjs @@ -0,0 +1,261 @@ +/* +mini.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import * as krill from './krill-parser.js'; +import * as strudel from '@strudel/core'; +import Fraction, { lcm } from '@strudel/core/fraction.mjs'; + +const randOffset = 0.0003; + +const applyOptions = (parent, enter) => (pat, i) => { + const ast = parent.source_[i]; + const options = ast.options_; + const ops = options?.ops; + const steps_source = pat.__steps_source; + if (ops) { + for (const op of ops) { + switch (op.type_) { + case 'stretch': { + const legalTypes = ['fast', 'slow']; + const { type, amount } = op.arguments_; + if (!legalTypes.includes(type)) { + throw new Error(`mini: stretch: type must be one of ${legalTypes.join('|')} but got ${type}`); + } + pat = strudel.reify(pat)[type](enter(amount)); + break; + } + case 'replicate': { + const { amount } = op.arguments_; + pat = strudel.reify(pat); + pat = pat._repeatCycles(amount)._fast(amount); + break; + } + case 'bjorklund': { + if (op.arguments_.rotation) { + pat = pat.euclidRot(enter(op.arguments_.pulse), enter(op.arguments_.step), enter(op.arguments_.rotation)); + } else { + pat = pat.euclid(enter(op.arguments_.pulse), enter(op.arguments_.step)); + } + break; + } + case 'degradeBy': { + pat = strudel + .reify(pat) + ._degradeByWith(strudel.rand.early(randOffset * op.arguments_.seed), op.arguments_.amount ?? 0.5); + break; + } + case 'tail': { + const friend = enter(op.arguments_.element); + pat = pat.fmap((a) => (b) => (Array.isArray(a) ? [...a, b] : [a, b])).appLeft(friend); + break; + } + case 'range': { + const friend = enter(op.arguments_.element); + pat = strudel.reify(pat); + const arrayRange = (start, stop, step = 1) => + Array.from({ length: Math.abs(stop - start) / step + 1 }, (value, index) => + start < stop ? start + index * step : start - index * step, + ); + let range = (apat, bpat) => apat.squeezeBind((a) => bpat.bind((b) => strudel.fastcat(...arrayRange(a, b)))); + pat = range(pat, friend); + break; + } + default: { + console.warn(`operator "${op.type_}" not implemented`); + } + } + } + } + pat.__steps_source = pat.__steps_source || steps_source; + return pat; +}; + +// expects ast from mini2ast + quoted mini string + optional callback when a node is entered +export function patternifyAST(ast, code, onEnter, offset = 0) { + onEnter?.(ast); + const enter = (node) => patternifyAST(node, code, onEnter, offset); + switch (ast.type_) { + case 'pattern': { + // resolveReplications(ast); + const children = ast.source_.map((child) => enter(child)).map(applyOptions(ast, enter)); + const alignment = ast.arguments_.alignment; + const with_steps = children.filter((child) => child.__steps_source); + let pat; + switch (alignment) { + case 'stack': { + pat = strudel.stack(...children); + if (with_steps.length) { + pat._steps = lcm(...with_steps.map((x) => Fraction(x._steps))); + } + break; + } + case 'polymeter_slowcat': { + pat = strudel.stack(...children.map((child) => child._slow(child.__weight))); + if (with_steps.length) { + pat._steps = lcm(...with_steps.map((x) => Fraction(x._steps))); + } + break; + } + case 'polymeter': { + // polymeter + const stepsPerCycle = ast.arguments_.stepsPerCycle + ? enter(ast.arguments_.stepsPerCycle).fmap((x) => strudel.Fraction(x)) + : strudel.pure(strudel.Fraction(children.length > 0 ? children[0].__weight : 1)); + + const aligned = children.map((child) => child.fast(stepsPerCycle.fmap((x) => x.div(child.__weight)))); + pat = strudel.stack(...aligned); + break; + } + case 'rand': { + pat = strudel.chooseInWith(strudel.rand.early(randOffset * ast.arguments_.seed).segment(1), children); + if (with_steps.length) { + pat._steps = lcm(...with_steps.map((x) => Fraction(x._steps))); + } + break; + } + case 'feet': { + pat = strudel.fastcat(...children); + break; + } + default: { + const weightedChildren = ast.source_.some((child) => !!child.options_?.weight); + if (weightedChildren) { + const weightSum = ast.source_.reduce( + (sum, child) => sum.add(child.options_?.weight || strudel.Fraction(1)), + strudel.Fraction(0), + ); + pat = strudel.timeCat( + ...ast.source_.map((child, i) => [child.options_?.weight || strudel.Fraction(1), children[i]]), + ); + pat.__weight = weightSum; // for polymeter + pat._steps = weightSum; + if (with_steps.length) { + pat._steps = pat._steps.mul(lcm(...with_steps.map((x) => Fraction(x._steps)))); + } + } else { + pat = strudel.sequence(...children); + pat._steps = children.length; + } + if (ast.arguments_._steps) { + pat.__steps_source = true; + } + } + } + if (with_steps.length) { + pat.__steps_source = true; + } + return pat; + } + case 'element': { + 1; + return enter(ast.source_); + } + case 'atom': { + if (ast.source_ === '~' || ast.source_ === '-') { + return strudel.silence; + } + if (!ast.location_) { + console.warn('no location for', ast); + return ast.source_; + } + const value = !isNaN(Number(ast.source_)) ? Number(ast.source_) : ast.source_; + if (offset === -1) { + // skip location handling (used when getting leaves to avoid confusion) + return strudel.pure(value); + } + const [from, to] = getLeafLocation(code, ast, offset); + return strudel.pure(value).withLoc(from, to); + } + case 'stretch': + return enter(ast.source_).slow(enter(ast.arguments_.amount)); + default: + console.warn(`node type "${ast.type_}" not implemented -> returning silence`); + return strudel.silence; + } +} + +// takes quoted mini string + leaf node within, returns source location of node (whitespace corrected) +export const getLeafLocation = (code, leaf, globalOffset = 0) => { + // value is expected without quotes! + const { start, end } = leaf.location_; + const actual = code?.split('').slice(start.offset, end.offset).join(''); + // make sure whitespaces are not part of the highlight + const [offsetStart = 0, offsetEnd = 0] = actual + ? actual.split(leaf.source_).map((p) => p.split('').filter((c) => c === ' ').length) + : []; + return [start.offset + offsetStart + globalOffset, end.offset - offsetEnd + globalOffset]; +}; + +// takes quoted mini string, returns ast +export const mini2ast = (code, start = 0, userCode = code) => { + try { + return krill.parse(code); + } catch (error) { + const region = [error.location.start.offset + start, error.location.end.offset + start]; + const line = userCode.slice(0, region[0]).split('\n').length; + throw new Error(`[mini] parse error at line ${line}: ${error.message}`); + } +}; + +// takes quoted mini string, returns all nodes that are leaves +export const getLeaves = (code, start, userCode) => { + const ast = mini2ast(code, start, userCode); + let leaves = []; + patternifyAST( + ast, + code, + (node) => { + if (node.type_ === 'atom') { + leaves.push(node); + } + }, + -1, + ); + return leaves; +}; + +// takes quoted mini string, returns locations [fromCol,toCol] of all leaf nodes +export const getLeafLocations = (code, start = 0, userCode) => { + return getLeaves(code, start, userCode).map((l) => getLeafLocation(code, l, start)); +}; + +// mini notation only (wraps in "") +export const mini = (...strings) => { + const pats = strings.map((str) => { + const code = `"${str}"`; + const ast = mini2ast(code); + return patternifyAST(ast, code); + }); + return strudel.sequence(...pats); +}; + +// turns str mini string (without quotes) into pattern +// offset is the position of the mini string in the JS code +// each leaf node will get .withLoc added +// this function is used by the transpiler for double quoted strings +export const m = (str, offset) => { + const code = `"${str}"`; + const ast = mini2ast(code); + return patternifyAST(ast, code, null, offset); +}; + +// includes haskell style (raw krill parsing) +export const h = (string) => { + const ast = mini2ast(string); + return patternifyAST(ast, string); +}; + +export function minify(thing) { + if (typeof thing === 'string') { + return mini(thing); + } + return strudel.reify(thing); +} + +// calling this function will cause patterns to parse strings as mini notation by default +export function miniAllStrings() { + strudel.setStringParser(mini); +} diff --git a/src/strudel/soundfonts/convert.js b/src/strudel/soundfonts/convert.js new file mode 100644 index 0000000..ffd80cc --- /dev/null +++ b/src/strudel/soundfonts/convert.js @@ -0,0 +1,13 @@ +// this script converts a soundfont into a json file, it has not been not used yet +import fetch from 'node-fetch'; + +const name = '0000_JCLive'; + +const js = await fetch(`https://felixroos.github.io/webaudiofontdata/sound/${name}_sf2_file.js`).then((res) => + res.text(), +); +// console.log(js); + +let [_, data] = js.split('_sf2_file='); +data = eval(data); +console.log(JSON.stringify(data)); diff --git a/src/strudel/soundfonts/fontloader.mjs b/src/strudel/soundfonts/fontloader.mjs new file mode 100644 index 0000000..427f57e --- /dev/null +++ b/src/strudel/soundfonts/fontloader.mjs @@ -0,0 +1,184 @@ +import { noteToMidi, freqToMidi, getSoundIndex } from '@strudel/core'; +import { + getAudioContext, + registerSound, + getParamADSR, + getADSRValues, + getPitchEnvelope, + getVibratoOscillator, +} from '@strudel/webaudio'; +import gm from './gm.mjs'; + +let defaultSoundfontUrl = 'https://felixroos.github.io/webaudiofontdata/sound'; +let soundfontUrl = defaultSoundfontUrl; + +export function setSoundfontUrl(value) { + soundfontUrl = value; +} + +let loadCache = {}; +async function loadFont(name) { + if (loadCache[name]) { + return loadCache[name]; + } + const load = async () => { + // TODO: make soundfont source configurable + const url = `${soundfontUrl}/${name}.js`; + const preset = await fetch(url).then((res) => res.text()); + let [_, data] = preset.split('={'); + return eval('{' + data); + }; + loadCache[name] = load(); + return loadCache[name]; +} + +export async function getFontBufferSource(name, value, ac) { + let { note = 'c3', freq } = value; + let midi; + if (freq) { + midi = freqToMidi(freq); + } else if (typeof note === 'string') { + midi = noteToMidi(note); + } else if (typeof note === 'number') { + midi = note; + } else { + throw new Error(`unexpected "note" type "${typeof note}"`); + } + + const { buffer, zone } = await getFontPitch(name, midi, ac); + const src = ac.createBufferSource(); + src.buffer = buffer; + const baseDetune = zone.originalPitch - 100.0 * zone.coarseTune - zone.fineTune; + const playbackRate = 1.0 * Math.pow(2, (100.0 * midi - baseDetune) / 1200.0); + // src detune? + src.playbackRate.value = playbackRate; + const loop = zone.loopStart > 1 && zone.loopStart < zone.loopEnd; + if (!loop) { + /* const waveDuration = duration + this.afterTime; + if (waveDuration > zone.buffer.duration / playbackRate) { + waveDuration = zone.buffer.duration / playbackRate; + // TODO: do sth with waveduration + } */ + } else { + src.loop = true; + src.loopStart = zone.loopStart / zone.sampleRate; + src.loopEnd = zone.loopEnd / zone.sampleRate; + //+ (zone.delay ? zone.delay : 0); + } + return src; +} + +let bufferCache = {}; +export async function getFontPitch(name, pitch, ac) { + const key = `${name}:::${pitch}`; + if (bufferCache[key]) { + return bufferCache[key]; + } + // console.log('load buffer', key); + const load = async () => { + const preset = await loadFont(name); + if (!preset) { + throw new Error(`Could not load soundfont ${name}`); + } + const zone = findZone(preset, pitch); + if (!zone) { + throw new Error('no soundfont zone found for preset ', name, 'pitch', pitch); + } + const buffer = await getBuffer(zone, ac); + if (!buffer) { + throw new Error(`no soundfont buffer found for preset ${name}, pitch: ${pitch}`); + } + return { buffer, zone }; + }; + bufferCache[key] = load(); // dont await here to cache promise immediately! + return bufferCache[key]; +} + +function findZone(preset, pitch) { + return preset.find((zone) => { + return zone.keyRangeLow <= pitch && zone.keyRangeHigh + 1 >= pitch; + }); +} + +// promisified version of https://github.com/felixroos/webaudiofont/blob/c6f97249b60dcfafc20fca5bb381294a6b2f8f51/npm/dist/WebAudioFontPlayer.js#L740 +async function getBuffer(zone, audioContext) { + if (zone.sample) { + console.warn('zone.sample untested!'); + const decoded = atob(zone.sample); + zone.buffer = audioContext.createBuffer(1, decoded.length / 2, zone.sampleRate); + const float32Array = zone.buffer.getChannelData(0); + let b1, b2, n; + for (var i = 0; i < decoded.length / 2; i++) { + b1 = decoded.charCodeAt(i * 2); + b2 = decoded.charCodeAt(i * 2 + 1); + if (b1 < 0) { + b1 = 256 + b1; + } + if (b2 < 0) { + b2 = 256 + b2; + } + n = b2 * 256 + b1; + if (n >= 65536 / 2) { + n = n - 65536; + } + float32Array[i] = n / 65536.0; + } + } else { + if (zone.file) { + const datalen = zone.file.length; + const arraybuffer = new ArrayBuffer(datalen); + const view = new Uint8Array(arraybuffer); + const decoded = atob(zone.file); + let b; + for (let i = 0; i < decoded.length; i++) { + b = decoded.charCodeAt(i); + view[i] = b; + } + return new Promise((resolve) => audioContext.decodeAudioData(arraybuffer, resolve)); + } + } +} + +export function registerSoundfonts() { + Object.entries(gm).forEach(([name, fonts]) => { + registerSound( + name, + async (time, value, onended) => { + const [attack, decay, sustain, release] = getADSRValues([ + value.attack, + value.decay, + value.sustain, + value.release, + ]); + + const { duration } = value; + const n = getSoundIndex(value.n, fonts.length); + const font = fonts[n]; + const ctx = getAudioContext(); + const bufferSource = await getFontBufferSource(font, value, ctx); + bufferSource.start(time); + const envGain = ctx.createGain(); + const node = bufferSource.connect(envGain); + const holdEnd = time + duration; + getParamADSR(node.gain, attack, decay, sustain, release, 0, 0.3, time, holdEnd, 'linear'); + let envEnd = holdEnd + release + 0.01; + + // vibrato + let vibratoOscillator = getVibratoOscillator(bufferSource.detune, value, time); + // pitch envelope + getPitchEnvelope(bufferSource.detune, value, time, holdEnd); + + bufferSource.stop(envEnd); + const stop = (releaseTime) => {}; + bufferSource.onended = () => { + bufferSource.disconnect(); + vibratoOscillator?.stop(); + node.disconnect(); + onended(); + }; + return { node, stop }; + }, + { type: 'soundfont', prebake: true, fonts }, + ); + }); +} diff --git a/src/strudel/soundfonts/gm.mjs b/src/strudel/soundfonts/gm.mjs new file mode 100644 index 0000000..d8b7687 --- /dev/null +++ b/src/strudel/soundfonts/gm.mjs @@ -0,0 +1,1787 @@ +export default { + gm_piano: [ + //'gm_acoustic_piano': [ + // Acoustic Grand Piano: Piano + '0000_JCLive_sf2_file', + '0000_FluidR3_GM_sf2_file', + '0000_Aspirin_sf2_file', + '0000_Chaos_sf2_file', + '0000_GeneralUserGS_sf2_file', + //0000_SBLive_sf2 + //0000_SoundBlasterOld_sf2 + '0001_FluidR3_GM_sf2_file', + '0001_GeneralUserGS_sf2_file', + //], + //'gm_bright_acoustic_piano': [ + // Bright Acoustic Piano: Piano + '0010_Aspirin_sf2_file', + '0010_Chaos_sf2_file', + '0010_FluidR3_GM_sf2_file', + '0010_GeneralUserGS_sf2_file', + '0010_JCLive_sf2_file', + //0010_SBLive_sf2 + //0010_SoundBlasterOld_sf2 + '0011_Aspirin_sf2_file', + '0011_FluidR3_GM_sf2_file', + '0011_GeneralUserGS_sf2_file', + '0012_GeneralUserGS_sf2_file', + //], + //'gm_electric_grand_piano': [ + // Electric Grand Piano: Piano + '0020_Aspirin_sf2_file', + '0020_Chaos_sf2_file', + '0020_FluidR3_GM_sf2_file', + '0020_GeneralUserGS_sf2_file', + '0020_JCLive_sf2_file', + //0020_SBLive_sf2 + //0020_SoundBlasterOld_sf2 + '0021_Aspirin_sf2_file', + '0021_GeneralUserGS_sf2_file', + // ? + '0022_Aspirin_sf2_file', + //], + //'gm_honky_tonk_piano': [ + // Honky_tonk Piano: Piano + '0030_Aspirin_sf2_file', + '0030_Chaos_sf2_file', + '0030_FluidR3_GM_sf2_file', + '0030_GeneralUserGS_sf2_file', + '0030_JCLive_sf2_file', + //0030_SBLive_sf2 + //0030_SoundBlasterOld_sf2 + '0031_Aspirin_sf2_file', + '0031_FluidR3_GM_sf2_file', + '0031_GeneralUserGS_sf2_file', + //0031_SoundBlasterOld_sf2 // pianos until her + ], + gm_epiano1: [ + // Electric Piano 1: Piano + '0040_JCLive_sf2_file', + '0040_FluidR3_GM_sf2_file', + '0040_Aspirin_sf2_file', + '0040_Chaos_sf2_file', + '0040_GeneralUserGS_sf2_file', + //0040_SBLive_sf2 // ? + //0040_SoundBlasterOld_sf2 // ? + '0041_FluidR3_GM_sf2_file', + '0041_GeneralUserGS_sf2_file', + //0041_SoundBlasterOld_sf2 // ? + '0042_GeneralUserGS_sf2_file', + '0043_GeneralUserGS_sf2_file', + '0044_GeneralUserGS_sf2_file', + //0045_GeneralUserGS_sf2_file // ? + '0046_GeneralUserGS_sf2_file', + ], + gm_epiano2: [ + // Electric Piano 2: Piano + '0050_JCLive_sf2_file', + '0050_FluidR3_GM_sf2_file', + '0050_Aspirin_sf2_file', + '0050_Chaos_sf2_file', + // ? + '0050_GeneralUserGS_sf2_file', + // cont + //0050_SBLive_sf2 // ? + //0050_SoundBlasterOld_sf2 // ? + '0051_FluidR3_GM_sf2_file', + '0051_GeneralUserGS_sf2_file', + //0052_GeneralUserGS_sf2_file // ? + '0053_GeneralUserGS_sf2_file', + // normal piano... + '0054_GeneralUserGS_sf2_file', + ], + gm_harpsichord: [ + // Harpsichord: Piano + '0060_JCLive_sf2_file', + '0060_FluidR3_GM_sf2_file', + '0060_Aspirin_sf2_file', + '0060_Chaos_sf2_file', + '0060_GeneralUserGS_sf2_file', + //0060_SBLive_sf2 + //0060_SoundBlasterOld_sf2 + '0061_Aspirin_sf2_file', + '0061_GeneralUserGS_sf2_file', + //0061_SoundBlasterOld_sf2 + '0062_GeneralUserGS_sf2_file', + ], + gm_clavinet: [ + // Clavinet: Piano + '0070_JCLive_sf2_file', + '0070_FluidR3_GM_sf2_file', + '0070_Aspirin_sf2_file', + '0070_Chaos_sf2_file', + // 0070_GeneralUserGS_sf2_file // half broken + //0070_SBLive_sf2 + //0070_SoundBlasterOld_sf2 + // 0071_GeneralUserGS_sf2_file // half broke + ], + gm_celesta: [ + // Celesta: Chromatic Percussion + '0080_JCLive_sf2_file', + '0080_Aspirin_sf2_file', + '0080_Chaos_sf2_file', + '0080_FluidR3_GM_sf2_file', + '0080_GeneralUserGS_sf2_file', + //0080_SBLive_sf2 + //0080_SoundBlasterOld_sf2 + '0081_FluidR3_GM_sf2_file', + // 0081_GeneralUserGS_sf2_file // weird detuned + //0081_SoundBlasterOld_sf + ], + gm_glockenspiel: [ + // Glockenspiel: Chromatic Percussion + '0090_JCLive_sf2_file', + '0090_Aspirin_sf2_file', + '0090_Chaos_sf2_file', + '0090_FluidR3_GM_sf2_file', + '0090_GeneralUserGS_sf2_file', + //0090_SBLive_sf2 + //0090_SoundBlasterOld_sf2 + //0091_SoundBlasterOld_sf + ], + gm_music_box: [ + // Music Box: Chromatic Percussion + '0100_JCLive_sf2_file', + '0100_Aspirin_sf2_file', + '0100_Chaos_sf2_file', + '0100_FluidR3_GM_sf2_file', + '0100_GeneralUserGS_sf2_file', + //0100_SBLive_sf2 + //0100_SoundBlasterOld_sf2 + // 0101_GeneralUserGS_sf2_file // weird detuned + //0101_SoundBlasterOld_sf + ], + gm_vibraphone: [ + // Vibraphone: Chromatic Percussion + '0110_JCLive_sf2_file', + '0110_Aspirin_sf2_file', + '0110_Chaos_sf2_file', + '0110_FluidR3_GM_sf2_file', + '0110_GeneralUserGS_sf2_file', + //0110_SBLive_sf2 + //0110_SoundBlasterOld_sf2 + '0111_FluidR3_GM_sf2_file', + ], + gm_marimba: [ + // Marimba: Chromatic Percussion + '0120_JCLive_sf2_file', + '0120_Aspirin_sf2_file', + '0120_Chaos_sf2_file', + '0120_FluidR3_GM_sf2_file', + '0120_GeneralUserGS_sf2_file', + //0120_SBLive_sf2 + //0120_SoundBlasterOld_sf2 + '0121_FluidR3_GM_sf2_file', + '0121_GeneralUserGS_sf2_file', + ], + gm_xylophone: [ + // Xylophone: Chromatic Percussion + '0130_JCLive_sf2_file', + '0130_Aspirin_sf2_file', + '0130_Chaos_sf2_file', + '0130_FluidR3_GM_sf2_file', + '0130_GeneralUserGS_sf2_file', + //0130_SBLive_sf2 + //0130_SoundBlasterOld_sf2 + '0131_FluidR3_GM_sf2_file', + ], + gm_tubular_bells: [ + // Tubular Bells: Chromatic Percussion + '0140_JCLive_sf2_file', + '0140_Aspirin_sf2_file', + // 0140_Chaos_sf2_file // same as aspirin? + '0140_FluidR3_GM_sf2_file', + '0140_GeneralUserGS_sf2_file', + //0140_SBLive_sf2 + //0140_SoundBlasterOld_sf2 + '0141_FluidR3_GM_sf2_file', + //0141_GeneralUserGS_sf2_file + '0142_GeneralUserGS_sf2_file', + // 0143_GeneralUserGS_sf2_file // bugg + ], + gm_dulcimer: [ + // Dulcimer: Chromatic Percussion + '0150_Aspirin_sf2_file', + '0150_Chaos_sf2_file', + '0150_FluidR3_GM_sf2_file', + '0150_GeneralUserGS_sf2_file', + // 0150_JCLive_sf2_file // detuned??? + //0150_SBLive_sf2 + //0150_SoundBlasterOld_sf2 + '0151_FluidR3_GM_sf2_file', + ], + gm_drawbar_organ: [ + // Drawbar Organ: Organ + '0160_JCLive_sf2_file', + '0160_Aspirin_sf2_file', + '0160_Chaos_sf2_file', + '0160_FluidR3_GM_sf2_file', + '0160_GeneralUserGS_sf2_file', + //0160_SBLive_sf2 + //0160_SoundBlasterOld_sf2 + '0161_Aspirin_sf2_file', + '0161_FluidR3_GM_sf2_file', + //0161_SoundBlasterOld_sf + ], + gm_percussive_organ: [ + // Percussive Organ: Organ + '0170_JCLive_sf2_file', + '0170_Aspirin_sf2_file', + '0170_Chaos_sf2_file', + '0170_FluidR3_GM_sf2_file', + // 0170_GeneralUserGS_sf2_file // repitched + //0170_SBLive_sf2 + //0170_SoundBlasterOld_sf2 + '0171_FluidR3_GM_sf2_file', + // 0171_GeneralUserGS_sf2_file // repitched + '0172_FluidR3_GM_sf2_file', + ], + gm_rock_organ: [ + // Rock Organ: Organ + '0180_JCLive_sf2_file', + '0180_Aspirin_sf2_file', + '0180_Chaos_sf2_file', + '0180_FluidR3_GM_sf2_file', + '0180_GeneralUserGS_sf2_file', + //0180_SBLive_sf2 + //0180_SoundBlasterOld_sf2 + //0181_Aspirin_sf2_file // flute + //0181_GeneralUserGS_sf2_file // marimbalike + //0181_SoundBlasterOld_sf + ], + gm_church_organ: [ + // Church Organ: Organ + '0190_JCLive_sf2_file', + '0190_Aspirin_sf2_file', + '0190_Chaos_sf2_file', + '0190_FluidR3_GM_sf2_file', + '0190_GeneralUserGS_sf2_file', + //0190_SBLive_sf2 + //0190_SoundBlasterOld_sf2 + //0191_Aspirin_sf2_file // string?? + //0191_GeneralUserGS_sf2_file // weird organ + //0191_SoundBlasterOld_sf + ], + gm_reed_organ: [ + // Reed Organ: Organ + '0200_JCLive_sf2_file', + '0200_Aspirin_sf2_file', + '0200_Chaos_sf2_file', + '0200_FluidR3_GM_sf2_file', + '0200_GeneralUserGS_sf2_file', + //0200_SBLive_sf2 + //0200_SoundBlasterOld_sf2 + '0201_Aspirin_sf2_file', + '0201_FluidR3_GM_sf2_file', + '0201_GeneralUserGS_sf2_file', + //0201_SoundBlasterOld_sf2 + //0210_Aspirin_sf2_file // buggy + //0210_Chaos_sf2_file // bugg + ], + gm_accordion: [ + // Accordion: Organ + '0210_JCLive_sf2_file', + '0210_FluidR3_GM_sf2_file', + '0210_GeneralUserGS_sf2_file', + //0210_SBLive_sf2 + //0210_SoundBlasterOld_sf2 + '0211_Aspirin_sf2_file', + '0211_FluidR3_GM_sf2_file', + '0211_GeneralUserGS_sf2_file', + //0211_SoundBlasterOld_sf2 + '0212_GeneralUserGS_sf2_file', + ], + gm_harmonica: [ + // Harmonica: Organ + '0220_FluidR3_GM_sf2_file', + '0220_JCLive_sf2_file', + '0220_Aspirin_sf2_file', + '0220_Chaos_sf2_file', + '0220_GeneralUserGS_sf2_file', + //0220_SBLive_sf2 + //0220_SoundBlasterOld_sf2 + '0221_FluidR3_GM_sf2_file', + ], + gm_bandoneon: [ + // Tango Accordion: Organ + '0230_Aspirin_sf2_file', + '0230_JCLive_sf2_file', + '0230_Chaos_sf2_file', + '0230_FluidR3_GM_sf2_file', + '0230_GeneralUserGS_sf2_file', + //0230_SBLive_sf2 + //0230_SoundBlasterOld_sf2 + '0231_FluidR3_GM_sf2_file', + '0231_GeneralUserGS_sf2_file', + '0231_JCLive_sf2_file', + //0231_SoundBlasterOld_sf2 + '0232_FluidR3_GM_sf2_file', + '0233_FluidR3_GM_sf2_file', + ], + gm_acoustic_guitar_nylon: [ + // Acoustic Guitar (nylon): Guitar + '0240_JCLive_sf2_file', + '0240_Aspirin_sf2_file', + '0240_Chaos_sf2_file', + '0240_FluidR3_GM_sf2_file', + '0240_GeneralUserGS_sf2_file', + '0240_LK_Godin_Nylon_SF2_file', + //0240_SBLive_sf2 + //0240_SoundBlasterOld_sf2 + // 0241_GeneralUserGS_sf2_file // organ like + '0241_JCLive_sf2_file', + '0242_JCLive_sf2_file', + '0243_JCLive_sf2_file', + ], + gm_acoustic_guitar_steel: [ + // Acoustic Guitar (steel): Guitar + '0253_Acoustic_Guitar_sf2_file', + '0250_Aspirin_sf2_file', + '0250_Chaos_sf2_file', + '0250_FluidR3_GM_sf2_file', + '0250_GeneralUserGS_sf2_file', + // 0250_JCLive_sf2_file // detuned + '0250_LK_AcousticSteel_SF2_file', + //0250_SBLive_sf2 + //0250_SoundBlasterOld_sf2 + //0251_Acoustic_Guitar_sf2_file // detuned? + // 0251_GeneralUserGS_sf2_file // broken: missing pitches + // 0252_Acoustic_Guitar_sf2_file // detuned.. + // 0252_GeneralUserGS_sf2_file // broken: missing pitches + '0253_Acoustic_Guitar_sf2_file', + '0253_GeneralUserGS_sf2_file', + '0254_Acoustic_Guitar_sf2_file', + '0254_GeneralUserGS_sf2_file', + //0255_GeneralUserGS_sf2_file // no guitar. + ], + gm_electric_guitar_jazz: [ + // Electric Guitar (jazz): Guitar + '0260_JCLive_sf2_file', + '0260_Aspirin_sf2_file', + '0260_Chaos_sf2_file', + '0260_FluidR3_GM_sf2_file', + '0260_GeneralUserGS_sf2_file', + //0260_SBLive_sf2 + //0260_SoundBlasterOld_sf2 + '0260_Stratocaster_sf2_file', + '0261_GeneralUserGS_sf2_file', + //0261_SoundBlasterOld_sf2 + '0261_Stratocaster_sf2_file', + '0262_Stratocaster_sf2_file', + ], + gm_electric_guitar_clean: [ + // Electric Guitar (clean): Guitar + '0270_Aspirin_sf2_file', + '0270_Chaos_sf2_file', + '0270_FluidR3_GM_sf2_file', + '0270_GeneralUserGS_sf2_file', + //0270_Gibson_Les_Paul_sf2_file // detuned + // 0270_JCLive_sf2_file // broken: missing notes + '0270_SBAWE32_sf2_file', + //0270_SBLive_sf2 + //0270_SoundBlasterOld_sf2 + '0270_Stratocaster_sf2_file', + '0271_GeneralUserGS_sf2_file', + '0271_Stratocaster_sf2_file', + '0272_Stratocaster_sf2_file', + ], + gm_electric_guitar_muted: [ + // Electric Guitar (muted): Guitar + '0280_Aspirin_sf2_file', + '0280_Chaos_sf2_file', + // 0280_FluidR3_GM_sf2_file // broken: wrong notes + '0280_GeneralUserGS_sf2_file', + '0280_JCLive_sf2_file', + //0280_LesPaul_sf2 // missing + '0280_LesPaul_sf2_file', + '0280_SBAWE32_sf2_file', + //0280_SBLive_sf2 + //0280_SoundBlasterOld_sf2 + '0281_Aspirin_sf2_file', + '0281_FluidR3_GM_sf2_file', + '0281_GeneralUserGS_sf2_file', + '0282_FluidR3_GM_sf2_file', + // 0282_GeneralUserGS_sf2_file // broken: missing notes + // 0283_GeneralUserGS_sf2_file // missin + ], + gm_overdriven_guitar: [ + // Overdriven Guitar: Guitar + '0290_FluidR3_GM_sf2_file', + '0290_Aspirin_sf2_file', + '0290_Chaos_sf2_file', + '0290_GeneralUserGS_sf2_file', + //0290_JCLive_sf2_file // detuned.... + //0290_LesPaul_sf2 // broken + '0290_LesPaul_sf2_file', + '0290_SBAWE32_sf2_file', + //0290_SBLive_sf2 + //0290_SoundBlasterOld_sf2 + // 0291_Aspirin_sf2_file // broken + // 0291_LesPaul_sf2 // broken + '0291_LesPaul_sf2_file', + '0291_SBAWE32_sf2_file', + //0291_SoundBlasterOld_sf2 + '0292_Aspirin_sf2_file', + // 0292_LesPaul_sf2 // broken + '0292_LesPaul_sf2_file', + ], + gm_distortion_guitar: [ + // Distortion Guitar: Guitar + '0300_FluidR3_GM_sf2_file', + '0300_Aspirin_sf2_file', + '0300_Chaos_sf2_file', + '0300_GeneralUserGS_sf2_file', + // 0300_JCLive_sf2_file // broken + // 0300_LesPaul_sf2 // broken + '0300_LesPaul_sf2_file', + //0300_SBAWE32_sf2_file // _2 octave + //0300_SBLive_sf2 + //0300_SoundBlasterOld_sf2 + // 0301_Aspirin_sf2_file // missing + //0301_FluidR3_GM_sf2_file // weird broken bell + // 0301_GeneralUserGS_sf2_file // broken + // 0301_JCLive_sf2_file // broken + // 0301_LesPaul_sf2 // missing + // 0301_LesPaul_sf2_file // + 1 oct? + '0302_Aspirin_sf2_file', + // 0302_GeneralUserGS_sf2_file // not a guitar.. + //0302_JCLive_sf2_file // broken... + // 0303_Aspirin_sf2_file // guitar harmonic?? + '0304_Aspirin_sf2_file', + ], + gm_guitar_harmonics: [ + // Guitar Harmonics: Guitar + '0310_Aspirin_sf2_file', + '0310_FluidR3_GM_sf2_file', + '0310_Chaos_sf2_file', + //0310_GeneralUserGS_sf2_file // weird.. + // 0310_JCLive_sf2_file // weird + //0310_LesPaul_sf2 // missing + //0310_LesPaul_sf2_file // wrong pitches + //0310_SBAWE32_sf2_file // wrong pitches + //0310_SBLive_sf2 + //0310_SoundBlasterOld_sf2 + //0311_FluidR3_GM_sf2_file // knackt + //0311_GeneralUserGS_sf2_file // wrong note + ], + gm_acoustic_bass: [ + // Acoustic Bass: Bass + '0320_JCLive_sf2_file', + '0320_FluidR3_GM_sf2_file', + '0320_Aspirin_sf2_file', + '0320_Chaos_sf2_file', + // 0320_GeneralUserGS_sf2_file // missing notes + //0320_SBLive_sf2 + //0320_SoundBlasterOld_sf2 + // 0321_GeneralUserGS_sf2_file // nice sound but missing notes + // 0322_GeneralUserGS_sf2_file // missing note + ], + gm_electric_bass_finger: [ + // Electric Bass (finger): Bass + '0330_JCLive_sf2_file', + '0330_FluidR3_GM_sf2_fible', + '0330_Aspirin_sf2_file', + //0330_Chaos_sf2_file // same as last + '0330_GeneralUserGS_sf2_file', + //0330_SBLive_sf2 + //0330_SoundBlasterOld_sf2 + //0331_GeneralUserGS_sf2_file // knackt + // 0332_GeneralUserGS_sf2_file // missin + ], + gm_electric_bass_pick: [ + // Electric Bass (pick): Bass + '0340_JCLive_sf2_file', + '0340_FluidR3_GM_sf2_file', + '0340_Aspirin_sf2_file', + //0340_Chaos_sf2_file // same as last + '0340_GeneralUserGS_sf2_file', + //0340_SBLive_sf2 + //0340_SoundBlasterOld_sf2 + '0341_Aspirin_sf2_file', + //0341_GeneralUserGS_sf2_file // knack + ], + gm_fretless_bass: [ + // Fretless Bass: Bass + '0350_Aspirin_sf2_file', + // 0350_Chaos_sf2_file // same as last + //0350_FluidR3_GM_sf2_file // knackt + //0350_GeneralUserGS_sf2_file // _1 oct + knackt + '0350_JCLive_sf2_file', + //0350_SBLive_sf2 + //0350_SoundBlasterOld_sf2 + //0351_GeneralUserGS_sf2_file // missin + ], + gm_slap_bass_1: [ + // Slap Bass 1: Bass + '0360_Aspirin_sf2_file', + '0360_JCLive_sf2_file', + '0360_FluidR3_GM_sf2_file', + '0360_Chaos_sf2_file', + //0360_GeneralUserGS_sf2_file // _1 oct + //0360_SBLive_sf2 + //0360_SoundBlasterOld_sf2 + //0361_GeneralUserGS_sf2_file // missin + ], + gm_slap_bass_2: [ + // Slap Bass 2: Bass + '0370_Aspirin_sf2_file', + // 0370_Chaos_sf2_file // same as last + '0370_FluidR3_GM_sf2_file', + '0370_GeneralUserGS_sf2_fil e', + '0370_JCLive_sf2_file', + //0370_SBLive_sf2 + //0370_SoundBlasterOld_sf2 + //0371_GeneralUserGS_sf2_file // missing + //0372_GeneralUserGS_sf2_file // detuned + //0385_GeneralUserGS_sf2_file // missin + ], + gm_synth_bass_1: [ + // Synth Bass 1: Bass + // '0380_Aspirin_sf2_file', // broken in safari https://codeberg.org/uzu/strudel/issues/1384 + '0380_Chaos_sf2_file', + '0380_FluidR3_GM_sf2_file', + // 0380_GeneralUserGS_sf2_file // laut + '0380_JCLive_sf2_file', + //0380_SBLive_sf2 + //0380_SoundBlasterOld_sf2 + '0381_FluidR3_GM_sf2_file', + '0381_GeneralUserGS_sf2_file', + //0382_FluidR3_GM_sf2_file // kein synth bass + '0382_GeneralUserGS_sf2_file', + '0383_GeneralUserGS_sf2_file', + '0384_GeneralUserGS_sf2_file', + //0386_GeneralUserGS_sf2_file // knackt + '0387_GeneralUserGS_sf2_file', + ], + gm_synth_bass_2: [ + // Synth Bass 2: Bass + '0390_Aspirin_sf2_file', + // 0390_Chaos_sf2_file // same as last + '0390_FluidR3_GM_sf2_file', + '0390_GeneralUserGS_sf2_file', + '0390_JCLive_sf2_file', + //0390_SBLive_sf2 + //0390_SoundBlasterOld_sf2 + '0391_FluidR3_GM_sf2_file', + // 0391_GeneralUserGS_sf2_file // missing + //0391_SoundBlasterOld_sf2 + '0392_FluidR3_GM_sf2_file', + //0392_GeneralUserGS_sf2_file // kein synth und _1oct + '0393_GeneralUserGS_sf2_file', + ], + gm_violin: [ + // Violin: Strings + '0400_Aspirin_sf2_file', + '0400_Chaos_sf2_file', + '0400_JCLive_sf2_file', + '0400_FluidR3_GM_sf2_file', + '0400_GeneralUserGS_sf2_file', + //0400_SBLive_sf2 + //0400_SoundBlasterOld_sf2 + '0401_Aspirin_sf2_file', + '0401_FluidR3_GM_sf2_file', + '0401_GeneralUserGS_sf2_file', + '0402_GeneralUserGS_sf2_file', + ], + gm_viola: [ + // Viola: Strings + '0410_Aspirin_sf2_file', + // 0410_Chaos_sf2_file // laut und sehr unstringy + '0410_FluidR3_GM_sf2_file', + '0410_GeneralUserGS_sf2_file', + '0410_JCLive_sf2_file', + //0410_SBLive_sf2 + //0410_SoundBlasterOld_sf2 + '0411_FluidR3_GM_sf2_file', + ], + gm_cello: [ + // Cello: Strings + '0420_Aspirin_sf2_file', + // 0420_Chaos_sf2_file // kein cello und laut + '0420_FluidR3_GM_sf2_file', + '0420_GeneralUserGS_sf2_file', + '0420_JCLive_sf2_file', + //0420_SBLive_sf2 + //0420_SoundBlasterOld_sf2 + '0421_FluidR3_GM_sf2_file', + '0421_GeneralUserGS_sf2_file', + ], + gm_contrabass: [ + // Contrabass: Strings + '0430_Aspirin_sf2_file', + '0430_Chaos_sf2_file', + // 0430_FluidR3_GM_sf2_file // missing notes + '0430_GeneralUserGS_sf2_file', + //0430_JCLive_sf2_file // _1 oct und meh + //0430_SBLive_sf2 + //0430_SoundBlasterOld_sf2 + // 0431_FluidR3_GM_sf2_file // missing note + ], + gm_tremolo_strings: [ + // Tremolo Strings: Strings + '0440_Aspirin_sf2_file', + '0440_Chaos_sf2_file', + //0440_FluidR3_GM_sf2_file // huuuge + '0440_GeneralUserGS_sf2_file', + '0440_JCLive_sf2_file', + //0440_SBLive_sf2 + //0440_SoundBlasterOld_sf2 + '0441_GeneralUserGS_sf2_file', + '0442_GeneralUserGS_sf2_file', + ], + gm_pizzicato_strings: [ + // Pizzicato Strings: Strings + '0450_Aspirin_sf2_file', + '0450_Chaos_sf2_file', + '0450_FluidR3_GM_sf2_file', + '0450_GeneralUserGS_sf2_file', + '0450_JCLive_sf2_file', + //0450_SBLive_sf2 + //0450_SoundBlasterOld_sf2 + '0451_FluidR3_GM_sf2_file', + ], + gm_orchestral_harp: [ + // Orchestral Harp: Strings + '0460_Aspirin_sf2_file', + // 0460_Chaos_sf2_file // knackt + '0460_FluidR3_GM_sf2_file', + '0460_GeneralUserGS_sf2_file', + '0460_JCLive_sf2_file', + //0460_SBLive_sf2 + //0460_SoundBlasterOld_sf2 + '0461_FluidR3_GM_sf2_file', + ], + gm_timpani: [ + // Timpani: Strings + '0470_Aspirin_sf2_file', + '0470_Chaos_sf2_file', + '0470_FluidR3_GM_sf2_file', + '0470_GeneralUserGS_sf2_file', + // 0470_JCLive_sf2_file // wrong pitches + //0470_SBLive_sf2 + //0470_SoundBlasterOld_sf2 + '0471_FluidR3_GM_sf2_file', + '0471_GeneralUserGS_sf2_file', + ], + gm_string_ensemble_1: [ + // String Ensemble 1: Ensemble + '0480_Aspirin_sf2_file', + '0480_Chaos_sf2_file', + '0480_FluidR3_GM_sf2_file', + '0480_GeneralUserGS_sf2_file', + '0480_JCLive_sf2_file', + //0480_SBLive_sf2 + //0480_SoundBlasterOld_sf2 + // these dont work.. + //04810_GeneralUserGS_sf2_file // missing notes + brass + //04811_GeneralUserGS_sf2_file // missing notes + brass + //04812_GeneralUserGS_sf2_file + //04813_GeneralUserGS_sf2_file + //04814_GeneralUserGS_sf2_file + //04815_GeneralUserGS_sf2_file + //04816_GeneralUserGS_sf2_file + //04817_GeneralUserGS_sf2_file + '0481_Aspirin_sf2_file', + '0481_FluidR3_GM_sf2_file', + '0481_GeneralUserGS_sf2_file', + '0482_Aspirin_sf2_file', + '0482_GeneralUserGS_sf2_file', + '0483_GeneralUserGS_sf2_file', + // another block of buggyness: + //0484_GeneralUserGS_sf2_file // keys?! + knackt + //0485_GeneralUserGS_sf2_file // missing notes + //0486_GeneralUserGS_sf2_file + //0487_GeneralUserGS_sf2_file + //0488_GeneralUserGS_sf2_file + //0489_GeneralUserGS_sf2_fil + ], + gm_string_ensemble_2: [ + // String Ensemble 2: Ensemble + '0490_Aspirin_sf2_file', + '0490_Chaos_sf2_file', + '0490_FluidR3_GM_sf2_file', + '0490_GeneralUserGS_sf2_file', + '0490_JCLive_sf2_file', + //0490_SBLive_sf2 + //0490_SoundBlasterOld_sf2 + '0491_GeneralUserGS_sf2_file', + '0492_GeneralUserGS_sf2_file', + ], + gm_synth_strings_1: [ + // Synth Strings 1: Ensemble + '0500_Aspirin_sf2_file', + // 0500_Chaos_sf2_file // same as above + //0500_FluidR3_GM_sf2_file // detune + knack + '0500_GeneralUserGS_sf2_file', + '0500_JCLive_sf2_file', + //0500_SBLive_sf2 + //0500_SoundBlasterOld_sf2 + '0501_FluidR3_GM_sf2_file', + // 0501_GeneralUserGS_sf2_file // crackles + // 0502_FluidR3_GM_sf2_file // missing + '0502_GeneralUserGS_sf2_file', + '0503_FluidR3_GM_sf2_file', + // 0504_FluidR3_GM_sf2_file // missing + '0505_FluidR3_GM_sf2_file', + ], + gm_synth_strings_2: [ + // Synth Strings 2: Ensemble + '0510_Aspirin_sf2_file', + '0510_Chaos_sf2_file', + // 0510_FluidR3_GM_sf2_file // detune + crackle + '0510_GeneralUserGS_sf2_file', + //0510_JCLive_sf2_file // laarge and meh + //0510_SBLive_sf2 // missing + //0510_SoundBlasterOld_sf2 + '0511_GeneralUserGS_sf2_file', + //0511_SoundBlasterOld_sf + ], + gm_choir_aahs: [ + // Choir Aahs: Ensemble + '0520_Aspirin_sf2_file', + '0520_Chaos_sf2_file', + '0520_FluidR3_GM_sf2_file', + '0520_GeneralUserGS_sf2_file', + '0520_JCLive_sf2_file', + //0520_SBLive_sf2 + '0520_Soul_Ahhs_sf2_file', + //0520_SoundBlasterOld_sf2 + '0521_FluidR3_GM_sf2_file', + '0521_Soul_Ahhs_sf2_file', + //0521_SoundBlasterOld_sf2 + '0522_Soul_Ahhs_sf2_file', + ], + gm_voice_oohs: [ + // Voice Oohs: Ensemble + '0530_Aspirin_sf2_file', + '0530_Chaos_sf2_file', + '0530_FluidR3_GM_sf2_file', + '0530_GeneralUserGS_sf2_file', + //0530_JCLive_sf2_file // same as above + //0530_SBLive_sf2 + // 0530_Soul_Ahhs_sf2_file // not ooh + //0530_SoundBlasterOld_sf2 + '0531_FluidR3_GM_sf2_file', + // 0531_GeneralUserGS_sf2_file // ends crackle + '0531_JCLive_sf2_file', + //0531_SoundBlasterOld_sf + ], + gm_synth_choir: [ + // Synth Choir: Ensemble + '0540_Aspirin_sf2_file', + '0540_Chaos_sf2_file', + '0540_FluidR3_GM_sf2_file', + '0540_GeneralUserGS_sf2_file', + //0540_JCLive_sf2_file // large + crackles + //0540_SBLive_sf2 + //0540_SoundBlasterOld_sf2 + '0541_FluidR3_GM_sf2_file', + ], + gm_orchestra_hit: [ + // Orchestra Hit: Ensemble + '0550_Aspirin_sf2_file', + '0550_Chaos_sf2_file', + '0550_FluidR3_GM_sf2_file', + '0550_GeneralUserGS_sf2_file', + //0550_JCLive_sf2_file // same as above + //0550_SBLive_sf2 + //0550_SoundBlasterOld_sf2 + //0551_Aspirin_sf2_file // not an orch hit.. + '0551_FluidR3_GM_sf2_file', + ], + gm_trumpet: [ + // Trumpet: Brass + '0560_FluidR3_GM_sf2_file', + '0560_JCLive_sf2_file', + '0560_Aspirin_sf2_file', + '0560_Chaos_sf2_file', + //0560_GeneralUserGS_sf2_file // _1 oct + //0560_SBLive_sf2 + //0560_SoundBlasterOld_sf + ], + gm_trombone: [ + // Trombone: Brass + '0570_Aspirin_sf2_file', + '0570_Chaos_sf2_file', + '0570_FluidR3_GM_sf2_file', + '0570_GeneralUserGS_sf2_file', + //0570_JCLive_sf2_file // _1oct + //0570_SBLive_sf2 + //0570_SoundBlasterOld_sf2 + '0571_GeneralUserGS_sf2_file', + ], + gm_tuba: [ + // Tuba: Brass + '0580_FluidR3_GM_sf2_file', + '0580_Aspirin_sf2_file', + '0580_Chaos_sf2_file', + '0580_GeneralUserGS_sf2_file', + //0580_JCLive_sf2_file // _1oct + //0580_SBLive_sf2 + //0580_SoundBlasterOld_sf2 + //0581_GeneralUserGS_sf2_file // missin + ], + gm_muted_trumpet: [ + // Muted Trumpet: Brass + '0590_JCLive_sf2_file', + '0590_Aspirin_sf2_file', + '0590_Chaos_sf2_file', + '0590_FluidR3_GM_sf2_file', + '0590_GeneralUserGS_sf2_file', + //0590_SBLive_sf2 + //0590_SoundBlasterOld_sf2 + // 0591_GeneralUserGS_sf2_file // missin + ], + gm_french_horn: [ + // French Horn: Brass + '0600_Aspirin_sf2_file', + //0600_Chaos_sf2_file // weird jumps + '0600_FluidR3_GM_sf2_file', + '0600_GeneralUserGS_sf2_file', + '0600_JCLive_sf2_file', + //0600_SBLive_sf2 + //0600_SoundBlasterOld_sf2 + '0601_FluidR3_GM_sf2_file', + //0601_GeneralUserGS_sf2_file // tiny crackles + // 0602_GeneralUserGS_sf2_file // bad gain diffs + // 0603_GeneralUserGS_sf2_file // tiny crackle + ], + gm_brass_section: [ + // Brass Section: Brass + '0610_JCLive_sf2_file', + '0610_Aspirin_sf2_file', + '0610_Chaos_sf2_file', + '0610_FluidR3_GM_sf2_file', + '0610_GeneralUserGS_sf2_file', + //0610_SBLive_sf2 + //0610_SoundBlasterOld_sf2 + // 0611_GeneralUserGS_sf2_file // missing sounds + // 0612_GeneralUserGS_sf2_file + //0613_GeneralUserGS_sf2_file // _1 oct + // 0614_GeneralUserGS_sf2_file // missing sounds + // 0615_GeneralUserGS_sf2_file // missing sound + ], + gm_synth_brass_1: [ + // Synth Brass 1: Brass + '0620_Aspirin_sf2_file', + //0620_Chaos_sf2_file // weird gain diff + '0620_FluidR3_GM_sf2_file', + //0620_GeneralUserGS_sf2_file // loooud + // 0620_JCLive_sf2_file // weird gain diff + //0620_SBLive_sf2 + //0620_SoundBlasterOld_sf2 + '0621_Aspirin_sf2_file', + '0621_FluidR3_GM_sf2_file', + // 0621_GeneralUserGS_sf2_file // detune + loooud + //0622_FluidR3_GM_sf2_file // loud.. + //0622_GeneralUserGS_sf2_file // loud + crackle + ], + gm_synth_brass_2: [ + // Synth Brass 2: Brass + '0630_Aspirin_sf2_file', + '0630_Chaos_sf2_file', + '0630_FluidR3_GM_sf2_file', + //0630_GeneralUserGS_sf2_file // detune + looud + '0630_JCLive_sf2_file', + //0630_SBLive_sf2 + //0630_SoundBlasterOld_sf2 + // 0631_Aspirin_sf2_file // looud + detune + gain diffs + '0631_FluidR3_GM_sf2_file', + //0631_GeneralUserGS_sf2_file // crackles + '0632_FluidR3_GM_sf2_file', + '0633_FluidR3_GM_sf2_file', + ], + gm_soprano_sax: [ + // Soprano Sax: Reed + '0640_JCLive_sf2_file', + '0640_Aspirin_sf2_file', + '0640_Chaos_sf2_file', + '0640_FluidR3_GM_sf2_file', + // 0640_GeneralUserGS_sf2_file // crackles + //0640_SBLive_sf2 + //0640_SoundBlasterOld_sf2 + '0641_FluidR3_GM_sf2_file', + ], + gm_alto_sax: [ + // Alto Sax: Reed + //0650_Aspirin_sf2_file // this is not an alto sax + '0650_JCLive_sf2_file', + '0650_Chaos_sf2_file', + '0650_FluidR3_GM_sf2_file', + '0650_GeneralUserGS_sf2_file', + //0650_SBLive_sf2 + //0650_SoundBlasterOld_sf2 + '0651_Aspirin_sf2_file', + '0651_FluidR3_GM_sf2_file', + ], + gm_tenor_sax: [ + // Tenor Sax: Reed + '0660_JCLive_sf2_file', + '0660_Aspirin_sf2_file', + '0660_Chaos_sf2_file', + //0660_FluidR3_GM_sf2_file // weird pitches + '0660_GeneralUserGS_sf2_file', + //0660_SBLive_sf2 + //0660_SoundBlasterOld_sf2 + // 0661_FluidR3_GM_sf2_file // weird pitches + // 0661_GeneralUserGS_sf2_file // missin + ], + gm_baritone_sax: [ + // Baritone Sax: Reed + '0670_JCLive_sf2_file', + '0670_Aspirin_sf2_file', + '0670_Chaos_sf2_file', + '0670_FluidR3_GM_sf2_file', + '0670_GeneralUserGS_sf2_file', + //0670_SBLive_sf2 + //0670_SoundBlasterOld_sf2 + '0671_FluidR3_GM_sf2_file', + ], + gm_oboe: [ + // Oboe: Reed + //0680_Aspirin_sf2_file // tiny crackles + '0680_JCLive_sf2_file', + '0680_Chaos_sf2_file', + '0680_FluidR3_GM_sf2_file', + '0680_GeneralUserGS_sf2_file', + //0680_SBLive_sf2 + //0680_SoundBlasterOld_sf2 + '0681_FluidR3_GM_sf2_file', + ], + gm_english_horn: [ + // English Horn: Reed + '0690_JCLive_sf2_file', + '0690_Aspirin_sf2_file', + //0690_Chaos_sf2_file // detuned + '0690_FluidR3_GM_sf2_file', + //0690_GeneralUserGS_sf2_file // +1 oct + //0690_SBLive_sf2 + //0690_SoundBlasterOld_sf2 + '0691_FluidR3_GM_sf2_file', + ], + gm_bassoon: [ + // Bassoon: Reed + '0700_JCLive_sf2_file', + //0700_Aspirin_sf2_file // detune + gain diffs + // 0700_Chaos_sf2_file // detune + crackles + '0700_FluidR3_GM_sf2_file', + '0700_GeneralUserGS_sf2_file', + //0700_SBLive_sf2 + //0700_SoundBlasterOld_sf2 + '0701_FluidR3_GM_sf2_file', + //0701_GeneralUserGS_sf2_file // missin + ], + gm_clarinet: [ + // Clarinet: Reed + '0710_JCLive_sf2_file', + '0710_Aspirin_sf2_file', + '0710_Chaos_sf2_file', + '0710_FluidR3_GM_sf2_file', + '0710_GeneralUserGS_sf2_file', + //0710_SBLive_sf2 + //0710_SoundBlasterOld_sf2 + '0711_FluidR3_GM_sf2_file', + ], + gm_piccolo: [ + // Piccolo: Pipe + '0720_JCLive_sf2_file', + '0720_Aspirin_sf2_file', + // 0720_Chaos_sf2_file // not a piccolo + '0720_FluidR3_GM_sf2_file', + '0720_GeneralUserGS_sf2_file', + //0720_SBLive_sf2 + //0720_SoundBlasterOld_sf2 + '0721_FluidR3_GM_sf2_file', + //0721_SoundBlasterOld_sf + ], + gm_flute: [ + // Flute: Pipe + '0730_JCLive_sf2_file', + '0730_Aspirin_sf2_file', + //0730_Chaos_sf2_file // etune + '0730_FluidR3_GM_sf2_file', + '0730_GeneralUserGS_sf2_file', + //0730_SBLive_sf2 + //0730_SoundBlasterOld_sf2 + //0731_Aspirin_sf2_file // not a flute + '0731_FluidR3_GM_sf2_file', + //0731_SoundBlasterOld_sf + ], + gm_recorder: [ + // Recorder: Pipe + '0740_JCLive_sf2_file', + '0740_Aspirin_sf2_file', + '0740_Chaos_sf2_file', + '0740_FluidR3_GM_sf2_file', + '0740_GeneralUserGS_sf2_file', + //0740_SBLive_sf2 + //0740_SoundBlasterOld_sf2 + // 0741_GeneralUserGS_sf2_file // missin + ], + gm_pan_flute: [ + // Pan Flute: Pipe + '0750_JCLive_sf2_file', + '0750_FluidR3_GM_sf2_file', + '0750_Aspirin_sf2_file', + '0750_Chaos_sf2_file', + '0750_GeneralUserGS_sf2_file', + //0750_SBLive_sf2 + //0750_SoundBlasterOld_sf2 + '0751_Aspirin_sf2_file', + '0751_FluidR3_GM_sf2_file', + '0751_GeneralUserGS_sf2_file', + //0751_SoundBlasterOld_sf + ], + gm_blown_bottle: [ + // Blown bottle: Pipe + '0760_FluidR3_GM_sf2_file', + '0760_JCLive_sf2_file', + // 0760_Aspirin_sf2_file // same as below w crackle + '0760_Chaos_sf2_file', + '0760_GeneralUserGS_sf2_file', + //0760_SBLive_sf2 + //0760_SoundBlasterOld_sf2 + '0761_FluidR3_GM_sf2_file', + // 0761_GeneralUserGS_sf2_file // missing + //0761_SoundBlasterOld_sf2 + // 0762_GeneralUserGS_sf2_file // missin + ], + gm_shakuhachi: [ + // Shakuhachi: Pipe + '0770_JCLive_sf2_file', + '0771_FluidR3_GM_sf2_file', + '0770_Aspirin_sf2_file', + //0770_Chaos_sf2_file // not shakuhachi + '0770_FluidR3_GM_sf2_file', + '0770_GeneralUserGS_sf2_file', + //0770_SBLive_sf2 + //0770_SoundBlasterOld_sf2 + // 0771_GeneralUserGS_sf2_file // missing + // 0772_GeneralUserGS_sf2_file // missin + ], + gm_whistle: [ + // Whistle: Pipe + '0780_FluidR3_GM_sf2_file', + '0780_JCLive_sf2_file', + '0780_Aspirin_sf2_file', + '0780_Chaos_sf2_file', + //0780_GeneralUserGS_sf2_file // loud.. + //0780_SBLive_sf2 + //0780_SoundBlasterOld_sf2 + // 0781_GeneralUserGS_sf2_file // detune + crackle + ], + gm_ocarina: [ + // Ocarina: Pipe + '0790_FluidR3_GM_sf2_file', + '0790_JCLive_sf2_file', + '0790_Aspirin_sf2_file', + //0790_Chaos_sf2_file // same as above + '0790_GeneralUserGS_sf2_file', + //0790_SBLive_sf2 + //0790_SoundBlasterOld_sf2 + //0791_GeneralUserGS_sf2_file // missin + ], + gm_lead_1_square: [ + // Lead 1 (square): Synth Lead + '0800_Aspirin_sf2_file', + '0800_Chaos_sf2_file', + '0800_FluidR3_GM_sf2_file', + // 0800_GeneralUserGS_sf2_file // detuned + // 0800_JCLive_sf2_file // detuned + //0800_SBLive_sf2 + //0800_SoundBlasterOld_sf2 + //0801_FluidR3_GM_sf2_file // detune + // 0801_GeneralUserGS_sf2_file // detun + ], + gm_lead_2_sawtooth: [ + // Lead 2 (sawtooth): Synth Lead + '0810_JCLive_sf2_file', + '0810_Aspirin_sf2_file', + '0810_Chaos_sf2_file', + '0810_FluidR3_GM_sf2_file', + '0810_GeneralUserGS_sf2_file', + //0810_SBLive_sf2 + //0810_SoundBlasterOld_sf2 + '0811_Aspirin_sf2_file', + '0811_GeneralUserGS_sf2_file', + //0811_SoundBlasterOld_sf + ], + gm_lead_3_calliope: [ + // Lead 3 (calliope): Synth Lead + '0820_JCLive_sf2_file', + '0820_Aspirin_sf2_file', + '0820_Chaos_sf2_file', + '0820_FluidR3_GM_sf2_file', + '0820_GeneralUserGS_sf2_file', + //0820_SBLive_sf2 + //0820_SoundBlasterOld_sf2 + '0821_FluidR3_GM_sf2_file', + '0821_GeneralUserGS_sf2_file', + //0821_SoundBlasterOld_sf2 + // 0822_GeneralUserGS_sf2_file // missing + //0823_GeneralUserGS_sf2_file // missin + ], + gm_lead_4_chiff: [ + // Lead 4 (chiff): Synth Lead + '0830_JCLive_sf2_file', + '0830_Aspirin_sf2_file', + // 0830_Chaos_sf2_file // same as above + '0830_FluidR3_GM_sf2_file', + '0830_GeneralUserGS_sf2_file', + //0830_SBLive_sf2 + //0830_SoundBlasterOld_sf2 + '0831_FluidR3_GM_sf2_file', + '0831_GeneralUserGS_sf2_file', + //0831_SoundBlasterOld_sf + ], + gm_lead_5_charang: [ + // Lead 5 (charang): Synth Lead + '0840_JCLive_sf2_file', + '0840_FluidR3_GM_sf2_file', + '0840_Aspirin_sf2_file', + '0840_Chaos_sf2_file', + '0840_GeneralUserGS_sf2_file', + //0840_SBLive_sf2 + //0840_SoundBlasterOld_sf2 + '0841_Aspirin_sf2_file', + '0841_Chaos_sf2_file', + '0841_FluidR3_GM_sf2_file', + '0841_GeneralUserGS_sf2_file', + //0841_JCLive_sf2_file // +1oct + detune + //0841_SoundBlasterOld_sf2 + '0842_FluidR3_GM_sf2_file', + ], + gm_lead_6_voice: [ + // Lead 6 (voice): Synth Lead + '0850_JCLive_sf2_file', + '0850_Aspirin_sf2_file', + // 0850_Chaos_sf2_file // same as above + '0850_FluidR3_GM_sf2_file', + // 0850_GeneralUserGS_sf2_file // no voice + //0850_SBLive_sf2 + //0850_SoundBlasterOld_sf2 + '0851_FluidR3_GM_sf2_file', + '0851_GeneralUserGS_sf2_file', + '0851_JCLive_sf2_file', + //0851_SoundBlasterOld_sf + ], + gm_lead_7_fifths: [ + // Lead 7 (fifths): Synth Lead + '0860_JCLive_sf2_file', + '0860_Aspirin_sf2_file', + '0860_Chaos_sf2_file', + // 0860_FluidR3_GM_sf2_file // loud and not fitting + '0860_GeneralUserGS_sf2_file', + //0860_SBLive_sf2 + //0860_SoundBlasterOld_sf2 + '0861_Aspirin_sf2_file', + // 0861_FluidR3_GM_sf2_file // lout and not fitting + //0861_SoundBlasterOld_sf + ], + gm_lead_8_bass_lead: [ + // Lead 8 (bass + lead): Synth Lead + '0870_JCLive_sf2_file', + '0870_Aspirin_sf2_file', + '0870_Chaos_sf2_file', + '0870_FluidR3_GM_sf2_file', + '0870_GeneralUserGS_sf2_file', + //0870_SBLive_sf2 + //0870_SoundBlasterOld_sf2 + // 0871_GeneralUserGS_sf2_file // loud + detune + //0872_GeneralUserGS_sf2_file // loud + //0873_GeneralUserGS_sf2_file // lou + ], + gm_pad_new_age: [ + // Pad 1 (new age): Synth Pad + '0880_JCLive_sf2_file', + '0880_Aspirin_sf2_file', + '0880_Chaos_sf2_file', + '0880_FluidR3_GM_sf2_file', + '0880_GeneralUserGS_sf2_file', + //0880_SBLive_sf2 + //0880_SoundBlasterOld_sf2 + '0881_Aspirin_sf2_file', + '0881_FluidR3_GM_sf2_file', + '0881_GeneralUserGS_sf2_file', + //0881_SoundBlasterOld_sf2 + '0882_Aspirin_sf2_file', + // 0882_FluidR3_GM_sf2_file // missing + '0882_GeneralUserGS_sf2_file', + //0883_GeneralUserGS_sf2_file // missing + // 0884_GeneralUserGS_sf2_file // broken + '0885_GeneralUserGS_sf2_file', + //0886_GeneralUserGS_sf2_file // not a pad + '0887_GeneralUserGS_sf2_file', + //0888_GeneralUserGS_sf2_file // not a pad + //0889_GeneralUserGS_sf2_file // not a pa + ], + gm_pad_warm: [ + // Pad 2 (warm): Synth Pad + '0890_JCLive_sf2_file', + '0890_Aspirin_sf2_file', + '0890_Chaos_sf2_file', + '0890_FluidR3_GM_sf2_file', + '0890_GeneralUserGS_sf2_file', + //0890_SBLive_sf2 + //0890_SoundBlasterOld_sf2 + '0891_Aspirin_sf2_file', + '0891_FluidR3_GM_sf2_file', + // 0891_GeneralUserGS_sf2_file // nois + ], + gm_pad_poly: [ + // Pad 3 (polysynth): Synth Pad + //0900_Aspirin_sf2_file // same as belo + '0900_JCLive_sf2_file', + '0900_Chaos_sf2_file', + '0900_FluidR3_GM_sf2_file', + '0900_GeneralUserGS_sf2_file', + //0900_SBLive_sf2 + //0900_SoundBlasterOld_sf2 + '0901_Aspirin_sf2_file', + '0901_FluidR3_GM_sf2_file', + '0901_GeneralUserGS_sf2_file', + //0901_SoundBlasterOld_sf + ], + gm_pad_choir: [ + // Pad 4 (choir): Synth Pad + '0910_FluidR3_GM_sf2_file', + '0910_JCLive_sf2_file', + '0910_Aspirin_sf2_file', + //0910_Chaos_sf2_file // +1oct + '0910_GeneralUserGS_sf2_file', + //0910_SBLive_sf2 + //0910_SoundBlasterOld_sf2 + // 0911_Aspirin_sf2_file // fluty crackles + '0911_GeneralUserGS_sf2_file', + '0911_JCLive_sf2_file', + //0911_SoundBlasterOld_sf + ], + gm_pad_bowed: [ + // Pad 5 (bowed): Synth Pad + '0920_JCLive_sf2_file', + '0920_Aspirin_sf2_file', + //0920_Chaos_sf2_file // same as above + //0920_FluidR3_GM_sf2_file // detuned? + '0920_GeneralUserGS_sf2_file', + //0920_SBLive_sf2 + //0920_SoundBlasterOld_sf2 + '0921_Aspirin_sf2_file', + '0921_GeneralUserGS_sf2_file', + //0921_SoundBlasterOld_sf + ], + gm_pad_metallic: [ + // Pad 6 (metallic): Synth Pad + '0930_Aspirin_sf2_file', + '0930_Chaos_sf2_file', + '0930_FluidR3_GM_sf2_file', + '0930_GeneralUserGS_sf2_file', + // 0930_JCLive_sf2_file // buggy zones: guitar / synth + //0930_SBLive_sf2 + //0930_SoundBlasterOld_sf2 + '0931_Aspirin_sf2_file', + '0931_FluidR3_GM_sf2_file', + '0931_GeneralUserGS_sf2_file', + //0931_SoundBlasterOld_sf + ], + gm_pad_halo: [ + // Pad 7 (halo): Synth Pad + // 0940_Aspirin_sf2_file // same as below + '0940_Chaos_sf2_file', + '0940_FluidR3_GM_sf2_file', + '0940_GeneralUserGS_sf2_file', + '0940_JCLive_sf2_file', + //0940_SBLive_sf2 + //0940_SoundBlasterOld_sf2 + '0941_Aspirin_sf2_file', + '0941_FluidR3_GM_sf2_file', + '0941_GeneralUserGS_sf2_file', + '0941_JCLive_sf2_file', + ], + gm_pad_sweep: [ + // Pad 8 (sweep): Synth Pad + '0950_Aspirin_sf2_file', + '0950_Chaos_sf2_file', + '0950_FluidR3_GM_sf2_file', + '0950_GeneralUserGS_sf2_file', + '0950_JCLive_sf2_file', + //0950_SBLive_sf2 + //0950_SoundBlasterOld_sf2 + '0951_FluidR3_GM_sf2_file', + '0951_GeneralUserGS_sf2_file', + ], + gm_fx_rain: [ + // FX 1 (rain): Synth Effects + //0960_Aspirin_sf2_file //mixed samples? + '0960_FluidR3_GM_sf2_file', + '0960_Chaos_sf2_file', + '0960_GeneralUserGS_sf2_file', + // 0960_JCLive_sf2_file // mixed samples? + //0960_SBLive_sf2 + //0960_SoundBlasterOld_sf2 + '0961_Aspirin_sf2_file', + '0961_FluidR3_GM_sf2_file', + // 0961_GeneralUserGS_sf2_file // ?!?! + //0961_SoundBlasterOld_sf2 + '0962_GeneralUserGS_sf2_file', + ], + gm_fx_soundtrack: [ + // FX 2 (soundtrack): Synth Effects + '0970_FluidR3_GM_sf2_file', + '0970_Aspirin_sf2_file', + //0970_Chaos_sf2_file // wrong pitch + '0970_GeneralUserGS_sf2_file', + //0970_JCLive_sf2_file // wrong pitch + //0970_SBLive_sf2 + //0970_SoundBlasterOld_sf2 + '0971_FluidR3_GM_sf2_file', + '0971_GeneralUserGS_sf2_file', + //0971_SoundBlasterOld_sf + ], + gm_fx_crystal: [ + // FX 3 (crystal): Synth Effects + '0980_Aspirin_sf2_file', + '0980_JCLive_sf2_file', + '0980_Chaos_sf2_file', + // 0980_FluidR3_GM_sf2_file // some notes are weird + '0980_GeneralUserGS_sf2_file', + '0981_FluidR3_GM_sf2_file', + //0980_SBLive_sf2 + //0980_SoundBlasterOld_sf2 + '0981_Aspirin_sf2_file', + '0981_GeneralUserGS_sf2_file', + //0981_SoundBlasterOld_sf2 + '0982_GeneralUserGS_sf2_file', + '0983_GeneralUserGS_sf2_file', + '0984_GeneralUserGS_sf2_file', + ], + gm_fx_atmosphere: [ + // FX 4 (atmosphere): Synth Effects + '0990_JCLive_sf2_file', + '0990_Aspirin_sf2_file', + '0990_Chaos_sf2_file', + '0990_FluidR3_GM_sf2_file', + '0990_GeneralUserGS_sf2_file', + //0990_SBLive_sf2 + //0990_SoundBlasterOld_sf2 + '0991_Aspirin_sf2_file', + '0991_FluidR3_GM_sf2_file', + '0991_GeneralUserGS_sf2_file', + '0991_JCLive_sf2_file', + //0991_SoundBlasterOld_sf2 + '0992_FluidR3_GM_sf2_file', + '0992_JCLive_sf2_file', + '0993_JCLive_sf2_file', + '0994_JCLive_sf2_file', + ], + gm_fx_brightness: [ + // FX 5 (brightness): Synth Effects + '1000_JCLive_sf2_file', + '1000_Aspirin_sf2_file', + '1000_Chaos_sf2_file', + '1000_FluidR3_GM_sf2_file', + '1000_GeneralUserGS_sf2_file', + //1000_SBLive_sf2 + //1000_SoundBlasterOld_sf2 + '1001_Aspirin_sf2_file', + '1001_FluidR3_GM_sf2_file', + '1001_GeneralUserGS_sf2_file', + '1001_JCLive_sf2_file', + //1001_SoundBlasterOld_sf2 + '1002_Aspirin_sf2_file', + '1002_FluidR3_GM_sf2_file', + '1002_GeneralUserGS_sf2_file', + ], + gm_fx_goblins: [ + // FX 6 (goblins): Synth Effects + '1010_FluidR3_GM_sf2_file', + '1010_JCLive_sf2_file', + '1010_Aspirin_sf2_file', + '1010_Chaos_sf2_file', + '1010_GeneralUserGS_sf2_file', + //1010_SBLive_sf2 + //1010_SoundBlasterOld_sf2 + '1011_Aspirin_sf2_file', + '1011_FluidR3_GM_sf2_file', + '1011_JCLive_sf2_file', + '1012_Aspirin_sf2_file', + ], + gm_fx_echoes: [ + // FX 7 (echoes): Synth Effects + '1020_FluidR3_GM_sf2_file', + '1020_JCLive_sf2_file', + '1020_Aspirin_sf2_file', + '1020_Chaos_sf2_file', + '1020_GeneralUserGS_sf2_file', + //1020_SBLive_sf2 + //1020_SoundBlasterOld_sf2 + '1021_Aspirin_sf2_file', + '1021_FluidR3_GM_sf2_file', + '1021_GeneralUserGS_sf2_file', + '1021_JCLive_sf2_file', + //1021_SoundBlasterOld_sf2 + '1022_GeneralUserGS_sf2_file', + ], + gm_fx_sci_fi: [ + // FX 8 (sci_fi): Synth Effects + '1030_FluidR3_GM_sf2_file', + '1030_Aspirin_sf2_file', + '1030_Chaos_sf2_file', + '1030_GeneralUserGS_sf2_file', + '1030_JCLive_sf2_file', + //1030_SBLive_sf2 + //1030_SoundBlasterOld_sf2 + '1031_Aspirin_sf2_file', + '1031_FluidR3_GM_sf2_file', + '1031_GeneralUserGS_sf2_file', + //1031_SoundBlasterOld_sf2 + '1032_FluidR3_GM_sf2_file', + ], + gm_sitar: [ + // Sitar: Ethnic + '1040_Aspirin_sf2_file', + '1040_FluidR3_GM_sf2_file', + '1040_JCLive_sf2_file', + '1040_Chaos_sf2_file', + '1040_GeneralUserGS_sf2_file', + //1040_SBLive_sf2 + //1040_SoundBlasterOld_sf2 + '1041_FluidR3_GM_sf2_file', + '1041_GeneralUserGS_sf2_file', + ], + gm_banjo: [ + // Banjo: Ethnic + '1050_FluidR3_GM_sf2_file', + '1050_JCLive_sf2_file', + '1050_Aspirin_sf2_file', + '1050_Chaos_sf2_file', + '1050_GeneralUserGS_sf2_file', + //1050_SBLive_sf2 + //1050_SoundBlasterOld_sf2 + '1051_GeneralUserGS_sf2_file', + ], + gm_shamisen: [ + // Shamisen: Ethnic + '1060_JCLive_sf2_file', + '1060_FluidR3_GM_sf2_file', + '1060_Aspirin_sf2_file', + '1060_Chaos_sf2_file', + '1060_GeneralUserGS_sf2_file', + //1060_SBLive_sf2 + //1060_SoundBlasterOld_sf2 + '1061_FluidR3_GM_sf2_file', + '1061_GeneralUserGS_sf2_file', + //1061_SoundBlasterOld_sf + ], + gm_koto: [ + // Koto: Ethnic + '1070_FluidR3_GM_sf2_file', + '1070_JCLive_sf2_file', + '1070_Aspirin_sf2_file', + '1070_Chaos_sf2_file', + '1070_GeneralUserGS_sf2_file', + //1070_SBLive_sf2 + //1070_SoundBlasterOld_sf2 + '1071_FluidR3_GM_sf2_file', + '1071_GeneralUserGS_sf2_file', + '1072_GeneralUserGS_sf2_file', + '1073_GeneralUserGS_sf2_file', + ], + gm_kalimba: [ + // Kalimba: Ethnic + '1080_JCLive_sf2_file', + '1080_FluidR3_GM_sf2_file', + '1080_Aspirin_sf2_file', + '1080_Chaos_sf2_file', + '1080_GeneralUserGS_sf2_file', + //1080_SBLive_sf2 + //1080_SoundBlasterOld_sf2 + //1081_SoundBlasterOld_sf + ], + gm_bagpipe: [ + // Bagpipe: Ethnic + '1090_Aspirin_sf2_file', + // '1090_Chaos_sf2_file', // broken pitches + // '1090_GeneralUserGS_sf2_file', // broken pitches + // '1090_FluidR3_GM_sf2_file', // broken pitches ? + // '1090_JCLive_sf2_file', // broken pitches ? + //1090_SBLive_sf2 + //1090_SoundBlasterOld_sf2 + //1091_SoundBlasterOld_sf + ], + gm_fiddle: [ + // Fiddle: Ethnic + '1100_JCLive_sf2_file', + '1100_Aspirin_sf2_file', + '1100_Chaos_sf2_file', + '1100_FluidR3_GM_sf2_file', + '1100_GeneralUserGS_sf2_file', + //1100_SBLive_sf2 + //1100_SoundBlasterOld_sf2 + '1101_Aspirin_sf2_file', + '1101_FluidR3_GM_sf2_file', + '1101_GeneralUserGS_sf2_file', + '1102_GeneralUserGS_sf2_file', + ], + gm_shanai: [ + // Shanai: Ethnic + '1110_Aspirin_sf2_file', + '1110_FluidR3_GM_sf2_file', + '1110_JCLive_sf2_file', + '1110_Chaos_sf2_file', + '1110_GeneralUserGS_sf2_file', + //1110_SBLive_sf2 + //1110_SoundBlasterOld_sf + ], + gm_tinkle_bell: [ + // Tinkle Bell: Percussive + '1120_Aspirin_sf2_file', + // '1120_Chaos_sf2_file', // same as above + // '1120_GeneralUserGS_sf2_file', // sounds exactly as Aspirin + // '1120_FluidR3_GM_sf2_file', // +1oct + // '1120_JCLive_sf2_file', // +1oct + //1120_SBLive_sf2 + //1120_SoundBlasterOld_sf2 + //1121_SoundBlasterOld_sf + ], + gm_agogo: [ + // Agogo: Percussive + '1130_JCLive_sf2_file', + '1130_Aspirin_sf2_file', + '1130_Chaos_sf2_file', + '1130_FluidR3_GM_sf2_file', + '1130_GeneralUserGS_sf2_file', + //1130_SBLive_sf2 + //1130_SoundBlasterOld_sf2 + '1131_FluidR3_GM_sf2_file', + //1131_SoundBlasterOld_sf + ], + gm_steel_drums: [ + // Steel Drums: Percussive + '1140_FluidR3_GM_sf2_file', + '1140_Aspirin_sf2_file', + '1140_JCLive_sf2_file', + '1140_Chaos_sf2_file', + '1140_GeneralUserGS_sf2_file', + //1140_SBLive_sf2 + //1140_SoundBlasterOld_sf2 + '1141_FluidR3_GM_sf2_file', + ], + gm_woodblock: [ + // Woodblock: Percussive + '1150_JCLive_sf2_file', + '1150_Aspirin_sf2_file', + '1150_Chaos_sf2_file', + '1150_FluidR3_GM_sf2_file', + '1150_GeneralUserGS_sf2_file', + //1150_SBLive_sf2 + //1150_SoundBlasterOld_sf2 + '1151_FluidR3_GM_sf2_file', + '1151_GeneralUserGS_sf2_file', + '1152_FluidR3_GM_sf2_file', + '1152_GeneralUserGS_sf2_file', + ], + gm_taiko_drum: [ + // Taiko Drum: Percussive + '1160_JCLive_sf2_file', + '1160_FluidR3_GM_sf2_file', + '1160_Aspirin_sf2_file', + '1160_Chaos_sf2_file', + '1160_GeneralUserGS_sf2_file', + //1160_SBLive_sf2 + //1160_SoundBlasterOld_sf2 + '1161_FluidR3_GM_sf2_file', + '1161_GeneralUserGS_sf2_file', + //1161_SoundBlasterOld_sf2 + '1162_FluidR3_GM_sf2_file', + '1162_GeneralUserGS_sf2_file', + '1163_FluidR3_GM_sf2_file', + ], + gm_melodic_tom: [ + // Melodic Tom: Percussive + '1170_JCLive_sf2_file', + '1170_Aspirin_sf2_file', + '1170_Chaos_sf2_file', + '1170_FluidR3_GM_sf2_file', + '1170_GeneralUserGS_sf2_file', + //1170_SBLive_sf2 + //1170_SoundBlasterOld_sf2 + '1171_FluidR3_GM_sf2_file', + '1171_GeneralUserGS_sf2_file', + '1172_FluidR3_GM_sf2_file', + '1173_FluidR3_GM_sf2_file', + ], + gm_synth_drum: [ + // Synth Drum: Percussive + '1180_JCLive_sf2_file', + '1180_Aspirin_sf2_file', + '1180_Chaos_sf2_file', + '1180_FluidR3_GM_sf2_file', + '1180_GeneralUserGS_sf2_file', + //1180_SBLive_sf2 + //1180_SoundBlasterOld_sf2 + '1181_FluidR3_GM_sf2_file', + '1181_GeneralUserGS_sf2_file', + //1181_SoundBlasterOld_sf + ], + gm_reverse_cymbal: [ + // Reverse Cymbal: Percussive + '1190_JCLive_sf2_file', + '1190_Aspirin_sf2_file', + '1190_Chaos_sf2_file', + '1190_FluidR3_GM_sf2_file', + '1190_GeneralUserGS_sf2_file', + //1190_SBLive_sf2 + //1190_SoundBlasterOld_sf2 + '1191_GeneralUserGS_sf2_file', + '1192_GeneralUserGS_sf2_file', + '1193_GeneralUserGS_sf2_file', + '1194_GeneralUserGS_sf2_file', + ], + gm_guitar_fret_noise: [ + // Guitar Fret Noise: Sound effects + '1200_JCLive_sf2_file', + '1200_Aspirin_sf2_file', + '1200_Chaos_sf2_file', + '1200_FluidR3_GM_sf2_file', + '1200_GeneralUserGS_sf2_file', + //1200_SBLive_sf2 + //1200_SoundBlasterOld_sf2 + '1201_Aspirin_sf2_file', + '1201_GeneralUserGS_sf2_file', + '1202_GeneralUserGS_sf2_file', + ], + gm_breath_noise: [ + // Breath Noise: Sound effects + '1210_FluidR3_GM_sf2_file', + '1210_JCLive_sf2_file', + '1210_Aspirin_sf2_file', + '1210_Chaos_sf2_file', + '1210_GeneralUserGS_sf2_file', + //1210_SBLive_sf2 + //1210_SoundBlasterOld_sf2 + '1211_Aspirin_sf2_file', + '1211_GeneralUserGS_sf2_file', + '1212_GeneralUserGS_sf2_file', + ], + gm_seashore: [ + // Seashore: Sound effects + '1220_JCLive_sf2_file', + '1220_Aspirin_sf2_file', + '1220_Chaos_sf2_file', + '1220_FluidR3_GM_sf2_file', + '1220_GeneralUserGS_sf2_file', + //1220_SBLive_sf2 + //1220_SoundBlasterOld_sf2 + '1221_Aspirin_sf2_file', + '1221_GeneralUserGS_sf2_file', + '1221_JCLive_sf2_file', + '1222_Aspirin_sf2_file', + '1222_GeneralUserGS_sf2_file', + '1223_Aspirin_sf2_file', + '1223_GeneralUserGS_sf2_file', + '1224_Aspirin_sf2_file', + '1224_GeneralUserGS_sf2_file', + '1225_GeneralUserGS_sf2_file', + '1226_GeneralUserGS_sf2_file', + ], + gm_bird_tweet: [ + // Bird Tweet: Sound effects + '1230_FluidR3_GM_sf2_file', + '1230_JCLive_sf2_file', + '1230_Aspirin_sf2_file', + // '1230_Chaos_sf2_file', + '1230_GeneralUserGS_sf2_file', + //1230_SBLive_sf2 + //1230_SoundBlasterOld_sf2 + //'1231_Aspirin_sf2_file', + '1231_GeneralUserGS_sf2_file', // dog + // '1232_Aspirin_sf2_file',// ? + '1232_GeneralUserGS_sf2_file', // horse + // '1233_GeneralUserGS_sf2_file', // + '1234_GeneralUserGS_sf2_file', // scratch + ], + gm_telephone: [ + // Telephone Ring: Sound effects + '1240_JCLive_sf2_file', + '1240_Aspirin_sf2_file', + '1240_Chaos_sf2_file', + '1240_FluidR3_GM_sf2_file', + // '1240_GeneralUserGS_sf2_file', + //1240_SBLive_sf2 + //1240_SoundBlasterOld_sf2 + '1241_Aspirin_sf2_file', // door? + //'1241_GeneralUserGS_sf2_file', + // '1242_Aspirin_sf2_file', // ? + '1242_GeneralUserGS_sf2_file', // door + '1243_Aspirin_sf2_file', // scratch + '1243_GeneralUserGS_sf2_file', // door close? + '1244_Aspirin_sf2_file', // bells + '1244_GeneralUserGS_sf2_file', // bells + ], + gm_helicopter: [ + // Helicopter: Sound effects + '1250_JCLive_sf2_file', + '1250_Aspirin_sf2_file', + // '1250_Chaos_sf2_file', // same as above + '1250_FluidR3_GM_sf2_file', + '1250_GeneralUserGS_sf2_file', + //1250_SBLive_sf2 + //1250_SoundBlasterOld_sf2 + // '1251_Aspirin_sf2_file', // slooow + '1251_FluidR3_GM_sf2_file', // guitar + '1251_GeneralUserGS_sf2_file', // engine start with loop at end.. + '1252_Aspirin_sf2_file', // alien + '1252_FluidR3_GM_sf2_file', // seashore + '1252_GeneralUserGS_sf2_file', // carbreak + // '1253_Aspirin_sf2_file', // plane + '1253_GeneralUserGS_sf2_file', // racing car + // '1254_Aspirin_sf2_file', + '1254_GeneralUserGS_sf2_file', // breaking + // '1255_Aspirin_sf2_file', + '1255_GeneralUserGS_sf2_file', // siren + // '1256_Aspirin_sf2_file', + '1256_GeneralUserGS_sf2_file', // hmm + // '1257_Aspirin_sf2_file', + '1257_GeneralUserGS_sf2_file', // noise + // '1258_Aspirin_sf2_file', + '1258_GeneralUserGS_sf2_file', // metallic noise + '1259_GeneralUserGS_sf2_file', // watery nosie + ], + gm_applause: [ + // Applause: Sound effects + '1260_JCLive_sf2_file', + '1260_Aspirin_sf2_file', + '1260_Chaos_sf2_file', + '1260_FluidR3_GM_sf2_file', + '1260_GeneralUserGS_sf2_file', + //1260_SBLive_sf2 + //1260_SoundBlasterOld_sf2 + '1261_Aspirin_sf2_file', + '1261_GeneralUserGS_sf2_file', + '1262_Aspirin_sf2_file', + '1262_GeneralUserGS_sf2_file', + '1263_Aspirin_sf2_file', + '1263_GeneralUserGS_sf2_file', + '1264_Aspirin_sf2_file', + '1264_GeneralUserGS_sf2_file', + '1265_Aspirin_sf2_file', + '1265_GeneralUserGS_sf2_file', + ], + gm_gunshot: [ + // Gunshot: Sound effects + '1270_JCLive_sf2_file', + '1270_Aspirin_sf2_file', + '1270_Chaos_sf2_file', + '1270_FluidR3_GM_sf2_file', + '1270_GeneralUserGS_sf2_file', + //1270_SBLive_sf2 + //1270_SoundBlasterOld_sf2 + '1271_Aspirin_sf2_file', + '1271_GeneralUserGS_sf2_file', + '1272_Aspirin_sf2_file', + '1272_GeneralUserGS_sf2_file', + '1273_GeneralUserGS_sf2_file', + '1274_GeneralUserGS_sf2_file', + '', + ], +}; diff --git a/src/strudel/soundfonts/index.mjs b/src/strudel/soundfonts/index.mjs new file mode 100644 index 0000000..3179260 --- /dev/null +++ b/src/strudel/soundfonts/index.mjs @@ -0,0 +1,6 @@ +import { getFontBufferSource, registerSoundfonts, setSoundfontUrl } from './fontloader.mjs'; +import * as soundfontList from './list.mjs'; +import { startPresetNote } from 'sfumato'; +import { loadSoundfont } from './sfumato.mjs'; + +export { loadSoundfont, startPresetNote, getFontBufferSource, soundfontList, registerSoundfonts, setSoundfontUrl }; diff --git a/src/strudel/soundfonts/list.mjs b/src/strudel/soundfonts/list.mjs new file mode 100644 index 0000000..116eecf --- /dev/null +++ b/src/strudel/soundfonts/list.mjs @@ -0,0 +1,2028 @@ +// this list is not used anymore.. + +export const instruments = [ + // Acoustic Grand Piano: Piano + '0000_JCLive_sf2_file', + '0000_Aspirin_sf2_file', + '0000_Chaos_sf2_file', + '0000_FluidR3_GM_sf2_file', + '0000_GeneralUserGS_sf2_file', + //'0000_SBLive_sf2', + //'0000_SoundBlasterOld_sf2', + '0001_FluidR3_GM_sf2_file', + '0001_GeneralUserGS_sf2_file', + + // Bright Acoustic Piano: Piano + '0010_Aspirin_sf2_file', + '0010_Chaos_sf2_file', + '0010_FluidR3_GM_sf2_file', + '0010_GeneralUserGS_sf2_file', + '0010_JCLive_sf2_file', + //'0010_SBLive_sf2', + //'0010_SoundBlasterOld_sf2', + '0011_Aspirin_sf2_file', + '0011_FluidR3_GM_sf2_file', + '0011_GeneralUserGS_sf2_file', + '0012_GeneralUserGS_sf2_file', // string?? + + // Electric Grand Piano: Piano + '0020_Aspirin_sf2_file', + '0020_Chaos_sf2_file', + '0020_FluidR3_GM_sf2_file', + '0020_GeneralUserGS_sf2_file', + '0020_JCLive_sf2_file', + //'0020_SBLive_sf2', + //'0020_SoundBlasterOld_sf2', + '0021_Aspirin_sf2_file', + '0021_GeneralUserGS_sf2_file', + // ? + '0022_Aspirin_sf2_file', // dx7 epiano like + + // Honky-tonk Piano: Piano + '0030_Aspirin_sf2_file', + '0030_Chaos_sf2_file', + '0030_FluidR3_GM_sf2_file', + '0030_GeneralUserGS_sf2_file', + '0030_JCLive_sf2_file', + //'0030_SBLive_sf2', + //'0030_SoundBlasterOld_sf2', + '0031_Aspirin_sf2_file', + '0031_FluidR3_GM_sf2_file', + '0031_GeneralUserGS_sf2_file', + //'0031_SoundBlasterOld_sf2', // pianos until here + + // Electric Piano 1: Piano + '0040_Aspirin_sf2_file', + '0040_Chaos_sf2_file', + '0040_FluidR3_GM_sf2_file', // rhodes + '0040_GeneralUserGS_sf2_file', // staccato rhodes + '0040_JCLive_sf2_file', // warbly rhodes + //'0040_SBLive_sf2', // ? + //'0040_SoundBlasterOld_sf2', // ? + '0041_FluidR3_GM_sf2_file', // rhodes + '0041_GeneralUserGS_sf2_file', // staccato rhodes + //'0041_SoundBlasterOld_sf2', // ? + '0042_GeneralUserGS_sf2_file', // staccato wurly + '0043_GeneralUserGS_sf2_file', // high bell + '0044_GeneralUserGS_sf2_file', // reed organ + //'0045_GeneralUserGS_sf2_file', // ? + '0046_GeneralUserGS_sf2_file', // reed organ + + // Electric Piano 2: Piano + '0050_Aspirin_sf2_file', // glass piano + '0050_Chaos_sf2_file', // short glass piano + '0050_FluidR3_GM_sf2_file', // long glass piano ! + // ? + '0050_GeneralUserGS_sf2_file', // short glass piano + // cont + '0050_JCLive_sf2_file', // glass piano + //'0050_SBLive_sf2', // ? + //'0050_SoundBlasterOld_sf2', // ? + '0051_FluidR3_GM_sf2_file', // long lass organ + '0051_GeneralUserGS_sf2_file', + //'0052_GeneralUserGS_sf2_file', // ? + '0053_GeneralUserGS_sf2_file', + // normal piano... + '0054_GeneralUserGS_sf2_file', // piano + + // Harpsichord: Piano + '0060_Aspirin_sf2_file', // harpsichord + '0060_Chaos_sf2_file', + '0060_FluidR3_GM_sf2_file', // harpsichord ! + '0060_GeneralUserGS_sf2_file', + '0060_JCLive_sf2_file', + //'0060_SBLive_sf2', + //'0060_SoundBlasterOld_sf2', + '0061_Aspirin_sf2_file', + '0061_GeneralUserGS_sf2_file', + //'0061_SoundBlasterOld_sf2', + '0062_GeneralUserGS_sf2_file', + + // Clavinet: Piano + '0070_Aspirin_sf2_file', + '0070_Chaos_sf2_file', + '0070_FluidR3_GM_sf2_file', + // '0070_GeneralUserGS_sf2_file', // half broken + '0070_JCLive_sf2_file', + //'0070_SBLive_sf2', + //'0070_SoundBlasterOld_sf2', + // '0071_GeneralUserGS_sf2_file', // half broken + + // Celesta: Chromatic Percussion + '0080_Aspirin_sf2_file', + '0080_Chaos_sf2_file', + '0080_FluidR3_GM_sf2_file', + '0080_GeneralUserGS_sf2_file', + '0080_JCLive_sf2_file', + //'0080_SBLive_sf2', + //'0080_SoundBlasterOld_sf2', + '0081_FluidR3_GM_sf2_file', + // '0081_GeneralUserGS_sf2_file', // weird detuned + //'0081_SoundBlasterOld_sf2', + + // Glockenspiel: Chromatic Percussion + '0090_Aspirin_sf2_file', + '0090_Chaos_sf2_file', + '0090_FluidR3_GM_sf2_file', + '0090_GeneralUserGS_sf2_file', + '0090_JCLive_sf2_file', + //'0090_SBLive_sf2', + //'0090_SoundBlasterOld_sf2', + //'0091_SoundBlasterOld_sf2', + + // Music Box: Chromatic Percussion + '0100_Aspirin_sf2_file', + '0100_Chaos_sf2_file', + '0100_FluidR3_GM_sf2_file', + '0100_GeneralUserGS_sf2_file', + '0100_JCLive_sf2_file', + //'0100_SBLive_sf2', + //'0100_SoundBlasterOld_sf2', + // '0101_GeneralUserGS_sf2_file', // weird detuned + //'0101_SoundBlasterOld_sf2', + + // Vibraphone: Chromatic Percussion + '0110_Aspirin_sf2_file', + '0110_Chaos_sf2_file', + '0110_FluidR3_GM_sf2_file', + '0110_GeneralUserGS_sf2_file', + '0110_JCLive_sf2_file', + //'0110_SBLive_sf2', + //'0110_SoundBlasterOld_sf2', + '0111_FluidR3_GM_sf2_file', + + // Marimba: Chromatic Percussion + '0120_Aspirin_sf2_file', + '0120_Chaos_sf2_file', + '0120_FluidR3_GM_sf2_file', + '0120_GeneralUserGS_sf2_file', + '0120_JCLive_sf2_file', + //'0120_SBLive_sf2', + //'0120_SoundBlasterOld_sf2', + '0121_FluidR3_GM_sf2_file', + '0121_GeneralUserGS_sf2_file', // not really a marimba + + // Xylophone: Chromatic Percussion + '0130_Aspirin_sf2_file', + '0130_Chaos_sf2_file', + '0130_FluidR3_GM_sf2_file', + '0130_GeneralUserGS_sf2_file', + '0130_JCLive_sf2_file', + //'0130_SBLive_sf2', + //'0130_SoundBlasterOld_sf2', + '0131_FluidR3_GM_sf2_file', + + // Tubular Bells: Chromatic Percussion + '0140_Aspirin_sf2_file', + // '0140_Chaos_sf2_file', // same as aspirin? + '0140_FluidR3_GM_sf2_file', + '0140_GeneralUserGS_sf2_file', + '0140_JCLive_sf2_file', + //'0140_SBLive_sf2', + //'0140_SoundBlasterOld_sf2', + '0141_FluidR3_GM_sf2_file', + //'0141_GeneralUserGS_sf2_file', + '0142_GeneralUserGS_sf2_file', // epiano.. + // '0143_GeneralUserGS_sf2_file', // buggy + + // Dulcimer: Chromatic Percussion + '0150_Aspirin_sf2_file', + '0150_Chaos_sf2_file', // long load? + '0150_FluidR3_GM_sf2_file', + '0150_GeneralUserGS_sf2_file', + // '0150_JCLive_sf2_file', // detuned??? + //'0150_SBLive_sf2', + //'0150_SoundBlasterOld_sf2', + '0151_FluidR3_GM_sf2_file', + + // Drawbar Organ: Organ + '0160_Aspirin_sf2_file', + '0160_Chaos_sf2_file', + '0160_FluidR3_GM_sf2_file', + '0160_GeneralUserGS_sf2_file', + '0160_JCLive_sf2_file', + //'0160_SBLive_sf2', + //'0160_SoundBlasterOld_sf2', + '0161_Aspirin_sf2_file', + '0161_FluidR3_GM_sf2_file', + //'0161_SoundBlasterOld_sf2', + + // Percussive Organ: Organ + '0170_Aspirin_sf2_file', + '0170_Chaos_sf2_file', + '0170_FluidR3_GM_sf2_file', + // '0170_GeneralUserGS_sf2_file', // repitched + '0170_JCLive_sf2_file', + //'0170_SBLive_sf2', + //'0170_SoundBlasterOld_sf2', + '0171_FluidR3_GM_sf2_file', + // '0171_GeneralUserGS_sf2_file', // repitched + '0172_FluidR3_GM_sf2_file', + + // Rock Organ: Organ + '0180_Aspirin_sf2_file', + '0180_Chaos_sf2_file', + '0180_FluidR3_GM_sf2_file', + '0180_GeneralUserGS_sf2_file', + '0180_JCLive_sf2_file', + //'0180_SBLive_sf2', + //'0180_SoundBlasterOld_sf2', + //'0181_Aspirin_sf2_file', // flute + //'0181_GeneralUserGS_sf2_file', // marimbalike + //'0181_SoundBlasterOld_sf2', + + // Church Organ: Organ + '0190_Aspirin_sf2_file', + '0190_Chaos_sf2_file', + '0190_FluidR3_GM_sf2_file', + '0190_GeneralUserGS_sf2_file', + '0190_JCLive_sf2_file', + //'0190_SBLive_sf2', + //'0190_SoundBlasterOld_sf2', + //'0191_Aspirin_sf2_file', // string?? + //'0191_GeneralUserGS_sf2_file', // weird organ + //'0191_SoundBlasterOld_sf2', + + // Reed Organ: Organ + '0200_Aspirin_sf2_file', + '0200_Chaos_sf2_file', + '0200_FluidR3_GM_sf2_file', + '0200_GeneralUserGS_sf2_file', + '0200_JCLive_sf2_file', // stringy + //'0200_SBLive_sf2', + //'0200_SoundBlasterOld_sf2', + '0201_Aspirin_sf2_file', // stringy + '0201_FluidR3_GM_sf2_file', + '0201_GeneralUserGS_sf2_file', + //'0201_SoundBlasterOld_sf2', + //'0210_Aspirin_sf2_file', // buggy + //'0210_Chaos_sf2_file', // buggy + + // Accordion: Organ + '0210_FluidR3_GM_sf2_file', + '0210_GeneralUserGS_sf2_file', + '0210_JCLive_sf2_file', + //'0210_SBLive_sf2', + //'0210_SoundBlasterOld_sf2', + '0211_Aspirin_sf2_file', // stringy + '0211_FluidR3_GM_sf2_file', + '0211_GeneralUserGS_sf2_file', + //'0211_SoundBlasterOld_sf2', + '0212_GeneralUserGS_sf2_file', + + // Harmonica: Organ + '0220_Aspirin_sf2_file', + '0220_Chaos_sf2_file', + '0220_FluidR3_GM_sf2_file', + '0220_GeneralUserGS_sf2_file', + '0220_JCLive_sf2_file', + //'0220_SBLive_sf2', + //'0220_SoundBlasterOld_sf2', + '0221_FluidR3_GM_sf2_file', + + // Tango Accordion: Organ + '0230_Aspirin_sf2_file', + '0230_Chaos_sf2_file', + '0230_FluidR3_GM_sf2_file', + '0230_GeneralUserGS_sf2_file', + '0230_JCLive_sf2_file', + //'0230_SBLive_sf2', + //'0230_SoundBlasterOld_sf2', + '0231_FluidR3_GM_sf2_file', + '0231_GeneralUserGS_sf2_file', // warbly + '0231_JCLive_sf2_file', + //'0231_SoundBlasterOld_sf2', + '0232_FluidR3_GM_sf2_file', + '0233_FluidR3_GM_sf2_file', + + // Acoustic Guitar (nylon): Guitar + '0240_Aspirin_sf2_file', + '0240_Chaos_sf2_file', + '0240_FluidR3_GM_sf2_file', + '0240_GeneralUserGS_sf2_file', + '0240_JCLive_sf2_file', + '0240_LK_Godin_Nylon_SF2_file', + //'0240_SBLive_sf2', + //'0240_SoundBlasterOld_sf2', + // '0241_GeneralUserGS_sf2_file', // organ like + '0241_JCLive_sf2_file', + '0242_JCLive_sf2_file', + '0243_JCLive_sf2_file', + + // Acoustic Guitar (steel): Guitar + '0253_Acoustic_Guitar_sf2_file', + '0250_Aspirin_sf2_file', + '0250_Chaos_sf2_file', + '0250_FluidR3_GM_sf2_file', + '0250_GeneralUserGS_sf2_file', + // '0250_JCLive_sf2_file', // detuned + '0250_LK_AcousticSteel_SF2_file', + //'0250_SBLive_sf2', + //'0250_SoundBlasterOld_sf2', + //'0251_Acoustic_Guitar_sf2_file', // detuned? + // '0251_GeneralUserGS_sf2_file', // broken: missing pitches + // '0252_Acoustic_Guitar_sf2_file', // detuned.. + // '0252_GeneralUserGS_sf2_file', // broken: missing pitches + '0253_Acoustic_Guitar_sf2_file', + '0253_GeneralUserGS_sf2_file', + '0254_Acoustic_Guitar_sf2_file', // bends.. detuned + '0254_GeneralUserGS_sf2_file', + //'0255_GeneralUserGS_sf2_file', // no guitar.. + + // Electric Guitar (jazz): Guitar + '0260_Aspirin_sf2_file', // sounds like an epiano + '0260_Chaos_sf2_file', // weird but cool detune + '0260_FluidR3_GM_sf2_file', + '0260_GeneralUserGS_sf2_file', + '0260_JCLive_sf2_file', + //'0260_SBLive_sf2', + //'0260_SoundBlasterOld_sf2', + '0260_Stratocaster_sf2_file', // -1 octave + '0261_GeneralUserGS_sf2_file', + //'0261_SoundBlasterOld_sf2', + '0261_Stratocaster_sf2_file', // -1 octave + '0262_Stratocaster_sf2_file', // -1 octave + + // Electric Guitar (clean): Guitar + '0270_Aspirin_sf2_file', + '0270_Chaos_sf2_file', // sounds meh + '0270_FluidR3_GM_sf2_file', + '0270_GeneralUserGS_sf2_file', + //'0270_Gibson_Les_Paul_sf2_file', // detuned + // '0270_JCLive_sf2_file', // broken: missing notes + '0270_SBAWE32_sf2_file', + //'0270_SBLive_sf2', + //'0270_SoundBlasterOld_sf2', + '0270_Stratocaster_sf2_file', // -1 octave + '0271_GeneralUserGS_sf2_file', + '0271_Stratocaster_sf2_file', // -1 octave + '0272_Stratocaster_sf2_file', // -1 octave + + // Electric Guitar (muted): Guitar + '0280_Aspirin_sf2_file', + '0280_Chaos_sf2_file', + // '0280_FluidR3_GM_sf2_file', // broken: wrong notes + '0280_GeneralUserGS_sf2_file', + '0280_JCLive_sf2_file', + //'0280_LesPaul_sf2', // missing + '0280_LesPaul_sf2_file', // not really muted.. + '0280_SBAWE32_sf2_file', + //'0280_SBLive_sf2', + //'0280_SoundBlasterOld_sf2', + '0281_Aspirin_sf2_file', + '0281_FluidR3_GM_sf2_file', + '0281_GeneralUserGS_sf2_file', + '0282_FluidR3_GM_sf2_file', + // '0282_GeneralUserGS_sf2_file', // broken: missing notes + // '0283_GeneralUserGS_sf2_file', // missing + + // Overdriven Guitar: Guitar + '0290_Aspirin_sf2_file', + '0290_Chaos_sf2_file', + '0290_FluidR3_GM_sf2_file', + '0290_GeneralUserGS_sf2_file', + //'0290_JCLive_sf2_file', // detuned.... + //'0290_LesPaul_sf2', // broken + '0290_LesPaul_sf2_file', + '0290_SBAWE32_sf2_file', + //'0290_SBLive_sf2', + //'0290_SoundBlasterOld_sf2', + // '0291_Aspirin_sf2_file', // broken + // '0291_LesPaul_sf2', // broken + '0291_LesPaul_sf2_file', + '0291_SBAWE32_sf2_file', + //'0291_SoundBlasterOld_sf2', + '0292_Aspirin_sf2_file', + // '0292_LesPaul_sf2', // broken + '0292_LesPaul_sf2_file', + + // Distortion Guitar: Guitar + '0300_Aspirin_sf2_file', + '0300_Chaos_sf2_file', + '0300_FluidR3_GM_sf2_file', + '0300_GeneralUserGS_sf2_file', + // '0300_JCLive_sf2_file', // broken + // '0300_LesPaul_sf2', // broken + '0300_LesPaul_sf2_file', + //'0300_SBAWE32_sf2_file', // -2 octave + //'0300_SBLive_sf2', + //'0300_SoundBlasterOld_sf2', + // '0301_Aspirin_sf2_file', // missing + //'0301_FluidR3_GM_sf2_file', // weird broken bell + // '0301_GeneralUserGS_sf2_file', // broken + // '0301_JCLive_sf2_file', // broken + // '0301_LesPaul_sf2', // missing + // '0301_LesPaul_sf2_file', // + 1 oct? + '0302_Aspirin_sf2_file', + // '0302_GeneralUserGS_sf2_file', // not a guitar.. + //'0302_JCLive_sf2_file', // broken... + // '0303_Aspirin_sf2_file', // guitar harmonic?? + '0304_Aspirin_sf2_file', + + // Guitar Harmonics: Guitar + '0310_Aspirin_sf2_file', + '0310_Chaos_sf2_file', + '0310_FluidR3_GM_sf2_file', // weird.. + //'0310_GeneralUserGS_sf2_file', // weird.. + // '0310_JCLive_sf2_file', // weird + //'0310_LesPaul_sf2', // missing + //'0310_LesPaul_sf2_file', // wrong pitches + //'0310_SBAWE32_sf2_file', // wrong pitches + //'0310_SBLive_sf2', + //'0310_SoundBlasterOld_sf2', + //'0311_FluidR3_GM_sf2_file', // knackt + //'0311_GeneralUserGS_sf2_file', // wrong notes + + // Acoustic Bass: Bass + '0320_Aspirin_sf2_file', + '0320_Chaos_sf2_file', + '0320_FluidR3_GM_sf2_file', + // '0320_GeneralUserGS_sf2_file', // missing notes + '0320_JCLive_sf2_file', + //'0320_SBLive_sf2', + //'0320_SoundBlasterOld_sf2', + // '0321_GeneralUserGS_sf2_file', // nice sound but missing notes + // '0322_GeneralUserGS_sf2_file', // missing notes + + // Electric Bass (finger): Bass + '0330_Aspirin_sf2_file', + //'0330_Chaos_sf2_file', // same as last + '0330_FluidR3_GM_sf2_file', // knackt.. + '0330_GeneralUserGS_sf2_file', // -1 oct + '0330_JCLive_sf2_file', + //'0330_SBLive_sf2', + //'0330_SoundBlasterOld_sf2', + //'0331_GeneralUserGS_sf2_file', // knackt + // '0332_GeneralUserGS_sf2_file', // missing + + // Electric Bass (pick): Bass + '0340_Aspirin_sf2_file', + //'0340_Chaos_sf2_file', // same as last + '0340_FluidR3_GM_sf2_file', + '0340_GeneralUserGS_sf2_file', // -1oct + '0340_JCLive_sf2_file', + //'0340_SBLive_sf2', + //'0340_SoundBlasterOld_sf2', + '0341_Aspirin_sf2_file', + //'0341_GeneralUserGS_sf2_file', // knackt + + // Fretless Bass: Bass + '0350_Aspirin_sf2_file', + // '0350_Chaos_sf2_file', // same as last + //'0350_FluidR3_GM_sf2_file', // knackt + //'0350_GeneralUserGS_sf2_file', // -1 oct + knackt + '0350_JCLive_sf2_file', // weird detuned + //'0350_SBLive_sf2', + //'0350_SoundBlasterOld_sf2', + //'0351_GeneralUserGS_sf2_file', // missing + + // Slap Bass 1: Bass + '0360_Aspirin_sf2_file', + '0360_Chaos_sf2_file', + '0360_FluidR3_GM_sf2_file', // knackt + //'0360_GeneralUserGS_sf2_file', // -1 oct + '0360_JCLive_sf2_file', + //'0360_SBLive_sf2', + //'0360_SoundBlasterOld_sf2', + //'0361_GeneralUserGS_sf2_file', // missing + + // Slap Bass 2: Bass + '0370_Aspirin_sf2_file', + // '0370_Chaos_sf2_file', // same as last + '0370_FluidR3_GM_sf2_file', + '0370_GeneralUserGS_sf2_file', + '0370_JCLive_sf2_file', + //'0370_SBLive_sf2', + //'0370_SoundBlasterOld_sf2', + //'0371_GeneralUserGS_sf2_file', // missing + //'0372_GeneralUserGS_sf2_file', // detuned + //'0385_GeneralUserGS_sf2_file', // missing + + // Synth Bass 1: Bass + '0380_Aspirin_sf2_file', // laut! + '0380_Chaos_sf2_file', + '0380_FluidR3_GM_sf2_file', // bisl detuned + // '0380_GeneralUserGS_sf2_file', // laut + '0380_JCLive_sf2_file', + //'0380_SBLive_sf2', + //'0380_SoundBlasterOld_sf2', + '0381_FluidR3_GM_sf2_file', // bisl detuned + '0381_GeneralUserGS_sf2_file', + //'0382_FluidR3_GM_sf2_file', // kein synth bass + '0382_GeneralUserGS_sf2_file', + '0383_GeneralUserGS_sf2_file', + '0384_GeneralUserGS_sf2_file', + //'0386_GeneralUserGS_sf2_file', // knackt + '0387_GeneralUserGS_sf2_file', + + // Synth Bass 2: Bass + '0390_Aspirin_sf2_file', + // '0390_Chaos_sf2_file', // same as last + '0390_FluidR3_GM_sf2_file', + '0390_GeneralUserGS_sf2_file', + '0390_JCLive_sf2_file', + //'0390_SBLive_sf2', + //'0390_SoundBlasterOld_sf2', + '0391_FluidR3_GM_sf2_file', // lauuut + // '0391_GeneralUserGS_sf2_file', // missing + //'0391_SoundBlasterOld_sf2', + '0392_FluidR3_GM_sf2_file', // lauut + //'0392_GeneralUserGS_sf2_file', // kein synth und -1oct + '0393_GeneralUserGS_sf2_file', // lauuuut + + // Violin: Strings + '0400_Aspirin_sf2_file', + '0400_Chaos_sf2_file', + '0400_FluidR3_GM_sf2_file', + '0400_GeneralUserGS_sf2_file', + '0400_JCLive_sf2_file', + //'0400_SBLive_sf2', + //'0400_SoundBlasterOld_sf2', + '0401_Aspirin_sf2_file', // synth + '0401_FluidR3_GM_sf2_file', + '0401_GeneralUserGS_sf2_file', + '0402_GeneralUserGS_sf2_file', // pizzicato + + // Viola: Strings + '0410_Aspirin_sf2_file', + // '0410_Chaos_sf2_file', // laut und sehr unstringy + '0410_FluidR3_GM_sf2_file', + '0410_GeneralUserGS_sf2_file', + '0410_JCLive_sf2_file', // <3 + //'0410_SBLive_sf2', + //'0410_SoundBlasterOld_sf2', + '0411_FluidR3_GM_sf2_file', + + // Cello: Strings + '0420_Aspirin_sf2_file', + // '0420_Chaos_sf2_file', // kein cello und laut + '0420_FluidR3_GM_sf2_file', + '0420_GeneralUserGS_sf2_file', + '0420_JCLive_sf2_file', + //'0420_SBLive_sf2', + //'0420_SoundBlasterOld_sf2', + '0421_FluidR3_GM_sf2_file', + '0421_GeneralUserGS_sf2_file', // pizzicato + + // Contrabass: Strings + '0430_Aspirin_sf2_file', + '0430_Chaos_sf2_file', + // '0430_FluidR3_GM_sf2_file', // missing notes + '0430_GeneralUserGS_sf2_file', + //'0430_JCLive_sf2_file', // -1 oct und meh + //'0430_SBLive_sf2', + //'0430_SoundBlasterOld_sf2', + // '0431_FluidR3_GM_sf2_file', // missing notes + + // Tremolo Strings: Strings + '0440_Aspirin_sf2_file', + '0440_Chaos_sf2_file', + //'0440_FluidR3_GM_sf2_file', // huuuge + '0440_GeneralUserGS_sf2_file', + '0440_JCLive_sf2_file', + //'0440_SBLive_sf2', + //'0440_SoundBlasterOld_sf2', + '0441_GeneralUserGS_sf2_file', + '0442_GeneralUserGS_sf2_file', + + // Pizzicato Strings: Strings + '0450_Aspirin_sf2_file', + '0450_Chaos_sf2_file', // same as last + '0450_FluidR3_GM_sf2_file', // chrono trigger flashback + '0450_GeneralUserGS_sf2_file', // -1 oct? + '0450_JCLive_sf2_file', // filter env + //'0450_SBLive_sf2', + //'0450_SoundBlasterOld_sf2', + '0451_FluidR3_GM_sf2_file', + + // Orchestral Harp: Strings + '0460_Aspirin_sf2_file', + // '0460_Chaos_sf2_file', // knackt + '0460_FluidR3_GM_sf2_file', + '0460_GeneralUserGS_sf2_file', + '0460_JCLive_sf2_file', + //'0460_SBLive_sf2', + //'0460_SoundBlasterOld_sf2', + '0461_FluidR3_GM_sf2_file', + + // Timpani: Strings + '0470_Aspirin_sf2_file', + '0470_Chaos_sf2_file', + '0470_FluidR3_GM_sf2_file', + '0470_GeneralUserGS_sf2_file', + // '0470_JCLive_sf2_file', // wrong pitches + //'0470_SBLive_sf2', + //'0470_SoundBlasterOld_sf2', + '0471_FluidR3_GM_sf2_file', + '0471_GeneralUserGS_sf2_file', + + // String Ensemble 1: Ensemble + '0480_Aspirin_sf2_file', + '0480_Chaos_sf2_file', + '0480_FluidR3_GM_sf2_file', // large + '0480_GeneralUserGS_sf2_file', + '0480_JCLive_sf2_file', + //'0480_SBLive_sf2', + //'0480_SoundBlasterOld_sf2', + // these dont work.. + //'04810_GeneralUserGS_sf2_file', // missing notes + brass + //'04811_GeneralUserGS_sf2_file', // missing notes + brass + //'04812_GeneralUserGS_sf2_file', + //'04813_GeneralUserGS_sf2_file', + //'04814_GeneralUserGS_sf2_file', + //'04815_GeneralUserGS_sf2_file', + //'04816_GeneralUserGS_sf2_file', + //'04817_GeneralUserGS_sf2_file', + '0481_Aspirin_sf2_file', + '0481_FluidR3_GM_sf2_file', // brass + '0481_GeneralUserGS_sf2_file', + '0482_Aspirin_sf2_file', // brass + '0482_GeneralUserGS_sf2_file', + '0483_GeneralUserGS_sf2_file', // brass + // another block of buggyness: + //'0484_GeneralUserGS_sf2_file', // keys?! + knackt + //'0485_GeneralUserGS_sf2_file', // missing notes + //'0486_GeneralUserGS_sf2_file', + //'0487_GeneralUserGS_sf2_file', + //'0488_GeneralUserGS_sf2_file', + //'0489_GeneralUserGS_sf2_file', + + // String Ensemble 2: Ensemble + '0490_Aspirin_sf2_file', + '0490_Chaos_sf2_file', + '0490_FluidR3_GM_sf2_file', // large + '0490_GeneralUserGS_sf2_file', + '0490_JCLive_sf2_file', + //'0490_SBLive_sf2', + //'0490_SoundBlasterOld_sf2', + '0491_GeneralUserGS_sf2_file', + '0492_GeneralUserGS_sf2_file', + + // Synth Strings 1: Ensemble + '0500_Aspirin_sf2_file', + // '0500_Chaos_sf2_file', // same as above + //'0500_FluidR3_GM_sf2_file', // detune + knack + '0500_GeneralUserGS_sf2_file', + '0500_JCLive_sf2_file', + //'0500_SBLive_sf2', + //'0500_SoundBlasterOld_sf2', + '0501_FluidR3_GM_sf2_file', + // '0501_GeneralUserGS_sf2_file', // crackles + // '0502_FluidR3_GM_sf2_file', // missing + '0502_GeneralUserGS_sf2_file', + '0503_FluidR3_GM_sf2_file', // large + // '0504_FluidR3_GM_sf2_file', // missing + '0505_FluidR3_GM_sf2_file', + + // Synth Strings 2: Ensemble + '0510_Aspirin_sf2_file', + '0510_Chaos_sf2_file', + // '0510_FluidR3_GM_sf2_file', // detune + crackle + '0510_GeneralUserGS_sf2_file', + //'0510_JCLive_sf2_file', // laarge and meh + //'0510_SBLive_sf2', // missing + //'0510_SoundBlasterOld_sf2', + '0511_GeneralUserGS_sf2_file', // crackly + //'0511_SoundBlasterOld_sf2', + + // Choir Aahs: Ensemble + '0520_Aspirin_sf2_file', + '0520_Chaos_sf2_file', + '0520_FluidR3_GM_sf2_file', + '0520_GeneralUserGS_sf2_file', + '0520_JCLive_sf2_file', + //'0520_SBLive_sf2', + '0520_Soul_Ahhs_sf2_file', // large + //'0520_SoundBlasterOld_sf2', + '0521_FluidR3_GM_sf2_file', + '0521_Soul_Ahhs_sf2_file', // large + //'0521_SoundBlasterOld_sf2', + '0522_Soul_Ahhs_sf2_file', // large + + // Voice Oohs: Ensemble + '0530_Aspirin_sf2_file', + '0530_Chaos_sf2_file', + '0530_FluidR3_GM_sf2_file', + '0530_GeneralUserGS_sf2_file', + //'0530_JCLive_sf2_file', // same as above + //'0530_SBLive_sf2', + // '0530_Soul_Ahhs_sf2_file', // not ooh + //'0530_SoundBlasterOld_sf2', + '0531_FluidR3_GM_sf2_file', + // '0531_GeneralUserGS_sf2_file', // ends crackle + '0531_JCLive_sf2_file', + //'0531_SoundBlasterOld_sf2', + + // Synth Choir: Ensemble + '0540_Aspirin_sf2_file', + '0540_Chaos_sf2_file', + '0540_FluidR3_GM_sf2_file', + '0540_GeneralUserGS_sf2_file', + //'0540_JCLive_sf2_file', // large + crackles + //'0540_SBLive_sf2', + //'0540_SoundBlasterOld_sf2', + '0541_FluidR3_GM_sf2_file', + + // Orchestra Hit: Ensemble + '0550_Aspirin_sf2_file', + '0550_Chaos_sf2_file', + '0550_FluidR3_GM_sf2_file', + '0550_GeneralUserGS_sf2_file', + //'0550_JCLive_sf2_file', // same as above + //'0550_SBLive_sf2', + //'0550_SoundBlasterOld_sf2', + //'0551_Aspirin_sf2_file', // not an orch hit.. + '0551_FluidR3_GM_sf2_file', + + // Trumpet: Brass + '0560_Aspirin_sf2_file', + '0560_Chaos_sf2_file', + '0560_FluidR3_GM_sf2_file', + //'0560_GeneralUserGS_sf2_file', // -1 oct + '0560_JCLive_sf2_file', + //'0560_SBLive_sf2', + //'0560_SoundBlasterOld_sf2', + + // Trombone: Brass + '0570_Aspirin_sf2_file', + '0570_Chaos_sf2_file', + '0570_FluidR3_GM_sf2_file', + '0570_GeneralUserGS_sf2_file', + //'0570_JCLive_sf2_file', // -1oct + //'0570_SBLive_sf2', + //'0570_SoundBlasterOld_sf2', + '0571_GeneralUserGS_sf2_file', + + // Tuba: Brass + '0580_Aspirin_sf2_file', + '0580_Chaos_sf2_file', + '0580_FluidR3_GM_sf2_file', + '0580_GeneralUserGS_sf2_file', + //'0580_JCLive_sf2_file', // -1oct + //'0580_SBLive_sf2', + //'0580_SoundBlasterOld_sf2', + //'0581_GeneralUserGS_sf2_file', // missing + + // Muted Trumpet: Brass + '0590_Aspirin_sf2_file', + '0590_Chaos_sf2_file', + '0590_FluidR3_GM_sf2_file', + '0590_GeneralUserGS_sf2_file', + '0590_JCLive_sf2_file', // winner + //'0590_SBLive_sf2', + //'0590_SoundBlasterOld_sf2', + // '0591_GeneralUserGS_sf2_file', // missing + + // French Horn: Brass + '0600_Aspirin_sf2_file', + //'0600_Chaos_sf2_file', // weird jumps + '0600_FluidR3_GM_sf2_file', // tiny crackles + '0600_GeneralUserGS_sf2_file', // tiny crackles + '0600_JCLive_sf2_file', // tiny crackles + //'0600_SBLive_sf2', + //'0600_SoundBlasterOld_sf2', + '0601_FluidR3_GM_sf2_file', + //'0601_GeneralUserGS_sf2_file', // tiny crackles + // '0602_GeneralUserGS_sf2_file', // bad gain diffs + // '0603_GeneralUserGS_sf2_file', // tiny crackles + + // Brass Section: Brass + '0610_Aspirin_sf2_file', + '0610_Chaos_sf2_file', + '0610_FluidR3_GM_sf2_file', // large + '0610_GeneralUserGS_sf2_file', + '0610_JCLive_sf2_file', + //'0610_SBLive_sf2', + //'0610_SoundBlasterOld_sf2', + // '0611_GeneralUserGS_sf2_file', // missing sounds + // '0612_GeneralUserGS_sf2_file', + //'0613_GeneralUserGS_sf2_file', // -1 oct + // '0614_GeneralUserGS_sf2_file', // missing sounds + // '0615_GeneralUserGS_sf2_file', // missing sounds + + // Synth Brass 1: Brass + '0620_Aspirin_sf2_file', + //'0620_Chaos_sf2_file', // weird gain diff + '0620_FluidR3_GM_sf2_file', + //'0620_GeneralUserGS_sf2_file', // loooud + // '0620_JCLive_sf2_file', // weird gain diff + //'0620_SBLive_sf2', + //'0620_SoundBlasterOld_sf2', + '0621_Aspirin_sf2_file', + '0621_FluidR3_GM_sf2_file', + // '0621_GeneralUserGS_sf2_file', // detune + loooud + //'0622_FluidR3_GM_sf2_file', // loud.. + //'0622_GeneralUserGS_sf2_file', // loud + crackles + + // Synth Brass 2: Brass + '0630_Aspirin_sf2_file', + '0630_Chaos_sf2_file', + '0630_FluidR3_GM_sf2_file', + //'0630_GeneralUserGS_sf2_file', // detune + looud + '0630_JCLive_sf2_file', + //'0630_SBLive_sf2', + //'0630_SoundBlasterOld_sf2', + // '0631_Aspirin_sf2_file', // looud + detune + gain diffs + '0631_FluidR3_GM_sf2_file', + //'0631_GeneralUserGS_sf2_file', // crackles + '0632_FluidR3_GM_sf2_file', + '0633_FluidR3_GM_sf2_file', // tiny crackles + + // Soprano Sax: Reed + '0640_Aspirin_sf2_file', + '0640_Chaos_sf2_file', + '0640_FluidR3_GM_sf2_file', + // '0640_GeneralUserGS_sf2_file', // crackles + '0640_JCLive_sf2_file', + //'0640_SBLive_sf2', + //'0640_SoundBlasterOld_sf2', + '0641_FluidR3_GM_sf2_file', + + // Alto Sax: Reed + //'0650_Aspirin_sf2_file', // this is not an alto sax + '0650_Chaos_sf2_file', + '0650_FluidR3_GM_sf2_file', // sounds really stringy + '0650_GeneralUserGS_sf2_file', + '0650_JCLive_sf2_file', + //'0650_SBLive_sf2', + //'0650_SoundBlasterOld_sf2', + '0651_Aspirin_sf2_file', + '0651_FluidR3_GM_sf2_file', // really stringy + + // Tenor Sax: Reed + '0660_Aspirin_sf2_file', + '0660_Chaos_sf2_file', + //'0660_FluidR3_GM_sf2_file', // weird pitches + '0660_GeneralUserGS_sf2_file', + '0660_JCLive_sf2_file', + //'0660_SBLive_sf2', + //'0660_SoundBlasterOld_sf2', + // '0661_FluidR3_GM_sf2_file', // weird pitches + // '0661_GeneralUserGS_sf2_file', // missing + + // Baritone Sax: Reed + '0670_Aspirin_sf2_file', + '0670_Chaos_sf2_file', + '0670_FluidR3_GM_sf2_file', // huge + '0670_GeneralUserGS_sf2_file', + '0670_JCLive_sf2_file', + //'0670_SBLive_sf2', + //'0670_SoundBlasterOld_sf2', + '0671_FluidR3_GM_sf2_file', // huge + + // Oboe: Reed + //'0680_Aspirin_sf2_file', // tiny crackles + '0680_Chaos_sf2_file', // tiny crackles + '0680_FluidR3_GM_sf2_file', // tiny crackles + '0680_GeneralUserGS_sf2_file', + '0680_JCLive_sf2_file', + //'0680_SBLive_sf2', + //'0680_SoundBlasterOld_sf2', + '0681_FluidR3_GM_sf2_file', // tiny crackles + + // English Horn: Reed + '0690_Aspirin_sf2_file', + //'0690_Chaos_sf2_file', // detuned + '0690_FluidR3_GM_sf2_file', + //'0690_GeneralUserGS_sf2_file', // +1 oct + '0690_JCLive_sf2_file', + //'0690_SBLive_sf2', + //'0690_SoundBlasterOld_sf2', + '0691_FluidR3_GM_sf2_file', // tiny crackles + + // Bassoon: Reed + //'0700_Aspirin_sf2_file', // detune + gain diffs + // '0700_Chaos_sf2_file', // detune + crackles + '0700_FluidR3_GM_sf2_file', + '0700_GeneralUserGS_sf2_file', // tiny crackles + '0700_JCLive_sf2_file', + //'0700_SBLive_sf2', + //'0700_SoundBlasterOld_sf2', + '0701_FluidR3_GM_sf2_file', // tiny crackles + //'0701_GeneralUserGS_sf2_file', // missing + + // Clarinet: Reed + '0710_Aspirin_sf2_file', // tiny crackles + '0710_Chaos_sf2_file', // tiny crackles + '0710_FluidR3_GM_sf2_file', + '0710_GeneralUserGS_sf2_file', + '0710_JCLive_sf2_file', + //'0710_SBLive_sf2', + //'0710_SoundBlasterOld_sf2', + '0711_FluidR3_GM_sf2_file', + + // Piccolo: Pipe + '0720_Aspirin_sf2_file', // +1oct + // '0720_Chaos_sf2_file', // not a piccolo + '0720_FluidR3_GM_sf2_file', + '0720_GeneralUserGS_sf2_file', // crackles + '0720_JCLive_sf2_file', + //'0720_SBLive_sf2', + //'0720_SoundBlasterOld_sf2', + '0721_FluidR3_GM_sf2_file', + //'0721_SoundBlasterOld_sf2', + + // Flute: Pipe + '0730_Aspirin_sf2_file', + //'0730_Chaos_sf2_file', // etune + '0730_FluidR3_GM_sf2_file', + '0730_GeneralUserGS_sf2_file', + '0730_JCLive_sf2_file', + //'0730_SBLive_sf2', + //'0730_SoundBlasterOld_sf2', + //'0731_Aspirin_sf2_file', // not a flute + '0731_FluidR3_GM_sf2_file', + //'0731_SoundBlasterOld_sf2', + + // Recorder: Pipe + '0740_Aspirin_sf2_file', + '0740_Chaos_sf2_file', + '0740_FluidR3_GM_sf2_file', + '0740_GeneralUserGS_sf2_file', + '0740_JCLive_sf2_file', + //'0740_SBLive_sf2', + //'0740_SoundBlasterOld_sf2', + // '0741_GeneralUserGS_sf2_file', // missing + + // Pan Flute: Pipe + '0750_Aspirin_sf2_file', // staccato + '0750_Chaos_sf2_file', + '0750_FluidR3_GM_sf2_file', + '0750_GeneralUserGS_sf2_file', // crackles + '0750_JCLive_sf2_file', + //'0750_SBLive_sf2', + //'0750_SoundBlasterOld_sf2', + '0751_Aspirin_sf2_file', + '0751_FluidR3_GM_sf2_file', + '0751_GeneralUserGS_sf2_file', // crackles + //'0751_SoundBlasterOld_sf2', + + // Blown bottle: Pipe + // '0760_Aspirin_sf2_file', // same as below w crackle + '0760_Chaos_sf2_file', + '0760_FluidR3_GM_sf2_file', + '0760_GeneralUserGS_sf2_file', + '0760_JCLive_sf2_file', + //'0760_SBLive_sf2', + //'0760_SoundBlasterOld_sf2', + '0761_FluidR3_GM_sf2_file', + // '0761_GeneralUserGS_sf2_file', // missing + //'0761_SoundBlasterOld_sf2', + // '0762_GeneralUserGS_sf2_file', // missing + + // Shakuhachi: Pipe + '0770_Aspirin_sf2_file', // staccato + //'0770_Chaos_sf2_file', // not shakuhachi + '0770_FluidR3_GM_sf2_file', + '0770_GeneralUserGS_sf2_file', + '0770_JCLive_sf2_file', + //'0770_SBLive_sf2', + //'0770_SoundBlasterOld_sf2', + '0771_FluidR3_GM_sf2_file', + // '0771_GeneralUserGS_sf2_file', // missing + // '0772_GeneralUserGS_sf2_file', // missing + + // Whistle: Pipe + '0780_Aspirin_sf2_file', // crackles + '0780_Chaos_sf2_file', // crackles + '0780_FluidR3_GM_sf2_file', + //'0780_GeneralUserGS_sf2_file', // loud.. + '0780_JCLive_sf2_file', // crackles + //'0780_SBLive_sf2', + //'0780_SoundBlasterOld_sf2', + // '0781_GeneralUserGS_sf2_file', // detune + crackles + + // Ocarina: Pipe + '0790_Aspirin_sf2_file', // tiny crackles + //'0790_Chaos_sf2_file', // same as above + '0790_FluidR3_GM_sf2_file', + '0790_GeneralUserGS_sf2_file', + '0790_JCLive_sf2_file', // crackles + //'0790_SBLive_sf2', + //'0790_SoundBlasterOld_sf2', + //'0791_GeneralUserGS_sf2_file', // missing + + // Lead 1 (square): Synth Lead + '0800_Aspirin_sf2_file', + '0800_Chaos_sf2_file', + '0800_FluidR3_GM_sf2_file', + // '0800_GeneralUserGS_sf2_file', // detuned + // '0800_JCLive_sf2_file', // detuned + //'0800_SBLive_sf2', + //'0800_SoundBlasterOld_sf2', + //'0801_FluidR3_GM_sf2_file', // detune + // '0801_GeneralUserGS_sf2_file', // detune + + // Lead 2 (sawtooth): Synth Lead + '0810_Aspirin_sf2_file', + '0810_Chaos_sf2_file', + '0810_FluidR3_GM_sf2_file', + '0810_GeneralUserGS_sf2_file', + '0810_JCLive_sf2_file', + //'0810_SBLive_sf2', + //'0810_SoundBlasterOld_sf2', + '0811_Aspirin_sf2_file', + '0811_GeneralUserGS_sf2_file', + //'0811_SoundBlasterOld_sf2', + + // Lead 3 (calliope): Synth Lead + '0820_Aspirin_sf2_file', + '0820_Chaos_sf2_file', + '0820_FluidR3_GM_sf2_file', + '0820_GeneralUserGS_sf2_file', + '0820_JCLive_sf2_file', // +1 oct + //'0820_SBLive_sf2', + //'0820_SoundBlasterOld_sf2', + '0821_FluidR3_GM_sf2_file', + '0821_GeneralUserGS_sf2_file', + //'0821_SoundBlasterOld_sf2', + // '0822_GeneralUserGS_sf2_file', // missing + //'0823_GeneralUserGS_sf2_file', // missing + + // Lead 4 (chiff): Synth Lead + '0830_Aspirin_sf2_file', + // '0830_Chaos_sf2_file', // same as above + '0830_FluidR3_GM_sf2_file', + '0830_GeneralUserGS_sf2_file', + '0830_JCLive_sf2_file', // flute synth + //'0830_SBLive_sf2', + //'0830_SoundBlasterOld_sf2', + '0831_FluidR3_GM_sf2_file', + '0831_GeneralUserGS_sf2_file', + //'0831_SoundBlasterOld_sf2', + + // Lead 5 (charang): Synth Lead + '0840_Aspirin_sf2_file', + '0840_Chaos_sf2_file', + '0840_FluidR3_GM_sf2_file', + '0840_GeneralUserGS_sf2_file', + '0840_JCLive_sf2_file', // detune? + //'0840_SBLive_sf2', + //'0840_SoundBlasterOld_sf2', + '0841_Aspirin_sf2_file', + '0841_Chaos_sf2_file', + '0841_FluidR3_GM_sf2_file', + '0841_GeneralUserGS_sf2_file', + //'0841_JCLive_sf2_file', // +1oct + detune + //'0841_SoundBlasterOld_sf2', + '0842_FluidR3_GM_sf2_file', + + // Lead 6 (voice): Synth Lead + '0850_Aspirin_sf2_file', + // '0850_Chaos_sf2_file', // same as above + '0850_FluidR3_GM_sf2_file', + // '0850_GeneralUserGS_sf2_file', // no voice + '0850_JCLive_sf2_file', // more a flute + //'0850_SBLive_sf2', + //'0850_SoundBlasterOld_sf2', + '0851_FluidR3_GM_sf2_file', + '0851_GeneralUserGS_sf2_file', + '0851_JCLive_sf2_file', + //'0851_SoundBlasterOld_sf2', + + // Lead 7 (fifths): Synth Lead + '0860_Aspirin_sf2_file', + '0860_Chaos_sf2_file', + // '0860_FluidR3_GM_sf2_file', // loud and not fitting + '0860_GeneralUserGS_sf2_file', + '0860_JCLive_sf2_file', + //'0860_SBLive_sf2', + //'0860_SoundBlasterOld_sf2', + '0861_Aspirin_sf2_file', + // '0861_FluidR3_GM_sf2_file', // lout and not fitting + //'0861_SoundBlasterOld_sf2', + + // Lead 8 (bass + lead): Synth Lead + '0870_Aspirin_sf2_file', + '0870_Chaos_sf2_file', + '0870_FluidR3_GM_sf2_file', + '0870_GeneralUserGS_sf2_file', + '0870_JCLive_sf2_file', + //'0870_SBLive_sf2', + //'0870_SoundBlasterOld_sf2', + // '0871_GeneralUserGS_sf2_file', // loud + detune + //'0872_GeneralUserGS_sf2_file', // loud + //'0873_GeneralUserGS_sf2_file', // loud + + // Pad 1 (new age): Synth Pad + '0880_Aspirin_sf2_file', + '0880_Chaos_sf2_file', + '0880_FluidR3_GM_sf2_file', + '0880_GeneralUserGS_sf2_file', + '0880_JCLive_sf2_file', + //'0880_SBLive_sf2', + //'0880_SoundBlasterOld_sf2', + '0881_Aspirin_sf2_file', + '0881_FluidR3_GM_sf2_file', + '0881_GeneralUserGS_sf2_file', + //'0881_SoundBlasterOld_sf2', + '0882_Aspirin_sf2_file', // staccato + // '0882_FluidR3_GM_sf2_file', // missing + '0882_GeneralUserGS_sf2_file', + //'0883_GeneralUserGS_sf2_file', // missing + // '0884_GeneralUserGS_sf2_file', // broken + '0885_GeneralUserGS_sf2_file', + //'0886_GeneralUserGS_sf2_file', // not a pad + '0887_GeneralUserGS_sf2_file', + //'0888_GeneralUserGS_sf2_file', // not a pad + //'0889_GeneralUserGS_sf2_file', // not a pad + + // Pad 2 (warm): Synth Pad + '0890_Aspirin_sf2_file', + '0890_Chaos_sf2_file', + '0890_FluidR3_GM_sf2_file', + '0890_GeneralUserGS_sf2_file', // 1mb large + '0890_JCLive_sf2_file', + //'0890_SBLive_sf2', + //'0890_SoundBlasterOld_sf2', + '0891_Aspirin_sf2_file', + '0891_FluidR3_GM_sf2_file', + // '0891_GeneralUserGS_sf2_file', // noise + + // Pad 3 (polysynth): Synth Pad + //'0900_Aspirin_sf2_file', // same as belo + '0900_Chaos_sf2_file', + '0900_FluidR3_GM_sf2_file', + '0900_GeneralUserGS_sf2_file', + '0900_JCLive_sf2_file', // a bit plucky for a pad + //'0900_SBLive_sf2', + //'0900_SoundBlasterOld_sf2', + '0901_Aspirin_sf2_file', + '0901_FluidR3_GM_sf2_file', + '0901_GeneralUserGS_sf2_file', + //'0901_SoundBlasterOld_sf2', + + // Pad 4 (choir): Synth Pad + '0910_Aspirin_sf2_file', + //'0910_Chaos_sf2_file', // +1oct + '0910_FluidR3_GM_sf2_file', + '0910_GeneralUserGS_sf2_file', + '0910_JCLive_sf2_file', + //'0910_SBLive_sf2', + //'0910_SoundBlasterOld_sf2', + // '0911_Aspirin_sf2_file', // fluty, crackles + '0911_GeneralUserGS_sf2_file', + '0911_JCLive_sf2_file', // the only choiry pad + //'0911_SoundBlasterOld_sf2', + + // Pad 5 (bowed): Synth Pad + '0920_Aspirin_sf2_file', + //'0920_Chaos_sf2_file', // same as above + //'0920_FluidR3_GM_sf2_file', // detuned? + '0920_GeneralUserGS_sf2_file', + '0920_JCLive_sf2_file', + //'0920_SBLive_sf2', + //'0920_SoundBlasterOld_sf2', + '0921_Aspirin_sf2_file', + '0921_GeneralUserGS_sf2_file', + //'0921_SoundBlasterOld_sf2', + + // Pad 6 (metallic): Synth Pad + '0930_Aspirin_sf2_file', + '0930_Chaos_sf2_file', + '0930_FluidR3_GM_sf2_file', // little crackles + '0930_GeneralUserGS_sf2_file', + // '0930_JCLive_sf2_file', // buggy zones: guitar / synth + //'0930_SBLive_sf2', + //'0930_SoundBlasterOld_sf2', + '0931_Aspirin_sf2_file', // sitar + '0931_FluidR3_GM_sf2_file', + '0931_GeneralUserGS_sf2_file', // guitar + //'0931_SoundBlasterOld_sf2', + + // Pad 7 (halo): Synth Pad + // '0940_Aspirin_sf2_file', // same as below + '0940_Chaos_sf2_file', + '0940_FluidR3_GM_sf2_file', + '0940_GeneralUserGS_sf2_file', + '0940_JCLive_sf2_file', + //'0940_SBLive_sf2', + //'0940_SoundBlasterOld_sf2', + '0941_Aspirin_sf2_file', + '0941_FluidR3_GM_sf2_file', + '0941_GeneralUserGS_sf2_file', + '0941_JCLive_sf2_file', + + // Pad 8 (sweep): Synth Pad + '0950_Aspirin_sf2_file', + '0950_Chaos_sf2_file', + '0950_FluidR3_GM_sf2_file', + '0950_GeneralUserGS_sf2_file', + '0950_JCLive_sf2_file', + //'0950_SBLive_sf2', + //'0950_SoundBlasterOld_sf2', + '0951_FluidR3_GM_sf2_file', + '0951_GeneralUserGS_sf2_file', + + // FX 1 (rain): Synth Effects + //'0960_Aspirin_sf2_file', //mixed samples? + '0960_Chaos_sf2_file', // pad? + '0960_FluidR3_GM_sf2_file', // ??? + '0960_GeneralUserGS_sf2_file', // pad + // '0960_JCLive_sf2_file', // mixed samples? + //'0960_SBLive_sf2', + //'0960_SoundBlasterOld_sf2', + '0961_Aspirin_sf2_file', + '0961_FluidR3_GM_sf2_file', + // '0961_GeneralUserGS_sf2_file', // ?!?! + //'0961_SoundBlasterOld_sf2', + '0962_GeneralUserGS_sf2_file', + + // FX 2 (soundtrack): Synth Effects + '0970_Aspirin_sf2_file', + //'0970_Chaos_sf2_file', // wrong pitch + '0970_FluidR3_GM_sf2_file', + '0970_GeneralUserGS_sf2_file', // not looping.. + //'0970_JCLive_sf2_file', // wrong pitch + //'0970_SBLive_sf2', + //'0970_SoundBlasterOld_sf2', + '0971_FluidR3_GM_sf2_file', + '0971_GeneralUserGS_sf2_file', + //'0971_SoundBlasterOld_sf2', + + // FX 3 (crystal): Synth Effects + '0980_Aspirin_sf2_file', + '0980_Chaos_sf2_file', + // '0980_FluidR3_GM_sf2_file', // some notes are weird + '0980_GeneralUserGS_sf2_file', + '0980_JCLive_sf2_file', + //'0980_SBLive_sf2', + //'0980_SoundBlasterOld_sf2', + '0981_Aspirin_sf2_file', // strings + '0981_FluidR3_GM_sf2_file', // mallet + '0981_GeneralUserGS_sf2_file', + //'0981_SoundBlasterOld_sf2', + '0982_GeneralUserGS_sf2_file', + '0983_GeneralUserGS_sf2_file', // guitar + '0984_GeneralUserGS_sf2_file', + + // FX 4 (atmosphere): Synth Effects + '0990_Aspirin_sf2_file', // pad + '0990_Chaos_sf2_file', // pad + '0990_FluidR3_GM_sf2_file', // guitar + '0990_GeneralUserGS_sf2_file', // guitar + '0990_JCLive_sf2_file', // pad + //'0990_SBLive_sf2', + //'0990_SoundBlasterOld_sf2', + '0991_Aspirin_sf2_file', // guitar + '0991_FluidR3_GM_sf2_file', // pad + '0991_GeneralUserGS_sf2_file', // pad + '0991_JCLive_sf2_file', // guitar + //'0991_SoundBlasterOld_sf2', + '0992_FluidR3_GM_sf2_file', // pad + '0992_JCLive_sf2_file', // guitar + '0993_JCLive_sf2_file', // guitar + '0994_JCLive_sf2_file', // guitar + + // FX 5 (brightness): Synth Effects + '1000_Aspirin_sf2_file', + '1000_Chaos_sf2_file', + '1000_FluidR3_GM_sf2_file', + '1000_GeneralUserGS_sf2_file', + '1000_JCLive_sf2_file', + //'1000_SBLive_sf2', + //'1000_SoundBlasterOld_sf2', + '1001_Aspirin_sf2_file', + '1001_FluidR3_GM_sf2_file', + '1001_GeneralUserGS_sf2_file', + '1001_JCLive_sf2_file', + //'1001_SoundBlasterOld_sf2', + '1002_Aspirin_sf2_file', + '1002_FluidR3_GM_sf2_file', + '1002_GeneralUserGS_sf2_file', + + // FX 6 (goblins): Synth Effects + '1010_Aspirin_sf2_file', + '1010_Chaos_sf2_file', + '1010_FluidR3_GM_sf2_file', + '1010_GeneralUserGS_sf2_file', + '1010_JCLive_sf2_file', + //'1010_SBLive_sf2', + //'1010_SoundBlasterOld_sf2', + '1011_Aspirin_sf2_file', + '1011_FluidR3_GM_sf2_file', + '1011_JCLive_sf2_file', + '1012_Aspirin_sf2_file', + + // FX 7 (echoes): Synth Effects + '1020_Aspirin_sf2_file', + '1020_Chaos_sf2_file', + '1020_FluidR3_GM_sf2_file', + '1020_GeneralUserGS_sf2_file', + '1020_JCLive_sf2_file', + //'1020_SBLive_sf2', + //'1020_SoundBlasterOld_sf2', + '1021_Aspirin_sf2_file', + '1021_FluidR3_GM_sf2_file', + '1021_GeneralUserGS_sf2_file', + '1021_JCLive_sf2_file', + //'1021_SoundBlasterOld_sf2', + '1022_GeneralUserGS_sf2_file', + + // FX 8 (sci-fi): Synth Effects + '1030_Aspirin_sf2_file', + '1030_Chaos_sf2_file', + '1030_FluidR3_GM_sf2_file', + '1030_GeneralUserGS_sf2_file', + '1030_JCLive_sf2_file', + //'1030_SBLive_sf2', + //'1030_SoundBlasterOld_sf2', + '1031_Aspirin_sf2_file', + '1031_FluidR3_GM_sf2_file', + '1031_GeneralUserGS_sf2_file', + //'1031_SoundBlasterOld_sf2', + '1032_FluidR3_GM_sf2_file', + + // 'Sitar: Ethnic + '1040_Aspirin_sf2_file', + '1040_Chaos_sf2_file', + '1040_FluidR3_GM_sf2_file', + '1040_GeneralUserGS_sf2_file', + '1040_JCLive_sf2_file', + //'1040_SBLive_sf2', + //'1040_SoundBlasterOld_sf2', + '1041_FluidR3_GM_sf2_file', + '1041_GeneralUserGS_sf2_file', + + // Banjo: Ethnic + '1050_Aspirin_sf2_file', + '1050_Chaos_sf2_file', + '1050_FluidR3_GM_sf2_file', + '1050_GeneralUserGS_sf2_file', + '1050_JCLive_sf2_file', + //'1050_SBLive_sf2', + //'1050_SoundBlasterOld_sf2', + '1051_GeneralUserGS_sf2_file', + + // Shamisen: Ethnic + '1060_Aspirin_sf2_file', + '1060_Chaos_sf2_file', + '1060_FluidR3_GM_sf2_file', + '1060_GeneralUserGS_sf2_file', + '1060_JCLive_sf2_file', + //'1060_SBLive_sf2', + //'1060_SoundBlasterOld_sf2', + '1061_FluidR3_GM_sf2_file', + '1061_GeneralUserGS_sf2_file', + //'1061_SoundBlasterOld_sf2', + + // Koto: Ethnic + '1070_Aspirin_sf2_file', + '1070_Chaos_sf2_file', + '1070_FluidR3_GM_sf2_file', + '1070_GeneralUserGS_sf2_file', + '1070_JCLive_sf2_file', + //'1070_SBLive_sf2', + //'1070_SoundBlasterOld_sf2', + '1071_FluidR3_GM_sf2_file', + '1071_GeneralUserGS_sf2_file', + '1072_GeneralUserGS_sf2_file', + '1073_GeneralUserGS_sf2_file', + + // Kalimba: Ethnic + '1080_Aspirin_sf2_file', + '1080_Chaos_sf2_file', + '1080_FluidR3_GM_sf2_file', + '1080_GeneralUserGS_sf2_file', + '1080_JCLive_sf2_file', + //'1080_SBLive_sf2', + //'1080_SoundBlasterOld_sf2', + //'1081_SoundBlasterOld_sf2', + + // Bagpipe: Ethnic + '1090_Aspirin_sf2_file', + '1090_Chaos_sf2_file', + '1090_FluidR3_GM_sf2_file', + '1090_GeneralUserGS_sf2_file', + '1090_JCLive_sf2_file', + //'1090_SBLive_sf2', + //'1090_SoundBlasterOld_sf2', + //'1091_SoundBlasterOld_sf2', + + // Fiddle: Ethnic + '1100_Aspirin_sf2_file', + '1100_Chaos_sf2_file', + '1100_FluidR3_GM_sf2_file', + '1100_GeneralUserGS_sf2_file', + '1100_JCLive_sf2_file', + //'1100_SBLive_sf2', + //'1100_SoundBlasterOld_sf2', + '1101_Aspirin_sf2_file', + '1101_FluidR3_GM_sf2_file', + '1101_GeneralUserGS_sf2_file', + '1102_GeneralUserGS_sf2_file', + + // Shanai: Ethnic + '1110_Aspirin_sf2_file', + '1110_Chaos_sf2_file', + '1110_FluidR3_GM_sf2_file', + '1110_GeneralUserGS_sf2_file', + '1110_JCLive_sf2_file', + //'1110_SBLive_sf2', + //'1110_SoundBlasterOld_sf2', + + // Tinkle Bell: Percussive + '1120_Aspirin_sf2_file', + '1120_Chaos_sf2_file', + '1120_FluidR3_GM_sf2_file', + '1120_GeneralUserGS_sf2_file', + '1120_JCLive_sf2_file', + //'1120_SBLive_sf2', + //'1120_SoundBlasterOld_sf2', + //'1121_SoundBlasterOld_sf2', + + // Agogo: Percussive + '1130_Aspirin_sf2_file', + '1130_Chaos_sf2_file', + '1130_FluidR3_GM_sf2_file', + '1130_GeneralUserGS_sf2_file', + '1130_JCLive_sf2_file', + //'1130_SBLive_sf2', + //'1130_SoundBlasterOld_sf2', + '1131_FluidR3_GM_sf2_file', + //'1131_SoundBlasterOld_sf2', + + // Steel Drums: Percussive + '1140_Aspirin_sf2_file', + '1140_Chaos_sf2_file', + '1140_FluidR3_GM_sf2_file', + '1140_GeneralUserGS_sf2_file', + '1140_JCLive_sf2_file', + //'1140_SBLive_sf2', + //'1140_SoundBlasterOld_sf2', + '1141_FluidR3_GM_sf2_file', + + // Woodblock: Percussive + '1150_Aspirin_sf2_file', + '1150_Chaos_sf2_file', + '1150_FluidR3_GM_sf2_file', + '1150_GeneralUserGS_sf2_file', + '1150_JCLive_sf2_file', + //'1150_SBLive_sf2', + //'1150_SoundBlasterOld_sf2', + '1151_FluidR3_GM_sf2_file', + '1151_GeneralUserGS_sf2_file', + '1152_FluidR3_GM_sf2_file', + '1152_GeneralUserGS_sf2_file', + + // Taiko Drum: Percussive + '1160_Aspirin_sf2_file', + '1160_Chaos_sf2_file', + '1160_FluidR3_GM_sf2_file', + '1160_GeneralUserGS_sf2_file', + '1160_JCLive_sf2_file', + //'1160_SBLive_sf2', + //'1160_SoundBlasterOld_sf2', + '1161_FluidR3_GM_sf2_file', + '1161_GeneralUserGS_sf2_file', + //'1161_SoundBlasterOld_sf2', + '1162_FluidR3_GM_sf2_file', + '1162_GeneralUserGS_sf2_file', + '1163_FluidR3_GM_sf2_file', + + // Melodic Tom: Percussive + '1170_Aspirin_sf2_file', + '1170_Chaos_sf2_file', + '1170_FluidR3_GM_sf2_file', + '1170_GeneralUserGS_sf2_file', + '1170_JCLive_sf2_file', + //'1170_SBLive_sf2', + //'1170_SoundBlasterOld_sf2', + '1171_FluidR3_GM_sf2_file', + '1171_GeneralUserGS_sf2_file', + '1172_FluidR3_GM_sf2_file', + '1173_FluidR3_GM_sf2_file', + + // Synth Drum: Percussive + '1180_Aspirin_sf2_file', + '1180_Chaos_sf2_file', + '1180_FluidR3_GM_sf2_file', + '1180_GeneralUserGS_sf2_file', + '1180_JCLive_sf2_file', + //'1180_SBLive_sf2', + //'1180_SoundBlasterOld_sf2', + '1181_FluidR3_GM_sf2_file', + '1181_GeneralUserGS_sf2_file', + //'1181_SoundBlasterOld_sf2', + + // Reverse Cymbal: Percussive + '1190_Aspirin_sf2_file', + '1190_Chaos_sf2_file', + '1190_FluidR3_GM_sf2_file', + '1190_GeneralUserGS_sf2_file', + '1190_JCLive_sf2_file', + //'1190_SBLive_sf2', + //'1190_SoundBlasterOld_sf2', + '1191_GeneralUserGS_sf2_file', + '1192_GeneralUserGS_sf2_file', + '1193_GeneralUserGS_sf2_file', + '1194_GeneralUserGS_sf2_file', + + // Guitar Fret Noise: Sound effects + '1200_Aspirin_sf2_file', + '1200_Chaos_sf2_file', + '1200_FluidR3_GM_sf2_file', + '1200_GeneralUserGS_sf2_file', + '1200_JCLive_sf2_file', + //'1200_SBLive_sf2', + //'1200_SoundBlasterOld_sf2', + '1201_Aspirin_sf2_file', + '1201_GeneralUserGS_sf2_file', + '1202_GeneralUserGS_sf2_file', + + // Breath Noise: Sound effects + '1210_Aspirin_sf2_file', + '1210_Chaos_sf2_file', + '1210_FluidR3_GM_sf2_file', + '1210_GeneralUserGS_sf2_file', + '1210_JCLive_sf2_file', + //'1210_SBLive_sf2', + //'1210_SoundBlasterOld_sf2', + '1211_Aspirin_sf2_file', + '1211_GeneralUserGS_sf2_file', + '1212_GeneralUserGS_sf2_file', + + // Seashore: Sound effects + '1220_Aspirin_sf2_file', + '1220_Chaos_sf2_file', + '1220_FluidR3_GM_sf2_file', + '1220_GeneralUserGS_sf2_file', + '1220_JCLive_sf2_file', + //'1220_SBLive_sf2', + //'1220_SoundBlasterOld_sf2', + '1221_Aspirin_sf2_file', + '1221_GeneralUserGS_sf2_file', + '1221_JCLive_sf2_file', + '1222_Aspirin_sf2_file', + '1222_GeneralUserGS_sf2_file', + '1223_Aspirin_sf2_file', + '1223_GeneralUserGS_sf2_file', + '1224_Aspirin_sf2_file', + '1224_GeneralUserGS_sf2_file', + '1225_GeneralUserGS_sf2_file', + '1226_GeneralUserGS_sf2_file', + + // Bird Tweet: Sound effects + '1230_Aspirin_sf2_file', + '1230_Chaos_sf2_file', + '1230_FluidR3_GM_sf2_file', + '1230_GeneralUserGS_sf2_file', + '1230_JCLive_sf2_file', + //'1230_SBLive_sf2', + //'1230_SoundBlasterOld_sf2', + '1231_Aspirin_sf2_file', + '1231_GeneralUserGS_sf2_file', + '1232_Aspirin_sf2_file', + '1232_GeneralUserGS_sf2_file', + '1233_GeneralUserGS_sf2_file', + '1234_GeneralUserGS_sf2_file', + + // Telephone Ring: Sound effects + '1240_Aspirin_sf2_file', + '1240_Chaos_sf2_file', + '1240_FluidR3_GM_sf2_file', + '1240_GeneralUserGS_sf2_file', + '1240_JCLive_sf2_file', + //'1240_SBLive_sf2', + //'1240_SoundBlasterOld_sf2', + '1241_Aspirin_sf2_file', + '1241_GeneralUserGS_sf2_file', + '1242_Aspirin_sf2_file', + '1242_GeneralUserGS_sf2_file', + '1243_Aspirin_sf2_file', + '1243_GeneralUserGS_sf2_file', + '1244_Aspirin_sf2_file', + '1244_GeneralUserGS_sf2_file', + + // Helicopter: Sound effects + '1250_Aspirin_sf2_file', + '1250_Chaos_sf2_file', + '1250_FluidR3_GM_sf2_file', + '1250_GeneralUserGS_sf2_file', + '1250_JCLive_sf2_file', + //'1250_SBLive_sf2', + //'1250_SoundBlasterOld_sf2', + '1251_Aspirin_sf2_file', + '1251_FluidR3_GM_sf2_file', + '1251_GeneralUserGS_sf2_file', + '1252_Aspirin_sf2_file', + '1252_FluidR3_GM_sf2_file', + '1252_GeneralUserGS_sf2_file', + '1253_Aspirin_sf2_file', + '1253_GeneralUserGS_sf2_file', + '1254_Aspirin_sf2_file', + '1254_GeneralUserGS_sf2_file', + '1255_Aspirin_sf2_file', + '1255_GeneralUserGS_sf2_file', + '1256_Aspirin_sf2_file', + '1256_GeneralUserGS_sf2_file', + '1257_Aspirin_sf2_file', + '1257_GeneralUserGS_sf2_file', + '1258_Aspirin_sf2_file', + '1258_GeneralUserGS_sf2_file', + '1259_GeneralUserGS_sf2_file', + + // Applause: Sound effects + '1260_Aspirin_sf2_file', + '1260_Chaos_sf2_file', + '1260_FluidR3_GM_sf2_file', + '1260_GeneralUserGS_sf2_file', + '1260_JCLive_sf2_file', + //'1260_SBLive_sf2', + //'1260_SoundBlasterOld_sf2', + '1261_Aspirin_sf2_file', + '1261_GeneralUserGS_sf2_file', + '1262_Aspirin_sf2_file', + '1262_GeneralUserGS_sf2_file', + '1263_Aspirin_sf2_file', + '1263_GeneralUserGS_sf2_file', + '1264_Aspirin_sf2_file', + '1264_GeneralUserGS_sf2_file', + '1265_Aspirin_sf2_file', + '1265_GeneralUserGS_sf2_file', + + // Gunshot: Sound effects + '1270_Aspirin_sf2_file', + '1270_Chaos_sf2_file', + '1270_FluidR3_GM_sf2_file', + '1270_GeneralUserGS_sf2_file', + '1270_JCLive_sf2_file', + //'1270_SBLive_sf2', + //'1270_SoundBlasterOld_sf2', + '1271_Aspirin_sf2_file', + '1271_GeneralUserGS_sf2_file', + '1272_Aspirin_sf2_file', + '1272_GeneralUserGS_sf2_file', + '1273_GeneralUserGS_sf2_file', + '1274_GeneralUserGS_sf2_file', +]; + +export const drums = [ + ////'35_0_SBLive_sf2' + '35_0_Chaos_sf2_file', + '35_12_JCLive_sf2_file', + '35_16_JCLive_sf2_file', + '35_18_JCLive_sf2_file', + '35_4_Chaos_sf2_file', + //'36_0_SBLive_sf2', + '36_12_JCLive_sf2_file', + '36_16_JCLive_sf2_file', + '36_18_JCLive_sf2_file', + '36_4_Chaos_sf2_file', + //'37_0_SBLive_sf2', + '37_12_JCLive_sf2_file', + '37_16_JCLive_sf2_file', + '37_18_JCLive_sf2_file', + '37_4_Chaos_sf2_file', + //'38_0_SBLive_sf2', + '38_12_JCLive_sf2_file', + '38_16_JCLive_sf2_file', + '38_18_JCLive_sf2_file', + '38_4_Chaos_sf2_file', + //'39_0_SBLive_sf2', + '39_12_JCLive_sf2_file', + '39_16_JCLive_sf2_file', + '39_18_JCLive_sf2_file', + '39_4_Chaos_sf2_file', + //'40_0_SBLive_sf2', + '40_12_JCLive_sf2_file', + '40_16_JCLive_sf2_file', + '40_18_JCLive_sf2_file', + '40_4_Chaos_sf2_file', + //'41_0_SBLive_sf2', + '41_12_JCLive_sf2_file', + '41_16_JCLive_sf2_file', + '41_18_JCLive_sf2_file', + '41_4_Chaos_sf2_file', + //'42_0_SBLive_sf2', + '42_12_JCLive_sf2_file', + '42_16_JCLive_sf2_file', + '42_18_JCLive_sf2_file', + '42_4_Chaos_sf2_file', + //'43_0_SBLive_sf2', + '43_12_JCLive_sf2_file', + '43_16_JCLive_sf2_file', + '43_18_JCLive_sf2_file', + '43_4_Chaos_sf2_file', + //'44_0_SBLive_sf2', + '44_12_JCLive_sf2_file', + '44_16_JCLive_sf2_file', + '44_18_JCLive_sf2_file', + '44_4_Chaos_sf2_file', + //'45_0_SBLive_sf2', + '45_12_JCLive_sf2_file', + '45_16_JCLive_sf2_file', + '45_18_JCLive_sf2_file', + '45_4_Chaos_sf2_file', + //'46_0_SBLive_sf2', + '46_12_JCLive_sf2_file', + '46_16_JCLive_sf2_file', + '46_18_JCLive_sf2_file', + '46_4_Chaos_sf2_file', + //'47_0_SBLive_sf2', + '47_12_JCLive_sf2_file', + '47_16_JCLive_sf2_file', + '47_18_JCLive_sf2_file', + '47_4_Chaos_sf2_file', + //'48_0_SBLive_sf2', + '48_12_JCLive_sf2_file', + '48_16_JCLive_sf2_file', + '48_18_JCLive_sf2_file', + '48_4_Chaos_sf2_file', + //'49_0_SBLive_sf2', + '49_12_JCLive_sf2_file', + '49_16_JCLive_sf2_file', + '49_18_JCLive_sf2_file', + '49_4_Chaos_sf2_file', + //'50_0_SBLive_sf2', + '50_12_JCLive_sf2_file', + '50_16_JCLive_sf2_file', + '50_18_JCLive_sf2_file', + '50_4_Chaos_sf2_file', + //'51_0_SBLive_sf2', + '51_12_JCLive_sf2_file', + '51_16_JCLive_sf2_file', + '51_18_JCLive_sf2_file', + '51_4_Chaos_sf2_file', + //'52_0_SBLive_sf2', + '52_12_JCLive_sf2_file', + '52_16_JCLive_sf2_file', + '52_18_JCLive_sf2_file', + '52_4_Chaos_sf2_file', + //'53_0_SBLive_sf2', + '53_12_JCLive_sf2_file', + '53_16_JCLive_sf2_file', + '53_18_JCLive_sf2_file', + '53_4_Chaos_sf2_file', + //'54_0_SBLive_sf2', + '54_12_JCLive_sf2_file', + '54_16_JCLive_sf2_file', + '54_18_JCLive_sf2_file', + '54_4_Chaos_sf2_file', + //'55_0_SBLive_sf2', + '55_12_JCLive_sf2_file', + '55_16_JCLive_sf2_file', + '55_18_JCLive_sf2_file', + '55_4_Chaos_sf2_file', + //'56_0_SBLive_sf2', + '56_12_JCLive_sf2_file', + '56_16_JCLive_sf2_file', + '56_18_JCLive_sf2_file', + '56_4_Chaos_sf2_file', + //'57_0_SBLive_sf2', + '57_12_JCLive_sf2_file', + '57_16_JCLive_sf2_file', + '57_18_JCLive_sf2_file', + '57_4_Chaos_sf2_file', + //'58_0_SBLive_sf2', + '58_12_JCLive_sf2_file', + '58_16_JCLive_sf2_file', + '58_18_JCLive_sf2_file', + '58_4_Chaos_sf2_file', + //'59_0_SBLive_sf2', + '59_12_JCLive_sf2_file', + '59_16_JCLive_sf2_file', + '59_18_JCLive_sf2_file', + '59_4_Chaos_sf2_file', + //'60_0_SBLive_sf2', + '60_12_JCLive_sf2_file', + '60_16_JCLive_sf2_file', + '60_18_JCLive_sf2_file', + '60_4_Chaos_sf2_file', + //'61_0_SBLive_sf2', + '61_12_JCLive_sf2_file', + '61_16_JCLive_sf2_file', + '61_18_JCLive_sf2_file', + '61_4_Chaos_sf2_file', + //'62_0_SBLive_sf2', + '62_12_JCLive_sf2_file', + '62_16_JCLive_sf2_file', + '62_18_JCLive_sf2_file', + '62_4_Chaos_sf2_file', + //'63_0_SBLive_sf2', + '63_12_JCLive_sf2_file', + '63_16_JCLive_sf2_file', + '63_18_JCLive_sf2_file', + '63_4_Chaos_sf2_file', + //'64_0_SBLive_sf2', + '64_12_JCLive_sf2_file', + '64_16_JCLive_sf2_file', + '64_18_JCLive_sf2_file', + '64_4_Chaos_sf2_file', + //'65_0_SBLive_sf2', + '65_12_JCLive_sf2_file', + '65_16_JCLive_sf2_file', + '65_18_JCLive_sf2_file', + '65_4_Chaos_sf2_file', + //'66_0_SBLive_sf2', + '66_12_JCLive_sf2_file', + '66_16_JCLive_sf2_file', + '66_18_JCLive_sf2_file', + '66_4_Chaos_sf2_file', + //'67_0_SBLive_sf2', + '67_12_JCLive_sf2_file', + '67_16_JCLive_sf2_file', + '67_18_JCLive_sf2_file', + '67_4_Chaos_sf2_file', + //'68_0_SBLive_sf2', + '68_12_JCLive_sf2_file', + '68_16_JCLive_sf2_file', + '68_18_JCLive_sf2_file', + '68_4_Chaos_sf2_file', + //'69_0_SBLive_sf2', + '69_12_JCLive_sf2_file', + '69_16_JCLive_sf2_file', + '69_18_JCLive_sf2_file', + '69_4_Chaos_sf2_file', + //'70_0_SBLive_sf2', + '70_12_JCLive_sf2_file', + '70_16_JCLive_sf2_file', + '70_18_JCLive_sf2_file', + '70_4_Chaos_sf2_file', + //'71_0_SBLive_sf2', + '71_12_JCLive_sf2_file', + '71_16_JCLive_sf2_file', + '71_18_JCLive_sf2_file', + '71_4_Chaos_sf2_file', + //'72_0_SBLive_sf2', + '72_12_JCLive_sf2_file', + '72_16_JCLive_sf2_file', + '72_18_JCLive_sf2_file', + '72_4_Chaos_sf2_file', + //'73_0_SBLive_sf2', + '73_12_JCLive_sf2_file', + '73_16_JCLive_sf2_file', + '73_18_JCLive_sf2_file', + '73_4_Chaos_sf2_file', + //'74_0_SBLive_sf2', + '74_12_JCLive_sf2_file', + '74_16_JCLive_sf2_file', + '74_18_JCLive_sf2_file', + '74_4_Chaos_sf2_file', + //'75_0_SBLive_sf2', + '75_12_JCLive_sf2_file', + '75_16_JCLive_sf2_file', + '75_18_JCLive_sf2_file', + '75_4_Chaos_sf2_file', + //'76_0_SBLive_sf2', + '76_12_JCLive_sf2_file', + '76_16_JCLive_sf2_file', + '76_18_JCLive_sf2_file', + '76_4_Chaos_sf2_file', + //'77_0_SBLive_sf2', + '77_12_JCLive_sf2_file', + '77_16_JCLive_sf2_file', + '77_18_JCLive_sf2_file', + '77_4_Chaos_sf2_file', + //'78_0_SBLive_sf2', + '78_12_JCLive_sf2_file', + '78_16_JCLive_sf2_file', + '78_18_JCLive_sf2_file', + '78_4_Chaos_sf2_file', + //'79_0_SBLive_sf2', + '79_12_JCLive_sf2_file', + '79_16_JCLive_sf2_file', + '79_18_JCLive_sf2_file', + '79_4_Chaos_sf2_file', + //'80_0_SBLive_sf2', + '80_12_JCLive_sf2_file', + '80_16_JCLive_sf2_file', + '80_18_JCLive_sf2_file', + '80_4_Chaos_sf2_file', + //'81_0_SBLive_sf2', + '81_12_JCLive_sf2_file', + '81_16_JCLive_sf2_file', + '81_18_JCLive_sf2_file', + '81_4_Chaos_sf2_file', +]; + +// see https://www.midi.org/specifications-old/item/gm-level-1-sound-set +export const instrumentNames = []; +instrumentNames[0] = 'Acoustic Grand Piano: Piano'; +instrumentNames[1] = 'Bright Acoustic Piano: Piano'; +instrumentNames[2] = 'Electric Grand Piano: Piano'; +instrumentNames[3] = 'Honky-tonk Piano: Piano'; +instrumentNames[4] = 'Electric Piano 1: Piano'; +instrumentNames[5] = 'Electric Piano 2: Piano'; +instrumentNames[6] = 'Harpsichord: Piano'; +instrumentNames[7] = 'Clavinet: Piano'; +instrumentNames[8] = 'Celesta: Chromatic Percussion'; +instrumentNames[9] = 'Glockenspiel: Chromatic Percussion'; +instrumentNames[10] = 'Music Box: Chromatic Percussion'; +instrumentNames[11] = 'Vibraphone: Chromatic Percussion'; +instrumentNames[12] = 'Marimba: Chromatic Percussion'; // out of tune +instrumentNames[13] = 'Xylophone: Chromatic Percussion'; +instrumentNames[14] = 'Tubular Bells: Chromatic Percussion'; +instrumentNames[15] = 'Dulcimer: Chromatic Percussion'; +instrumentNames[16] = 'Drawbar Organ: Organ'; +instrumentNames[17] = 'Percussive Organ: Organ'; +instrumentNames[18] = 'Rock Organ: Organ'; +instrumentNames[19] = 'Church Organ: Organ'; +instrumentNames[20] = 'Reed Organ: Organ'; +instrumentNames[21] = 'Accordion: Organ'; // some notes are one octave up +instrumentNames[22] = 'Harmonica: Organ'; +instrumentNames[23] = 'Tango Accordion: Organ'; +instrumentNames[24] = 'Acoustic Guitar (nylon): Guitar'; +instrumentNames[25] = 'Acoustic Guitar (steel): Guitar'; +instrumentNames[26] = 'Electric Guitar (jazz): Guitar'; +instrumentNames[27] = 'Electric Guitar (clean): Guitar'; +instrumentNames[28] = 'Electric Guitar (muted): Guitar'; +instrumentNames[29] = 'Overdriven Guitar: Guitar'; +instrumentNames[30] = 'Distortion Guitar: Guitar'; +instrumentNames[31] = 'Guitar Harmonics: Guitar'; +instrumentNames[32] = 'Acoustic Bass: Bass'; +instrumentNames[33] = 'Electric Bass (finger): Bass'; +instrumentNames[34] = 'Electric Bass (pick): Bass'; +instrumentNames[35] = 'Fretless Bass: Bass'; +instrumentNames[36] = 'Slap Bass 1: Bass'; +instrumentNames[37] = 'Slap Bass 2: Bass'; +instrumentNames[38] = 'Synth Bass 1: Bass'; // not found? +instrumentNames[39] = 'Synth Bass 2: Bass'; +instrumentNames[40] = 'Violin: Strings'; +instrumentNames[41] = 'Viola: Strings'; +instrumentNames[42] = 'Cello: Strings'; +instrumentNames[43] = 'Contrabass: Strings'; +instrumentNames[44] = 'Tremolo Strings: Strings'; +instrumentNames[45] = 'Pizzicato Strings: Strings'; +instrumentNames[46] = 'Orchestral Harp: Strings'; +instrumentNames[47] = 'Timpani: Strings'; +instrumentNames[48] = 'String Ensemble 1: Ensemble'; +instrumentNames[49] = 'String Ensemble 2: Ensemble'; +instrumentNames[50] = 'Synth Strings 1: Ensemble'; +instrumentNames[51] = 'Synth Strings 2: Ensemble'; +instrumentNames[52] = 'Choir Aahs: Ensemble'; +instrumentNames[53] = 'Voice Oohs: Ensemble'; +instrumentNames[54] = 'Synth Choir: Ensemble'; +instrumentNames[55] = 'Orchestra Hit: Ensemble'; +instrumentNames[56] = 'Trumpet: Brass'; +instrumentNames[57] = 'Trombone: Brass'; +instrumentNames[58] = 'Tuba: Brass'; +instrumentNames[59] = 'Muted Trumpet: Brass'; +instrumentNames[60] = 'French Horn: Brass'; +instrumentNames[61] = 'Brass Section: Brass'; +instrumentNames[62] = 'Synth Brass 1: Brass'; +instrumentNames[63] = 'Synth Brass 2: Brass'; +instrumentNames[64] = 'Soprano Sax: Reed'; // out of time? +instrumentNames[65] = 'Alto Sax: Reed'; +instrumentNames[66] = 'Tenor Sax: Reed'; +instrumentNames[67] = 'Baritone Sax: Reed'; +instrumentNames[68] = 'Oboe: Reed'; +instrumentNames[69] = 'English Horn: Reed'; +instrumentNames[70] = 'Bassoon: Reed'; +instrumentNames[71] = 'Clarinet: Reed'; +instrumentNames[72] = 'Piccolo: Pipe'; +instrumentNames[73] = 'Flute: Pipe'; +instrumentNames[74] = 'Recorder: Pipe'; // out of time? +instrumentNames[75] = 'Pan Flute: Pipe'; +instrumentNames[76] = 'Blown bottle: Pipe'; +instrumentNames[77] = 'Shakuhachi: Pipe'; +instrumentNames[78] = 'Whistle: Pipe'; +instrumentNames[79] = 'Ocarina: Pipe'; +instrumentNames[80] = 'Lead 1 (square): Synth Lead'; +instrumentNames[81] = 'Lead 2 (sawtooth): Synth Lead'; +instrumentNames[82] = 'Lead 3 (calliope): Synth Lead'; +instrumentNames[83] = 'Lead 4 (chiff): Synth Lead'; +instrumentNames[84] = 'Lead 5 (charang): Synth Lead'; +instrumentNames[85] = 'Lead 6 (voice): Synth Lead'; // terranigma! +instrumentNames[86] = 'Lead 7 (fifths): Synth Lead'; +instrumentNames[87] = 'Lead 8 (bass + lead): Synth Lead'; +instrumentNames[88] = 'Pad 1 (new age): Synth Pad'; +instrumentNames[89] = 'Pad 2 (warm): Synth Pad'; +instrumentNames[90] = 'Pad 3 (polysynth): Synth Pad'; +instrumentNames[91] = 'Pad 4 (choir): Synth Pad'; +instrumentNames[92] = 'Pad 5 (bowed): Synth Pad'; +instrumentNames[93] = 'Pad 6 (metallic): Synth Pad'; +instrumentNames[94] = 'Pad 7 (halo): Synth Pad'; +instrumentNames[95] = 'Pad 8 (sweep): Synth Pad'; +instrumentNames[96] = 'FX 1 (rain): Synth Effects'; +instrumentNames[97] = 'FX 2 (soundtrack): Synth Effects'; +instrumentNames[98] = 'FX 3 (crystal): Synth Effects'; +instrumentNames[99] = 'FX 4 (atmosphere): Synth Effects'; +instrumentNames[100] = 'FX 5 (brightness): Synth Effects'; +instrumentNames[101] = 'FX 6 (goblins): Synth Effects'; +instrumentNames[102] = 'FX 7 (echoes): Synth Effects'; +instrumentNames[103] = 'FX 8 (sci-fi): Synth Effects'; +instrumentNames[104] = 'Sitar: Ethnic'; +instrumentNames[105] = 'Banjo: Ethnic'; +instrumentNames[106] = 'Shamisen: Ethnic'; +instrumentNames[107] = 'Koto: Ethnic'; +instrumentNames[108] = 'Kalimba: Ethnic'; +instrumentNames[109] = 'Bagpipe: Ethnic'; +instrumentNames[110] = 'Fiddle: Ethnic'; +instrumentNames[111] = 'Shanai: Ethnic'; +instrumentNames[112] = 'Tinkle Bell: Percussive'; +instrumentNames[113] = 'Agogo: Percussive'; +instrumentNames[114] = 'Steel Drums: Percussive'; +instrumentNames[115] = 'Woodblock: Percussive'; +instrumentNames[116] = 'Taiko Drum: Percussive'; +instrumentNames[117] = 'Melodic Tom: Percussive'; +instrumentNames[118] = 'Synth Drum: Percussive'; +instrumentNames[119] = 'Reverse Cymbal: Percussive'; +instrumentNames[120] = 'Guitar Fret Noise: Sound effects'; +instrumentNames[121] = 'Breath Noise: Sound effects'; +instrumentNames[122] = 'Seashore: Sound effects'; +instrumentNames[123] = 'Bird Tweet: Sound effects'; +instrumentNames[124] = 'Telephone Ring: Sound effects'; +instrumentNames[125] = 'Helicopter: Sound effects'; +instrumentNames[126] = 'Applause: Sound effects'; +instrumentNames[127] = 'Gunshot: Sound effects'; diff --git a/src/strudel/soundfonts/sfumato.mjs b/src/strudel/soundfonts/sfumato.mjs new file mode 100644 index 0000000..4d5e7ef --- /dev/null +++ b/src/strudel/soundfonts/sfumato.mjs @@ -0,0 +1,49 @@ +import { Pattern, getPlayableNoteValue, noteToMidi } from '@strudel/core'; +import { getAudioContext, registerSound } from '@strudel/webaudio'; +import { loadSoundfont as _loadSoundfont, startPresetNote } from 'sfumato'; + +Pattern.prototype.soundfont = function (sf, n = 0) { + return this.onTrigger((h, ct, cps, targetTime) => { + const ctx = getAudioContext(); + const note = getPlayableNoteValue(h); + const preset = sf.presets[n % sf.presets.length]; + const deadline = targetTime; + const args = [ctx, preset, noteToMidi(note), deadline]; + const stop = startPresetNote(...args); + stop(deadline + h.duration); + }); +}; + +const soundfontCache = new Map(); +export function loadSoundfont(url) { + if (soundfontCache.get(url)) { + return soundfontCache.get(url); + } + const sf = _loadSoundfont(url); + soundfontCache.set(url, sf); + /*sf.then((font) => { + font.presets.forEach((preset) => { + console.log('preset', preset.header.name); + registerSound( + preset.header.name.replaceAll(' ', '_'), + (time, value, onended) => { + const ctx = getAudioContext(); + let { note } = value; // freq ? + + const p = font.presets.find((p) => p.header.name === preset.header.name); + + if (!p) { + throw new Error('preset not found'); + } + const deadline = time; // - ctx.currentTime; + const args = [ctx, p, noteToMidi(note), deadline]; + const stop = startPresetNote(...args); + return { node: undefined, stop }; + }, + { type: 'soundfont' }, + ); + }); + //console.log('f', f); + });*/ + return sf; +} diff --git a/src/strudel/tonal/index.mjs b/src/strudel/tonal/index.mjs new file mode 100644 index 0000000..ebbcf08 --- /dev/null +++ b/src/strudel/tonal/index.mjs @@ -0,0 +1,9 @@ +import './tonal.mjs'; +import './voicings.mjs'; +import './ireal.mjs'; + +export * from './tonal.mjs'; +export * from './voicings.mjs'; +export * from './ireal.mjs'; + +export const packageName = '@strudel/tonal'; diff --git a/src/strudel/tonal/ireal.mjs b/src/strudel/tonal/ireal.mjs new file mode 100644 index 0000000..e6faef9 --- /dev/null +++ b/src/strudel/tonal/ireal.mjs @@ -0,0 +1,523 @@ +// explore them here: https://codesandbox.io/s/voicing-explorer-ireal-47tkx5?file=/src/ireal.js:0-16036 +// scraped via: https://codesandbox.io/s/ireal-midi-scraper-2-gjz2mr?file=/src/index.js + +export const simple = { + 2: ['1P 5P 8P 9M', '1P 5P 8P 9M 12P', '5P 8P 9M 12P'], + 5: ['1P 5P 8P 12P', '5P 8P 12P 15P'], + 6: ['1P 5P 6M 8P 10M', '1P 5P 8P 10M 13M', '3M 5P 8P 10M 13M', '5P 8P 10M 12P 13M'], + 7: [ + '1P 5P 7m 8P 10M', + '1P 7m 8P 10M 12P', + '3M 7m 8P 10M 12P', + '3M 7m 8P 10M 14m', + '3M 7m 10M 12P 15P', + '7m 10M 12P 14m 15P', + '7m 10M 12P 15P 17M', + ], + 9: [ + '1P 5P 7m 9M 10M', + '1P 7m 9M 10M 12P', + '3M 7m 8P 9M 12P', + '7m 9M 10M 14m 15P', + '3M 7m 8P 12P 16M', + '7m 10M 12P 15P 16M', + ], + 11: ['1P 5P 7m 9M 11P', '5P 7m 8P 9M 11P', '7m 8P 9M 11P 12P', '7m 8P 11P 12P 16M'], + 13: ['1P 6M 7m 9M 10M', '1P 7m 9M 10M 13M', '3M 7m 8P 9M 13M', '7m 8P 9M 10M 13M', '7m 9M 10M 13M 15P'], + 69: ['1P 5P 6M 9M 10M', '1P 5P 9M 10M 13M', '3M 5P 8P 9M 13M', '5P 8P 9M 10M 13M'], + add9: ['1P 5P 8P 9M 10M', '1P 5P 9M 10M 12P', '3M 8P 9M 10M 12P', '3M 8P 9M 12P 15P', '5P 8P 9M 12P 17M'], + '+': [ + '1P 3M 6m 8P 10M', + '1P 6m 8P 10M 13m', + '3M 6m 8P 10M 13m', + '3M 8P 10M 13m 15P', + '6m 8P 10M 13m 15P', + '6m 10M 13m 15P 17M', + ], + o: ['1P 5d 8P 10m 12d', '3m 8P 10m 12d 15P', '5d 8P 10m 12d 15P'], + h: [ + '3m 5d 7m 8P 10m', + '1P 5d 7m 10m 12d', + '3m 7m 8P 10m 12d', + '3m 7m 8P 12d 14m', + '5d 7m 8P 10m 14m', + '5d 8P 10m 12d 14m', + '7m 10m 12d 14m 15P', + '5d 8P 10m 14m 17m', + ], + sus: ['1P 4P 5P 8P', '1P 4P 5P 8P 11P', '5P 8P 11P 12P', '5P 8P 11P 12P 15P'], + '^': ['1P 5P 8P 10M', '1P 5P 8P 10M 12P', '3M 5P 8P 10M 12P', '3M 8P 10M 12P 15P', '5P 8P 10M 12P 15P'], + '-': ['1P 3m 5P 8P 10m', '1P 5P 8P 10m 12P', '3m 5P 8P 10m 12P', '5P 8P 10m 12P 15P'], + '^7': ['1P 5P 7M 10M 12P', '1P 10M 12P 14M', '3M 8P 10M 12P 14M', '5P 8P 10M 12P 14M', '5P 8P 10M 14M 17M'], + '-7': [ + '1P 3m 5P 7m 10m', + '1P 5P 7m 10m 12P', + '3m 7m 8P 10m 12P', + '3m 7m 8P 10m 14m', + '5P 7m 8P 10m 14m', + '7m 10m 12P 14m 15P', + '5P 8P 10m 14m 17m', + '7m 10m 12P 15P 17m', + ], + '7sus': ['1P 5P 7m 8P 11P', '5P 8P 11P 12P 14m', '7m 8P 11P 12P 14m', '7m 11P 12P 14m 18P'], + h7: [ + '3m 5d 7m 8P 10m', + '1P 5d 7m 10m 12d', + '1P 7m 10m 12d', + '3m 7m 8P 10m 12d', + '3m 7m 8P 12d 14m', + '5d 7m 8P 10m 14m', + '5d 8P 10m 12d 14m', + '7m 10m 12d 14m 15P', + '5d 8P 10m 14m 17m', + ], + o7: [ + '1P 6M 8P 10m 12d', + '1P 6M 10m 12d 13M', + '3m 8P 10m 12d 13M', + '3m 8P 12d 13M 15P', + '5d 10m 12d 13M 15P', + '5d 10m 13M 15P 17m', + '6M 12d 13M 15P 17m', + '6M 12d 15P 17m 19d', + ], + '^9': [ + '1P 5P 7M 9M 10M', + '1P 7M 9M 10M 12P', + '3M 7M 8P 9M 12P', + '3M 7M 8P 12P 16M', + '5P 8P 10M 14M 16M', + '7M 8P 10M 12P 16M', + ], + '^13': ['1P 6M 7M 9M 10M', '1P 7M 9M 10M 13M', '3M 7M 8P 9M 13M', '3M 7M 8P 13M 16M', '7M 8P 10M 13M 16M'], + '^7#11': ['1P 5P 7M 10M 12d', '3M 7M 8P 10M 12d', '1P 7M 10M 12d 14M', '3M 7M 8P 12d 14M', '5P 8P 10M 12d 14M'], + '^9#11': ['1P 3M 5d 7M 9M', '1P 7M 9M 10M 12d', '3M 7M 8P 9M 12d', '3M 8P 9M 12d 14M'], + '^7#5': ['1P 6m 7M 10M 13m', '3M 7M 8P 10M 13m', '6m 7M 8P 10M 13m'], + '-6': [ + '1P 3m 5P 6M 8P', + '1P 5P 6M 8P 10m', + '3m 5P 6M 8P 10m', + '1P 5P 8P 10m 13M', + '3m 5P 8P 10m 13M', + '5P 8P 10m 12P 13M', + '5P 8P 10m 13M 15P', + ], + '-69': [ + '1P 3m 5P 6M 9M', + '3m 5P 6M 8P 9M', + '3m 6M 9M 10m 12P', + '1P 5P 9M 10m 13M', + '3m 5P 8P 9M 13M', + '5P 8P 9M 10m 13M', + '5P 8P 10m 13M 16M', + ], + '-^7': ['1P 3m 5P 7M 10m', '1P 5P 7M 10m 12P', '3m 7M 8P 10m 12P', '5P 7M 8P 10m 14M', '5P 8P 10m 14M 17m'], + '-^9': ['1P 3m 5P 7M 9M', '1P 7M 9M 10m 12P', '3m 7M 8P 9M 12P', '5P 8P 9M 10m 14M'], + '-9': [ + '1P 3m 5P 7m 9M', + '3m 5P 7m 8P 9M', + '3m 7m 8P 9M 12P', + '5P 8P 9M 10m 14m', + '3m 7m 9M 12P 15P', + '7m 10m 12P 15P 16M', + ], + '-add9': ['1P 2M 3m 5P 8P', '1P 3m 5P 9M', '3m 5P 8P 9M 12P', '5P 8P 9M 10m 12P'], + '-11': [ + '1P 3m 7m 9M 11P', + '3m 7m 8P 9M 11P', + '1P 4P 7m 10m 12P', + '5P 8P 11P 14m', + '3m 7m 9M 11P 15P', + '5P 8P 11P 14m 16M', + '7m 10m 12P 15P 18P', + ], + '-7b5': [ + '3m 5d 7m 8P 10m', + '1P 7m 10m 12d', + '1P 5d 7m 10m 12d', + '3m 7m 8P 10m 12d', + '3m 7m 8P 12d 14m', + '5d 7m 8P 10m 14m', + '5d 8P 10m 12d 14m', + '7m 10m 12d 14m 15P', + '5d 8P 10m 14m 17m', + ], + h9: ['1P 7m 9M 10m 12d', '3m 7m 8P 9M 12d', '5d 8P 9M 10m 14m', '7m 10m 12d 15P 16M'], + '-b6': ['1P 5P 6m 8P 10m', '1P 5P 8P 10m 13m', '3m 5P 8P 10m 13m', '5P 8P 10m 13m', '5P 8P 10m 13m 15P'], + '-#5': ['1P 6m 8P 10m 13m', '3m 6m 8P 10m 13m', '6m 8P 10m 13m 15P'], + '7b9': ['1P 3M 7m 9m 10M', '3M 7m 8P 9m 10M', '3M 7m 8P 9m 14m', '7m 9m 10M 14m 15P'], + '7#9': ['1P 3M 7m 10m', '3M 7m 8P 10m 14m', '7m 10m 10M 14m 15P'], + '7#11': ['1P 3M 7m 10M 12d', '3M 7m 8P 10M 12d', '7m 10M 12d 14m 15P'], + '7b5': ['1P 3M 7m 10M 12d', '3M 7m 8P 10M 12d', '7m 10M 12d 14m 15P'], + '7#5': ['1P 3M 7m 10M 13m', '3M 7m 8P 10M 13m', '3M 7m 8P 13m 14m', '7m 10M 13m 14m 15P'], + '9#11': ['1P 7m 9M 10M 12d', '3M 7m 8P 9M 12d', '7m 10M 12d 15P 16M'], + '9b5': ['1P 7m 9M 10M 12d', '3M 7m 8P 9M 12d', '7m 10M 12d 15P 16M'], + '9#5': ['1P 7m 9M 10M 13m', '3M 7m 9M 10M 13m', '3M 7m 9M 13m 14m', '7m 10M 13m 14m 16M', '7m 10M 13m 16M 17M'], + '7b13': ['1P 3M 7m 10M 13m', '3M 7m 8P 10M 13m', '3M 7m 8P 13m 14m', '7m 10M 13m 14m 15P'], + '7#9#5': ['1P 3M 7m 10m 13m', '3M 7m 10m 13m 15P', '7m 10M 13m 15P 17m'], + '7#9b5': ['1P 3M 7m 10m 12d', '3M 7m 10m 12d 15P', '7m 10M 12d 15P 17m'], + '7#9#11': ['1P 3M 7m 10m 12d', '3M 7m 10m 12d 15P', '7m 10M 12d 15P 17m'], + '7b9#11': ['1P 7m 9m 10M 12d', '3M 7m 8P 9m 12d', '7m 8P 10M 12d 16m'], + '7b9b5': ['1P 7m 9m 10M 12d', '3M 7m 8P 9m 12d', '7m 8P 10M 12d 16m'], + '7b9#5': ['1P 7m 9m 10M 13m', '3M 7m 8P 9m 13m', '7m 9m 10M 13m 15P'], + '7b9#9': ['1P 3M 7m 9m 10m', '3M 7m 8P 9m 10m', '7m 8P 10M 16m 17m'], + '7b9b13': ['1P 7m 9m 10M 13m', '3M 7m 8P 9m 13m', '7m 9m 10M 13m 15P'], + '7alt': [ + '3M 7m 8P 9m 12d', + '1P 7m 10m 10M 13m', + '3M 7m 8P 10m 13m', + '3M 7m 9m 12d 15P', + '3M 7m 10m 13m 15P', + '7m 10M 12d 15P 17m', + '7m 10M 13m 15P 17m', + ], + '13#11': ['1P 6M 7m 10M 12d', '3M 7m 9M 12d 13M', '7m 10M 12d 13M 16M'], + '13b9': ['1P 3M 6M 7m 9m', '1P 6M 7m 9m 10M', '3M 7m 9m 10M 13M', '3M 7m 10M 13M 16m', '7m 10M 13M 16m 17M'], + '13#9': ['1P 3M 6M 7m 10m', '3M 7m 8P 10m 13M', '7m 10M 13M 14m 17m'], + '7b9sus': ['1P 5P 7m 9m 11P', '5P 7m 8P 9m 11P', '7m 8P 11P 14m 16m'], + '7susadd3': ['1P 4P 5P 7m 10M', '5P 8P 10M 11P 14m', '7m 11P 12P 15P 17M'], + '9sus': ['1P 5P 7m 9M 11P', '5P 7m 8P 9M 11P', '7m 8P 9M 11P 12P', '7m 8P 11P 12P 16M'], + '13sus': ['1P 4P 6M 7m 9M', '1P 7m 9M 11P 13M', '5P 7m 9M 11P 13M', '7m 9M 11P 13M 15P'], + '7b13sus': ['1P 5P 7m 11P 13m', '5P 7m 8P 11P 13m', '7m 11P 13m 14m 15P'], +}; + +export const complex = { + 2: ['1P 5P 6M 8P 9M', '1P 5P 8P 9M 12P', '5P 8P 9M 12P 13M', '5P 8P 9M 12P 15P'], + 5: ['1P 5P 8P 12P', '1P 5P 8P 9M 12P', '5P 8P 12P 15P', '5P 8P 12P 15P 16M'], + 6: ['1P 5P 6M 9M 10M', '1P 5P 9M 10M 13M', '3M 5P 9M 10M 13M', '5P 8P 9M 10M 13M', '3M 6M 9M 12P 15P'], + 7: [ + '1P 5P 7m 8P 10M', + '1P 7m 8P 10M 12P', + '3M 7m 8P 10M 12P', + '3M 7m 8P 10M 14m', + '3M 7m 10M 12P 15P', + '7m 10M 12P 14m 15P', + '7m 10M 12P 15P 17M', + '7m 10M 14m 17M 19P', + ], + 9: [ + '1P 6M 7m 9M 10M', + '3M 7m 9M 10M 12P', + '1P 7m 9M 10M 13M', + '3M 7m 9M 10M 13M', + '3M 7m 9M 12P 15P', + '7m 10M 12P 13M 16M', + '7m 10M 13M 16M 17M', + '7m 10M 13M 16M 19P', + ], + 11: [ + '1P 4P 6M 7m 9M', + '1P 5P 7m 9M 11P', + '4P 6M 7m 9M 11P', + '5P 8P 9M 11P 14m', + '7m 9M 11P 13M 15P', + '7m 11P 12P 14m 18P', + ], + 13: [ + '3M 7m 9M 10M 13M', + '3M 7m 9M 13M 15P', + '3M 7m 10M 13M 16M', + '7m 10M 12P 13M 16M', + '7m 10M 13M 16M 17M', + '7m 10M 13M 16M 19P', + ], + 69: ['1P 5P 6M 9M 10M', '1P 5P 9M 10M 13M', '3M 5P 9M 10M 13M', '5P 8P 9M 10M 13M', '3M 6M 9M 12P 15P'], + add9: [ + '1P 5P 8P 9M 10M', + '1P 5P 9M 10M 12P', + '3M 8P 9M 10M 12P', + '3M 8P 9M 12P 15P', + '5P 8P 9M 10M 15P', + '5P 8P 9M 12P 17M', + ], + '+': [ + '1P 6m 8P 9M 10M', + '1P 6m 8P 10M 13m', + '3M 8P 9M 10M 13m', + '3M 8P 10M 13m 15P', + '6m 10M 13m 15P 16M', + '6m 10M 13m 15P 17M', + ], + o: [ + '1P 6M 8P 10m 12d', + '1P 6M 10m 12d 13M', + '3m 8P 10m 12d 13M', + '3m 8P 12d 13M 15P', + '5d 10m 12d 13M 15P', + '5d 10m 13M 15P 17m', + '6M 12d 13M 15P 17m', + '6M 12d 15P 17m 19d', + ], + h: [ + '1P 5d 7m 10m 11P', + '3m 5d 7m 8P 11P', + '5d 7m 8P 10m 11P', + '1P 7m 10m 12d', + '3m 7m 8P 12d 14m', + '5d 8P 10m 11P 14m', + '7m 10m 11P 12d 14m', + '7m 10m 12d 14m 15P', + '5d 8P 10m 14m 17m', + ], + sus: [ + '1P 4P 5P 8P 9M', + '1P 4P 5P 8P 11P', + '1P 5P 8P 9M 11P', + '5P 8P 9M 11P 12P', + '5P 8P 11P 12P 13M', + '5P 8P 11P 13M 15P', + ], + '^': [ + '1P 3M 5P 6M 9M', + '1P 5P 8P 10M 12P', + '3M 5P 9M 10M 12P', + '1P 5P 8P 10M 13M', + '3M 8P 10M 13M 15P', + '5P 9M 10M 12P 15P', + ], + '-': [ + '1P 3m 5P 8P 10m', + '1P 3m 5P 9M 11P', + '3m 5P 8P 9M 11P', + '5P 8P 9M 10m 11P', + '1P 5P 9M 10m 12P', + '3m 5P 8P 10m 12P', + '5P 8P 10m 12P 15P', + ], + '^7': [ + '1P 6M 7M 9M 10M', + '3M 7M 9M 10M 12P', + '1P 7M 9M 10M 13M', + '3M 7M 9M 10M 13M', + '3M 7M 9M 12P 13M', + '3M 7M 9M 13M 14M', + '3M 7M 10M 13M 16M', + '7M 10M 13M 14M 16M', + '7M 10M 13M 16M 17M', + '7M 10M 13M 16M 19P', + ], + '-7': [ + '1P 3m 5P 7m 9M', + '1P 3m 5P 7m 10m', + '1P 5P 7m 10m 11P', + '3m 7m 8P 10m 11P', + '1P 5P 7m 10m 12P', + '3m 7m 9M 10m 12P', + '3m 7m 8P 10m 14m', + '5P 7m 9M 10m 14m', + '7m 10m 11P 14m 15P', + '7m 10m 12P 15P 16M', + '5P 8P 11P 14m 17m', + '7m 10m 12P 15P 17m', + ], + '7sus': [ + '1P 4P 6M 7m 9M', + '1P 5P 7m 9M 11P', + '4P 6M 7m 9M 11P', + '5P 8P 9M 11P 14m', + '7m 9M 11P 13M 15P', + '7m 11P 12P 14m 18P', + ], + h7: [ + '1P 5d 7m 10m 11P', + '3m 5d 7m 8P 11P', + '5d 7m 8P 10m 11P', + '1P 7m 10m 12d', + '3m 7m 8P 10m 12d', + '3m 7m 8P 12d 14m', + '5d 8P 10m 11P 14m', + '7m 10m 11P 12d 14m', + '7m 10m 12d 14m 15P', + '5d 8P 10m 14m 17m', + ], + o7: [ + '1P 6M 8P 10m 12d', + '1P 6M 10m 12d 13M', + '3m 8P 10m 12d 13M', + '3m 8P 12d 13M 15P', + '5d 10m 12d 13M 15P', + '5d 10m 13M 15P 17m', + '6M 12d 13M 15P 17m', + '6M 12d 15P 17m 19d', + ], + '^9': [ + '1P 6M 7M 9M 10M', + '1P 7M 9M 10M 13M', + '3M 7M 9M 10M 13M', + '3M 7M 9M 12P 13M', + '3M 7M 8P 9M 13M', + '3M 7M 9M 13M 14M', + '3M 7M 10M 13M 16M', + '7M 10M 13M 14M 16M', + '7M 10M 13M 16M 17M', + '7M 10M 13M 16M 19P', + ], + '^13': [ + '1P 6M 7M 9M 10M', + '1P 7M 9M 10M 13M', + '3M 7M 9M 12P 13M', + '3M 7M 9M 10M 13M', + '3M 7M 8P 9M 13M', + '3M 7M 9M 13M 14M', + '3M 7M 10M 13M 16M', + '7M 10M 13M 14M 16M', + '7M 10M 13M 16M 17M', + '7M 10M 13M 16M 19P', + ], + '^7#11': [ + '1P 3M 5d 7M 9M', + '1P 7M 9M 10M 12d', + '3M 7M 9M 10M 12d', + '3M 7M 9M 12d 13M', + '3M 7M 10M 12d 14M', + '7M 10M 12d 13M 14M', + '7M 10M 12d 13M 16M', + '7M 10M 12d 14M 17M', + ], + '^9#11': [ + '1P 3M 5d 7M 9M', + '1P 7M 9M 10M 12d', + '3M 7M 9M 10M 12d', + '3M 7M 9M 12d 13M', + '3M 7M 9M 12d 14M', + '7M 10M 12d 14M 16M', + '7M 10M 12d 13M 16M', + ], + '^7#5': ['1P 6m 7M 10M 13m', '3M 7M 9M 10M 13m', '3M 7M 10M 13m 14M', '7M 10M 13m 14M 16M', '7M 10M 13m 14M 17M'], + '-6': [ + '1P 3m 5P 6M 9M', + '3m 5P 6M 8P 9M', + '1P 5P 6M 10m 11P', + '3m 5P 6M 8P 11P', + '1P 5P 9M 10m 13M', + '3m 5P 8P 9M 13M', + '5P 8P 10m 11P 13M', + '5P 8P 10m 13M 16M', + ], + '-69': [ + '1P 3m 5P 6M 9M', + '3m 5P 6M 8P 9M', + '3m 6M 9M 10m 12P', + '1P 5P 9M 10m 13M', + '3m 5P 8P 9M 13M', + '5P 8P 9M 10m 13M', + '5P 8P 10m 13M 16M', + ], + '-^7': [ + '1P 3m 5P 7M 9M', + '1P 5P 7M 10m 11P', + '3m 7M 9M 10m 11P', + '3m 7M 9M 10m 12P', + '3m 7M 9M 12P 14M', + '7M 10m 11P 12P 14M', + '7M 10m 12P 14M 16M', + ], + '-^9': [ + '1P 3m 5P 7M 9M', + '1P 5P 7M 10m 11P', + '3m 7M 9M 10m 11P', + '3m 7M 9M 10m 12P', + '3m 7M 9M 12P 14M', + '7M 10m 11P 12P 14M', + '7M 10m 12P 14M 16M', + ], + '-9': [ + '1P 3m 5P 7m 9M', + '1P 3m 7m 9M 11P', + '3m 7m 9M 10m 11P', + '3m 7m 9M 10m 12P', + '3m 7m 9M 10m 14m', + '3m 7m 9M 12P 15P', + '7m 10m 11P 14m 16M', + '7m 10m 12P 16M 18P', + ], + '-add9': ['1P 2M 3m 5P 8P', '1P 3m 5P 9M', '3m 5P 8P 9M 12P', '5P 8P 9M 10m 12P'], + '-11': [ + '3m 5P 7m 9M 11P', + '7m 9M 10m 11P', + '1P 4P 7m 10m 12P', + '3m 7m 9M 11P 12P', + '7m 9M 10m 11P 12P', + '3m 7m 9M 11P 14m', + '4P 10m 12P 14m', + '5P 8P 11P 14m', + '5P 8P 11P 14m 16M', + '7m 10m 12P 16M 18P', + '7m 10m 11P 16M 21m', + ], + '-7b5': [ + '1P 5d 7m 10m 11P', + '3m 5d 7m 8P 11P', + '5d 7m 8P 10m 11P', + '1P 7m 10m 12d', + '3m 7m 8P 10m 12d', + '3m 7m 8P 12d 14m', + '5d 8P 10m 11P 14m', + '7m 10m 11P 12d 14m', + '7m 10m 12d 14m 15P', + '5d 8P 10m 14m 17m', + ], + h9: [ + '3m 5d 7m 9M 11P', + '1P 7m 9M 10m 12d', + '3m 7m 9M 12d 14m', + '5d 8P 9M 10m 14m', + '7m 10m 11P 12d 14m', + '7m 10m 12d 14m 16M', + ], + '-b6': ['1P 3m 5P 6m 8P', '3m 5P 8P 11P 13m', '5P 8P 10m 11P 13m'], + '-#5': ['1P 6m 8P 10m 13m', '3m 6m 8P 11P 13m', '6m 8P 10m 13m 15P'], + '7b9': ['1P 3M 7m 9m 10M', '3M 7m 8P 9m 10M', '3M 7m 8P 9m 14m', '7m 9m 10M 14m 15P'], + '7#9': ['1P 3M 7m 10m', '3M 7m 10m 10M 12P', '3M 7m 10m 12P 14m', '7m 10M 12P 14m 17m'], + '7#11': ['1P 3M 7m 9M 12d', '3M 7m 9M 12d 13M', '7m 10M 12d 13M 16M'], + '7b5': ['1P 3M 7m 9M 12d', '3M 7m 9M 12d 13M', '7m 10M 12d 13M 16M'], + '7#5': ['1P 3M 7m 10M 13m', '3M 7m 8P 10M 13m', '3M 7m 8P 13m 14m', '7m 10M 13m 14m 15P', '7m 10M 13m 14m 17M'], + '9#11': ['1P 7m 9M 10M 12d', '3M 7m 8P 9M 12d', '7m 10M 12d 15P 16M'], + '9b5': ['1P 7m 9M 10M 12d', '3M 7m 8P 9M 12d', '7m 10M 12d 15P 16M'], + '9#5': ['1P 7m 9M 10M 13m', '3M 7m 9M 10M 13m', '3M 7m 9M 13m 14m', '7m 10M 13m 14m 16M', '7m 10M 13m 16M 17M'], + '7b13': ['1P 3M 7m 10M 13m', '3M 7m 8P 10M 13m', '3M 7m 8P 13m 14m', '7m 10M 13m 14m 15P', '7m 10M 13m 14m 17M'], + '7#9#5': ['3M 7m 10m 10M 13m', '3M 7m 10m 13m 14m', '7m 10M 13m 14m 17m'], + '7#9b5': ['3M 7m 10m 10M 12d', '3M 7m 10m 12d 14m', '7m 10M 12d 14m 17m'], + '7#9#11': ['3M 7m 10m 10M 12d', '3M 7m 10m 12d 14m', '7m 10M 12d 14m 17m'], + '7b9#11': ['3M 7m 9m 10M 12d', '3M 7m 9m 12d 14m', '7m 8P 10M 12d 16m', '7m 10M 12d 14m 16m'], + '7b9b5': ['3M 7m 9m 10M 12d', '3M 7m 9m 12d 14m', '7m 8P 10M 12d 16m', '7m 10M 12d 14m 16m'], + '7b9#5': ['1P 7m 9m 10M 13m', '3M 7m 9m 10M 13m', '3M 7m 10M 13m 16m', '7m 10M 13m 14m 16m', '7m 10M 13m 16m 17M'], + '7b9#9': ['1P 3M 7m 9m 10m', '3M 7m 10m 13m 16m', '7m 10M 13m 16m 17m'], + '7b9b13': ['1P 7m 9m 10M 13m', '3M 7m 9m 10M 13m', '3M 7m 10M 13m 16m', '7m 10M 13m 14m 16m', '7m 10M 13m 16m 17M'], + '7alt': [ + '3M 7m 8P 10m 13m', + '3M 7m 9m 12d 13m', + '3M 7m 9m 10m 13m', + '3M 7m 10m 13m 14m', + '3M 7m 9m 12d 14m', + '3M 7m 10m 13m 15P', + '3M 7m 10m 13m 16m', + '7m 10M 12d 14m 16m', + '7m 10M 12d 13m 16m', + '7m 10M 13m 15P 17m', + '7m 10M 13m 16m 17m', + '7m 10M 13m 16m 19d', + ], + '13#11': ['3M 7m 9M 12d 13M', '7m 10M 12d 13M 16M'], + '13b9': ['3M 7m 9m 10M 13M', '3M 7m 10M 13M 16m', '7m 10M 13M 16m 17M'], + '13#9': ['3M 7m 10m 10M 13M', '7m 10M 13M 14m 17m'], + '7b9sus': ['1P 5P 7m 9m 11P', '5P 7m 8P 9m 11P', '7m 8P 11P 14m 16m'], + '7susadd3': ['1P 4P 5P 7m 10M', '5P 8P 10M 11P 14m', '7m 11P 12P 15P 17M'], + '9sus': [ + '1P 4P 6M 7m 9M', + '1P 5P 7m 9M 11P', + '4P 6M 7m 9M 11P', + '5P 8P 9M 11P 14m', + '7m 9M 11P 13M 15P', + '7m 11P 12P 14m 18P', + ], + '13sus': [ + '1P 4P 6M 7m 9M', + '1P 7m 9M 11P 13M', + '4P 7m 9M 11P 13M', + '7m 9M 11P 13M 15P', + '7m 11P 13M 14m 16M', + '7m 11P 13M 16M 18P', + ], + '7b13sus': ['1P 5P 7m 11P 13m', '5P 7m 8P 11P 13m', '7m 11P 13m 14m 15P'], +}; diff --git a/src/strudel/tonal/tonal.mjs b/src/strudel/tonal/tonal.mjs new file mode 100644 index 0000000..ae75ab6 --- /dev/null +++ b/src/strudel/tonal/tonal.mjs @@ -0,0 +1,306 @@ +/* +tonal.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { Note, Interval, Scale } from '@tonaljs/tonal'; +import { register, _mod, silence, logger, pure, isNote } from '@strudel/core'; +import { stepInNamedScale, nearestNumberIndex } from './tonleiter.mjs'; +import { noteToMidi } from '../core/util.mjs'; + +const octavesInterval = (octaves) => (octaves <= 0 ? -1 : 1) + octaves * 7 + 'P'; + +function getScale(scaleName) { + scaleName = scaleName.replaceAll(':', ' '); + const scale = Scale.get(scaleName); + const { tonic, empty } = scale; + if ((empty && isNote(scaleName)) || (empty && !tonic)) { + throw new Error( + `Scale name ${scaleName} is incomplete. Make sure to use ":" instead of spaces, example: .scale("C:major")`, + ); + } else if (empty) { + throw new Error(`Invalid scale name "${scaleName}"`); + } + return scale; +} + +function scaleStep(step, scale) { + step = Math.ceil(step); + let { intervals, tonic } = getScale(scale); + tonic = tonic || 'C'; + const { pc, oct = 3 } = Note.get(tonic); + const octaveOffset = Math.floor(step / intervals.length); + const scaleStep = _mod(step, intervals.length); + const interval = Interval.add(intervals[scaleStep], octavesInterval(octaveOffset)); + return Note.transpose(pc + oct, interval); +} + +// transpose note inside scale by offset steps +// function scaleOffset(scale: string, offset: number, note: string) { +function scaleOffset(scale, offset, note) { + let { notes } = getScale(scale); + notes = notes.map((note) => Note.get(note).pc); // use only pc! + offset = Number(offset); + if (isNaN(offset)) { + throw new Error(`scale offset "${offset}" not a number`); + } + const { pc: fromPc, oct = 3 } = Note.get(note); + const noteIndex = notes.indexOf(fromPc); + if (noteIndex === -1) { + throw new Error(`note "${note}" is not in scale "${scale}"`); + } + let i = noteIndex, + o = oct, + n = fromPc; + const direction = Math.sign(offset); + // TODO: find way to do this smarter + while (Math.abs(i - noteIndex) < Math.abs(offset)) { + i += direction; + const index = _mod(i, notes.length); + if (direction < 0 && n[0] === 'C') { + o += direction; + } + n = notes[index]; + if (direction > 0 && n[0] === 'C') { + o += direction; + } + } + return n + o; +} + +// Pattern.prototype._transpose = function (intervalOrSemitones: string | number) { +/** + * Change the pitch of each value by the given amount. Expects numbers or note strings as values. + * The amount can be given as a number of semitones or as a string in interval short notation. + * If you don't care about enharmonic correctness, just use numbers. Otherwise, pass the interval of + * the form: ST where S is the degree number and T the type of interval with + * + * - M = major + * - m = minor + * - P = perfect + * - A = augmented + * - d = diminished + * + * Examples intervals: + * + * - 1P = unison + * - 3M = major third + * - 3m = minor third + * - 4P = perfect fourth + * - 4A = augmented fourth + * - 5P = perfect fifth + * - 5d = diminished fifth + * + * @param {string | number} amount Either number of semitones or interval string. + * @returns Pattern + * @memberof Pattern + * @name transpose + * @synonyms trans + * @example + * "c2 c3".fast(2).transpose("<0 -2 5 3>".slow(2)).note() + * @example + * "c2 c3".fast(2).transpose("<1P -2M 4P 3m>".slow(2)).note() + */ + +export const { transpose, trans } = register(['transpose', 'trans'], function transposeFn(intervalOrSemitones, pat) { + return pat.withHap((hap) => { + const note = hap.value.note ?? hap.value; + if (typeof note === 'number') { + // note is a number, so just add the number semitones of the interval + let semitones; + if (typeof intervalOrSemitones === 'number') { + semitones = intervalOrSemitones; + } else if (typeof intervalOrSemitones === 'string') { + semitones = Interval.semitones(intervalOrSemitones) || 0; + } + const targetNote = note + semitones; + if (typeof hap.value === 'object') { + return hap.withValue(() => ({ ...hap.value, note: targetNote })); + } + return hap.withValue(() => targetNote); + } + if (typeof note !== 'string' || !isNote(note)) { + logger(`[tonal] transpose: not a note "${note}"`, 'warning'); + return hap; + } + // note is a string, so we might be able to preserve harmonics if interval is a string as well + const interval = !isNaN(Number(intervalOrSemitones)) + ? Interval.fromSemitones(intervalOrSemitones) + : String(intervalOrSemitones); + const targetNote = Note.transpose(note, interval); + if (typeof hap.value === 'object') { + return hap.withValue(() => ({ ...hap.value, note: targetNote })); + } + return hap.withValue(() => targetNote); + }); +}); + +// example: transpose(3).late(0.2) will be equivalent to compose(transpose(3), late(0.2)) +// e.g. `stack(c3).superimpose(transpose(slowcat(7, 5)))` or +// or even `stack(c3).superimpose(transpose.slowcat(7, 5))` or + +/** + * Transposes notes inside the scale by the number of steps. + * Expected to be called on a Pattern which already has a {@link Pattern#scale} + * + * @memberof Pattern + * @name scaleTranspose + * @param {offset} offset number of steps inside the scale + * @returns Pattern + * @synonyms scaleTrans, strans + * @example + * "-8 [2,4,6]" + * .scale('C4 bebop major') + * .scaleTranspose("<0 -1 -2 -3 -4 -5 -6 -4>") + * .note() + */ + +export const { scaleTranspose, scaleTrans, strans } = register( + ['scaleTranspose', 'scaleTrans', 'strans'], + function (offset /* : number | string */, pat) { + return pat.withHap((hap) => { + if (!hap.context.scale) { + throw new Error('can only use scaleTranspose after .scale'); + } + if (typeof hap.value === 'object') + return hap.withValue(() => ({ + ...hap.value, + note: scaleOffset(hap.context.scale, Number(offset), hap.value.note), + })); + if (typeof hap.value !== 'string') { + throw new Error('can only use scaleTranspose with notes'); + } + return hap.withValue(() => scaleOffset(hap.context.scale, Number(offset), hap.value)); + }); + }, +); + +// Converts a step value, which is a number optionally decorated with sharps and flats, +// to a number and an `offset` number of semitones +function _convertStepToNumberAndOffset(step) { + let asNumber = Number(step); + let offset = 0; + if (isNaN(asNumber)) { + step = String(step); + // Check to see if the step matches the expected format: + // - A number (possibly negative) + // - Some number of sharps or flats (but not both) + const match = /^(-?\d+)(#+|b+)?$/.exec(step); + + if (!match) { + throw new Error(`invalid scale step "${step}", expected number or integer with optional # b suffixes`); + } + asNumber = Number(match[1]); + // These decorations will determine the semitone offset based on the number of + // sharps or flats + const decorations = match[2] || ''; + offset = decorations[0] === '#' ? decorations.length : -decorations.length; + } + return [asNumber, offset]; +} + +let scaleToMidisAndNotes = {}; +// Finds the nearest scale note to `note` +function _getNearestScaleNote(scaleName, note, preferHigher = true) { + let noteMidi = typeof note === 'string' ? noteToMidi(note) : note; + if (scaleToMidisAndNotes[scaleName] === undefined) { + const { intervals, tonic } = getScale(scaleName); + const { pc } = Note.get(tonic); + const expandedIntervals = intervals.concat('8P'); // add the octave for wrapping + const sNotes = expandedIntervals.map((interval) => Note.transpose(pc + '0', interval)); + const sMidi = sNotes.map(noteToMidi); + // Cache + scaleToMidisAndNotes[scaleName] = [sMidi, sNotes]; + } + const [scaleMidis, scaleNotes] = scaleToMidisAndNotes[scaleName]; + const rootMidi = scaleMidis[0]; + const octaveDiff = Math.floor((noteMidi - rootMidi) / 12); + const alignedMidis = scaleMidis.map((m) => m + 12 * octaveDiff); + const noteIdx = nearestNumberIndex(noteMidi, alignedMidis, preferHigher); + const noteMatch = scaleNotes[noteIdx]; + return Note.transpose(noteMatch, Interval.fromSemitones(12 * octaveDiff)); +} + +/** + * Turns numbers into notes in the scale (zero indexed) or quantizes notes to a scale. + * + * When describing notes via numbers, note that negative numbers can be used to wrap backwards + * in the scale as well as sharps or flats (but not both) to produce notes outside of the scale. + * + * Also sets scale for other scale operations, like {@link Pattern#scaleTranspose}. + * + * A scale consists of a root note (e.g. `c4`, `c`, `f#`, `bb4`) followed by semicolon (':') and then a [scale type](https://github.com/tonaljs/tonal/blob/main/packages/scale-type/data.ts). + * + * The root note defaults to octave 3, if no octave number is given. + * + * @name scale + * @param {string} scale Name of scale + * @returns Pattern + * @example + * n("0 2 4 6 4 2").scale("C:major") + * @example + * n("[0,7] 4 [2,7] 4") + * .scale("C:/2") + * .s("piano") + * @example + * n(rand.range(0,12).segment(8)) + * .scale("C:ritusen") + * .s("piano") + * @example + * n("<[0,7b] [-4# -4] [-2,7##] 4 [0,7] [-4# -4b] [-2,7###] 4b>*4") + * .scale("C:/2") + * .s("piano") + * @example + * note("C1*16").transpose(irand(36)).scale('Cb2 major').scaleTranspose(3) + */ + +export const scale = register( + 'scale', + function (scale, pat) { + // Supports ':' list syntax in mininotation + if (Array.isArray(scale)) { + scale = scale.flat().join(' '); + } + return ( + pat + .fmap((value) => { + const isObject = typeof value === 'object'; + // The case where the note has been defined via `n` or `pure` + if (!isObject || (isObject && ('n' in value || 'value' in value))) { + const step = isObject ? (value.n ?? value.value) : value; + delete value.n; // remove n so it won't cause trouble + if (isNote(step)) { + // legacy.. + return pure(step); + } + try { + const [number, offset] = _convertStepToNumberAndOffset(step); + let note; + if (isObject && value.anchor) { + note = stepInNamedScale(number, scale, value.anchor); + } else { + note = scaleStep(number, scale); + } + if (offset != 0) note = Note.transpose(note, Interval.fromSemitones(offset)); + value = pure(isObject ? { ...value, note } : note); + } catch (err) { + logger(`[tonal] ${err.message}`, 'error'); + return silence; + } + return value; + } + // The case where the note has been defined via `note` + else { + const note = _getNearestScaleNote(scale, value.note); + return pure(isObject ? { ...value, note } : note); + } + }) + .outerJoin() + // legacy: + .withHap((hap) => hap.setContext({ ...hap.context, scale })) + ); + }, + true, + true, // preserve step count +); diff --git a/src/strudel/tonal/tonleiter.mjs b/src/strudel/tonal/tonleiter.mjs new file mode 100644 index 0000000..2331296 --- /dev/null +++ b/src/strudel/tonal/tonleiter.mjs @@ -0,0 +1,238 @@ +import { isNote, isNoteWithOctave, _mod, noteToMidi, tokenizeNote } from '@strudel/core'; +import { Interval, Scale } from '@tonaljs/tonal'; + +// https://codesandbox.io/s/stateless-voicings-g2tmz0?file=/src/lib.js:0-2515 + +const flats = ['C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B']; +const pcs = ['c', 'db', 'd', 'eb', 'e', 'f', 'gb', 'g', 'ab', 'a', 'bb', 'b']; +const sharps = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']; +const accs = { b: -1, '#': 1 }; + +export const pc2chroma = (pc) => { + const [letter, ...rest] = pc.split(''); + return pcs.indexOf(letter.toLowerCase()) + rest.reduce((sum, sign) => sum + accs[sign], 0); +}; + +export const rotateChroma = (chroma, steps) => (chroma + (steps % 12) + 12) % 12; + +export const chroma2pc = (chroma, sharp = false) => { + return (sharp ? sharps : flats)[chroma]; +}; + +export function tokenizeChord(chord) { + const match = (chord || '').match(/^([A-G][b#]*)([^/]*)[/]?([A-G][b#]*)?$/); + if (!match) { + // console.warn('could not tokenize chord', chord); + return []; + } + return match.slice(1); +} +export const note2pc = (note) => note.match(/^[A-G][#b]?/i)[0]; +export const note2oct = (note) => tokenizeNote(note)[2]; +export const note2midi = noteToMidi; + +export const note2chroma = (note) => { + return pc2chroma(note2pc(note)); +}; + +// TODO: test +export const midi2chroma = (midi) => midi % 12; + +// TODO: test and use in voicing function +export const pitch2chroma = (x, defaultOctave) => { + if (isNoteWithOctave(x)) { + return note2chroma(x); + } + if (isNote(x)) { + //pc + return pc2chroma(x, defaultOctave); + } + if (typeof x === 'number') { + // expect midi + return midi2chroma(x); + } +}; + +export const step2semitones = (x) => { + let num = Number(x); + if (!isNaN(num)) { + return num; + } + return Interval.semitones(x); +}; + +export const x2midi = (x, defaultOctave) => { + if (typeof x === 'number') { + return x; + } + if (typeof x === 'string') { + return noteToMidi(x, defaultOctave); + } +}; + +// duplicate: util.mjs (does not support sharp flag) +export const midi2note = (midi, sharp = false) => { + const oct = Math.floor(midi / 12) - 1; + const pc = (sharp ? sharps : flats)[midi % 12]; + return pc + oct; +}; + +export function scaleStep(notes, offset, octaves = 1) { + notes = notes.map((note) => (typeof note === 'string' ? noteToMidi(note) : note)); + const octOffset = Math.floor(offset / notes.length) * octaves * 12; + offset = _mod(offset, notes.length); + return notes[offset] + octOffset; +} + +export function nearestNumberIndex(target, numbers, preferHigher) { + let bestIndex = 0, + bestDiff = Infinity; + numbers.forEach((s, i) => { + const diff = Math.abs(s - target); + // preferHigher only works if numbers are sorted in ascending order! + if ((!preferHigher && diff < bestDiff) || (preferHigher && diff <= bestDiff)) { + bestIndex = i; + bestDiff = diff; + } + }); + return bestIndex; +} + +let scaleSteps = {}; // [scaleName]: semitones[] + +export function stepInNamedScale(step, scale, anchor, preferHigher) { + const [root, scaleName] = Scale.tokenize(scale); + const rootMidi = x2midi(root); + const rootChroma = midi2chroma(rootMidi); + if (!scaleSteps[scaleName]) { + const { intervals } = Scale.get(`C ${scaleName}`); + // cache result + scaleSteps[scaleName] = intervals.map(step2semitones); + } + const steps = scaleSteps[scaleName]; + if (!steps) { + return null; + } + let transpose = rootMidi; + if (anchor) { + anchor = x2midi(anchor, 3); + const anchorChroma = midi2chroma(anchor); + const anchorDiff = _mod(anchorChroma - rootChroma, 12); + const zeroIndex = nearestNumberIndex(anchorDiff, steps, preferHigher); + step = step + zeroIndex; + transpose = anchor - anchorDiff; + } + const octOffset = Math.floor(step / steps.length) * 12; + step = _mod(step, steps.length); + const targetMidi = steps[step] + transpose; + return targetMidi + octOffset; +} + +// different ways to resolve the note to compare the anchor to (see renderVoicing) +let modeTarget = { + below: (v) => v.slice(-1)[0], + duck: (v) => v.slice(-1)[0], + above: (v) => v[0], + root: (v) => v[0], +}; + +export function renderVoicing({ chord, dictionary, offset = 0, n, mode = 'below', anchor = 'c5', octaves = 1 }) { + const [root, symbol] = tokenizeChord(chord); + const rootChroma = pc2chroma(root); + anchor = x2midi(anchor?.note || anchor, 4); + const anchorChroma = midi2chroma(anchor); + const voicings = dictionary[symbol].map((voicing) => + (typeof voicing === 'string' ? voicing.split(' ') : voicing).map(step2semitones), + ); + + let minDistance, bestIndex; + // calculate distances up from voicing top notes + let chromaDiffs = voicings.map((v, i) => { + const targetStep = modeTarget[mode](v); + const diff = _mod(anchorChroma - targetStep - rootChroma, 12); + if (minDistance === undefined || diff < minDistance) { + minDistance = diff; + bestIndex = i; + } + return diff; + }); + if (mode === 'root') { + bestIndex = 0; + } + + const octDiff = Math.ceil(offset / voicings.length) * 12; + const indexWithOffset = _mod(bestIndex + offset, voicings.length); + const voicing = voicings[indexWithOffset]; + const targetStep = modeTarget[mode](voicing); + const anchorMidi = anchor - chromaDiffs[indexWithOffset] + octDiff; + + const voicingMidi = voicing.map((v) => anchorMidi - targetStep + v); + let notes = voicingMidi.map((n) => midi2note(n)); + + if (mode === 'duck') { + notes = notes.filter((_, i) => voicingMidi[i] !== anchor); + } + if (n !== undefined) { + return [scaleStep(notes, n, octaves)]; + } + return notes; +} + +// https://codeberg.org/uzu/strudel/blob/14184993d0ee7d69c47df57ac864a1a0f99a893f/packages/tonal/tonleiter.mjs +const steps = [1, 0, 2, 0, 3, 4, 0, 5, 0, 6, 0, 7]; +const notes = ['C', '', 'D', '', 'E', 'F', '', 'G', '', 'A', '', 'B']; +const noteLetters = ['C', 'D', 'E', 'F', 'G', 'A', 'B']; + +export const accidentalOffset = (accidentals) => { + return accidentals.split('#').length - accidentals.split('b').length; +}; + +const accidentalString = (offset) => { + if (offset < 0) { + return 'b'.repeat(-offset); + } + if (offset > 0) { + return '#'.repeat(offset); + } + return ''; +}; + +export const Step = { + tokenize(step) { + const matches = step.match(/^([#b]*)([1-9][0-9]*)$/); + if (!matches) { + throw new Error(`Step.tokenize: not a valid step: ${step}`); + } + const [accidentals, stepNumber] = matches.slice(1); + return [accidentals, parseInt(stepNumber)]; + }, + accidentals(step) { + return accidentalOffset(Step.tokenize(step)[0]); + }, +}; + +export const Note = { + // TODO: support octave numbers + tokenize(note) { + return [note[0], note.slice(1)]; + }, + accidentals(note) { + return accidentalOffset(this.tokenize(note)[1]); + }, +}; + +// TODO: support octave numbers +// Example: Note("Bb3").transpose("c3") +export function transpose(note, step) { + // example: E, 3 + const stepNumber = Step.tokenize(step)[1]; // 3 + const noteLetter = Note.tokenize(note)[0]; // E + const noteIndex = noteLetters.indexOf(noteLetter); // 2 "E is C+2" + const targetNote = noteLetters[(noteIndex + stepNumber - 1) % 8]; // G "G is a third above E" + const rootIndex = notes.indexOf(noteLetter); // 4 "E is 4 semitones above C" + const targetIndex = notes.indexOf(targetNote); // 7 "G is 7 semitones above C" + const indexOffset = targetIndex - rootIndex; // 3 (E to G is normally a 3 semitones) + const stepIndex = steps.indexOf(stepNumber); // 4 ("3" is normally 4 semitones) + const offsetAccidentals = accidentalString(Step.accidentals(step) + Note.accidentals(note) + stepIndex - indexOffset); // "we need to add a # to to the G to make it a major third from E" + return [targetNote, offsetAccidentals].join(''); +} diff --git a/src/strudel/tonal/voicings.mjs b/src/strudel/tonal/voicings.mjs new file mode 100644 index 0000000..d81911e --- /dev/null +++ b/src/strudel/tonal/voicings.mjs @@ -0,0 +1,251 @@ +/* +voicings.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { stack, register, silence, logger } from '@strudel/core'; +import { renderVoicing } from './tonleiter.mjs'; +import _voicings from 'chord-voicings'; +import { complex, simple } from './ireal.mjs'; +const { dictionaryVoicing, minTopNoteDiff } = _voicings.default || _voicings; // parcel module resolution fuckup + +const lefthand = { + 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'], +}; + +const guidetones = { + m7: ['3m 7m', '7m 10m'], + m9: ['3m 7m', '7m 10m'], + 7: ['3M 7m', '7m 10M'], + '^7': ['3M 7M', '7M 10M'], + '^9': ['3M 7M', '7M 10M'], + 69: ['3M 6M'], + 6: ['3M 6M', '6M 10M'], + m7b5: ['3m 7m', '7m 10m'], + '7b9': ['3M 7m', '7m 10M'], + '7b13': ['3M 7m', '7m 10M'], + o7: ['3m 6M', '6M 10m'], + '7#11': ['3M 7m', '7m 10M'], + '7#9': ['3M 7m', '7m 10M'], + mM7: ['3m 7M', '7M 10m'], + m6: ['3m 6M', '6M 10m'], +}; + +const 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'], +}; + +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' }, + legacy: { dictionary: defaultDictionary, mode: 'below', anchor: 'a4' }, +}; + +let defaultDict = 'ireal'; +export const setDefaultVoicings = (dict) => (defaultDict = dict); +// e.g. typeof setDefaultVoicings !== 'undefined' && setDefaultVoicings('legacy'); + +export const setVoicingRange = (name, range) => addVoicings(name, voicingRegistry[name].dictionary, range); + +/** + * Adds a new custom voicing dictionary. + * + * @name addVoicings + * @memberof Pattern + * @param {string} name identifier for the voicing dictionary + * @param {Object} dictionary maps chord symbol to possible voicings + * @param {Array} range min, max note + * @returns Pattern + * @example + * addVoicings('cookie', { + * 7: ['3M 7m 9M 12P 15P', '7m 10M 13M 16M 19P'], + * '^7': ['3M 6M 9M 12P 14M', '7M 10M 13M 16M 19P'], + * m7: ['8P 11P 14m 17m 19P', '5P 8P 11P 14m 17m'], + * m7b5: ['3m 5d 8P 11P 14m', '5d 8P 11P 14m 17m'], + * o7: ['3m 6M 9M 11A 15P'], + * '7alt': ['3M 7m 10m 13m 15P'], + * '7#11': ['7m 10m 13m 15P 17m'], + * }, ['C3', 'C6']) + * "".voicings('cookie').note() + */ +export const addVoicings = (name, dictionary, range = ['F3', 'A4']) => { + Object.assign(voicingRegistry, { [name]: { dictionary, range } }); +}; + +// new call signature +export const registerVoicings = (name, dictionary, options = {}) => { + Object.assign(voicingRegistry, { [name]: { dictionary, ...options } }); +}; + +const getVoicing = (chord, dictionaryName, lastVoicing) => { + const { dictionary, range } = voicingRegistry[dictionaryName]; + return dictionaryVoicing({ + chord, + dictionary, + range, + picker: minTopNoteDiff, + 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). + * + * @name voicings + * @memberof Pattern + * @param {string} dictionary which voicing dictionary to use. + * @returns Pattern + * @example + * stack("".voicings('lefthand'), "").note() + */ + +let lastVoicing; // this now has to be global until another solution is found :-/ +// it used to be local to the voicings function at evaluation time +// but since register will patternify by default, means that +// the function is called over and over again, resetting the lastVoicing variables +export const voicings = register('voicings', function (dictionary, pat) { + return pat + .fmap((value) => { + lastVoicing = getVoicing(value, dictionary, lastVoicing); + return stack(...lastVoicing); + }) + .outerJoin(); +}); + +/** + * Maps the chords of the incoming pattern to root notes in the given octave. + * + * @name rootNotes + * @memberof Pattern + * @param {octave} octave octave to use + * @returns Pattern + * @example + * "".rootNotes(2).note() + */ +export const rootNotes = register('rootNotes', function (octave, pat) { + return pat.fmap((value) => { + const chord = value.chord || value; + const root = chord.match(/^([a-gA-G][b#]?).*$/)[1]; + const note = root + octave; + return value.chord ? { note } : note; + }); +}); + +/** + * 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`. + * If you pass a pattern of strings to voicing, they will be interpreted as chords. + * + * @name voicing + * @returns Pattern + * @example + * n("0 1 2 3").chord("").voicing() + */ +export const voicing = register('voicing', function (pat) { + return pat + .fmap((value) => { + // destructure voicing controls out + value = typeof value === 'string' ? { chord: value } : value; + let { dictionary = defaultDict, chord, anchor, offset, mode, n, octaves, ...rest } = value; + dictionary = + typeof dictionary === 'string' ? voicingRegistry[dictionary] : { dictionary, mode: 'below', anchor: 'c5' }; + try { + let notes = renderVoicing({ ...dictionary, chord, anchor, offset, mode, n, octaves }); + return stack(...notes) + .note() + .set(rest); // rest does not include voicing controls anymore! + } catch (err) { + logger(`[voicing]: unknown chord "${chord}"`); + return silence; + } + }) + .outerJoin(); +}); + +export function voicingAlias(symbol, alias, setOrSets) { + setOrSets = !Array.isArray(setOrSets) ? [setOrSets] : setOrSets; + setOrSets.forEach((set) => { + set[alias] = set[symbol]; + }); +} + +// no symbol = major chord +voicingAlias('^', '', [simple, complex]); + +Object.keys(simple).forEach((symbol) => { + // add aliases for "-" === "m" + if (symbol.includes('-')) { + let alias = symbol.replace('-', 'm'); + voicingAlias(symbol, alias, [complex, simple]); + } + // add aliases for "^" === "M" + if (symbol.includes('^')) { + let alias = symbol.replace('^', 'M'); + voicingAlias(symbol, alias, [complex, simple]); + } + // add aliases for "+" === "aug" + if (symbol.includes('+')) { + let alias = symbol.replace('+', 'aug'); + voicingAlias(symbol, alias, [complex, simple]); + } +}); + +registerVoicings('ireal', simple); +registerVoicings('ireal-ext', complex); + +export function resetVoicings() { + lastVoicing = undefined; + setDefaultVoicings('ireal'); +} diff --git a/src/strudel/transpiler/index.mjs b/src/strudel/transpiler/index.mjs new file mode 100644 index 0000000..484c3e7 --- /dev/null +++ b/src/strudel/transpiler/index.mjs @@ -0,0 +1,5 @@ +import { evaluate as _evaluate } from '@strudel/core'; +import { transpiler } from './transpiler.mjs'; +export * from './transpiler.mjs'; + +export const evaluate = (code) => _evaluate(code, transpiler); diff --git a/src/strudel/transpiler/transpiler.mjs b/src/strudel/transpiler/transpiler.mjs new file mode 100644 index 0000000..fea6bad --- /dev/null +++ b/src/strudel/transpiler/transpiler.mjs @@ -0,0 +1,329 @@ +import { getLeafLocations } from '@strudel/mini'; +import { parse } from 'acorn'; +import escodegen from 'escodegen'; +import { walk } from 'estree-walker'; + +let widgetMethods = []; +export function registerWidgetType(type) { + widgetMethods.push(type); +} + +let languages = new Map(); +// config = { getLocations: (code: string, offset?: number) => number[][] } +// see mondough.mjs for example use +// the language will kick in when the code contains a template literal of type +// example: mondo`...` will use language of type "mondo" +// TODO: refactor tidal.mjs to use this +export function registerLanguage(type, config) { + languages.set(type, config); +} + +export function transpiler(input, options = {}) { + const { wrapAsync = false, addReturn = true, emitMiniLocations = true, emitWidgets = true } = options; + + let ast = parse(input, { + ecmaVersion: 2022, + allowAwaitOutsideFunction: true, + locations: true, + }); + + let miniLocations = []; + const collectMiniLocations = (value, node) => { + const minilang = languages.get('minilang'); + if (minilang) { + const code = `[${value}]`; + const locs = minilang.getLocations(code, node.start); + miniLocations = miniLocations.concat(locs); + } else { + const leafLocs = getLeafLocations(`"${value}"`, node.start, input); + miniLocations = miniLocations.concat(leafLocs); + } + }; + let widgets = []; + + walk(ast, { + enter(node, parent /* , prop, index */) { + if (isLanguageLiteral(node)) { + const { name } = node.tag; + const language = languages.get(name); + const code = node.quasi.quasis[0].value.raw; + const offset = node.quasi.start + 1; + if (emitMiniLocations) { + const locs = language.getLocations(code, offset); + miniLocations = miniLocations.concat(locs); + } + this.skip(); + return this.replace(languageWithLocation(name, code, offset)); + } + if (isTemplateLiteral(node, 'tidal')) { + const raw = node.quasi.quasis[0].value.raw; + const offset = node.quasi.start + 1; + if (emitMiniLocations) { + const stringLocs = collectHaskellMiniLocations(raw, offset); + miniLocations = miniLocations.concat(stringLocs); + } + this.skip(); + return this.replace(tidalWithLocation(raw, offset)); + } + if (isBackTickString(node, parent)) { + const { quasis } = node; + const { raw } = quasis[0].value; + this.skip(); + emitMiniLocations && collectMiniLocations(raw, node); + return this.replace(miniWithLocation(raw, node)); + } + if (isStringWithDoubleQuotes(node)) { + const { value } = node; + this.skip(); + emitMiniLocations && collectMiniLocations(value, node); + return this.replace(miniWithLocation(value, node)); + } + if (isSliderFunction(node)) { + emitWidgets && + widgets.push({ + from: node.arguments[0].start, + to: node.arguments[0].end, + value: node.arguments[0].raw, // don't use value! + min: node.arguments[1]?.value ?? 0, + max: node.arguments[2]?.value ?? 1, + step: node.arguments[3]?.value, + type: 'slider', + }); + return this.replace(sliderWithLocation(node)); + } + if (isWidgetMethod(node)) { + const type = node.callee.property.name; + const index = widgets.filter((w) => w.type === type).length; + const widgetConfig = { + to: node.end, + index, + type, + id: options.id, + }; + emitWidgets && widgets.push(widgetConfig); + return this.replace(widgetWithLocation(node, widgetConfig)); + } + if (isBareSamplesCall(node, parent)) { + return this.replace(withAwait(node)); + } + if (isLabelStatement(node)) { + return this.replace(labelToP(node)); + } + }, + leave(node, parent, prop, index) {}, + }); + + let { body } = ast; + + if (!body.length) { + console.warn('empty body -> fallback to silence'); + body.push({ + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'silence', + }, + }); + } else if (!body?.[body.length - 1]?.expression) { + throw new Error('unexpected ast format without body expression'); + } + + // add return to last statement + if (addReturn) { + const { expression } = body[body.length - 1]; + body[body.length - 1] = { + type: 'ReturnStatement', + argument: expression, + }; + } + let output = escodegen.generate(ast); + if (wrapAsync) { + output = `(async ()=>{${output}})()`; + } + if (!emitMiniLocations) { + return { output }; + } + return { output, miniLocations, widgets }; +} + +function isStringWithDoubleQuotes(node, locations, code) { + if (node.type !== 'Literal') { + return false; + } + return node.raw[0] === '"'; +} + +function isBackTickString(node, parent) { + return node.type === 'TemplateLiteral' && parent.type !== 'TaggedTemplateExpression'; +} + +function miniWithLocation(value, node) { + const { start: fromOffset } = node; + + const minilang = languages.get('minilang'); + let name = 'm'; + if (minilang && minilang.name) { + name = minilang.name; // name is expected to be exported from the package of the minilang + } + + return { + type: 'CallExpression', + callee: { + type: 'Identifier', + name, + }, + arguments: [ + { type: 'Literal', value }, + { type: 'Literal', value: fromOffset }, + ], + optional: false, + }; +} + +// these functions are connected to @strudel/codemirror -> slider.mjs +// maybe someday there will be pluggable transpiler functions, then move this there +function isSliderFunction(node) { + return node.type === 'CallExpression' && node.callee.name === 'slider'; +} + +function isWidgetMethod(node) { + return node.type === 'CallExpression' && widgetMethods.includes(node.callee.property?.name); +} + +function sliderWithLocation(node) { + const id = 'slider_' + node.arguments[0].start; // use loc of first arg for id + // add loc as identifier to first argument + // the sliderWithID function is assumed to be sliderWithID(id, value, min?, max?) + node.arguments.unshift({ + type: 'Literal', + value: id, + raw: id, + }); + node.callee.name = 'sliderWithID'; + return node; +} + +export function getWidgetID(widgetConfig) { + // the widget id is used as id for the dom element + as key for eventual resources + // for example, for each scope widget, a new analyser + buffer (large) is created + // that means, if we use the index index of line position as id, less garbage is generated + // return `widget_${widgetConfig.to}`; // more gargabe + //return `widget_${widgetConfig.index}_${widgetConfig.to}`; // also more garbage + return `${widgetConfig.id || ''}_widget_${widgetConfig.type}_${widgetConfig.index}`; // less garbage +} + +function widgetWithLocation(node, widgetConfig) { + const id = getWidgetID(widgetConfig); + // add loc as identifier to first argument + // the sliderWithID function is assumed to be sliderWithID(id, value, min?, max?) + node.arguments.unshift({ + type: 'Literal', + value: id, + raw: id, + }); + return node; +} + +function isBareSamplesCall(node, parent) { + return node.type === 'CallExpression' && node.callee.name === 'samples' && parent.type !== 'AwaitExpression'; +} + +function withAwait(node) { + return { + type: 'AwaitExpression', + argument: node, + }; +} + +function isLabelStatement(node) { + return node.type === 'LabeledStatement'; +} + +// converts label expressions to p calls: "x: y" to "y.p('x')" +// see https://codeberg.org/uzu/strudel/issues/990 +function labelToP(node) { + return { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'MemberExpression', + object: node.body.expression, + property: { + type: 'Identifier', + name: 'p', + }, + }, + arguments: [ + { + type: 'Literal', + value: node.label.name, + raw: `'${node.label.name}'`, + }, + ], + }, + }; +} + +function isLanguageLiteral(node) { + return node.type === 'TaggedTemplateExpression' && languages.has(node.tag.name); +} + +// tidal highlighting +// this feels kind of stupid, when we also know the location inside the string op (tidal.mjs) +// but maybe it's the only way + +function isTemplateLiteral(node, value) { + return node.type === 'TaggedTemplateExpression' && node.tag.name === value; +} + +function collectHaskellMiniLocations(haskellCode, offset) { + return haskellCode + .split('') + .reduce((acc, char, i) => { + if (char !== '"') { + return acc; + } + if (!acc.length || acc[acc.length - 1].length > 1) { + acc.push([i + 1]); + } else { + acc[acc.length - 1].push(i); + } + return acc; + }, []) + .map(([start, end]) => { + const miniString = haskellCode.slice(start, end); + return getLeafLocations(`"${miniString}"`, offset + start - 1); + }) + .flat(); +} + +function tidalWithLocation(value, offset) { + return { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'tidal', + }, + arguments: [ + { type: 'Literal', value }, + { type: 'Literal', value: offset }, + ], + optional: false, + }; +} + +function languageWithLocation(name, value, offset) { + return { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: name, + }, + arguments: [ + { type: 'Literal', value }, + { type: 'Literal', value: offset }, + ], + optional: false, + }; +} diff --git a/src/strudel/webaudio/index.mjs b/src/strudel/webaudio/index.mjs new file mode 100644 index 0000000..4933b7a --- /dev/null +++ b/src/strudel/webaudio/index.mjs @@ -0,0 +1,11 @@ +/* +index.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +export * from './webaudio.mjs'; +export * from './scope.mjs'; +export * from './spectrum.mjs'; +export * from './supradough.mjs'; +export * from 'superdough'; diff --git a/src/strudel/webaudio/scope.mjs b/src/strudel/webaudio/scope.mjs new file mode 100644 index 0000000..e423b20 --- /dev/null +++ b/src/strudel/webaudio/scope.mjs @@ -0,0 +1,149 @@ +import { Pattern, clamp } from '@strudel/core'; +import { getDrawContext, getTheme } from '@strudel/draw'; +import { analysers, getAnalyzerData } from 'superdough'; + +export function drawTimeScope( + analyser, + { + align = true, + color = 'white', + thickness = 3, + scale = 0.25, + pos = 0.75, + trigger = 0, + ctx = getDrawContext(), + id = 1, + } = {}, +) { + ctx.lineWidth = thickness; + ctx.strokeStyle = color; + let canvas = ctx.canvas; + + if (!analyser) { + // if analyser is undefined, draw straight line + // it may be undefined when no sound has been played yet + ctx.beginPath(); + let y = pos * canvas.height; + ctx.moveTo(0, y); + ctx.lineTo(canvas.width, y); + ctx.stroke(); + return; + } + const dataArray = getAnalyzerData('time', id); + + ctx.beginPath(); + + const bufferSize = analyser.frequencyBinCount; + let triggerIndex = align + ? Array.from(dataArray).findIndex((v, i, arr) => i && arr[i - 1] > -trigger && v <= -trigger) + : 0; + triggerIndex = Math.max(triggerIndex, 0); // fallback to 0 when no trigger is found + + const sliceWidth = (canvas.width * 1.0) / bufferSize; + let x = 0; + for (let i = triggerIndex; i < bufferSize; i++) { + const v = dataArray[i] + 1; + const y = (pos - scale * (v - 1)) * canvas.height; + + if (i === 0) { + ctx.moveTo(x, y); + } else { + ctx.lineTo(x, y); + } + x += sliceWidth; + } + ctx.stroke(); +} + +export function drawFrequencyScope( + analyser, + { color = 'white', scale = 0.25, pos = 0.75, lean = 0.5, min = -150, max = 0, ctx = getDrawContext(), id = 1 } = {}, +) { + if (!analyser) { + ctx.beginPath(); + let y = pos * canvas.height; + ctx.moveTo(0, y); + ctx.lineTo(canvas.width, y); + ctx.stroke(); + return; + } + const dataArray = getAnalyzerData('frequency', id); + const canvas = ctx.canvas; + + ctx.fillStyle = color; + const bufferSize = analyser.frequencyBinCount; + const sliceWidth = (canvas.width * 1.0) / bufferSize; + + let x = 0; + for (let i = 0; i < bufferSize; i++) { + const normalized = clamp((dataArray[i] - min) / (max - min), 0, 1); + const v = normalized * scale; + const h = v * canvas.height; + const y = (pos - v * lean) * canvas.height; + + ctx.fillRect(x, y, Math.max(sliceWidth, 1), h); + x += sliceWidth; + } +} + +function clearScreen(smear = 0, smearRGB = `0,0,0`, ctx = getDrawContext()) { + if (!smear) { + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + } else { + ctx.fillStyle = `rgba(${smearRGB},${1 - smear})`; + ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); + } +} + +/** + * Renders an oscilloscope for the frequency domain of the audio signal. + * @name fscope + * @param {string} color line color as hex or color name. defaults to white. + * @param {number} scale scales the y-axis. Defaults to 0.25 + * @param {number} pos y-position relative to screen height. 0 = top, 1 = bottom of screen + * @param {number} lean y-axis alignment where 0 = top and 1 = bottom + * @param {number} min min value + * @param {number} max max value + * @example + * s("sawtooth").fscope() + */ +Pattern.prototype.fscope = function (config = {}) { + let id = config.id ?? 1; + return this.analyze(id).draw( + () => { + clearScreen(config.smear, '0,0,0', config.ctx); + analysers[id] && drawFrequencyScope(analysers[id], config); + }, + { id }, + ); +}; + +/** + * Renders an oscilloscope for the time domain of the audio signal. + * @name scope + * @synonyms tscope + * @param {object} config optional config with options: + * @param {boolean} align if 1, the scope will be aligned to the first zero crossing. defaults to 1 + * @param {string} color line color as hex or color name. defaults to white. + * @param {number} thickness line thickness. defaults to 3 + * @param {number} scale scales the y-axis. Defaults to 0.25 + * @param {number} pos y-position relative to screen height. 0 = top, 1 = bottom of screen + * @param {number} trigger amplitude value that is used to align the scope. defaults to 0. + * @example + * s("sawtooth")._scope() + */ +let latestColor = {}; +Pattern.prototype.tscope = function (config = {}) { + let id = config.id ?? 1; + return this.analyze(id).draw( + (haps) => { + config.color = haps[0]?.value?.color || getTheme().foreground; + latestColor[id] = config.color; + clearScreen(config.smear, '0,0,0', config.ctx); + drawTimeScope(analysers[id], config); + }, + { id }, + ); +}; + +Pattern.prototype.scope = Pattern.prototype.tscope; diff --git a/src/strudel/webaudio/spectrum.mjs b/src/strudel/webaudio/spectrum.mjs new file mode 100644 index 0000000..2ddd214 --- /dev/null +++ b/src/strudel/webaudio/spectrum.mjs @@ -0,0 +1,69 @@ +import { Pattern, clamp } from '@strudel/core'; +import { getDrawContext, getTheme } from '@strudel/draw'; +import { analysers, getAnalyzerData } from 'superdough'; + +/** + * Renders a spectrum analyzer for the incoming audio signal. + * @name spectrum + * @param {object} config optional config with options: + * @param {integer} thickness line thickness in px (default 3) + * @param {integer} speed scroll speed (default 1) + * @param {integer} min min db (default -80) + * @param {integer} max max db (default 0) + * @example + * n("<0 4 <2 3> 1>*3") + * .off(1/8, add(n(5))) + * .off(1/5, add(n(7))) + * .scale("d3:minor:pentatonic") + * .s('sine') + * .dec(.3).room(.5) + * ._spectrum() + */ +let latestColor = {}; +Pattern.prototype.spectrum = function (config = {}) { + let id = config.id ?? 1; + return this.analyze(id).draw( + (haps) => { + config.color = haps[0]?.value?.color || latestColor[id] || getTheme().foreground; + latestColor[id] = config.color; + drawSpectrum(analysers[id], config); + }, + { id }, + ); +}; + +Pattern.prototype.scope = Pattern.prototype.tscope; + +const lastFrames = new Map(); + +function drawSpectrum( + analyser, + { thickness = 3, speed = 1, min = -80, max = 0, ctx = getDrawContext(), id = 1, color } = {}, +) { + ctx.lineWidth = thickness; + ctx.strokeStyle = color; + + if (!analyser) { + // if analyser is undefined, draw straight line + // it may be undefined when no sound has been played yet + return; + } + const scrollSize = speed; + const dataArray = getAnalyzerData('frequency', id); + const canvas = ctx.canvas; + ctx.fillStyle = color; + const bufferSize = analyser.frequencyBinCount; + let imageData = lastFrames.get(id) || ctx.getImageData(0, 0, canvas.width, canvas.height); + lastFrames.set(id, imageData); + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + ctx.putImageData(imageData, -scrollSize, 0); + let q = canvas.width - speed; + for (let i = 0; i < bufferSize; i++) { + const normalized = clamp((dataArray[i] - min) / (max - min), 0, 1); + ctx.globalAlpha = normalized; + const next = (Math.log(i + 1) / Math.log(bufferSize)) * canvas.height; + const size = 2; //next - pos; + ctx.fillRect(q, canvas.height - next, scrollSize, size); + } + lastFrames.set(id, ctx.getImageData(0, 0, canvas.width, canvas.height)); +} diff --git a/src/strudel/webaudio/supradough.mjs b/src/strudel/webaudio/supradough.mjs new file mode 100644 index 0000000..f97251a --- /dev/null +++ b/src/strudel/webaudio/supradough.mjs @@ -0,0 +1,130 @@ +import { Pattern } from '@strudel/core'; +import { connectToDestination, getAudioContext, getWorklet } from 'superdough'; + +let doughWorklet; + +function initDoughWorklet() { + const ac = getAudioContext(); + doughWorklet = getWorklet( + ac, + 'dough-processor', + {}, + { + outputChannelCount: [2], + }, + ); + connectToDestination(doughWorklet); // channels? +} + +const soundMap = new Map(); +const loadedSounds = new Map(); + +Pattern.prototype.supradough = function () { + return this.onTrigger((hap, __, cps, begin) => { + hap.value._begin = begin; + hap.value._duration = hap.duration / cps; + !doughWorklet && initDoughWorklet(); + const s = (hap.value.bank ? hap.value.bank + '_' : '') + hap.value.s; + const n = hap.value.n ?? 0; + const soundKey = `${s}:${n}`; + if (soundMap.has(s)) { + hap.value.s = soundKey; // dough.mjs is unaware of bank and n (only maps keys to buffers) + } + if (soundMap.has(s) && !loadedSounds.has(soundKey)) { + const urls = soundMap.get(s); + const url = urls[n % urls.length]; + console.log(`load ${soundKey} from ${url}`); + const loadSample = fetchSample(url); + loadedSounds.set(soundKey, loadSample); + loadSample.then(({ channels, sampleRate }) => + doughWorklet.port.postMessage({ + sample: soundKey, + channels, + sampleRate, + }), + ); + } + + doughWorklet.port.postMessage({ spawn: hap.value }); + }, 1); +}; + +function githubPath(base, subpath = '') { + if (!base.startsWith('github:')) { + throw new Error('expected "github:" at the start of pseudoUrl'); + } + let [_, path] = base.split('github:'); + path = path.endsWith('/') ? path.slice(0, -1) : path; + if (path.split('/').length === 2) { + // assume main as default branch if none set + path += '/main'; + } + return `https://raw.githubusercontent.com/${path}/${subpath}`; +} +export async function fetchSampleMap(url) { + if (url.startsWith('github:')) { + url = githubPath(url, 'strudel.json'); + } + if (url.startsWith('local:')) { + url = `http://localhost:5432`; + } + if (url.startsWith('shabda:')) { + let [_, path] = url.split('shabda:'); + url = `https://shabda.ndre.gr/${path}.json?strudel=1`; + } + if (url.startsWith('shabda/speech')) { + let [_, path] = url.split('shabda/speech'); + path = path.startsWith('/') ? path.substring(1) : path; + let [params, words] = path.split(':'); + let gender = 'f'; + let language = 'en-GB'; + if (params) { + [language, gender] = params.split('/'); + } + url = `https://shabda.ndre.gr/speech/${words}.json?gender=${gender}&language=${language}&strudel=1'`; + } + if (typeof fetch !== 'function') { + // not a browser + return; + } + const base = url.split('/').slice(0, -1).join('/'); + if (typeof fetch === 'undefined') { + // skip fetch when in node / testing + return; + } + const json = await fetch(url) + .then((res) => res.json()) + .catch((error) => { + console.error(error); + throw new Error(`error loading "${url}"`); + }); + return [json, json._base || base]; +} + +// for some reason, only piano and flute work.. is it because mp3?? + +async function fetchSample(url) { + const buffer = await fetch(url) + .then((res) => res.arrayBuffer()) + .then((buf) => getAudioContext().decodeAudioData(buf)); + let channels = []; + for (let i = 0; i < buffer.numberOfChannels; i++) { + channels.push(buffer.getChannelData(i)); + } + return { channels, sampleRate: buffer.sampleRate }; +} + +export async function doughsamples(sampleMap, baseUrl) { + if (typeof sampleMap === 'string') { + const [json, base] = await fetchSampleMap(sampleMap); + // console.log('json', json, 'base', base); + return doughsamples(json, base); + } + Object.entries(sampleMap).map(async ([key, urls]) => { + if (key !== '_base') { + urls = urls.map((url) => baseUrl + url); + // console.log('set', key, urls); + soundMap.set(key, urls); + } + }); +} diff --git a/src/strudel/webaudio/webaudio.mjs b/src/strudel/webaudio/webaudio.mjs new file mode 100644 index 0000000..383e87f --- /dev/null +++ b/src/strudel/webaudio/webaudio.mjs @@ -0,0 +1,40 @@ +/* +webaudio.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import * as strudel from '@strudel/core'; +import { superdough, getAudioContext, setLogger, doughTrigger, registerWorklet } from 'superdough'; +import './supradough.mjs'; +import { workletUrl } from 'supradough'; + +registerWorklet(workletUrl); + +const { Pattern, logger, repl } = strudel; + +setLogger(logger); + +const hap2value = (hap) => { + hap.ensureObjectValue(); + return hap.value; +}; + +// uses more precise, absolute t if available, see https://github.com/tidalcycles/strudel/pull/1004 +// TODO: refactor output callbacks to eliminate deadline +export const webaudioOutput = (hap, _deadline, hapDuration, cps, t) => { + return superdough(hap2value(hap), t, hapDuration, cps, hap.whole?.begin.valueOf()); +}; + +export function webaudioRepl(options = {}) { + options = { + getTime: () => getAudioContext().currentTime, + defaultOutput: webaudioOutput, + ...options, + }; + return repl(options); +} + +Pattern.prototype.dough = function () { + return this.onTrigger(doughTrigger, 1); +}; diff --git a/src/strudel/xen/index.mjs b/src/strudel/xen/index.mjs new file mode 100644 index 0000000..ca813f3 --- /dev/null +++ b/src/strudel/xen/index.mjs @@ -0,0 +1,4 @@ +import './xen.mjs'; +import './tune.mjs'; + +export * from './xen.mjs'; diff --git a/src/strudel/xen/tune.mjs b/src/strudel/xen/tune.mjs new file mode 100644 index 0000000..01303bf --- /dev/null +++ b/src/strudel/xen/tune.mjs @@ -0,0 +1,20 @@ +/* +tune.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import Tune from './tunejs.js'; +import { register } from '@strudel/core'; + +export const tune = register('tune', (scale, pat) => { + const tune = new Tune(); + if (!tune.isValidScale(scale)) { + throw new Error('not a valid tune.js scale name: "' + scale + '". See http://abbernie.github.io/tune/scales.html'); + } + tune.loadScale(scale); + tune.tonicize(1); + return pat.withHap((hap) => { + return hap.withValue(() => tune.note(hap.value)); + }); +}); diff --git a/src/strudel/xen/tunejs.js b/src/strudel/xen/tunejs.js new file mode 100644 index 0000000..5806cf5 --- /dev/null +++ b/src/strudel/xen/tunejs.js @@ -0,0 +1,244 @@ +/* +tunejs.js - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + + +// See all scales at: http://abbernie.github.io/tune/scales.html +export default function Tune(){ + + // the scale as ratios + this.scale = [] + + // i/o modes + this.mode = { + output: "frequency", + input: "step" + } + + // ET major, for reference + this.etmajor = [ 261.62558, + 293.664764, + 329.627563, + 349.228241, + 391.995422, + 440, + 493.883301, + 523.25116 + ] + + // Root frequency. + this.tonic = 440 // * Math.pow(2,(60-69)/12); + + // console.log("{{{{ Tune.js v0.1 Loaded }}}}"); + +} + +/* Set the tonic frequency */ + +Tune.prototype.tonicize = function(newTonic) { + this.tonic = newTonic +} + + +/* Return data in the mode you are in (freq, ratio, or midi) */ + +Tune.prototype.note = function(input,octave){ + + var newvalue; + + if (this.mode.output == "frequency") { + newvalue = this.frequency(input,octave) + } else if (this.mode.output == "ratio") { + newvalue = this.ratio(input,octave) + } else if (this.mode.output == "MIDI") { + newvalue = this.MIDI(input,octave) + } else { + newvalue = this.frequency(input,octave) + } + + return newvalue; + +} + + +/* Return freq data */ + +Tune.prototype.frequency = function(stepIn, octaveIn) { + + if (this.mode.input == "midi" || this.mode.input == "MIDI" ) { + this.stepIn += 60 + } + + // what octave is our input + var octave = Math.floor(stepIn/this.scale.length) + + if (octaveIn) { + octave += octaveIn + } + + // which scale degree (0 - scale length) is our input + var scaleDegree = stepIn % this.scale.length + + while (scaleDegree < 0) { + scaleDegree += this.scale.length + } + + var freq = this.tonic*this.scale[scaleDegree] + + freq = freq*(Math.pow(2,octave)) + + // truncate irrational numbers + freq = Math.floor(freq*100000000000)/100000000000 + + return freq + +} + +/* Force return ratio data */ + +Tune.prototype.ratio = function(stepIn, octaveIn) { + + if (this.mode.input == "midi" || this.mode.input == "MIDI" ) { + this.stepIn += 60 + } + + // what octave is our input + var octave = Math.floor(stepIn/this.scale.length) + + if (octaveIn) { + octave += octaveIn + } + + // which scale degree (0 - scale length) is our input + var scaleDegree = stepIn % this.scale.length + + // what ratio is our input to our key + var ratio = Math.pow(2,octave)*this.scale[scaleDegree] + + ratio = Math.floor(ratio*100000000000)/100000000000 + + return ratio + +} + +/* Force return adjusted MIDI data */ + +Tune.prototype.MIDI = function(stepIn,octaveIn) { + + var newvalue = this.frequency(stepIn,octaveIn) + + var n = 69 + 12*Math.log(newvalue/440)/Math.log(2) + + n = Math.floor(n*1000000000)/1000000000 + + return n + +} + +/* Load a new scale */ + +Tune.prototype.loadScale = function(scale){ + + /* load the scale */ + var freqs = isArrayOfNumbers(scale) ? scale : TuningList[scale].frequencies + this.scale = [] + for (var i=0;i 0 && arg.every(item => typeof item === 'number' && !isNaN(item)); +} + +/* allow an array of values too */ +Tune.prototype.isValidScale = function(scale) { + return !!TuningList[scale] || isArrayOfNumbers(scale) ; +} + +/* Return a collection of notes as an array */ + +Tune.prototype.chord = function(midis) { + var output = [] + for (var i=0;i[1, 1, -1]->[0, 1, -1]->[0, 0, -1]->[0, 0, 0]->[0, -1, 0],[0, -1, 1]->[0, -2, 1]->[-1, -2, 1]"},"breedt1":{"frequencies":[261.6255653006,275.62199471997,292.34127285051,310.07474405997,326.6631048533,348.83408706747,367.49599295996,391.11111150212,413.43299207996,437.02884834934,465.11211608996,489.99465727995,523.2511306012],"description":"Graham Breed's 1/4 P temperament, TL 10-06-99"},"breedt2":{"frequencies":[261.6255653006,276.37000081643,293.53214922797,310.91625060765,328.43856194079,349.78078158391,368.4933346061,392.4383479509,414.55500101742,439.10654054756,466.37437567834,492.65784266492,523.2511306012],"description":"Graham Breed's 1/5 P temperament, TL 10-06-99"},"breedt3":{"frequencies":[261.6255653006,276.55731914056,293.33333347996,311.12698372208,328.88393162803,350.01785633742,368.74309237173,392.4383479509,414.83597850347,438.51190905657,466.69047534984,491.65745674141,523.2511306012],"description":"Graham Breed's other 1/4 P temperament, TL 10-06-99"},"brown":{"frequencies":[261.6255653006,272.52663052146,275.62199471997,275.93321340298,279.38237857051,287.10624449997,290.69507255622,291.02331101095,294.32876096318,306.24666079997,306.59245933664,310.07474405997,310.42486507835,322.99452506247,327.03195662575,331.11985608357,344.52749339997,344.91651675372,348.83408706747,349.22797321314,363.36884069528,367.49599295996,367.91095120397,372.50983809402,382.80832599996,387.59343007496,388.03108134794,392.4383479509,408.78994578219,413.43299207996,413.89982010446,430.65936674996,436.04260883433,436.53496651643,441.49314144476,459.36999119996,459.88868900496,465.11211608996,465.63729761752,484.4917875937,489.99465727995,490.54793493862,496.67978412536,516.79124009995,517.37477513058,523.2511306012],"description":"Tuning of Colin Brown's Voice Harmonium, Glasgow. Helmholtz/Ellis p. 470-473"},"bruder":{"frequencies":[261.6255653006,276.38325105256,293.66476791741,310.22971009486,327.53979283172,349.02656754477,368.60786575306,391.65594491223,414.34624765043,439.23819834286,465.62553897253,491.60634075178,523.2511306012],"description":"Ignaz Bruder organ temperament (1829) according to P. Vier"},"burma3":{"frequencies":[261.6255653006,287.71029735626,317.68827763215,350.39147881787,389.32370520689,429.81331927092,476.14308821464,523.2511306012],"description":"Burmese scale, von Hornbostel"},"burt-forks":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,290.69507255622,294.32876096318,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,406.97310157871,418.60090448096,436.04260883433,465.11211608996,470.92601754108,490.54793493862,504.56359022259,523.2511306012],"description":"Warren Burt 19-tone Forks. Interval 5(3): pp. 13+23 Winter 1986-87"},"burt1":{"frequencies":[261.6255653006,272.09058791262,283.42769574232,295.75063903546,309.19384990071,340.11323489078,358.01393146398,377.90359432309,415.52295665389,425.14154361347,453.48431318771,485.87604984397,523.2511306012],"description":"W. Burt's 13diatsub #1"},"burt10":{"frequencies":[261.6255653006,265.11390617127,268.69652652494,272.3773008609,276.16031892841,355.06326719367,368.21375857121,382.37582620857,386.08821287079,389.87339142835,393.73352401674,397.67085925691,523.2511306012],"description":"W. Burt's 19enhsub #10"},"burt11":{"frequencies":[261.6255653006,344.24416486921,347.6866065179,351.12904816659,354.57148981529,358.01393146398,371.78369805875,385.55346465352,495.71159741166,502.59648070905,509.48136400643,516.36624730382,523.2511306012],"description":"W. Burt's 19enhharm #11"},"burt12":{"frequencies":[261.6255653006,302.93486508491,316.70463167967,330.47439827444,344.24416486921,358.01393146398,371.78369805875,385.55346465352,440.63253103259,468.17206422213,495.71159741166,509.48136400643,523.2511306012],"description":"W. Burt's 19diatharm #12"},"burt13":{"frequencies":[261.6255653006,273.51763645063,286.54228580542,293.53112204458,300.86940009569,334.29933343966,353.96400011258,376.08675011961,401.15920012759,429.81342870813,445.73244458621,462.87600014722,523.2511306012],"description":"W. Burt's 23diatsub #13"},"burt14":{"frequencies":[261.6255653006,264.50057151269,267.43946675172,270.4444045804,273.51763645063,334.29933343966,353.96400011258,376.08675011961,382.05638107389,388.21858076863,394.58281979763,401.15920012759,523.2511306012],"description":"W. Burt's 23enhsub #14"},"burt15":{"frequencies":[261.6255653006,341.25073734861,346.93824963775,352.6257619269,358.31327421604,364.00078650518,386.75083566176,409.50088481833,500.50108144463,506.18859373377,511.87610602291,517.56361831206,523.2511306012],"description":"W. Burt's 23enhharm #15"},"burt16":{"frequencies":[261.6255653006,295.75063903546,307.12566361375,318.50068819203,341.25073734861,364.00078650518,386.75083566176,409.50088481833,455.00098313148,466.37600770977,477.75103228805,500.50108144463,523.2511306012],"description":"W. Burt's 23diatharm #16"},"burt17":{"frequencies":[261.6255653006,262.27760655527,262.77528702311,280.51080915002,281.04308772525,281.33584094163,286.12102533302,286.66394947976,306.91182648178,308.56189006502,309.14739649778,336.61297098002,337.2517052703,337.60300912996,338.42271813583,339.41807907152,363.01398831179,369.18841978454,370.27426807802,396.01525997649,398.14437427744,399.31538714296,403.93556517602,406.10726176299,434.33931739357,434.79175418253,435.61678597414,437.95881170519,475.21831197179,476.86837555503,477.77324913293,478.27092960078,479.17846457156,521.20718087229,521.75010501903,522.74014316897,523.2511306012],"description":"W. Burt's \"2 out of 3,5,11,17,31 dekany\" CPS with 1/1=3/1. 1/1 vol. 10(1) '98"},"burt18":{"frequencies":[261.6255653006,268.26840191956,269.80136421624,270.50397193556,275.42222597075,281.04308772525,286.15296204753,295.09524211152,300.46061014991,306.59245933664,309.14739649778,314.76825825228,321.92208230347,324.60476632267,337.2517052703,343.38355445704,344.27778246344,354.11429053382,357.69120255941,367.91095120397,370.97687579734,375.57576268738,393.46032281536,404.70204632437,413.13333895612,421.56463158788,429.2294430713,432.80635509689,449.66894036041,463.72109474667,472.15238737843,490.54793493862,491.82540351919,500.76768358318,505.87755790546,515.07533168556,523.2511306012],"description":"W. Burt's \"2 out of 1,3,5,7,11 dekany\" CPS with 1/1=1/1. 1/1 vol. 10(1) '98"},"burt19":{"frequencies":[261.6255653006,268.26840191956,286.15296204753,294.32876096318,300.46061014991,306.59245933664,321.92208230347,327.03195662575,343.38355445704,357.69120255941,367.91095120397,375.57576268738,392.4383479509,400.61414686654,408.78994578219,429.2294430713,457.84473927605,490.54793493862,500.76768358318,515.07533168556,523.2511306012],"description":"W. Burt's \"2 out of 2,3,4,5,7 dekany\" CPS with 1/1=1/1. 1/1 vol. 10(1) '98"},"burt2":{"frequencies":[261.6255653006,264.16561933264,266.75547834571,269.39662169567,272.09058791262,340.11323489078,344.41846571218,348.83408706747,353.36439988652,358.01393146398,412.25846653428,485.87604984397,523.2511306012],"description":"W. Burt's 13enhsub #2"},"burt20":{"frequencies":[261.6255653006,269.10058145205,279.06726965397,279.38237857051,294.32876096318,298.00787047521,330.74639366397,335.25885428462,367.91095120397,376.74081403286,412.06026534844,418.60090448096,523.2511306012],"description":"Warren Burt tuning for \"Commas\" (1993) 1/1=263. XH 16"},"burt3":{"frequencies":[261.6255653006,281.75060878526,332.06321749692,382.37582620857,387.40708707973,392.4383479509,397.46960882207,402.50086969323,503.12608711654,508.1573479877,513.18860885887,518.21986973003,523.2511306012],"description":"W. Burt's 13enhharm #3"},"burt4":{"frequencies":[261.6255653006,281.75060878526,301.87565226992,322.00069575458,342.12573923925,362.25078272391,382.37582620857,402.50086969323,442.75095666255,462.87600014722,483.00104363188,503.12608711654,523.2511306012],"description":"W. Burt's 13diatharm #4, see his post 3/30/94 in Tuning Digest #57"},"burt5":{"frequencies":[261.6255653006,277.97716313189,296.50897400735,317.68818643644,342.12573923925,277.97716313189,386.75083566176,404.33041910093,423.58424858192,444.76346101102,468.17206422213,494.18162334558,523.2511306012],"description":"W. Burt's 17diatsub #5"},"burt6":{"frequencies":[261.6255653006,265.53042448419,269.55361273395,273.7005913914,277.97716313189,370.63621750918,386.75083566176,404.33041910093,408.97789518255,413.73345210327,418.60090448096,423.58424858192,523.2511306012],"description":"W. Burt's 17enhsub #6"},"burt7":{"frequencies":[261.6255653006,323.18452184192,327.03195662575,330.87939140958,334.72682619341,338.57426097725,353.96400011258,369.35373924791,492.47165233054,500.16652189821,507.86139146587,515.55626103354,523.2511306012],"description":"W. Burt's 17enhharm #7"},"burt8":{"frequencies":[261.6255653006,277.01530443593,292.40504357126,307.79478270659,323.18452184192,338.57426097725,353.96400011258,369.35373924791,400.13321751856,430.91269578922,461.69217405988,492.47165233054,523.2511306012],"description":"W. Burt's 17diatharm #8"},"burt9":{"frequencies":[261.6255653006,268.69652652494,276.16031892841,292.40504357126,310.68035879446,355.06326719367,368.21375857121,382.37582620857,397.67085925691,414.24047839262,432.2509339749,451.89870370104,523.2511306012],"description":"W. Burt's 19diatsub #9"},"burt_fibo":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,311.70233365892,327.03195662575,343.38355445704,363.82305174615,385.28452389971,392.4383479509,425.14154361347,449.66894036041,476.24028683625,523.2511306012],"description":"Warren Burt, 3/2+5/3+8/5+etc. \"Recurrent Sequences\", 2002"},"burt_fibo23":{"frequencies":[261.6255653006,267.05480676802,277.97716313189,282.81557538079,294.32876096318,299.5065008038,311.70233365892,327.03195662575,330.09788121912,343.38355445704,349.5792770728,363.82305174615,370.21039464899,385.28452389971,392.4383479509,408.02346463385,425.14154361347,432.10374737758,449.66894036041,457.60521391719,476.24028683625,484.61169812829,504.34459560877,523.2511306012],"description":"Warren Burt, 23-tone Fibonacci scale. \"Recurrent Sequences\", 2002"},"burt_primes":{"frequencies":[261.6255653006,267.75741448733,273.88926367407,277.97716313189,280.0211128608,284.10901231862,290.24086150535,298.416660421,302.50455987882,304.54850960773,308.63640906555,310.68035879446,320.90010743902,322.94405716793,327.03195662575,333.16380581248,335.20775554139,339.29565499922,341.33960472813,351.55935337268,353.60330310159,359.73515228832,363.82305174615,365.86700147506,369.95490093288,376.08675011961,384.26254903526,390.39439822199,392.4383479509,394.48229767981,396.52624740872,402.65809659545,406.74599605328,412.87784524001,421.05364415565,425.14154361347,431.27339280021,433.31734252912,437.40524198694,445.58104090258,455.80078954714,457.84473927605,461.93263873387,463.97658846278,468.0644879206,474.19633710734,476.24028683625,482.37213602298,488.50398520971,492.59188466754,498.72373385427,506.89953276991,513.03138195665,519.16323114338,523.2511306012],"description":"Warren Burt, primes until 251. \"Some Numbers\", Dec. 2002"},"bushmen":{"frequencies":[261.6255653006,347.0163224393,394.26624244126,453.9405988926,523.2511306012],"description":"Observed scale of South-African bushmen, almost (4 notes) equal pentatonic"},"dan_semantic":{"frequencies":[261.6255653006,272.52663052146,275.62199471997,279.06726965397,290.69507255622,294.32876096318,297.67175429757,306.59245933664,310.07474405997,313.95067836072,322.99452506247,327.03195662575,331.11985608357,344.91651675372,348.83408706747,353.19451315581,363.36884069528,367.91095120397,372.08969287196,387.59343007496,392.4383479509,397.34382730029,408.78994578219,413.43299207996,418.60090448096,430.65936674996,436.04260883433,441.49314144476,459.88868900496,465.11211608996,470.92601754108,484.4917875937,490.54793493862,496.67978412536,516.79124009995,523.2511306012],"description":"The Semantic Scale, from Alain Dani�lou: \"S�mantique Musicale\" (1967)"},"danielou5_53":{"frequencies":[261.6255653006,264.89588486686,267.90457886781,272.52663052146,275.62199471997,279.06726965397,282.55561052465,285.76488412567,290.69507255622,294.32876096318,297.67175429757,301.39265122629,306.59245933664,310.07474405997,313.95067836072,317.87506184023,322.99452506247,327.03195662575,331.11985608357,334.88072358477,340.65828815182,344.52749339997,348.83408706747,353.19451315581,357.20610515709,363.36884069528,367.91095120397,372.08969287196,376.74081403286,383.2405741708,387.59343007496,392.4383479509,397.34382730029,401.85686830172,408.78994578219,413.43299207996,418.60090448096,423.83341578697,430.65936674996,436.04260883433,441.49314144476,446.50763144636,454.2110508691,459.88868900496,465.11211608996,470.92601754108,479.0507177135,484.4917875937,490.54793493862,496.67978412536,502.32108537715,510.98743222773,516.79124009995,523.2511306012],"description":"Dani�lou's Harmonic Division in 5-limit, symmetrized"},"danielou_53":{"frequencies":[261.6255653006,264.89588486686,267.43946675172,272.52663052146,275.62199471997,279.06726965397,282.55561052465,287.78812183066,290.69507255622,294.32876096318,297.67175429757,301.87565226992,306.59245933664,310.07474405997,313.95067836072,318.93402246168,322.99452506247,327.03195662575,331.11985608357,334.88072358477,340.65828815182,344.52749339997,348.83408706747,353.19451315581,357.20610515709,363.36884069528,367.91095120397,372.08969287196,376.74081403286,383.2405741708,387.59343007496,392.4383479509,397.34382730029,401.85686830172,408.78994578219,413.43299207996,418.60090448096,423.83341578697,430.65936674996,436.04260883433,441.49314144476,446.50763144636,454.2110508691,459.88868900496,465.11211608996,470.92601754108,479.64686971777,484.4917875937,490.54793493862,496.67978412536,502.32108537715,510.98743222773,516.79124009995,523.2511306012],"description":"Dani�lou's Harmonic Division of the Octave, see p. 153"},"darreg":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,306.59245933664,313.95067836072,327.03195662575,348.83408706747,367.91095120397,372.08969287196,392.4383479509,408.78994578219,418.60090448096,436.04260883433,441.49314144476,459.88868900496,470.92601754108,490.54793493862,523.2511306012],"description":"This set of 19 ratios in 5-limit JI is for his megalyra family"},"darreg_ennea":{"frequencies":[261.6255653006,269.29177952703,277.18263097687,293.66476791741,349.22823143301,391.99543598175,403.48177901006,415.30469757995,440,523.2511306012],"description":"Ivor Darreg's Mixed Enneatonic, a mixture of chromatic and enharmonic"},"darreg_genus":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,290.69507255622,348.83408706747,392.4383479509,406.97310157871,418.60090448096,436.04260883433,523.2511306012],"description":"Ivor Darreg's Mixed JI Genus (Archytas Enh, Ptolemy Soft Chrom, Didymos Chrom"},"darreg_genus2":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,294.32876096318,348.83408706747,392.4383479509,406.97310157871,418.60090448096,441.49314144476,523.2511306012],"description":"Darreg's Mixed JI Genus 2 (Archytas Enharmonic and Chromatic Genera)"},"david11":{"frequencies":[261.6255653006,269.80136421624,274.70684356563,285.40970760065,294.32876096318,305.22982618403,314.76825825228,327.03195662575,332.97799220076,343.38355445704,359.73515228832,366.27579142084,374.60024122586,392.4383479509,406.97310157871,419.69101100305,428.11456140098,441.49314144476,457.84473927605,479.64686971777,490.54793493862,499.46698830115,523.2511306012],"description":"11-limit system from Gary David, 1967"},"david7":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,336.37572681506,348.83408706747,366.27579142084,392.4383479509,418.60090448096,448.50096908674,470.92601754108,488.36772189445,523.2511306012],"description":"Gary David's Constant Structure, 1967. A mode of Fokker's 7-limit scale"},"ddimlim1":{"frequencies":[261.6255653006,294.32876096318,306.59245933664,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,418.60090448096,436.04260883433,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"First 27/25&2048/1875 scale"},"de_caus":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,306.59245933664,327.03195662575,348.83408706747,363.36884069528,392.4383479509,408.78994578219,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"De Caus (a mode of Ellis's duodene) (1615)"},"degung1":{"frequencies":[261.6255653006,286.1303811777,319.28416942365,390.63652710512,420.90734643474,523.2511306012],"description":"Gamelan Degung, Kabupaten Sukabumi. 1/1=363 Hz"},"degung2":{"frequencies":[261.6255653006,276.67939184371,325.99375993805,390.36201910543,415.27879033283,523.2511306012],"description":"Gamelan Degung, Kabupaten Bandung. 1/1=252 Hz"},"degung3":{"frequencies":[261.6255653006,282.83850205216,320.55017368416,393.28023705203,426.95140008307,523.2511306012],"description":"Gamelan Degung, Kabupaten Sumedang. 1/1=388.5 Hz"},"degung4":{"frequencies":[261.6255653006,284.6485709981,319.18312009646,379.88037698982,415.46137490477,523.2511306012],"description":"Gamelan Degung, Kasepuhan Cheribon. 1/1=250 Hz"},"degung5":{"frequencies":[261.6255653006,284.24274449773,317.86283634652,388.77066331187,430.33748813761,523.2511306012],"description":"Gamelan Degung, Kanoman Cheribon. 1/1=428 Hz"},"degung6":{"frequencies":[261.6255653006,273.29426590363,298.47415715355,379.54129348313,409.02013274169,523.2511306012],"description":"Gamelan Degung, Kacherbonan Cheribon. 1/1=426 Hz"},"dekany":{"frequencies":[261.6255653006,299.7792935736,305.22982618403,327.03195662575,359.73515228832,381.53728273004,419.69101100305,436.04260883433,457.84473927605,479.64686971777,523.2511306012],"description":"2)5 Dekany 1.3.5.7.11 (1.3 tonic)"},"dekany2":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,313.95067836072,348.83408706747,358.80077526939,398.6675280771,418.60090448096,448.50096908674,465.11211608996,523.2511306012],"description":"3)5 Dekany 1.3.5.7.9 (1.3.5.7.9 tonic)"},"dekany3":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,327.03195662575,343.38355445704,381.53728273004,392.4383479509,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"2)5 Dekany 1.3.5.7.9 and 3)5 Dekany 1 1/3 1/5 1/7 1/9"},"dekany4":{"frequencies":[261.6255653006,270.96933548991,288.48890459486,310.68035879446,321.77608589426,355.06326719367,425.14154361347,440.3251701711,474.19633710734,485.87604984397,523.2511306012],"description":"2)5 Dekany 1.7.13.19.29 (1.7 tonic)"},"dekany_union":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,305.22982618403,327.03195662575,343.38355445704,366.27579142084,381.53728273004,392.4383479509,412.06026534844,436.04260883433,457.84473927605,470.92601754108,490.54793493862,523.2511306012],"description":"Union of 2)5 and 3)5 [ 1 3 5 7 9] dekanies"},"dent":{"frequencies":[261.6255653006,276.73939277812,293.41671964988,311.13637945111,328.33487278761,349.18153137729,368.9858570375,391.91718148616,414.84850593482,438.82216331296,465.92281947955,491.98114271667,523.2511306012],"description":"Tom Dent, well temperament with A=421 Hz. Integer Hz beat rates from A"},"dent2":{"frequencies":[261.6255653006,276.57667301797,293.18838124587,310.79781949647,328.55897053596,349.10502918563,369.05532299592,391.67735584266,414.54302837239,438.92977277749,465.83490899549,492.45596147139,523.2511306012],"description":"Tom Dent, well-temperament, 2/32 and 5/32 comma. TL 3 & 5-9-2005"},"dent3":{"frequencies":[261.6255653006,276.38325105256,293.15632631094,310.94732162256,328.48713220126,349.22823143301,368.7143392539,391.76907592069,414.58565256441,438.73106346722,466.16376151809,492.17459484008,523.2511306012],"description":"Tom Dent, Bach harpsichord \"sine wave\" temperament, TL 10-10-2005"},"deporcy":{"frequencies":[261.6255653006,272.52663052146,286.15296204753,299.00064605783,313.95067836072,327.03195662575,348.83408706747,358.80077526939,381.53728273004,392.4383479509,418.60090448096,436.04260883433,457.84473927605,478.40103369253,502.32108537715,523.2511306012],"description":"A 15-note chord-based detempering of 7-limit porcupine"},"diab19_612":{"frequencies":[261.6255653006,267.01398215014,280.33982809972,299.03492334906,305.19382000629,313.95883772326,320.42510414137,327.02455105776,348.83292260574,366.24210002542,373.7851897098,392.43965797471,418.61038382265,427.23204601759,436.03127668087,448.5538823653,457.79225819026,488.32116993744,512.69177642068,523.2511306012],"description":"diab19a in 612-tET"},"diab19_72":{"frequencies":[261.6255653006,266.71173418545,279.86396690685,299.37379946195,305.19382000629,314.13668154225,320.24370022528,326.46944327063,349.22823143301,366.44956000397,373.57357677338,391.99543598175,419.32216217931,427.47405410759,435.78442404634,448.5538823653,457.27406033445,489.15147723638,513.27277840175,523.2511306012],"description":"diab19a in 72-tET"},"diablack":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,331.11985608357,372.08969287196,392.4383479509,418.60090448096,441.49314144476,470.92601754108,523.2511306012],"description":"Unique 256/245&2048/2025 Fokker block"},"diachrome1":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,334.88072358477,367.91095120397,392.4383479509,418.60090448096,441.49314144476,470.92601754108,523.2511306012],"description":"First 25/24&2048/2025 scale"},"diacycle13":{"frequencies":[261.6255653006,268.33391312882,275.39533189537,282.83844897362,290.69507255622,299.00064605783,307.79478270659,317.12189733406,327.03195662575,337.58137458142,348.83408706747,360.86284869048,373.75080757229,387.59343007496,402.50086969323,413.09299784305,424.25767346043,436.04260883433,448.50096908674,461.69217405988,475.68284600109,490.54793493862,506.37206187213,523.2511306012],"description":"Diacycle on 20/13, 13/10; there are also nodes at 3/2, 4/3; 13/9, 18/13"},"diaddim1":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,313.95067836072,334.88072358477,344.91651675372,357.20610515709,367.91095120397,392.4383479509,418.60090448096,446.50763144636,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"First 2048/2025&2048/1875 scale"},"dialim1":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,334.88072358477,348.83408706747,353.19451315581,367.91095120397,392.4383479509,418.60090448096,441.49314144476,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"First 27/25&2048/2025 scale"},"diamisty":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,310.42486507835,330.74639366397,348.83408706747,372.08969287196,392.4383479509,413.89982010446,436.53496651643,470.39487098876,496.11959049595,523.2511306012],"description":"Diamisty scale 2048/2025 and 67108864/66430125"},"diamond11a":{"frequencies":[261.6255653006,279.06726965397,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,380.54627680087,392.4383479509,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,490.54793493862,523.2511306012],"description":"11-limit Diamond with added 16/15 & 15/8, Zoomoozophone tuning: 1/1 = 392 Hz"},"diamond11ak":{"frequencies":[261.6255653006,279.72330032405,285.63317938628,287.78812183066,290.69507255622,293.86839138568,299.07491977616,305.39295512204,314.19649759716,319.76457981184,326.52043447049,333.41680553884,335.93301933283,349.10721912206,359.17247822875,366.75848641051,373.2589099097,381.14243472333,392.13131479202,407.50942884268,410.58480125643,419.25667855894,428.11456140098,435.70146034294,448.26139746089,457.73103588952,465.84075338014,470.92601754108,475.68284600109,479.27160679251,489.39746055879,523.2511306012],"description":"microtempered version of diamond11a, Dave Keenan TL 11-1-2000, 225/224&385/384"},"diamond11at":{"frequencies":[261.6255653006,279.83704120119,285.33574350137,287.98268367985,290.84948650387,293.82121114493,299.2738827313,305.22380787491,314.19079532693,320.23980272009,326.48518221507,332.71524733285,336.02719554531,349.1122100506,359.53680125564,366.52331521885,373.4984028396,380.75621844446,392.12570885984,407.39521875769,411.45055399509,419.30194782174,427.47925671618,435.70936791853,448.50981249085,457.42672761267,465.91555560021,470.67599975252,475.36147343465,479.7712027167,489.19854301666,523.2511306012],"description":"microtempered version of diamond11a, OdC"},"diamond11map":{"frequencies":[195.99771799087,228.66400432268,261.33029065449,293.99657698631,326.66286331812,359.32914964993,391.99543598174,457.32800864536,522.66058130899,587.99315397261,653.32572663623,718.65829929986,213.81569235368,249.45164107929,285.0875898049,320.72353853051,356.35948725613,391.99543598174,427.63138470735,498.90328215858,570.1751796098,641.44707706103,712.71897451225,783.99087196348,235.19726158904,274.39680518722,313.59634878539,352.79589238357,391.99543598174,431.19497957991,470.39452317809,548.79361037444,627.19269757078,705.59178476713,783.99087196348,862.38995915983,261.33029065449,304.88533909691,348.44038753932,391.99543598174,435.55048442416,479.10553286657,522.66058130899,609.77067819382,696.88077507865,783.99087196348,871.10096884831,958.21106573314,293.99657698631,342.99600648402,391.99543598174,440.99486547946,489.99429497718,538.99372447489,587.99315397261,685.99201296804,783.99087196348,881.98973095892,979.98858995435,1077.98744894978,335.99608798435,391.99543598174,447.99478397913,503.99413197652,559.99347997391,615.99282797131,671.9921759687,783.99087196348,895.98956795826,1007.98826395305,1119.98695994783,1231.98565594261,783.99087196348],"description":"11-limit diamond on a 'centreless' map"},"diamond15":{"frequencies":[261.6255653006,269.80136421624,279.06726965397,280.31310567921,281.75060878526,283.42769574232,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,301.87565226992,305.22982618403,309.19384990071,310.07474405997,313.95067836072,318.85615771011,319.76457981184,322.00069575458,327.03195662575,332.97799220076,336.37572681506,340.11323489078,343.38355445704,348.83408706747,356.76213450082,359.73515228832,362.25078272391,366.27579142084,367.91095120397,372.08969287196,373.75080757229,377.90359432309,380.54627680087,383.71749577421,392.4383479509,398.6675280771,402.50086969323,406.97310157871,411.12588832951,418.60090448096,425.14154361347,428.11456140098,429.33426100611,436.04260883433,441.49314144476,442.75095666255,448.50096908674,453.48431318771,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,483.00104363188,485.87604984397,488.36772189445,490.54793493862,507.3950357345,523.2511306012],"description":"15-limit Diamond + 2nd ratios. See Novaro, 1927, Sistema Natural..."},"diamond17":{"frequencies":[261.6255653006,277.97716313189,281.75060878526,283.42769574232,285.40970760065,287.78812183066,299.00064605783,305.22982618403,307.79478270659,309.19384990071,313.95067836072,317.68818643644,322.00069575458,327.03195662575,332.97799220076,338.57426097725,340.11323489078,342.12573923925,348.83408706747,359.73515228832,366.27579142084,369.35373924791,370.63621750918,373.75080757229,380.54627680087,392.4383479509,400.13321751856,402.50086969323,404.33041910093,411.12588832951,418.60090448096,425.14154361347,430.91269578922,436.04260883433,442.75095666255,444.76346101102,448.50096908674,457.84473927605,475.68284600109,479.64686971777,483.00104363188,485.87604984397,492.47165233054,523.2511306012],"description":"17-limit Diamond"},"diamond17a":{"frequencies":[261.6255653006,277.01530443593,277.97716313189,281.75060878526,283.42769574232,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,307.79478270659,309.19384990071,313.95067836072,317.68818643644,319.76457981184,322.00069575458,327.03195662575,332.97799220076,336.37572681506,338.57426097725,340.11323489078,342.12573923925,348.83408706747,359.73515228832,362.25078272391,366.27579142084,369.35373924791,370.63621750918,373.75080757229,377.90359432309,380.54627680087,392.4383479509,400.13321751856,402.50086969323,404.33041910093,406.97310157871,411.12588832951,418.60090448096,425.14154361347,428.11456140098,430.91269578922,436.04260883433,442.75095666255,444.76346101102,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,483.00104363188,485.87604984397,492.47165233054,494.18162334558,523.2511306012],"description":"17-limit, +9 Diamond"},"diamond19":{"frequencies":[261.6255653006,275.39533189537,277.97716313189,281.75060878526,283.42769574232,285.40970760065,287.78812183066,292.40504357126,299.00064605783,302.93486508491,305.22982618403,307.79478270659,309.19384990071,310.68035879446,313.95067836072,317.68818643644,322.00069575458,327.03195662575,330.47439827444,332.97799220076,338.57426097725,340.11323489078,342.12573923925,348.83408706747,355.06326719367,358.01393146398,359.73515228832,366.27579142084,369.35373924791,370.63621750918,373.75080757229,380.54627680087,382.37582620857,385.55346465352,392.4383479509,400.13321751856,402.50086969323,404.33041910093,411.12588832951,414.24047839262,418.60090448096,425.14154361347,430.91269578922,436.04260883433,440.63253103259,442.75095666255,444.76346101102,448.50096908674,451.89870370104,457.84473927605,468.17206422213,475.68284600109,479.64686971777,483.00104363188,485.87604984397,492.47165233054,497.08857407114,523.2511306012],"description":"19-limit Diamond"},"diamond7":{"frequencies":[261.6255653006,299.00064605783,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,373.75080757229,392.4383479509,418.60090448096,436.04260883433,448.50096908674,457.84473927605,523.2511306012],"description":"7-limit Diamond, also double-tie circular mirroring of 4:5:6:7"},"diamond9":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,523.2511306012],"description":"9-limit Diamond"},"diamond_chess":{"frequencies":[261.6255653006,299.00064605783,313.95067836072,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,406.97310157871,436.04260883433,457.84473927605,523.2511306012],"description":"9-limit chessboard pattern diamond. OdC"},"diamond_chess11":{"frequencies":[261.6255653006,287.78812183066,299.00064605783,313.95067836072,319.76457981184,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,380.54627680087,392.4383479509,406.97310157871,428.11456140098,436.04260883433,457.84473927605,475.68284600109,523.2511306012],"description":"11-limit chessboard pattern diamond. OdC"},"diamond_dup":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,343.38355445704,348.83408706747,366.27579142084,373.75080757229,392.4383479509,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,490.54793493862,523.2511306012],"description":"Two 7-limit diamonds 3/2 apart"},"diamond_mod":{"frequencies":[261.6255653006,269.10058145205,271.31540105247,279.06726965397,327.03195662575,336.37572681506,348.83408706747,392.4383479509,406.97310157871,418.60090448096,490.54793493862,504.56359022259,508.71637697339,523.2511306012],"description":"13-tone Octave Modular Diamond, based on Archytas's Enharmonic"},"diamond_tetr":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,327.03195662575,336.37572681506,339.14425131559,348.83408706747,358.80077526939,523.2511306012],"description":"Tetrachord Modular Diamond based on Archytas's Enharmonic"},"diaphonic_10":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,313.95067836072,336.37572681506,362.25078272391,392.4383479509,418.60090448096,448.50096908674,483.00104363188,523.2511306012],"description":"10-tone Diaphonic Cycle"},"diaphonic_12":{"frequencies":[261.6255653006,274.70684356563,289.16509849014,305.22982618403,323.18452184192,343.38355445704,366.27579142084,392.4383479509,413.09299784305,436.04260883433,461.69217405988,490.54793493862,523.2511306012],"description":"12-tone Diaphonic Cycle, conjunctive form on 3/2 and 4/3"},"diaphonic_12a":{"frequencies":[261.6255653006,274.70684356563,289.16509849014,305.22982618403,323.18452184192,343.38355445704,366.27579142084,385.55346465352,406.97310157871,430.91269578922,457.84473927605,488.36772189445,523.2511306012],"description":"2nd 12-tone Diaphonic Cycle, conjunctive form on 10/7 and 7/5"},"diaphonic_5":{"frequencies":[261.6255653006,299.00064605783,348.83408706747,392.4383479509,448.50096908674,523.2511306012],"description":"D5-tone Diaphonic Cycle"},"diaphonic_7":{"frequencies":[261.6255653006,285.40970760065,313.95067836072,348.83408706747,380.54627680087,418.60090448096,465.11211608996,523.2511306012],"description":"7-tone Diaphonic Cycle, disjunctive form on 4/3 and 3/2"},"diaschismic":{"frequencies":[261.6255653006,266.61097723855,278.05603152599,283.35453458855,295.51835494038,301.14961170579,314.07733767684,320.06224556188,333.80185153667,340.16262034629,354.76509561975,369.99442271164,377.04485988831,393.23061088369,400.72382577504,417.92606548687,425.88986517773,444.17243057662,452.63636847719,472.06710558841,481.06259110609,501.71360968203,523.2511306012],"description":"diaschismic temperament, g=105.446531, p=600, 5-limit"},"diat13":{"frequencies":[261.6255653006,279.06726965397,322.00069575458,348.83408706747,392.4383479509,418.60090448096,483.00104363188,523.2511306012],"description":"This genus is from K.S's diatonic Hypodorian harmonia"},"diat15":{"frequencies":[261.6255653006,301.87565226992,327.03195662575,356.76213450082,373.75080757229,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"Tonos-15 Diatonic and its own trite synemmenon Bb"},"diat15_inv":{"frequencies":[261.6255653006,279.06726965397,313.95067836072,348.83408706747,366.27579142084,383.71749577421,418.60090448096,453.48431318771,523.2511306012],"description":"Inverted Tonos-15 Harmonia, a harmonic series from 15 from 30."},"diat17":{"frequencies":[261.6255653006,296.50897400735,342.12573923925,370.63621750918,386.75083566176,404.33041910093,444.76346101102,494.18162334558,523.2511306012],"description":"Tonos-17 Diatonic and its own trite synemmenon Bb"},"diat19":{"frequencies":[261.6255653006,276.16031892841,310.68035879446,355.06326719367,368.21375857121,382.37582620857,414.24047839262,451.89870370104,523.2511306012],"description":"Tonos-19 Diatonic and its own trite synemmenon Bb"},"diat21":{"frequencies":[261.6255653006,289.16509849014,305.22982618403,343.38355445704,366.27579142084,392.4383479509,422.62591317789,457.84473927605,523.2511306012],"description":"Tonos-21 Diatonic and its own trite synemmenon Bb"},"diat21_inv":{"frequencies":[261.6255653006,299.00064605783,323.91736656265,348.83408706747,373.75080757229,398.6675280771,448.50096908674,473.41768959156,523.2511306012],"description":"Inverted Tonos-21 Harmonia, a harmonic series from 21 from 42."},"diat23":{"frequencies":[261.6255653006,286.54228580542,300.86940009569,334.29933343966,353.96400011258,376.08675011961,429.81342870813,462.87600014722,523.2511306012],"description":"Tonos-23 Diatonic and its own trite synemmenon Bb"},"diat25":{"frequencies":[261.6255653006,297.30177875068,327.03195662575,363.36884069528,384.74347838324,408.78994578219,467.18850946536,503.12608711654,523.2511306012],"description":"Tonos-25 Diatonic and its own trite synemmenon Bb"},"diat27":{"frequencies":[261.6255653006,294.32876096318,336.37572681506,353.19451315581,371.78369805875,392.4383479509,441.49314144476,504.56359022259,523.2511306012],"description":"Tonos-27 Diatonic and its own trite synemmenon Bb"},"diat27_inv":{"frequencies":[261.6255653006,271.31540105247,310.07474405997,348.83408706747,377.90359432309,387.59343007496,406.97310157871,465.11211608996,523.2511306012],"description":"Inverted Tonos-27 Harmonia, a harmonic series from 27 from 54"},"diat29":{"frequencies":[261.6255653006,291.81313052759,316.13089140489,344.87006335079,361.29244731988,379.35706968587,421.50785520652,474.19633710734,523.2511306012],"description":"Tonos-29 Diatonic and its own trite synemmenon Bb"},"diat31":{"frequencies":[261.6255653006,289.65687586852,311.93817401225,337.93302184661,352.6257619269,368.65420565085,405.51962621593,450.57736246214,523.2511306012],"description":"Tonos-31 Diatonic. The disjunctive and conjunctive diatonic forms are the same"},"diat33":{"frequencies":[261.6255653006,287.78812183066,319.76457981184,359.73515228832,375.37581108347,392.4383479509,431.68218274599,479.64686971777,523.2511306012],"description":"Tonos-33 Diatonic. The conjunctive form is 23 (Bb instead of B) 20 18 33/2"},"diat_chrom":{"frequencies":[261.6255653006,280.31310567921,301.87565226992,348.83408706747,392.4383479509,420.46965851882,452.81347840488,523.2511306012],"description":"Diatonic- Chromatic, on the border between the chromatic and diatonic genera"},"diat_dies2":{"frequencies":[261.6255653006,266.71168334607,311.12698372208,349.22823143301,391.99543598175,399.61600264311,466.16376151809,523.2511306012],"description":"Dorian Diatonic, 2 part Diesis"},"diat_dies5":{"frequencies":[261.6255653006,274.52693220706,311.12698372208,349.22823143301,391.99543598175,411.32564531909,466.16376151809,523.2511306012],"description":"Dorian Diatonic, 5 part Diesis"},"diat_enh":{"frequencies":[261.6255653006,269.29177952703,311.12698372208,349.22823143301,391.99543598175,403.48177901006,466.16376151809,523.2511306012],"description":"Diat. + Enharm. Diesis, Dorian Mode"},"diat_enh2":{"frequencies":[261.6255653006,269.29177952703,302.26980244078,349.22823143301,391.99543598175,403.48177901006,452.89298412314,523.2511306012],"description":"Diat. + Enharm. Diesis, Dorian Mode 3 + 12 + 15 parts"},"diat_enh3":{"frequencies":[261.6255653006,302.26980244078,311.12698372208,349.22823143301,391.99543598175,452.89298412314,466.16376151809,523.2511306012],"description":"Diat. + Enharm. Diesis, Dorian Mode, 15 + 3 + 12 parts"},"diat_enh4":{"frequencies":[261.6255653006,302.26980244078,339.28638158975,349.22823143301,391.99543598175,452.89298412314,508.3551866238,523.2511306012],"description":"Diat. + Enharm. Diesis, Dorian Mode, 15 + 12 + 3 parts"},"diat_enh5":{"frequencies":[261.6255653006,293.66476791741,339.28638158975,349.22823143301,391.99543598175,440,508.3551866238,523.2511306012],"description":"Dorian Mode, 12 + 15 + 3 parts"},"diat_enh6":{"frequencies":[261.6255653006,293.66476791741,302.26980244078,349.22823143301,391.99543598175,440,452.89298412314,523.2511306012],"description":"Dorian Mode, 12 + 3 + 15 parts"},"diat_eq":{"frequencies":[261.6255653006,288.06466200271,317.1754314895,349.22823143301,391.99543598175,431.60932167676,475.22619361214,523.2511306012],"description":"Equal Diatonic, Islamic form, similar to 11/10 x 11/10 x 400/363"},"diat_eq2":{"frequencies":[261.6255653006,287.78812183066,317.12189733406,348.83408706747,392.4383479509,431.68218274599,475.68284600109,523.2511306012],"description":"Equal Diatonic, 11/10 x 400/363 x 11/10"},"diat_gold":{"frequencies":[261.6255653006,292.38332274669,326.75708630452,349.99258496952,391.13935185123,437.1232727958,488.51296691354,523.2511306012],"description":"Diatonic scale with ratio between whole and half tone the Golden Section"},"diat_hemchrom":{"frequencies":[261.6255653006,273.20871865617,311.12698372208,349.22823143301,391.99543598175,409.35055662695,466.16376151809,523.2511306012],"description":"Diat. + Hem. Chrom. Diesis, Another genus of Aristoxenos, Dorian Mode"},"diat_smal":{"frequencies":[261.6255653006,299.00064605783,327.03195662575,348.83408706747,392.4383479509,436.04260883433,457.84473927605,523.2511306012],"description":"\"Smallest number\" diatonic scale"},"diat_sofchrom":{"frequencies":[261.6255653006,271.8968348557,311.12698372208,349.22823143301,391.99543598175,407.38495184466,466.16376151809,523.2511306012],"description":"Diat. + Soft Chrom. Diesis, Another genus of Aristoxenos, Dorian Mode"},"diat_soft":{"frequencies":[261.6255653006,274.52693220706,302.26980244078,349.22823143301,391.99543598175,411.32564531909,452.89298412314,523.2511306012],"description":"Soft Diatonic genus 5 + 10 + 15 parts"},"diat_soft2":{"frequencies":[261.6255653006,281.2143451833,302.26980244078,349.22823143301,391.99543598175,421.34544350737,452.89298412314,523.2511306012],"description":"Soft Diatonic genus with equally divided Pyknon; Dorian Mode"},"diat_soft3":{"frequencies":[261.6255653006,281.2143451833,324.90175210669,349.22823143301,391.99543598175,421.34544350737,486.80259447109,523.2511306012],"description":"New Soft Diatonic genus with equally divided Pyknon; Dorian Mode; 1:1 pyknon"},"diat_soft4":{"frequencies":[261.6255653006,302.26980244078,324.90175210669,349.22823143301,391.99543598175,452.89298412314,486.80259447109,523.2511306012],"description":"New Soft Diatonic genus with equally divided Pyknon; Dorian Mode; 1:1 pyknon"},"dicot":{"frequencies":[261.6255653006,270.35822989652,294.32876096318,320.42456924675,331.11985608357,360.47764004221,392.4383479509,405.53734464206,441.49314144476,480.63685362987,523.2511306012],"description":"Dicot temperament, g=350.9775, 5-limit"},"didy_chrom":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,348.83408706747,392.4383479509,418.60090448096,436.04260883433,523.2511306012],"description":"Didymus Chromatic"},"didy_chrom1":{"frequencies":[261.6255653006,279.06726965397,334.88072358477,348.83408706747,392.4383479509,418.60090448096,502.32108537715,523.2511306012],"description":"Permuted Didymus Chromatic"},"didy_chrom2":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,348.83408706747,392.4383479509,470.92601754108,490.54793493862,523.2511306012],"description":"Didymos's Chromatic, 6/5 x 25/24 x 16/15"},"didy_chrom3":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,348.83408706747,392.4383479509,408.78994578219,436.04260883433,523.2511306012],"description":"Didymos's Chromatic, 25/24 x 16/15 x 6/5"},"didy_diat":{"frequencies":[261.6255653006,279.06726965397,310.07474405997,348.83408706747,392.4383479509,418.60090448096,465.11211608996,523.2511306012],"description":"Didymus Diatonic"},"didy_diatinv":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,348.83408706747,392.4383479509,441.49314144476,490.54793493862,523.2511306012],"description":"Inverse Didymus Diatonic, variant of Ptolemy with 2 identical triads"},"didy_enh":{"frequencies":[261.6255653006,270.06509966514,279.06726965397,348.83408706747,392.4383479509,405.0976494977,418.60090448096,523.2511306012],"description":"Dorian mode of Didymos's Enharmonic"},"didy_enh2":{"frequencies":[261.6255653006,275.62199471997,279.06726965397,348.83408706747,392.4383479509,413.43299207996,418.60090448096,523.2511306012],"description":"Permuted Didymus Enharmonic"},"diesic-m":{"frequencies":[261.6255653006,289.62525622617,320.62153003931,354.93508703008,392.92094947462,434.97213484265,481.52372211906,523.2511306012],"description":"Minimal Diesic temperament, g=176.021, 5-limit"},"diesic-t":{"frequencies":[261.6255653006,272.92239980638,281.87304203955,294.04415210774,303.68749398125,316.80053726141,327.19018747082,337.92057205022,352.51178108166,364.07260143821,379.79303732838,392.24856169057,409.18561859271,422.60509148244,436.46466102477,455.31094249407,470.24311865111,490.54793493862,506.63572944675,523.2511306012],"description":"Tiny Diesic temperament, g=443.017, 5-limit"},"diff31_72":{"frequencies":[261.6255653006,269.29177952703,274.52698453615,279.86396690685,285.30470202322,293.66476791741,299.37379946195,305.19382000629,314.13668154225,320.24370022528,326.46944327063,336.03572815422,342.56848033562,352.60650301302,356.01745236555,366.44956000397,373.57357677338,384.52011812375,388.23978476841,399.61607881612,407.38487419079,419.32216217931,427.47405410759,435.78442404634,448.5538823653,457.27406033445,466.16376151809,479.82340237272,489.15147723638,498.66089874196,508.3551866238,523.2511306012],"description":"Diff31, 11/9, 4/3, 7/5, 3/2, 7/4, 9/5 difference diamond, tempered to 72-et"},"dimteta":{"frequencies":[261.6255653006,282.55561052465,307.12566361375,336.37572681506,406.97310157871,439.53094970501,477.75103228805,523.2511306012],"description":"A heptatonic form on the 9/7"},"dimtetb":{"frequencies":[261.6255653006,294.32876096318,336.37572681506,406.97310157871,457.84473927605,523.2511306012],"description":"A pentatonic form on the 9/7"},"div_fifth1":{"frequencies":[261.6255653006,273.00058987889,285.40970760065,348.83408706747,392.4383479509,523.2511306012],"description":"Divided Fifth #1, From Schlesinger, see Chapter 8, p. 160"},"div_fifth2":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,348.83408706747,392.4383479509,523.2511306012],"description":"Divided Fifth #2, From Schlesinger, see Chapter 8, p. 160"},"div_fifth3":{"frequencies":[261.6255653006,271.31540105247,305.22982618403,348.83408706747,392.4383479509,523.2511306012],"description":"Divided Fifth #3, From Schlesinger, see Chapter 8, p. 160"},"div_fifth4":{"frequencies":[261.6255653006,274.70684356563,305.22982618403,343.38355445704,392.4383479509,523.2511306012],"description":"Divided Fifth #4, From Schlesinger, see Chapter 8, p. 160"},"div_fifth5":{"frequencies":[261.6255653006,287.78812183066,319.76457981184,359.73515228832,411.12588832951,523.2511306012],"description":"Divided Fifth #5, From Schlesinger, see Chapter 8, p. 160"},"dkring1":{"frequencies":[261.6255653006,274.70684356563,305.22982618403,313.95067836072,320.49131749323,327.03195662575,366.27579142084,392.4383479509,439.53094970501,448.50096908674,457.84473927605,470.92601754108,523.2511306012],"description":"Double-tie circular mirroring of 4:5:6:7"},"dkring2":{"frequencies":[261.6255653006,274.70684356563,305.22982618403,329.64821227876,336.37572681506,353.19451315581,366.27579142084,392.4383479509,406.97310157871,427.32175665765,436.04260883433,470.92601754108,523.2511306012],"description":"Double-tie circular mirroring of 3:5:7:9"},"dkring3":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,305.22982618403,336.37572681506,348.83408706747,384.42940207435,392.4383479509,398.6675280771,448.50096908674,465.11211608996,504.56359022259,523.2511306012],"description":"Double-tie circular mirroring of 6:7:8:9"},"dkring4":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,299.00064605783,327.03195662575,336.37572681506,367.91095120397,373.75080757229,378.42269266694,420.46965851882,467.18850946536,470.92601754108,523.2511306012],"description":"Double-tie circular mirroring of 7:8:9:10"},"dodeceny":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,306.59245933664,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,436.04260883433,441.49314144476,490.54793493862,523.2511306012],"description":"Degenerate eikosany 3)6 from 1.3.5.9.15.45 tonic 1.3.15"},"dorian_chrom":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,310.07474405997,315.92521092903,322.00069575458,348.83408706747,380.54627680087,398.6675280771,408.39112632289,418.60090448096,465.11211608996,523.2511306012,558.13453930795,598.00129211566,620.14948811994,631.85042185805,644.00139150917,697.66817413493,761.09255360175,797.33505615421,816.78225264578,837.20180896192,930.22423217991,1046.5022612024],"description":"Dorian Chromatic Tonos"},"dorian_chrom2":{"frequencies":[261.6255653006,274.08392555301,287.78812183066,359.73515228832,411.12588832951,426.35277308246,442.75095666255,523.2511306012],"description":"Schlesinger's Dorian Harmonia in the chromatic genus"},"dorian_chrominv":{"frequencies":[261.6255653006,273.00058987889,285.40970760065,332.97799220076,380.54627680087,404.33041910093,428.11456140098,523.2511306012],"description":"A harmonic form of Schlesinger's Chromatic Dorian inverted"},"dorian_diat":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,322.00069575458,334.88072358477,348.83408706747,364.00078650518,380.54627680087,418.60090448096,440.63253103259,465.11211608996,492.47165233054,523.2511306012,558.13453930795,598.00129211566,644.00139150917,669.76144716954,697.66817413493,728.00157301037,761.09255360175,837.20180896192,881.26506206518,930.22423217991,984.94330466108,1046.5022612024],"description":"Dorian Diatonic Tonos"},"dorian_diat2":{"frequencies":[261.6255653006,287.78812183066,319.76457981184,359.73515228832,383.71749577421,411.12588832951,442.75095666255,479.64686971777,523.2511306012],"description":"Schlesinger's Dorian Harmonia, a subharmonic series through 13 from 22"},"dorian_diat2inv":{"frequencies":[261.6255653006,285.40970760065,309.19384990071,332.97799220076,356.76213450082,380.54627680087,428.11456140098,475.68284600109,523.2511306012],"description":"Inverted Schlesinger's Dorian Harmonia, a harmonic series from 11 from 22"},"dorian_diatcon":{"frequencies":[261.6255653006,287.78812183066,319.76457981184,359.73515228832,383.71749577421,411.12588832951,479.64686971777,523.2511306012],"description":"A Dorian Diatonic with its own trite synemmenon replacing paramese"},"dorian_diatred11":{"frequencies":[261.6255653006,287.78812183066,316.56693401373,348.83408706747,392.4383479509,431.68218274599,474.85040102059,523.2511306012],"description":"Dorian mode of a diatonic genus with reduplicated 11/10"},"dorian_enh":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,304.4370214407,307.2300216374,310.07474405997,348.83408706747,380.54627680087,389.39619021485,393.97732186443,398.6675280771,465.11211608996,523.2511306012,558.13453930795,598.00129211566,608.8740428814,614.4600432748,620.14948811994,697.66817413493,761.09255360175,778.79238042969,787.95464372887,797.33505615421,930.22423217991,1046.5022612024],"description":"Dorian Enharmonic Tonos"},"dorian_enh2":{"frequencies":[261.6255653006,267.70988077271,274.08392555301,359.73515228832,411.12588832951,426.35277308246,442.75095666255,523.2511306012],"description":"Schlesinger's Dorian Harmonia in the enharmonic genus"},"dorian_enhinv":{"frequencies":[261.6255653006,267.19206668997,273.00058987889,332.97799220076,380.54627680087,392.4383479509,404.33041910093,523.2511306012],"description":"A harmonic form of Schlesinger's Dorian enharmonic inverted"},"dorian_pent":{"frequencies":[261.6255653006,271.49822814213,287.78812183066,359.73515228832,411.12588832951,423.21782622156,442.75095666255,523.2511306012],"description":"Schlesinger's Dorian Harmonia in the pentachromatic genus"},"dorian_pis":{"frequencies":[261.6255653006,299.00064605783,322.00069575458,348.83408706747,380.54627680087,418.60090448096,465.11211608996,523.2511306012,558.13453930795,598.00129211566,644.00139150917,697.66817413493,761.09255360175,837.20180896192,930.22423217991,1046.5022612024],"description":"Diatonic Perfect Immutable System in the Dorian Tonos, a non-rep. 16 tone gamut"},"dorian_schl":{"frequencies":[261.6255653006,274.08392555301,287.78812183066,302.93486508491,319.76457981184,338.57426097725,359.73515228832,383.71749577421,411.12588832951,442.75095666255,460.46099492906,479.64686971777,523.2511306012],"description":"Schlesinger's Dorian Piano Tuning (Sub 22)"},"dorian_tri1":{"frequencies":[261.6255653006,269.80136421624,278.50463402967,359.73515228832,411.12588832951,421.15334902048,431.68218274599,523.2511306012],"description":"Schlesinger's Dorian Harmonia in the first trichromatic genus"},"dorian_tri2":{"frequencies":[261.6255653006,269.80136421624,287.78812183066,359.73515228832,411.12588832951,421.15334902048,442.75095666255,523.2511306012],"description":"Schlesinger's Dorian Harmonia in the second trichromatic genus"},"douwes":{"frequencies":[261.6255653006,273.00058987889,292.50063201309,313.39353429974,327.01933943691,350.37786403433,365.61168556196,391.72680409,408.75840577964,436.81779569448,468.01906681552,488.36772189445,523.2511306012],"description":"Claas Douwes recommendation of 24/23 and 15/14 steps for clavichord (1699)"},"dow_high":{"frequencies":[261.6255653006,277.01530443593,278.50463402967,294.32876096318,308.34441624714,313.31771328338,327.34193952303,331.11985608357,346.88746827803,348.83408706747,369.35373924791,392.4383479509,417.75695104451,441.49314144476,462.5166243707],"description":"Highest octave of Dowlands lute tuning, strings 5,6. 1/1=G (1610)"},"dow_lmh":{"frequencies":[261.6255653006,278.50463402967,294.32876096318,308.34441624714,327.34193952303,348.83408706747,369.35373924791,371.33951203956,392.4383479509,411.12588832951,417.75695104451,436.45591936403,441.49314144476,462.5166243707,465.11211608996,492.47165233054,495.11934938608,523.2511306012,548.16785110602,557.00926805934,581.94122581871,588.65752192635,616.68883249427,620.14948811994,626.63542656676,656.62886977405,662.23971216714,693.77493655606,697.66817413493,736.51936392681,742.67902407912,784.8766959018,822.25177665903,831.04591330779,835.51390208901,882.98628288953,925.03324874141,939.95313985014,982.02581856908,993.35956825072,1040.66240483408,1046.5022612024,1108.06121774372,1114.01853611868,1177.3150438527,1233.37766498854,1253.27085313352,1309.3677580921,1324.47942433429,1387.54987311211,1395.33634826987,1477.41495699162,1569.7533918036,1671.02780417803,1765.97256577905,1850.06649748281],"description":"All three octaves of Dowland's lute tuning"},"dow_low":{"frequencies":[261.6255653006,278.50463402967,294.32876096318,308.34441624714,327.34193952303,348.83408706747,369.35373924791,371.33951203956,392.4383479509,411.12588832951,417.75695104451,436.45591936403,441.49314144476,462.5166243707,465.11211608996,492.47165233054,495.11934938608,523.2511306012],"description":"Lowest octave of Dowlands lute tuning, strings 1,2,3. 1/1=G. (1610)"},"dow_middle":{"frequencies":[261.6255653006,274.08392555301,278.50463402967,290.97061290936,294.32876096318,308.34441624714,310.07474405997,313.31771328338,328.31443488703,331.11985608357,346.88746827803,348.83408706747,368.2596819634,371.33951203956,392.4383479509,411.12588832951,415.52295665389,417.75695104451,441.49314144476,462.5166243707,469.97656992507,491.01290928454,496.67978412536,520.33120241704,523.2511306012],"description":"Middle octave of Dowlands lute tuning, strings 3,4,5. 1/1=G (1610)"},"dowland_12":{"frequencies":[261.6255653006,278.50463402967,294.32876096318,308.34441624714,327.34193952303,348.83408706747,369.35373924791,392.4383479509,417.75695104451,441.49314144476,462.5166243707,492.47165233054,523.2511306012],"description":"subset of Dowland's lute tuning, lowest octave"},"druri":{"frequencies":[261.6255653006,285.79952600623,326.97270111135,357.18467683857,523.2511306012],"description":"Scale of druri dana of Siwoli, south Nias, Jaap Kunst"},"dudon_a":{"frequencies":[261.6255653006,285.85015468029,319.76457981184,348.83408706747,392.4383479509,428.77523202043,479.64686971777,523.2511306012],"description":"Dudon Tetrachord A"},"dudon_b":{"frequencies":[261.6255653006,283.42769574232,321.58142401532,348.83408706747,392.4383479509,425.14154361347,482.37213602298,523.2511306012],"description":"Dudon Tetrachord B"},"dudon_c12":{"frequencies":[261.6255653006,302.50455987882,327.03195662575,343.38355445704,392.4383479509,425.14154361347,474.19633710734,523.2511306012],"description":"Differentially coherent scale in interval class 1 and 2"},"dudon_diat":{"frequencies":[261.6255653006,294.32876096318,321.08592105074,350.8160989258,392.4383479509,428.11456140098,481.6288815761,523.2511306012],"description":"Dudon Neutral Diatonic"},"dudon_moha_baya":{"frequencies":[261.6255653006,285.30470202322,320.24370022528,349.22823143301,391.99543598175,427.47405410759,466.16376151809,523.2511306012],"description":"Mohajira + Bayati (Dudon) 3 + 4 + 3 Mohajira and 3 + 3 + 4 Bayati tetrachords"},"dudon_mohajira":{"frequencies":[261.6255653006,285.30470202322,320.24370022528,349.22823143301,391.99543598175,427.47405410759,479.82340237272,523.2511306012],"description":"Dudon's Mohajira, two 3 + 4 + 3 tetrachords, neutral diatonic"},"dudon_mohajira_r":{"frequencies":[261.6255653006,283.42769574232,321.58142401532,348.83408706747,392.4383479509,425.14154361347,479.64686971777,523.2511306012],"description":"Jacques Dudon, JI Mohajira, Lumi�res audibles"},"dudon_thai":{"frequencies":[261.6255653006,288.26147859917,317.63518509943,350.43752981487,386.47021463976,426.17461277719,469.97930400405,523.2511306012],"description":"Dudon, coherent Thai heptatonic scale, 1/1 vol. 11/2, 2003"},"dudon_thai2":{"frequencies":[261.6255653006,288.02814528506,314.43072526953,347.1339209321,383.13743909274,422.44127975143,475.35895071461,523.2511306012],"description":"Slightly better version, 3.685 cents deviation"},"dudon_thai3":{"frequencies":[261.6255653006,291.60349465796,321.58142401532,354.2846196779,394.48229767981,434.67997568173,478.96555314146,523.2511306012],"description":"Dudon, Thai scale with two 704/703 = 2.46 c. deviations and simpler numbers"},"duncan":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Dudley Duncan's Superparticular Scale"},"duoden12":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,310.42486507835,330.74639366397,348.83408706747,372.08969287196,392.4383479509,413.89982010446,440.99519155196,465.63729761752,496.11959049595,523.2511306012],"description":"Almost equal 12-tone subset of Duodenarium"},"duodenarium":{"frequencies":[14.56761754744,14.73307690724,14.74971276678,14.91724036858,14.98726085128,15.00418372272,15.10370587319,15.17460161192,15.19173601925,15.34695511171,15.36428413207,15.5387920506,15.55633768372,15.71528203439,15.73302695124,15.80687667908,15.91172305982,15.92968978813,16.00446263757,16.18624171938,16.20451842054,16.38856974087,16.57471152064,16.59342686263,16.78189541465,16.86066845769,16.87970668806,16.99166910733,17.07142681341,17.26532450067,17.28481964857,17.48114105693,17.67969228869,17.69965532014,17.78273626396,17.90068844229,17.98471302153,18.00502046726,18.2095219343,18.41634613405,18.43714095848,18.64655046072,18.73407606409,18.85833844126,18.87963234148,18.9682520149,18.98967002407,19.18369388963,19.20535516508,19.42349006325,19.44542210465,19.64410254298,19.66628368904,19.88965382477,19.91211223516,20.00557829696,20.13827449758,20.23280214922,20.25564802567,20.48571217609,20.7183894008,20.74178357829,20.97736926831,21.07583557211,21.21563074642,21.23958638417,21.33928351676,21.58165562584,21.60602456072,21.85142632116,22.09961536086,22.12456915017,22.37586055287,22.48089127691,22.50627558408,22.65555880978,22.76190241787,23.02043266756,23.0464261981,23.3081880759,23.57292305158,23.59954042685,23.71031501862,23.86758458973,23.97961736204,24.00669395635,24.27936257907,24.30677763081,24.55512817873,24.5828546113,24.86206728096,24.89014029395,25.14445125502,25.17284312198,25.29100268653,25.31956003209,25.487503661,25.60714022011,25.897986751,25.92722947286,26.22171158539,26.51953843303,26.54948298021,26.67410439595,26.85103266344,26.9770695323,27.0075307009,27.31428290145,27.62451920107,27.65571143772,27.96982569108,28.10111409614,28.2875076619,28.31944851222,28.45237802234,28.77554083445,28.80803274762,29.13523509488],"description":"Ellis's Duodenarium : genus [3^12 5^8]"},"duodene":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Ellis's Duodene : genus [33355]"},"duodene14-18-21":{"frequencies":[261.6255653006,271.31540105247,294.32876096318,305.22982618403,336.37572681506,348.83408706747,378.42269266694,392.4383479509,406.97310157871,448.50096908674,457.84473927605,504.56359022259,523.2511306012],"description":"14-18-21 Duodene"},"duodene3-11_9":{"frequencies":[261.6255653006,285.40970760065,294.32876096318,319.76457981184,321.08592105074,348.83408706747,359.73515228832,392.4383479509,426.35277308246,428.11456140098,479.64686971777,481.6288815761,523.2511306012],"description":"3-11/9 Duodene"},"duodene3-7":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,305.22982618403,336.37572681506,343.38355445704,348.83408706747,392.4383479509,398.6675280771,448.50096908674,457.84473927605,515.07533168556,523.2511306012],"description":"3-7 Duodene"},"duodene6-7-9":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,305.22982618403,336.37572681506,343.38355445704,348.83408706747,392.4383479509,406.97310157871,448.50096908674,457.84473927605,504.56359022259,523.2511306012],"description":"6-7-9 Duodene"},"duodene_min":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,313.95067836072,327.03195662575,348.83408706747,353.19451315581,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Minor Duodene"},"duodene_r-45":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,334.88072358477,353.19451315581,376.74081403286,401.85686830172,408.78994578219,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Ellis's Duodene rotated -45 degrees"},"duodene_r45":{"frequencies":[261.6255653006,275.93321340298,279.06726965397,294.32876096318,313.95067836072,334.88072358477,383.2405741708,408.78994578219,436.04260883433,459.88868900496,465.11211608996,490.54793493862,523.2511306012],"description":"Ellis's Duodene rotated 45 degrees"},"duodene_r90":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,306.59245933664,313.95067836072,327.03195662575,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,490.54793493862,523.2511306012],"description":"Ellis's Duodene rotated 90 degrees: genus [33555]"},"duodene_skew":{"frequencies":[261.6255653006,282.55561052465,290.69507255622,313.95067836072,327.03195662575,348.83408706747,376.74081403286,392.4383479509,418.60090448096,436.04260883433,470.92601754108,502.32108537715,523.2511306012],"description":"Rotated 6/5x3/2 duodene"},"duodene_t":{"frequencies":[261.6255653006,279.3825857701,293.66476791741,313.59634948548,327.03195662575,349.22823143301,367.08095907728,391.99543598175,418.60090448096,436.53528831673,469.86362971679,489.99429388332,523.2511306012],"description":"Duodene with equal tempered fifths"},"duowell":{"frequencies":[261.6255653006,278.41172412276,294.03623226919,312.90189200955,327.96500300935,349.00756672938,368.59392213143,392.24328034087,417.4100028405,437.50413894442,469.11953885575,491.70297432358,523.2511306012],"description":"Ellis duodene well-tuned to fifth=(7168/11)^(1/16) third=(11/7)^(1/2)"},"dwarf6_7":{"frequencies":[261.6255653006,299.00064605783,327.03195662575,373.75080757229,392.4383479509,448.50096908674,523.2511306012],"description":"Dwarf(<6 10 14 17|)"},"cairo":{"frequencies":[261.6255653006,269.38381929633,276.03456984659,285.15047989166,293.63138642043,300.85736580106,309.799366845,312.20234522745,320.03127253896,327.93377450564,337.66851484331,348.83408706747,357.41197445437,367.9166999024,380.21445327801,392.4383479509,401.02017979859,414.62054722758,417.26565438692,427.77234352616,440.44707963064,451.93568025669,468.86302025197,480.04690880844,491.77737838459,510.98743222773,523.2511306012],"description":"P.42, of d'Erlanger, vol.5. Congress of Arabic Music, Cairo, 1932"},"canright":{"frequencies":[261.6255653006,286.48426603331,306.03443598155,335.11270457212,357.98136125932,391.99543598175,418.74586628806,458.53356119912,489.82466832727,523.2511306012],"description":"David Canright's piano tuning for \"Fibonacci Suite\" (2001)"},"carlos_alpha":{"frequencies":[261.6255653006,273.68256372566,286.29520819723,299.48910562989,313.29104303136,327.729041887,342.83241505062,358.63182625716,375.1593523779,392.44854854484,410.5345162762,429.45397474154,449.24533531117,469.94877954106,491.60634075178,514.26198936695,537.96172218451,562.75365576207,588.68812410589],"description":"Wendy Carlos' Alpha scale with perfect fifth divided in nine"},"carlos_alpha2":{"frequencies":[261.6255653006,267.58616452957,273.68256372566,279.91785681123,286.29520819723,292.81785438923,299.48910562989,306.31234757893,313.29104303136,320.42873367481,327.729041887,335.19567257401,342.83241505062,350.6431449633,358.63182625716,366.8025131876,375.1593523779,383.7065849236,392.44854854484,401.3896797878,410.5345162762,419.88769901416,429.45397474154,439.23819834286,449.24533531117,459.48046426806,469.94877954106,480.6555937997,491.60634075178,502.8065779009,514.26198936695,525.97838877075,537.96172218451,550.21807114943,562.75365576207,575.57483783111,588.68812410589],"description":"Wendy Carlos' Alpha prime scale with perfect fifth divided by eightteen"},"carlos_beta":{"frequencies":[261.6255653006,271.44693432634,281.63699549204,292.20958942356,303.17907632096,314.56035546319,326.36888544505,338.62070517372,351.33245565363,364.52140258903,378.2054598351,392.40321372938,407.13394833666,422.41767164147,438.27514272393,454.72789995564,471.7982902542,489.50949943583,507.88558370741,526.95150234083,546.73315157381,567.25739978343,588.55212398003],"description":"Wendy Carlos' Beta scale with perfect fifth divided by eleven"},"carlos_beta2":{"frequencies":[261.6255653006,266.49100855797,271.44693432634,276.49502530642,281.63699549204,286.87459075215,292.20958942356,297.64380291476,303.17907632096,308.81728905054,314.56035546319,320.41022551991,326.36888544505,332.43835840072,338.62070517372,344.91802487526,351.33245565363,357.86617542024,364.52140258903,371.30039682974,378.2054598351,385.23893610237,392.40321372938,399.70072522531,407.13394833666,414.70540688852,422.41767164147,430.27336116448,438.27514272393,446.42573318931,454.72789995564,463.18446188312,471.7982902542,480.57230974851,489.50949943583,498.61289378764,507.88558370741,517.33071758003,526.95150234083,536.75120456442,546.73315157381,556.90073257014,567.25739978343,577.80666964473,588.55212398003],"description":"Wendy Carlos' Beta prime scale with perfect fifth divided by twentytwo"},"carlos_gamma":{"frequencies":[261.6255653006,266.98388983977,272.45195763676,278.03201633122,283.72635959645,289.53732808222,295.4673103769,301.51874398927,307.69411635045,313.99596583639,320.42688281121,326.98951069203,333.68654703547,340.52074464653,347.49491271011,354.6119179457,361.87468578579,369.2862015783,376.84951181374,384.56772537748,392.44401482761,400.48161769905,408.68383783428,417.05404674148,425.59568498025,434.31226357598,443.20736546293,452.28464695708,461.547839259,471.00074998758,480.64726474513,490.49134871455,500.53704828923,510.78849273629,521.24989589392,531.92555790347],"description":"Wendy Carlos' Gamma scale with third divided by eleven or fifth by twenty"},"carlos_harm":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,392.4383479509,425.14154361347,441.49314144476,457.84473927605,490.54793493862,523.2511306012],"description":"Carlos Harmonic & Ben Johnston's scale of 'Blues' from Suite f.micr.piano (1977) & David Beardsley's scale of 'Science Friction'"},"carlos_super":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,313.95067836072,327.03195662575,348.83408706747,359.73515228832,392.4383479509,425.14154361347,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Carlos Super Just"},"carlson":{"frequencies":[261.6255653006,274.70684356563,286.15296204753,294.32876096318,305.22982618403,313.95067836072,327.03195662575,339.14425131559,348.83408706747,366.27579142084,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,457.84473927605,470.92601754108,490.54793493862,508.71637697339,523.2511306012],"description":"Brian Carlson's guitar scale (or 7 is 21/16 instead) fretted by Mark Rankin"},"cassandra1":{"frequencies":[261.6255653006,265.52313139125,271.43629763673,275.48001908354,279.58398024378,283.7490817683,290.06813927787,294.38942683035,298.7750924519,305.42877739024,309.97889991383,314.59680966486,319.28351286859,326.39391783308,331.25637026535,336.19125912653,343.67819754196,348.79814248043,353.99435973883,359.26798967332,367.26884406885,372.74022844163,378.29312490007,386.71766674112,392.47878977853,398.32574139651,407.19640716832,413.26261206104,419.41919061043,425.66748431192,435.14704737009,441.62964923022,448.20882304357,458.19037897128,465.01626879626,471.9438445688,478.97462660712,489.64133323501,496.93576068834,504.33885972365,515.57042175735,523.2511306012],"description":"Cassandra temperament (Erv Wilson), 13-limit, g=497.866"},"cassandra2":{"frequencies":[261.6255653006,265.34593985135,270.18130909623,275.10479273152,279.0168449367,284.10133754875,289.27848429833,293.3920895946,298.7385406747,304.18241953205,309.72550158209,314.12986807617,319.85422136322,325.68288889698,330.31417303802,336.33345109576,342.46241778116,348.70307193775,353.66170827405,360.10644584283,366.66862514012,371.88273569526,378.65951299923,385.5597827545,392.58579535013,398.16845391153,405.42423290482,412.81223314336,418.68251621245,426.31212065787,434.08075852776,440.25348482514,448.27617460765,456.44506096456,464.76280801961,471.37183998139,479.96159605313,488.70788228454,495.65741860341,504.6897280454,513.8866322474,523.2511306012],"description":"Cassandra temperament, schismic variant, 13-limit, g=497.395"},"catler":{"frequencies":[261.6255653006,269.80136421624,279.06726965397,294.32876096318,299.00064605783,305.22982618403,313.95067836072,318.93402246168,322.00069575458,327.03195662575,343.38355445704,348.83408706747,359.73515228832,367.91095120397,380.54627680087,392.4383479509,418.60090448096,425.14154361347,436.04260883433,441.49314144476,457.84473927605,465.11211608996,483.00104363188,490.54793493862,523.2511306012],"description":"Catler 24-tone JI from \"Over and Under the 13 Limit\", 1/1 3(3)"},"cbrat19":{"frequencies":[261.6255653006,272.05448646742,281.65887246066,291.7164960911,303.76422848609,314.23522436032,325.78124145721,339.14379232251,350.05979530932,364.18597952318,377.95660802413,389.93691761381,406.2330981776,420.87727247778,436.65546295526,454.14747622901,467.92430113657,486.684954898,506.27371414348,523.2511306012],"description":"brats = -1 -1 -1 -1 -1 -1 -1 -1 0 3/7 390808/591947 1/2 1/2 1/2 1/2 1/4 0 0 -1"},"ceb88f":{"frequencies":[261.6255653006,275.30280934529,289.60851057007,304.80308899558,320.69584574771,337.31885569235,354.97473368038,373.44187862432,393.05647479461,413.57234190108,435.03089105397,457.82276134277,481.66189358475,506.59641128799],"description":"88 cents steps with equal beating fifths"},"ceb88s":{"frequencies":[261.6255653006,275.27750547448,289.60710371138,304.74878776577,320.64207659236,337.32428016541,354.95189689869,373.45451504132,392.8755714351,413.39725679488,434.93759942207,457.54716438978,481.43806014345,506.51485544552,533.01280425363],"description":"88 cents steps with equal beating sevenths"},"ceb88t":{"frequencies":[261.6255653006,275.20384442973,289.60910777612,304.54100616185,320.3823320487,337.18847246966,354.60902163481,373.09056856306,392.69773188536,413.02170471677,434.58350960486,457.45853552679,481.16983689269,506.32527343025,533.01280425363],"description":"88 cents steps with equal beating 7/6 thirds"},"cet105":{"frequencies":[261.6255653006,277.98437592617,295.36606150822,313.83458334354,333.45789502888,354.30820661869,376.46223533368,400.00150378562,425.01262301844,451.58762919357,479.82430313337,509.82655042708,541.70476218406,575.57624366132],"description":"Equal temperament with very good 6/5 and 13/8"},"cet105a":{"frequencies":[261.6255653006,278.09098920184,295.59266404146,314.19580976213,333.96974580612,354.98815389674,377.32935907335,401.07660961589,426.31839262878,453.14877154631,481.66772230429,511.98151233648,544.20310589723,578.45256778249,614.85751848055,653.5536209391,694.68506540856,738.40511604959,784.8766959018],"description":"18th root of 3"},"cet111":{"frequencies":[261.6255653006,279.02234237845,297.57591715819,317.3632108372,338.46625752841,360.97255206362,384.97540137331,410.57431878206,437.87543474729,466.99193686517,498.04453913461,531.16197935691,566.48156495049,604.14972437838,644.32262592407,687.16682227215,732.8599410185,781.59142109591,833.56329335333,888.99103711409,948.10444554232,1011.14859670036,1078.38486510237,1150.09200534594,1226.56730779978,1308.127826503],"description":"25th root of 5, Karlheinz Stockhausen in \"Studie II\" (1954)"},"cet111a":{"frequencies":[261.6255653006,279.09119608948,297.72279782842,317.59821198502,338.80046946076,361.41815173468,385.54574794778,411.2840547398,438.74060487161,468.03009995854,499.27490936609,532.60556349815,568.16130614457,606.09068659426,646.55215742719,689.71476370538,735.75882016749,784.8766959018],"description":"17th root of 3. McLaren 'Microtonal Music', volume 1, track 8"},"cet112":{"frequencies":[261.6255653006,279.13807488234,297.82282461384,317.75828292395,339.02816520012,361.72179601836,385.93447726538,411.76789245756,439.33052439618,468.73812456399,500.11419015728,533.59048802364,569.30759588159,607.4155105893,648.07426630787,691.45461344743,737.73872000797,787.12095980595,839.80871352279,896.02324851892,956.00062766807,1019.99273078287,1088.26829265547,1161.11404316696,1238.83588500259,1321.76021726874,1410.23528064063,1504.63263477595,1605.34868446028,1712.8063948195,1827.45703443292,1949.78208984359,2080.29524321777,2219.54459500735,2368.11492276755,2526.63016208001,2695.75596930795,2876.20260183901,3068.72784518,3274.14022786751,3493.30234242079,3727.13457771193,3976.61891204907,4242.80307922676,4526.8048719912,4829.81697864182,5153.11189830808,5498.04733953642,5866.07179694692,6258.73081875602,6677.6733762505,7124.65885956048,7601.56430418436,8110.3925243186],"description":"53rd root of 31. McLaren 'Microtonal Music', volume 4, track 16"},"cet114":{"frequencies":[261.6255653006,279.47933554513,298.55147893584,318.92513586406,340.68912750315,363.93832870511,388.77409689134,415.30469757995,443.64579124771,473.92093172942,506.26209616971,540.81027939262,577.71608583803,617.1404103833,659.25511382574,704.24379572788,752.30258557703,803.64098403142,858.48280642307,917.06712239825,979.64933665453,1046.5022612024],"description":"21st root of 4"},"cet115":{"frequencies":[261.6255653006,279.68949451567,299.00064605783,319.64513593742,341.71502406609,365.30872604057,390.53145607553,417.49568846357,446.32166408632,477.13792869952,510.08190181294],"description":"2nd root of 8/7. Werner Linden, Musiktheorie, 2003 no.1 midi 15.Eb=19.44544 Hz"},"cet117":{"frequencies":[261.6255653006,279.86396690685,299.37379946195,320.24370022528,342.56848033562,366.44956000397,391.99543598175,419.32216217931,448.5538823653,479.82340237272,513.27277840175,549.0539690723,587.32953583482,628.27336308449,672.07145630843,718.92279942609,769.0402362475,822.65144744826,880,941.34642612261,1006.96941915374,1077.1671181081,1152.25842837255,1232.58448551457,1318.51022765149,1410.42601205207,1508.74940691646,1613.92711604023,1726.4369576214,1846.79005749489,1975.53320502451,2113.25127526858,2260.56991361642,2418.15841952625,2586.73271138559,2767.05861265008,2959.95538169309],"description":"72nd root of 128, step = generator of Miracle"},"cet118":{"frequencies":[261.6255653006,280.22072913446,300.13755324878,321.46997343155,344.3186075731,368.79121945838,395.0032340925,423.07827792492,453.14877154631,485.35654007358,519.85349135637,556.8023269521,596.37732215892,638.76512932755,684.16567043124,732.79307276157,784.8766959018],"description":"16th root of 3. McLaren 'Microtonal Music', volume 1, track 7"},"cet126":{"frequencies":[261.6255653006,281.50639381697,302.89795903081,325.91506125677,350.68122444233,377.32935907335,406.00247545366,436.85445118639,470.05085697597,505.76984518255,544.20310589723,585.55689566922,630.05314440547,677.93064638327,729.44634176744,784.8766959018],"description":"15th root of 3. McLaren 'Microtonal Music', volume 1, track 6"},"cet126a":{"frequencies":[261.6255653006,281.42815779395,302.72962012827,325.64340264099,350.29154279212,376.80531512858,405.32593044476,436.00528786292,469.00678383895,504.50618240233,542.69254813034,583.76926541313,627.95510352048,675.48539363125,726.61327927927,781.61106458091,840.77166451082,904.41016494992,972.86550081423,1046.5022612024],"description":"19th root of 4"},"cet133":{"frequencies":[261.6255653006,282.54488373859,305.13688994853,329.53533037111,355.88464567857,384.34082587483,415.07233376839,448.26110228542,484.10361152681,522.81205194575,564.61558053174,609.76167743791,658.5176110828,711.17202040031],"description":"13th root of e"},"cet140":{"frequencies":[261.6255653006,283.72172983292,307.68407293041,333.67021037701,361.85106232365,392.4119924075,425.55401329039,461.49511402661,500.47170241421,542.7401414615,588.57845795114,638.28815062634,692.19618110881,750.65713728047,814.05554253056,882.80839491877,957.36792629418,1038.22454144983,1125.91008648826,1221.00130775733,1324.12366033919,1435.95544645068,1557.23222387914,1688.75170820144,1831.3789571042],"description":"24th root of 7"},"cet141":{"frequencies":[261.6255653006,283.85429714132,307.97166902637,334.13814720468,362.52783176564,393.32961502355,426.7484383229,463.0066556268,502.34551296122,545.02675670673,591.33436279611,641.57644431325,696.08728968715,755.22958979995,819.39685117042,889.01601417107,964.55029369918,1046.5022612024],"description":"17th root of 4"},"cet146":{"frequencies":[261.6255653006,284.69629445872,309.80145226022,337.12043918596,366.84847565362,399.19799705513,434.40017432099,472.70655602525,514.39088038704,559.75102196641,609.11112257023,662.82390755693,721.27320639821,784.8766959018],"description":"13th root of 3, Bohlen-Pierce approximation"},"cet148":{"frequencies":[261.6255653006,284.92791524313,310.30575035912,337.94392545772,368.04376529149,400.82452432448,436.52498800167,475.40520223986,517.74838217475,563.86296895784,614.08486606944,668.77990486322,728.34649714081,793.21854485147,863.86858278563,940.81124699851,1024.60701225804,1115.86625569541,1215.25373699679,1323.49342609599,1441.37375222579,1569.7533918036],"description":"21th root of 6, Moreno's C-21"},"cet152":{"frequencies":[261.6255653006,285.70808394691,312.0073878821,340.72733440875,372.0911362405,406.34196228781,443.74556186468,484.59214639302,529.19833545193,577.91081034511,631.10724720728,689.20039277289,752.64098693245,821.92125998587],"description":"13th root of pi"},"cet158":{"frequencies":[261.6255653006,286.70831230381,314.19580976213,344.3186075731,377.32935907335,413.50494015483,453.14877154631,496.5933637384,544.20310589723,596.37732215892,653.5536209391,716.21156534988,784.8766959018],"description":"12th root of 3, Moreno's A-12, see dissertation \"Embedding Equal Pitch Spaces."},"cet159":{"frequencies":[261.6255653006,286.82842069679,314.45911373416,344.75151869218,377.96204482418,414.37180231943,454.28897403052,498.05144066897,546.02962057131],"description":"4e-th root of e. e-th root of e is highest x-th root of x"},"cet160":{"frequencies":[261.6255653006,286.95745534843,314.74210513576,345.21700307457,378.64263238751,415.30469757995,455.51656649021,499.62194879119,547.99783383788,601.05771297194,659.25511382574,723.0874768355,793.10040709753,869.89233791055,954.11964586525,1046.5022612024],"description":"15th root of 4, Rudolf Escher in \"The Long Christmas Dinner\" (1960)"},"cet160a":{"frequencies":[261.6255653006,287.06963246392,314.98822873932,345.62201499981,379.23505183234,416.11708252541,456.58602635137,500.99072933585,549.71395617638,603.17569602575,661.83679400878,726.20290371434,796.8288589228,874.32344802967,959.35468153537,1052.65552131526,1155.03021091382,1267.36122959081,1390.6168610076,1525.85955590014,1674.2551187631,1837.08270650821,2015.74588766663,2211.78472029595,2426.88907720145,2662.91313932742,2921.89140956529,3206.0563044734,3517.85730085803,3859.98211320646,4235.37982185266,4647.28638964387,5099.2524155536,5595.17379976366,6139.32543031277,6736.39784717273,7391.53779523322,8110.3925243186],"description":"37th root of 31. McLaren 'Microtonal Music', volume 2, track 7"},"cet163":{"frequencies":[261.6255653006,287.45276480522,315.82957660097,347.00769742017,381.26366336311,418.90131810157,460.25449359467,505.68997636603,555.61077020009,610.45965236807],"description":"9th root of 7/3. Jeff Scott in \"Quiet Moonlight\" (2001)"},"cet163a":{"frequencies":[261.6255653006,287.41152361975,315.7389582221,346.85836204295,381.04491126651,418.60090448096,459.85843616195,505.18233428314,554.97338050766],"description":"5th root of 8/5"},"cet166":{"frequencies":[261.6255653006,287.95619440582,316.93680165166,348.83408706747],"description":"3rd root of 4/3"},"cet173":{"frequencies":[261.6255653006,289.10449173793,319.46957112932,353.02394045842,390.10257564198,431.07563562091,476.35215768611,526.38414093011,581.67105858963,642.7648443263,710.27540222401,784.8766959018],"description":"11th root of 3, Moreno's A-11"},"cet175":{"frequencies":[261.6255653006,289.48414624674,320.30918244523,354.41654988346,392.15575985798,433.91353804458,480.11779720922,531.2420078798,587.8100594825,650.40162657281,719.65810898332,796.28920449429,881.08018137935,974.89992535123,1078.70983713651,1193.57370864212,1320.66858845324,1461.29686662697,1616.89961515233,1789.07135516847,1979.57639663535,2190.36691789568,2423.60297039629,2681.67459807517,2967.22638952895,3283.18448966052,3632.78664249769,4019.61535560076,4447.6346101102],"description":"28th root of 7. McLaren 'Microtonal Music', volume 6, track 3"},"cet175a":{"frequencies":[261.6255653006,289.53628281337,320.42456924675,354.60807736883,392.4383479509,434.30442400296,480.63685362987,531.91211578736],"description":"4th root of 3/2"},"cet178":{"frequencies":[261.6255653006,289.91935960089,321.27301846367,356.01745236555,394.51936464224,437.18511000944,484.46499093218,536.85800524663,594.91712478053,659.25511382574,730.5510078664,809.55727745129,897.10776473059,994.12650420781,1101.63744560301,1220.77528002516,1352.79740322961,1499.09721690784,1661.21879031979,1840.87318566558,2039.95650991293,2260.56991361642,2505.04181781964,2775.9524141353,3076.16094499002,3408.83584914421,3777.48827884202,4186.0090448096],"description":"27th root of 16"},"cet181":{"frequencies":[261.6255653006,290.48091212946,322.51878830959,358.09020513941,397.58488163802,441.43552612833,490.12256936272,544.17943316245,604.19836236377,670.83693141722,744.82523718317,826.97390553231,918.18295398723,1019.45167961503,1131.88958971281,1256.72856920928,1395.33634826987],"description":"6.625 tET. The 16/3 is the so-called Kidjel Ratio promoted by Maurice Kidjel in 1958"},"cet182":{"frequencies":[261.6255653006,290.70585738945,323.0184918031,358.92275093366,398.81785224951,443.14738973192,492.40425618917,547.1361382945,607.95159681319,675.52683545966,750.61321956915,834.04563048717,926.75174856904,1029.76237395443,1144.22286477952,1271.40590625444,1412.7256395721,1569.7533918036],"description":"17th root of 6, Moreno's C-17"},"cet195":{"frequencies":[261.6255653006,292.81795587218,327.72927094457,366.80289667873,410.53509014096,459.48126579586,514.26306468681,575.57624366132],"description":"7th root of 11/5"},"cet21k":{"frequencies":[261.6255653006,264.89588486686,268.20708342769,271.55967197054,274.95416787017,278.3910952928,281.87098404962,285.39437141672,288.96180112674,292.57382370898,296.23099657435,299.9338841014,303.68305772341,307.47909424051,311.32258299104,315.21411535185,319.1542918681,323.14372059172,327.18301717534,331.2728049672,335.41371510742,339.60638662537,343.85146653829,348.14960995112,352.50148015762,356.90774874273,361.36909568619,365.8862094675,370.45978717215,375.09053459917,379.77916637013,384.52640603933,389.33298620552,394.19964862491,399.1271443257,404.11623372391,409.16768674077,414.28228292154,419.46080913287,424.70406934596,430.01287031296,435.38803129329,440.83038178715,446.34076166346,451.92002128953,457.56902166224,463.28863454093,469.07974258197,474.94323947488,480.88003008033,486.89103056976,492.97716856672,499.13938329007,505.37862569893,511.69585863936,518.09205699304,524.56820782765],"description":"scale of syntonic comma's, almost 56-tET"},"cet222":{"frequencies":[261.6255653006,297.3462123974,337.94392545772,384.08458333231,436.52498800167,496.12526073276,563.86296895784,640.8491384935,728.34649714081,827.79017883768,940.81124699851,1069.2634803114,1215.25373699679,1381.1765584523,1569.7533918036],"description":"14th root of 6, Moreno's C-14"},"cet233":{"frequencies":[261.6255653006,299.41460910537,342.66187834083,392.15575985798,448.79850611373,513.6227001391,587.8100594825,672.71300106294,769.87926947615,881.08018137935,1008.34288220748,1153.98733901804,1320.66858845324,1511.42518780658,1729.7345489351,1979.57639663535,2265.50524176842,2592.73349533282,2967.22638952895,3395.81083571538,3886.29974647262,4447.6346101102],"description":"21st root of 17. McLaren 'Microtonal Music', volume 2, track 15"},"cet24":{"frequencies":[261.6255653006,265.3411057651,269.1094134006,272.9312375932,276.80733837157,280.73848655813,284.72546392233,288.7690633361,292.87008893155,297.02935626086,301.24769245848,305.52593640563,309.86493889709,314.26556281043,318.72868327757,323.25518785885,327.84597671953,332.50196280875,337.22407204116,342.01324348101,346.8704295289,351.79659611118,356.79272287204,361.85980336835,366.9988452672,372.21087054633,377.49691569736,382.85803193188,388.29528539052,393.80975735501,399.40254446313,405.07475892685,410.82752875349,416.66199797006,422.57932685074,428.58069214763,434.66728732478,440.84032279551,447.10102616311,453.45064246502,459.89043442035,466.42168268106,473.04568608657,479.76376192214,486.57724618073,493.48749382879,500.49587907561,507.6037956467,514.81265706088,522.12389691142,529.53896915113],"description":"least squares fit primes 2-13"},"cet258":{"frequencies":[261.6255653006,303.75687573192,352.67287219582,409.46613795376,475.40520223986,551.96287401486,640.8491384935,744.04935121924,863.86858278563,1002.98310468409,1164.50016626124,1352.0273979586,1569.7533918036],"description":"12th root of 6, Moreno's C-12"},"cet29":{"frequencies":[51.91308719749,52.80006242627,53.70219231256,54.6197354699,55.55295587693,56.50212107609,57.46750349647,58.44938022184,59.44803272677,60.46374832519,61.49681820986,62.54753889218,63.61621194966,64.70314373878,65.80864697157,66.93303858176,68.07664129187,69.2397833384,70.42279815925,71.62602610967,72.84981213985,74.09450750046,75.36046944358,76.64806088248,77.95765225928,79.28961901721,80.64434345693,82.02221441105,83.42362735565,84.84898403373,86.29869452271,87.77317443616,89.27284697886,90.79814258634,92.34949851506,93.9273610926,95.53218267212,97.16442386902,98.82455316866,100.51304648023,102.230389586,103.97707482641,105.75360353451,107.56048560902,109.39823902877,111.26739251837,113.16848194039,115.10205294491,117.06866050489,119.06886838764,121.10325205621,123.17239474253,125.2768903313,127.4173428542,129.59436591466,131.80858584574,134.06063743615,136.35116706905,138.68083217153,141.05030058861,143.46025402018,145.91138336926,148.40439215824,150.93999592972,153.51892156515,156.14191102559,158.8097162888,161.52310306741,164.28285015685,167.08974869373,169.94460622727,172.84824120887,175.80148703892,178.80519135714,181.8602162858,184.96743760879,188.12774927869,191.34205731671,194.61128429254,197.93636853869,201.31826325695,204.75794142387,208.2563891515,211.8146105632,215.43362693858,219.11447574094,222.85821595641,226.66592086774,230.53868336123,234.47761499594,238.48384494529,242.55852580808,246.70282574354,250.91793424736,255.20506113867,259.56543598745],"description":"95th root of 5"},"cet39":{"frequencies":[261.6255653006,267.55763511324,273.62420803617,279.82833216202,286.17312954462,292.66178817784,299.29756995616,306.08381073387,313.02392200207,320.12139075456,327.37978859613,334.80276256646,342.39404424694,350.15744982839,358.09687996112,366.21632994368,374.51987945827,383.01170275779,391.6960687417,400.57734310204,409.65998815178,418.94857448076,428.44776921301,438.16234766073,448.09719341103,458.25729813392,468.64777462103,479.27384364987,490.14084702027,501.25424765147,512.61963232837,524.24271148185,536.12933410494,548.28547272565,560.71723832061,573.43088042607,586.43278689221,599.72950056876,613.32770249519,627.23422858353,641.45606974252,656.00037539202,670.87445318194,686.08578808043,701.64202314362,717.55097860059,733.82065199545,750.45921787297,767.47504913108,784.8766959018],"description":"49th root of 3"},"cet39a":{"frequencies":[261.6255653006,267.54999903763,273.60843178624,279.80421399945,286.14029787289,292.61969147246,299.24597805224,306.02231493662,312.9519192023,320.03862308027,327.28580327671,334.69690040195,342.27601296361,350.02675229311,357.95279806627,366.05853356918,374.34782106107,382.82459589435,391.49354592099,400.35880176332,409.42457221564,418.6958708581,428.17711532294,437.87280684605,447.78830736843,457.9283414747,468.29772316218,478.90218693807,489.74678566745,500.83666784082,512.17796641877,523.77608535691],"description":"31-tET with least squares octave; equal weight to 5/4, 3/2, 7/4 and 2/1"},"cet39b":{"frequencies":[261.6255653006,267.54443554965,273.59736903996,279.78708267123,286.11699418435,292.58994480246,299.2095086599,305.97865699219,312.90112748358,319.98002733127,327.21907624411,334.6220906301,342.19239338178,349.93416455252,357.85087908811,365.94690831825,374.22588619981,382.6921630398,391.3502022376,400.20389001205,409.25811505631,418.51694141988,427.98548149913,437.66798531163,447.56979919346,457.69536764001,468.05001127562,478.63918904181,489.46765396188,500.54138513107,511.86535306771,523.4458104663],"description":"31-tET with l.s. 8/7, 5/4, 4/3, 3/2, 8/5, 7/4, 2/1; equal weights"},"cet39c":{"frequencies":[261.6255653006,267.52919373065,273.56603860918,279.73910598956,286.05147140959,292.50627485027,299.10673210371,305.85612987468,312.75782903301,319.8152662872,327.03195662575,334.41149334841,341.95754947331,349.67388372612,357.56433846376,365.63284274659,373.88341429498,382.32016148985,390.94728541851,399.7690842757,408.78994578219,418.01436575232,427.44693588739,437.09235368188,446.9554220819,457.04105241293,467.35426952494,477.9002035559,488.68410850494,499.71135422907,510.98743222773,522.51795602393],"description":"10th root of 5/4"},"cet39d":{"frequencies":[261.6255653006,267.55786538889,273.62467903016,279.82905628857,286.1741163878,292.66304927922,299.29911724561,306.08565654127,313.02607906932,320.12387409698,327.38261000985,334.80593610581,342.39758442978,350.16137164992,358.1012009765,366.22106412416,374.52504331879,383.0173133498,391.70214366901,400.58390053708,409.66704921865,418.95615622721,428.45589162089,438.17103135034,448.1064596598,458.26717154264,468.65827525256,479.28499487175,490.15267293726,501.26677312698,512.63288300643,524.25671683791],"description":"31-tET with l.s. 5/4, 3/2, 7/4"},"cet39e":{"frequencies":[261.6255653006,267.56053134626,273.63013029147,279.83741943955,286.18551905392,292.67762672082,299.3170076044,306.10700082387,313.05102655064,320.15257723818,327.41522444303,334.84262641603,342.43851674365,350.20672153383,358.15114775562,366.27579142084],"description":"15th root of 7/5, X.J. Scott"},"cet44":{"frequencies":[261.6255653006,268.36512159638,275.27829096782,282.369545742,289.64347345451,297.10477981732,304.75829176301,312.60896056742,320.66186505284,328.92221487359,337.3953538863,346.08676360706,355.00206675748,364.14703090225,373.52757218034,383.14975913231,393.01981662619,403.14412988459,413.52924861543,424.18189124916,435.1089492851,446.31749174973,457.81476976988,469.60822126365,481.70547575226,494.11435929576,506.84289955596,519.89933098975,533.2921001762],"description":"least maximum error of 10.0911 cents to a set of 11-limit consonances"},"cet45":{"frequencies":[261.6255653006,268.55812265554,275.67437899809,282.97903853108,290.47742047479,298.17449463282,306.07552595385,314.18591889722,322.51122112969,331.05693609414,339.82928674186,348.83408706747],"description":"11th root of 4/3"},"cet45a":{"frequencies":[261.6255653006,268.48547646737,275.52525683447,282.74962263341,290.1634137569,297.77159700127,305.57926939395,313.59166160814,321.8141414671,330.2522175402,338.9115428334,347.79791857637,356.91729810903,366.27579142084],"description":"13th root of 7/5, X.J. Scott"},"cet49":{"frequencies":[261.6255653006,269.10883825956,276.80615518671,284.72363837915,292.86758524998,301.24447333711,309.86096545541,318.72391499615,327.84037137809,337.21758565441,346.86301628009,356.78433504421,366.98943317194,377.48642760107,388.28366743806,399.38974059878,410.81348063915,422.56397378117,434.65056613995,447.08287115744,459.87077724873,473.02445566714,486.55436859423,500.47127746122,514.78625150841,529.51067658945],"description":"least squares fit primes 3-13"},"cet49a":{"frequencies":[261.6255653006,269.10939785623,276.80730639354,284.72541458317,292.8700212642,301.24760545475,309.86483150611,318.72855440416,327.84582522255,337.22389673177,346.87022916874,356.7924961714,366.99859088307,377.49663223147,388.29497138724,399.40219840734,410.82714906841,422.57891189558,434.66683539241,447.10053547759,459.8899031344,473.04511227892,486.57662785344,500.49521415122,514.81194337949,529.53820446742],"description":"least squares fit primes 5-13"},"cet49b":{"frequencies":[261.6255653006,269.11089011973,276.81037630182,284.73015118141,292.87651740119,301.25595792767,309.87514121046,318.74092648901,327.86036925135,337.24072684885,346.88946427176,356.81426008988,367.0230125633,377.52384592787,388.3251168606,399.43542112995,410.86360043647,422.61874944911,434.71022304287,447.14764374346,459.94090938509,473.10020098719,486.63599085665,500.55905092174,514.88046130456,529.61161913871],"description":"least squares fit primes 3-11"},"cet51":{"frequencies":[261.6255653006,269.45730810595,277.52349357863,285.8311397433,294.38747470873,303.19994295657,312.27621181854,321.62417814738,331.25197518754,341.1679796516,351.38081900843,361.89937898954,372.73281132023,383.89054168203,395.38227791356,407.21801845694,419.40806105693,431.96301172054,444.89379394488,458.21165822114,471.92819182319,486.05532888913,500.60536080461,515.59094689708,531.0251223827,546.92132188791,563.29337300176,580.1555203085,597.52243480304,615.40922665547,633.83145835774,652.80515826392,672.34683453572,692.47348950549,713.20263446921,734.55230492227,756.54107625132,779.18807989593,802.51301999392,826.53619052513,851.2784929682,876.7614544861,903.00724665589,930.0387047592,957.87934765022,986.55339821839,1016.08580446361,1046.5022612024],"description":"47nd root of 4"},"cet53":{"frequencies":[261.6255653006,269.81714175785,278.26519897904,286.97776745533,295.963129115,305.22982618403],"description":"5th root of 7/6, X.J. Scott"},"cet54":{"frequencies":[261.6255653006,269.96706985652,278.57452968396,287.45642599351,296.6215054241,306.0787984682,315.83762188043,325.9075894649,336.29862154621,347.0209567468,358.08515411748,369.5021153806,381.28308783765,393.43967739203,405.98385998242,418.92799580061,432.28483186346,446.06752886518,460.28966468743,474.96525012045,490.10874266572,505.73506369981,521.85960157932,538.49824405725,555.66738252045,573.38393096839,591.66534267587,610.52963091344,629.99537269573,650.08174791487,670.80854445602,692.19618110881,714.26572768264,737.03893002078,760.53821452531,784.78673539949,809.80838082331,835.62780061242,862.2704354823,889.76252234217,918.13114956434,947.40426420901,977.61070438283,1008.78022764847,1040.94354635268,1074.13233401713,1108.37929206026,1143.71815851921,1180.1837471134,1217.81198154093,1256.63993812708,1296.7058535394,1338.04920533515,1380.71072249048,1424.73243255855,1470.15770307252,1517.03129303135,1565.39936221354,1615.30956841503,1666.81108016015,1719.95463363144,1774.79258265191,1831.3789571042],"description":"62nd root of 7"},"cet54a":{"frequencies":[36.70809598968,37.88151295543,39.09243955873,40.34207507177,41.63165640381,42.96246070241,44.33580570763,45.75305128262,47.21560103286,48.72490261351,50.28245077394,51.88978777214,53.5485051662,55.26024570942,57.02670371,58.84962859429,60.73082539186,62.67215683218,64.67554556259,66.74297456936,68.87649134796,71.07820847085,73.35030604133,75.69503428946,78.11471406483,80.61174171737,83.18858976192,85.8478097501,88.59203530858,91.42398271579,94.34645661434,97.36235078878,100.47465152683,103.6864411753,107.00089881505,110.42130694669,113.95105240089,117.59363027227,121.3526480812,125.23182656372,129.23500749643,133.36615476182,137.62935895249,142.02884224198,146.56895930934,151.25420649717,156.08922305851,161.0787965455,166.22786851013,171.54153558634,177.0250602084,182.68387207023,188.52357443227,194.5499507934,200.76896615752,207.18677957808,213.80974586608,220.64442297146,227.69757979185,234.97619765489,242.48748500016,250.23887937817,258.23805608937,266.49293732345,275.01169389411,283.8027624226,292.87484767725,302.23693268442,311.89828942495,321.86848086456,332.15738106504,342.77517792247,353.73238500089,365.03985405114,376.70877738729,388.75071142436,401.17757988308,414.00168763976,427.23573537822,440.89282237095,454.98647402737,469.53064564449,484.53973861665,500.02861758376,516.01261368641,532.50755680773,549.52977996323,567.09613827221,585.22402902787,603.93139550692,623.23676470498,643.1592524742,663.71858572717,684.9351219702,706.82987354375,729.42451222373,752.74141479803,776.80366927173,801.63510168485,827.26030448295,853.70464190233,880.99430375232],"description":"101st root of 24"},"cet54b":{"frequencies":[261.6255653006,269.96795403263,278.5763544202,287.45924871019,296.62539133416,306.08381073387,315.84382837889,325.91506125677,336.30743300953,347.03118371184,358.09687996112,369.51542742358,381.29807310848,393.45642905887,406.00247545366,418.94857448076,432.30748251802,446.09236270275,460.31680056078,474.99480683953,490.14084702027,505.76984518255,521.89720128632,538.53880634615,555.71105808945,573.43088042607,591.71572697754,610.58361784146,630.05314440547,650.14349087612,670.87445318194,692.26646247798,714.3405894063,737.11858847932,760.62290389144,784.8766959018],"description":"35th root of 3 or shrunk 22-tET"},"cet55":{"frequencies":[261.6255653006,270.01349691657,278.67035254505,287.60475577316,296.82560168354,306.34207552634,316.16365537714,326.30012507123,336.76157646737,347.55843063202,358.70144085484,370.20170518484,382.07067969055,394.32018111076,406.96241165943,420.00996255663,433.47583121124,447.37342422819,461.71658555081,476.51960046685,491.79721226214,507.56463983627,523.83758122386,540.63224654693,557.96536270557,575.85419620437,594.31655714751,613.37083662462,633.03601203256,653.33166919923,674.2780257851,695.8959359612,718.20693418482,741.23324143097,764.99779551626,789.52425640623,814.83705588084,840.96140460432,867.92332151557,895.74966491622,924.46813868508,954.10735043232,984.69681977767,1016.26701863443,1048.84937826003,1082.47635523452,1117.18144085251,1152.9992001672,1189.96531328939,1228.1165836432,1267.49101522141,1308.127826503],"description":"51th root of 5"},"cet55a":{"frequencies":[261.6255653006,270.1234331478,278.89732210685,287.95619440582,297.30930820811,306.96622255393,316.93680165166,327.23123542864,337.86004496999,348.83408706747],"description":"9th root of 4/3"},"cet63":{"frequencies":[261.6255653006,271.38398887572,281.50639381697,292.00635633712,302.89795903081,314.19580976213,325.91506125677,338.07143142496,350.68122444233,363.76135261718,377.32935907335,391.4034412791,406.00247545366,421.14604188408,436.85445118639,453.14877154631,470.05085697597,487.58337662462,505.76984518255,524.63465441916,544.20310589723,564.50144490757,585.55689566922,607.39769784277,630.05314440547,653.5536209391,677.93064638327,703.21691530872,729.44634176744,756.65410477833,784.8766959018],"description":"30th root of 3 or stretched 19-tET"},"cet63a":{"frequencies":[261.6255653006,271.37251603396,281.48259278098,291.96932561311,302.84674360983,314.12940356828,325.83240291761,337.9714015469,350.5626427598,363.62297711023,377.1698766242,391.22147055517,405.79656146784,420.91465242294,436.59597307447,452.86150935499,469.73302118774,487.23308701689,505.38512383853,524.21342105699,543.74317298677,564.00051582303,585.01254970054,606.80739415229,629.41421305643,652.8632568014,677.18590276436,702.41470135475,728.58340348685,755.72702964881,783.88190097186,813.08569174348,843.37747981977,874.79780396885,907.38869808556,941.19377721109,976.25827622702,1012.62911525602,1050.35496244617,1089.48630538731,1130.07549372248,1172.17684627813,1215.84669925421,1261.14348767523,1308.127826503],"description":"44th root of 5"},"cet67":{"frequencies":[261.6255653006,271.89449162354,282.56647812794,293.65734341902,305.18353207836,317.16212905639,329.61089159214,342.54827390456,355.99345454941,369.96636271272,384.48771622149,399.57903967613,415.26270466472,431.56196087069,448.50096908674],"description":"14th root of 12/7, X.J. Scott"},"cet70":{"frequencies":[261.6255653006,272.49048247121,283.80660334964,295.59266404146,307.86818385681,320.65348759128,333.96974580612,347.83900623503,362.28423824861,377.32935907335,392.99928119148,409.31995166322,426.31839262878,444.02275580482,462.46235461904,481.66772230429,501.67065719504,522.50428685614,544.20310589723,566.80304433509,590.34152430617,614.85751848055,640.39162865951,666.98613212152,694.68506540856,723.53429383412,753.58158307649,784.8766959018],"description":"27th root of 3"},"cet78":{"frequencies":[261.6255653006,273.68177330057,286.29355449603,299.48651076576,313.28742377221,327.72430932822,342.82647426905,358.62457594514,375.15068445646,392.4383479509],"description":"9th root of 3/2"},"cet79":{"frequencies":[261.6255653006,273.87994580863,286.70831230381,300.13755324878,314.19580976213,328.91254817579,344.3186075731,360.44627930254,377.32935907335,395.0032340925,413.50494015483,432.87325713404,453.14877154631,474.3739811962,496.5933637384,519.85349135637,544.20310589723,569.69324454502,596.37732215892,624.31126899512,653.5536209391,684.16567043124,716.21156534988,749.7584744066,784.8766959018],"description":"24th root of 3, James Heffernan (1906)."},"cet80":{"frequencies":[261.6255653006,273.93704112612,286.82786567404,300.32530171503,314.4578949408,329.25553433534,344.74951538696,360.97260627516,377.95911717185,395.74497280393,414.36778843034,433.8669493945,454.28369442026,475.66120282759,498.04439817054,521.48118104407,546.02084308555,571.71528316122,598.61884237431,626.7884189909,656.28358877393,687.16673097983,719.50316028422,753.36126491573,788.81265129014,825.93229545055,864.79870163404,905.49406830005,948.10446197172,992.7199992577,1039.43503743958,1088.34837402783,1139.56345570838,1193.18859712177,1249.33720993748,1308.127826503],"description":"35th root of 5"},"cet84":{"frequencies":[261.6255653006,274.70153691096,288.43104187674,302.84674360983,317.98293803021,333.87563322966,350.5626427598,368.08366429725,386.48038152577,405.79656146784,426.0781586093,447.37342422819,469.73302118774,493.21014446673,517.86064472263,543.74317298677,570.91930267857,599.45368763079,629.41421305643,660.87215705217,693.9023601738,728.58340348685,764.99779551626,803.23216389999,843.37747981977,885.52924725223,929.78774807537,976.25827622702,1025.05138820617,1076.28316609431,1130.07549372248,1186.55634664103,1245.86008938569,1308.127826503],"description":"33rd root of 5"},"cet87":{"frequencies":[261.6255653006,275.05808287728,289.18026151691,304.0275068203,319.63704721237,336.04802279017,353.30157737897,371.44097305523,390.51169339433,410.56155044631,431.64081781968,453.80235066263,477.10170997643,501.59731726833,527.35059397819,554.42610593952],"description":"Least-squares stretched ET to telephone dial tones. 1/1=697 Hz"},"cet88":{"frequencies":[261.6255653006,275.26799068863,289.6217982776,304.72408298441,320.61387403473,337.33223582731,354.92237405774,373.42974737602,392.90218486657,413.39000965417,434.94616895528,457.62637091093,481.48922855473,506.59641128799,533.01280425363],"description":"88 cents steps by Gary Morrison"},"cet88_appr":{"frequencies":[261.6255653006,275.62199471997,290.69507255622,305.22982618403,320.49131749323,336.37572681506,354.37113606854,373.75080757229,392.4383479509,413.43299207996,436.04260883433,457.84473927605,482.33849075995,504.56359022259,531.55670410281,560.62621135843,588.65752192635,620.14948811994,654.0639132515,686.76710891407,723.50773613993,763.07456546008,801.22829373309],"description":"88 cents scale approximated"},"cet88b":{"frequencies":[261.6255653006,275.26385669298,289.61326650562,304.7105300898,320.59498481995,337.30729585456,354.89100872976,373.39113880701,392.85588995712,413.33509311257,434.8821088097,457.55209870333,481.40413163568,506.49927024418,532.9029023296],"description":"87.9745 cents steps. Least squares of 7/6, 11/9, 10/7, 3/2, 7/4."},"cet88bis":{"frequencies":[261.6255653006,289.53272725508,320.41669955092,337.26306895804,373.23835706057,392.86190344834,434.76782633734,457.62637091093],"description":"Bistep approximation of 2212121 mode in 7/4 to 11/9 9/7 10/7 3/2"},"cet88bm":{"frequencies":[261.6255653006,275.22889829239,289.53954239223,304.59427454323,320.43178392135,337.09277136281,354.62005396115,373.05867644715,392.45602022512,412.86193859025,434.32887139488,456.91198653787,480.66932039657,505.66192697453,531.95403480429],"description":"87.75412 cents steps. Minimal highest deviation for 7/6, 11/9, 10/7, 3/2, 7/4."},"cet88c":{"frequencies":[261.6255653006,275.37188725148,289.84046967782,305.06925821769,321.09819727018,337.96933026971,355.72690383892,374.4174952616,394.09012940783,414.79640018179,436.59061916193,459.52995194191,483.67455974508,509.0877727469,535.83624905561,563.99013984227,593.62329144382,624.813430743,657.64235771869,692.19618110881,728.56553457307,766.84580121693,807.13738838693,849.54597972796,894.18279699007,941.16492045434,990.61558284509,1042.66447461031,1097.44811755542,1155.11020756021,1215.8019705522,1279.68259818323,1346.91964745566,1417.68945580607,1492.17764912727,1570.57960775359,1653.10095047047,1739.95812689496,1831.3789571042],"description":"38th root of 7. McLaren 'Microtonal Music', volume 3, track 7"},"cet89":{"frequencies":[261.6255653006,275.56724848068,290.25186566903,305.71900507847,322.01036982349,339.16988002511,357.2437980159,376.28084921395,396.33236207144,417.45239374596,439.69788420361,463.12880499146,487.80833148705,513.80299757552,541.1828853206,570.0218080747,600.39752248465,632.39191886931,666.09125466774,701.58637981228,738.97299766656,778.35189934333,819.82925103406,863.51687139942,909.53255273344,958.00034936337,1009.05093129669,1062.82192563509,1119.45831186524,1179.11277682321,1241.94614996535,1308.127826503],"description":"31st root of 5. McLaren 'Microtonal Music', volume 2, track 22"},"cet90":{"frequencies":[261.6255653006,275.62199471997,290.36720431405,305.90125228146,322.26633935092,339.50692625527,357.66984706396,376.80444887746,396.96271256675,418.19939952297,440.572208006,464.1419130862,488.97255163391,515.13157534193,542.69005603758,571.72285881831,602.3088534069,634.53113933145],"description":"Scale with limma steps"},"cet93":{"frequencies":[261.6255653006,275.99488223824,291.15340824655,307.14448922429,324.01384989472,341.80973194459,360.58302103444,380.38739950036,401.27949808494,423.31905787312],"description":"Tuning used in John Chowning's STRIA, 9th root of Phi"},"cet98":{"frequencies":[261.6255653006,276.83245825991,292.92324815749,309.94930780463,327.96500300935,347.02785219778,367.1987248383,388.54202015806,411.12588832951],"description":"8th root of 11/7, X.J. Scott"},"chahargah":{"frequencies":[261.6255653006,277.18263097687,283.66146785671,311.12698372208,326.97270111135,348.82502010853,367.86341164695,392.44854854484,415.30469757995,425.01198472693,466.16376151809,493.88330125613,523.2511306012],"description":"Chahargah in C"},"chahargah2":{"frequencies":[261.6255653006,283.66146785671,327.729041887,348.82502010853,392.44854854484,425.01198472693,493.88330125613,523.2511306012],"description":"Dastgah Chahargah in C, Mohammad Reza Gharib"},"chalmers":{"frequencies":[261.6255653006,274.70684356563,279.06726965397,294.32876096318,305.22982618403,313.95067836072,327.03195662575,343.38355445704,348.83408706747,366.27579142084,381.53728273004,392.4383479509,412.06026534844,418.60090448096,436.04260883433,457.84473927605,470.92601754108,488.36772189445,515.07533168556,523.2511306012],"description":"Chalmers' 19-tone with more hexanies than Perrett's Tierce-Tone"},"chalmers_17":{"frequencies":[261.6255653006,269.10058145205,286.15296204753,294.32876096318,313.95067836072,327.03195662575,336.37572681506,343.38355445704,376.74081403286,384.42940207435,392.4383479509,400.61414686654,408.78994578219,448.50096908674,457.84473927605,470.92601754108,490.54793493862,523.2511306012],"description":"7-limit figurative scale, Chalmers '96 Adnexed S&H decads"},"chalmers_19":{"frequencies":[261.6255653006,269.10058145205,290.69507255622,294.32876096318,305.22982618403,313.95067836072,336.37572681506,348.83408706747,356.10146388137,363.36884069528,376.74081403286,384.42940207435,392.4383479509,406.97310157871,436.04260883433,448.50096908674,465.11211608996,470.92601754108,508.71637697339,523.2511306012],"description":"7-limit figurative scale. Reversed S&H decads"},"chalmers_csurd":{"frequencies":[261.6255653006,273.35108123154,287.04667286017,303.37994773979,315.80837468238,323.38635505005,348.83408706747,357.38803216938,383.0466618906,392.4383479509,423.31690179539,433.47765231178,451.2357321491,476.91154755397,500.80604115761,523.2511306012],"description":"Combined Surd Scale, combination of Surd and Inverted Surd, JHC, 26-6-97"},"chalmers_isurd":{"frequencies":[261.6255653006,273.35108123154,287.04667286017,303.37994773979,323.38635505005,348.83408706747,383.0466618906,433.47765231178,523.2511306012],"description":"Inverted Surd Scale, of the form 4/(SQRT(N)+1, JHC, 26-6-97"},"chalmers_ji1":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,348.83408706747,370.63621750918,392.4383479509,414.24047839262,436.04260883433,466.02053819169,490.54793493862,523.2511306012],"description":"Based loosely on Wronski's and similar JI scales, May 2, 1997."},"chalmers_ji2":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,348.83408706747,370.63621750918,392.4383479509,416.96574469783,441.49314144476,466.02053819169,490.54793493862,523.2511306012],"description":"Based loosely on Wronski's and similar JI scales, May 2, 1997."},"chalmers_ji3":{"frequencies":[261.6255653006,279.06726965397,296.50897400735,313.95067836072,331.39238271409,348.83408706747,366.27579142084,392.4383479509,418.60090448096,444.76346101102,470.92601754108,497.08857407114,523.2511306012],"description":"15 16 17 18 19 20 21 on 1/1, 15-20 on 3/2, May 2, 1997. See other scales"},"chalmers_ji4":{"frequencies":[261.6255653006,279.06726965397,296.50897400735,313.95067836072,331.39238271409,348.83408706747,372.08969287196,395.34529867646,418.60090448096,441.85651028546,465.11211608996,496.11959049595,523.2511306012],"description":"15 16 17 18 19 20 on 1/1, same on 4/3, + 16/15 on 16/9"},"chalmers_surd":{"frequencies":[261.6255653006,315.80837468238,357.38803216938,392.4383479509,423.31690179539,451.2357321491,476.91154755397,500.80604115761,523.2511306012],"description":"Surd Scale, Surds of the form (SQRT(N)+1)/2, JHC, 26-6-97"},"chalmers_surd2":{"frequencies":[261.6255653006,272.2395613933,282.33485096279,291.98077704337,301.23248980765,310.13469895524,318.72425558532,327.03195662575,335.08385052998,342.90220911983,350.50624086893,357.91266581346,365.13613061818,372.18956061116,379.08442465499,385.8309605564,392.4383479509,398.91485744029,405.26796981327,411.50448329997,417.63058822561,423.65195171798,429.57376586736,435.40081471708,441.13750301549,446.78791303515,452.35581962987,457.84473927605,463.2579384726,468.59846621725,473.86917438523,479.07273156015,484.21164154672,489.28825377326,494.3047826718,499.26331035461,504.16580309972,509.01411882861,513.81001953884,518.55516185524,523.2511306012],"description":"Surd Scale, Surds of the form (SQRT(N)+1)/4"},"chalung":{"frequencies":[261.6255653006,328.09251713275,362.03316295439,390.31715077734,479.41117101029,527.4935758042,647.70012555753,728.30917696308,823.06004869243,961.65052057178,1054.9871516084,1301.05663342451],"description":"Tuning of chalung from Tasikmalaya. \"slendroid\". 1/1=185 Hz"},"chaumont":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,309.49749487796,327.03195662575,349.91912034749,365.63284274659,391.22147055517,408.78994578219,437.39890198442,465.40109831725,489.02683710225,523.2511306012],"description":"Lambert Chaumont organ temperament (1695), 1st interpretation"},"chaumont2":{"frequencies":[261.6255653006,274.56549986328,292.86986732103,309.30531842668,327.84547867349,349.70184487387,366.99801003998,391.46454285105,410.8262805401,438.2147004401,465.11211608996,490.54793493862,523.2511306012],"description":"Lambert Chaumont organ temperament (1695), 2nd interpretation"},"chimes":{"frequencies":[261.6255653006,288.69027895239,130.8127826503,144.34513947619],"description":"Heavenly Chimes"},"chimes_peck":{"frequencies":[261.6255653006,327.03195662575,392.4383479509,457.84473927605,588.65752192635,719.47030457665,850.28308722695,981.09586987725,1046.5022612024],"description":"Kris Peck, 9-tone windchime tuning. TL 7-3-2001"},"chin_12":{"frequencies":[261.6255653006,277.05457499359,293.57996645301,310.53449241474,329.24697610111,347.79893712036,368.97000115401,391.76907592069,413.1274313058,439.00991514661,462.11551390967,491.43599249807,523.2511306012],"description":"Chinese scale, 4th cent."},"chin_5":{"frequencies":[261.6255653006,294.32876096318,348.83408706747,392.4383479509,441.49314144476,523.2511306012],"description":"Chinese pentatonic from Zhou period"},"chin_60":{"frequencies":[261.6255653006,262.17244551937,265.19499215873,268.81311753311,272.48060600886,276.1981310001,279.38237857051,283.19406633357,287.05775848811,290.97416342694,294.32876096318,294.94400091442,298.34436617857,302.41475692242,306.54068145351,310.72289706448,314.30517589183,318.59332496145,322.93997797627,327.34593352805,331.11985608357,331.812000697,335.63741195089,340.21660119759,344.85826629043,349.56326086722,353.59332287831,358.41749022331,363.30747486009,368.26417485089,372.50983809402,373.28850041093,377.59208844475,382.74367817547,387.96555142985,392.4383479509,393.25866808247,397.79248823809,403.21967609811,408.72090880899,414.29719629306,419.07356785577,424.79110016094,430.58663751693,436.46124492224,441.49314144476,442.41600115048,447.51654926786,453.62213515688,459.81102195042,466.08434536373,471.45776383774,477.8899872033,484.40996672226,491.01890004663,496.67978412536,497.7180007967,503.45611792634,510.32490448905,517.28740216504,523.2511306012],"description":"Chinese scale of fifths (the 60 lu\")"},"chin_7":{"frequencies":[261.6255653006,294.32876096318,331.11985608357,348.83408706747,392.4383479509,441.49314144476,496.67978412536,523.2511306012],"description":"Chinese heptatonic scale and tritriadic of 64:81:96 triad"},"chin_bianzhong":{"frequencies":[261.6255653006,277.82379926216,312.56802260838,375.1593523779,420.13030572059,469.40618689596,506.59641128799,563.72967895209,627.66881138238,764.75812197709,849.53311813274,949.1724262561,1225.95732655636],"description":"Pitches of Bianzhong bells (Xinyang). 1/1=b, Liang Mingyue, 1975."},"chin_bianzhong2a":{"frequencies":[261.6255653006,284.81073476233,312.56802260838,372.56793743951,413.39000965417,447.94973572445,491.60634075178,562.75365576207,652.05945856061,695.63805470995,863.88355261715,960.75607282217,1173.30283584026],"description":"A-tones (GU) of 13 Xinyang bells (Ma Cheng-Yuan) 1/1=d#=619 Hz"},"chin_bianzhong2b":{"frequencies":[261.6255653006,279.59231184543,312.74738729016,375.37536096215,418.43048063126,468.86028020615,505.12945327459,562.08698385796,624.42058858709,762.97988553915,849.53425657971,936.08862980659,1215.37624187632],"description":"B-tones (SUI) of 13 Xinyang bells (Ma Cheng-Yuan) 1/1=b+=506.6 Hz"},"chin_bianzhong3":{"frequencies":[261.6255653006,508.3551866238,542.32970395878,608.04166718582,619.02750937577,673.88551872153,729.80120031671,739.56153452917,812.57643344187,881.52624580654,911.03313298042,978.11461117351,982.0774855146,1059.88575280263,1092.20381072382,1163.18085489566,1213.27682870749,1331.52122774489,1483.40111876828,1542.82606951623,1645.93659621657,1649.74391394557,1818.91159982256,2044.01922018919,2273.22753490632,2362.92760489328,2776.13057951436],"description":"A and B-tones of 13 Xinyang bells (Ma Cheng-Yuan) abs. pitches wrt middle-C"},"chin_bronze":{"frequencies":[261.6255653006,299.00064605783,313.95067836072,327.03195662575,348.83408706747,392.4383479509,436.04260883433,523.2511306012],"description":"Scale found on ancient Chinese bronze instrument 3rd c.BC & \"Scholar's Lute\""},"chin_chime":{"frequencies":[261.6255653006,248.6592656401,341.74499057264,392.56190849927,548.78974538591,648.86582834888,714.36935367713,785.57745330134,889.7110417619,886.88898199546,992.62825668803,1044.08711871947,1326.14827969763],"description":"Pitches of 12 stone chimes, F. Kuttner, 1951, ROMA Toronto. %1=b4"},"chin_ching":{"frequencies":[261.6255653006,276.1981310001,294.32876096318,310.72289706448,331.11985608357,349.56326086722,368.26417485089,392.4383479509,414.29719629306,441.49314144476,466.08434536373,496.67978412536,524.34489103873],"description":"Scale of Ching Fang, c.45 BC. Pyth.steps 0 1 2 3 4 5 47 48 49 50 51 52 53"},"chin_di":{"frequencies":[261.6255653006,298.70635408336,316.56004827153,360.50766037677,409.94872043165,433.75364775074,527.37121036213],"description":"Chinese di scale"},"chin_di2":{"frequencies":[261.6255653006,289.95657583698,318.21537073485,338.89464890898,383.48501130814,436.9606979923,494.73987775324,522.04355935974],"description":"Observed tuning from Chinese flute dizi, Helmholtz/Ellis p. 518, nr.103"},"chin_huang":{"frequencies":[261.6255653006,331.11985608357,392.4383479509,441.49314144476,523.2511306012,588.65752192635,662.23971216714],"description":"Huang Zhong qin tuning"},"chin_liu-an":{"frequencies":[261.6255653006,278.83777354406,294.32876096318,311.64221749042,331.11985608357,353.19451315581,371.78369805875,392.4383479509,415.52295665389,441.49314144476,470.92601754108,492.82955324067],"description":"Scale of Liu An, in: \"Huai Nan Tzu\", c.122 BC, 1st known corr. to Pyth. scale"},"chin_lu":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,313.95067836072,328.55303549378,348.83408706747,371.78369805875,392.4383479509,415.52295665389,441.49314144476,470.92601754108,495.71159741166,523.2511306012],"description":"Chinese L� scale by Huai Nan zi, Han era. P�re Amiot 1780, Kurt Reinhard"},"chin_lu2":{"frequencies":[261.6255653006,279.38237857051,294.32876096318,314.30517589183,331.11985608357,353.59332287831,372.50983809402,392.4383479509,419.07356785577,441.49314144476,471.45776383774,496.67978412536,523.2511306012],"description":"Chinese L� (Lushi chunqiu, by Lu Buwei). Mingyue: Music of the billion, p.67"},"chin_lu3":{"frequencies":[261.6255653006,277.34278419245,293.66476791741,310.58830860439,329.24697610111,347.81902735497,369.14054089803,391.76907592069,413.1512951712,439.23819834286,462.1422075194,491.60634075178,523.2511306012],"description":"Chinese L� scale by Ho Ch'�ng-T'ien, reported in Sung Shu (500 AD)"},"chin_lu3a":{"frequencies":[261.6255653006,277.06033146978,293.58830182213,310.53780743131,329.25144446584,347.79484055318,368.74579520635,391.78066943209,413.13681807919,438.99947255393,462.1072190611,491.17907538715,523.2511306012],"description":"Chinese L� scale by Ho Ch'�ng-T'ien, calc. basis is \"big number\" 177147"},"chin_lu4":{"frequencies":[261.6255653006,276.78521684908,293.5444075184,310.55356739316,329.35741152087,348.44172229085,369.5396750577,391.9150968203,414.62425518576,439.72952246257,465.20924434298,493.37740286979,523.2511306012],"description":"Chinese L� \"749-Temperament\""},"chin_lu5":{"frequencies":[261.6255653006,277.35401920913,293.41471131112,311.37240624271,329.40299530711,349.20610523279,369.80535913035,392.03738806826,415.16320853113,440.12206674667,466.08434536373,494.10449271367,522.71643616375],"description":"Chinese L� scale by Ch'ien Lo-Chih, c.450 AD Pyth.steps 0 154 255 103 204 etc."},"chin_lusheng":{"frequencies":[261.6255653006,316.38258506467,348.82502010853,389.28772571905,466.97226207056,520.53801357752],"description":"Observed tuning of a small Lusheng, 1/1=d, OdC '97"},"chin_pan":{"frequencies":[261.6255653006,275.62199471997,279.38237857051,290.36720431405,294.32876096318,310.07474405997,326.6631048533,331.11985608357,344.13890881665,348.83408706747,367.49599295996,372.50983809402,387.15627241873,392.4383479509,413.43299207996,419.07356785577,435.55080647107,441.49314144476,458.8518784222,465.11211608996,489.99465727995,496.67978412536,516.20836322497,523.2511306012],"description":"Pan Huai-su pure system, in: Sin-Yan Shen, 1991"},"chin_pipa":{"frequencies":[261.6255653006,284.4818984792,320.42873367481,380.17671965621,433.44136952667,521.74210224793],"description":"Observed tuning from Chinese balloon lute p'i-p'a, Helmholtz/Ellis p. 518, nr.109"},"chin_sheng":{"frequencies":[261.6255653006,295.36595061166,318.03161540472,348.82502010853,395.40657391157,442.03793673691,477.05982293263,522.94897617031],"description":"Observed tuning from Chinese sheng or mouth organ, Helmholtz/Ellis p. 518, nr.105"},"chin_sientsu":{"frequencies":[261.6255653006,291.80478157373,326.97270111135,392.44854854484,438.22451411849,523.2511306012],"description":"Observed tuning from Chinese tamboura sienzi, Helmholtz/Ellis p. 518, nr.108"},"chin_sona":{"frequencies":[261.6255653006,284.4818984792,310.58830860439,337.33223582731,377.98706287655,418.43499793376,469.94877954106,528.10941333272],"description":"Observed tuning from Chinese oboe (so-na), Helmholtz/Ellis p. 518, nr.104"},"chin_wang-po":{"frequencies":[261.6255653006,294.32876096318,330.24264909897,371.97947673071,392.4383479509,440.94196398978,495.71159741166,517.50111817701],"description":"Scale of Wang Po, 958 AD. H. Pischner: Musik in China, Berlin, 1955, p.20"},"chin_yangqin":{"frequencies":[261.6255653006,288.45311779165,306.48933163909,347.41744306689,383.26356564167,434.44398956347,465.08793784701,522.64699622026],"description":"Observed tuning from Chinese dulcimer yangqin, Helmholtz/Ellis p. 518, nr.107"},"chin_yunlo":{"frequencies":[261.6255653006,288.45311779165,323.40385076956,367.0144478307,386.1523605003,409.35055662695,483.1608380663,525.67465946865],"description":"Observed tuning from Chinese gong-chime (y�n-lo), Helmholtz/Ellis p. 518, nr.106"},"choquel":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,436.04260883433,475.68284600109,490.54793493862,523.2511306012],"description":"Choquel/Barbour/Marpurg?"},"chordal":{"frequencies":[261.6255653006,392.4383479509,327.03195662575,457.84473927605,588.65752192635,719.47030457665,850.28308722695,981.09586987725,981.09586987725,490.54793493862,555.95432626377,621.36071758893,310.68035879446,523.2511306012,348.83408706747,418.60090448096,299.00064605783,465.11211608996,380.54627680087,322.00069575458,279.06726965397,610.45965236807,915.6894785521,872.08521766867,697.66817413493,654.0639132515,627.90135672144,448.50096908674,319.76457981184,377.90359432309,444.76346101102,889.52692202204,336.37572681506,294.32876096318,465.11211608996,411.12588832951,305.22982618403,366.27579142084,373.75080757229,313.95067836072,470.92601754108],"description":"Chordal Notes S&H"},"chrom15":{"frequencies":[261.6255653006,280.31310567921,301.87565226992,356.76213450082,392.4383479509,413.09299784305,436.04260883433,523.2511306012],"description":"Tonos-15 Chromatic"},"chrom15_inv":{"frequencies":[261.6255653006,313.95067836072,331.39238271409,348.83408706747,383.71749577421,453.48431318771,488.36772189445,523.2511306012],"description":"Inverted Chromatic Tonos-15 Harmonia"},"chrom15_inv2":{"frequencies":[261.6255653006,279.06726965397,296.50897400735,348.83408706747,383.71749577421,401.15920012759,418.60090448096,523.2511306012],"description":"A harmonic form of the Chromatic Tonos-15 inverted"},"chrom17":{"frequencies":[261.6255653006,277.97716313189,296.50897400735,370.63621750918,404.33041910093,423.58424858192,444.76346101102,523.2511306012],"description":"Tonos-17 Chromatic"},"chrom17_con":{"frequencies":[261.6255653006,277.97716313189,296.50897400735,370.63621750918,386.75083566176,404.33041910093,494.18162334558,523.2511306012],"description":"Conjunct Tonos-17 Chromatic"},"chrom19":{"frequencies":[261.6255653006,276.16031892841,292.40504357126,355.06326719367,382.37582620857,397.67085925691,414.24047839262,523.2511306012],"description":"Tonos-19 Chromatic"},"chrom19_con":{"frequencies":[261.6255653006,276.16031892841,292.40504357126,355.06326719367,368.21375857121,382.37582620857,451.89870370104,523.2511306012],"description":"Conjunct Tonos-19 Chromatic"},"chrom21":{"frequencies":[261.6255653006,274.70684356563,289.16509849014,343.38355445704,392.4383479509,406.97310157871,422.62591317789,523.2511306012],"description":"Tonos-21 Chromatic"},"chrom21_inv":{"frequencies":[261.6255653006,323.91736656265,336.37572681506,348.83408706747,398.6675280771,473.41768959156,498.33441009638,523.2511306012],"description":"Inverted Chromatic Tonos-21 Harmonia"},"chrom21_inv2":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,348.83408706747,398.6675280771,423.58424858192,448.50096908674,523.2511306012],"description":"Inverted harmonic form of the Chromatic Tonos-21"},"chrom23":{"frequencies":[261.6255653006,273.51763645063,286.54228580542,334.29933343966,376.08675011961,401.15920012759,429.81342870813,523.2511306012],"description":"Tonos-23 Chromatic"},"chrom23_con":{"frequencies":[261.6255653006,273.51763645063,286.54228580542,334.29933343966,353.96400011258,376.08675011961,462.87600014722,523.2511306012],"description":"Conjunct Tonos-23 Chromatic"},"chrom25":{"frequencies":[261.6255653006,278.32506946872,297.30177875068,363.36884069528,408.78994578219,436.04260883433,467.18850946536,523.2511306012],"description":"Tonos-25 Chromatic"},"chrom25_con":{"frequencies":[261.6255653006,278.32506946872,297.30177875068,363.36884069528,384.74347838324,408.78994578219,503.12608711654,523.2511306012],"description":"Conjunct Tonos-25 Chromatic"},"chrom27":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,353.19451315581,392.4383479509,415.52295665389,441.49314144476,523.2511306012],"description":"Tonos-27 Chromatic"},"chrom27_inv":{"frequencies":[261.6255653006,310.07474405997,329.45441556372,348.83408706747,387.59343007496,465.11211608996,494.18162334558,523.2511306012],"description":"Inverted Chromatic Tonos-27 Harmonia"},"chrom27_inv2":{"frequencies":[261.6255653006,271.31540105247,281.00523680435,348.83408706747,387.59343007496,406.97310157871,436.04260883433,523.2511306012],"description":"Inverted harmonic form of the Chromatic Tonos-27"},"chrom29":{"frequencies":[261.6255653006,270.96933548991,281.00523680435,344.87006335079,379.35706968587,399.32323124828,421.50785520652,523.2511306012],"description":"Tonos-29 Chromatic"},"chrom29_con":{"frequencies":[261.6255653006,270.96933548991,281.00523680435,344.87006335079,361.29244731988,379.35706968587,474.19633710734,523.2511306012],"description":"Conjunct Tonos-29 Chromatic"},"chrom31":{"frequencies":[261.6255653006,279.66870773512,300.3849083081,337.93302184661,352.6257619269,368.65420565085,386.2091678247,405.51962621593,523.2511306012],"description":"Tonos-31 Chromatic. Tone 24 alternates with 23 as MESE or A"},"chrom31_con":{"frequencies":[261.6255653006,279.66870773512,300.3849083081,337.93302184661,352.6257619269,368.65420565085,386.2091678247,450.57736246214,523.2511306012],"description":"Conjunct Tonos-31 Chromatic"},"chrom33":{"frequencies":[261.6255653006,278.50463402967,297.71185016965,359.73515228832,392.4383479509,411.12588832951,431.68218274599,523.2511306012],"description":"Tonos-33 Chromatic. A variant is 66 63 60 48"},"chrom33_con":{"frequencies":[261.6255653006,278.50463402967,297.71185016965,359.73515228832,375.37581108347,392.4383479509,479.64686971777,523.2511306012],"description":"Conjunct Tonos-33 Chromatic"},"chrom_new":{"frequencies":[261.6255653006,273.20871865617,297.93622032612,349.22823143301,391.99543598175,409.35055662695,446.39994737251,523.2511306012],"description":"New Chromatic genus 4.5 + 9 + 16.5"},"chrom_new2":{"frequencies":[261.6255653006,273.6474710507,299.37374239667,349.22823143301,391.99543598175,410.00794244467,448.55379686399,523.2511306012],"description":"New Chromatic genus 14/3 + 28/3 + 16 parts"},"chrom_soft":{"frequencies":[261.6255653006,271.68808704293,282.55561052465,348.83408706747,392.4383479509,407.5321305644,423.83341578697,523.2511306012],"description":"100/81 Chromatic. This genus is a good approximation to the soft chromatic"},"chrom_soft2":{"frequencies":[261.6255653006,268.42893440103,282.57118533961,349.22823143301,391.99543598175,402.18897205153,423.37840671577,523.2511306012],"description":"1:2 Soft Chromatic"},"chrom_soft3":{"frequencies":[261.6255653006,271.31540105247,281.75060878526,348.83408706747,392.4383479509,406.97310157871,422.62591317789,523.2511306012],"description":"Soft chromatic genus is from K. Schlesinger's modified Mixolydian Harmonia"},"cifariello":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,294.32876096318,313.95067836072,327.03195662575,348.83408706747,363.36884069528,376.74081403286,392.4383479509,418.60090448096,436.04260883433,465.11211608996,470.92601754108,490.54793493862,523.2511306012],"description":"F. Cifariello Ciardi, ICMC 86 Proc. 15-tone 5-limit tuning"},"ckring1":{"frequencies":[261.6255653006,299.00064605783,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,373.75080757229,392.4383479509,418.60090448096,436.04260883433,448.50096908674,457.84473927605,523.2511306012],"description":"Double-tie circular mirroring with common pivot of 4:5:6:7 = square 1 3 5 7"},"ckring2":{"frequencies":[261.6255653006,290.69507255622,305.22982618403,313.95067836072,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,406.97310157871,436.04260883433,448.50096908674,470.92601754108,523.2511306012],"description":"Double-tie circular mirroring with common pivot of 3:5:7:9"},"clampitt-phi":{"frequencies":[261.6255653006,289.46753582364,320.2724252102,340.92857683151,377.20990650852,444.26963537301,491.54843559637,523.2511306012],"description":"David Clampitt, phi+1 mod 3phi+2, from \"Pairwise Well-Formed Scales\", 1997"},"classr":{"frequencies":[261.6255653006,275.93321340298,287.4304306281,313.95067836072,327.03195662575,344.91651675372,367.91095120397,392.4383479509,408.78994578219,441.49314144476,459.88868900496,490.54793493862,523.2511306012],"description":"Marvel projection to the 5-limit of class"},"cluster":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"13-tone 5-limit Tritriadic Cluster"},"cluster6a":{"frequencies":[261.6255653006,327.03195662575,348.83408706747,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"Six-Tone Triadic Cluster 4:5:6"},"cluster6b":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,392.4383479509,418.60090448096,490.54793493862,523.2511306012],"description":"Six-Tone Triadic Cluster 4:6:5"},"cluster6c":{"frequencies":[261.6255653006,290.69507255622,313.95067836072,348.83408706747,418.60090448096,436.04260883433,523.2511306012],"description":"Six-Tone Triadic Cluster 3:4:5"},"cluster6d":{"frequencies":[261.6255653006,290.69507255622,327.03195662575,348.83408706747,392.4383479509,436.04260883433,523.2511306012],"description":"Six-Tone Triadic Cluster 3:5:4"},"cluster6e":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,392.4383479509,418.60090448096,502.32108537715,523.2511306012],"description":"Six-Tone Triadic Cluster 5:6:8"},"cluster6f":{"frequencies":[261.6255653006,313.95067836072,348.83408706747,418.60090448096,436.04260883433,502.32108537715,523.2511306012],"description":"Six-Tone Triadic Cluster 5:8:6"},"cluster6g":{"frequencies":[261.6255653006,286.15296204753,299.00064605783,327.03195662575,373.75080757229,457.84473927605,523.2511306012],"description":"Six-Tone Triadic Cluster 4:5:7"},"cluster6h":{"frequencies":[261.6255653006,286.15296204753,327.03195662575,366.27579142084,418.60090448096,457.84473927605,523.2511306012],"description":"Six-Tone Triadic Cluster 4:7:5"},"cluster6i":{"frequencies":[261.6255653006,313.95067836072,366.27579142084,373.75080757229,439.53094970501,448.50096908674,523.2511306012],"description":"Six-Tone Triadic Cluster 5:6:7"},"cluster6j":{"frequencies":[261.6255653006,305.22982618403,313.95067836072,366.27579142084,436.04260883433,439.53094970501,523.2511306012],"description":"Six-Tone Triadic Cluster 5:7:6"},"cluster8a":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,348.83408706747,367.91095120397,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"Eight-Tone Triadic Cluster 4:5:6"},"cluster8b":{"frequencies":[261.6255653006,306.59245933664,313.95067836072,327.03195662575,392.4383479509,408.78994578219,418.60090448096,490.54793493862,523.2511306012],"description":"Eight-Tone Triadic Cluster 4:6:5"},"cluster8c":{"frequencies":[261.6255653006,290.69507255622,313.95067836072,348.83408706747,363.36884069528,418.60090448096,436.04260883433,484.4917875937,523.2511306012],"description":"Eight-Tone Triadic Cluster 3:4:5"},"cluster8d":{"frequencies":[261.6255653006,290.69507255622,327.03195662575,348.83408706747,387.59343007496,392.4383479509,436.04260883433,465.11211608996,523.2511306012],"description":"Eight-Tone Triadic Cluster 3:5:4"},"cluster8e":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,334.88072358477,392.4383479509,401.85686830172,418.60090448096,502.32108537715,523.2511306012],"description":"Eight-Tone Triadic Cluster 5:6:8"},"cluster8f":{"frequencies":[261.6255653006,301.39265122629,313.95067836072,348.83408706747,376.74081403286,418.60090448096,436.04260883433,502.32108537715,523.2511306012],"description":"Eight-Tone Triadic Cluster 5:8:6"},"cluster8g":{"frequencies":[261.6255653006,286.15296204753,299.00064605783,327.03195662575,373.75080757229,400.61414686654,457.84473927605,500.76768358318,523.2511306012],"description":"Eight-Tone Triadic Cluster 4:5:7"},"cluster8h":{"frequencies":[261.6255653006,286.15296204753,327.03195662575,357.69120255941,366.27579142084,408.78994578219,418.60090448096,457.84473927605,523.2511306012],"description":"Eight-Tone Triadic Cluster 4:7:5"},"cluster8i":{"frequencies":[261.6255653006,307.67166479351,313.95067836072,366.27579142084,373.75080757229,439.53094970501,448.50096908674,512.78610798918,523.2511306012],"description":"Eight-Tone Triadic Cluster 5:6:7"},"cluster8j":{"frequencies":[261.6255653006,263.718569823,305.22982618403,313.95067836072,366.27579142084,376.74081403286,436.04260883433,439.53094970501,523.2511306012],"description":"Eight-Tone Triadic Cluster 5:7:6"},"cohenf_11":{"frequencies":[261.6255653006,299.00064605783,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,523.2511306012],"description":"Flynn Cohen, 7-limit scale of \"Rameau's nephew\", 1996"},"coleman":{"frequencies":[261.6255653006,276.70272600503,293.15632631094,310.58830860439,328.48713220126,349.43001184052,368.92737853004,391.76907592069,414.58565256441,438.98455767189,465.89457252293,491.89038573682,523.2511306012],"description":"Jim Coleman's ModX piano temperament. TL 16 Mar 1999"},"collengettes":{"frequencies":[261.6255653006,269.10058145205,275.62199471997,285.40970760065,294.32876096318,302.73815413355,310.07474405997,321.08592105074,331.11985608357,340.58042340025,348.83408706747,358.80077526939,367.49599295996,380.54627680087,392.4383479509,403.65087217807,413.43299207996,428.11456140098,441.49314144476,454.10723120033,465.11211608996,478.40103369253,496.67978412536,507.3950357345,523.2511306012],"description":"R.P. Collengettes, from p.23 of d'Erlanger, vol 5. 24 tone Arabic system"},"colonna1":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,308.86351459099,327.03195662575,348.83408706747,363.36884069528,392.4383479509,399.70572476481,436.04260883433,463.29527188648,490.54793493862,523.2511306012],"description":"Colonna 1"},"colonna2":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,470.92601754108,479.64686971777,523.2511306012],"description":"Colonna 2"},"concertina":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,294.32876096318,306.59245933664,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,436.04260883433,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"English Concertina, Helmholtz/Ellis, p. 470"},"cons11":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,348.83408706747,392.4383479509,436.04260883433,457.84473927605,523.2511306012],"description":"Set of intervals with num + den <= 11 not exceeding 2/1"},"cons12":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,436.04260883433,457.84473927605,523.2511306012],"description":"Set of intervals with num + den <= 12 not exceeding 2/1"},"cons13":{"frequencies":[261.6255653006,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,523.2511306012],"description":"Set of intervals with num + den <= 13 not exceeding 2/1"},"cons14":{"frequencies":[261.6255653006,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,470.92601754108,523.2511306012],"description":"Set of intervals with num + den <= 14 not exceeding 2/1"},"cons15":{"frequencies":[261.6255653006,299.00064605783,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,470.92601754108,523.2511306012],"description":"Set of intervals with num + den <= 15 not exceeding 2/1"},"cons16":{"frequencies":[261.6255653006,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,470.92601754108,523.2511306012],"description":"Set of intervals with num + den <= 16 not exceeding 2/1"},"cons17":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,418.60090448096,436.04260883433,457.84473927605,470.92601754108,479.64686971777,523.2511306012],"description":"Set of intervals with num + den <= 17 not exceeding 2/1"},"cons18":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,411.12588832951,418.60090448096,436.04260883433,457.84473927605,470.92601754108,479.64686971777,523.2511306012],"description":"Set of intervals with num + den <= 18 not exceeding 2/1"},"cons19":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,392.4383479509,411.12588832951,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,479.64686971777,523.2511306012],"description":"Set of intervals with num + den <= 19 not exceeding 2/1"},"cons20":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,392.4383479509,411.12588832951,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,479.64686971777,485.87604984397,523.2511306012],"description":"Set of intervals with num + den <= 20 not exceeding 2/1"},"cons21":{"frequencies":[261.6255653006,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,392.4383479509,411.12588832951,418.60090448096,425.14154361347,436.04260883433,448.50096908674,457.84473927605,470.92601754108,479.64686971777,485.87604984397,523.2511306012],"description":"Set of intervals with num + den <= 21 not exceeding 2/1"},"cons8":{"frequencies":[261.6255653006,348.83408706747,392.4383479509,436.04260883433,523.2511306012],"description":"Set of intervals with num + den <= 8 not exceeding 2/1"},"cons9":{"frequencies":[261.6255653006,327.03195662575,348.83408706747,392.4383479509,436.04260883433,523.2511306012],"description":"Set of intervals with num + den <= 9 not exceeding 2/1"},"cons_5":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,470.92601754108,523.2511306012],"description":"Set of consonant 5-limit intervals within the octave"},"cons_7":{"frequencies":[261.6255653006,299.00064605783,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605],"description":"Set of consonant 7-limit intervals of tetrad 4:5:6:7 and inverse"},"cons_7a":{"frequencies":[261.6255653006,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,418.60090448096,436.04260883433,457.84473927605],"description":"Set of consonant 7-limit intervals, harmonic entropy minima"},"cont_frac1":{"frequencies":[261.6255653006,264.29672053658,267.01859068163,284.39991302433,288.64312378534,304.51680721446,328.36325429535,342.47239171077,368.24757473349,390.36247006958,408.23697512781,419.80330474394,448.3033221197,488.42606438843,498.20005830409],"description":"Continued fraction scale 1, see McLaren in Xenharmonikon 15, pp.33-38"},"cont_frac2":{"frequencies":[261.6255653006,268.67076720771,283.00159623424,287.78825007941,303.56038377389,306.30898587133,329.63288816559,333.85601282718,352.97051886932,380.09613548074,393.10104267352,426.45795861378,432.83315799354,472.91012288255,483.94654132265,519.4303061261],"description":"Continued fraction scale 2, see McLaren in Xenharmonikon 15, pp.33-38"},"cordier":{"frequencies":[261.6255653006,277.2273508585,293.75953199293,311.27759533081,329.84032939425,349.51003591412,370.35272620855,392.4383479509,415.84102607989,440.63929776914,466.91639276282,494.76049384407,524.26505360912],"description":"Serge Cordier, piano tuning, 1975 (Piano bien temp�r� et justesse orchestrale)"},"corner11":{"frequencies":[261.6255653006,269.80136421624,286.15296204753,294.32876096318,314.76825825228,327.03195662575,343.38355445704,359.73515228832,392.4383479509,400.61414686654,408.78994578219,449.66894036041,457.84473927605,490.54793493862,494.63583439645,523.2511306012],"description":"Quadratic Corner 11-limit. Chalmers '96"},"corner13":{"frequencies":[261.6255653006,265.71346475842,269.80136421624,286.15296204753,292.28481123426,294.32876096318,314.76825825228,318.85615771011,327.03195662575,343.38355445704,345.42750418595,359.73515228832,371.99885066179,392.4383479509,400.61414686654,408.78994578219,425.14154361347,449.66894036041,457.84473927605,490.54793493862,494.63583439645,523.2511306012],"description":"Quadratic Corner 13-limit. Chalmers '96"},"corner17":{"frequencies":[261.6255653006,265.71346475842,269.80136421624,277.97716313189,286.15296204753,292.28481123426,294.32876096318,295.35073582763,314.76825825228,318.85615771011,327.03195662575,343.38355445704,345.42750418595,347.47145391486,359.73515228832,371.99885066179,382.21859930635,392.4383479509,400.61414686654,408.78994578219,416.96574469783,425.14154361347,449.66894036041,451.71289008932,457.84473927605,486.4600354808,490.54793493862,494.63583439645,523.2511306012],"description":"Quadratic Corner 17-limit."},"corner17a":{"frequencies":[261.6255653006,265.71346475842,269.80136421624,275.93321340298,277.97716313189,286.15296204753,292.28481123426,294.32876096318,295.35073582763,306.59245933664,312.72430852337,314.76825825228,318.85615771011,327.03195662575,331.11985608357,337.2517052703,343.38355445704,345.42750418595,347.47145391486,359.73515228832,367.91095120397,371.99885066179,382.21859930635,392.4383479509,398.57019713763,400.61414686654,404.70204632437,408.78994578219,416.96574469783,425.14154361347,429.2294430713,441.49314144476,449.66894036041,451.71289008932,457.84473927605,459.88868900496,478.28423656516,486.4600354808,490.54793493862,494.63583439645,515.07533168556,521.20718087229,523.2511306012],"description":"Quadratic Corner 17 odd limit."},"corner7":{"frequencies":[261.6255653006,286.15296204753,294.32876096318,327.03195662575,343.38355445704,392.4383479509,400.61414686654,408.78994578219,457.84473927605,490.54793493862,523.2511306012],"description":"Quadratic corner 7-limit. Chalmers '96"},"corner9":{"frequencies":[261.6255653006,286.15296204753,294.32876096318,327.03195662575,331.11985608357,343.38355445704,367.91095120397,392.4383479509,400.61414686654,408.78994578219,441.49314144476,457.84473927605,490.54793493862,515.07533168556,523.2511306012],"description":"First 9 harmonics of 5th through 9th harmonics"},"corners11":{"frequencies":[261.6255653006,269.80136421624,276.76092858245,279.06726965397,286.15296204753,294.32876096318,299.00064605783,304.4370214407,314.76825825228,327.03195662575,334.88072358477,341.71502406609,343.38355445704,348.83408706747,359.73515228832,380.54627680087,392.4383479509,398.6675280771,400.61414686654,408.78994578219,418.60090448096,434.91003062957,449.66894036041,457.84473927605,465.11211608996,478.40103369253,490.54793493862,494.63583439645,507.3950357345,523.2511306012],"description":"Quadratic Corners 11-limit. Chalmers '96"},"corners13":{"frequencies":[261.6255653006,265.71346475842,269.80136421624,276.76092858245,279.06726965397,286.15296204753,292.28481123426,294.32876096318,299.00064605783,304.4370214407,314.76825825228,318.85615771011,322.00069575458,327.03195662575,334.88072358477,341.71502406609,343.38355445704,345.42750418595,348.83408706747,359.73515228832,368.0007951481,371.99885066179,380.54627680087,392.4383479509,396.30854862103,398.6675280771,400.61414686654,408.78994578219,418.60090448096,425.14154361347,429.33426100611,434.91003062957,449.66894036041,457.84473927605,465.11211608996,468.3646483703,478.40103369253,490.54793493862,494.63583439645,507.3950357345,515.20111320734,523.2511306012],"description":"Quadratic Corners 13-limit. Chalmers '96"},"corners7":{"frequencies":[261.6255653006,279.06726965397,286.15296204753,294.32876096318,299.00064605783,327.03195662575,334.88072358477,341.71502406609,343.38355445704,348.83408706747,392.4383479509,398.6675280771,400.61414686654,408.78994578219,418.60090448096,457.84473927605,465.11211608996,478.40103369253,490.54793493862,523.2511306012],"description":"Quadratic Corners 7-limit. Chalmers '96"},"corrette":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,309.11326130363,327.03195662575,349.91912034749,365.63284274659,391.22147055517,411.33704984564,437.39890198442,465.11211608996,489.02683710225,523.2511306012],"description":"Corrette temperament"},"corrette2":{"frequencies":[261.6255653006,272.8349596094,292.34127285051,310.42509491746,326.6631048533,350.01785633742,365.01443422269,391.11111150212,409.71484950008,437.02884834934,466.16376151809,488.33748205014,523.2511306012],"description":"Michel Corrette, modified meantone temperament (1753)"},"coul_12":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,313.95067836072,327.03195662575,340.65828815182,363.36884069528,392.4383479509,408.78994578219,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Scale 1 5/4 3/2 2 successively split largest intervals by smallest interval"},"coul_12a":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,313.95067836072,327.03195662575,348.83408706747,376.74081403286,392.4383479509,408.78994578219,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Scale 1 6/5 3/2 2 successively split largest intervals by smallest interval"},"coul_12sup":{"frequencies":[261.6255653006,280.31310567921,294.32876096318,310.68035879446,331.39238271409,348.83408706747,373.75080757229,392.4383479509,420.46965851882,441.49314144476,466.02053819169,497.08857407114,523.2511306012],"description":"Superparticular approximation to Pythagorean scale. Op de Coul, 2003"},"coul_13":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,363.36884069528,376.74081403286,392.4383479509,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Symmetrical 13-tone 5-limit just system"},"coul_17sup":{"frequencies":[261.6255653006,276.16031892841,279.06726965397,294.57100685697,310.07474405997,313.95067836072,331.39238271409,348.83408706747,368.21375857121,372.08969287196,392.76134247596,413.43299207996,418.60090448096,441.85651028546,465.11211608996,470.92601754108,497.08857407114,523.2511306012],"description":"Superparticular approximation to Pythagorean 17-tone scale. Op de Coul, 2003"},"coul_20":{"frequencies":[261.6255653006,277.18263097687,282.2367833559,293.66476791741,305.55548036855,311.12698372208,329.62755691287,335.63799088232,349.22823143301,363.36884069528,369.99442271164,391.99543598175,399.14308682247,415.30469757995,432.12070439462,440,466.16376151809,474.66379875343,493.88330125613,513.88101620607,523.2511306012],"description":"Tuning for a 3-row symmetrical keyboard, Op de Coul, 1989"},"coul_27":{"frequencies":[261.6255653006,275.62199471997,275.93321340298,279.06726965397,293.99679436797,294.32876096318,310.07474405997,310.42486507835,327.03195662575,330.74639366397,331.11985608357,348.83408706747,367.49599295996,367.91095120397,372.08969287196,372.50983809402,392.4383479509,413.43299207996,413.89982010446,418.60090448096,440.99519155196,441.49314144476,465.11211608996,465.63729761752,490.54793493862,496.11959049595,496.67978412536,523.2511306012],"description":"Symmetrical 27-tone 5-limit just system, 67108864/66430125 and 25/24"},"counterschismic":{"frequencies":[261.6255653006,265.12640119254,268.67408364533,272.2692364133,275.65170316539,279.34022410565,283.07810312094,286.865997406,290.70457953408,294.3160713245,298.25434362449,302.24531258767,306.28968684494,310.09479611189,314.24420508029,318.4491358588,322.71033506911,327.0285519162,331.0913069245,335.5216703313,340.01131880467,344.56104171562,348.84160709651,353.50948891197,358.2398341551,363.03347451625,367.54352740958,372.46166135084,377.44560747755,382.49624206822,387.61445966759,392.4298881006,397.68103103357,403.0024376988,408.3950505989,413.46864135256,419.00130591222,424.60800114791,430.28972009123,436.04746916004,441.46459261549,447.37187116862,453.35819556254,459.4246261707,465.13216971689,471.35614630867,477.663406507,484.05506753352,490.06860102591,496.62625431187,503.27165616309,510.00598369715,516.83042094502,523.2511306012],"description":"Counterschismic temperament, g=498.082318, 5-limit"},"couperin":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,309.28785294636,327.03195662575,349.91912034749,365.63284274659,391.22147055517,408.78994578219,437.39890198442,465.24345038333,489.02683710225,523.2511306012],"description":"Couperin modified meantone"},"cross13":{"frequencies":[261.6255653006,281.75060878526,285.40970760065,290.69507255622,299.00064605783,305.22982618403,322.00069575458,332.97799220076,336.37572681506,366.27579142084,373.75080757229,406.97310157871,411.12588832951,425.14154361347,448.50096908674,457.84473927605,470.92601754108,479.64686971777,485.87604984397,523.2511306012],"description":"13-limit harmonic/subharmonic cross"},"cross2":{"frequencies":[261.6255653006,282.55561052465,339.14425131559,366.27579142084,436.04260883433,470.92601754108,560.62621135843,605.4763082671,726.73768139056,784.8766959018],"description":"Pusey's double 5-7 cross reduced by 3/1"},"cross2_5":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,348.83408706747,392.4383479509,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"double 3-5 cross reduced by 2/1"},"cross2_7":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,327.03195662575,334.88072358477,341.71502406609,348.83408706747,392.4383479509,400.61414686654,408.78994578219,418.60090448096,457.84473927605,465.11211608996,523.2511306012],"description":"longer 3-5-7 cross reduced by 2/1"},"cross3":{"frequencies":[261.6255653006,282.55561052465,311.45900631024,336.37572681506,363.28578496026,403.74315632809,436.04260883433,470.92601754108,508.60009894437,565.24041885932,610.45965236807,659.29642455751,726.73768139056,784.8766959018],"description":"Pusey's triple 5-7 cross reduced by 3/1"},"cross_7":{"frequencies":[261.6255653006,299.00064605783,327.03195662575,348.83408706747,392.4383479509,418.60090448096,457.84473927605,523.2511306012],"description":"3-5-7 cross reduced by 2/1, quasi diatonic, similar to Zalzal's, Flynn Cohen"},"cross_72":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,305.22982618403,313.95067836072,343.38355445704,348.83408706747,392.4383479509,398.6675280771,436.04260883433,448.50096908674,465.11211608996,490.54793493862,523.2511306012],"description":"double 3-5-7 cross reduced by 2/1"},"cross_7a":{"frequencies":[261.6255653006,336.37572681506,392.4383479509,436.04260883433,470.92601754108,523.2511306012,610.45965236807,784.8766959018],"description":"2-5-7 cross reduced by 3/1"},"cruciform":{"frequencies":[261.6255653006,294.32876096318,306.59245933664,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,418.60090448096,436.04260883433,490.54793493862,523.2511306012],"description":"Cruciform Lattice"},"galilei":{"frequencies":[261.6255653006,277.66336828161,293.32570896007,311.30674962848,328.86683469969,348.2210758395,368.7143392539,390.41365788584,413.39000965417,437.71854962063,463.47885582013,490.75518955849,523.2511306012],"description":"Vincenzo Galilei's approximation"},"gamelan_om":{"frequencies":[261.6255653006,280.31310567921,294.32876096318,305.22982618403,327.03195662575,348.83408706747,366.27579142084,392.4383479509,406.97310157871,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Other Music gamelan (7 limit black keys)"},"gamelan_udan":{"frequencies":[261.6255653006,261.6255653006,290.69507255622,305.22982618403,334.88072358477,351.32575911795,364.00078650518,392.4383479509,402.50086969323,465.11211608996,465.11211608996,501.44900015948,523.2511306012],"description":"Gamelan Udan Mas (approx) s6,p6,p7,s1,p1,s2,p2,p3,s3,p4,s5,p5"},"ganassi":{"frequencies":[261.6255653006,275.39533189537,290.69507255622,307.79478270659,327.03195662575,348.83408706747,369.35373924791,392.4383479509,413.09299784305,436.04260883433,461.69217405988,490.54793493862,523.2511306012],"description":"Sylvestro Ganassi's temperament (1543)"},"gann_custer":{"frequencies":[261.6255653006,269.80136421624,274.70684356563,279.06726965397,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,336.37572681506,343.38355445704,348.83408706747,353.19451315581,359.73515228832,366.27579142084,380.54627680087,392.4383479509,406.97310157871,418.60090448096,428.11456140098,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,490.54793493862,507.3950357345,523.2511306012],"description":"Kyle Gann, scale from Custer's Ghost to Sitting Bull, 1/1=G"},"gann_frac":{"frequencies":[261.6255653006,264.89588486686,294.32876096318,305.22982618403,309.04519901133,313.95067836072,348.83408706747,353.19451315581,366.27579142084,392.4383479509,397.34382730029,412.06026534844,418.60090448096,423.83341578697,457.84473927605,470.92601754108,523.2511306012],"description":"Kyle Gann, scale from Fractured Paradise, 1/1=B"},"gann_ghost":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,343.38355445704,348.83408706747,392.4383479509,406.97310157871,457.84473927605,523.2511306012],"description":"Kyle Gann, scale from Ghost Town, 1/1=E"},"gann_super":{"frequencies":[261.6255653006,287.78812183066,290.69507255622,294.32876096318,299.00064605783,313.95067836072,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,392.4383479509,411.12588832951,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,523.2511306012],"description":"Kyle Gann, scale from Superparticular Woman (1992), 1/1=G"},"gann_things":{"frequencies":[261.6255653006,266.47048317654,272.52663052146,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,336.37572681506,343.38355445704,348.83408706747,373.75080757229,387.59343007496,392.4383479509,406.97310157871,408.78994578219,436.04260883433,448.50096908674,465.11211608996,490.54793493862,498.33441009638,508.71637697339,523.2511306012],"description":"Kyle Gann, scale from How Miraculous Things Happen, 1/1=A"},"garcia":{"frequencies":[261.6255653006,268.33391312882,271.68808704293,279.06726965397,286.22284067074,294.32876096318,301.87565226992,310.07474405997,313.95067836072,322.00069575458,331.11985608357,339.61010880366,348.83408706747,357.77855083843,362.25078272391,372.08969287196,381.63045422766,392.4383479509,402.50086969323,407.5321305644,418.60090448096,429.33426100611,441.49314144476,452.81347840488,465.11211608996,470.92601754108,483.00104363188,496.11959049595,509.4151632055,523.2511306012],"description":"Linear 29-tone scale by Jos� L. Garcia, 1988 15/13-52/45 alternating"},"garibaldi24":{"frequencies":[261.6255653006,271.45160478635,275.48458787532,290.07776082447,294.38747453868,305.44397410364,309.9819851541,326.40257969757,331.25197480486,343.69301829526,348.79929894143,361.89937857146,367.27615309757,386.73177659938,392.47748849606,407.21801775129,413.26809573999,435.16003837828,441.62525370518,458.21165716245,465.0193526482,489.65270106975,496.92751922541,515.59094540799,523.2511306012],"description":"Garibaldi[24] in 94-tET tuning."},"genovese":{"frequencies":[261.6255653006,277.01530443593,277.97716313189,279.06726965397,280.31310567921,281.75060878526,283.42769574232,285.40970760065,287.78812183066,290.69507255622,294.32876096318,296.50897400735,299.00064605783,301.87565226992,305.22982618403,307.79478270659,309.19384990071,313.95067836072,317.68818643644,319.76457981184,322.00069575458,327.03195662575,332.97799220076,336.37572681506,338.57426097725,340.11323489078,342.12573923925,348.83408706747,356.76213450082,359.73515228832,362.25078272391,366.27579142084,369.35373924791,370.63621750918,373.75080757229,377.90359432309,380.54627680087,383.71749577421,392.4383479509,400.13321751856,402.50086969323,404.33041910093,406.97310157871,411.12588832951,418.60090448096,425.14154361347,428.11456140098,430.91269578922,436.04260883433,442.75095666255,444.76346101102,448.50096908674,453.48431318771,457.84473927605,461.69217405988,465.11211608996,470.92601754108,475.68284600109,479.64686971777,483.00104363188,485.87604984397,488.36772189445,490.54793493862,492.47165233054,494.18162334558,523.2511306012],"description":"Denny Genovese's 65-note scale. 3/2=384 Hz"},"genovese_12":{"frequencies":[261.6255653006,285.40970760065,294.32876096318,313.95067836072,327.03195662575,348.83408706747,359.73515228832,392.4383479509,425.14154361347,448.50096908674,457.84473927605,490.54793493862,523.2511306012],"description":"Denny Genovese's superposition of harmonics 8-16 and subharmonics 6-12"},"genovese_38":{"frequencies":[261.6255653006,280.31310567921,283.42769574232,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,309.19384990071,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,340.11323489078,348.83408706747,356.76213450082,359.73515228832,366.27579142084,373.75080757229,377.90359432309,380.54627680087,392.4383479509,406.97310157871,411.12588832951,418.60090448096,425.14154361347,428.11456140098,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,485.87604984397,490.54793493862,523.2511306012],"description":"Denny Genovese's 38-note scale. Harm 1..16 x Subh. 1..12"},"gf1-2":{"frequencies":[261.6255653006,269.29177952703,277.18263097687,285.30470202322,293.66476791741,311.12698372208,320.24370022528,339.28638158975,349.22823143301,359.46139971304,380.8360868427,403.48177901006,415.30469757995,440,466.16376151809,493.88330125613,523.2511306012],"description":"16-note scale with all possible quadruplets of 50 & 100 c. Galois Field GF(2)"},"gf2-3":{"frequencies":[261.6255653006,270.85177093588,280.40333801024,290.29174037004,300.52885648597,316.56538760238,327.729041887,345.21700307457,357.39105439675,369.99442271164,389.73770840504,410.5345162762,425.01198472693,447.69106452518,471.58032351597,496.7443381147,523.2511306012],"description":"16-note scale with all possible quadruplets of 60 & 90 c. Galois Field GF(2)"},"gilson7":{"frequencies":[261.6255653006,261.6255653006,299.00064605783,313.95067836072,327.03195662575,392.4383479509,373.75080757229,392.4383479509,408.78994578219,408.78994578219,467.18850946536,490.54793493862,523.2511306012],"description":"Gilson septimal"},"gilson7a":{"frequencies":[261.6255653006,261.6255653006,280.31310567921,299.00064605783,313.95067836072,336.37572681506,373.75080757229,373.75080757229,392.4383479509,418.60090448096,470.92601754108,470.92601754108,523.2511306012],"description":"Gilson septimal 2"},"golden_10":{"frequencies":[261.6255653006,287.58715183149,304.90466328003,323.26497397694,342.73087946949,376.74069565061,399.42672527674,423.47882962254,465.50141625349,493.53231135469,523.2511306012],"description":"Golden version of Rapoport's Major 10 out of 13"},"golden_5":{"frequencies":[261.6255653006,327.03195662575,343.38355445704,392.4383479509,425.14154361347,523.2511306012],"description":"Golden pentatonic"},"gradus10":{"frequencies":[261.6255653006,290.69507255622,299.00064605783,305.22982618403,490.54793493862,882.98628288953,930.22423217991,941.85203508216,1220.91930473613,1255.80271344288,1674.40361792384,2747.0684356563,3270.3195662575,3488.34087067467,5886.5752192635,10595.8353946743,10988.2737426252,11162.69078615893,13081.27826503,14651.0316568336,23546.300877054,31395.067836072,41860.090448096,42383.3415786972,56511.1221049296,75348.1628065728,100464.2170754304,133952.2894339072],"description":"Intervals > 1 with Gradus = 10"},"gradus3":{"frequencies":[261.6255653006,784.8766959018,1046.5022612024],"description":"Intervals > 1 with Gradus = 3"},"gradus4":{"frequencies":[261.6255653006,392.4383479509,1569.7533918036,2093.0045224048],"description":"Intervals > 1 with Gradus = 4"},"gradus5":{"frequencies":[261.6255653006,348.83408706747,1308.127826503,2354.6300877054,3139.5067836072,4186.0090448096],"description":"Intervals > 1 with Gradus = 5"},"gradus6":{"frequencies":[261.6255653006,654.0639132515,697.66817413493,1177.3150438527,2616.255653006,4709.2601754108,6279.0135672144,8372.0180896192],"description":"Intervals > 1 with Gradus = 6"},"gradus7":{"frequencies":[261.6255653006,327.03195662575,436.04260883433,588.65752192635,1395.33634826987,1831.3789571042,3924.383479509,5232.511306012,7063.8902631162,9418.5203508216,12558.0271344288,16744.0361792384],"description":"Intervals > 1 with Gradus = 7"},"gradus8":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,418.60090448096,872.08521766867,915.6894785521,1962.1917397545,2790.67269653973,3531.9451315581,3662.7579142084,7848.766959018,10465.022612024,14127.7805262324,18837.0407016432,25116.0542688576,33488.0723584768],"description":"Intervals > 1 with Gradus = 8"},"gradus9":{"frequencies":[261.6255653006,457.84473927605,465.11211608996,470.92601754108,610.45965236807,627.90135672144,837.20180896192,981.09586987725,1744.17043533733,1765.97256577905,5494.1368713126,5581.34539307947,6540.639132515,7325.5158284168,11773.150438527,15697.533918036,20930.045224048,21191.6707893486,28255.5610524648,37674.0814032864,50232.1085377152,66976.1447169536],"description":"Intervals > 1 with Gradus = 9"},"grady11":{"frequencies":[261.6255653006,277.4816601673,290.69507255622,305.22982618403,332.97799220076,356.76213450082,378.42269266694,392.4383479509,420.46965851882,458.69417292962,481.6288815761,504.56359022259,523.2511306012],"description":"Kraig Grady's dual [5 7 9 11] hexany scale"},"grady7":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,305.22982618403,327.03195662575,348.83408706747,366.27579142084,392.4383479509,406.97310157871,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Kraig Grady's 7-limit \"Centaur\" scale (1987), see Xenharmonikon 16"},"grady7t":{"frequencies":[261.6255653006,274.79177208104,293.65339461903,305.54250820508,326.68804977983,349.10444036529,366.6627351378,392.00975085961,407.77240291308,436.0718257558,457.96530027286,489.37179607373,523.2511306012],"description":"Tempered version of grady7 with egalised 225/224"},"grady_14":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,305.22982618403,327.03195662575,343.38355445704,348.83408706747,366.27579142084,392.4383479509,412.06026534844,441.49314144476,457.84473927605,490.54793493862,515.07533168556,523.2511306012],"description":"Kraig Grady, letter to Lou Harrison, published in 1/1 7 (1) 1991 p 5."},"grammateus":{"frequencies":[261.6255653006,277.49581689502,294.32876096318,312.18279369479,331.11985608357,348.83408706747,369.99442271164,392.4383479509,416.24372513446,441.49314144476,468.27419030811,496.67978412536,523.2511306012],"description":"H. Grammateus (Heinrich Schreiber) (1518). B-F# and Bb-F 1/2 P. Also Marpurg temp.nr.6"},"graupner":{"frequencies":[261.6255653006,277.083518473,293.59062125964,310.9808189359,329.55130849159,349.11528328816,370.00708353276,392.01655298731,415.20348378516,439.96413779539,466.04943410823,493.90517116572,523.2511306012],"description":"Johann Gottlieb Graupner's temperament (1819)"},"groenewald_21":{"frequencies":[261.6255653006,275.93321340298,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,330.74639366397,348.83408706747,367.91095120397,372.08969287196,392.4383479509,413.89982010446,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,496.11959049595,523.2511306012],"description":"J�rgen Gr�newald, new meantone temperament I (2000)"},"gross":{"frequencies":[13.75,13.83042567154,13.91662997964,13.99803029322,14.07990672861,14.1622619889,14.24509903843,14.32842061343,14.41222946472,14.49652860895,14.58132083065,14.67220542837,14.75802520833,14.84434696019,14.93117353378,15.01850805439,15.10635340681,15.19471249121,15.28358848801,15.37298433293,15.46880332718,15.55928251958,15.65029093742,15.74183158529,15.83390775812,15.92652249736,16.01967895316,16.113380201,16.20762961362,16.30865090754,16.4040424858,16.49999202274,16.59650278193,16.69357794961,16.79122101993,16.88943521823,16.98822378696,17.08759028197,17.18753798549,17.29466699621,17.39582592037,17.49757653721,17.59992220598,17.70286661052,17.80641315127,17.91056524676,18.01532664586,18.12070080902,18.23364617402,18.34029731861,18.44757228066,18.55547460176,18.66400816581,18.77317655783,18.88298349104,18.99343259063,19.10452783216,19.2236053387,19.33604689279,19.44914613325,19.56290690697,19.67733296969,19.79242844011,19.90819712001,20.02464283144,20.14176976577,20.26731246322,20.38585868839,20.50509842475,20.62503561099,20.74567420676,20.86701855437,20.98907266203,21.11184068121,21.23532666504,21.36768545088,21.49266790503,21.61838152318,21.74483045784,21.87201888365,21.99995137868,22.12863216875,22.25806563075,22.38825603783,22.52780097787,22.65956910312,22.79210808945,22.92542231482,23.05951631373,23.1943945132,23.33006176809,23.46652255971,23.60378139323,23.75090264526,23.88982499399,24.02955978014,24.17011203339,24.3114863964,24.45368753658,24.59672057234,24.74059022832,24.88530139802,25.04041015894,25.18687501732,25.33419642278,25.48237967807,25.63142967793,25.78135134315,25.93215007005,26.08383083979,26.23639881154,26.39992889083,26.55434576426,26.70966568928,26.86589425653,27.0230366265,27.18109814415,27.34008402779,27.5],"description":"Gross temperament, g=91.531021, 5-limit"},"groven":{"frequencies":[261.6255653006,264.7464578752,272.5650766677,275.81646505128,279.10663876478,290.77709705464,294.24573392894,297.75574765819,306.54921255625,310.20599265769,313.90639394672,327.03195662575,330.93307160522,334.88072358477,344.77058253591,348.88329767713,353.04507480266,363.47137260637,367.80716871461,372.19468374184,387.75749219625,392.38299382393,397.06367008113,408.78994578219,413.66634097248,418.60090448096,436.10412364188,441.30634506723,446.57062302059,459.75895986689,465.24335632603,470.79317533731,484.69686416326,490.47874118496,496.32958936031,517.08292506126,523.2511306012],"description":"Eivind Groven's 36-tone scale with 1/8-schisma temp. fifths and 5/4 (1948)"},"groven_ji":{"frequencies":[261.6255653006,264.89588486686,272.52663052146,275.93321340298,279.06726965397,290.69507255622,294.32876096318,297.67175429757,306.59245933664,310.07474405997,313.95067836072,327.03195662575,331.11985608357,334.88072358477,344.91651675372,348.83408706747,353.19451315581,363.36884069528,367.91095120397,372.08969287196,387.59343007496,392.4383479509,396.89567239676,408.78994578219,413.89982010446,418.60090448096,436.04260883433,441.49314144476,446.50763144636,459.88868900496,465.11211608996,470.92601754108,484.4917875937,490.54793493862,496.11959049595,517.37477513058,523.2511306012],"description":"Untempered version of Groven's 36-tone scale"},"gumbeng":{"frequencies":[261.6255653006,305.03156112838,348.43777142572,394.8168394034,470.9259392365,525.62941881859],"description":"Scale of gumbeng ensemble, Java. 1/1=440 Hz."},"gunkali":{"frequencies":[261.6255653006,275.93321340298,282.55561052465,348.83408706747,392.4383479509,408.78994578219,418.60090448096,523.2511306012],"description":"Indian mode Gunkali, see Dani�lou: Intr. to the Stud. of Mus. Scales, p.175"},"gyaling":{"frequencies":[261.6255653006,283.49766588023,307.55338551939,339.28638158975,347.81902735497,393.58362272115,435.9522698367],"description":"Tibetan Buddhist Gyaling tones measured from CD \"The Diamond Path\", Ligon 2002"},"far12_104":{"frequencies":[261.6255653006,276.7193479141,294.32876096318,311.93817401225,329.54758706133,349.67263054599,369.79767403066,392.4383479509,415.07902187114,440.23532622697,465.3916305828,493.06356537421,523.2511306012],"description":"Farey approximation to 12-tET with den=104"},"far12_65":{"frequencies":[261.6255653006,277.72560008833,293.82563487606,309.92566966379,330.05071314845,350.17575663311,370.30080011777,390.42584360243,414.57589578403,438.72594796562,466.90100884415,495.07606972267,523.2511306012],"description":"Farey approximation to 12-tET with den=65"},"far12_80":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,330.30227619201,349.92419358955,369.5461109871,392.4383479509,415.3305849147,441.49314144476,467.65569797482,493.81825450488,523.2511306012],"description":"Farey approximation to 12-tET with den=80"},"farey3":{"frequencies":[261.6255653006,313.95067836072,348.83408706747,392.4383479509,418.60090448096,523.2511306012],"description":"Farey fractions between 0 and 1 until 3rd level, normalised by 2/1"},"farey4":{"frequencies":[261.6255653006,299.00064605783,313.95067836072,327.03195662575,348.83408706747,373.75080757229,392.4383479509,418.60090448096,448.50096908674,523.2511306012],"description":"Farey fractions between 0 and 1 until 4th level, normalised by 2/1"},"farey5":{"frequencies":[261.6255653006,285.40970760065,290.69507255622,299.00064605783,305.22982618403,313.95067836072,322.00069575458,327.03195662575,332.97799220076,348.83408706747,366.27579142084,373.75080757229,380.54627680087,392.4383479509,402.50086969323,406.97310157871,418.60090448096,436.04260883433,448.50096908674,465.11211608996,523.2511306012],"description":"Farey fractions between 0 and 1 until 5th level, normalised by 2/1"},"farnsworth":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,343.38355445704,392.4383479509,441.49314144476,490.54793493862,523.2511306012],"description":"Farnsworth's scale"},"fibo_9":{"frequencies":[261.6255653006,277.97716313189,327.03195662575,343.38355445704,363.82305174615,392.4383479509,425.14154361347,449.66894036041,523.2511306012],"description":"First 9 Fibonacci terms reduced by 2/1, B. McLaren, XH 13, 1991"},"finnamore":{"frequencies":[261.6255653006,277.97716313189,310.68035879446,348.83408706747,392.4383479509,416.96574469783,457.84473927605,466.02053819169,523.2511306012],"description":"David J. Finnamore, Tuning List 9 May '97. Tetrachordal scale, 17/16x19/17x64/57"},"finnamore53":{"frequencies":[261.6255653006,286.15296204753,310.68035879446,327.03195662575,343.38355445704,359.73515228832,367.91095120397,376.08675011961,392.4383479509,408.78994578219,416.96574469783,425.14154361347,433.31734252912,441.49314144476,457.84473927605,474.19633710734,523.2511306012],"description":"David J. Finnamore, tuning for \"Crawlspace\", 53-limit, 1998."},"finnamore_11":{"frequencies":[261.6255653006,287.78812183066,294.32876096318,305.22982618403,323.76163705949,331.11985608357,343.38355445704,348.83408706747,392.4383479509,431.68218274599,441.49314144476,457.84473927605,485.64245558924,515.07533168556,523.2511306012],"description":"David J. Finnamore, 11-limit scale, Tuning List 3 Sept '98"},"finnamore_7":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,309.04519901133,331.11985608357,348.83408706747,366.27579142084,392.4383479509,412.06026534844,441.49314144476,463.567798517,496.67978412536,523.2511306012],"description":"David J. Finnamore, TL 1 Sept '98. 7-tone Pyth. with 9/8 div. in 21/20 &15/14"},"finnamore_7a":{"frequencies":[261.6255653006,280.31310567921,294.32876096318,315.35224388912,331.11985608357,348.83408706747,373.75080757229,392.4383479509,420.46965851882,441.49314144476,473.02836583367,496.67978412536,523.2511306012],"description":"David J. Finnamore, TL 1 Sept '98. 7-tone Pyth. with 9/8 div. in 15/14 &21/20"},"finnamore_jc":{"frequencies":[261.6255653006,276.16031892841,310.68035879446,348.83408706747,392.4383479509,414.24047839262,466.02053819169,523.2511306012],"description":"Chalmers' modification of Finnamore. Tuning List 9-5-97 19/18 x 9/8 x 64/57"},"fisher":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,310.67535808973,327.03195662575,349.71841093413,365.63284485857,391.22147055517,410.55062036439,437.39890198442,467.47330218196,489.02683992698,523.2511306012],"description":"Alexander Metcalf Fisher's modified meantone temperament (1818)"},"fj-10tet":{"frequencies":[261.6255653006,280.31310567921,300.51585203447,322.00069575458,345.20039866051,370.01329949656,396.52624740872,425.14154361347,455.42228033808,488.36772189445,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 10-tet"},"fj-12tet":{"frequencies":[261.6255653006,277.19851561611,293.6613488068,311.12229387098,329.64821227876,348.83408706747,370.01329949656,391.99491478937,415.52295665389,440.00663255101,466.16918908107,490.54793493862,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 12-tet"},"fj-13tet":{"frequencies":[261.6255653006,275.96121271433,291.05844139692,306.97399661937,323.91736656265,341.56671025356,360.27127025001,379.97998769849,400.78810003496,422.62591317789,445.95266812602,41.6222490251,496.18641694941,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 13-tet"},"fj-14tet":{"frequencies":[261.6255653006,274.92856014639,288.87822835275,303.4856557487,318.85615771011,335.0643204727,352.18826098158,370.01329949656,388.70083987518,408.5030756448,429.33426100611,451.0785608631,473.88781639354,497.93252750759,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 14-tet"},"fj-15tet":{"frequencies":[261.6255653006,274.08392555301,286.94416839421,300.51585203447,314.76825825228,329.64821227876,345.20039866051,361.51896296083,378.66858135613,396.52624740872,415.52295665389,392.4383479509,455.42228033808,477.08191319521,499.46698830115,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 15-tet"},"fj-16tet":{"frequencies":[261.6255653006,273.25336820285,285.40970760065,297.96244937013,311.12229387098,324.92207303462,339.29565499922,354.2846196779,370.01329949656,386.4008349055,403.52417698906,421.50785520652,440.00663255101,459.44001711325,479.64686971777,500.9851250437,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 16-tet"},"fj-17tet":{"frequencies":[261.6255653006,272.52663052146,283.8915708581,295.75063903546,307.98958953109,320.70230585235,334.29933343966,348.03400888612,362.53828334512,373.75080757229,392.4383479509,409.71550792358,426.86276443782,444.76346101102,462.87600014722,482.37213602298,502.32108537715,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 17-tet"},"fj-18tet":{"frequencies":[261.6255653006,271.88539139082,282.55561052465,293.6613488068,305.22982618403,317.12189733406,329.64821227876,342.60490694126,355.98232655655,370.01329949656,384.51030051755,399.57359064092,415.52295665389,431.68218274599,448.50096908674,466.16918908107,484.4917875937,503.12608711654,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 18-tet"},"fj-19tet":{"frequencies":[261.6255653006,271.31540105247,281.44568388398,291.81313052759,302.73815413355,313.95067836072,325.69713231299,337.73482066077,350.31219760589,363.36884069528,376.74081403286,390.78248994267,405.26313056367,420.46965851882,436.04260883433,451.89870370104,468.95148497277,485.87604984397,504.56359022259,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 19-tet"},"fj-20tet":{"frequencies":[261.6255653006,270.8594087818,280.31310567921,290.29686012806,300.51585203447,311.12229387098,322.00069575458,333.44434793214,345.20039866051,357.34223553253,370.01329949656,383.09457776159,396.52624740872,410.48149038542,425.14154361347,440.00663255101,455.42228033808,470.92601754108,488.36772189445,505.41302387616,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 20-tet"},"fj-21tet":{"frequencies":[261.6255653006,270.34641747729,279.46367202564,288.87822835275,298.56093922539,308.58400009814,318.85615771011,329.64821227876,340.72166643799,352.18826098158,364.00078650518,376.08675011961,388.70083987518,401.78211814021,415.52295665389,429.33426100611,443.62595855319,457.84473927605,473.88781639354,489.85212226495,506.18859373377,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 21-tet"},"fj-22tet":{"frequencies":[261.6255653006,270.06509966514,278.68810216803,287.55242312318,296.76929795292,306.29334474217,316.13089140489,326.18252297218,336.37572681506,347.40443916965,358.52392281934,370.01329949656,381.83190611439,392.4383479509,392.4383479509,419.69101100305,433.03541842858,446.94367405519,461.28718092474,475.68284600109,491.34557385722,506.89953276991,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 22-tet"},"fj-23tet":{"frequencies":[261.6255653006,269.55361273395,277.97716313189,286.37392958579,295.1673044417,304.21577360535,313.47928094576,323.18452184192,332.97799220076,343.1154954762,353.6790049434,364.40703738298,375.66747838035,387.20583664489,398.97898708342,411.12588832951,423.58424858192,436.04260883433,449.99597231703,463.79077485106,477.96978276071,492.47165233054,507.86139146587,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 23-tet"},"fj-24tet":{"frequencies":[261.6255653006,269.32043486826,277.19851561611,285.40970760065,293.6613488068,302.32287545847,311.12229387098,320.2657782128,329.64821227876,339.29565499922,348.83408706747,348.83408706747,370.01329949656,380.54627680087,391.99491478937,403.52417698906,415.52295665389,427.53446036927,440.00663255101,452.81347840488,466.16918908107,479.64686971777,490.54793493862,508.30109829831,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 24-tet"},"fj-26tet":{"frequencies":[261.6255653006,268.69652652494,275.96121271433,283.42769574232,291.05844139692,299.00064605783,306.97399661937,315.29234792636,323.91736656265,332.57487114483,341.56671025356,350.8160989258,360.27127025001,370.01329949656,379.97998769849,390.22118214327,400.78810003496,411.12588832951,422.62591317789,434.18710837121,445.95266812602,457.84473927605,457.84473927605,483.00104363188,496.18641694941,509.48136400643,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 26-tet"},"fj-30tet":{"frequencies":[261.6255653006,267.70988077271,274.08392555301,280.31310567921,286.94416839421,293.6613488068,300.51585203447,307.52478728316,314.76825825228,322.00069575458,329.64821227876,337.35928157183,345.20039866051,353.19451315581,361.51896296083,370.01329949656,378.66858135613,387.59343007496,396.52624740872,405.78659107848,415.52295665389,425.14154361347,392.4383479509,444.76346101102,455.42228033808,466.16918908107,477.08191319521,488.36772189445,499.46698830115,511.35905945117,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 30-tet"},"fj-31tet":{"frequencies":[261.6255653006,267.57160087561,273.51763645063,279.79400733536,286.15296204753,292.60754013883,299.00064605783,305.96888145324,312.81317590289,319.76457981184,327.03195662575,334.53760808929,342.12573923925,349.884792149,357.81143489641,366.27579142084,373.75080757229,382.37582620857,391.25985441351,400.13321751856,409.20921752145,418.60090448096,428.11456140098,437.54620403721,447.51741432997,457.84473927605,467.90726101838,478.40103369253,489.12605686634,500.50108144463,511.62332769895,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 31-tet"},"fj-36tet":{"frequencies":[261.6255653006,266.75547834571,271.88539139082,277.19851561611,282.55561052465,288.08208313999,293.6613488068,299.00064605783,305.22982618403,311.12229387098,317.12189733406,323.18452184192,329.64821227876,327.03195662575,342.60490694126,348.83408706747,355.98232655655,362.89997767503,370.01329949656,377.22755927063,384.51030051755,391.99491478937,399.57359064092,406.97310157871,415.52295665389,423.35773294097,431.68218274599,440.00663255101,448.50096908674,436.04260883433,466.16918908107,475.19745534191,484.4917875937,490.54793493862,503.12608711654,513.18860885887,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 36-tet"},"fj-41tet":{"frequencies":[261.6255653006,266.05989691586,270.64713651786,275.21650375777,279.87851171692,284.71017400359,289.532292266,294.32876096318,299.49242343621,304.63250754179,309.81974838229,315.13988547572,320.49131749323,325.95972070239,331.39238271409,337.09447836808,342.81970625596,348.83408706747,354.64798851859,360.72615821749,366.27579142084,373.13810133036,379.35706968587,386.00493241072,392.4383479509,399.32323124828,405.97070477679,413.09299784305,419.97788114044,427.14378008261,434.48531380278,441.85651028546,449.45930449077,436.04260883433,465.11211608996,472.93852188955,480.82536325516,489.12605686634,497.08857407114,505.80942624783,514.53027842451,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 41-tet"},"fj-42tet":{"frequencies":[261.6255653006,265.98599138894,270.34641747729,274.92856014639,279.46367202564,284.05061375494,288.87822835275,293.6613488068,298.56093922539,303.4856557487,308.58400009814,313.7026920429,318.85615771011,324.18820048118,329.64821227876,335.0643204727,340.72166643799,346.37750898953,352.18826098158,358.01393146398,364.00078650518,370.01329949656,376.08675011961,382.37582620857,388.70083987518,395.22159864559,401.78211814021,408.5030756448,415.52295665389,422.16852582597,429.33426100611,436.04260883433,443.62595855319,451.0785608631,457.84473927605,466.16918908107,473.88781639354,481.94183081689,489.85212226495,497.93252750759,506.18859373377,514.81159623666,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 42-tet"},"fj-43tet":{"frequencies":[261.6255653006,265.84533248287,270.2034526875,274.70684356563,279.06726965397,283.42769574232,288.1672893166,292.86443876933,297.71185016965,302.50455987882,307.4100392282,312.38873468728,317.43901923139,322.67153053741,327.85988562987,332.97799220076,338.57426097725,344.24416486921,348.83408706747,355.41586229515,361.11697745717,367.05676325756,372.95559308809,379.09010482332,385.17097113699,391.45479319413,397.88888056133,404.33041910093,392.4383479509,417.48760420309,424.25767346043,431.1976909584,438.2228218785,445.32011114996,452.54151835779,459.82675113439,467.18850946536,475.05694751951,483.00104363188,490.54793493862,498.33441009638,506.89953276991,514.81159623666,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 43-tet"},"fj-53tet":{"frequencies":[261.6255653006,265.06800694929,268.51044859798,272.09058791262,275.69145590816,279.30296836145,282.98275430473,286.71294827463,290.48132617934,294.32876096318,298.13145813324,302.11523612093,306.05254808749,310.07474405997,313.95067836072,318.31110444906,322.46872002167,326.7649917632,331.03642956402,335.41739141103,336.37572681506,344.24416486921,348.83408706747,353.42400926572,358.01393146398,362.89997767503,367.52162744608,372.31330446624,377.3445653374,382.37582620857,387.20583664489,392.4383479509,397.67085925691,402.82031482791,408.13588186894,413.53718386224,418.60090448096,424.41480593208,429.81342870813,436.04260883433,441.49314144476,447.29532132038,453.1728541814,459.07882213124,465.11211608996,470.92601754108,477.46665667359,483.76047923507,485.87604984397,496.55464434604,503.12608711654,509.83443494476,516.36624730382,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 53-tet"},"fj-54tet":{"frequencies":[261.6255653006,265.02329991489,268.42103452919,271.88539139082,275.39533189537,279.06726965397,282.55561052465,286.15296204753,289.90941019796,293.6613488068,297.46468383493,301.26580246736,305.22982618403,309.19384990071,313.15787361738,317.12189733406,321.29455387793,325.43667878855,329.64821227876,333.91683992313,338.19890148614,342.60490694126,346.93824963775,351.55935337268,355.98232655655,360.61902244137,365.28852513669,370.01329949656,374.76094489005,379.61356533813,384.51030051755,389.53139722534,394.5147413263,399.57359064092,404.77917650282,409.88005230427,415.52295665389,420.652869699,426.07592063241,431.68218274599,436.04260883433,442.75095666255,448.50096908674,454.40229762736,460.26719821402,466.16918908107,472.20223981084,478.40103369253,484.4917875937,490.54793493862,497.08857407114,503.12608711654,510.16985233617,516.54278277298,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 54-tet"},"fj-55tet":{"frequencies":[261.6255653006,264.93728131706,268.33391312882,271.68808704293,275.15792212649,278.68810216803,282.14521748104,285.77561748219,289.37373131733,293.02063313667,296.76929795292,300.51585203447,304.33994330886,308.21641939523,312.11470948142,316.13089140489,319.76457981184,324.10331223806,328.22116374075,332.33517754401,336.37572681506,340.90603963412,345.20039866051,348.83408706747,353.96400011258,358.52392281934,363.07221307022,367.68998366571,372.31330446624,377.04860881557,381.83190611439,386.75083566176,391.58336244338,396.52624740872,401.56482115906,406.65712867376,411.81801945465,416.96574469783,418.60090448096,427.65717404906,433.03541842858,438.60756535689,444.15502946381,449.8123754291,455.42228033808,461.28718092474,467.18850946536,472.93852188955,479.03272519828,485.0974023282,491.34557385722,497.60156537565,503.87145909745,510.16985233617,516.71049146868,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 55-tet"},"fj-5tet":{"frequencies":[261.6255653006,300.51585203447,345.20039866051,396.52624740872,455.42228033808,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 5-tet"},"fj-60tet":{"frequencies":[261.6255653006,264.66772303665,267.70988077271,270.8594087818,274.08392555301,277.19851561611,280.31310567921,283.6903720127,286.94416839421,290.29686012806,293.6613488068,297.10021822272,300.51585203447,304.05133264664,307.52478728316,311.12229387098,314.76825825228,318.50068819203,322.00069575458,325.79787377056,329.64821227876,333.44434793214,337.35928157183,341.25073734861,345.20039866051,348.83408706747,353.19451315581,357.34223553253,361.51896296083,365.74186169574,370.01329949656,374.3258088147,378.66858135613,383.09457776159,387.59343007496,391.99491478937,396.52624740872,401.15920012759,405.78659107848,410.48149038542,415.52295665389,420.18651396763,425.14154361347,429.81342870813,434.91003062957,440.00663255101,444.76346101102,450.23934493592,455.42228033808,460.95932933915,466.16918908107,470.92601754108,477.08191319521,482.55382044333,488.36772189445,490.54793493862,499.46698830115,505.41302387616,511.35905945117,517.30509502619,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 60-tet"},"fj-66tet":{"frequencies":[261.6255653006,264.37951861955,267.19206668997,270.06509966514,272.83808952777,275.76748774928,278.68810216803,281.58005756929,284.57517629188,287.55242312318,290.69507255622,293.6613488068,296.76929795292,299.91223339337,302.93486508491,306.29334474217,309.48390041656,312.81317590289,316.13089140489,319.38705374359,322.78478835788,326.18252297218,329.64821227876,332.97799220076,336.37572681506,340.11323489078,343.8507429665,347.40443916965,351.12904816659,354.74652922115,358.52392281934,362.25078272391,366.27579142084,370.01329949656,373.75080757229,377.90359432309,381.83190611439,385.89770881839,389.97018224052,392.4383479509,398.12586024004,402.50086969323,406.65712867376,411.12588832951,415.52295665389,419.69101100305,424.01384721132,428.62060698183,433.03541842858,437.71969579139,442.27178896054,446.94367405519,451.89870370104,456.45311392871,461.28718092474,466.16918908107,470.92601754108,475.68284600109,481.05345877852,485.87604984397,491.34557385722,496.41773928832,501.44900015948,506.89953276991,512.35006538034,517.80059799077,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 66-tet"},"fj-72tet":{"frequencies":[195.99771799087,197.9006084568,199.84081050049,201.76235675531,203.68390301012,205.67661764474,207.66424882366,209.67197738558,211.67753543014,213.81569235368,215.817711945,217.77524221208,219.99743856118,222.13074705632,223.99739198957,226.48625190056,228.66400432268,230.8417567448,233.07836734049,235.19726158904,237.57299150408,239.92824098882,242.11482810637,244.5635242187,246.9571246685,249.45164107929,251.74018824515,254.18454051941,256.66367832138,259.11562717437,261.33029065449,264.17083729204,266.68541956135,269.28382123963,271.86780237443,274.39680518722,277.19677258709,279.99673998696,282.60136082405,285.0875898049,288.0572521987,290.83532347032,293.66437746429,296.5093682426,299.34196929515,302.30156503677,304.88533909691,307.99641398565,311.29049327962,313.59634878539,317.15994365795,320.28895378996,323.39623468494,326.46784071315,329.63252571192,332.8263135694,335.99608798435,339.22681959958,342.55457018224,345.87832586624,349.232297511,352.79589238357,355.99585512627,359.32914964993,362.95873702013,366.4305162438,367.49572123288,373.6206499201,376.91868844398,380.79556638226,384.45706221286,388.2262490973,391.99543598174],"description":"Franck Jedrzejewski continued fractions approx. of 72-tet"},"fj-78tet":{"frequencies":[138.59131548844,139.82873794816,141.06616040788,142.33702671786,143.60064014465,144.89092073791,146.18536017274,147.4753741736,148.781853392,150.14059177914,151.48353088271,152.80580938469,154.18283848089,155.56168065029,156.95883922787,158.39007484393,159.76498868806,161.21846903757,162.6138101731,164.12129465736,165.53962683341,167.02030328094,168.55700532378,170.00534699915,171.58924774759,173.06676710248,174.62505751543,176.17540104463,177.75842638735,179.35346710269,180.93866188769,182.53490332624,184.15558359423,185.8383548595,187.50589742554,188.98815748424,190.84705739392,192.48793817839,194.02784168382,196.00771761937,197.74614527009,199.57149430335,201.28738678083,203.10796235375,204.87411854813,206.71247055903,207.88697323266,210.45347907504,212.31010032272,214.18657848213,216.10849194808,217.78635291041,220.11561871693,221.7461047815,223.87827886594,225.96410133985,228.00506741647,230.00260868294,232.05987709692,234.17153306667,236.2351968553,238.37706264012,240.41350645954,242.53480210477,244.7463656498,246.9445257794,249.1343885566,251.39820018833,253.59261982991,255.8608901325,258.1602935569,260.55167311827,262.84559834014,265.13121223875,267.51346943117,269.88835121433,272.23294113801,274.70778605744,277.18263097688],"description":"Franck Jedrzejewski continued fractions approx. of 78-tet"},"fj-7tet":{"frequencies":[261.6255653006,288.87822835275,318.85615771011,352.18826098158,388.70083987518,429.33426100611,473.88781639354,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 7-tet"},"fj-84tet":{"frequencies":[97.99885899544,98.81551615374,99.63217331203,100.44883047033,101.26548762862,102.12512674262,102.98185182572,103.83212441184,104.68059938149,105.53723276432,106.39876119505,107.33208366167,108.20707347413,109.09306944775,109.9987192806,110.89344570537,111.83399203009,112.76581035092,113.67867643471,114.64017467391,115.58839778949,116.53918367025,117.50574088079,118.47623251688,119.43610940069,120.45693084856,121.43336875522,122.4985737443,123.47856233425,124.48503710232,125.50731064328,126.58185953578,127.62642101732,128.62350243151,129.74496824748,130.66514532725,131.9215409554,132.99845149381,134.10370178323,135.17083999371,136.34623860235,137.19840259362,138.59838629355,139.73911375276,140.87335980595,142.09834554339,143.22910160872,144.41937115117,145.59830479323,146.83218873215,148.0408295463,149.25980062382,150.498247743,151.74016876713,153.01576229113,154.29607586516,155.64524663982,156.7981743927,158.13452246991,159.45577056885,160.81864040277,162.07503603092,163.33143165907,164.81626285597,166.17197829662,167.54643634704,168.96354999214,170.33135015874,171.49800324202,173.20728566636,174.61614875551,176.03498745477,177.50736723702,178.95443816559,180.52421393897,181.99788099153,183.48722535316,183.74786061645,186.51395744293,188.05186455882,189.60648805639,191.21728584476,192.8364644749,194.36440367429,195.99771799088],"description":"Franck Jedrzejewski continued fractions approx. of 84-tet"},"fj-8tet":{"frequencies":[261.6255653006,285.40970760065,311.12229387098,339.29565499922,370.01329949656,403.52417698906,440.00663255101,479.64686971777,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 8-tet"},"fj-90tet":{"frequencies":[69.29565774422,69.83283338565,70.37840239647,70.9071846685,71.46114704873,72.0131345185,72.59545097014,73.14541650779,73.69538204544,74.24534758309,74.83931036376,75.40998048636,76.00168913882,76.58993750677,77.19009976571,77.78084032514,78.38361285822,78.99704982841,79.59636362512,80.23707738804,80.84493403492,81.4527906818,82.08870225085,82.70772053342,83.37133822351,83.99473665966,84.69469279849,85.2869633775,85.97794571968,86.61957218027,87.31252875772,87.95218098305,88.65767976099,89.35492709123,90.08435506749,90.74431371267,91.43177063473,92.14038007748,92.85618137725,93.5491379547,94.28753430771,95.03404490636,95.75399979201,96.51895185802,97.25706350066,98.00385880968,98.74631228551,99.50145727375,100.29634673506,101.05616754365,101.84361819984,102.66023369514,103.42635484212,103.94348661633,105.02623126858,105.83336819117,106.60870422188,107.47897935838,108.27446522534,109.14066094715,110.05780935847,110.87305239075,111.72157064884,112.60544383436,113.39289449054,114.33783527796,115.19278170468,116.11704811194,116.93642244337,117.80261816517,118.79255613295,119.69249974002,120.62577459179,121.5942673625,122.52275717094,123.4722628897,124.41720367712,125.39214258478,126.36267000417,127.35418180019,128.32529211893,129.35189445588,130.27583655913,131.29703572589,132.29171023897,133.26088027735,134.39157865546,135.4415128637,136.49144707195,137.52522844622,138.59131548844],"description":"Franck Jedrzejewski continued fractions approx. of 90-tet"},"fj-96tet":{"frequencies":[48.99942949772,49.35708956705,49.70956615711,50.0646344868,50.44058918883,50.81422318282,51.17718191984,51.5338827476,51.91606220592,52.2660581309,52.67438671005,53.04896912563,53.45392308842,53.81904551389,54.21213476343,54.59936429746,54.9993596403,55.39065943221,55.80490581685,56.20522795327,56.62156297514,57.01751796098,57.44760699733,57.85474808165,58.26959183513,58.69162434342,59.11042288614,59.54361052887,59.98206024721,60.41025554513,60.85413018265,61.24928687215,61.73928116713,62.19158359326,62.61038213598,63.09515579158,63.54613512986,63.99925485416,64.47293354963,64.92424408448,65.33257266363,65.89578449693,66.3533941115,66.81740386053,67.32095530991,67.84536391992,68.30223505743,68.78766064103,69.29919314678,69.78706625433,70.30352927934,70.77695371893,71.27189745123,71.86582992999,72.36838818125,72.90159022832,73.41609436608,73.94459360565,74.47913283653,75.03037641838,75.5753912592,76.10549687944,76.66039776256,77.21122223883,77.82262331991,78.34524166943,78.94352530188,79.48796340741,80.07223844749,80.64489438166,81.23589627254,81.66571582953,82.40813142798,82.999033639,83.58726208435,84.21776944921,84.8067048999,85.43490271397,86.04777863014,86.69129834212,87.30807437776,87.94769397027,88.57589178434,89.20408959841,89.83228741249,90.46048522656,91.16172929808,91.87393030822,92.49330511929,93.09891604567,93.82869478287,94.4988997456,95.19889159557,95.91377688915,96.59887529551,97.28872233605,97.99885899544],"description":"Franck Jedrzejewski continued fractions approx. of 96-tet"},"fj-9tet":{"frequencies":[261.6255653006,282.55561052465,305.22982618403,329.64821227876,355.98232655655,384.51030051755,415.52295665389,448.50096908674,484.4917875937,523.2511306012],"description":"Franck Jedrzejewski continued fractions approx. of 9-tet"},"flavel":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,294.32876096318,327.03195662575,348.83408706747,363.36884069528,392.4383479509,408.78994578219,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Bill Flavel's just tuning. Tuning List 6-5-98"},"fogliano":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,294.32876096318,313.95067836072,327.03195662575,348.83408706747,363.36884069528,392.4383479509,408.78994578219,436.04260883433,465.11211608996,470.92601754108,490.54793493862,523.2511306012],"description":"Fogliano's Monochord with D-/D and Bb-/Bb"},"fogliano1":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,313.95067836072,327.03195662575,348.83408706747,363.36884069528,392.4383479509,408.78994578219,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Fogliano's Monochord no.1, Musica theorica (1529)"},"fogliano2":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,363.36884069528,392.4383479509,408.78994578219,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Fogliano's Monochord no.2"},"fokker-h":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,363.36884069528,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Fokker-H 5-limit per.bl. synt.comma&small diesis, KNAW B71, 1968"},"fokker-ht":{"frequencies":[261.6255653006,272.31140503734,279.67242998298,290.89121260742,305.67073265504,313.92185180985,326.66733279836,335.5942968927,349.22294231864,363.36596605244,376.74379448613,392.00137290182,407.92073675044,419.068143928,436.08264938702,447.85404100892,470.60848490625,489.4864783277,502.71810253025,523.2511306012],"description":"Tempered version of Fokker-H per.bl. with better 6 tetrads, OdC"},"fokker-k":{"frequencies":[261.6255653006,272.52663052146,282.55561052465,290.69507255622,302.80736724606,313.95067836072,327.03195662575,339.06673262958,348.83408706747,363.36884069528,376.74081403286,392.4383479509,403.74315632809,418.60090448096,436.04260883433,452.08897683944,470.92601754108,484.4917875937,502.32108537715,523.2511306012],"description":"Fokker-K 5-limit per.bl. of 225/224 & 81/80 & 10976/10935, KNAW B71, 1968"},"fokker-l":{"frequencies":[261.6255653006,271.31540105247,282.62020942966,291.99281841585,301.39265122629,313.95067836072,325.57848126297,339.14425131559,350.39138209902,363.36884069528,376.74081403286,390.69417751556,403.65087217807,420.46965851882,436.04260883433,454.2110508691,468.83301301868,484.38104661368,504.56359022259,523.2511306012],"description":"Fokker-L 7-limit periodicity block 10976/10935 & 225/224 & 15625/15552, 1969"},"fokker-lt":{"frequencies":[261.6255653006,272.07297743248,282.57734531132,291.77233860052,302.20925621315,313.90139500947,326.42149564976,339.58797317787,349.9403315901,363.14714144228,376.97081214523,391.19775936204,403.12344267272,419.38375585596,436.11106867998,452.98371913917,469.18728997524,484.4545223075,503.15865298196,523.2511306012],"description":"Tempered version of Fokker-L per.bl. with more triads"},"fokker-m":{"frequencies":[261.6255653006,265.7783520514,274.70684356563,279.06726965397,286.15296204753,294.32876096318,299.00064605783,305.22982618403,313.95067836072,318.93402246168,327.03195662575,336.37572681506,343.38355445704,348.83408706747,358.80077526939,366.27579142084,373.75080757229,381.53728273004,392.4383479509,398.6675280771,406.97310157871,418.60090448096,429.2294430713,436.04260883433,448.50096908674,457.84473927605,465.11211608996,478.40103369253,490.54793493862,498.33441009638,515.07533168556,523.2511306012],"description":"Fokker-M 7-limit periodicity block 81/80 & 225/224 & 1029/1024, KNAW B72, 1969"},"fokker-n":{"frequencies":[261.6255653006,265.7783520514,273.37201925287,277.71125765371,286.15296204753,290.69507255622,299.00064605783,303.74668805875,313.95067836072,318.93402246168,328.62879235146,333.84512238879,343.38355445704,348.83408706747,358.80077526939,364.4960256705,375.57576268738,381.53728273004,392.4383479509,398.6675280771,410.05802887931,416.56688648057,429.2294430713,436.04260883433,450.69091522486,457.84473927605,470.92601754108,478.40103369253,492.94318852719,500.76768358318,515.07533168556,523.2511306012],"description":"Fokker-N 7-limit periodicity block 81/80 & 2100875/2097152 & 1029/1024, 1969"},"fokker-n2":{"frequencies":[261.6255653006,265.7783520514,272.52663052146,279.06726965397,286.15296204753,290.69507255622,299.00064605783,305.22982618403,313.95067836072,318.93402246168,327.03195662575,334.88072358477,343.38355445704,348.83408706747,358.80077526939,366.27579142084,373.75080757229,381.53728273004,392.4383479509,398.6675280771,408.78994578219,418.60090448096,429.2294430713,436.04260883433,448.50096908674,457.84473927605,470.92601754108,478.40103369253,490.54793493862,502.32108537715,515.07533168556,523.2511306012],"description":"Fokker-N different block shape"},"fokker-p":{"frequencies":[261.6255653006,267.90457886781,273.37201925287,280.31310567921,286.15296204753,290.69507255622,299.00064605783,306.17666156322,312.97980223949,320.35783506196,327.03195662575,334.88072358477,341.85740532612,350.39138209902,357.69120255941,366.27579142084,373.75080757229,382.72082695402,390.69417751556,400.44729382745,408.78994578219,418.60090448096,427.32175665765,437.39523080459,447.11400319927,457.84473927605,470.92601754108,478.40103369253,488.36772189445,500.76768358318,510.98743222773,523.2511306012],"description":"Fokker-P 7-limit periodicity block 65625/65536 & 6144/6125 & 2401/2400, 1969"},"fokker-q":{"frequencies":[261.6255653006,265.7783520514,269.10058145205,272.52663052146,274.70684356563,279.06726965397,284.76252005507,286.15296204753,290.69507255622,294.32876096318,299.00064605783,301.39265122629,305.22982618403,311.45900631024,313.95067836072,318.93402246168,321.92208230347,327.03195662575,332.22294006425,334.88072358477,340.65828815182,343.38355445704,348.83408706747,353.19451315581,358.80077526939,363.36884069528,366.27579142084,373.75080757229,376.74081403286,381.53728273004,387.59343007496,392.4383479509,398.6675280771,401.85686830172,408.78994578219,412.06026534844,418.60090448096,425.24536328225,429.2294430713,436.04260883433,439.53094970501,448.50096908674,454.2110508691,457.84473927605,465.11211608996,470.92601754108,478.40103369253,480.73697623985,490.54793493862,498.33441009638,502.32108537715,508.71637697339,515.07533168556,523.2511306012],"description":"Fokker-Q 7-limit per.bl. 225/224 & 4000/3969 & 6144/6125, KNAW B72, 1969"},"fokker-r":{"frequencies":[261.6255653006,264.95644634031,268.26840191956,272.52663052146,275.55899540689,279.06726965397,282.62020942966,287.04062021552,290.69507255622,294.32876096318,298.07600213285,301.80195215951,306.17666156322,310.07474405997,313.95067836072,317.94773560837,322.92069774245,327.03195662575,331.19555792538,334.88072358477,340.1962906258,344.44874425862,348.83408706747,353.19451315581,357.69120255941,363.36884069528,367.91095120397,372.08969287196,376.74081403286,382.72082695402,387.59343007496,392.4383479509,397.43466951046,402.40260287934,408.78994578219,413.33849311034,418.60090448096,423.93031414449,430.56093032327,436.04260883433,441.49314144476,447.11400319927,453.59505416773,459.26499234482,465.11211608996,470.92601754108,476.92160341255,484.38104661368,490.54793493862,496.79333688808,502.32108537715,510.29443593869,516.67311638793,523.2511306012],"description":"Fokker-R 7-limit per.bl. 4375/4374 & 65625/65536 & 6144/6125, 1969"},"fokker-s":{"frequencies":[261.6255653006,265.7783520514,269.10058145205,273.37201925287,273.85732695955,278.20426865732,282.55561052465,286.15296204753,290.69507255622,295.2417807931,299.00064605783,303.74668805875,304.28591884395,309.04519901133,313.95067836072,317.94773560837,322.92069774245,328.04642310345,332.22294006425,333.84512238879,338.01818641865,343.38355445704,348.83408706747,353.19451315581,358.80077526939,364.4960256705,369.13660007139,370.8542388136,375.57576268738,381.53728273004,387.59343007496,392.4383479509,398.6675280771,404.99558407833,410.05802887931,412.06026534844,417.30640298598,423.93031414449,430.56093032327,436.04260883433,442.96392008567,449.89223739901,450.69091522486,457.84473927605,463.67378109554,470.92601754108,478.40103369253,484.4917875937,492.06963465517,499.88026377668,500.76768358318,508.71637697339,515.07533168556,523.2511306012],"description":"Fokker-S 7-limit per.bl. 4375/4374 & 323/322 & 64827/65536, 1969"},"fokker_12":{"frequencies":[261.6255653006,280.31310567921,294.32876096318,305.22982618403,327.03195662575,348.83408706747,367.91095120397,392.4383479509,420.46965851882,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Fokker's 7-limit 12-tone just scale"},"fokker_12a":{"frequencies":[261.6255653006,274.70684356563,293.02063313667,309.04519901133,327.03195662575,348.83408706747,367.91095120397,390.69417751556,412.06026534844,439.53094970501,465.11211608996,490.54793493862,523.2511306012],"description":"Fokker's 7-limit periodicity block of 2048/2025 & 3969/4000 & 225/224"},"fokker_12b":{"frequencies":[261.6255653006,275.93321340298,293.02063313667,309.04519901133,332.22294006425,348.83408706747,367.91095120397,392.4383479509,412.06026534844,439.53094970501,467.18850946536,496.11959049595,523.2511306012],"description":"Fokker's 7-limit semitone scale KNAW B72, 1969"},"fokker_12c":{"frequencies":[261.6255653006,275.93321340298,293.02063313667,311.45900631024,332.22294006425,348.83408706747,372.08969287196,392.4383479509,412.06026534844,442.96392008567,467.18850946536,496.11959049595,523.2511306012],"description":"Fokker's 7-limit complementary semitone scale, KNAW B72, 1969"},"fokker_12t":{"frequencies":[261.6255653006,279.53180800295,293.53544531438,305.4439412874,326.66157401657,349.08351368992,366.63408494061,391.81886165309,419.06057467847,436.03416050506,457.88164994338,489.21957814041,523.2511306012],"description":"Tempered version of fokker_12 with egalised 225/224, see also lumma"},"fokker_12t2":{"frequencies":[261.6255653006,279.53060025556,293.5302824794,305.44678713816,326.66192308793,349.10467831311,366.62831408589,391.81689264402,419.03095498017,436.04260883433,457.88067400285,489.21694446174,523.2511306012],"description":"Another tempered version of fokker_12 with egalised 225/224"},"fokker_22":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,287.4304306281,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,353.19451315581,367.91095120397,383.2405741708,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,459.88868900496,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Fokker's 22-tone periodicity block of 2048/2025 & 3125/3072. KNAW B71, 1968"},"fokker_22a":{"frequencies":[261.6255653006,269.46602871384,279.06726965397,287.4304306281,297.67175429757,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,357.20610515709,367.91095120397,383.2405741708,392.4383479509,408.78994578219,418.60090448096,431.14564594215,446.50763144636,459.88868900496,476.27480687611,490.54793493862,502.32108537715,523.2511306012],"description":"Fokker's 22-tone periodicity block of 2048/2025 & 2109375/2097152 = semicomma"},"fokker_31":{"frequencies":[261.6255653006,265.7783520514,275.93321340298,280.31310567921,286.15296204753,294.32876096318,299.00064605783,305.22982618403,315.35224388912,321.92208230347,327.03195662575,336.37572681506,343.38355445704,348.83408706747,357.69120255941,367.91095120397,373.75080757229,381.53728273004,392.4383479509,398.6675280771,406.97310157871,420.46965851882,429.2294430713,436.04260883433,448.50096908674,457.84473927605,465.11211608996,482.88312345521,490.54793493862,498.33441009638,515.07533168556,523.2511306012],"description":"Fokker's 31-tone just system"},"fokker_31a":{"frequencies":[261.6255653006,269.10058145205,272.52663052146,280.31310567921,286.15296204753,294.32876096318,299.00064605783,305.22982618403,311.45900631024,321.92208230347,327.03195662575,336.37572681506,343.38355445704,348.83408706747,357.69120255941,367.91095120397,373.75080757229,381.53728273004,392.4383479509,398.6675280771,412.06026534844,420.46965851882,429.2294430713,436.04260883433,448.50096908674,457.84473927605,470.92601754108,476.92160341255,490.54793493862,498.33441009638,515.07533168556,523.2511306012],"description":"Fokker's 31-tone first alternate septimal tuning"},"fokker_31b":{"frequencies":[261.6255653006,267.07609791103,274.70684356563,280.31310567921,286.15296204753,294.32876096318,299.00064605783,305.22982618403,313.95067836072,321.92208230347,327.03195662575,336.37572681506,343.38355445704,348.83408706747,357.69120255941,367.91095120397,373.75080757229,381.53728273004,392.4383479509,398.6675280771,408.78994578219,420.46965851882,429.2294430713,436.04260883433,448.50096908674,457.84473927605,467.18850946536,480.53675259294,490.54793493862,498.33441009638,515.07533168556,523.2511306012],"description":"Fokker's 31-tone second alternate septimal tuning"},"fokker_31c":{"frequencies":[261.6255653006,269.46602871384,272.52663052146,279.06726965397,287.4304306281,294.32876096318,297.67175429757,306.59245933664,313.95067836072,319.36714514233,327.03195662575,334.88072358477,344.91651675372,348.83408706747,359.28803828513,367.91095120397,372.08969287196,383.2405741708,392.4383479509,396.89567239676,408.78994578219,418.60090448096,431.14564594215,436.04260883433,446.50763144636,459.88868900496,465.11211608996,479.0507177135,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"Fokker's 31-tone periodicity block of 81/80 & 2109375/2097152 = semicomma"},"fokker_31d":{"frequencies":[261.6255653006,266.13928761861,272.52663052146,279.06726965397,287.4304306281,294.32876096318,299.40669857094,306.59245933664,313.95067836072,319.36714514233,327.03195662575,334.88072358477,340.65828815182,348.83408706747,359.28803828513,367.91095120397,376.74081403286,383.2405741708,392.4383479509,399.20893142792,408.78994578219,418.60090448096,425.82286018978,436.04260883433,443.56547936435,459.88868900496,470.92601754108,479.0507177135,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"Fokker's 31-tone periodicity block of 81/80 & W�rschmidt's comma"},"fokker_31d2":{"frequencies":[261.6255653006,267.90457886781,272.52663052146,279.06726965397,283.88190679319,290.69507255622,301.39265122629,306.59245933664,313.95067836072,319.36714514233,327.03195662575,334.88072358477,340.65828815182,348.83408706747,357.20610515709,363.36884069528,376.74081403286,383.2405741708,392.4383479509,401.85686830172,408.78994578219,418.60090448096,425.82286018978,436.04260883433,446.50763144636,454.2110508691,465.11211608996,482.22824196207,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"Reduced version of fokker_31d by Prooijen expressibility"},"fokker_41":{"frequencies":[261.6255653006,264.89588486686,271.31540105247,274.70684356563,280.31310567921,283.8170195002,290.69507255622,294.32876096318,300.33547037059,305.22982618403,311.45900631024,313.95067836072,321.55899383997,325.57848126297,329.64821227876,336.37572681506,341.85740532612,348.83408706747,353.19451315581,361.75386806997,366.27579142084,373.75080757229,378.42269266694,387.59343007496,392.4383479509,400.44729382745,406.97310157871,415.27867508032,420.46965851882,425.72552925031,436.04260883433,439.53094970501,448.50096908674,455.80987376816,465.11211608996,470.92601754108,482.33849075995,488.36772189445,498.33441009638,504.56359022259,516.79124009995,523.2511306012],"description":"Fokker's 7-limit supracomma per.bl. 10976/10935 & 225/224 & 496125/262144"},"fokker_41a":{"frequencies":[261.6255653006,264.59711493117,272.83435407277,275.93321340298,279.06726965397,287.4304306281,291.02331101095,294.32876096318,297.67175429757,306.59245933664,310.42486507835,313.95067836072,323.35923445661,327.03195662575,331.11985608357,334.88072358477,344.91651675372,348.83408706747,353.19451315581,363.77913876369,367.91095120397,372.08969287196,376.315896791,388.03108134794,392.4383479509,396.89567239676,408.78994578219,413.89982010446,418.60090448096,431.14564594215,436.04260883433,441.49314144476,446.50763144636,459.88868900496,465.11211608996,470.92601754108,485.03885168492,490.54793493862,496.11959049595,502.32108537715,517.37477513058,523.2511306012],"description":"Fokker's 41-tone periodicity block of schisma & 34171875/33554432"},"fokker_41b":{"frequencies":[261.6255653006,264.89588486686,272.52663052146,275.93321340298,279.06726965397,287.4304306281,290.69507255622,294.32876096318,297.67175429757,306.59245933664,310.42486507835,313.95067836072,323.35923445661,327.03195662575,331.11985608357,340.65828815182,344.91651675372,348.83408706747,353.19451315581,363.36884069528,367.91095120397,372.08969287196,383.2405741708,388.03108134794,392.4383479509,397.34382730029,408.78994578219,413.89982010446,418.60090448096,431.14564594215,436.04260883433,441.49314144476,454.2110508691,459.88868900496,465.11211608996,470.92601754108,485.03885168492,490.54793493862,496.67978412536,510.98743222773,517.37477513058,523.2511306012],"description":"Fokker's 41-tone periodicity block of schisma & 3125/3072"},"fokker_53":{"frequencies":[261.6255653006,263.718569823,268.26840191956,272.52663052146,274.70684356563,279.06726965397,282.55561052465,286.15296204753,290.69507255622,294.32876096318,299.00064605783,300.46061014991,305.22982618403,309.04519901133,313.95067836072,317.87506184023,321.92208230347,327.03195662575,329.64821227876,334.88072358477,340.65828815182,343.38355445704,348.83408706747,353.19451315581,357.69120255941,360.55273217989,366.27579142084,373.75080757229,376.74081403286,381.53728273004,386.30649876417,392.4383479509,398.6675280771,400.61414686654,410.05802887931,412.06026534844,418.60090448096,423.83341578697,429.2294430713,436.04260883433,439.53094970501,448.50096908674,450.69091522486,457.84473927605,465.11211608996,470.92601754108,476.92160341255,480.73697623985,490.54793493862,498.33441009638,502.32108537715,508.71637697339,515.07533168556,523.2511306012],"description":"Fokker's 53-tone system, degree 37 has alternatives"},"fokker_53a":{"frequencies":[261.6255653006,264.89588486686,269.46602871384,272.52663052146,275.93321340298,279.38237857051,283.88190679319,287.4304306281,290.69507255622,294.32876096318,298.00787047521,302.80736724606,306.59245933664,310.42486507835,313.95067836072,319.36714514233,323.35923445661,327.03195662575,331.11985608357,334.88072358477,340.65828815182,344.91651675372,348.83408706747,353.19451315581,359.28803828513,363.36884069528,367.91095120397,372.50983809402,378.50920905758,383.2405741708,388.03108134794,392.4383479509,397.34382730029,403.74315632809,408.78994578219,413.89982010446,418.60090448096,425.82286018978,431.14564594215,436.04260883433,441.49314144476,447.01180571282,454.2110508691,459.88868900496,465.63729761752,470.92601754108,479.0507177135,484.4917875937,490.54793493862,496.67978412536,504.67894541011,510.98743222773,517.37477513058,523.2511306012],"description":"Fokker's 53-tone periodicity block of schisma & kleisma"},"fokker_53b":{"frequencies":[261.6255653006,264.59711493117,267.90457886781,272.52663052146,275.93321340298,279.06726965397,282.55561052465,287.4304306281,290.69507255622,294.32876096318,297.67175429757,301.39265122629,306.59245933664,310.07474405997,313.95067836072,317.51653791741,323.35923445661,327.03195662575,331.11985608357,334.88072358477,340.65828815182,344.91651675372,348.83408706747,353.19451315581,357.20610515709,363.36884069528,367.91095120397,372.08969287196,376.74081403286,383.2405741708,388.03108134794,392.4383479509,396.89567239676,401.85686830172,408.78994578219,413.89982010446,418.60090448096,423.35538388988,431.14564594215,436.04260883433,441.49314144476,446.50763144636,451.5790761492,459.88868900496,465.11211608996,470.92601754108,476.27480687611,485.03885168492,490.54793493862,496.11959049595,502.32108537715,510.98743222773,517.37477513058,523.2511306012],"description":"Fokker's 53-tone periodicity block of schisma & 2109375/2097152"},"fokker_av":{"frequencies":[261.6255653006,267.53238172257,273.57240048543,279.74894499065,286.06477437084,292.52336378682,299.12777114678,305.88111195206,312.78710209553,319.84901131344,327.07017092477,334.45455423048,342.00545991849,349.72704272607,357.62295854304,365.69693211485,373.95340598657,382.39606841888,391.02956482064,399.85798283974,408.88548711149,418.11704484248,427.5567798744,437.20988623572,447.08093432269,457.17458061119,467.49637893146,478.0512162812,488.84407170063,499.88088374606,511.16658268681,522.70737825664],"description":"Fokker's suggestion for a shrinked octave by averaging approximations"},"fokker_bosch":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,343.38355445704,348.83408706747,392.4383479509,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Scale of \"Naar Den Bosch toe\", genus diatonicum cum septimis. 1/1=D"},"fokker_sr":{"frequencies":[261.6255653006,269.10058145205,279.06726965397,287.04062021552,296.75121990114,305.22982618403,315.35224388912,325.57848126297,336.37572681506,347.28371334717,358.80077526939,367.91095120397,381.53728273004,392.4383479509,406.97310157871,418.60090448096,434.10464168396,446.50763144636,461.31528248922,474.80195184183,490.54793493862,506.45541529795,523.2511306012],"description":"Fokker's 7-limit sruti scale, KNAW B72, 1969"},"fokker_sr2":{"frequencies":[261.6255653006,270.30192333353,279.06726965397,288.32205155576,296.75121990114,306.59245933664,315.35224388912,327.03195662575,336.37572681506,348.83408706747,358.80077526939,372.08969287196,381.53728273004,394.1903048614,406.97310157871,420.46965851882,434.10464168396,448.50096908674,461.31528248922,476.92160341255,490.54793493862,508.71637697339,523.2511306012],"description":"Fokker's complementary 7-limit sruti scale, KNAW B72, 1969"},"fokker_sra":{"frequencies":[261.6255653006,269.76956886185,278.7476190342,287.42460593148,296.37169586701,305.59729331129,315.11006948887,325.59707150921,336.43308557971,346.90573279191,357.7043774887,368.83916960349,381.11429755927,392.97780480816,406.05627704035,419.57000893919,433.5334812886,447.02871783796,460.94403787128,475.29252052682,490.08765232515,506.39798251136,523.2511306012],"description":"Two-step approximation 9-13 to Fokker's 7-limit sruti scale"},"fokker_srb":{"frequencies":[261.6255653006,269.31534001393,278.64197723942,286.83190328195,296.76515515861,305.48776291796,316.06708432391,325.35701999957,336.62443200122,346.51859521924,358.51885197895,369.0565423573,381.83730669135,393.06038214356,406.67242132093,418.62545783369,433.12283887627,445.85331391262,461.29362042034,474.85209942927,491.29666030217,505.73699464332,523.2511306012],"description":"Two-step maximally even approximation 11-11 to Fokker's 7-limit sruti scale"},"fokker_uv":{"frequencies":[220,220.05029721079,220.09166666667,220.14198483463,220.15668113546,220.24841308594,220.29876708984,220.3905582428,220.5253936656,220.68244897959,220.7744,220.82487425697,220.98214285714,221.03266460905,221.0236875,221.07421875,221.28224372864,221.41762468656,221.66763848397,221.71831695641,221.76,221.81069958848,222.01040039062,222.06115722656,222.40609622534,222.44790857143,222.4987654321,222.65722615577,222.75,222.80092592593,223.00151824951,223.05250167847,223.14544022083,223.18896568405,223.23999196793,223.44097959184,223.49206349206,223.58518518519,223.79557291667,223.88882107205,224.18534499514,224.23659907493,224.33003099121,224.48979591837,224.58333333333,224.79466029576,224.83692169189,224.88832473755,225.18617242815,225.28,225.33150434385,225.49198250729,225.5859375,225.67993164062,225.9788277551,226.03049186753,226.28571428571,226.4317558299,226.68743133545,227.08224,227.1341563786,227.29591836735,227.390625,227.44261188272,228.096,228.14814814815,229.16666666667,231,232.03125,233.6237037037,233.84353741497],"description":"Table of Unison Vectors, Microsons and Minisons, from article KNAW, 1969"},"foote":{"frequencies":[261.6255653006,276.70272600503,293.15632631094,310.58830860439,328.48713220126,349.43001184052,368.92737853004,391.76907592069,414.58565256441,438.98455767189,465.89457252293,492.17459484008,523.2511306012],"description":"Ed Foote, piano temperament. TL 9 Jun 1999, almost equal to Coleman"},"forster":{"frequencies":[261.6255653006,279.06726965397,283.42769574232,287.78812183066,299.00064605783,309.19384990071,319.76457981184,327.03195662575,336.37572681506,340.11323489078,343.38355445704,353.19451315581,359.73515228832,366.27579142084,373.75080757229,377.90359432309,380.54627680087,387.59343007496,392.4383479509,398.6675280771,402.50086969323,406.97310157871,418.60090448096,428.11456140098,441.49314144476,442.75095666255,448.50096908674,457.84473927605,465.11211608996,483.00104363188,490.54793493862,507.3950357345,523.2511306012],"description":"Cris Forster's Chrysalis tuning, XH 7+8"},"fortuna11":{"frequencies":[261.6255653006,274.70684356563,299.00064605783,305.22982618403,332.97799220076,343.38355445704,373.75080757229,398.6675280771,411.12588832951,448.50096908674,457.84473927605,498.33441009638,523.2511306012],"description":"11-limit scale from Clem Fortuna"},"fortuna_a1":{"frequencies":[261.6255653006,277.18263097687,293.66476791741,311.12698372208,320.24370022528,349.22823143301,369.99442271164,391.99543598175,415.30469757995,440,466.16376151809,479.82340237272,523.2511306012],"description":"Clem Fortuna, Arabic mode of 24-tET, try C or G major, superset of Basandida, trivalent"},"fortuna_a2":{"frequencies":[261.6255653006,277.18263097687,285.30470202322,311.12698372208,329.62755691287,349.22823143301,369.99442271164,391.99543598175,428.11456140098,440,466.16376151809,493.88330125613,523.2511306012],"description":"Clem Fortuna, Arabic mode of 24-tET, try C or F minor"},"fortuna_bag":{"frequencies":[261.6255653006,266.17557513191,291.58269109838,303.42373253797,318.96815495553,348.01136516401,359.18086083642,388.55281975337,398.8194592997,432.92801877123,462.35552488468,479.64686971777,523.2511306012],"description":"Bagpipe tuning from Fortuna, try key of G with F natural"},"fortuna_eth":{"frequencies":[261.6255653006,280.31310567921,288.69027895239,305.7551787248,323.91736656265,346.02090894595,368.95913055213,385.17097113699,414.24047839262,422.62591317789,469.58434797544,484.00729580611,523.2511306012],"description":"Ethiopian Tunings from Fortuna"},"fortuna_sheng":{"frequencies":[261.6255653006,275.29257244317,286.94416839421,312.81317590289,320.2657782128,348.83408706747,367.19377586049,382.62738925213,417.81993264424,433.74764773521,467.75479856774,484.77678276288,523.2511306012],"description":"Sheng scale on naturals starting on d, from Fortuna"},"francis_r12-14p":{"frequencies":[261.6255653006,277.2273508585,293.19140419912,311.27759533081,328.56574776048,349.51003591412,369.636465861,391.67937618637,415.43871422078,438.93656251816,466.46466724696,492.84862139436,523.2511306012],"description":"Bach WTC theoretical temperament, 1/14 Pyth. comma, Cornet-ton"},"francis_r12-2":{"frequencies":[261.6255653006,277.2831963903,293.15801965318,311.35818177599,328.6319369554,349.45847225471,369.71092870521,391.50168688506,415.45657533448,438.80025285527,466.56783666625,492.94847466277,523.2511306012],"description":"J. Charles Francis, Bach WTC temperament R12-2, fifths beat ratios 0, 1, 2. C=279.331 Cornet-ton"},"francis_r2-1":{"frequencies":[261.6255653006,276.41735337657,293.40958958006,310.96959408698,328.77281747949,349.18425877583,368.55655650762,391.91325216238,414.62612565656,439.06418506387,465.92902003736,492.10921220871,523.2511306012],"description":"J. Charles Francis, Bach WTC temperament R2-1, fifths beat ratios 0, 1, 2. C=249.072 Cammerton"},"francis_r2-14p":{"frequencies":[261.6255653006,276.42350693124,293.47533146651,310.97644498676,328.88393162803,349.17189700163,368.56467609256,392.05867944486,414.6352601896,439.36162975058,466.01338145177,492.37181018521,523.2511306012],"description":"Bach WTC theoretical temperament, 1/14 Pyth. comma, Cammerton"},"francis_seal":{"frequencies":[261.6255653006,275.89934348748,293.01242796531,310.38672525582,327.92787107993,349.18506556371,367.865749003,391.38524198103,413.84896721463,437.93907827641,465.58008765101,490.83740312498,523.2511306012],"description":"J. Charles Francis, Bach tuning interpretion as beats/sec. from seal"},"francis_suppig":{"frequencies":[261.6255653006,276.33536163417,293.13939342657,310.64213412049,328.58201670643,349.47038191026,368.45885450371,391.47500324588,414.51381656966,438.73106346722,465.97531289569,491.91879926026,523.2511306012],"description":"J. Charles Francis, Suppig Calculus musicus, 5ths beat ratios 0, 1, 2."},"efg333":{"frequencies":[261.6255653006,294.32876096318,348.83408706747,392.4383479509,523.2511306012],"description":"Genus primum [333]"},"efg333333333337":{"frequencies":[261.6255653006,275.01702890535,279.38237857051,289.72987407313,294.32876096318,309.39415751852,314.30517589183,325.94610833227,331.11985608357,343.38355445704,353.59332287831,366.6893718738,372.50983809402,386.30649876417,392.4383479509,412.52554335802,419.07356785577,434.59481110969,441.49314144476,457.84473927605,471.45776383774,488.9191624984,496.67978412536,515.07533168556,523.2511306012],"description":"Genus [333333333337]"},"efg333333355":{"frequencies":[261.6255653006,264.89588486686,275.93321340298,279.06726965397,290.69507255622,294.32876096318,310.42486507835,313.95067836072,327.03195662575,331.11985608357,348.83408706747,353.19451315581,367.91095120397,372.08969287196,392.4383479509,397.34382730029,413.89982010446,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,496.67978412536,523.2511306012],"description":"Genus [333333355]"},"efg33335":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,327.03195662575,348.83408706747,367.91095120397,392.4383479509,436.04260883433,441.49314144476,490.54793493862,523.2511306012],"description":"Genus [33335]"},"efg3333555":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,306.59245933664,313.95067836072,327.03195662575,348.83408706747,363.36884069528,367.91095120397,372.08969287196,392.4383479509,408.78994578219,418.60090448096,436.04260883433,459.88868900496,465.11211608996,470.92601754108,490.54793493862,523.2511306012],"description":"Genus [3333555]"},"efg33335555":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,297.67175429757,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,363.36884069528,367.91095120397,372.08969287196,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,459.88868900496,465.11211608996,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Genus bis-ultra-chromaticum [33335555]"},"efg333355577":{"frequencies":[261.6255653006,267.07609791103,268.26840191956,272.52663052146,274.70684356563,278.20426865732,279.06726965397,281.68182201554,284.8811711051,286.15296204753,290.69507255622,294.32876096318,300.46061014991,305.22982618403,306.59245933664,312.97980223949,313.95067836072,317.94773560837,320.49131749323,321.92208230347,325.57848126297,327.03195662575,333.84512238879,343.38355445704,348.83408706747,352.10227751942,356.10146388137,357.69120255941,360.55273217989,363.36884069528,366.27579142084,367.91095120397,372.08969287196,375.57576268738,381.53728273004,392.4383479509,400.61414686654,402.40260287934,406.97310157871,408.78994578219,412.06026534844,417.30640298598,418.60090448096,427.32175665765,429.2294430713,436.04260883433,445.12682985172,450.69091522486,457.84473927605,459.88868900496,465.11211608996,469.46970335923,470.92601754108,476.92160341255,480.73697623985,488.36772189445,490.54793493862,500.76768358318,508.71637697339,515.07533168556,523.2511306012],"description":"Genus [333355577]"},"efg33337":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,343.38355445704,348.83408706747,386.30649876417,392.4383479509,441.49314144476,457.84473927605,515.07533168556,523.2511306012],"description":"Genus [33337]"},"efg3335":{"frequencies":[261.6255653006,290.69507255622,327.03195662575,348.83408706747,392.4383479509,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Genus diatonicum veterum correctum [3335]"},"efg33355":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,310.07474405997,327.03195662575,348.83408706747,363.36884069528,387.59343007496,408.78994578219,436.04260883433,465.11211608996,484.4917875937,523.2511306012],"description":"Genus diatonico-chromaticum hodiernum correctum [33355]"},"efg333555":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,306.59245933664,313.95067836072,327.03195662575,348.83408706747,363.36884069528,372.08969287196,392.4383479509,408.78994578219,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Genus diatonico-hyperchromaticum [333555]"},"efg33355555":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,287.4304306281,294.32876096318,306.59245933664,313.95067836072,319.36714514233,327.03195662575,340.65828815182,348.83408706747,359.28803828513,367.91095120397,383.2405741708,392.4383479509,408.78994578219,418.60090448096,425.82286018978,436.04260883433,459.88868900496,470.92601754108,479.0507177135,490.54793493862,510.98743222773,523.2511306012],"description":"Genus [33355555]"},"efg333555777":{"frequencies":[261.6255653006,262.79353657426,267.07609791103,268.26840191956,269.10058145205,272.52663052146,274.70684356563,279.06726965397,280.31310567921,281.68182201554,286.15296204753,294.32876096318,299.00064605783,300.46061014991,305.22982618403,306.59245933664,311.45900631024,312.97980223949,313.95067836072,318.93402246168,320.49131749323,321.92208230347,327.03195662575,333.84512238879,336.37572681506,343.38355445704,348.83408706747,350.39138209902,352.10227751942,357.69120255941,358.80077526939,360.55273217989,366.27579142084,367.91095120397,373.75080757229,375.57576268738,381.53728273004,392.4383479509,398.6675280771,400.61414686654,402.40260287934,408.78994578219,412.06026534844,417.30640298598,418.60090448096,420.46965851882,427.32175665765,429.2294430713,436.04260883433,448.50096908674,450.69091522486,457.84473927605,459.88868900496,467.18850946536,469.46970335923,470.92601754108,476.92160341255,478.40103369253,480.73697623985,488.36772189445,490.54793493862,498.33441009638,500.76768358318,515.07533168556,523.2511306012],"description":"Genus [333555777]"},"efg333557":{"frequencies":[261.6255653006,265.7783520514,279.06726965397,280.31310567921,290.69507255622,299.00064605783,313.95067836072,318.93402246168,327.03195662575,332.22294006425,348.83408706747,358.80077526939,372.08969287196,373.75080757229,392.4383479509,398.6675280771,418.60090448096,425.24536328225,436.04260883433,448.50096908674,465.11211608996,478.40103369253,490.54793493862,498.33441009638,523.2511306012],"description":"Genus diatonico-enharmonicum [333557]"},"efg33357":{"frequencies":[261.6255653006,274.70684356563,279.06726965397,305.22982618403,313.95067836072,325.57848126297,343.38355445704,348.83408706747,366.27579142084,372.08969287196,392.4383479509,406.97310157871,418.60090448096,457.84473927605,465.11211608996,488.36772189445,523.2511306012],"description":"Genus diatonico-enharmonicum [33357]"},"efg3335711":{"frequencies":[261.6255653006,265.58571790036,269.80136421624,275.93321340298,286.15296204753,294.32876096318,295.09524211152,303.52653474327,314.76825825228,321.92208230347,327.03195662575,331.98214737546,337.2517052703,343.38355445704,354.11429053382,359.73515228832,367.91095120397,379.40816842909,386.30649876417,392.4383479509,393.46032281536,404.70204632437,429.2294430713,441.49314144476,442.64286316727,449.66894036041,457.84473927605,472.15238737843,482.88312345521,490.54793493862,505.87755790546,515.07533168556,523.2511306012],"description":"Genus [3 3 3 5 7 11], expanded hexany 1 3 5 7 9 11"},"efg333577":{"frequencies":[261.6255653006,267.07609791103,281.68182201554,286.15296204753,294.32876096318,300.46061014991,305.22982618403,321.92208230347,327.03195662575,333.84512238879,343.38355445704,348.83408706747,367.91095120397,375.57576268738,381.53728273004,392.4383479509,400.61414686654,429.2294430713,436.04260883433,450.69091522486,457.84473927605,490.54793493862,500.76768358318,515.07533168556,523.2511306012],"description":"Genus [333577]"},"efg3337":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,343.38355445704,348.83408706747,392.4383479509,457.84473927605,515.07533168556,523.2511306012],"description":"Genus [3337]"},"efg33377":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,305.22982618403,336.37572681506,343.38355445704,348.83408706747,392.4383479509,398.6675280771,448.50096908674,457.84473927605,515.07533168556,523.2511306012],"description":"Genus [33377] Bi-enharmonicum simplex"},"efg335":{"frequencies":[261.6255653006,327.03195662575,348.83408706747,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"Genus secundum [335]"},"efg3355":{"frequencies":[261.6255653006,279.06726965397,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,490.54793493862,523.2511306012],"description":"Genus chromaticum veterum correctum [3355]"},"efg33555":{"frequencies":[261.6255653006,294.32876096318,306.59245933664,313.95067836072,327.03195662575,367.91095120397,392.4383479509,408.78994578219,418.60090448096,459.88868900496,470.92601754108,490.54793493862,523.2511306012],"description":"Genus bichromaticum [33555]"},"efg335555577":{"frequencies":[261.6255653006,267.07609791103,268.26840191956,272.52663052146,274.70684356563,279.06726965397,286.15296204753,293.02063313667,300.46061014991,305.22982618403,306.59245933664,312.97980223949,313.95067836072,320.49131749323,327.03195662575,333.84512238879,334.88072358477,341.85740532612,343.38355445704,348.83408706747,357.69120255941,366.27579142084,375.57576268738,381.53728273004,384.58958099188,390.69417751556,392.4383479509,400.61414686654,408.78994578219,417.30640298598,418.60090448096,427.32175665765,429.2294430713,436.04260883433,439.53094970501,446.50763144636,457.84473927605,469.46970335923,476.92160341255,480.73697623985,488.36772189445,490.54793493862,500.76768358318,502.32108537715,512.78610798918,523.2511306012],"description":"Genus [335555577]"},"efg33557":{"frequencies":[261.6255653006,274.70684356563,279.06726965397,286.15296204753,305.22982618403,313.95067836072,327.03195662575,343.38355445704,348.83408706747,366.27579142084,381.53728273004,392.4383479509,418.60090448096,429.2294430713,436.04260883433,457.84473927605,488.36772189445,490.54793493862,523.2511306012],"description":"Genus chromatico-enharmonicum [33557]"},"efg335577":{"frequencies":[261.6255653006,274.70684356563,279.06726965397,280.31310567921,286.15296204753,299.00064605783,305.22982618403,313.95067836072,318.93402246168,327.03195662575,343.38355445704,348.83408706747,358.80077526939,366.27579142084,373.75080757229,381.53728273004,392.4383479509,398.6675280771,418.60090448096,429.2294430713,436.04260883433,448.50096908674,457.84473927605,478.40103369253,488.36772189445,490.54793493862,498.33441009638,523.2511306012],"description":"Genus chromaticum septimis triplex [335577]"},"efg3357":{"frequencies":[261.6255653006,286.15296204753,305.22982618403,327.03195662575,343.38355445704,348.83408706747,381.53728273004,392.4383479509,429.2294430713,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Genus enharmonicum vocale [3357]"},"efg33577":{"frequencies":[261.6255653006,280.31310567921,286.15296204753,299.00064605783,305.22982618403,327.03195662575,343.38355445704,348.83408706747,373.75080757229,381.53728273004,392.4383479509,398.6675280771,429.2294430713,436.04260883433,448.50096908674,457.84473927605,490.54793493862,498.33441009638,523.2511306012],"description":"Genus [33577]"},"efg337":{"frequencies":[261.6255653006,294.32876096318,343.38355445704,392.4383479509,457.84473927605,515.07533168556,523.2511306012],"description":"Genus quintum [337]"},"efg3377":{"frequencies":[261.6255653006,299.00064605783,305.22982618403,343.38355445704,348.83408706747,392.4383479509,398.6675280771,448.50096908674,457.84473927605,523.2511306012],"description":"Genus [3377]"},"efg33777":{"frequencies":[261.6255653006,267.07609791103,299.00064605783,300.46061014991,305.22982618403,343.38355445704,348.83408706747,392.4383479509,398.6675280771,400.61414686654,448.50096908674,457.84473927605,523.2511306012],"description":"Genus [33777]"},"efg33777a":{"frequencies":[261.6255653006,267.07609791103,299.00064605783,305.22982618403,343.38355445704,348.83408706747,392.4383479509,398.6675280771,448.50096908674,457.84473927605,523.2511306012],"description":"Genus [33777] with comma discarded which disappears in 31-tET"},"efg355":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,392.4383479509,418.60090448096,490.54793493862,523.2511306012],"description":"Genus tertium [355]"},"efg3555":{"frequencies":[261.6255653006,306.59245933664,327.03195662575,383.2405741708,392.4383479509,408.78994578219,490.54793493862,510.98743222773,523.2511306012],"description":"Genus enharmonicum veterum correctum [3555]"},"efg35555":{"frequencies":[261.6255653006,306.59245933664,313.95067836072,327.03195662575,334.88072358477,392.4383479509,408.78994578219,418.60090448096,490.54793493862,502.32108537715,523.2511306012],"description":"Genus [35555]"},"efg35557":{"frequencies":[261.6255653006,268.26840191956,274.70684356563,286.15296204753,306.59245933664,313.95067836072,327.03195662575,343.38355445704,357.69120255941,366.27579142084,392.4383479509,408.78994578219,418.60090448096,429.2294430713,457.84473927605,490.54793493862,523.2511306012],"description":"Genus [35557]"},"efg3557":{"frequencies":[261.6255653006,274.70684356563,286.15296204753,313.95067836072,327.03195662575,343.38355445704,366.27579142084,392.4383479509,418.60090448096,429.2294430713,457.84473927605,490.54793493862,523.2511306012],"description":"Genus enharmonicum instrumentale [3557]"},"efg35577":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,286.15296204753,299.00064605783,313.95067836072,327.03195662575,343.38355445704,358.80077526939,366.27579142084,373.75080757229,392.4383479509,418.60090448096,429.2294430713,448.50096908674,457.84473927605,478.40103369253,490.54793493862,523.2511306012],"description":"Genus [35577]"},"efg357":{"frequencies":[261.6255653006,286.15296204753,327.03195662575,343.38355445704,392.4383479509,429.2294430713,457.84473927605,490.54793493862,523.2511306012],"description":"Genus sextum [357] & 7-limit Octony, see ch.6 p.118"},"efg35711":{"frequencies":[261.6255653006,269.80136421624,286.15296204753,295.09524211152,314.76825825228,327.03195662575,337.2517052703,343.38355445704,359.73515228832,392.4383479509,393.46032281536,429.2294430713,449.66894036041,457.84473927605,472.15238737843,490.54793493862,523.2511306012],"description":"Genus [3 5 7 11]"},"efg3571113":{"frequencies":[261.6255653006,265.71346475842,269.80136421624,274.01701053212,278.99913799634,286.15296204753,292.28481123426,295.09524211152,314.76825825228,318.85615771011,319.68651228748,327.03195662575,337.2517052703,343.38355445704,348.74892249543,359.73515228832,365.35601404283,371.99885066179,383.62381474497,392.4383479509,393.46032281536,398.57019713763,425.14154361347,429.2294430713,438.4272168514,449.66894036041,457.84473927605,464.99856332724,472.15238737843,479.52976843121,490.54793493862,511.49841965996,523.2511306012],"description":"Genus [3 5 7 11 13]"},"efg3577":{"frequencies":[261.6255653006,280.31310567921,286.15296204753,299.00064605783,327.03195662575,343.38355445704,373.75080757229,392.4383479509,429.2294430713,448.50096908674,457.84473927605,490.54793493862,523.2511306012],"description":"Genus [3577]"},"efg35777":{"frequencies":[261.6255653006,280.31310567921,286.15296204753,299.00064605783,300.46061014991,327.03195662575,343.38355445704,373.75080757229,375.57576268738,392.4383479509,400.61414686654,429.2294430713,448.50096908674,457.84473927605,490.54793493862,500.76768358318,523.2511306012],"description":"Genus [35777]"},"efg35777a":{"frequencies":[261.6255653006,280.31310567921,286.15296204753,299.00064605783,327.03195662575,343.38355445704,373.75080757229,392.4383479509,400.61414686654,429.2294430713,448.50096908674,457.84473927605,490.54793493862,500.76768358318,523.2511306012],"description":"Genus [35777] with comma discarded which disappears in 31-tET"},"efg377":{"frequencies":[261.6255653006,300.46061014991,343.38355445704,392.4383479509,400.61414686654,457.84473927605,523.2511306012],"description":"Genus octavum [377]"},"efg3777":{"frequencies":[261.6255653006,262.90303388117,300.46061014991,343.38355445704,350.53737850823,392.4383479509,400.61414686654,457.84473927605,523.2511306012],"description":"Genus [3777]"},"efg37777":{"frequencies":[261.6255653006,262.90303388117,299.00064605783,300.46061014991,343.38355445704,350.53737850823,392.4383479509,400.61414686654,448.50096908674,457.84473927605,523.2511306012],"description":"Genus [37777]"},"efg37777a":{"frequencies":[261.6255653006,299.00064605783,343.38355445704,350.53737850823,392.4383479509,400.61414686654,448.50096908674,457.84473927605,523.2511306012],"description":"Genus [37777] with comma discarded that disappears in 31-tET"},"efg555":{"frequencies":[261.6255653006,327.03195662575,408.78994578219,510.98743222773,523.2511306012],"description":"Genus quartum [555]"},"efg55557":{"frequencies":[261.6255653006,286.15296204753,327.03195662575,357.69120255941,366.27579142084,408.78994578219,418.60090448096,447.11400319927,457.84473927605,510.98743222773,523.2511306012],"description":"Genus [55557]"},"efg5557":{"frequencies":[261.6255653006,286.15296204753,327.03195662575,357.69120255941,408.78994578219,447.11400319927,457.84473927605,510.98743222773,523.2511306012],"description":"Genus [5557]"},"efg55577":{"frequencies":[261.6255653006,286.15296204753,291.99281841585,299.00064605783,327.03195662575,357.69120255941,373.75080757229,408.78994578219,447.11400319927,457.84473927605,467.18850946536,510.98743222773,523.2511306012],"description":"Genus [55577]"},"efg557":{"frequencies":[261.6255653006,286.15296204753,327.03195662575,366.27579142084,418.60090448096,457.84473927605,523.2511306012],"description":"Genus septimum [557]"},"efg5577":{"frequencies":[261.6255653006,293.02063313667,320.49131749323,334.88072358477,366.27579142084,400.61414686654,418.60090448096,457.84473927605,512.78610798918,523.2511306012],"description":"Genus [5577]"},"efg55777":{"frequencies":[261.6255653006,286.15296204753,299.00064605783,320.49131749323,327.03195662575,366.27579142084,373.75080757229,400.61414686654,418.60090448096,457.84473927605,478.40103369253,500.76768358318,523.2511306012],"description":"Genus [55777]"},"efg577":{"frequencies":[261.6255653006,286.15296204753,327.03195662575,400.61414686654,457.84473927605,500.76768358318,523.2511306012],"description":"Genus nonum [577]"},"efg5777":{"frequencies":[261.6255653006,286.15296204753,299.00064605783,327.03195662575,373.75080757229,400.61414686654,457.84473927605,500.76768358318,523.2511306012],"description":"Genus [5777]"},"efg57777":{"frequencies":[261.6255653006,286.15296204753,299.00064605783,327.03195662575,350.53737850823,373.75080757229,400.61414686654,438.17172313528,457.84473927605,500.76768358318,523.2511306012],"description":"Genus [57777]"},"efg777":{"frequencies":[261.6255653006,350.53737850823,400.61414686654,457.84473927605,523.2511306012],"description":"Genus decimum [777]"},"efg77777":{"frequencies":[261.6255653006,299.00064605783,341.71502406609,350.53737850823,400.61414686654,457.84473927605,523.2511306012],"description":"Genus [77777]"},"eikohole1":{"frequencies":[261.6255653006,277.4816601673,305.22982618403,332.97799220076,436.04260883433,475.68284600109,523.2511306012],"description":"First eikohole ball <6 9 13 17 20|-epimorphic"},"eikohole2":{"frequencies":[261.6255653006,266.38239376061,274.70684356563,285.40970760065,299.68019298069,313.95067836072,332.97799220076,348.83408706747,366.27579142084,380.54627680087,392.4383479509,399.57359064092,418.60090448096,428.11456140098,443.97065626768,470.92601754108,488.36772189445,499.46698830115,523.2511306012],"description":"Second eikohole ball"},"eikohole4":{"frequencies":[261.6255653006,274.70684356563,279.79400733536,287.78812183066,305.22982618403,313.95067836072,319.76457981184,335.75280880244,348.83408706747,359.73515228832,366.27579142084,373.05867644715,383.71749577421,392.4383479509,406.97310157871,418.60090448096,419.69101100305,431.68218274599,447.67041173658,457.84473927605,470.92601754108,479.64686971777,488.36772189445,503.62921320365,523.2511306012],"description":"Fourth eikohole ball"},"eikohole5":{"frequencies":[261.6255653006,266.38239376061,274.70684356563,279.06726965397,285.40970760065,287.78812183066,294.32876096318,295.98043751179,299.68019298069,305.22982618403,313.95067836072,321.08592105074,325.57848126297,332.97799220076,342.49164912079,348.83408706747,353.19451315581,355.17652501415,363.24871876447,366.27579142084,374.60024122586,380.54627680087,392.4383479509,399.57359064092,406.97310157871,412.06026534844,418.60090448096,428.11456140098,439.53094970501,443.97065626768,448.50096908674,449.52028947103,456.65553216105,457.84473927605,465.11211608996,466.16918908107,470.92601754108,475.68284600109,488.36772189445,499.46698830115,507.3950357345,513.73747368118,523.2511306012],"description":"Fifth eikohole ball"},"eikohole6":{"frequencies":[261.6255653006,266.38239376061,272.43653907335,274.70684356563,279.06726965397,285.40970760065,287.78812183066,293.02063313667,294.32876096318,295.98043751179,299.00064605783,299.68019298069,305.22982618403,310.77945938738,313.95067836072,317.12189733406,321.08592105074,325.57848126297,329.64821227876,332.97799220076,336.37572681506,342.49164912079,348.83408706747,349.6268918108,353.19451315581,355.17652501415,356.76213450082,363.24871876447,366.27579142084,374.60024122586,380.54627680087,383.71749577421,392.4383479509,399.57359064092,406.97310157871,412.06026534844,418.60090448096,428.11456140098,431.68218274599,439.53094970501,443.97065626768,448.50096908674,449.52028947103,456.65553216105,457.84473927605,465.11211608996,466.16918908107,470.92601754108,475.68284600109,484.33162501929,488.36772189445,499.46698830115,507.3950357345,513.73747368118,523.2511306012],"description":"Sixth eikohole ball"},"eikosany":{"frequencies":[261.6255653006,269.80136421624,274.70684356563,287.78812183066,294.32876096318,305.22982618403,323.76163705949,335.75280880244,343.38355445704,359.73515228832,366.27579142084,377.72190990274,392.4383479509,412.06026534844,419.69101100305,431.68218274599,457.84473927605,470.92601754108,479.64686971777,503.62921320365,523.2511306012],"description":"3)6 1.3.5.7.9.11 Eikosany (1.3.5 tonic)"},"ekring1":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,327.03195662575,353.19451315581,367.91095120397,376.74081403286,408.78994578219,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Single-tie circular mirroring of 3:4:5"},"ekring2":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,305.22982618403,336.37572681506,343.38355445704,384.42940207435,400.61414686654,448.50096908674,457.84473927605,504.56359022259,515.07533168556,523.2511306012],"description":"Single-tie circular mirroring of 6:7:8"},"ekring3":{"frequencies":[261.6255653006,266.96486255163,299.00064605783,305.10270005901,327.03195662575,333.70607818954,341.71502406609,408.78994578219,418.60090448096,427.14378008261,457.84473927605,467.18850946536,523.2511306012],"description":"Single-tie circular mirroring of 4:5:7"},"ekring4":{"frequencies":[261.6255653006,279.06726965397,313.95067836072,334.88072358477,348.83408706747,376.74081403286,392.4383479509,401.85686830172,436.04260883433,446.50763144636,465.11211608996,502.32108537715,523.2511306012],"description":"Single-tie circular mirroring of 4:5:6"},"ekring5":{"frequencies":[261.6255653006,263.718569823,269.10058145205,305.22982618403,322.92069774245,366.27579142084,373.75080757229,376.74081403286,384.42940207435,439.53094970501,448.50096908674,512.78610798918,523.2511306012],"description":"Single-tie circular mirroring of 3:5:7"},"ekring5bp":{"frequencies":[261.6255653006,282.55561052465,336.37572681506,363.28578496026,366.27579142084,395.57785473451,432.48307733364,512.78610798918,560.62621135843,605.4763082671,610.45965236807,659.29642455751,784.8766959018],"description":"Single-tie BP circular mirroring of 3:5:7"},"ekring6":{"frequencies":[261.6255653006,288.32205155576,299.00064605783,336.37572681506,348.83408706747,384.42940207435,392.4383479509,406.97310157871,432.48307733364,465.11211608996,494.26637409559,512.57253609913,523.2511306012],"description":"Single-tie circular mirroring of 6:7:9"},"ekring7":{"frequencies":[261.6255653006,266.96486255163,290.69507255622,296.62762505737,322.99452506247,336.37572681506,343.24053756638,406.97310157871,415.27867508032,432.48307733364,470.92601754108,480.53675259294,523.2511306012],"description":"Single-tie circular mirroring of 5:7:9"},"ekring7bp":{"frequencies":[261.6255653006,311.45900631024,336.37572681506,400.44729382745,432.48307733364,436.04260883433,470.92601754108,514.86080634958,610.45965236807,667.41215637908,720.80512888941,726.73768139056,784.8766959018],"description":"Single-tie BP circular mirroring of 5:7:9"},"ellis":{"frequencies":[261.6255653006,277.10015133873,293.57875905702,310.98767008297,329.52610437773,349.11112716429,369.96685849926,391.93834696391,415.15022554673,439.86813926913,465.98150356841,493.78915701915,523.2511306012],"description":"Alexander John Ellis' imitation equal temperament (1875)"},"ellis_24":{"frequencies":[261.6255653006,264.89588486686,272.52663052146,275.93321340298,294.32876096318,298.00787047521,306.59245933664,310.42486507835,327.03195662575,331.11985608357,348.83408706747,353.19451315581,367.91095120397,372.50983809402,392.4383479509,397.34382730029,408.78994578219,413.89982010446,436.04260883433,441.49314144476,459.88868900496,465.63729761752,490.54793493862,496.67978412536,523.2511306012],"description":"Ellis, from p.421 of Helmholtz, 24 tones of JI for 1 manual harmonium"},"ellis_eb":{"frequencies":[261.6255653006,277.21587437848,293.6537610003,311.19285946782,329.68548178616,349.2169654334,370.02116610622,391.93834696391,415.32381240723,439.98064151826,466.28928903228,494.02822100775,523.2511306012],"description":"Ellis' new equal beating temperament for pianofortes (1885)"},"ellis_harm":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,353.19451315581,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Ellis's Just Harmonium"},"ellis_mteb":{"frequencies":[261.6255653006,273.31920907322,292.34465012884,313.05587813274,326.9349299255,350.18846153218,365.78692922515,391.15004079048,408.78346942429,437.23842445073,468.2723780569,489.17031487243,523.2511306012],"description":"Ellis' equal beating meantone tuning (1885)"},"enh14":{"frequencies":[261.6255653006,267.70988077271,274.08392555301,348.83408706747,392.4383479509,401.56482115906,411.12588832951,523.2511306012],"description":"14/11 Enharmonic"},"enh15":{"frequencies":[261.6255653006,270.64713651786,280.31310567921,356.76213450082,392.4383479509,402.50086969323,413.09299784305,523.2511306012],"description":"Tonos-15 Enharmonic"},"enh15_inv":{"frequencies":[261.6255653006,331.39238271409,340.11323489078,348.83408706747,383.71749577421,488.36772189445,505.80942624783,523.2511306012],"description":"Inverted Enharmonic Tonos-15 Harmonia"},"enh15_inv2":{"frequencies":[261.6255653006,270.34641747729,279.06726965397,348.83408706747,383.71749577421,392.4383479509,401.15920012759,523.2511306012],"description":"Inverted harmonic form of the enharmonic Tonos-15"},"enh17":{"frequencies":[261.6255653006,269.55361273395,277.97716313189,370.63621750918,404.33041910093,413.73345210327,423.58424858192,523.2511306012],"description":"Tonos-17 Enharmonic"},"enh17_con":{"frequencies":[261.6255653006,269.55361273395,277.97716313189,370.63621750918,378.52209447746,386.75083566176,494.18162334558,523.2511306012],"description":"Conjunct Tonos-17 Enharmonic"},"enh19":{"frequencies":[261.6255653006,268.69652652494,276.16031892841,355.06326719367,382.37582620857,389.87339142835,397.67085925691,523.2511306012],"description":"Tonos-19 Enharmonic"},"enh19_con":{"frequencies":[261.6255653006,268.69652652494,276.16031892841,355.06326719367,361.51896296083,368.21375857121,451.89870370104,523.2511306012],"description":"Conjunct Tonos-19 Enharmonic"},"enh2":{"frequencies":[261.6255653006,266.71168334607,277.18263097687,349.22823143301,391.99543598175,399.61600264311,415.30469757995,523.2511306012],"description":"1:2 Enharmonic. New genus 2 + 4 + 24 parts"},"enh21":{"frequencies":[261.6255653006,268.0066766494,274.70684356563,343.38355445704,392.4383479509,399.57359064092,406.97310157871,523.2511306012],"description":"Tonos-21 Enharmonic"},"enh21_inv":{"frequencies":[261.6255653006,336.37572681506,342.60490694126,348.83408706747,398.6675280771,498.33441009638,510.79277034879,523.2511306012],"description":"Inverted Enharmonic Tonos-21 Harmonia"},"enh21_inv2":{"frequencies":[261.6255653006,270.06509966514,279.06726965397,348.83408706747,398.6675280771,411.12588832951,423.58424858192,523.2511306012],"description":"Inverted harmonic form of the enharmonic Tonos-21"},"enh23":{"frequencies":[261.6255653006,267.43946675172,273.51763645063,334.29933343966,376.08675011961,388.21858076863,401.15920012759,523.2511306012],"description":"Tonos-23 Enharmonic"},"enh23_con":{"frequencies":[261.6255653006,267.43946675172,273.51763645063,334.29933343966,343.8507429665,353.96400011258,462.87600014722,523.2511306012],"description":"Conjunct Tonos-23 Enharmonic"},"enh25":{"frequencies":[261.6255653006,269.71707762948,278.32506946872,363.36884069528,408.78994578219,421.97671822677,436.04260883433,523.2511306012],"description":"Tonos-25 Enharmonic"},"enh25_con":{"frequencies":[261.6255653006,269.71707762948,278.32506946872,363.36884069528,373.75080757229,384.74347838324,503.12608711654,523.2511306012],"description":"Conjunct Tonos-25 Enharmonic"},"enh27":{"frequencies":[261.6255653006,269.10058145205,277.01530443593,353.19451315581,392.4383479509,403.65087217807,415.52295665389,523.2511306012],"description":"Tonos-27 Enharmonic"},"enh27_inv":{"frequencies":[261.6255653006,329.45441556372,339.14425131559,348.83408706747,387.59343007496,494.18162334558,508.71637697339,523.2511306012],"description":"Inverted Enharmonic Tonos-27 Harmonia"},"enh27_inv2":{"frequencies":[261.6255653006,266.38239376061,271.31540105247,348.83408706747,387.59343007496,397.28326582684,406.97310157871,523.2511306012],"description":"Inverted harmonic form of the enharmonic Tonos-27"},"enh29":{"frequencies":[261.6255653006,266.21548749886,270.96933548991,344.87006335079,379.35706968587,389.08417403679,399.32323124828,523.2511306012],"description":"Tonos-29 Enharmonic"},"enh29_con":{"frequencies":[261.6255653006,266.21548749886,270.96933548991,344.87006335079,352.8902973822,361.29244731988,474.19633710734,523.2511306012],"description":"Conjunct Tonos-29 Enharmonic"},"enh31":{"frequencies":[261.6255653006,270.34641747729,279.66870773512,337.93302184661,352.6257619269,368.65420565085,377.22755927063,386.2091678247,523.2511306012],"description":"Tonos-31 Enharmonic. Tone 24 alternates with 23 as MESE or A"},"enh31_con":{"frequencies":[261.6255653006,270.34641747729,279.66870773512,337.93302184661,352.6257619269,360.46188996972,368.65420565085,450.57736246214,523.2511306012],"description":"Conjunct Tonos-31 Enharmonic"},"enh33":{"frequencies":[261.6255653006,269.80136421624,278.50463402967,359.73515228832,392.4383479509,401.56482115906,411.12588832951,523.2511306012],"description":"Tonos-33 Enharmonic"},"enh33_con":{"frequencies":[261.6255653006,269.80136421624,278.50463402967,359.73515228832,367.38909169871,375.37581108347,479.64686971777,523.2511306012],"description":"Conjunct Tonos-33 Enharmonic"},"enh_invcon":{"frequencies":[261.6255653006,283.42769574232,370.63621750918,381.53728273004,392.4383479509,501.44900015948,512.35006538034,523.2511306012],"description":"Inverted Enharmonic Conjunct Phrygian Harmonia"},"enh_mod":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,348.83408706747,392.4383479509,406.97310157871,418.60090448096,523.2511306012],"description":"Enharmonic After Wilson's Purvi Modulations, See page 111"},"enh_perm":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,348.83408706747,392.4383479509,406.97310157871,465.11211608996,523.2511306012],"description":"Permuted Enharmonic, After Wilson's Marwa Permutations, See page 110."},"enn45ji":{"frequencies":[261.6255653006,267.07609791103,269.10058145205,274.70684356563,276.85245005354,282.55561052465,288.32205155576,290.69507255622,296.75121990114,299.00064605783,305.22982618403,311.45900631024,313.95067836072,320.49131749323,322.92069774245,329.64821227876,336.37572681506,339.14425131559,346.06556256693,348.83408706747,356.10146388137,363.36884069528,366.27579142084,373.75080757229,376.74081403286,384.42940207435,392.4383479509,395.57785473451,403.65087217807,406.97310157871,415.27867508032,423.93031414449,427.32175665765,436.04260883433,439.53094970501,448.50096908674,457.84473927605,461.31528248922,470.92601754108,474.80195184183,484.4917875937,494.47231841813,498.33441009638,508.71637697339,512.78610798918,523.2511306012],"description":"Detempered Ennealimma[45], Hahn reduced"},"enn72synch":{"frequencies":[195.99771799087,197.54967854522,199.11392792408,201.62391554947,203.22042578925,204.82957760946,207.41161549338,209.05395423619,211.68924370912,213.36545381699,215.05493658943,217.76587316352,219.49019959291,221.22817968434,224.01693484168,225.790758792,228.63703016722,230.44743589451,232.27217821307,235.20015301436,237.06252857463,238.93964952543,241.95167308427,243.86750892427,246.94165062806,248.89699839908,250.8678291188,254.03021536301,256.04169222048,258.06909647124,261.3222603528,263.39147750593,266.71173418544,268.8236265844,270.95224149283,274.36780754746,276.54032271274,278.73004041423,282.24365173996,284.47852987378,288.0646054292,290.34557537779,292.64460663558,296.33362372129,298.68006816723,301.0450940916,304.84000597616,307.25380610435,311.12698372207,313.59056753865,316.0736586482,320.05801564518,322.59231767928,325.14668697146,329.24541662461,331.85246687263,336.03572815421,338.69654584276,341.37843257302,345.68177614255,348.4189737305,351.17784515594,355.60471802638,358.42048803112,362.93866010991,365.81250216232,368.70910003837,373.35696816148,376.31330506793,379.29305101359,384.07434037944,387.11553797119,391.99543598174],"description":"Poptimal synchonized beating ennealimmal tuning, TM 10-10-2005"},"ennea45":{"frequencies":[261.6255653006,267.02028728287,269.13615104392,274.68574138534,276.8623300691,282.57123430547,288.39787286736,290.68311542614,296.67700440585,299.02785016604,305.1938252949,311.48692526882,313.95512370264,320.42888174436,322.96795420876,329.62755691287,336.42448069667,339.09030198792,346.08234767737,348.824677577,356.01744619623,363.3585507705,366.23777597441,373.78960287068,376.751482929,384.52012478698,392.44893391322,395.5586690753,403.715093104,406.91412394911,415.30469757995,423.86828492968,427.22700928979,436.03643483576,439.49155400205,448.55387459245,457.80308677504,461.43068321685,470.94538888861,474.67712392136,484.46499932732,494.45467284607,498.37269363637,508.649143962,512.67967026301,523.2511306012],"description":"Ennealimmal-45, in a 7-limit least-squares tuning, g=48.999, G.W. Smith"},"epimore_enh":{"frequencies":[261.6255653006,265.11390617127,279.06726965397,348.83408706747,392.4383479509,397.67085925691,418.60090448096,523.2511306012],"description":"New Epimoric Enharmonic, Dorian mode of the 4th new Enharmonic on Hofmann's list"},"eratos_chrom":{"frequencies":[261.6255653006,275.39533189537,290.69507255622,348.83408706747,392.4383479509,413.09299784305,436.04260883433,523.2511306012],"description":"Dorian mode of Eratosthenes's Chromatic. same as Ptol. Intense Chromatic"},"eratos_diat":{"frequencies":[261.6255653006,275.62199471997,310.07474405997,348.83408706747,392.4383479509,413.43299207996,465.11211608996,523.2511306012],"description":"Dorian mode of Eratosthenes's Diatonic, Pythagorean"},"eratos_enh":{"frequencies":[261.6255653006,268.33391312882,275.39533189537,348.83408706747,392.4383479509,402.50086969323,413.09299784305,523.2511306012],"description":"Dorian mode of Eratosthenes's Enharmonic"},"erlangen":{"frequencies":[261.6255653006,275.62199471997,293.99679436797,310.07474405997,327.03195662575,348.83408706747,367.49599295996,392.4383479509,413.43299207996,440.99519155196,465.11211608996,490.54793493862,523.2511306012],"description":"Anonymus: Pro clavichordiis faciendis, Erlangen 15th century"},"erlangen2":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,310.07474405997,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.89982010446,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"Revised Erlangen"},"erlich1":{"frequencies":[261.6255653006,278.64199172491,296.7651860139,326.1838132033,347.39918201406,369.99442271164,394.05928374402,433.12277132725,461.29357245868,491.2966347616,523.2511306012],"description":"Asymmetrical Major decatonic mode of 22-tET, Paul Erlich"},"erlich10":{"frequencies":[261.6255653006,274.70684356563,299.00064605783,313.95067836072,348.83408706747,366.27579142084,392.4383479509,418.60090448096,448.50096908674,470.92601754108,523.2511306012],"description":"Canonical JI interpretation of the Pentachordal decatonic mode of 22-tET"},"erlich10s1":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,313.95067836072,348.83408706747,366.27579142084,392.4383479509,418.60090448096,448.50096908674,470.92601754108,523.2511306012],"description":"Superparticular version of erlich10 using 50/49 decatonic comma"},"erlich10s2":{"frequencies":[261.6255653006,274.70684356563,293.02063313667,313.95067836072,348.83408706747,366.27579142084,392.4383479509,418.60090448096,448.50096908674,470.92601754108,523.2511306012],"description":"Other superparticular version of erlich10 using 50/49 decatonic comma"},"erlich11":{"frequencies":[261.6255653006,280.31310567921,305.22982618403,327.03195662575,348.83408706747,373.75080757229,392.4383479509,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Canonical JI interpretation of the Symmetrical decatonic mode of 22-tET"},"erlich11s1":{"frequencies":[261.6255653006,274.70684356563,305.22982618403,327.03195662575,348.83408706747,373.75080757229,392.4383479509,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Superparticular version of erlich11 using 50/49 decatonic comma"},"erlich11s2":{"frequencies":[261.6255653006,280.31310567921,305.22982618403,311.45900631024,348.83408706747,373.75080757229,392.4383479509,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Other superparticular version of erlich11 using 50/49 decatonic comma"},"erlich12":{"frequencies":[261.6255653006,267.01308914069,282.57123920205,288.39008844866,305.19382000629,311.47852302926,329.62755691287,336.41541160581,356.01745236555,363.34874301751,384.52011812375,392.4383479509,415.30469757995,423.85685859121,448.5538823653,457.7907297806,484.46499093218,494.44133512215,523.2511306012],"description":"Two 9-tET scales 3/2 shifted, Paul Erlich, TL 5-12-2001"},"erlich13":{"frequencies":[261.6255653006,269.80136421624,294.32876096318,327.03195662575,343.38355445704,359.73515228832,392.4383479509,441.49314144476,457.84473927605,490.54793493862,523.2511306012],"description":"Just scale by Paul Erlich (2002)"},"erlich2":{"frequencies":[261.6255653006,278.64199172491,296.7651860139,316.06713361714,347.39918201406,369.99442271164,394.05928374402,419.68935090103,446.98642698175,476.05893615592,523.2511306012],"description":"Asymmetrical Minor decatonic mode of 22-tET, Paul Erlich"},"erlich3":{"frequencies":[261.6255653006,278.64199172491,296.7651860139,326.1838132033,347.39918201406,369.99442271164,394.05928374402,419.68935090103,461.29357245868,491.2966347616,523.2511306012],"description":"Symmetrical Major decatonic mode of 22-tET, Paul Erlich"},"erlich4":{"frequencies":[261.6255653006,278.64199172491,296.7651860139,316.06713361714,347.39918201406,369.99442271164,394.05928374402,419.68935090103,446.98642698175,491.2966347616,523.2511306012],"description":"Symmetrical Minor decatonic mode of 22-tET, Paul Erlich"},"erlich5":{"frequencies":[261.6255653006,269.33066959279,278.10477655849,287.16472157287,295.62197660533,306.17967660611,315.19693888202,326.45372959864,335.05049156411,348.07025322573,357.23626005287,368.87410717392,380.89108570115,393.29954676976,406.11224388345,419.34234602259,433.00345117936,444.40607048653,461.67529188567,473.83294924974,490.75518955849,505.2083639382,523.2511306012],"description":"Unequal 22-note compromise between decatonic & Indian srutis, Paul Erlich"},"erlich6":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,285.40970760065,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,343.38355445704,348.83408706747,359.73515228832,366.27579142084,373.75080757229,392.4383479509,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,490.54793493862,523.2511306012],"description":"Scale of consonant tones against 1/1-3/2 drone. TL 23-9-1998"},"erlich7":{"frequencies":[261.6255653006,272.64118737561,277.98432293805,281.84855879469,292.47977325983,303.51199286577,307.73108663824,313.76190292287,326.97270111135,337.05955506058,340.85784563832,350.05627231138,365.1325261687,373.60234843661,378.13992750117,391.18115131013,406.9458559663,413.62886206386,420.42161880722,437.36472209676,452.44848028305,457.94368329907,468.56640608675,488.7466646507,501.93603498211,507.59230220159,523.2511306012],"description":"Meantone-like circle of sinuoidally varying fifths, TL 08-12-99"},"erlich8":{"frequencies":[261.6255653006,263.902226729,277.18263097687,279.59466973861,293.66476791741,296.22023396764,311.12698372208,313.83440569119,329.62755691287,332.49597057,349.22823143301,352.26720984209,369.99442271164,373.21410818061,391.99543598175,395.40657391157,415.30469757995,418.91867232636,440,443.82887286778,466.16376151809,470.22031101449,493.88330125613,498.18106573801,523.2511306012],"description":"Two 12-tET scales 15 cents shifted, Paul Erlich"},"erlich9":{"frequencies":[261.6255653006,271.31540105247,280.31310567921,290.69507255622,302.70726563706,308.34441624714,319.76457981184,332.97799220076,345.34574619679,356.76213450082,369.97554688974,383.71749577421,396.40237166758,411.12588832951,428.11456140098,436.04260883433,452.23847716247,470.92601754108,488.36772189445,504.56359022259,523.2511306012],"description":"11-limit periodicity block, u.v.: 9801/9800 243/242 126/125 100/99"},"erlich_bpf":{"frequencies":[261.6255653006,269.93113880221,277.4816601673,282.55561052465,293.6613488068,301.87565226992,311.45900631024,319.76457981184,328.70904358281,336.37572681506,347.05432131712,356.76213450082,366.27579142084,377.90359432309,388.47432423422,400.44729382745,411.12588832951,422.62591317789,436.04260883433,447.67041173658,458.69417292962,470.92601754108,485.87604984397,499.46698830115,512.78610798918,528.59042785223,543.37617408586,560.62621135843,575.57624366132,591.67627844905,610.45965236807,624.69777837082,642.17184210147,659.29642455751,680.22646978156,699.2537836216,726.73768139056,740.02659899313,760.72664372021,784.8766959018],"description":"Erlich's 39-tone Triple Bohlen-Pierce scale"},"erlich_bpp":{"frequencies":[261.6255653006,268.60224704195,277.4816601673,282.55561052465,293.6613488068,299.68019298069,311.45900631024,319.76457981184,323.65460841914,336.37572681506,345.34574619679,356.76213450082,366.27579142084,380.67211882362,385.30310526088,400.44729382745,411.12588832951,419.55227017296,436.04260883433,447.67041173658,458.69417292962,470.92601754108,489.43558134466,499.46698830115,512.78610798918,528.59042785223,539.42434736524,560.62621135843,575.57624366132,594.60355750136,610.45965236807,629.27431887171,642.17184210147,659.29642455751,685.20981388252,699.2537836216,720.80512888941,740.02659899313,764.49028821604,784.8766959018],"description":"Periodicity block for erlich_bpf, 1625/1617 1331/1323 275/273 245/243"},"erlich_bpp2":{"frequencies":[261.6255653006,268.60224704195,277.4816601673,282.55561052465,293.92501780685,299.68019298069,311.45900631024,319.76457981184,326.02570445152,336.37572681506,345.34574619679,356.76213450082,366.27579142084,377.90359432309,385.30310526088,400.44729382745,411.12588832951,422.62591317789,436.04260883433,447.67041173658,458.69417292962,470.92601754108,485.87604984397,499.46698830115,512.78610798918,528.59042785223,543.37617408586,560.62621135843,575.57624366132,594.60355750136,610.45965236807,629.83932387181,642.17184210147,659.29642455751,685.20981388252,698.62650953896,726.73768139056,740.02659899313,764.49028821604,784.8766959018],"description":"Improved shape for erlich_bpp"},"erlich_bppe":{"frequencies":[261.6255653006,269.03526454087,276.77324548748,284.61195549492,292.79795257063,301.09050901183,309.7504615497,318.52314490095,327.68449417797,337.10934179701,346.6568752383,356.62740568226,366.72772736951,377.27553481706,387.96064596243,399.11915372018,410.59860200806,422.22748385656,434.37157296247,446.67374500165,459.5209564409,472.53540627884,486.12644973042,499.89441151621,514.27235352402,529.06383329425,544.0478609495,559.69574261012,575.54731703113,592.10118472076,608.870542156,626.38285104305,644.39884822068,662.64936456684,681.70845767885,701.01565227402,721.17823493702,741.60327945962,762.93324174612,784.8766959018],"description":"LS optimal 3:5:7:11:13 tempering, virtually equal, g=780.2702 cents"},"erlich_bppm":{"frequencies":[261.6255653006,269.3148593258,276.83859227209,284.97500405989,292.93622770824,301.54575630263,309.96990811138,319.08006614158,327.99406628962,337.15709295818,347.06629484351,356.76213450082,367.24753706379,377.50717076432,388.60227773252,399.45849178361,410.61798882758,422.6862401977,434.49464068244,447.26463523836,459.75967424319,473.27221959449,486.49381977384,500.79209531182,514.78250488433,529.16376146212,544.7161244152,559.93362036345,576.39032675477,592.49269103014,609.9063234692,626.94500947499,644.45969779399,663.40066444061,681.93379843592,701.97614206495,721.5869464624,742.79471409673,763.54584931731,784.8766959018],"description":"MM optimal 3:5:7:11:13 tempering, g=780.352 cents"},"erlich_paj":{"frequencies":[261.6255653006,269.74106841426,278.59741216196,287.23937405609,296.67040683594,305.87298460253,315.91563888094,325.71519477697,336.4093235789,346.84458402385,358.23265591403,369.99442271164,381.47147728046,393.99623872149,406.21781843768,419.55531290213,432.56972318844,446.77218107119,460.63084592459,475.75462791404,490.51231476219,506.61748047856,523.2511306012],"description":"Erlich's Pajara or Twintone, with RMS optimal generator"},"erlich_paj2":{"frequencies":[261.6255653006,270.25447814202,278.68577354399,287.87753105276,296.85845221806,306.64959036092,316.21614384055,326.645747324,336.83612131731,347.94582350257,358.80069640371,369.99442271164,382.1975482805,394.12120058634,407.1203087173,419.82124923186,433.66800958456,447.19715926063,461.9468459571,476.35821106408,492.06970256841,507.42081104304,523.2511306012],"description":"Erlich's Pajara or Twintone with minimax optimal generator"},"escapade":{"frequencies":[261.6255653006,270.11362843741,278.8770761192,287.9248395776,297.26614463769,306.91051483225,316.86778450163,327.1481015562,337.76194863153,348.72014864112,360.03386958939,371.71464785337,383.77439429365,392.56657056143,405.30282760495,418.45229174958,432.02837124332,446.04490958069,460.51619165905,475.45697355792,490.88248752006,506.80846290374,523.2511306012],"description":"Escapade temperament, g=55.275493, 5-limit"},"et-mix6":{"frequencies":[261.6255653006,293.66476791741,300.52885648597,311.12698372208,329.62755691287,345.21700307457,369.99442271164,396.55020354877,415.30469757995,440,455.51656649021,466.16376151809,523.2511306012],"description":"Mix of equal temperaments from 1-6 (= 4-6)"},"euler":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,306.59245933664,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,436.04260883433,459.88868900496,490.54793493862,523.2511306012],"description":"Euler's Monochord (a mode of Ellis's duodene) (1739), genus [33355]"},"euler20":{"frequencies":[261.6255653006,274.58143914872,285.65749968142,293.61100773131,305.45468261618,320.58100381398,326.62388782443,329.50688232588,342.79852229325,366.55580177366,381.34192228364,391.95955371998,407.7704102616,411.36965665618,427.96347506501,439.87918162894,457.62301915088,489.33808574423,509.07699553894,513.57043963064,523.2511306012],"description":"Genus [3333555] tempered by 225/224-planar"},"euler24":{"frequencies":[261.6255653006,274.58143914872,285.65749968142,293.61100773131,305.45468261618,308.1508239679,320.58100381398,326.62388782443,329.50688232588,342.79852229325,366.55580177366,381.34192228364,384.70789368407,391.95955371998,407.7704102616,411.36965665618,427.96347506501,439.87918162894,457.62301915088,480.28481865546,489.33808574423,493.65730140218,509.07699553894,513.57043963064,523.2511306012],"description":"Genus [33333555] tempered by 225/224-planar"},"euler_diat":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,348.83408706747,367.91095120397,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"Euler's genus diatonicum veterum correctum"},"euler_enh":{"frequencies":[261.6255653006,267.90457886781,275.62199471997,348.83408706747,392.4383479509,401.85686830172,413.43299207996,523.2511306012],"description":"Euler's Old Enharmonic, From Tentamen Novae Theoriae Musicae"},"euler_gm":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,289.40309445597,348.83408706747,361.75386806997,372.08969287196,385.87079260796,523.2511306012],"description":"Euler's Genus Musicum, Octony based on Archytas's Enharmonic"},"exptriad2":{"frequencies":[261.6255653006,306.59245933664,327.03195662575,367.91095120397,392.4383479509,459.88868900496,490.54793493862,523.2511306012],"description":"Two times expanded major triad"},"exptriad3":{"frequencies":[261.6255653006,269.46602871384,275.93321340298,279.06726965397,287.4304306281,294.32876096318,297.67175429757,303.14928230307,306.59245933664,313.95067836072,323.35923445661,327.03195662575,344.91651675372,348.83408706747,359.28803828513,367.91095120397,372.08969287196,378.93660287884,383.2405741708,392.4383479509,404.19904307077,408.78994578219,418.60090448096,431.14564594215,436.04260883433,446.50763144636,459.88868900496,490.54793493862,505.24880383846,517.37477513058,523.2511306012],"description":"Three times expanded major triad"},"iivv17":{"frequencies":[261.6255653006,269.80136421624,277.97716313189,283.42769574232,294.32876096318,305.22982618403,318.85615771011,327.03195662575,343.38355445704,348.83408706747,359.73515228832,367.91095120397,370.63621750918,392.4383479509,416.96574469783,425.14154361347,436.04260883433,441.49314144476,457.84473927605,479.64686971777,490.54793493862,523.2511306012],"description":"17-limit IIVV"},"indian-ayyar":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,392.4383479509,406.97310157871,418.60090448096,436.04260883433,441.49314144476,457.84473927605,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Carnatic sruti system, C.Subrahmanya Ayyar, 1976. alt:21/20 25/16 63/40 40/21"},"indian-dk":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,313.95067836072,348.83408706747,392.4383479509,406.97310157871,418.60090448096,465.11211608996,523.2511306012],"description":"Raga Darbari Kanada"},"indian-ellis":{"frequencies":[261.6255653006,269.10058145205,277.01530443593,285.40970760065,294.32876096318,303.82323712328,313.95067836072,324.77656382143,336.37572681506,348.83408706747,358.01393146398,367.68998366571,377.90359432309,388.70083987518,400.13321751856,412.25846653428,425.14154361347,438.85578695585,453.48431318771,469.12170329763,485.87604984397,503.87145909745,523.2511306012],"description":"Ellis's Indian Chromatic, theoretical #74 of App.XX, p.517 of Helmholtz"},"indian-hahn":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,353.19451315581,367.91095120397,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Indian shrutis Paul Hahn proposal"},"indian-hrdaya1":{"frequencies":[261.6255653006,282.55561052465,294.32876096318,313.95067836072,328.55303549378,348.83408706747,375.07381928051,392.4383479509,428.11456140098,441.49314144476,470.92601754108,492.82955324067,523.2511306012],"description":"From Hrdayakautaka of Hrdaya Narayana (17th c) Bhatkande's interpretation"},"indian-hrdaya2":{"frequencies":[261.6255653006,282.55561052465,294.32876096318,313.95067836072,330.47439827444,348.83408706747,376.74081403286,392.4383479509,428.11456140098,448.50096908674,470.92601754108,495.71159741166,523.2511306012],"description":"From Hrdayakautaka of Hrdaya Narayana (17th c) Levy's interpretation"},"indian-invrot":{"frequencies":[261.6255653006,267.90457886781,279.06726965397,313.95067836072,327.03195662575,334.88072358477,348.83408706747,392.4383479509,418.60090448096,446.50763144636,490.54793493862,502.32108537715,523.2511306012],"description":"Inverted and rotated North Indian gamut"},"indian-magrama":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,367.91095120397,392.4383479509,441.49314144476,490.54793493862,523.2511306012],"description":"Indian mode Ma-grama (Sa Ri Ga Ma Pa Dha Ni Sa)"},"indian-newbengali":{"frequencies":[261.6255653006,269.13627541126,277.02257024271,285.46954808622,294.32876096318,303.84527498141,313.95067836072,324.71413568646,336.35938765066,348.83408706747,358.01090280364,367.91095120397,377.98706287655,388.6137256405,400.23209335925,412.19781491431,425.25755219187,438.98455767189,453.41648894489,469.13512554326,485.39868175205,503.9696508909,523.2511306012],"description":"Modern Bengali scale,S.M. Tagore: The mus. scales of the Hindus,Calcutta 1884"},"indian-old2ellis":{"frequencies":[261.6255653006,270.06509966514,277.97716313189,285.40970760065,294.32876096318,305.22982618403,316.13089140489,327.03195662575,337.93302184661,348.83408706747,359.73515228832,370.63621750918,380.54627680087,392.4383479509,404.33041910093,415.52295665389,428.11456140098,441.49314144476,457.84473927605,474.19633710734,490.54793493862,505.80942624783,523.2511306012],"description":"Ellis Old Indian Chrom2, Helmholtz, p. 517. This is a 4 cent appr. to #73"},"indian-oldellis":{"frequencies":[261.6255653006,269.44737349144,277.4816601673,285.79952600623,294.32876096318,304.84150796353,315.71315096976,327.03195662575,337.72216249472,348.83408706747,359.25382662183,369.99442271164,381.0561299374,392.4383479509,404.18156579781,416.22249025095,428.71043212875,441.49314144476,457.27414749797,473.58203588493,490.54793493862,506.59641128799,523.2511306012],"description":"Ellis Old Indian Chromatic, Helmholtz, p. 517. This is a 0.5 cent appr. to #73"},"indian-raja":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,348.83408706747,392.4383479509,490.54793493862,523.2511306012],"description":"A folk scale from Rajasthan, India"},"indian-sagrama":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,348.83408706747,392.4383479509,441.49314144476,490.54793493862,523.2511306012],"description":"Indian mode Sa-grama (Sa Ri Ga Ma Pa Dha Ni Sa), inverse of Didymus' diatonic"},"indian-srutiharm":{"frequencies":[261.6255653006,275.04226095704,278.87560257317,292.29229825722,294.20896982953,310.50067090621,313.3756771183,327.75070817877,332.5423844325,351.70909240436,354.58409877157,369.9174668925,374.70914348171,393.87585105695,414.95923028882,421.66757847392,437.95928040996,441.79262140873,467.66767825558,473.41768959156,493.54273382289,499.29274676062,523.2511306012],"description":"B. Chaitanya Deva's sruti harmonium. The Music of India, 1981, p. 109"},"indian-srutivina":{"frequencies":[261.6255653006,268.56758546278,278.98051393788,288.52577197574,297.52863491406,305.33829130574,314.01573591759,327.57422802312,336.57725592546,350.35262131413,358.2707318239,366.40588882483,378.77125721528,394.82459335461,403.28512412878,416.95215854696,428.77531684666,444.28620821491,453.93981227417,469.5594057965,487.34812384257,504.37765306036,529.32520658991],"description":"Raja S.M. Tagore's sruti vina, measured by Ellis and Hipkins, 1886. 1/1=241.2"},"indian-srutivina2":{"frequencies":[261.6255653006,275.04226095704,278.87560257317,292.29229825722,294.20896982953,310.50067090621,313.3756771183,327.75070817877,332.5423844325,351.70909240436,354.58409877157,369.9174668925,374.70914348171,393.87585105695,414.95923028882,421.66757847392,437.95928040996,441.79262140873,467.66767825558,473.41768959156,493.54273382289,499.29274676062,523.2511306012],"description":"S. Ramanathan's sruti vina, 1973. In B.C. Deva, The Music of India, p. 110"},"indian-vina":{"frequencies":[261.6255653006,276.70272600503,292.81785438923,313.29104303136,329.05685050583,352.26720984209,369.14054089803,390.18821123181,411.0090584005,435.70052664441,465.35666077712,491.60634075178,525.37110555681],"description":"Observed South Indian tuning of a vina, Ellis"},"indian-vina2":{"frequencies":[261.6255653006,277.02257024271,292.81785438923,308.97787266236,326.21810583671,344.81842302716,363.84824628932,386.37547528213,409.11417474979,432.19134773437,455.25352578019,480.93331155807,507.76825077597,539.82938999168,571.59905201246,602.44805673853,637.90290877605,678.5727631795,715.19510239543,756.4109196702,799.53998816902,846.10508618474,890.73947019126,943.16064703194,1001.55531043729],"description":"Observed tuning of old vina in Tanjore Palace, Ellis and Hipkins. 1/1=210.7 Hz"},"indian-vina3":{"frequencies":[261.6255653006,275.62199471997,294.32876096318,310.07474405997,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.43299207996,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"Tuning of K.S. Subramanian's vina (1983)"},"indian":{"frequencies":[261.6255653006,275.62199471997,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,331.11985608357,348.83408706747,353.19451315581,367.91095120397,372.50983809402,392.4383479509,413.43299207996,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,496.67978412536,523.2511306012],"description":"Indian shruti scale"},"indian2":{"frequencies":[261.6255653006,275.62199471997,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,331.11985608357,348.83408706747,353.19451315581,367.91095120397,372.08969287196,392.4383479509,413.43299207996,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,496.67978412536,523.2511306012],"description":"Indian shruti scale with tritone 64/45 schisma lower (Mr.Devarajan, Madurai)"},"indian2_sm":{"frequencies":[261.6255653006,275.80107697063,279.12844116922,290.7446524607,294.25230137258,310.19560923413,313.9379197281,327.00276442799,330.9478443499,348.87940629173,353.08841191408,367.78254402461,372.21960384438,392.38737044642,413.64787586584,418.63827382983,436.06032987759,441.3211172644,465.23297251763,470.84571179248,490.44043044945,496.35728163707,523.2511306012],"description":"Shruti/Mathieu's Magic Mode scale in 289-equal (schismic) temperament"},"indian3":{"frequencies":[261.6255653006,270.06509966514,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,331.11985608357,348.83408706747,353.19451315581,367.91095120397,372.08969287196,392.4383479509,413.43299207996,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,506.89953276991,523.2511306012],"description":"Indian shruti scale with 32/31 and 31/16 and tritone schisma lower"},"indian4":{"frequencies":[261.6255653006,275.93321340298,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,330.74639366397,348.83408706747,367.91095120397,372.08969287196,387.59343007496,392.4383479509,413.89982010446,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,496.11959049595,523.2511306012],"description":"Indian shruti scale according to Firoze Framjee: Text book of Indian music"},"indian5":{"frequencies":[261.6255653006,275.62199471997,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,331.11985608357,348.83408706747,353.19451315581,367.91095120397,372.08969287196,387.59343007496,392.4383479509,413.43299207996,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,496.67978412536,523.2511306012],"description":"23 Shrutis, Amit Mitra, 1/1 no. 12:2, Table C."},"indian6":{"frequencies":[146.8323839587,148.66778875818,150.35636117371,151.0621234143,152.23581568838,152.95039995698,154.68761437624,154.86227995644,156.62120955595,158.5789746754,159.32333328852,163.14709328744,165.18643195354,167.06262352634,169.15090632042,169.94488884109,172.0691999516,174.02356617327,176.19886075044,178.40134650982,179.23874994958,180.42763340845,181.27454809716,183.54047994838,185.62513725149,185.83473594773,187.94545146714,188.82765426788,190.29476961048,191.18799994622,193.3595179703,193.57784994555,195.77651194493,198.22371834425,200.47514823161,202.98108758451,203.93386660931,206.48303994192,208.82827940793,209.0640779412,211.43863290053,212.43111105136,214.08161581178,215.0864999395,217.52945771659,220.24857593805,223.00168313728,225.53454176056,226.59318512145,228.35372353257,229.42559993547,232.03142156437,232.29341993466,234.93181433392,237.86846201309,238.98499993278,240.57017787793,241.69939746288,244.72063993117,247.77964793031,250.59393528951,253.72635948063,254.91733326163,258.1037999274,261.03534925991,264.29829112566,267.60201976473,270.64145011268,271.91182214574,275.31071992256,278.43770587724,278.75210392159,281.9181772007,283.24148140181,285.44215441571,286.78199991934,290.03927695546,293.6647679174],"description":"Shrutis calculated by generation method, Amit Mitra, 1/1 no. 12:2, Table B."},"indian_12":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,441.49314144476,470.92601754108,490.54793493862,523.2511306012],"description":"North Indian Gamut, modern Hindustani gamut out of 22 or more shrutis"},"indian_12c":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,313.95067836072,328.55303549378,348.83408706747,369.35373924791,392.4383479509,415.52295665389,441.49314144476,470.92601754108,492.82955324067,523.2511306012],"description":"Carnatic gamut. Kuppuswami: Carnatic music and the Tamils, p. v"},"indian_a":{"frequencies":[261.6255653006,290.79521372391,318.76727400207,355.94891173479,388.6137256405,432.69092326853,486.52148746092,523.2511306012],"description":"One observed indian mode"},"indian_b":{"frequencies":[261.6255653006,290.79521372391,305.95868600104,356.15457528086,388.83826257328,432.94092754357,461.60862817266,523.2511306012],"description":"Observed Indian mode"},"indian_c":{"frequencies":[261.6255653006,278.94941459687,313.65318017499,356.15457528086,388.83826257328,422.07621250312,470.76384471612,523.2511306012],"description":"Observed Indian mode"},"indian_d":{"frequencies":[261.6255653006,289.28740724512,320.24370022528,344.61930560862,391.31674786192,442.03793673691,485.39868175205,523.2511306012],"description":"Indian D (Ellis, correct)"},"indian_e":{"frequencies":[261.6255653006,275.58617649731,323.21709932123,347.81902735497,393.58362272115,410.77171881178,488.21056770985,523.2511306012],"description":"Observed Indian mode"},"indian_g":{"frequencies":[261.6255653006,275.48458755707,279.57748987366,290.07776015425,294.38747470873,309.98198497505,314.58741860623,326.40257913196,331.25197518754,348.79929894143,353.98144532328,367.27615246113,372.73281132023,392.47748849606,413.26809526256,419.40806105693,435.16003737285,441.62525396027,465.0193523796,471.92819182319,489.65270022124,496.92751979948,523.2511306012],"description":"Shruti/Mathieu's Magic Mode scale in 94-et (garibaldi) temperament"},"indian_rat":{"frequencies":[261.6255653006,269.55361273395,277.4816601673,285.40970760065,294.32876096318,302.93486508491,315.75499260417,327.03195662575,337.58137458142,348.83408706747,359.73515228832,370.63621750918,380.54627680087,392.4383479509,404.33041910093,416.22249025095,428.77523202043,441.49314144476,457.84473927605,473.41768959156,490.54793493862,506.37206187213,523.2511306012],"description":"Indian Raga, From Fortuna, after Helmholtz, ratios by JC"},"indian_rot":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,306.59245933664,327.03195662575,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,490.54793493862,510.98743222773,523.2511306012],"description":"Rotated North Indian Gamut"},"ionic":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,348.83408706747,392.4383479509,436.04260883433,470.92601754108,523.2511306012],"description":"Ancient greek Ionic"},"iran_diat":{"frequencies":[261.6255653006,297.21429859784,337.6441411202,347.13660997509,394.35734781054,448.00148789644,460.59652406882,523.2511306012],"description":"Iranian Diatonic from Dariush Anooshfar, Safi-a-ddin Armavi's scale from 125 ET"},"iraq":{"frequencies":[261.6255653006,290.3675288125,326.6631048533,348.83408706747,387.1561215731,435.55129321875,465.11211608996,516.20736538157,523.2511306012],"description":"Iraq 8-tone scale, Ellis"},"isfahan_5":{"frequencies":[261.6255653006,283.42769574232,305.22982618403,327.03195662575,348.83408706747,523.2511306012],"description":"Isfahan (IG #2, DF #8), from Rouanet"},"islamic":{"frequencies":[261.6255653006,283.42769574232,305.22982618403,330.6656450327,348.83408706747,523.2511306012],"description":"Islamic Genus (DF#7), from Rouanet"},"italian":{"frequencies":[261.6255653006,274.68983337859,292.34127285051,309.02606224197,326.6631048533,348.44038788768,366.66693712906,391.11111150212,411.56972129721,437.02884834934,464.06284405662,489.44164088633,523.2511306012],"description":"Italian organ temperament, G.C. Klop (1974), 1/12 P.comma, also d'Alembert/Rousseau (1752/67)"},"iter1":{"frequencies":[261.6255653006,264.43874342211,268.51044859798,278.54662176283,304.33994330886,376.91818729747,631.61998662719],"description":"McLaren style, IE= 2.414214, PD=5, SD=0"},"iter10":{"frequencies":[261.6255653006,277.06070189651,293.38358189778,297.59908052943,301.91391280887,310.68035879446,328.97472072452,338.5155215149,348.35227203008,368.89204707385,413.65123162392,438.0707139917,463.89070822207,520.1365405381,535.27989222422,550.79066379074,583.29634230953,654.0639132515],"description":"Iterated 5/2 Scale, IE=5/2, PD=4, SD=3"},"iter11":{"frequencies":[261.6255653006,278.87608544381,297.26403435806,306.90779184711,316.86440944623,337.75715313333,360.02747892105,383.76621672426,396.21625406084,409.07019206122,436.04260883433],"description":"Binary 5/3 Scale #2"},"iter12":{"frequencies":[261.6255653006,297.26403435806,306.90779184711,316.86440944623,337.75715313333,360.02747892105,383.76621672426,396.21625406084,409.07019206122,436.04260883433],"description":"Binary 5/3 Scale #4"},"iter13":{"frequencies":[261.6255653006,297.26403435806,337.75715313333,383.76621672426,409.07019206122,436.04260883433],"description":"Binary 5/3 Scale #6"},"iter14":{"frequencies":[261.6255653006,280.22072913446,300.13755324878,344.3186075731,368.79121945838,395.0032340925,453.14877154631,519.85349135637,596.37732215892,638.76512932755,684.16567043124,784.8766959018],"description":"Binary Divided 3/1 Scale #2"},"iter15":{"frequencies":[261.6255653006,285.30470202322,311.12698372208,324.90175210669,339.28638158975,369.99442271164,403.48177901006,440,459.48046426806,479.82340237272,523.2511306012],"description":"Binary Division Scale"},"iter16":{"frequencies":[261.6255653006,273.20871865617,285.30470202322,311.12698372208,324.90175210669,339.28638158975,369.99442271164,403.48177901006,440,459.48046426806,479.82340237272,523.2511306012],"description":"Binary Division Scale 4+2"},"iter17":{"frequencies":[261.6255653006,278.49896488475,296.46060526524,301.12918013362,305.87127435301,315.58067012184,335.93387506143,346.5975621448,357.59974896504,380.66295170881,431.34763334053,459.16716607109,488.78090454553,553.8613271114,571.44277158458,589.58231097183,627.60710380636,711.17202040031],"description":"Binary E Scale #2"},"iter18":{"frequencies":[261.6255653006,296.46060526524,335.93387506143,357.59974896504,380.66295170881,431.34763334053,488.78090454553,553.8613271114,589.58231097183,627.60710380636,711.17202040031],"description":"Binary E Scale #4"},"iter19":{"frequencies":[261.6255653006,322.51878830959,331.06584352035,339.83940187549,358.09020513941,397.58488163802,418.936859706,441.43552612833,490.12256936272,604.19836236377,670.83693141722,744.82523718317,918.18295398723,967.49323514067,1019.45167961503,1131.88958971281,1395.33634826987],"description":"Binary Kidjel Ratio scale #2, IE=16/3"},"iter2":{"frequencies":[261.6255653006,264.43874342211,268.51044859798,278.54662176283,304.33994330886,376.91818729747,466.76379263857,529.06503205232,631.63886479716],"description":"Iterated 1 + SQR(2) Scale, IE=2.414214, PD=5, SD=1"},"iter20":{"frequencies":[261.6255653006,269.61366892789,277.84567157694,295.07138236029,304.08067308856,313.36504071103,332.79286022776,353.42515415018,375.3365967665,386.79659161311,398.60648967463,423.31905787312],"description":"Binary PHI Scale #2"},"iter21":{"frequencies":[261.6255653006,265.58958666715,269.61366892789,277.84567157694,295.07138236029,304.08067308856,313.36504071103,332.79286022776,353.42515415018,375.3365967665,386.79659161311,398.60648967463,423.31905787312],"description":"Binary PHI Scale 5+2 #2"},"iter22":{"frequencies":[261.6255653006,301.8727519909,307.3207469799,312.86706369289,324.26179396336,348.311367392,360.99698978488,374.14462916403,401.89387036212,463.7192413329,498.11197631533,535.05552246568,617.36582527423,639.85050556571,663.15408964479,712.33833913185,821.92095613931],"description":"Binary PI Scale #2"},"iter23":{"frequencies":[261.6255653006,280.22072913446,282.63618845904,285.07246866924,290.00821285991,300.13755151512,305.33413252207,310.62068712289,321.46997343155,344.3186075731,356.34488692223,368.79121945838,395.00323181087,401.84231702948,408.7998141568,423.07827792492,453.14877154631],"description":"Binary SQR(3) Scale #2"},"iter24":{"frequencies":[261.6255653006,289.31157243481,292.97226416221,296.67927674571,304.23460945445,319.92739457651,328.07477344771,336.42963427227,353.78307729046,391.22147055517,411.40114203819,432.62170761687,478.4030399831,490.58621022536,503.07964402145,529.02909391167,585.01254970054],"description":"Binary SQR(5) Scale #2"},"iter25":{"frequencies":[261.6255653006,295.4600775297,299.98610231105,304.581459303,313.98443628203,333.67021037701,343.97120738708,354.59021667251,376.82183739983,425.55401329039,452.23482674104,480.58843796626,542.7401414615,559.49550492793,576.76813324226,612.92956630767,692.19618110881],"description":"Binary SQR(7) Scale #2"},"iter26":{"frequencies":[261.6255653006,266.56189672137,275.04226095704,276.16031892841,278.32506946872,283.8915708581,299.68019298069,302.93486508491,309.19384990071,326.13597866239,377.90359432309,389.87339142835,411.92110281371,477.08191319521,486.74523776856,503.12608711654,552.32063785682,711.29450566101],"description":"E Scale"},"iter27":{"frequencies":[261.6255653006,264.53251602616,264.59858308811,264.97973921471,266.91093025617,277.4816601673,277.93638607994,279.98525409362,291.05844139692,358.0999925052,361.3330282979,375.61956161015,462.09190754392,465.48964215821,480.4396744611,568.53247844169,1395.33634826987],"description":"Iterated Kidjel Ratio Scale, IE=16/3, PD=3, SD=3"},"iter28":{"frequencies":[261.6255653006,265.20947715403,272.47639519786,295.60291144354,377.3445653374,784.8766959018],"description":"McLaren 3-Division Scale"},"iter29":{"frequencies":[261.6255653006,264.46932144517,267.35459227799,273.20191774753,285.29018929764,311.12229387098,370.01329949656,523.2511306012],"description":"Iterated Binary Division of the Octave, IE=2, PD=6, SD=0"},"iter3":{"frequencies":[261.6255653006,291.72408166262,314.40967058055,328.65360269166,338.82655178274,356.71329642628,384.4758307461,404.77917650282,417.30358762823,426.15298265459,441.49314144476],"description":"Iterated 27/16 Scale, analog of Hexachord, IE=27/16, PD=3, SD=2"},"iter30":{"frequencies":[261.6255653006,263.40533105094,266.47048317654,274.97380842818,299.54231389489,377.98194879009,711.1793535636],"description":"Iterated E-scale, IE= 2.71828, PD=5, SD=0"},"iter31":{"frequencies":[261.6255653006,264.53251602616,277.4816601673,358.0999925052,1395.33634826987],"description":"Iterated Kidjel Ratio Scale, IE=16/3, PD=3, SD=0"},"iter32":{"frequencies":[261.6255653006,264.32273607689,265.98599138894,268.74462830198,273.21657135822,280.65287914064,293.09931751721,314.43072526953,352.25402909754,423.30428543018],"description":"Iterated PHI scale, IE= 1.61803339, PD=8, SD=0"},"iter33":{"frequencies":[261.6255653006,264.70351312767,271.46111286829,293.79264300149,376.62581378438,821.87425059077],"description":"Iterated PI Scale, IE= 3.14159, PD=4, SD=0"},"iter34":{"frequencies":[261.6255653006,263.41752122732,264.70351312767,267.00143308075,271.01725226011,278.10591587072,290.81088732616,314.21361862735,359.24704489038,453.1728541814],"description":"Iterated SQR3 Scale, IE= 1.73205, PD=8, SD=0"},"iter35":{"frequencies":[261.6255653006,263.32443260775,265.41724016003,270.17542037578,281.14986121856,307.30621955943,374.94109676838,585.0238335194],"description":"Iterated SQR 5 Scale, IE= 2.23607, PD=6, SD=0"},"iter36":{"frequencies":[261.6255653006,263.60757715894,266.85807660661,275.72514666411,300.63990398578,377.90359432309,692.2176415245],"description":"Iterated SQR 7 Scale, IE= 2.64575, PD=5, SD=0"},"iter37":{"frequencies":[261.6255653006,295.02271214403,313.28742377221,326.0879260201,332.68289475257,342.82647426905,364.05069339959,375.15068445646,382.73792346942,386.58911684499,392.4383479509],"description":"Iterated 3/2 scale, IE=3/2, PD=3, SD=2"},"iter4":{"frequencies":[261.6255653006,267.82522324611,277.41331493081,278.97828136646,281.37089098366,287.35922746131,302.93486508491,307.2300216374,313.76772341995,330.79094463294,377.42704502382,390.96854140427,412.14986314478,470.26367433779,480.2976795817,495.79659597089,536.59937372878,654.0639132515],"description":"Iterated 5/2 Scale, IE=5/2, PD=4, SD=3"},"iter5":{"frequencies":[261.6255653006,292.148547919,314.45380444784,328.62723446295,338.43307070995,355.46951807147,382.59222452561,401.8431885336,413.81298563886,422.03832066739,436.04260883433],"description":"Iterated 5/3 Scale, analog of Hexachord, IE=5/3, PD=3, SD=2"},"iter6":{"frequencies":[261.6255653006,276.4345595629,292.10621368514,326.13597866239,344.58001283494,364.1180547998,406.52587839016,453.84026633778,506.69255051888,535.41976154541,565.73733351326,631.63886479716],"description":"Iterated binary 1+SQR(2) scale, IE= 2.414214, G=2, PD=4, SD=2"},"iter7":{"frequencies":[261.6255653006,279.30296836145,298.19688088025,308.09852755794,318.34159693919,339.84351781315,362.8203594263,387.34174602946,400.24806631808,413.53718386224,441.49314144476],"description":"Iterated 27/16 Scale, analog of Hexachord, IE=27/16, PD=3, SD=2"},"iter8":{"frequencies":[261.6255653006,298.19688088025,308.09852755794,318.34159693919,339.84351781315,362.8203594263,387.34174602946,400.24806631808,413.53718386224,441.49314144476],"description":"Iterated 27/16 Scale, analog of Hexachord, IE=27/16, PD=2, SD=2"},"iter9":{"frequencies":[261.6255653006,298.19688088025,339.84351781315,387.34174602946,413.53718386224,441.49314144476],"description":"Iterated 27/16 Scale, analog of Hexachord, IE=27/16, PD=2, SD=12"},"ives":{"frequencies":[261.6255653006,302.26980244078,349.22823143301,375.37611551499,433.69180740168,501.06699929295,578.9091089468,622.25396744417],"description":"Charles Ives' stretched major scale, \"Scrapbook\" pp. 108-110"},"ives2a":{"frequencies":[261.6255653006,303.72829164664,352.60650301302,379.92060676531,441.0602510811,512.03893786214,594.44004134205,640.48740045057],"description":"Speculation by Joe Monzo for Ives' other stretched scale"},"ives2b":{"frequencies":[261.6255653006,300.81831683262,345.88232658126,370.885984045,426.44646246473,490.3301667422,563.78395315523,604.53960488156],"description":"Alt. speculation by Joe Monzo for Ives' other stretched scale"},"abell1":{"frequencies":[261.6255653006,273.68256372566,292.6487650037,305.95868600104,327.16162250699,342.04121835587,365.95599773772,391.31674786192,409.35055662695,437.71854962063,457.62637091093,489.33987776603,523.2511306012],"description":"Ross Abell's French Baroque Meantone 1, a'=520"},"abell2":{"frequencies":[261.6255653006,275.90473010106,294.68429813772,308.79945157961,330.00857764288,348.01999353916,369.14054089803,392.90218486657,412.67427966689,441.52756934418,463.21121723949,493.59810545034,523.2511306012],"description":"Ross Abell's French Baroque Meantone 2, a'=520"},"abell3":{"frequencies":[261.6255653006,275.90505521365,293.49576926806,308.08682543008,329.24698751194,350.03632176331,368.71497179837,392.44893164635,412.28324979826,440.25465969448,462.14293627657,492.7440237889,523.2511306012],"description":"Ross Abell's French Baroque Meantone 3, a' = 520"},"abell4":{"frequencies":[261.6255653006,274.95017225036,292.98704147282,308.2648062752,328.10786809908,346.01554587335,367.43868454848,391.54284657258,411.48414905414,438.47771564426,461.87534079415,491.0387427573,523.2511306012],"description":"Ross Abell's French Baroque Meantone 4, a'=520"},"abell5":{"frequencies":[261.6255653006,277.98432293805,295.87822452474,311.66659310186,331.15428443044,349.43001184052,371.27895029721,395.6350356808,416.26536455926,442.29334161825,466.70260620202,495.88429116026,523.2511306012],"description":"Ross Abell's French Baroque Meantone 5, a'=520"},"abell6":{"frequencies":[261.6255653006,277.02257024271,293.32570896007,311.66659310186,330.00857764288,349.43001184052,369.99442271164,391.76907592069,414.82519580403,440.76312290327,466.70260620202,494.16866184506,523.2511306012],"description":"Ross Abell's French Baroque Meantone 6, a'=520"},"abell7":{"frequencies":[261.6255653006,277.50302994288,294.34406205295,310.05056613125,328.86683469969,348.82502010853,369.99442271164,392.44854854484,416.26536455926,438.47771564426,465.08793784701,493.31307433255,523.2511306012],"description":"Ross Abell's French Baroque Meantone 7, a'=520"},"abell8":{"frequencies":[261.6255653006,277.82379926216,294.68429813772,311.48661940174,329.62755691287,350.03605285217,371.27895029721,392.44854854484,415.30469757995,441.01779121056,467.78216486233,494.45418731234,523.2511306012],"description":"Ross Abell's French Baroque Meantone 8, a'=520"},"abell9":{"frequencies":[261.6255653006,276.06414495892,293.32570896007,309.69258848748,330.19925313612,348.62358905703,369.14054089803,391.99543598175,412.67427966689,440,464.55095742407,493.88330125613,523.2511306012],"description":"Ross Abell's French Baroque Meantone 9, a'=520"},"ad-dik":{"frequencies":[261.6255653006,269.0348830679,275.62199471997,285.40970760065,294.32876096318,300.46061014991,310.07474405997,321.08592105074,327.03195662575,336.37572681506,348.83408706747,358.80077526939,367.49599295996,378.42269266694,392.4383479509,400.61414686654,413.43299207996,428.11456140098,441.49314144476,453.48431318771,470.92601754108,479.64686971777,490.54793493862,508.71637697339,523.2511306012],"description":"Amin Ad-Dik, d'Erlanger, vol 5, p.42"},"adjeng":{"frequencies":[261.6255653006,285.30470202322,305.78200836532,383.0422478503,417.71053321823,523.2511306012],"description":"Soeroepan adjeng"},"aeolic":{"frequencies":[261.6255653006,294.32876096318,310.07474405997,348.83408706747,392.4383479509,413.43299207996,465.11211608996,523.2511306012],"description":"Ancient Greek Aeolic, also tritriadic scale of the 54:64:81 triad"},"agricola":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,310.42486507835,331.11985608357,348.83408706747,367.91095120397,392.4383479509,413.89982010446,441.49314144476,465.11211608996,496.67978412536,523.2511306012],"description":"Agricola's Monochord, Rudimenta musices (1539)"},"al-din":{"frequencies":[261.6255653006,275.62199471997,290.36720431405,294.32876096318,310.07474405997,326.6631048533,331.11985608357,348.83408706747,367.49599295996,387.15627241873,392.4383479509,413.43299207996,435.55080647107,441.49314144476,465.11211608996,489.99465727995,516.20836322497,523.2511306012,551.24398943995,580.73440862809,588.65752192635,620.14948811994,653.3262097066,688.27781763329,697.66817413493,734.99198591993,774.31254483746,784.8766959018,826.86598415992,871.10161294214,917.70375684439,930.22423217991,979.98931455991,1032.41672644994,1046.5022612024,1102.48797887989],"description":"Safi al-Din's complete lute tuning on 5 strings 4/3 apart"},"al-din_19":{"frequencies":[261.6255653006,275.62199471997,290.36720431405,294.32876096318,310.07474405997,326.6631048533,331.11985608357,344.13890881665,348.83408706747,367.49599295996,387.15627241873,392.4383479509,413.43299207996,435.55080647107,441.49314144476,458.8518784222,465.11211608996,489.99465727995,516.20836322497,523.2511306012],"description":"Arabic scale by Safi al-Din"},"al-farabi":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,348.83408706747,392.4383479509,418.60090448096,448.50096908674,523.2511306012],"description":"Al-Farabi Syn Chrom"},"al-farabi_19":{"frequencies":[261.6255653006,275.62199471997,285.40970760065,294.32876096318,310.07474405997,326.6631048533,331.11985608357,336.87132687997,348.83408706747,367.49599295996,380.54627680087,392.4383479509,413.43299207996,435.55080647107,441.49314144476,455.28980211491,465.11211608996,489.99465727995,507.3950357345,523.2511306012],"description":"Arabic scale by Al Farabi"},"al-farabi_22":{"frequencies":[261.6255653006,275.62199471997,277.01530443593,285.40970760065,294.32876096318,310.07474405997,321.08592105074,326.6631048533,331.11985608357,348.83408706747,367.49599295996,369.35373924791,380.54627680087,392.4383479509,413.43299207996,428.11456140098,435.55080647107,441.49314144476,465.11211608996,489.99465727995,492.47165233054,507.3950357345,523.2511306012],"description":"Al-Farabi 22 note ud scale"},"al-farabi_9":{"frequencies":[261.6255653006,294.32876096318,321.08592105074,331.11985608357,348.83408706747,392.4383479509,428.11456140098,441.49314144476,465.11211608996,523.2511306012],"description":"Al-Farabi 9 note ud scale"},"al-farabi_blue":{"frequencies":[261.6255653006,294.32876096318,367.91095120397,380.81054504865,392.4383479509,490.54793493862,506.89953276991,523.2511306012],"description":"Another tuning from Al Farabi, c700 AD"},"al-farabi_chrom":{"frequencies":[261.6255653006,294.32876096318,353.19451315581,372.50983809402,392.4383479509,470.92601754108,497.08857407114,523.2511306012],"description":"Al Farabi's Chromatic c700 AD"},"al-farabi_chrom2":{"frequencies":[261.6255653006,279.06726965397,325.57848126297,348.83408706747,392.4383479509,418.60090448096,488.36772189445,523.2511306012],"description":"Al-Farabi's Chromatic permuted"},"al-farabi_diat":{"frequencies":[261.6255653006,299.00064605783,341.71502406609,348.83408706747,392.4383479509,448.50096908674,512.57253609913,523.2511306012],"description":"Al-Farabi's Diatonic"},"al-farabi_diat2":{"frequencies":[261.6255653006,290.69507255622,313.95067836072,348.83408706747,392.4383479509,436.04260883433,470.92601754108,523.2511306012],"description":"Old Phrygian, permuted form of Al-Farabi's reduplicated 10/9 diatonic genus, same as ptolemy_diat"},"al-farabi_div":{"frequencies":[261.6255653006,275.62199471997,277.01530443593,284.45195690401,288.32205155576,294.32876096318,310.07474405997,311.64221749042,321.08592105074,331.11985608357,348.83408706747],"description":"Al Farabi's 10 intervals for the division of the tetrachord"},"al-farabi_div2":{"frequencies":[261.6255653006,275.62199471997,277.01530443593,279.38237857051,284.45195690401,288.32205155576,294.32876096318,310.07474405997,311.64221749042,314.30517589183,321.08592105074,331.11985608357,348.83408706747],"description":"Al-Farabi's tetrachord division, incl. extra 2187/2048 & 19683/16384"},"al-farabi_divo":{"frequencies":[261.6255653006,275.62199471997,277.01530443593,284.45195690401,288.32205155576,294.32876096318,310.07474405997,311.64221749042,321.08592105074,331.11985608357,348.83408706747,367.49599295996,369.35373924791,379.26927587201,392.4383479509,413.43299207996,415.52295665389,426.67793535601,432.48307733364,441.49314144476,465.11211608996,467.46332623563,481.6288815761,496.67978412536,523.2511306012],"description":"Al Farabi's theoretical octave division with identical tetrachords, 10th c."},"al-farabi_dor":{"frequencies":[261.6255653006,282.55561052465,313.95067836072,348.83408706747,392.4383479509,423.83341578697,470.92601754108,523.2511306012],"description":"Dorian mode of Al-Farabi's 10/9 Diatonic"},"al-farabi_dor2":{"frequencies":[261.6255653006,267.07609791103,305.22982618403,348.83408706747,392.4383479509,400.61414686654,457.84473927605,523.2511306012],"description":"Dorian mode of Al-Farabi's Diatonic"},"al-farabi_g1":{"frequencies":[261.6255653006,294.32876096318,331.11985608357,367.91095120397,392.4383479509,441.49314144476,490.54793493862,523.2511306012],"description":"Al-Farabi's Greek genus conjunctum medium, Land"},"al-farabi_g10":{"frequencies":[261.6255653006,294.32876096318,343.38355445704,367.91095120397,392.4383479509,457.84473927605,490.54793493862,523.2511306012],"description":"Al-Farabi's Greek genus chromaticum forte"},"al-farabi_g11":{"frequencies":[261.6255653006,294.32876096318,353.19451315581,372.50983809402,392.4383479509,470.92601754108,496.67978412536,523.2511306012],"description":"Al-Farabi's Greek genus chromaticum mollissimum"},"al-farabi_g12":{"frequencies":[261.6255653006,294.32876096318,367.91095120397,380.17464957743,392.4383479509,490.54793493862,506.89953276991,523.2511306012],"description":"Al-Farabi's Greek genus mollissimum ordinantium"},"al-farabi_g3":{"frequencies":[261.6255653006,294.32876096318,336.37572681506,378.42269266694,392.4383479509,448.50096908674,504.56359022259,523.2511306012],"description":"Al-Farabi's Greek genus conjunctum primum"},"al-farabi_g4":{"frequencies":[261.6255653006,294.32876096318,336.37572681506,384.42940207435,392.4383479509,448.50096908674,512.57253609913,523.2511306012],"description":"Al-Farabi's Greek genus forte duplicatum primum"},"al-farabi_g5":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,392.4383479509,436.04260883433,479.64686971777,523.2511306012],"description":"Al-Farabi's Greek genus conjunctum tertium, or forte aequatum"},"al-farabi_g6":{"frequencies":[261.6255653006,294.32876096318,336.37572681506,373.75080757229,392.4383479509,448.50096908674,498.33441009638,523.2511306012],"description":"Al-Farabi's Greek genus forte disjunctum primum"},"al-farabi_g7":{"frequencies":[261.6255653006,294.32876096318,343.38355445704,374.60024122586,392.4383479509,457.84473927605,499.46698830115,523.2511306012],"description":"Al-Farabi's Greek genus non continuum acre"},"al-farabi_g8":{"frequencies":[261.6255653006,294.32876096318,353.19451315581,378.42269266694,392.4383479509,470.92601754108,504.56359022259,523.2511306012],"description":"Al-Farabi's Greek genus non continuum mediocre"},"al-farabi_g9":{"frequencies":[261.6255653006,294.32876096318,367.91095120397,383.71749577421,392.4383479509,490.54793493862,511.62332769895,523.2511306012],"description":"Al-Farabi's Greek genus non continuum laxum"},"al-hwarizmi":{"frequencies":[261.6255653006,294.32876096318,302.73815413355,311.64221749042,321.08592105074,331.11985608357,348.83408706747],"description":"Al-Hwarizmi's tetrachord division"},"al-kindi":{"frequencies":[261.6255653006,275.62199471997,279.38237857051,294.32876096318,310.07474405997,331.11985608357,348.83408706747],"description":"Al-Kindi's tetrachord division"},"al-kindi2":{"frequencies":[261.6255653006,275.62199471997,294.32876096318,310.07474405997,326.6631048533,331.11985608357,348.83408706747,367.49599295996,392.4383479509,413.43299207996,435.55080647107,441.49314144476,465.11211608996,489.99465727995,523.2511306012],"description":"Arabic mode by al-Kindi"},"al-mausili":{"frequencies":[261.6255653006,275.62199471997,294.32876096318,310.07474405997,331.11985608357,348.83408706747,367.49599295996,392.4383479509,413.43299207996,441.49314144476,465.11211608996,523.2511306012],"description":"Arabic mode by Ishaq al-Mausili, ? - 850 AD"},"albion":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,372.08969287196,392.4383479509,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Terry Riley's Harp of New Albion scale, inverse Malcolm's Monochord, 1/1 on C#"},"alembert":{"frequencies":[261.6255653006,273.70610837433,292.50627485027,307.8325111191,327.03195662575,347.99121610009,365.92863081328,391.22147055517,409.45161370755,437.39890198442,462.86717295458,489.22460251523,523.2511306012],"description":"Jean-Le Rond d'Alembert modified meantone (1752)"},"alembert2":{"frequencies":[261.6255653006,274.99999938609,292.5775112526,309.28790118232,327.03195662575,348.53877105022,367.08095907728,391.31674786192,412.03444522126,437.50542525192,464.32494005553,489.99429388332,523.2511306012],"description":"d'Alembert (?)"},"alves":{"frequencies":[261.6255653006,267.07609791103,294.32876096318,305.22982618403,327.03195662575,336.37572681506,348.83408706747,359.73515228832,392.4383479509,425.14154361347,448.50096908674,457.84473927605,504.56359022259,523.2511306012],"description":"Bill Alves, tuning for \"Instantaneous Motion\", 1/1 vol. 6/3"},"alves_22":{"frequencies":[261.6255653006,269.80136421624,279.06726965397,287.78812183066,297.30177875068,305.22982618403,317.12189733406,327.03195662575,336.37572681506,348.83408706747,359.73515228832,370.01329949656,380.54627680087,392.4383479509,406.97310157871,418.60090448096,431.68218274599,448.50096908674,460.46099492906,475.68284600109,490.54793493862,507.3950357345,523.2511306012],"description":"11-limit rational interpretation of 22-tET, Bill Alves, tuning list 9-1-98"},"amity":{"frequencies":[261.6255653006,265.19165427121,275.22357733525,278.97501409741,282.77758484276,286.63198489776,290.53892403345,294.49911672845,305.63971046081,309.80573452349,314.02854360428,318.30891171173,322.64762154083,327.04547204619,339.41726037801,344.04368955469,348.73317930436,353.48658917459,358.304790429,371.85908609843,376.92771379174,382.0654272409,387.27317253358,392.55190203235,397.90258328792,412.95482206782,418.58360545772,424.28911201625,430.07238503487,435.93448947821,452.42543551278,458.59222335614,464.84306764133,471.17911410024,477.60152408164,484.11147196776,502.42490579041,509.27320879713,516.21486058423,523.2511306012],"description":"Amity temperament, g=339.508826, 5-limit"},"angklung":{"frequencies":[261.6255653006,294.70472480469,326.28010551578,372.13971319976,421.00655337609,533.77627782773,589.40944960937,672.10704388342,757.81210779894],"description":"Scale of an anklung set from Tasikmalaya. 1/1=174 Hz"},"appunn":{"frequencies":[261.6255653006,272.52663052146,275.93321340298,279.38237857051,287.10624449997,290.69507255622,294.32876096318,302.46583782713,306.24666079997,310.07474405997,322.99452506247,327.03195662575,331.11985608357,340.27406755552,344.52749339997,348.83408706747,363.36884069528,367.91095120397,372.50983809402,382.80832599996,387.59343007496,392.4383479509,408.78994578219,413.89982010446,419.07356785577,430.65936674996,436.04260883433,441.49314144476,453.6987567407,459.36999119996,465.11211608996,484.4917875937,490.54793493862,496.67978412536,510.41110133328,516.79124009995,523.2511306012],"description":"Probable tuning of A. Appunn's 36-tone harmonium w. 3 manuals 80/81 apart,1887"},"arabic":{"frequencies":[261.6255653006,275.62199471997,290.36720431405,294.32876096318,310.07474405997,326.6631048533,331.11985608357,348.83408706747,367.49599295996,387.15627241873,392.4383479509,413.43299207996,435.55080647107,441.49314144476,465.11211608996,489.99465727995,516.20836322497,523.2511306012],"description":"Arabic 17-tone Pythagorean mode, Safi al-Din"},"arabic_s":{"frequencies":[261.6255653006,275.62199471997,290.69507255622,294.32876096318,310.07474405997,327.03195662575,331.11985608357,348.83408706747,367.91095120397,387.59343007496,392.4383479509,413.43299207996,436.04260883433,441.49314144476,465.11211608996,490.54793493862,516.79124009995,523.2511306012],"description":"Schimatically altered Arabic 17-tone Pythagorean mode"},"arch_chrom":{"frequencies":[261.6255653006,271.31540105247,294.32876096318,348.83408706747,392.4383479509,406.97310157871,441.49314144476,523.2511306012],"description":"Archytas' Chromatic"},"arch_chromc2":{"frequencies":[261.6255653006,271.31540105247,294.32876096318,305.22982618403,331.11985608357,343.38355445704,348.83408706747,361.75386806997,392.4383479509,406.97310157871,422.04617941496,441.49314144476,457.84473927605,496.67978412536,523.2511306012],"description":"Product set of 2 of Archytas' Chromatic"},"arch_dor":{"frequencies":[261.6255653006,271.31540105247,294.32876096318,348.83408706747,392.4383479509,406.97310157871,465.11211608996,441.49314144476,523.2511306012],"description":"Dorian mode of Archytas' Chromatic with added 16/9"},"arch_enh":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,348.83408706747,392.4383479509,406.97310157871,418.60090448096,523.2511306012],"description":"Archytas' Enharmonic"},"arch_enh2":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,348.83408706747,392.4383479509,406.97310157871,465.11211608996,418.60090448096,523.2511306012],"description":"Archytas' Enharmonic with added 16/9"},"arch_enh3":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,336.37572681506,348.83408706747,358.80077526939,448.50096908674,523.2511306012],"description":"Complex 9 of p. 113 based on Archytas's Enharmonic"},"arch_enhp":{"frequencies":[261.6255653006,269.10058145205,279.06726965397,348.83408706747,392.4383479509,403.65087217807,418.60090448096,523.2511306012],"description":"Permutation of Archytas's Enharmonic with the 36/35 first"},"arch_enht":{"frequencies":[261.6255653006,269.10058145205,271.31540105247,279.06726965397,336.37572681506,348.83408706747,504.56359022259,523.2511306012],"description":"Complex 6 of p. 113 based on Archytas's Enharmonic"},"arch_enht2":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,327.03195662575,348.83408706747,490.54793493862,508.71637697339,523.2511306012],"description":"Complex 5 of p. 113 based on Archytas's Enharmonic"},"arch_enht3":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,281.36411960997,289.40309445597,348.83408706747,361.75386806997,523.2511306012],"description":"Complex 1 of p. 113 based on Archytas's Enharmonic"},"arch_enht4":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,327.03195662575,339.14425131559,348.83408706747,436.04260883433,523.2511306012],"description":"Complex 8 of p. 113 based on Archytas's Enharmonic"},"arch_enht5":{"frequencies":[261.6255653006,263.77886213435,271.31540105247,279.06726965397,339.14425131559,348.83408706747,508.71637697339,523.2511306012],"description":"Complex 10 of p. 113 based on Archytas's Enharmonic"},"arch_enht6":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,289.40309445597,297.67175429757,348.83408706747,372.08969287196,523.2511306012],"description":"Complex 2 of p. 113 based on Archytas's Enharmonic"},"arch_enht7":{"frequencies":[261.6255653006,269.10058145205,271.31540105247,279.06726965397,287.04062021552,348.83408706747,358.80077526939,523.2511306012],"description":"Complex 11 of p. 113 based on Archytas's Enharmonic"},"arch_mult":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,327.03195662575,336.37572681506,348.83408706747,361.75386806997,392.4383479509,406.97310157871,418.60090448096,490.54793493862,504.56359022259,523.2511306012],"description":"Multiple Archytas"},"arch_ptol":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,290.69507255622,310.07474405997,348.83408706747,361.75386806997,392.4383479509,406.97310157871,418.60090448096,436.04260883433,465.11211608996,523.2511306012],"description":"Archytas/Ptolemy Hybrid 1"},"arch_ptol2":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,294.32876096318,313.95067836072,348.83408706747,361.75386806997,392.4383479509,406.97310157871,418.60090448096,441.49314144476,470.92601754108,523.2511306012],"description":"Archytas/Ptolemy Hybrid 2"},"arch_sept":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,294.32876096318,310.07474405997,348.83408706747,361.75386806997,392.4383479509,406.97310157871,418.60090448096,441.49314144476,465.11211608996,523.2511306012],"description":"Archytas Septimal"},"ariel1":{"frequencies":[261.6255653006,282.55561052465,294.32876096318,313.95067836072,327.03195662575,348.83408706747,363.36884069528,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Ariel 1"},"ariel2":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,313.95067836072,327.03195662575,348.83408706747,363.36884069528,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Ariel 2"},"ariel3":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,310.07474405997,322.99452506247,348.83408706747,363.36884069528,392.4383479509,418.60090448096,436.04260883433,465.11211608996,484.4917875937,523.2511306012],"description":"Ariel's 12-tone JI scale"},"ariel_19":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,302.80736724606,313.95067836072,327.03195662575,334.88072358477,348.83408706747,363.36884069528,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,452.08897683944,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Ariel 19-tone scale"},"ariel_31":{"frequencies":[261.6255653006,267.90457886781,272.52663052146,279.06726965397,283.88190679319,294.32876096318,301.39265122629,306.59245933664,313.95067836072,319.36714514233,327.03195662575,334.88072358477,340.65828815182,348.83408706747,357.20610515709,363.36884069528,376.74081403286,383.2405741708,392.4383479509,401.85686830172,408.78994578219,418.60090448096,428.6473261885,436.04260883433,446.50763144636,454.2110508691,465.11211608996,482.22824196207,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"Ariel's 31-tone system"},"arist_archenh":{"frequencies":[261.6255653006,271.89678302796,279.86396690685,349.22823143301,391.99543598175,407.38487419079,419.32216217931,523.2511306012],"description":"PsAristo Arch. Enharmonic, 4 + 3 + 23 parts, similar to Archytas' enharmonic"},"arist_chrom":{"frequencies":[261.6255653006,277.18263097687,329.62755691287,349.22823143301,391.99543598175,415.30469757995,493.88330125613,523.2511306012],"description":"Dorian, Neo-Chromatic,6+18+6 parts = Athanasopoulos' Byzant.liturg. 2nd chromatic"},"arist_chrom2":{"frequencies":[261.6255653006,282.57123920205,336.03572815422,349.22823143301,391.99543598175,423.37848741825,503.48470957687,523.2511306012],"description":"Dorian Mode, a 1:2 Chromatic, 8 + 18 + 4 parts"},"arist_chrom3":{"frequencies":[261.6255653006,279.86388595857,299.37253740865,349.22869576324,391.99491478937,419.32387668214,448.55625766774,523.2511306012],"description":"PsAristo 3 Chromatic, 7 + 7 + 16 parts"},"arist_chrom4":{"frequencies":[261.6255653006,275.85166538713,290.85115308106,349.22823143301,391.99543598175,413.31050241775,435.7843409791,523.2511306012],"description":"PsAristo Chromatic, 5.5 + 5.5 + 19 parts"},"arist_chromenh":{"frequencies":[261.6255653006,269.29177952703,293.66476791741,349.22823143301,391.99543598175,403.48177901006,440,523.2511306012],"description":"Aristoxenos' Chromatic/Enharmonic, 3 + 9 + 18 parts"},"arist_chrominv":{"frequencies":[261.6255653006,311.12698372208,329.62755691287,349.22823143301,391.99543598175,466.16376151809,493.88330125613,523.2511306012],"description":"Aristoxenos' Inverted Chromatic, Dorian mode, 18 + 6 + 6 parts"},"arist_chromrej":{"frequencies":[261.6255653006,277.18263097687,285.30470202322,349.22823143301,391.99543598175,415.30469757995,427.47405410759,523.2511306012],"description":"Aristoxenos Rejected Chromatic, 6 + 3 + 21 parts"},"arist_chromunm":{"frequencies":[261.6255653006,273.20871865617,282.57118533961,349.22823143301,391.99543598175,409.35055662695,423.37840671577,523.2511306012],"description":"Unmelodic Chromatic, genus of Aristoxenos, Dorian Mode, 4.5 + 3.5 + 22 parts"},"arist_diat":{"frequencies":[261.6255653006,293.66476791741,311.12698372208,349.22823143301,391.99543598175,440,466.16376151809,523.2511306012],"description":"Phrygian octave species on E, 12 + 6 + 12 parts"},"arist_diat2":{"frequencies":[261.6255653006,279.86396690685,311.12698372208,349.22823143301,391.99543598175,419.32216217931,466.16376151809,523.2511306012],"description":"PsAristo 2 Diatonic, 7 + 11 + 12 parts"},"arist_diat3":{"frequencies":[261.6255653006,286.68133251996,314.13668154225,349.22823143301,391.99543598175,429.53666932309,470.6732130613,523.2511306012],"description":"PsAristo Diat 3, 9.5 + 9.5 + 11 parts"},"arist_diat4":{"frequencies":[261.6255653006,282.57123920205,305.19382000629,349.22823143301,391.99543598175,423.37848741825,457.27406033445,523.2511306012],"description":"PsAristo Diatonic, 8 + 8 + 14 parts"},"arist_diatdor":{"frequencies":[261.6255653006,299.37379946195,305.19382000629,349.22823143301,391.99543598175,448.5538823653,457.27406033445,523.2511306012],"description":"PsAristo Redup. Diatonic, 14 + 2 + 14 parts"},"arist_diatinv":{"frequencies":[261.6255653006,293.66476791741,329.62755691287,349.22823143301,391.99543598175,440,493.88330125613,523.2511306012],"description":"Lydian octave species on E, major mode, 12 + 12 + 6 parts"},"arist_diatred":{"frequencies":[261.6255653006,299.37379946195,342.56848033562,349.22823143301,391.99543598175,448.5538823653,513.27277840175,523.2511306012],"description":"Aristo Redup. Diatonic, Dorian Mode, 14 + 14 + 2 parts"},"arist_diatred2":{"frequencies":[261.6255653006,271.89678302796,308.14612137864,349.22823143301,391.99543598175,407.38487419079,461.69751437372,523.2511306012],"description":"PsAristo 2 Redup. Diatonic 2, 4 + 13 + 13 parts"},"arist_diatred3":{"frequencies":[261.6255653006,282.57123920205,314.13668154225,349.22823143301,391.99543598175,423.37848741825,470.6732130613,523.2511306012],"description":"PsAristo 3 Redup. Diatonic, 8 + 11 + 11 parts"},"arist_enh":{"frequencies":[261.6255653006,269.29177952703,277.18263097687,349.22823143301,391.99543598175,403.48177901006,415.30469757995,523.2511306012],"description":"Aristoxenos' Enharmonion, Dorian mode"},"arist_enh2":{"frequencies":[261.6255653006,270.59109411209,279.86402025325,349.22823143301,391.99543598175,405.42855124795,419.32224210861,523.2511306012],"description":"PsAristo 2 Enharmonic, 3.5 + 3.5 + 23 parts"},"arist_enh3":{"frequencies":[261.6255653006,267.99870394401,274.52693220706,349.22823143301,391.99543598175,401.54435471309,411.32564531909,523.2511306012],"description":"PsAristo Enharmonic, 2.5 + 2.5 + 25 parts"},"arist_hemchrom":{"frequencies":[261.6255653006,273.20871865617,285.30470202322,349.22823143301,391.99543598175,409.35055662695,427.47405410759,523.2511306012],"description":"Aristoxenos's Chromatic Hemiolion, Dorian Mode"},"arist_hemchrom2":{"frequencies":[261.6255653006,273.20871865617,293.66476791741,349.22823143301,391.99543598175,409.35055662695,440,523.2511306012],"description":"PsAristo C/H Chromatic, 4.5 + 7.5 + 18 parts"},"arist_hemchrom3":{"frequencies":[261.6255653006,271.81876914348,282.83844897362,348.83408706747,392.4383479509,407.72815371522,424.25767346043,523.2511306012],"description":"Dorian mode of Aristoxenos' Hemiolic Chromatic according to Ptolemy's interpret"},"arist_hypenh2":{"frequencies":[261.6255653006,267.3544191957,273.20871865617,349.22823143301,391.99543598175,400.57901831518,409.35055662695,523.2511306012],"description":"PsAristo 2nd Hyperenharmonic, 37.5 + 37.5 + 425 cents"},"arist_hypenh3":{"frequencies":[261.6255653006,265.43099677612,269.29177952703,349.22823143301,391.99543598175,397.69714089209,403.48177901006,523.2511306012],"description":"PsAristo 3 Hyperenharmonic, 1.5 + 1.5 + 27 parts"},"arist_hypenh4":{"frequencies":[261.6255653006,266.71168334607,271.8968348557,349.22823143301,391.99543598175,399.61600264311,407.38495184466,523.2511306012],"description":"PsAristo 4 Hyperenharmonic, 2 + 2 + 26 parts"},"arist_hypenh5":{"frequencies":[261.6255653006,265.12453591719,268.67030163715,349.22823143301,391.99543598175,397.23796841836,402.55061428954,523.2511306012],"description":"PsAristo Hyperenharmonic, 23 + 23 + 454 cents"},"arist_intdiat":{"frequencies":[261.6255653006,275.39533189537,307.79478270659,348.83408706747,392.4383479509,413.09299784305,461.69217405988,523.2511306012],"description":"Dorian mode of Aristoxenos's Intense Diatonic according to Ptolemy"},"arist_penh2":{"frequencies":[261.6255653006,269.29177952703,339.28638158975,349.22823143301,391.99543598175,403.48177901006,508.3551866238,523.2511306012],"description":"Permuted Aristoxenos's Enharmonion, 3 + 24 + 3 parts"},"arist_penh3":{"frequencies":[261.6255653006,329.62755691287,339.28638158975,349.22823143301,391.99543598175,493.88330125613,508.3551866238,523.2511306012],"description":"Permuted Aristoxenos's Enharmonion, 24 + 3 + 3 parts"},"arist_pschrom2":{"frequencies":[261.6255653006,278.52001838539,296.50560089735,349.22823143301,391.99543598175,417.30851459865,444.25644015807,523.2511306012],"description":"PsAristo 2 Chromatic, 6.5 + 6.5 + 17 parts"},"arist_softchrom":{"frequencies":[261.6255653006,271.89678302796,282.57123920205,349.22823143301,391.99543598175,407.38487419079,423.37848741825,523.2511306012],"description":"Aristoxenos's Chromatic Malakon, Dorian Mode"},"arist_softchrom2":{"frequencies":[261.6255653006,277.18263097687,324.90175210669,349.22823143301,391.99543598175,415.30469757995,486.80259447109,523.2511306012],"description":"Aristoxenos' Soft Chromatic, 6 + 16.5 + 9.5 parts"},"arist_softchrom3":{"frequencies":[261.6255653006,281.2143451833,329.62755691287,349.22823143301,391.99543598175,421.34544350737,493.88330125613,523.2511306012],"description":"Aristoxenos's Chromatic Malakon, 9.5 + 16.5 + 6 parts"},"arist_softchrom4":{"frequencies":[261.6255653006,277.18263097687,297.93622032612,349.22823143301,391.99543598175,415.30469757995,446.39994737251,523.2511306012],"description":"PsAristo S. Chromatic, 6 + 7.5 + 16.5 parts"},"arist_softchrom5":{"frequencies":[261.6255653006,270.64713651786,280.31310567921,348.83408706747,392.4383479509,405.97070477679,420.46965851882,523.2511306012],"description":"Dorian mode of Aristoxenos' Soft Chromatic according to Ptolemy's interpretati"},"arist_softdiat":{"frequencies":[261.6255653006,277.18263097687,302.26980244078,349.22823143301,391.99543598175,415.30469757995,452.89298412314,523.2511306012],"description":"Aristoxenos's Diatonon Malakon, Dorian Mode"},"arist_softdiat2":{"frequencies":[261.6255653006,277.18263097687,320.24370022528,349.22823143301,391.99543598175,415.30469757995,479.82340237272,523.2511306012],"description":"Dorian Mode, 6 + 15 + 9 parts"},"arist_softdiat3":{"frequencies":[261.6255653006,285.30470202322,329.62755691287,349.22823143301,391.99543598175,427.47405410759,466.16376151809,523.2511306012],"description":"Dorian Mode, 9 + 15 + 6 parts"},"arist_softdiat4":{"frequencies":[261.6255653006,285.30470202322,302.26980244078,349.22823143301,391.99543598175,427.47405410759,452.89298412314,523.2511306012],"description":"Dorian Mode, 9 + 6 + 15 parts"},"arist_softdiat5":{"frequencies":[261.6255653006,302.26980244078,320.24370022528,349.22823143301,391.99543598175,452.89298412314,479.82340237272,523.2511306012],"description":"Dorian Mode, 15 + 6 + 9 parts"},"arist_softdiat6":{"frequencies":[261.6255653006,302.26980244078,329.62755691287,349.22823143301,391.99543598175,452.89298412314,493.88330125613,523.2511306012],"description":"Dorian Mode, 15 + 9 + 6 parts"},"arist_softdiat7":{"frequencies":[261.6255653006,275.39533189537,299.00064605783,348.83408706747,392.4383479509,413.09299784305,448.50096908674,523.2511306012],"description":"Dorian mode of Aristoxenos's Soft Diatonic according to Ptolemy"},"arist_synchrom":{"frequencies":[261.6255653006,277.18263097687,293.66476791741,349.22823143301,391.99543598175,415.30469757995,440,523.2511306012],"description":"Aristoxenos's Chromatic Syntonon, Dorian Mode"},"arist_syndiat":{"frequencies":[261.6255653006,277.18263097687,311.12698372208,349.22823143301,391.99543598175,415.30469757995,466.16376151809,523.2511306012],"description":"Aristoxenos's Diatonon Syntonon, Dorian Mode"},"arist_unchrom":{"frequencies":[261.6255653006,271.89678302796,293.66476791741,349.22823143301,391.99543598175,407.38487419079,440,523.2511306012],"description":"Aristoxenos's Unnamed Chromatic, Dorian Mode, 4 + 8 + 18 parts"},"arist_unchrom2":{"frequencies":[261.6255653006,282.57123920205,293.66476791741,349.22823143301,391.99543598175,423.37848741825,440,523.2511306012],"description":"Dorian Mode, a 1:2 Chromatic, 8 + 4 + 18 parts"},"arist_unchrom3":{"frequencies":[261.6255653006,311.12698372208,323.3415889232,349.22823143301,391.99543598175,466.16376151809,484.46499093218,523.2511306012],"description":"Dorian Mode, a 1:2 Chromatic, 18 + 4 + 8 parts"},"arist_unchrom4":{"frequencies":[261.6255653006,311.12698372208,336.03572815422,349.22823143301,391.99543598175,466.16376151809,503.48470957687,523.2511306012],"description":"Dorian Mode, a 1:2 Chromatic, 18 + 8 + 4 parts"},"arith13":{"frequencies":[261.6255653006,269.80136421624,294.32876096318,318.85615771011,327.03195662575,343.38355445704,367.91095120397,371.99885066179,392.4383479509,449.66894036041,457.84473927605,490.54793493862,523.2511306012],"description":"The first 13 terms of the arithmetic series, octave reduced"},"arith22":{"frequencies":[261.6255653006,269.80136421624,277.97716313189,294.32876096318,312.72430852337,318.85615771011,327.03195662575,343.38355445704,349.51540364377,367.91095120397,371.99885066179,388.35044849308,392.4383479509,429.2294430713,449.66894036041,457.84473927605,472.15238737843,490.54793493862,517.11928141447,523.2511306012],"description":"The first 22 terms of the arithmetic series, octave reduced"},"arnautoff_21":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,294.32876096318,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,361.75386806997,367.91095120397,372.08969287196,378.42269266694,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,465.11211608996,490.54793493862,504.56359022259,523.2511306012],"description":"Philip Arnautoff, transposed Archytas enharmonic (2005), 1/1 vol 12/1"},"aron-neidhardt":{"frequencies":[261.6255653006,275.62199471997,292.53519855339,310.07474405997,327.04005607367,348.83408706747,367.49599295996,391.42133845759,413.43299207996,437.43855491017,465.11211608996,489.99465727995,523.2511306012],"description":"Aron-Neidhardt equal beating well temperament"},"art_nam":{"frequencies":[261.6255653006,287.78812183066,317.68818643644,324.77656382143,348.83408706747,353.19451315581,392.4383479509,431.68218274599,473.41768959156,523.2511306012],"description":"Artificial Nam System"},"artusi":{"frequencies":[261.6255653006,276.63528606528,292.50629850443,309.28767786778,327.03195662575,349.91920725962,369.99442271164,391.22137338448,413.66637442451,437.39882871549,462.49310482954,489.02679755603,523.2511306012],"description":"Lute tuning of Giovanni Maria Artusi (1603). 1/4-comma w. acc. 1/2-way naturals"},"astro":{"frequencies":[13.75,13.8316453704,13.91377553836,13.99639338254,14.07098381034,14.15453513289,14.23858257025,14.32312915102,14.40817767355,14.49373120103,14.57979273211,14.66636528323,14.75345188876,14.84105560105,14.92917949063,15.01782664621,15.10700017487,15.1875093157,15.27769039377,15.36840704189,15.45966226264,15.55145934276,15.64380149972,15.73669197012,15.83013400973,15.92413089371,16.01868591662,16.11380239262,16.20948365552,16.30573305894,16.39263055969,16.48996755631,16.58788242969,16.68637870643,16.78545983879,16.88512929958,16.98539058219,17.08624720077,17.18770269033,17.28976060687,17.39242452751,17.49569805061,17.59958489756,17.69337767194,17.7984382082,17.90412257766,18.01043448453,18.11737765504,18.22495583753,18.33317280261,18.44203234327,18.55153827502,18.66169443603,18.77250468726,18.88397302169,18.99610312873,19.09733831271,19.21073534981,19.32480572095,19.43955342429,19.55498248173,19.67109693902,19.78790086598,19.90539835657,20.02359352906,20.14249064253,20.26209363229,20.38240680608,20.50343438087,20.62518059864,20.73509756099,20.85821935885,20.98207223488,21.1066605301,21.23198861133,21.35806087129,21.4848817288,21.61245575376,21.74078716869,21.86988059568,21.99974055944,22.13037161156,22.26177833063,22.38041714879,22.51330859954,22.64698913914,22.78146345308,22.91673625467,23.0528122852,23.18969644807,23.32739327396,23.46590772227,23.60524464792,23.74540893465,23.88640549521,24.02823927151,24.15629202037,24.29972834105,24.44401636439,24.58916114767,24.73516777819,24.8820415172,25.02978722599,25.17841022592,25.32791572621,25.478308967,25.62959521956,25.78177978645,25.93486800174,26.07308167197,26.22789959273,26.38363679833,26.54029874734,26.69789108494,26.85641902723,27.01588828389,27.17630444429,27.33767313101,27.5],"description":"Astro temperament, g=132.194511, 5-limit"},"athan_chrom":{"frequencies":[261.6255653006,285.30470202322,329.62755691287,349.22823143301,391.99543598175,427.47405410759,493.88330125613,523.2511306012],"description":"Athanasopoulos's Byzantine Liturgical mode Chromatic"},"auftetf":{"frequencies":[261.6255653006,264.29521392612,269.80136421624,287.78812183066,359.73515228832,380.54627680087,384.42940207435,392.4383479509,418.60090448096],"description":"5/4 C.I. again"},"augmented":{"frequencies":[261.6255653006,312.71213182188,329.62755691287,393.99259743989,415.30469757995,496.39956701727,523.2511306012],"description":"Augmented temperament, g=91.2, oct=1/3, 5-limit"},"augteta":{"frequencies":[261.6255653006,280.76889934699,302.93486508491,328.90071066361,359.73515228832,380.54627680087,408.39112632289,440.63253103259,478.40103369253],"description":"Linear Division of the 11/8, duplicated on the 16/11"},"augteta2":{"frequencies":[261.6255653006,281.75060878526,305.22982618403,332.97799220076,366.27579142084,373.75080757229,402.50086969323,436.04260883433,475.68284600109],"description":"Linear Division of the 7/5, duplicated on the 10/7"},"augtetb":{"frequencies":[261.6255653006,270.8594087818,280.76889934699,302.93486508491,359.73515228832,380.54627680087,295.48299139832,408.39112632289,440.63253103259],"description":"Harmonic mean division of 11/8"},"augtetc":{"frequencies":[261.6255653006,280.31310567921,301.87565226992,327.03195662575,359.73515228832,380.54627680087,407.72815371522,439.09185784716,475.68284600109],"description":"11/10 C.I."},"augtetd":{"frequencies":[261.6255653006,271.68808704293,282.55561052465,294.32876096318,359.73515228832,380.54627680087,395.18267206244,410.98997894494,428.11456140098],"description":"11/9 C.I."},"augtete":{"frequencies":[261.6255653006,269.80136421624,278.50463402967,287.78812183066,359.73515228832,380.54627680087,392.4383479509,405.0976494977,418.60090448096],"description":"5/4 C.I."},"augtetg":{"frequencies":[261.6255653006,278.50463402967,297.71185016965,319.76457981184,359.73515228832,380.54627680087,405.0976494977,433.03541842858,465.11211608996],"description":"9/8 C.I."},"augteth":{"frequencies":[261.6255653006,278.50463402967,287.78812183066,319.76457981184,359.73515228832,380.54627680087,405.0976494977,418.60090448096,465.11211608996],"description":"9/8 C.I. A gapped version of this scale is called AugTetI"},"augtetj":{"frequencies":[261.6255653006,287.78812183066,319.76457981184,359.73515228832,380.54627680087,428.11456140098,475.68284600109],"description":"9/8 C.I. comprised of 11:10:9:8 subharmonic series on 1 and 8:9:10:11 on 16/11"},"augtetk":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,380.54627680087,418.60090448096,465.11211608996],"description":"9/8 C.I. This is the converse form of AugTetJ"},"augtetl":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,380.54627680087,428.11456140098,475.68284600109],"description":"9/8 C.I. This is the harmonic form of AugTetI"},"avg_bac":{"frequencies":[261.6255653006,290.69507255622,307.79478270659,348.83408706747,392.4383479509,436.04260883433,461.69217405988,523.2511306012],"description":"Average Bac System"},"avicenna":{"frequencies":[261.6255653006,290.69507255622,299.00064605783,348.83408706747,392.4383479509,436.04260883433,448.50096908674,523.2511306012],"description":"Soft diatonic of Avicenna (Ibn Sina)"},"avicenna_17":{"frequencies":[261.6255653006,278.99913799634,283.42769574232,294.32876096318,310.07474405997,318.85615771011,331.11985608357,348.83408706747,371.99885066179,377.90359432309,392.4383479509,413.43299207996,425.14154361347,441.49314144476,465.11211608996,495.99846754905,503.87145909745,523.2511306012],"description":"Tuning by Avicenna (Ibn Sina), Ahmed Mahmud Hifni, Cairo, 1977"},"avicenna_19":{"frequencies":[261.6255653006,275.62199471997,283.49690885483,294.32876096318,310.07474405997,326.6631048533,331.11985608357,348.83408706747,358.80077526939,372.50983809402,377.99587847311,392.4383479509,413.43299207996,425.24536328225,441.49314144476,465.11211608996,478.40103369253,496.67978412536,503.45611792634,523.2511306012],"description":"Arabic scale by Ibn Sina"},"avicenna_chrom":{"frequencies":[261.6255653006,269.10058145205,299.00064605783,348.83408706747,392.4383479509,403.65087217807,448.50096908674,523.2511306012],"description":"Dorian mode a chromatic genus of Avicenna"},"avicenna_chrom2":{"frequencies":[261.6255653006,271.8968348557,323.34165055711,349.22823143301,391.99543598175,407.38495184466,484.46508327871,523.2511306012],"description":"Dorian Mode, a 1:2 Chromatic, 4 + 18 + 8 parts"},"avicenna_chrom3":{"frequencies":[261.6255653006,290.69507255622,339.14425131559,348.83408706747,392.4383479509,436.04260883433,508.71637697339,523.2511306012],"description":"Avicenna's Chromatic permuted"},"avicenna_diat":{"frequencies":[261.6255653006,281.75060878526,305.22982618403,348.83408706747,392.4383479509,422.62591317789,457.84473927605,523.2511306012],"description":"Dorian mode a soft diatonic genus of Avicenna"},"avicenna_diff":{"frequencies":[261.6255653006,269.80136421624,286.15296204753,294.32876096318,310.68035879446,343.38355445704,367.91095120397,392.4383479509,400.61414686654,441.49314144476,457.84473927605,515.07533168556,523.2511306012],"description":"Difference tones of Avicenna's Soft diatonic reduced by 2/1"},"avicenna_enh":{"frequencies":[261.6255653006,268.33391312882,279.06726965397,348.83408706747,392.4383479509,402.50086969323,418.60090448096,523.2511306012],"description":"Dorian mode of Avicenna's (Ibn Sina) Enharmonic genus"},"awad":{"frequencies":[261.6255653006,268.33391312882,275.39533189537,282.83844897362,290.69507255622,299.00064605783,307.79478270659,317.12189733406,327.03195662575,337.58137458142,348.83408706747,358.80077526939,369.35373924791,380.54627680087,392.4383479509,402.50086969323,413.09299784305,424.25767346043,436.04260883433,448.50096908674,461.69217405988,475.68284600109,490.54793493862,506.37206187213,523.2511306012],"description":"d'Erlanger vol.5, p.37, after Mans.ur 'Awad"},"awraamoff":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,313.95067836072,327.03195662575,343.38355445704,348.83408706747,392.4383479509,418.60090448096,448.50096908674,457.84473927605,490.54793493862,523.2511306012],"description":"Awraamoff Septimal Just"},"ayers":{"frequencies":[261.6255653006,268.89294211451,276.57559760349,284.71017400359,293.33775503401,302.50455987882,312.26277148781,322.67153053741,333.7981350387,345.71949700436,358.52392281934,372.31330446624,387.20583664489,403.33941317176,420.87590939662,440.00663255101,460.95932933915,484.00729580611,509.48136400643,537.78588422901,569.42034800719,605.00911975764,645.34306107481,691.43899400873,744.62660893248,806.67882634352,880.01326510202,968.01459161222,1075.57176845802,1210.01823951527,1382.87798801746,1613.35765268703,1936.02918322444,2420.03647903055,3226.71530537407,4840.0729580611,9680.1459161222],"description":"Lydia Ayers, algorithmic composition, subharmonics 1-37"},"ayers_19":{"frequencies":[261.6255653006,268.89294211451,276.57559760349,284.71017400359,293.33775503401,302.50455987882,312.26277148781,322.67153053741,333.7981350387,345.71949700436,358.52392281934,372.31330446624,387.20583664489,403.33941317176,420.87590939662,440.00663255101,460.95932933915,484.00729580611,509.48136400643,523.2511306012],"description":"Scale for NINETEEN, for 19 for the 90's CD. Repeats at 37/19 (or 2/1)"},"ayers_ap":{"frequencies":[261.6255653006,299.00064605783,336.37572681506,388.70083987518,448.50096908674,523.2511306012],"description":"Lydia Ayers' Appetizer, ICMC 96, Balinese Slendro from Singaraja,"},"ayers_me":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,308.34441624714,336.37572681506,392.4383479509,420.46965851882,448.50096908674,504.56359022259,523.2511306012],"description":"Scale for Merapi (1996), Lydia Ayers. Slendro 0 2 4 5 7 9, Pelog 0 1 3 6 8 9"},"h10_27":{"frequencies":[261.6255653006,281.00523680435,300.3849083081,319.76457981184,348.83408706747,368.21375857121,397.28326582684,426.35277308246,455.42228033808,484.4917875937,523.2511306012],"description":"10-tET harmonic approximation, fundamental=27"},"h12_24":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,316.13089140489,327.03195662575,348.83408706747,370.63621750918,392.4383479509,414.24047839262,436.04260883433,468.74580449691,490.54793493862,523.2511306012],"description":"12-tET harmonic approximation, fundamental=24"},"h14_27":{"frequencies":[261.6255653006,271.31540105247,290.69507255622,300.3849083081,319.76457981184,339.14425131559,348.83408706747,368.21375857121,387.59343007496,406.97310157871,426.35277308246,455.42228033808,474.80195184183,494.18162334558,523.2511306012],"description":"14-tET harmonic approximation, fundamental=27"},"h15_24":{"frequencies":[261.6255653006,272.52663052146,283.42769574232,305.22982618403,316.13089140489,327.03195662575,348.83408706747,359.73515228832,381.53728273004,392.4383479509,414.24047839262,436.04260883433,457.84473927605,479.64686971777,501.44900015948,523.2511306012],"description":"15-tET harmonic approximation, fundamental=24"},"hahn9":{"frequencies":[261.6255653006,286.15296204753,313.95067836072,327.03195662575,366.27579142084,392.4383479509,418.60090448096,457.84473927605,490.54793493862,523.2511306012],"description":"Paul Hahn's just version of 9 out of 31 scale. TL 6-8-'98"},"hahn_7":{"frequencies":[261.6255653006,274.70684356563,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,488.36772189445,523.2511306012],"description":"Paul Hahn's scale with 32 consonant 7-limit dyads. TL '99, see also smithgw_hahn12"},"hahn_g":{"frequencies":[261.6255653006,280.50183143454,294.66523452594,309.54379154736,331.87735433448,348.63486612079,373.78884718875,392.66259958718,420.99317852788,442.25042328711,464.58101193362,498.10049926644,523.2511306012],"description":"fourth of sqrt(2)-1 octave \"recursive\" meantone, Paul Hahn"},"hahnmaxr":{"frequencies":[261.6255653006,275.93321340298,306.59245933664,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,436.04260883433,459.88868900496,490.54793493862,523.2511306012],"description":"Paul Hahn's hahn_7 marvel projected to the 5-limit"},"halfefg357777":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,320.35783506196,341.71502406609,375.57576268738,400.61414686654,429.2294430713,457.84473927605,490.54793493862,523.2511306012],"description":"Half genus [357777]"},"hamilton":{"frequencies":[261.6255653006,274.08392555301,287.78812183066,302.93486508491,319.76457981184,338.57426097725,359.73515228832,383.71749577421,411.12588832951,426.35277308246,442.75095666255,479.64686971777,523.2511306012],"description":"Elsie Hamilton's gamut, from article The Modes of Ancient Greek Music (1953)"},"hamilton_jc":{"frequencies":[261.6255653006,274.08392555301,287.78812183066,302.93486508491,319.76457981184,359.73515228832,338.57426097725,411.12588832951,383.71749577421,442.75095666255,426.35277308246,479.64686971777,523.2511306012],"description":"Chalmers' permutation of Hamilton's gamut. Diatonic notes on white"},"hamilton_jc2":{"frequencies":[261.6255653006,274.08392555301,287.78812183066,302.93486508491,319.76457981184,359.73515228832,383.71749577421,411.12588832951,426.35277308246,442.75095666255,460.46099492906,479.64686971777,523.2511306012],"description":"EH gamut, diatonic notes on white and drops 17 for 25. JC Dorian Harmonia on C"},"hammond":{"frequencies":[261.6255653006,226.52945288223,240.12209418,254.35818848669,269.43528366778,285.40970760065,302.50455987882,320.49131749323,339.40613876835,359.73515228832,381.06332337261,403.65087217807,427.65717404906,453.05890576445],"description":"Hammond organ pitch wheel ratios, 1/1=320 Hz. Do \"del 0\" to get 12-tone scale"},"hammond12":{"frequencies":[261.6255653006,277.32410877127,293.76579515365,311.17877832054,329.62811300357,349.37146352202,370.1449018936,391.99018843668,415.46876743159,440.10130305006,466.18833124791,493.91391932426,523.2511306012],"description":"Hammond organ scale, 1/1=277.0731707 Hz, A=440, see hammond for the ratios"},"handblue":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,305.22982618403,327.03195662575,348.83408706747,366.27579142084,392.4383479509,406.97310157871,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"\"Handy Blues\" of Pitch Palette, 7-limit"},"handel":{"frequencies":[261.6255653006,276.07055536165,292.89641271707,310.57937447136,328.79480940231,349.02322090701,368.4933346061,391.37619916626,414.10583283548,438.86859125239,465.61660972366,492.3908742288,523.2511306012],"description":"Well temperament according to Georg Friedrich H�ndel's rules (c. 1780)"},"hanson_19":{"frequencies":[261.6255653006,272.52663052146,282.55561052465,294.32876096318,302.80736724606,313.95067836072,327.03195662575,340.65828815182,348.83408706747,363.36884069528,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,454.2110508691,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"JI version of Hanson's 19 out of 53-tET scale"},"harm-doreninv1":{"frequencies":[261.6255653006,321.08592105074,327.03195662575,332.97799220076,380.54627680087,499.46698830115,511.35905945117,523.2511306012],"description":"1st Inverted Schlesinger's Enharmonic Dorian Harmonia"},"harm-dorinv1":{"frequencies":[261.6255653006,309.19384990071,321.08592105074,332.97799220076,380.54627680087,475.68284600109,499.46698830115,523.2511306012],"description":"1st Inverted Schlesinger's Chromatic Dorian Harmonia"},"harm-lydchrinv1":{"frequencies":[261.6255653006,322.00069575458,342.12573923925,362.25078272391,402.50086969323,483.00104363188,503.12608711654,523.2511306012],"description":"1st Inverted Schlesinger's Chromatic Lydian Harmonia"},"harm-lydeninv1":{"frequencies":[261.6255653006,342.12573923925,352.18826098158,362.25078272391,402.50086969323,503.12608711654,513.18860885887,523.2511306012],"description":"1st Inverted Schlesinger's Enharmonic Lydian Harmonia"},"harm-mixochrinv1":{"frequencies":[261.6255653006,336.37572681506,355.06326719367,373.75080757229,411.12588832951,485.87604984397,504.56359022259,523.2511306012],"description":"1st Inverted Schlesinger's Chromatic Mixolydian Harmonia"},"harm-mixoeninv1":{"frequencies":[261.6255653006,355.06326719367,364.40703738298,373.75080757229,411.12588832951,504.56359022259,513.90736041189,523.2511306012],"description":"1st Inverted Schlesinger's Enharmonic Mixolydian Harmonia"},"harm10":{"frequencies":[261.6255653006,286.15296204753,294.32876096318,327.03195662575,331.11985608357,343.38355445704,367.91095120397,392.4383479509,400.61414686654,408.78994578219,441.49314144476,457.84473927605,515.07533168556,523.2511306012],"description":"6/7/8/9/10 harmonics"},"harm11s":{"frequencies":[261.6255653006,65.40639132515,95.13656920022,104.65022612024,116.27802902249,130.8127826503,149.50032302891,174.41704353373,196.21917397545,209.30045224048,261.6255653006,327.03195662575,348.83408706747,392.4383479509,457.84473927605,523.2511306012,588.65752192635,654.0639132515,719.47030457665,1046.5022612024],"description":"Harm. 1/4-11/4 and subh. 4/1-4/11. Joseph Pehrson 1999"},"harm12s":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,327.03195662575,348.83408706747,359.73515228832,380.54627680087,392.4383479509,418.60090448096,457.84473927605,465.11211608996,523.2511306012],"description":"Harmonics 1 to 12 and subharmonics mixed"},"harm15-30":{"frequencies":[261.6255653006,279.06726965397,296.50897400735,313.95067836072,331.39238271409,348.83408706747,366.27579142084,383.71749577421,418.60090448096,436.04260883433,453.48431318771,488.36772189445,523.2511306012],"description":"Harmonics 15 to 30"},"harm15":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,408.78994578219,425.14154361347,441.49314144476,457.84473927605,474.19633710734,490.54793493862,506.89953276991],"description":"Fifth octave of the harmonic overtone series"},"harm16-32":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,408.78994578219,425.14154361347,441.49314144476,457.84473927605,474.19633710734,490.54793493862,506.89953276991,523.2511306012],"description":"Harmonics 16-32 & Tom Stone's Guitar Scale"},"harm16":{"frequencies":[261.6255653006,523.2511306012,784.8766959018,1046.5022612024,1308.127826503,1569.7533918036,1831.3789571042,2093.0045224048,2354.6300877054,2616.255653006,2877.8812183066,3139.5067836072,3401.1323489078,3662.7579142084,3924.383479509,4186.0090448096,2093.0045224048,1395.33634826987,1046.5022612024,837.20180896192,697.66817413493,598.00129211566,523.2511306012,465.11211608996,418.60090448096,380.54627680087,348.83408706747,322.00069575458,299.00064605783,279.06726965397,261.6255653006],"description":"First 16 harmonics and subharmonics"},"harm1c-dorian":{"frequencies":[261.6255653006,309.19384990071,321.08592105074,332.97799220076,380.54627680087,475.68284600109,499.46698830115,523.2511306012],"description":"Harm1C-Dorian"},"harm1c-hypod":{"frequencies":[261.6255653006,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,457.84473927605,490.54793493862,523.2511306012],"description":"HarmC-Hypodorian"},"harm1c-hypol":{"frequencies":[261.6255653006,274.70684356563,287.78812183066,340.11323489078,366.27579142084,392.4383479509,418.60090448096,444.76346101102,523.2511306012],"description":"HarmC-Hypolydian"},"harm1c-lydian":{"frequencies":[261.6255653006,271.68808704293,281.75060878526,362.25078272391,382.37582620857,402.50086969323,422.62591317789,442.75095666255,523.2511306012],"description":"Harm1C-Lydian"},"harm1c-mix":{"frequencies":[261.6255653006,299.00064605783,373.75080757229,392.4383479509,411.12588832951,485.87604984397,504.56359022259,523.2511306012],"description":"Harm1C-Con Mixolydian"},"harm1c-mixolydian":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,373.75080757229,411.12588832951,429.81342870813,448.50096908674,523.2511306012],"description":"Harm1C-Mixolydian"},"harm24":{"frequencies":[261.6255653006,283.42769574232,305.22982618403,327.03195662575,348.83408706747,370.63621750918,392.4383479509,414.24047839262,436.04260883433,457.84473927605,479.64686971777,501.44900015948,523.2511306012],"description":"Harmonics 12 to 24"},"harm24_2":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,425.14154361347,457.84473927605,490.54793493862,523.2511306012],"description":"Harmonics 12 to 24, mode 9"},"harm3":{"frequencies":[261.6255653006,327.03195662575,392.4383479509,457.84473927605],"description":"Third octave of the harmonic overtone series"},"harm30-60":{"frequencies":[261.6255653006,270.34641747729,279.06726965397,287.78812183066,296.50897400735,305.22982618403,313.95067836072,322.67153053741,331.39238271409,340.11323489078,348.83408706747,357.55493924415,366.27579142084,374.99664359753,383.71749577421,392.4383479509,401.15920012759,409.88005230427,418.60090448096,427.32175665765,436.04260883433,444.76346101102,453.48431318771,462.20516536439,470.92601754108,479.64686971777,488.36772189445,497.08857407114,505.80942624783,514.53027842451,523.2511306012],"description":"Harmonics 30-60"},"harm30":{"frequencies":[261.6255653006,279.06726965397,288.69027895239,299.00064605783,310.07474405997,322.00069575458,334.88072358477,348.83408706747,364.00078650518,398.6675280771,418.60090448096,440.63253103259,465.11211608996,492.47165233054,523.2511306012,558.13453930795,598.00129211566,644.00139150917,697.66817413493,761.09255360175,837.20180896192,930.22423217991,1046.5022612024,1196.00258423131,1395.33634826987,1674.40361792384,2093.0045224048,2790.67269653973,4186.0090448096,8372.0180896192,8633.6436549198,8895.2692202204,9156.894785521,9418.5203508216,9680.1459161222,9941.7714814228,10203.3970467234,10465.022612024,10726.6481773246,10988.2737426252,11249.8993079258,11511.5248732264,11773.150438527,12034.7760038276,12296.4015691282,12558.0271344288,12819.6526997294,13081.27826503,13342.9038303306,13604.5293956312,13866.1549609318,14127.7805262324,14389.406091533,14651.0316568336,14912.6572221342,15174.2827874348,15435.9083527354,15697.533918036,15959.1594833366,16220.7850486372],"description":"First 30 harmonics and subharmonics"},"harm32-64":{"frequencies":[261.6255653006,269.80136421624,277.97716313189,286.15296204753,294.32876096318,302.50455987882,310.68035879446,318.85615771011,327.03195662575,335.20775554139,343.38355445704,351.55935337268,359.73515228832,367.91095120397,376.08675011961,384.26254903526,392.4383479509,400.61414686654,408.78994578219,416.96574469783,425.14154361347,433.31734252912,441.49314144476,449.66894036041,457.84473927605,466.02053819169,474.19633710734,482.37213602298,490.54793493862,498.72373385427,506.89953276991,515.07533168556,523.2511306012],"description":"Harmonics 32-64"},"harm37odd":{"frequencies":[261.6255653006,269.80136421624,277.97716313189,286.15296204753,294.32876096318,302.50455987882,310.68035879446,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,408.78994578219,425.14154361347,441.49314144476,457.84473927605,474.19633710734,490.54793493862,506.89953276991,523.2511306012],"description":"Odd harmonics until 37"},"harm4":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,392.4383479509,425.14154361347,457.84473927605,490.54793493862],"description":"Fourth octave of the harmonic overtone series"},"harm6-12":{"frequencies":[261.6255653006,269.80136421624,286.15296204753,294.32876096318,314.76825825228,327.03195662575,331.11985608357,343.38355445704,359.73515228832,367.91095120397,392.4383479509,400.61414686654,404.70204632437,408.78994578219,441.49314144476,449.66894036041,457.84473927605,490.54793493862,494.63583439645,515.07533168556,523.2511306012],"description":"First 12 harmonics of 6th through 12th harmonics"},"harm6":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,392.4383479509,457.84473927605,523.2511306012],"description":"Harmonics 6-12"},"harm60-30":{"frequencies":[261.6255653006,280.31310567921,290.69507255622,313.95067836072,327.03195662575,348.83408706747,373.75080757229,392.4383479509,413.09299784305,436.04260883433,448.50096908674,490.54793493862,523.2511306012],"description":"Harmonics 60 to 30 (Perkis)"},"harm7lim":{"frequencies":[261.6255653006,523.2511306012,784.8766959018,1046.5022612024,1308.127826503,1569.7533918036,1831.3789571042,2093.0045224048,2354.6300877054,2616.255653006,3139.5067836072,3662.7579142084,3924.383479509,4186.0090448096,4709.2601754108,5232.511306012,5494.1368713126,5755.7624366132,6279.0135672144,6540.639132515,7325.5158284168,7848.766959018,8372.0180896192,9156.894785521,9418.5203508216,10465.022612024,10988.2737426252,11773.150438527,12558.0271344288,12819.6526997294,13081.27826503,14651.0316568336,15697.533918036,16482.4106139378,16744.0361792384,18313.789571042,18837.0407016432,19621.917397545,20930.045224048,21191.6707893486,21976.5474852504,23546.300877054,25116.0542688576,25639.3053994588,26162.55653006,27470.684356563,29302.0633136672,31395.067836072],"description":"7-limit harmonics"},"harm8":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,392.4383479509,425.14154361347,457.84473927605,490.54793493862,523.2511306012],"description":"Harmonics 8-16"},"harm9":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,327.03195662575,348.83408706747,356.10146388137,392.4383479509,406.97310157871,457.84473927605,465.11211608996,523.2511306012],"description":"6/7/8/9 harmonics, First 9 overtones of 5th through 9th harmonics"},"harm_bastard":{"frequencies":[261.6255653006,299.00064605783,322.00069575458,348.83408706747,380.54627680087,418.60090448096,465.11211608996,523.2511306012],"description":"Schlesinger's \"Bastard\" Hypodorian Harmonia & inverse 1)7 from 1.3.5.7.9.11.13"},"harm_bastinv":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,392.4383479509,425.14154361347,457.84473927605,523.2511306012],"description":"Inverse Schlesinger's \"Bastard\" Hypodorian Harmonia & 1)7 from 1.3.5.7.9.11.13"},"harm_darreg":{"frequencies":[261.6255653006,1046.5022612024,1308.127826503,1569.7533918036,1831.3789571042,2093.0045224048,2354.6300877054,2616.255653006,2877.8812183066,3139.5067836072,3401.1323489078,3662.7579142084,3924.383479509,4186.0090448096,5232.511306012,6279.0135672144,7325.5158284168,8372.0180896192,9418.5203508216,10465.022612024,11511.5248732264,12558.0271344288,13604.5293956312,14651.0316568336,15697.533918036],"description":"Darreg Harmonics 4-15"},"harm_mean":{"frequencies":[261.6255653006,270.06509966514,279.06726965397,299.00064605783,348.83408706747,392.4383479509,405.0976494977,418.60090448096,448.50096908674,523.2511306012],"description":"Harm. Mean 9-tonic 8/7 is HM of 1/1 and 4/3, etc."},"harmc-hypop":{"frequencies":[261.6255653006,319.76457981184,334.29933343966,348.83408706747,363.36884069528,377.90359432309,406.97310157871,465.11211608996,494.18162334558,523.2511306012],"description":"HarmC-Hypophrygian"},"harmd-15":{"frequencies":[261.6255653006,279.06726965397,313.95067836072,348.83408706747,383.71749577421,418.60090448096,453.48431318771,523.2511306012],"description":"HarmD-15-Harmonia"},"harmd-conmix":{"frequencies":[261.6255653006,299.00064605783,336.37572681506,392.4383479509,411.12588832951,448.50096908674,485.87604984397,523.2511306012],"description":"HarmD-ConMixolydian"},"harmd-hypod":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,376.08675011961,392.4383479509,425.14154361347,457.84473927605,490.54793493862,523.2511306012],"description":"HarmD-Hypodorian"},"harmd-hypol":{"frequencies":[261.6255653006,287.78812183066,313.95067836072,340.11323489078,366.27579142084,392.4383479509,418.60090448096,470.92601754108,523.2511306012],"description":"HarmD-Hypolydian"},"harmd-hypop":{"frequencies":[261.6255653006,290.69507255622,319.76457981184,348.83408706747,363.36884069528,377.90359432309,406.97310157871,436.04260883433,465.11211608996,523.2511306012],"description":"HarmD-Hypophrygian"},"harmd-lyd":{"frequencies":[261.6255653006,281.75060878526,301.87565226992,322.00069575458,362.25078272391,382.37582620857,402.50086969323,442.75095666255,483.00104363188,523.2511306012],"description":"HarmD-Lydian"},"harmd-mix":{"frequencies":[261.6255653006,299.00064605783,336.37572681506,373.75080757229,411.12588832951,448.50096908674,485.87604984397,523.2511306012],"description":"HarmD-Mixolydian. Harmonics 7-14"},"harmd-phr":{"frequencies":[261.6255653006,272.52663052146,283.42769574232,294.32876096318,305.22982618403,348.83408706747,327.03195662575,392.4383479509,414.24047839262,436.04260883433,457.84473927605,479.64686971777,523.2511306012],"description":"HarmD-Phryg (with 5 extra tones)"},"harme-hypod":{"frequencies":[261.6255653006,343.38355445704,351.55935337268,359.73515228832,376.08675011961,392.4383479509,490.54793493862,506.89953276991,523.2511306012],"description":"HarmE-Hypodorian"},"harme-hypol":{"frequencies":[261.6255653006,281.24748269815,274.70684356563,340.11323489078,366.27579142084,392.4383479509,405.51962621593,418.60090448096,523.2511306012],"description":"HarmE-Hypolydian"},"harme-hypop":{"frequencies":[261.6255653006,334.29933343966,341.56671025356,348.83408706747,363.36884069528,377.90359432309,406.97310157871,494.18162334558,508.71637697339,523.2511306012],"description":"HarmE-Hypophrygian"},"harmjc-15":{"frequencies":[261.6255653006,280.31310567921,301.87565226992,313.95067836072,327.03195662575,356.76213450082,373.75080757229,392.4383479509,413.09299784305,436.04260883433,461.69217405988,490.54793493862,523.2511306012],"description":"Rationalized JC Sub-15 Harmonia on C. MD=15, No planetary assignment."},"harmjc-17-2":{"frequencies":[261.6255653006,277.97716313189,296.50897400735,317.68818643644,342.12573923925,370.63621750918,386.75083566176,404.33041910093,423.58424858192,444.76346101102,468.17206422213,494.18162334558,523.2511306012],"description":"Rationalized JC Sub-17 Harmonia on C. MD=17, No planetary assignment."},"harmjc-17":{"frequencies":[261.6255653006,269.55361273395,277.97716313189,296.50897400735,317.68818643644,342.12573923925,355.81076880882,370.63621750918,386.75083566176,404.33041910093,423.58424858192,444.76346101102,523.2511306012],"description":"Rationalized JC Sub-17 Harmonia on C. MD=17, No planetary assignment."},"harmjc-19-2":{"frequencies":[261.6255653006,276.16031892841,292.40504357126,310.68035879446,331.39238271409,355.06326719367,368.21375857121,382.37582620857,397.67085925691,414.24047839262,432.2509339749,451.89870370104,523.2511306012],"description":"Rationalized JC Sub-19 Harmonia on C. MD=19, No planetary assignment."},"harmjc-19":{"frequencies":[261.6255653006,276.16031892841,292.40504357126,310.68035879446,331.39238271409,355.06326719367,382.37582620857,414.24047839262,432.2509339749,451.89870370104,473.41768959156,497.08857407114,523.2511306012],"description":"Rationalized JC Sub-19 Harmonia on C. MD=19, No planetary assignment."},"harmjc-21":{"frequencies":[261.6255653006,268.0066766494,274.70684356563,289.16509849014,305.22982618403,343.38355445704,366.27579142084,392.4383479509,406.97310157871,422.62591317789,439.53094970501,457.84473927605,523.2511306012],"description":"Rationalized JC Sub-21 Harmonia on C. MD=21, No planetary assignment."},"harmjc-23-2":{"frequencies":[261.6255653006,273.51763645063,286.54228580542,300.86940009569,316.70463167967,334.29933343966,353.96400011258,376.08675011961,401.15920012759,429.81342870813,462.87600014722,501.44900015948,523.2511306012],"description":"Rationalized JC Sub-23 Harmonia on C. MD=23, No planetary assignment."},"harmjc-23":{"frequencies":[261.6255653006,273.51763645063,300.86940009569,316.70463167967,334.29933343966,376.08675011961,401.15920012759,429.81342870813,445.73244458621,462.87600014722,481.3910401531,501.44900015948,523.2511306012],"description":"Rationalized JC Sub-23 Harmonia on C. MD=23, No planetary assignment."},"harmjc-25":{"frequencies":[261.6255653006,272.52663052146,297.30177875068,311.45900631024,327.03195662575,363.36884069528,384.74347838324,408.78994578219,436.04260883433,467.18850946536,484.4917875937,503.12608711654,523.2511306012],"description":"Rationalized JC Sub-25 Harmonia on C. MD=25, No planetary assignment."},"harmjc-27":{"frequencies":[261.6255653006,271.68808704293,294.32876096318,307.12566361375,321.08592105074,353.19451315581,371.78369805875,392.4383479509,415.52295665389,441.49314144476,470.92601754108,504.56359022259,523.2511306012],"description":"Rationalized JC Sub-27 Harmonia on C. MD=27, No planetary assignment."},"harmjc-hypod16":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,310.07474405997,322.00069575458,348.83408706747,364.00078650518,380.54627680087,398.6675280771,418.60090448096,440.63253103259,465.11211608996,523.2511306012],"description":"Rationalized JC Hypodorian Harmonia on C. Saturn Scale on C, MD=16. (Steiner)"},"harmjc-hypol20":{"frequencies":[261.6255653006,275.39533189537,290.69507255622,307.79478270659,327.03195662575,348.83408706747,373.75080757229,402.50086969323,418.60090448096,436.04260883433,455.00098313148,575.57624366132,523.2511306012],"description":"Rationalized JC Hypolydian Harmonia on C. Mars scale on C., MD=20"},"harmjc-hypop18":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,313.95067836072,336.37572681506,362.25078272391,376.74081403286,392.4383479509,409.50088481833,428.11456140098,448.50096908674,470.92601754108,523.2511306012],"description":"Rationalized JC Hypophrygian Harmonia on C. Jupiter scale on C, MD =18"},"harmjc-lydian13":{"frequencies":[261.6255653006,272.09058791262,283.42769574232,295.75063903546,309.19384990071,340.11323489078,358.01393146398,377.90359432309,400.13321751856,425.14154361347,453.48431318771,485.87604984397,523.2511306012],"description":"Rationalized JC Lydian Harmonia on C. Mercury scale on C, MD = 26 or 13"},"harmjc-mix14":{"frequencies":[261.6255653006,271.31540105247,281.75060878526,293.02063313667,305.22982618403,332.97799220076,348.83408706747,366.27579142084,385.55346465352,406.97310157871,430.91269578922,457.84473927605,523.2511306012],"description":"Rationalized JC Mixolydian Harmonia on C. Moon Scale on C, MD = 14"},"harmjc-phryg12":{"frequencies":[261.6255653006,273.00058987889,285.40970760065,299.00064605783,313.95067836072,348.83408706747,369.35373924791,392.4383479509,418.60090448096,448.50096908674,465.11211608996,483.00104363188,523.2511306012],"description":"Rationalized JC Phrygian Harmonia on C. Venus scale on C, MD = 24 or 12"},"harmonical":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,457.84473927605,470.92601754108,490.54793493862,523.2511306012],"description":"See pp 17 and 466-468 Helmholtz. lower 4 oct. Instr. designed & tuned by Ellis"},"harmonical_up":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,359.73515228832,457.84473927605,392.4383479509,408.78994578219,425.14154361347,474.19633710734,490.54793493862,523.2511306012],"description":"Upper 2 octaves of Ellis's Harmonical"},"harmsub16":{"frequencies":[261.6255653006,280.31310567921,294.32876096318,301.87565226992,327.03195662575,356.76213450082,359.73515228832,392.4383479509,425.14154361347,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"16 harmonics on 1/1 and 16 subharmonics on 15/8"},"harrison_16":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,299.00064605783,305.22982618403,313.95067836072,327.03195662575,348.83408706747,370.63621750918,392.4383479509,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,490.54793493862,523.2511306012],"description":"Lou Harrison 16-tone superparticular \"Ptolemy Duple\""},"harrison_5":{"frequencies":[261.6255653006,279.06726965397,313.95067836072,392.4383479509,418.60090448096,523.2511306012],"description":"From Lou Harrison, a pelog style pentatonic"},"harrison_5_1":{"frequencies":[261.6255653006,285.40970760065,313.95067836072,392.4383479509,418.60090448096,523.2511306012],"description":"From Lou Harrison, a pelog style pentatonic"},"harrison_5_3":{"frequencies":[261.6255653006,271.31540105247,348.83408706747,392.4383479509,406.97310157871,523.2511306012],"description":"From Lou Harrison, a pelog style pentatonic"},"harrison_5_4":{"frequencies":[261.6255653006,279.06726965397,313.95067836072,392.4383479509,490.54793493862,523.2511306012],"description":"From Lou Harrison, a pelog style pentatonic"},"harrison_8":{"frequencies":[261.6255653006,279.06726965397,313.95067836072,327.03195662575,367.91095120397,392.4383479509,436.04260883433,465.11211608996,523.2511306012],"description":"Lou Harrison 8-tone tuning for \"Serenade for Guitar\""},"harrison_cinna":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,343.38355445704,367.91095120397,392.4383479509,418.60090448096,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Lou Harrison, \"Incidental Music for Corneille's Cinna\" (1955-56) 1/1=C"},"harrison_diat":{"frequencies":[261.6255653006,274.70684356563,313.95067836072,348.83408706747,392.4383479509,412.06026534844,470.92601754108,523.2511306012],"description":"From Lou Harrison, a soft diatonic"},"harrison_joy":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"Lou Harrison's Joyous 6"},"harrison_mid":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,348.83408706747,392.4383479509,436.04260883433,457.84473927605,523.2511306012],"description":"Lou Harrison mid mode"},"harrison_mid2":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,348.83408706747,392.4383479509,448.50096908674,470.92601754108,523.2511306012],"description":"Lou Harrison mid mode 2"},"harrison_min":{"frequencies":[261.6255653006,313.95067836072,348.83408706747,392.4383479509,436.04260883433,523.2511306012],"description":"From Lou Harrison, a symmetrical pentatonic with minor thirds"},"harrison_mix1":{"frequencies":[261.6255653006,285.40970760065,313.95067836072,392.4383479509,425.14154361347,523.2511306012],"description":"A \"mixed type\" pentatonic, Lou Harrison"},"harrison_mix2":{"frequencies":[261.6255653006,313.95067836072,348.83408706747,392.4383479509,490.54793493862,523.2511306012],"description":"A \"mixed type\" pentatonic, Lou Harrison"},"harrison_mix3":{"frequencies":[261.6255653006,313.95067836072,336.37572681506,392.4383479509,418.60090448096,523.2511306012],"description":"A \"mixed type\" pentatonic, Lou Harrison"},"harrison_mix4":{"frequencies":[261.6255653006,280.31310567921,327.03195662575,392.4383479509,448.50096908674,523.2511306012],"description":"A \"mixed type\" pentatonic, Lou Harrison"},"harrison_songs":{"frequencies":[261.6255653006,271.31540105247,294.32876096318,310.07474405997,327.03195662575,348.83408706747,367.91095120397,392.4383479509,406.97310157871,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"Shared gamut of \"Four Strict Songs\" (1951-55), each pentatonic"},"harrisonj":{"frequencies":[261.6255653006,272.17712546173,292.13970819848,313.56642833783,326.21280531667,350.13858362887,364.25994396351,390.97625694066,406.744629928,436.57694340361,468.59728067062,487.49616921257,523.2511306012],"description":"John Harrison's temperament (1775), almost 3/10-comma. Third = 1200/pi"},"harrisonm_rev":{"frequencies":[261.6255653006,257.53766584278,294.32876096318,289.72987407313,331.11985608357,343.38355445704,372.50983809402,392.4383479509,386.30649876417,441.49314144476,457.84473927605,496.67978412536,523.2511306012],"description":"Michael Harrison, piano tuning for \"Revelation\" (2001), 1/1=F"},"haverstick13":{"frequencies":[261.6255653006,283.85429714132,301.75671459889,307.97166902637,320.78822215662,341.02002673508,362.52783176564,377.61479489998,401.43059675514,426.7484383229,444.50800708553,482.27514684959,502.34551296122,523.2511306012],"description":"Neil Haverstick, scale in 34-tET, MMM 21-5-2006"},"hawkes":{"frequencies":[261.6255653006,274.56549986328,292.86986732103,310.24975557428,327.84547867349,349.70184487387,366.99801003998,391.46454285105,411.84824958905,438.2147004401,467.42901507992,490.54793493862,523.2511306012],"description":"William Hawkes' modified 1/5-comma meantone (1807)"},"hawkes2":{"frequencies":[261.6255653006,275.15193010334,293.04845178801,312.10900487995,328.24542585003,349.59527202198,367.66978141816,391.58387939843,411.8292495232,438.61558204759,467.14415995873,491.2960898965,523.2511306012],"description":"Meantone with fifth tempered 1/6 of 53-tET step by William Hawkes (1808)"},"hawkes3":{"frequencies":[261.6255653006,274.56549986328,292.86986732103,311.6193417424,327.84547867349,349.70184487387,366.99801003998,391.46454285105,411.84824958905,438.2147004401,467.42901237995,490.54793493862,523.2511306012],"description":"William Hawkes' modified 1/5-comma meantone (1811)"},"hbarnes":{"frequencies":[261.6255653006,276.71351472429,293.33333347996,310.95136287868,328.88393162803,349.42547049952,369.15973155124,391.77416758435,414.83597850347,439.25532436715,466.16376151809,493.04743111995,523.2511306012],"description":"Variation on Barnes with 1/6P -> 1/8P. OdC '99"},"hebdome1":{"frequencies":[261.6255653006,265.71346475842,267.23182741418,269.80136421624,273.30527803723,280.31310567921,283.42769574232,287.78812183066,289.07289023169,292.28481123426,294.32876096318,300.63580584096,303.67253115248,308.34441624714,311.77046531655,315.35224388912,318.85615771011,323.76163705949,327.03195662575,334.03978426773,336.37572681506,340.11323489078,341.63159754654,346.88746827803,350.74177348112,359.73515228832,364.40703738298,367.91095120397,370.01329949656,375.7947573012,382.62738925213,385.43052030892,389.71308164569,392.4383479509,400.84774112128,404.70204632437,409.95791705585,411.12588832951,417.54973033466,420.46965851882,425.14154361347,431.68218274599,437.28844485957,441.49314144476,445.38637902364,449.66894036041,455.50879672872,462.5166243707,467.65569797482,470.92601754108,478.28423656516,479.64686971777,485.87604984397,490.54793493862,501.0596764016,504.56359022259,510.16985233617,513.90736041189,523.2511306012],"description":"Wilson 1.3.5.7.9.11.13.15 hebdomekontany, 1.3.5.7 tonic"},"helmholtz":{"frequencies":[261.6255653006,279.06726965397,327.03195662575,348.83408706747,392.4383479509,418.60090448096,490.54793493862,523.2511306012],"description":"Helmholtz's Chromatic scale and Gipsy major from Slovakia"},"helmholtz_24":{"frequencies":[261.6255653006,275.93321340298,279.06726965397,290.69507255622,294.32876096318,306.59245933664,310.07474405997,327.03195662575,331.11985608357,344.91651675372,348.83408706747,367.91095120397,372.50983809402,388.03108134794,392.4383479509,408.78994578219,413.89982010446,436.04260883433,441.49314144476,459.88868900496,465.63729761752,490.54793493862,496.67978412536,517.37477513058,523.2511306012],"description":"Simplified Helmholtz 24"},"helmholtz_hd":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,470.92601754108,523.2511306012],"description":"Helmholtz Harmonic Decad"},"helmholtz_pure":{"frequencies":[261.6255653006,275.93321340298,279.06726965397,290.69507255622,294.32876096318,306.59245933664,310.07474405997,327.03195662575,330.74639366397,344.91651675372,348.83408706747,367.91095120397,372.08969287196,387.59343007496,392.4383479509,408.78994578219,413.43299207996,436.04260883433,441.49314144476,459.88868900496,465.11211608996,490.54793493862,496.11959049595,516.79124009995,523.2511306012],"description":"Helmholtz's two-keyboard harmonium tuning untempered"},"helmholtz_temp":{"frequencies":[261.6255653006,275.81645389904,279.10671937395,290.77707354032,294.24580701304,306.54917537161,310.20605716322,327.03195662575,330.9330448436,344.77062435684,348.88325535732,367.80710710303,372.19474608839,387.75741156435,392.38304142029,408.78994578219,413.66637442451,436.10414127513,441.30625330017,459.75895986689,465.24324076996,490.4788828408,496.3296094287,517.08305349316,523.2511306012],"description":"Helmholtz's two-keyboard harmonium tuning"},"hem_chrom":{"frequencies":[261.6255653006,269.55361273395,285.40970760065,348.83408706747,392.4383479509,404.33041910093,428.11456140098,523.2511306012],"description":"Hemiolic Chromatic genus has the strong or 1:2 division of the 12/11 pyknon"},"hem_chrom11":{"frequencies":[261.6255653006,273.00058987889,285.40970760065,348.83408706747,392.4383479509,409.50088481833,428.11456140098,523.2511306012],"description":"11'al Hemiolic Chromatic genus with a CI of 11/9, Winnington-Ingram"},"hem_chrom13":{"frequencies":[261.6255653006,272.09058791262,283.42769574232,348.83408706747,392.4383479509,408.13588186894,425.14154361347,523.2511306012],"description":"13'al Hemiolic Chromatic or neutral-third genus has a CI of 16/13"},"hem_chrom2":{"frequencies":[261.6255653006,269.29177952703,285.30470202322,349.22823143301,391.99543598175,403.48177901006,427.47405410759,523.2511306012],"description":"1:2 Hemiolic Chromatic genus 3 + 6 + 21 parts"},"hemiwuer24":{"frequencies":[261.6255653006,274.60778382002,280.48822448524,286.49458884928,292.62957327549,307.15025309186,313.72755695954,320.44570714783,327.30771955335,350.90592546776,358.42021185082,366.09540888186,373.9349620795,392.49012653442,400.89489544613,409.47964376542,418.24822532303,439.00227453173,448.4030528436,458.00513880662,467.8128437444,491.02635713596,501.54117720983,512.28116095218,523.2511306012],"description":"Hemiw�rschmidt[24] in 229-tET tuning."},"hen12":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,448.50096908674,457.84473927605,490.54793493862,523.2511306012],"description":"Adjusted Hahn12"},"hen22":{"frequencies":[261.6255653006,272.52663052146,280.31310567921,290.69507255622,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,363.36884069528,366.27579142084,381.53728273004,392.4383479509,415.27867508032,418.60090448096,436.04260883433,448.50096908674,457.84473927605,484.4917875937,490.54793493862,508.71637697339,523.2511306012],"description":"Adjusted Hahn22"},"hept_diamond":{"frequencies":[261.6255653006,269.10058145205,271.31540105247,279.06726965397,294.32876096318,305.22982618403,313.95067836072,316.53463456122,325.57848126297,327.03195662575,334.88072358477,336.37572681506,348.83408706747,392.4383479509,406.97310157871,408.78994578219,418.60090448096,420.46965851882,432.48307733364,436.04260883433,448.50096908674,465.11211608996,490.54793493862,504.56359022259,508.71637697339,523.2511306012],"description":"Inverted-Prime Heptatonic Diamond based on Archytas's Enharmonic"},"hept_diamondi":{"frequencies":[261.6255653006,269.10058145205,271.31540105247,279.06726965397,281.36411960997,289.40309445597,294.32876096318,297.67175429757,327.03195662575,336.37572681506,348.83408706747,361.75386806997,367.91095120397,372.08969287196,378.42269266694,392.4383479509,406.97310157871,418.60090448096,459.88868900496,465.11211608996,473.02836583367,486.54346200035,490.54793493862,504.56359022259,508.71637697339,523.2511306012],"description":"Prime-Inverted Heptatonic Diamond based on Archytas's Enharmonic"},"hept_diamondp":{"frequencies":[261.6255653006,269.10058145205,271.31540105247,279.06726965397,294.32876096318,305.22982618403,313.95067836072,327.03195662575,336.37572681506,339.14425131559,348.83408706747,358.80077526939,361.75386806997,367.91095120397,372.08969287196,378.42269266694,381.53728273004,392.4383479509,403.65087217807,406.97310157871,418.60090448096,436.04260883433,448.50096908674,465.11211608996,490.54793493862,504.56359022259,508.71637697339,523.2511306012],"description":"Heptatonic Diamond based on Archytas's Enharmonic, 27 tones"},"herf":{"frequencies":[261.6255653006,269.80136421624,277.97716313189,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,425.14154361347,441.49314144476,457.84473927605,490.54793493862,523.2511306012],"description":"Sims:Reflections on This and That, 1991. Used by Herf in Ekmelischer Gesang"},"heun":{"frequencies":[261.6255653006,275.15237829755,293.0485888979,312.10878854255,328.24573110938,349.59519124833,367.67029324081,391.58396987353,411.83001550364,438.61588607285,467.14394139401,491.29666030217,523.2511306012],"description":"Well temperament for organ of Jan Heun (1805), subset of 55-tET"},"hexagonal13":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Star hexagonal 13-tone scale"},"hexagonal37":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,282.55561052465,283.88190679319,290.69507255622,294.32876096318,297.67175429757,301.39265122629,306.59245933664,313.95067836072,322.99452506247,327.03195662575,334.88072358477,340.65828815182,348.83408706747,353.19451315581,363.36884069528,367.91095120397,372.08969287196,376.74081403286,387.59343007496,392.4383479509,401.85686830172,408.78994578219,418.60090448096,423.83341578697,436.04260883433,446.50763144636,454.2110508691,459.88868900496,465.11211608996,470.92601754108,482.22824196207,484.4917875937,490.54793493862,502.32108537715,523.2511306012],"description":"Star hexagonal 37-tone scale"},"hexany1":{"frequencies":[261.6255653006,305.22982618403,327.03195662575,381.53728273004,436.04260883433,457.84473927605,523.2511306012],"description":"Two out of 1 3 5 7 hexany on 1.3"},"hexany10":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"1.3.5.9 Hexany"},"hexany11":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,343.38355445704,392.4383479509,457.84473927605,523.2511306012],"description":"1.3.7.9 Hexany on 1.3"},"hexany12":{"frequencies":[261.6255653006,290.69507255622,305.22982618403,339.14425131559,406.97310157871,436.04260883433,523.2511306012],"description":"3.5.7.9 Hexany on 3.9"},"hexany13":{"frequencies":[261.6255653006,285.40970760065,327.03195662575,356.76213450082,392.4383479509,475.68284600109,523.2511306012],"description":"1.3.5.11 Hexany on 1.11"},"hexany14":{"frequencies":[261.6255653006,287.78812183066,340.11323489078,383.71749577421,453.48431318771,498.83274450648,523.2511306012],"description":"5.11.13.15 Hexany (5.15), used in The Giving, by Stephen J. Taylor"},"hexany15":{"frequencies":[261.6255653006,327.03195662575,348.83408706747,392.4383479509,418.60090448096,523.2511306012],"description":"1.3.5.15 2)4 hexany (1.15 tonic) degenerate, symmetrical pentatonic"},"hexany16":{"frequencies":[261.6255653006,294.32876096318,348.83408706747,392.4383479509,465.11211608996,523.2511306012],"description":"1.3.9.27 Hexany, a degenerate pentatonic form"},"hexany17":{"frequencies":[261.6255653006,327.03195662575,334.88072358477,408.78994578219,418.60090448096,523.2511306012],"description":"1.5.25.125 Hexany, a degenerate pentatonic form"},"hexany18":{"frequencies":[261.6255653006,299.00064605783,341.71502406609,400.61414686654,457.84473927605,523.2511306012],"description":"1.7.49.343 Hexany, a degenerate pentatonic form"},"hexany19":{"frequencies":[261.6255653006,299.00064605783,327.03195662575,418.60090448096,457.84473927605,523.2511306012],"description":"1.5.7.35 Hexany, a degenerate pentatonic form"},"hexany2":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,340.65828815182,348.83408706747,363.36884069528,392.4383479509,408.78994578219,436.04260883433,490.54793493862,523.2511306012],"description":"Hexany Cluster 2"},"hexany20":{"frequencies":[261.6255653006,279.06726965397,305.22982618403,398.6675280771,436.04260883433,465.11211608996,523.2511306012],"description":"3.5.7.105 Hexany"},"hexany21":{"frequencies":[261.6255653006,279.06726965397,310.07474405997,392.4383479509,436.04260883433,465.11211608996,523.2511306012],"description":"3.5.9.135 Hexany"},"hexany21a":{"frequencies":[261.6255653006,279.06726965397,310.07474405997,348.83408706747,392.4383479509,436.04260883433,465.11211608996,523.2511306012],"description":"3.5.9.135 Hexany + 4/3. Is Didymos Diatonic tetrachord on 1/1 and inv. on 3/2"},"hexany22":{"frequencies":[261.6255653006,276.76092858245,359.73515228832,380.54627680087,494.63583439645,523.2511306012],"description":"1.11.121.1331 Hexany, a degenerate pentatonic form"},"hexany23":{"frequencies":[261.6255653006,348.83408706747,359.73515228832,380.54627680087,392.4383479509,523.2511306012],"description":"1.3.11.33 Hexany, degenerate pentatonic form"},"hexany24":{"frequencies":[261.6255653006,327.03195662575,359.73515228832,380.54627680087,418.60090448096,523.2511306012],"description":"1.5.11.55 Hexany, a degenerate pentatonic form"},"hexany25":{"frequencies":[261.6255653006,299.00064605783,359.73515228832,380.54627680087,457.84473927605,523.2511306012],"description":"1.7.11.77 Hexany, a degenerate pentatonic form"},"hexany26":{"frequencies":[261.6255653006,294.32876096318,359.73515228832,380.54627680087,465.11211608996,523.2511306012],"description":"1.9.11.99 Hexany, a degenerate pentatonic form"},"hexany3":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Hexany Cluster 3"},"hexany4":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,376.74081403286,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Hexany Cluster 4"},"hexany49":{"frequencies":[261.6255653006,299.00064605783,305.22982618403,392.4383479509,400.61414686654,457.84473927605,523.2511306012],"description":"1.3.21.49 2)4 hexany (1.21 tonic)"},"hexany5":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Hexany Cluster 5"},"hexany6":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,490.54793493862,523.2511306012],"description":"Hexany Cluster 6"},"hexany7":{"frequencies":[261.6255653006,272.52663052146,313.95067836072,327.03195662575,348.83408706747,363.36884069528,392.4383479509,408.78994578219,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Hexany Cluster 7"},"hexany8":{"frequencies":[261.6255653006,272.52663052146,313.95067836072,327.03195662575,340.65828815182,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,490.54793493862,502.32108537715,523.2511306012],"description":"Hexany Cluster 8"},"hexany9":{"frequencies":[261.6255653006,299.00064605783,313.95067836072,358.80077526939,418.60090448096,448.50096908674,523.2511306012],"description":"1.3.5.7 Hexany on 5.7"},"hexany_cl":{"frequencies":[261.6255653006,294.32876096318,301.39265122629,313.95067836072,327.03195662575,348.83408706747,353.19451315581,376.74081403286,392.4383479509,418.60090448096,470.92601754108,502.32108537715,523.2511306012],"description":"Hexany Cluster 1"},"hexany_cl2":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,408.78994578219,418.60090448096,490.54793493862,502.32108537715,523.2511306012],"description":"Composed of 1.3.5.45, 1.3.5.75, 1.3.5.9, and 1.3.5.25 hexanies"},"hexany_flank":{"frequencies":[261.6255653006,267.07609791103,299.00064605783,305.22982618403,327.03195662575,348.83408706747,373.75080757229,381.53728273004,427.14378008261,436.04260883433,457.84473927605,498.33441009638,523.2511306012],"description":"Hexany Flanker, 7-limit, from Wilson"},"hexany_tetr":{"frequencies":[261.6255653006,269.10058145205,279.06726965397,336.37572681506,348.83408706747,358.80077526939,523.2511306012],"description":"Complex 12 of p. 115, a hexany based on Archytas's Enharmonic"},"hexany_trans":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,339.14425131559,348.83408706747,361.75386806997,523.2511306012],"description":"Complex 1 of p. 115, a hexany based on Archytas's Enharmonic"},"hexany_trans2":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,348.83408706747,358.80077526939,372.08969287196,523.2511306012],"description":"Complex 2 of p. 115, a hexany based on Archytas's Enharmonic"},"hexany_trans3":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,327.03195662575,336.37572681506,348.83408706747,523.2511306012],"description":"Complex 9 of p. 115, a hexany based on Archytas's Enharmonic"},"hexany_u2":{"frequencies":[261.6255653006,274.70684356563,279.06726965397,280.31310567921,286.15296204753,299.00064605783,305.22982618403,313.95067836072,327.03195662575,343.38355445704,348.83408706747,358.80077526939,366.27579142084,373.75080757229,381.53728273004,392.4383479509,398.6675280771,418.60090448096,436.04260883433,448.50096908674,457.84473927605,478.40103369253,488.36772189445,490.54793493862,498.33441009638,523.2511306012],"description":"Hexany union = genus [335577] minus two corners"},"hexany_union":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,299.00064605783,305.22982618403,313.95067836072,327.03195662575,348.83408706747,358.80077526939,366.27579142084,373.75080757229,381.53728273004,392.4383479509,418.60090448096,436.04260883433,448.50096908674,457.84473927605,488.36772189445,498.33441009638,523.2511306012],"description":"The union of all of the pitches of the 1.3.5.7 hexany on each tone as 1/1"},"hexany_urot":{"frequencies":[261.6255653006,267.07609791103,280.31310567921,286.15296204753,290.69507255622,299.00064605783,305.22982618403,327.03195662575,333.84512238879,343.38355445704,348.83408706747,356.10146388137,373.75080757229,381.53728273004,392.4383479509,400.61414686654,406.97310157871,436.04260883433,445.12682985172,448.50096908674,457.84473927605,490.54793493862,498.33441009638,508.71637697339,523.2511306012],"description":"Aggregate rotations of 1.3.5.7 hexany, 1.3 = 1/1"},"hexanys":{"frequencies":[261.6255653006,286.15296204753,294.32876096318,327.03195662575,343.38355445704,367.91095120397,392.4383479509,429.2294430713,441.49314144476,457.84473927605,490.54793493862,515.07533168556,523.2511306012],"description":"Hexanys 1 3 5 7 9"},"hexanys2":{"frequencies":[261.6255653006,314.76825825228,425.14154361347,457.84473927605,269.80136421624,371.99885066179,392.4383479509,472.15238737843,318.85615771011,359.73515228832,343.38355445704,292.28481123426,523.2511306012],"description":"Hexanys 1 3 7 11 13"},"higgs":{"frequencies":[261.6255653006,392.4383479509,418.60090448096,422.62591317789,423.58424858192,425.14154361347,436.04260883433,523.2511306012],"description":"From Greg Higgs announcement of the formation of an Internet Tuning list"},"hinsz_gr":{"frequencies":[261.6255653006,274.68983337859,292.34127285051,310.07474405997,326.6631048533,348.83408706747,366.25311135453,391.11111150212,412.03474986192,437.02884834934,465.11211608996,489.99465727995,523.2511306012],"description":"Reconstructed Hinsz temperament, organ Pelstergasthuiskerk Groningen. Ortgies,2002"},"hipkins":{"frequencies":[261.6255653006,275.62199471997,299.00064605783,348.83408706747,392.4383479509,413.43299207996,448.50096908674,523.2511306012],"description":"Hipkins' Chromatic"},"hirajoshi":{"frequencies":[261.6255653006,291.13134764929,317.84796618517,388.16504068057,412.91271853531,523.2511306012],"description":"Observed Japanese pentatonic koto scale. Helmholtz/Ellis p.519, nr.112"},"hirajoshi2":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,392.4383479509,418.60090448096,523.2511306012],"description":"Japanese pentatonic koto scale, theoretical. Helmholz/Ellis p.519, nr.110"},"hirajoshi3":{"frequencies":[261.6255653006,292.47977325983,321.54118165335,396.32121331049,415.54465627623,522.94897617031],"description":"Observed Japanese pentatonic koto scale. Helmholtz/Ellis p.519, nr.111"},"hirashima":{"frequencies":[261.6255653006,277.33928225406,292.50627485027,312.00669222389,327.03195662575,349.91912034749,369.78570985692,391.22147055517,416.00892317314,437.39889945791,468.01003810189,489.02683710225,523.2511306012],"description":"Tatsushi Hirashima, temperament of chapel organ of Kobe Shoin Women's Univ."},"hjelmboogie":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,343.38355445704,367.91095120397,392.4383479509,441.49314144476,457.84473927605,490.54793493862,515.07533168556,523.2511306012],"description":"Paul Hjelmstad's \"Boogie Woogie\" scale, TL 20-3-2006"},"ho_mai_nhi":{"frequencies":[261.6255653006,287.78812183066,348.83408706747,392.4383479509,431.68218274599,523.2511306012],"description":"Ho Mai Nhi (Nam Hue) dan tranh scale, Vietnam"},"hochgartz":{"frequencies":[261.6255653006,274.56549986328,292.86986732103,309.86458629683,327.84547867349,349.70184487387,366.99801003998,391.46454285105,412.49999887294,438.2147004401,465.53241962975,490.54793493862,523.2511306012],"description":"Michael Hochgartz, modified 1/5-comma meantone temperament"},"hofmann1":{"frequencies":[261.6255653006,262.65154790962,279.06726965397,348.83408706747,392.4383479509,393.97732186443,418.60090448096,523.2511306012],"description":"Hofmann's Enharmonic #1, Dorian mode"},"hofmann2":{"frequencies":[261.6255653006,263.56353245097,279.06726965397,348.83408706747,392.4383479509,395.34529867646,418.60090448096,523.2511306012],"description":"Hofmann's Enharmonic #2, Dorian mode"},"hofmann_chrom":{"frequencies":[261.6255653006,264.26824777838,290.69507255622,348.83408706747,392.4383479509,396.40237166758,436.04260883433,523.2511306012],"description":"Hofmann's Chromatic"},"holder":{"frequencies":[261.6255653006,274.23214485994,292.57879058083,312.45989404005,327.40114268825,349.76744711215,366.57630213591,391.03837375367,409.94826565972,437.46806069696,467.28984664562,489.70152554512,523.2511306012],"description":"William Holder's equal beating meantone temperament (1694). 3/2 beats 2.8 Hz"},"holder2":{"frequencies":[261.6255653006,274.23214485994,292.57879058083,312.45989404005,327.40114268825,349.76744711215,366.57630213591,391.03837375367,410.64811919433,437.46806069696,467.46154552107,489.70152554512,523.2511306012],"description":"Holder's irregular e.b. temperament with improved Eb and G#"},"hummel":{"frequencies":[261.6255653006,277.1703574486,293.54676487235,311.03465677994,329.45811370906,349.13199096171,369.8583804246,391.99149393462,415.308682162,439.8732919971,466.10512967869,493.74031485884,523.2511306012],"description":"Johann Nepomuk Hummel's quasi-equal temperament (1829)"},"hummel2":{"frequencies":[261.6255653006,277.22760066578,293.66431501254,311.21660561883,329.70790803338,349.18845812715,369.99117208793,391.90679138833,415.30984563838,439.96491544382,466.29335337935,494.03030700757,523.2511306012],"description":"Johann Nepomuk Hummel's temperament according to the second bearing plan"},"husmann":{"frequencies":[261.6255653006,275.62199471997,294.32876096318,310.07474405997,314.30517589183,331.11985608357,348.83408706747],"description":"Tetrachord division according to Husmann"},"hwerck3":{"frequencies":[261.6255653006,276.40121172404,293.00227310437,310.60041853231,328.69828757761,349.03110370139,368.74309237173,391.5530240856,414.36778843034,438.51190905657,465.63764214343,492.7691222293,523.2511306012],"description":"Variation on Werckmeister III with 1/4P -> 1/6P and 0P -> 1/24P. OdC '99"},"hyper_enh":{"frequencies":[261.6255653006,264.93728131706,268.33391312882,348.83408706747,392.4383479509,397.40592197559,402.50086969323,523.2511306012],"description":"13/10 HyperEnharmonic. This genus is at the limit of usable tunings"},"hyper_enh2":{"frequencies":[261.6255653006,267.19206668997,273.00058987889,348.83408706747,392.4383479509,400.78810003496,409.50088481833,523.2511306012],"description":"Hyperenharmonic genus from Kathleen Schlesinger's enharmonic Phrygian Harmonia"},"hypo_chrom":{"frequencies":[261.6255653006,275.39533189537,282.83844897362,290.69507255622,348.83408706747,373.75080757229,387.59343007496,402.50086969323,418.60090448096,427.14378008261,436.04260883433,455.00098313148,523.2511306012],"description":"Hypolydian Chromatic Tonos"},"hypo_diat":{"frequencies":[261.6255653006,290.69507255622,307.79478270659,327.03195662575,348.83408706747,373.75080757229,387.59343007496,402.50086969323,436.04260883433,455.00098313148,475.68284600109,498.33441009638,523.2511306012],"description":"Hypolydian Diatonic Tonos"},"hypo_enh":{"frequencies":[261.6255653006,268.33391312882,271.81876914348,275.39533189537,348.83408706747,373.75080757229,387.59343007496,402.50086969323,410.39304360878,414.45634107026,418.60090448096,465.11211608996,523.2511306012],"description":"Hypolydian Enharmonic Tonos"},"hypod_chrom":{"frequencies":[261.6255653006,279.06726965397,288.69027895239,299.00064605783,322.00069575458,348.83408706747,364.00078650518,380.54627680087,398.6675280771,408.39112632289,418.60090448096,465.11211608996,523.2511306012],"description":"Hypodorian Chromatic Tonos"},"hypod_chrom2":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,348.83408706747,380.54627680087,398.6675280771,418.60090448096,523.2511306012],"description":"Schlesinger's Chromatic Hypodorian Harmonia"},"hypod_chrom2inv":{"frequencies":[261.6255653006,327.03195662575,343.38355445704,359.73515228832,392.4383479509,457.84473927605,490.54793493862,523.2511306012],"description":"Inverted Schlesinger's Chromatic Hypodorian Harmonia"},"hypod_chromenh":{"frequencies":[261.6255653006,270.06509966514,279.06726965397,348.83408706747,380.54627680087,398.6675280771,418.60090448096,523.2511306012],"description":"Schlesinger's Hypodorian Harmonia in a mixed chromatic-enharmonic genus"},"hypod_chrominv":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,359.73515228832,392.4383479509,408.78994578219,425.14154361347,523.2511306012],"description":"A harmonic form of Schlesinger's Chromatic Hypodorian Inverted"},"hypod_diat":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,322.00069575458,334.88072358477,348.83408706747,364.00078650518,380.54627680087,418.60090448096,440.63253103259,465.11211608996,492.47165233054,523.2511306012],"description":"Hypodorian Diatonic Tonos"},"hypod_diat2":{"frequencies":[261.6255653006,279.06726965397,322.00069575458,348.83408706747,364.00078650518,380.54627680087,418.60090448096,465.11211608996,523.2511306012],"description":"Schlesinger's Hypodorian Harmonia, a subharmonic series through 13 from 16"},"hypod_diatcon":{"frequencies":[261.6255653006,279.06726965397,322.00069575458,348.83408706747,364.00078650518,418.60090448096,465.11211608996,523.2511306012],"description":"A Hypodorian Diatonic with its own trite synemmenon replacing paramese"},"hypod_diatinv":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,376.08675011961,392.4383479509,425.14154361347,457.84473927605,490.54793493862,523.2511306012],"description":"Inverted Schlesinger's Hypodorian Harmonia, a harmonic series from 8 from 16"},"hypod_enh":{"frequencies":[261.6255653006,270.06509966514,274.49239638096,279.06726965397,310.07474405997,348.83408706747,364.00078650518,380.54627680087,389.39619021485,393.97732186443,398.6675280771,452.54151835779,523.2511306012],"description":"Hypodorian Enharmonic Tonos"},"hypod_enhinv":{"frequencies":[261.6255653006,343.38355445704,351.55935337268,359.73515228832,392.4383479509,490.54793493862,506.89953276991,523.2511306012],"description":"Inverted Schlesinger's Enharmonic Hypodorian Harmonia"},"hypod_enhinv2":{"frequencies":[261.6255653006,269.80136421624,277.97716313189,359.73515228832,392.4383479509,400.61414686654,408.78994578219,523.2511306012],"description":"A harmonic form of Schlesinger's Hypodorian enharmonic inverted"},"hypodorian_pis":{"frequencies":[261.6255653006,285.40970760065,313.95067836072,348.83408706747,392.4383479509,418.60090448096,483.00104363188,523.2511306012,546.00117975777,570.81941520131,627.90135672144,697.66817413493,784.8766959018,897.00193817349,966.00208726375,1046.5022612024],"description":"Diatonic Perfect Immutable System in the Hypodorian Tonos"},"hypol_chrom":{"frequencies":[261.6255653006,275.39533189537,290.69507255622,348.83408706747,373.75080757229,402.50086969323,418.60090448096,436.04260883433,523.2511306012],"description":"Schlesinger's Hypolydian Harmonia in the chromatic genus"},"hypol_chrominv":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,340.11323489078,366.27579142084,392.4383479509,470.92601754108,497.08857407114,523.2511306012],"description":"Inverted Schlesinger's Chromatic Hypolydian Harmonia"},"hypol_chrominv2":{"frequencies":[261.6255653006,274.70684356563,287.78812183066,340.11323489078,366.27579142084,392.4383479509,418.60090448096,523.2511306012],"description":"harmonic form of Schlesinger's Chromatic Hypolydian inverted"},"hypol_chrominv3":{"frequencies":[261.6255653006,274.70684356563,287.78812183066,340.11323489078,392.4383479509,418.60090448096,444.76346101102,523.2511306012],"description":"A harmonic form of Schlesinger's Chromatic Hypolydian inverted"},"hypol_diat":{"frequencies":[261.6255653006,290.69507255622,327.03195662575,348.83408706747,373.75080757229,402.50086969323,436.04260883433,475.68284600109,523.2511306012],"description":"Schlesinger's Hypolydian Harmonia, a subharmonic series through 13 from 20"},"hypol_diatcon":{"frequencies":[261.6255653006,290.69507255622,327.03195662575,348.83408706747,402.50086969323,436.04260883433,475.68284600109,523.2511306012],"description":"A Hypolydian Diatonic with its own trite synemmenon replacing paramese"},"hypol_diatinv":{"frequencies":[261.6255653006,287.78812183066,313.95067836072,340.11323489078,366.27579142084,392.4383479509,418.60090448096,470.92601754108,523.2511306012],"description":"Inverted Schlesinger's Hypolydian Harmonia, a harmonic series from 10 from 20"},"hypol_enh":{"frequencies":[261.6255653006,268.33391312882,275.39533189537,348.83408706747,373.75080757229,402.50086969323,418.60090448096,436.04260883433,523.2511306012],"description":"Schlesinger's Hypolydian Harmonia in the enharmonic genus"},"hypol_enhinv":{"frequencies":[261.6255653006,327.03195662575,333.57259575826,340.11323489078,366.27579142084,392.4383479509,497.08857407114,510.16985233617,523.2511306012],"description":"Inverted Schlesinger's Enharmonic Hypolydian Harmonia"},"hypol_enhinv2":{"frequencies":[261.6255653006,268.16620443312,274.70684356563,340.11323489078,366.27579142084,379.35706968587,392.4383479509,523.2511306012],"description":"A harmonic form of Schlesinger's Hypolydian enharmonic inverted"},"hypol_enhinv3":{"frequencies":[261.6255653006,268.16620443312,274.70684356563,340.11323489078,392.4383479509,405.51962621593,418.60090448096,523.2511306012],"description":"A harmonic form of Schlesinger's Hypolydian enharmonic inverted"},"hypol_pent":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,348.83408706747,373.75080757229,402.50086969323,415.27867508032,436.04260883433,523.2511306012],"description":"Schlesinger's Hypolydian Harmonia in the pentachromatic genus"},"hypol_tri":{"frequencies":[261.6255653006,270.64713651786,280.31310567921,348.83408706747,373.75080757229,402.50086969323,413.09299784305,424.25767346043,523.2511306012],"description":"Schlesinger's Hypolydian Harmonia in the first trichromatic genus"},"hypol_tri2":{"frequencies":[261.6255653006,270.64713651786,290.69507255622,348.83408706747,373.75080757229,402.50086969323,413.09299784305,436.04260883433,2093.0045224048],"description":"Schlesinger's Hypolydian Harmonia in the second trichromatic genus"},"hypolydian_pis":{"frequencies":[261.6255653006,281.75060878526,305.22982618403,332.97799220076,366.27579142084,406.97310157871,457.84473927605,488.36772189445,523.2511306012,563.50121757052,610.45965236807,665.95598440153,732.55158284168,813.94620315742,915.6894785521,1046.5022612024],"description":"The Diatonic Perfect Immutable System in the Hypolydian Tonos"},"hypop_chrom":{"frequencies":[261.6255653006,277.01530443593,285.40970760065,294.32876096318,336.37572681506,362.25078272391,376.74081403286,392.4383479509,409.50088481833,418.60090448096,428.11456140098,470.92601754108,523.2511306012],"description":"Hypophrygian Chromatic Tonos"},"hypop_chromenh":{"frequencies":[261.6255653006,269.10058145205,277.01530443593,362.25078272391,392.4383479509,409.50088481833,428.11456140098,523.2511306012],"description":"Schlesinger's Hypophrygian Harmonia in a mixed chromatic-enharmonic genus"},"hypop_chrominv":{"frequencies":[261.6255653006,319.76457981184,334.29933343966,348.83408706747,377.90359432309,465.11211608996,494.18162334558,523.2511306012],"description":"Inverted Schlesinger's Chromatic Hypophrygian Harmonia"},"hypop_chrominv2":{"frequencies":[261.6255653006,276.16031892841,290.69507255622,348.83408706747,377.90359432309,406.97310157871,436.04260883433,523.2511306012],"description":"A harmonic form of Schlesinger's Chromatic Hypophrygian inverted"},"hypop_diat":{"frequencies":[261.6255653006,294.32876096318,303.82323712328,313.95067836072,336.37572681506,362.25078272391,376.74081403286,392.4383479509,428.11456140098,448.50096908674,470.92601754108,495.71159741166,523.2511306012],"description":"Hypophrygian Diatonic Tonos"},"hypop_diat2":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,362.25078272391,376.74081403286,392.4383479509,428.11456140098,470.92601754108,523.2511306012],"description":"Schlesinger's Hypophrygian Harmonia"},"hypop_diat2inv":{"frequencies":[261.6255653006,290.69507255622,319.76457981184,348.83408706747,363.36884069528,377.90359432309,436.04260883433,465.11211608996,523.2511306012],"description":"Inverted Schlesinger's Hypophrygian Harmonia, a harmonic series from 9 from 18"},"hypop_diatcon":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,362.25078272391,376.74081403286,428.11456140098,470.92601754108,523.2511306012],"description":"A Hypophrygian Diatonic with its own trite synemmenon replacing paramese"},"hypop_enh":{"frequencies":[261.6255653006,269.10058145205,273.00058987889,277.01530443593,313.95067836072,362.25078272391,376.74081403286,392.4383479509,400.78810003496,405.0976494977,409.50088481833,470.92601754108,523.2511306012],"description":"Hypophrygian Enharmonic Tonos"},"hypop_enhinv":{"frequencies":[261.6255653006,334.29933343966,341.56671025356,348.83408706747,377.90359432309,494.18162334558,508.71637697339,523.2511306012],"description":"Inverted Schlesinger's Enharmonic Hypophrygian Harmonia"},"hypop_enhinv2":{"frequencies":[261.6255653006,268.89294211451,276.16031892841,348.83408706747,377.90359432309,392.4383479509,406.97310157871,523.2511306012],"description":"A harmonic form of Schlesinger's Hypophrygian enharmonic inverted"},"hypophryg_pis":{"frequencies":[261.6255653006,283.42769574232,309.19384990071,340.11323489078,377.90359432309,425.14154361347,453.48431318771,523.2511306012,544.18117582525,566.85539148463,618.38769980142,680.22646978156,755.80718864618,850.28308722695,971.75209968794,1046.5022612024],"description":"The Diatonic Perfect Immutable System in the Hypophrygian Tonos"},"kanzelmeyer_11":{"frequencies":[261.6255653006,277.97716313189,310.68035879446,327.03195662575,359.73515228832,376.08675011961,392.4383479509,425.14154361347,457.84473927605,474.19633710734,506.89953276991,523.2511306012],"description":"Bruce Kanzelmeyer, 11 harmonics from 16 to 32. Base 388.3614815 Hz"},"kanzelmeyer_18":{"frequencies":[261.6255653006,277.97716313189,302.50455987882,310.68035879446,327.03195662575,335.20775554139,351.55935337268,359.73515228832,376.08675011961,384.26254903526,392.4383479509,425.14154361347,433.31734252912,457.84473927605,474.19633710734,482.37213602298,498.72373385427,506.89953276991,523.2511306012],"description":"Bruce Kanzelmeyer, 18 harmonics from 32 to 64. Base 388.3614815 Hz"},"kayolonian":{"frequencies":[261.6255653006,267.90457886781,279.06726965397,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,357.20610515709,372.08969287196,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,465.11211608996,490.54793493862,510.98743222773,523.2511306012],"description":"19-tone 5-limit scale of the Kayenian Imperium on Kayolonia (reeks van Sjauriek)"},"kayolonian_12":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"See Barnard: De Keiaanse Muziek, p. 11. (uitgebreide reeks)"},"kayolonian_40":{"frequencies":[261.6255653006,267.90457886781,272.52663052146,275.93321340298,279.06726965397,290.69507255622,294.32876096318,297.67175429757,306.59245933664,310.07474405997,313.95067836072,319.36714514233,327.03195662575,331.11985608357,334.88072358477,340.65828815182,348.83408706747,353.19451315581,357.20610515709,363.36884069528,367.91095120397,372.08969287196,376.74081403286,383.2405741708,387.59343007496,392.4383479509,401.85686830172,408.78994578219,413.43299207996,418.60090448096,436.04260883433,441.49314144476,446.50763144636,459.88868900496,465.11211608996,470.92601754108,490.54793493862,496.11959049595,502.32108537715,510.98743222773,523.2511306012],"description":"See Barnard: De Keiaanse Muziek"},"kayolonian_f":{"frequencies":[261.6255653006,279.06726965397,306.59245933664,327.03195662575,348.83408706747,392.4383479509,418.60090448096,446.50763144636,490.54793493862,523.2511306012],"description":"Kayolonian scale F and periodicity block (128/125, 16875/16384)"},"kayolonian_p":{"frequencies":[261.6255653006,279.06726965397,306.59245933664,327.03195662575,348.83408706747,392.4383479509,418.60090448096,459.88868900496,490.54793493862,523.2511306012],"description":"Kayolonian scale P"},"kayolonian_s":{"frequencies":[261.6255653006,287.4304306281,306.59245933664,327.03195662575,359.28803828513,392.4383479509,418.60090448096,459.88868900496,490.54793493862,523.2511306012],"description":"Kayolonian scale S"},"kayolonian_t":{"frequencies":[261.6255653006,279.06726965397,297.67175429757,317.51653791741,348.83408706747,381.01984550089,418.60090448096,446.50763144636,476.27480687611,523.2511306012],"description":"Kayolonian scale T"},"kayolonian_z":{"frequencies":[261.6255653006,279.06726965397,297.67175429757,327.03195662575,348.83408706747,392.4383479509,418.60090448096,446.50763144636,476.27480687611,523.2511306012],"description":"Kayolonian scale Z"},"kayoloniana":{"frequencies":[261.6255653006,267.90457886781,279.06726965397,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,367.91095120397,372.08969287196,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,465.11211608996,490.54793493862,510.98743222773,523.2511306012],"description":"Amendment by Rasch of Kayolonian scale's note 9"},"kebyar-b":{"frequencies":[261.6255653006,280.40333801024,299.48910562989,384.37207420335,402.78320381033,523.2511306012],"description":"Gamelan Kebyar tuning begbeg, Andrew Toth, 1993"},"kebyar-s":{"frequencies":[261.6255653006,283.00682726281,309.51375468789,385.26118901859,416.26536455926,523.2511306012],"description":"Gamelan kebyar tuning sedung, Andrew Toth, 1993"},"kebyar-t":{"frequencies":[261.6255653006,293.15632631094,325.27731021818,397.46748834812,422.07621250312,523.2511306012],"description":"Gamelan kebyar tuning tirus, Andrew Toth, 1993"},"keenan":{"frequencies":[261.6255653006,279.77706779472,292.57243455474,305.95298478736,327.17991022208,349.87955533643,365.88099775759,391.26571058456,418.41160951721,437.54730686196,457.55816161244,489.30340830564,523.2511306012],"description":"Dave Keenan 31-ET mode has 3 4:5:6:7 tetrads + 3 inv. is Fokker's 12-tone mode"},"keenan2":{"frequencies":[261.6255653006,278.14493936283,295.70736791055,306.84360659709,326.21810583671,346.81593583087,369.99442271164,393.35634555235,418.19337019276,433.94238997708,461.34206956593,490.47180009913,523.2511306012],"description":"Dave Keenan strange 9-limit temperament TL 19-11-98"},"keenan3":{"frequencies":[261.6255653006,272.10155294862,282.99701916355,314.19580976213,326.77681046955,339.86157848985,377.32935907335,392.4383479509,408.1523292189,453.14877154631,471.29371440761,523.2511306012],"description":"Chain of 1/6 kleisma tempered 6/5s, 10 tetrads, Dave Keenan, 30-Jun-99, TD235"},"keenan3eb":{"frequencies":[261.6255653006,272.52625793573,283.88113057344,314.31833892864,327.41448875753,341.05629284549,377.62371824792,393.35750206077,409.74683779238,453.67913385439,472.5817850056,523.2511306012],"description":"Chain of 11 equal beating minor thirds, 6/5=3/2 same"},"keenan3eb2":{"frequencies":[261.6255653006,271.88912362492,282.55531921581,314.13446783,326.45794787121,339.26487744082,377.18204004818,391.97887331053,407.35618327602,452.88341485066,470.6500094,523.2511306012],"description":"Chain of 11 equal beating minor thirds, 6/5=3/2 opposite"},"keenan3j":{"frequencies":[261.6255653006,291.88463270656,302.72962012827,313.97755176024,350.29154279212,363.30663963964,405.32593044476,420.38583225541,436.00528786292,486.43275040712,504.50618240233,523.2511306012],"description":"Chain of 11 nearly just 19-tET minor thirds, Dave Keenan, 1-Jul-99"},"keenan7":{"frequencies":[261.6255653006,269.29177952703,279.86396690685,288.06460709314,296.5055443788,305.19382000629,314.13668154225,326.46944327063,336.03572815422,349.22823143301,359.46139971304,369.99442271164,380.8360868427,391.99543598175,407.38487419079,419.32216217931,435.78442404634,448.5538823653,461.69751437372,475.22628419761,489.15147723638,508.3551866238,523.2511306012],"description":"Dave Keenan, 22 out of 72-tET periodicity block. TL 29-04-2001"},"keenanmt":{"frequencies":[261.6255653006,279.93529690293,292.50627485027,305.64177427204,327.03195662575,349.91912034749,365.63284274659,391.22147055517,418.60090448096,437.39890198442,457.04105241293,489.02683710225,523.2511306012],"description":"Dave Keenan 1/4-comma tempered version of keenan with 6 7-limit tetrads"},"keenanst":{"frequencies":[261.6255653006,268.50609092997,277.46533822773,286.72352888229,294.26410920268,304.08282473376,314.22916151277,322.49311613356,333.25374941849,342.01803421352,353.43015577174,365.22306367425,374.82811589307,387.33500976677,397.52158713557,410.7856943143,424.4923875554,435.65616946139,450.19271626925,462.0323945472,477.44903730562,493.38008744487,506.35555615636,523.2511306012],"description":"Dave Keenan, 7-limit temperament, g=260.353"},"kelletat":{"frequencies":[261.6255653006,275.58617649731,292.98704147282,310.05056613125,327.14272545641,348.82502010853,367.43868454848,391.99543598175,413.39000965417,437.97145880542,465.08793784701,489.90551202062,523.2511306012],"description":"Herbert Kelletat's Bach-tuning (1967)"},"kellner":{"frequencies":[261.6255653006,275.62199471997,292.73769384471,310.07474405997,327.54963108844,348.83408706747,367.49599295996,391.37619916626,413.43299207996,437.91808280662,465.11211608996,491.32444638706,523.2511306012],"description":"Herbert Anton Kellner's Bach tuning. 5 1/5 Pyth. comma and 7 pure fifths"},"kellners":{"frequencies":[261.6255653006,275.84425785506,292.86986732103,310.2247482054,327.84547867349,348.89032888179,367.85164222246,391.46454285105,413.69968681881,438.2147004401,465.26210635182,491.68894399626,523.2511306012],"description":"Kellner's temperament with 1/5 synt. comma instead of 1/5 Pyth. comma"},"kepler1":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.89982010446,441.49314144476,470.92601754108,490.54793493862,523.2511306012],"description":"Kepler's Monochord no.1, Harmonices Mundi (1619)"},"kepler2":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,441.49314144476,470.92601754108,490.54793493862,523.2511306012],"description":"Kepler's Monochord no.2"},"kepler3":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.89982010446,441.49314144476,470.92601754108,496.67978412536,523.2511306012],"description":"Kepler's choice system, Harmonices Mundi, Liber III (1619)"},"kilroy":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,436.04260883433,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"Kilroy"},"kimball":{"frequencies":[261.6255653006,272.52663052146,275.93321340298,290.69507255622,294.32876096318,306.59245933664,327.03195662575,331.11985608357,348.83408706747,363.36884069528,367.91095120397,392.4383479509,408.78994578219,436.04260883433,441.49314144476,459.88868900496,465.11211608996,490.54793493862,523.2511306012],"description":"Buzz Kimball 18-note just scale"},"kimball_53":{"frequencies":[261.6255653006,277.01530443593,277.97716313189,279.06726965397,281.75060878526,283.42769574232,285.40970760065,287.78812183066,296.50897400735,299.00064605783,305.22982618403,307.79478270659,309.19384990071,313.95067836072,317.68818643644,319.76457981184,322.00069575458,327.03195662575,332.97799220076,338.57426097725,340.11323489078,342.12573923925,348.83408706747,359.73515228832,362.25078272391,366.27579142084,369.35373924791,370.63621750918,373.75080757229,377.90359432309,380.54627680087,392.4383479509,400.13321751856,402.50086969323,404.33041910093,411.12588832951,418.60090448096,425.14154361347,428.11456140098,430.91269578922,436.04260883433,442.75095666255,444.76346101102,448.50096908674,457.84473927605,461.69217405988,475.68284600109,479.64686971777,483.00104363188,485.87604984397,490.54793493862,492.47165233054,494.18162334558,523.2511306012],"description":"Buzz Kimball 53-note just scale"},"kirkwood":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,327.03195662575,348.83408706747,392.4383479509,436.04260883433,457.84473927605,523.2511306012],"description":"Scale based on Kirkwood gaps of the asteroid belt"},"kirn-stan":{"frequencies":[261.6255653006,276.16031892841,292.60754013883,310.68035879446,327.03195662575,348.83408706747,368.21375857121,392.4383479509,414.24047839262,437.1900893839,465.11211608996,490.54793493862,523.2511306012],"description":"Kirnberger temperament improved by Charles Earl Stanhope (1806)"},"kirnberger":{"frequencies":[261.6255653006,275.62199471997,292.50627485027,310.07474405997,327.03195662575,348.83408706747,367.91095120397,391.22147055517,413.43299207996,437.39890198442,465.11211608996,490.54793493862,523.2511306012],"description":"Kirnberger's well-temperament, also called Kirnberger III, letter to Forkel 1779"},"kirnberger1":{"frequencies":[261.6255653006,275.62199471997,294.32876096318,310.07474405997,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.43299207996,438.75944753732,465.11211608996,490.54793493862,523.2511306012],"description":"Kirnberger's temperament 1 (1766)"},"kirnberger2":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,310.07474405997,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.89982010446,438.75941205608,465.11211608996,490.54793493862,523.2511306012],"description":"Kirnberger 2: 1/2 synt. comma. \"Die Kunst des reinen Satzes\" (1774)"},"kirnberger3":{"frequencies":[261.6255653006,275.93321340298,292.50627485027,310.07474405997,327.03195662575,348.83408706747,367.91095120397,391.22147055517,413.89982010446,437.39890198442,465.11211608996,490.54793493862,523.2511306012],"description":"Kirnberger 3: 1/4 synt. comma (1744)"},"kirnberger3v":{"frequencies":[261.6255653006,275.93321340298,292.50063201309,310.07474405997,327.03195662575,348.83408706747,367.91095120397,391.21579858034,413.43299207996,437.39258595147,465.11211608996,490.54793493862,523.2511306012],"description":"Variant well-temperament like Kirnberger 3, Kenneth Scholz, MTO 4.4, 1998"},"klais":{"frequencies":[261.6255653006,275.62199471997,293.00227310437,310.07474405997,327.21690075602,348.83408706747,367.49599295996,391.99543598175,413.43299207996,438.01699797506,465.11211608996,489.99465727995,523.2511306012],"description":"Johannes Klais, Bach temperament"},"klonaris":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,392.4383479509,408.78994578219,425.14154361347,457.84473927605,490.54793493862,523.2511306012],"description":"Johnny Klonaris, 19-limit harmonic scale"},"knot":{"frequencies":[261.6255653006,268.26840191956,280.31310567921,286.15296204753,294.32876096318,299.00064605783,306.59245933664,327.03195662575,348.83408706747,357.69120255941,366.27579142084,367.91095120397,381.53728273004,392.4383479509,408.78994578219,418.60090448096,429.2294430713,436.04260883433,448.50096908674,457.84473927605,459.88868900496,476.92160341255,478.40103369253,490.54793493862,523.2511306012],"description":"Smallest knot in 3-D, American Scientist, Nov-Dec '97 p506-510, trefoil knot"},"koepf_36":{"frequencies":[261.6255653006,272.26348829648,274.95017225036,277.18263097687,288.45311779165,291.29956028699,293.66476791741,305.60543275312,308.62113352716,311.12698372208,323.77767743764,326.97270111135,329.62755691287,343.03050002254,346.41550969045,349.22823143301,363.4281550135,367.0144478307,369.99442271164,385.03871768789,388.83826257328,391.99543598175,407.93431128975,411.95978887118,415.30469757995,432.19134773437,436.45619266906,440,457.89078262597,462.40922843744,466.16376151809,485.11838543951,489.90551202062,493.88330125613,513.96502576833,519.03680970905,523.2511306012],"description":"Siegfried Koepf, 36-tone subset of 48-tone scale (1991)"},"koepf_48":{"frequencies":[261.6255653006,269.44737349144,272.26348829648,274.95017225036,277.18263097687,285.46954808622,288.45311779165,291.29956028699,293.66476791741,302.44445076078,305.60543275312,308.62113352716,311.12698372208,320.42873367481,323.77767743764,326.97270111135,329.62755691287,339.48241770075,343.03050002254,346.41550969045,349.22823143301,359.66909273781,363.4281550135,367.0144478307,369.99442271164,381.0561299374,385.03871768789,388.83826257328,391.99543598175,403.71490654806,407.93431128975,411.95978887118,415.30469757995,427.72104413038,432.19134773437,436.45619266906,440,453.15466093696,457.89078262597,462.40922843744,466.16376151809,480.10063929961,485.11838543951,489.90551202062,493.88330125613,508.64890891624,513.96502576833,519.03680970905,523.2511306012],"description":"Siegfried Koepf, 48-tone scale (1991)"},"kolinsky":{"frequencies":[261.6255653006,277.2273508585,293.75953199293,311.27759533081,329.84032939425,349.51003591412,370.35272620855,392.4383479509,415.84102607989,440.63929776914,466.91639276282,494.76049384407,524.26505360912],"description":"Kolinsky's 7th root of 3/2, also invented by Augusto Novaro"},"kora1":{"frequencies":[261.6255653006,293.66476791741,326.78388880949,349.22823143301,391.99543598175,440,489.62261321254,523.2511306012],"description":"Kora tuning Tomora Ba, also called Silaba, 1/1=F, R. King"},"kora2":{"frequencies":[261.6255653006,298.79793764201,315.65242990842,349.22823143301,391.99543598175,447.69106452518,472.94426956511,523.2511306012],"description":"Kora tuning Tomora Mesengo, also called Tomora, 1/1=F, R. King"},"kora3":{"frequencies":[261.6255653006,291.13134764929,330.58093469714,349.22823143301,391.99543598175,436.20415848357,495.31175393723,523.2511306012],"description":"Kora tuning Hardino, 1/1=F, R.King"},"kora4":{"frequencies":[261.6255653006,291.13134764929,330.58093469714,371.06455309218,391.99543598175,436.20415848357,495.31175393723,523.2511306012],"description":"Kora tuning Sauta, 1/1=F, R. King"},"korea_5":{"frequencies":[261.6255653006,294.32876096318,348.83408706747,392.4383479509,470.92601754108,523.2511306012],"description":"According to Lou Harrison, called \"the Delightful\" in Korea"},"kornerup":{"frequencies":[261.6255653006,272.97226153513,280.22976278938,292.38332274669,305.0639823888,313.17470478367,326.75708630452,340.92853547661,349.99278713323,365.17196824772,374.88056242272,391.13935185123,408.10305876469,418.95303445734,437.12302030357,456.08130156398,468.2068441924,488.51296691354,509.70006023951,523.2511306012],"description":"Kornerup's temperament with fifth of (15 - sqrt 5) / 22 octaves"},"kornerup_11":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Kornerup's doric minor"},"kraeh_22":{"frequencies":[261.6255653006,267.07609791103,274.70684356563,286.15296204753,294.32876096318,305.22982618403,313.95067836072,320.49131749323,336.37572681506,343.38355445704,353.19451315581,366.27579142084,381.53728273004,392.4383479509,400.61414686654,412.06026534844,436.04260883433,441.49314144476,457.84473927605,470.92601754108,488.36772189445,504.56359022259,523.2511306012],"description":"Kraehenbuehl & Schmidt 7-limit 22-tone tuning"},"kraeh_22a":{"frequencies":[261.6255653006,267.07609791103,269.10058145205,272.52663052146,274.70684356563,279.06726965397,280.31310567921,286.15296204753,294.32876096318,299.00064605783,305.22982618403,311.45900631024,313.95067836072,318.93402246168,320.49131749323,327.03195662575,336.37572681506,343.38355445704,348.83408706747,350.39138209902,353.19451315581,358.80077526939,366.27579142084,367.91095120397,373.75080757229,381.53728273004,392.4383479509,398.6675280771,400.61414686654,403.65087217807,408.78994578219,412.06026534844,418.60090448096,420.46965851882,436.04260883433,441.49314144476,448.50096908674,457.84473927605,467.18850946536,470.92601754108,476.92160341255,478.40103369253,488.36772189445,490.54793493862,498.33441009638,504.56359022259,523.2511306012],"description":"Kraehenbuehl & Schmidt 7-limit 22-tone tuning with \"inflections\" for some tones"},"kraeh_22b":{"frequencies":[261.6255653006,269.10058145205,279.06726965397,286.15296204753,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,358.80077526939,367.91095120397,381.53728273004,392.4383479509,408.78994578219,420.46965851882,436.04260883433,448.50096908674,457.84473927605,476.92160341255,490.54793493862,504.56359022259,523.2511306012],"description":"Best 22-tET approximation of KRAEH_22A"},"kring1":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,523.2511306012],"description":"Double-tie circular mirroring of 4:5:6 and Partch's 5-limit tonality Diamond"},"kring1p3":{"frequencies":[261.6255653006,267.90457886781,272.52663052146,279.06726965397,282.55561052465,290.69507255622,294.32876096318,301.39265122629,306.59245933664,310.07474405997,313.95067836072,327.03195662575,334.88072358477,340.65828815182,348.83408706747,353.19451315581,363.36884069528,367.91095120397,372.08969287196,376.74081403286,387.59343007496,392.4383479509,401.85686830172,408.78994578219,418.60090448096,436.04260883433,441.49314144476,446.50763144636,454.2110508691,465.11211608996,470.92601754108,484.4917875937,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"Third carthesian power of double-tie mirroring of 4:5:6 with kleismas removed"},"kring2":{"frequencies":[261.6255653006,299.00064605783,305.22982618403,348.83408706747,392.4383479509,448.50096908674,457.84473927605,523.2511306012],"description":"Double-tie circular mirroring of 6:7:8"},"kring2p3":{"frequencies":[261.6255653006,265.7783520514,271.31540105247,288.32205155576,294.32876096318,299.00064605783,305.22982618403,310.07474405997,329.51091606373,336.37572681506,343.38355445704,348.83408706747,356.10146388137,384.42940207435,392.4383479509,398.6675280771,406.97310157871,415.4517078616,441.49314144476,448.50096908674,457.84473927605,465.11211608996,474.80195184183,504.56359022259,515.07533168556,523.2511306012],"description":"Third power of 6:7:8 mirroring with 1029/1024 intervals removed"},"kring3":{"frequencies":[261.6255653006,305.22982618403,313.95067836072,366.27579142084,373.75080757229,436.04260883433,448.50096908674,523.2511306012],"description":"Double-tie circular mirroring of 3:5:7"},"kring3bp":{"frequencies":[261.6255653006,336.37572681506,366.27579142084,436.04260883433,470.92601754108,560.62621135843,610.45965236807,784.8766959018],"description":"Double-tie BP circular mirroring of 3:5:7"},"kring4":{"frequencies":[261.6255653006,299.00064605783,327.03195662575,366.27579142084,373.75080757229,418.60090448096,457.84473927605,523.2511306012],"description":"Double-tie circular mirroring of 4:5:7"},"kring4p3":{"frequencies":[261.6255653006,267.90457886781,273.37201925287,280.42990280658,286.15296204753,293.02063313667,299.00064605783,305.10270005901,320.49131749323,327.03195662575,334.88072358477,341.71502406609,350.53737850823,357.69120255941,366.27579142084,373.75080757229,382.72082695402,390.53145607553,400.61414686654,408.78994578219,418.60090448096,427.14378008261,448.68784449053,457.84473927605,467.18850946536,478.40103369253,488.16432009441,500.76768358318,510.98743222773,523.2511306012],"description":"Third power of 4:5:7 mirroring with 3136/3125 intervals removed"},"kring5":{"frequencies":[261.6255653006,290.69507255622,336.37572681506,366.27579142084,373.75080757229,406.97310157871,470.92601754108,523.2511306012],"description":"Double-tie circular mirroring of 5:7:9"},"kring5p3":{"frequencies":[261.6255653006,266.96486255163,272.4643387202,278.02483542877,284.8811711051,290.69507255622,296.68339105088,302.73815413355,308.91648380975,316.53463456122,322.99452506247,329.64821227876,336.37572681506,343.24053756638,351.70514951247,358.88280562497,366.27579142084,373.75080757229,381.45007420827,389.23476960028,398.83363954714,406.97310157871,415.27867508032,423.83341578697,432.48307733364,443.14848838571,452.19233508746,461.42075008924,470.92601754108,480.53675259294,492.38720931745,502.43592787495,512.78610798918,523.2511306012],"description":"Third power of 5:7:9 mirroring with 250047/250000 intervals removed"},"kring6":{"frequencies":[261.6255653006,305.22982618403,336.37572681506,348.83408706747,392.4383479509,406.97310157871,448.50096908674,523.2511306012],"description":"Double-tie circular mirroring of 6:7:9"},"kring6p3":{"frequencies":[261.6255653006,267.07609791103,271.31540105247,276.96780524107,288.32205155576,294.32876096318,299.00064605783,305.22982618403,310.07474405997,316.53463456122,324.36230800023,329.51091606373,336.37572681506,343.38355445704,348.83408706747,356.10146388137,361.75386806997,369.29040698809,378.42269266694,384.42940207435,392.4383479509,398.6675280771,406.97310157871,415.4517078616,422.04617941496,432.48307733364,441.49314144476,448.50096908674,457.84473927605,465.11211608996,474.80195184183,494.26637409559,504.56359022259,512.57253609913,523.2511306012],"description":"Third power of 6:7:9 mirroring with 118098/117649 intervals removed"},"krousseau":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,305.22982618403,343.38355445704,348.83408706747,366.27579142084,392.4383479509,406.97310157871,457.84473927605,465.11211608996,488.36772189445,523.2511306012],"description":"Kami Rousseau's tri-blues scale"},"krousseau2":{"frequencies":[261.6255653006,271.34627406517,291.88463270656,302.72962012827,337.74269681563,350.29154279212,363.30663963964,390.80553229045,405.32593044476,452.20508247496,469.00678383895,486.43275040712,523.2511306012],"description":"19-tET version of Kami Rousseau's tri-blues scale"},"kukuya":{"frequencies":[261.6255653006,307.37578701508,361.96165147221,412.67427966689,460.80941404108],"description":"African Kukuya Horns (aerophone, ivory, one note only)"},"kurzw_arab":{"frequencies":[261.6255653006,282.02769802256,290.29174037004,302.26980244078,321.16993719469,349.63190883464,374.94271441196,393.35634555235,411.95978887118,429.20598402782,447.69106452518,496.7443381147,523.2511306012],"description":"Kurzweil \"Empirical Arabic\""},"kurzw_harmp":{"frequencies":[261.6255653006,285.46954808622,287.62123438446,306.48933163909,308.79945157961,324.90175210669,345.81573716922,348.42227432308,427.72104413038,430.94493093825,458.94995811222,462.40922843744,523.2511306012],"description":"Kurzweil \"Empirical Bali/Java Harmonic Pelog\""},"kurzw_melp":{"frequencies":[261.6255653006,281.53940445957,283.98935579354,303.66981774726,307.02089761314,323.96475278212,344.02264297658,347.0163224393,421.10213511252,424.76655906637,451.06547253417,454.99063696457,523.2511306012],"description":"Kurzweil \"Empirical Bali/Java Melodic Pelog\""},"kurzw_slen":{"frequencies":[261.6255653006,266.96862289802,288.95340229325,306.66641795878,318.95145438803,352.26720984209,352.26720984209,389.06292924114,404.41509766528,429.20598402782,464.81937009253,474.03826620294,523.2511306012],"description":"Kurzweil \"Empirical Bali/Java Slendro, Siam 7\""},"kurzw_tibet":{"frequencies":[261.6255653006,270.53905136894,299.14332201883,312.9293240034,325.46525203475,353.69443592699,373.86139962101,397.69714089209,408.87792937274,438.98455767189,471.30800669535,489.90551202062,523.2511306012],"description":"Kurzweil \"Empirical Tibetian Ceremonial\""},"kwazy":{"frequencies":[13.75,13.8425266748,13.92142234948,14.00076777204,14.0805654254,14.16081788707,14.25610896047,14.337361936,14.41907801447,14.50125983535,14.58391005315,14.66703125278,14.76572882594,14.84988638999,14.93452361174,15.01964313826,15.10524789197,15.20689431811,15.29356631363,15.38073220905,15.46839499707,15.55655742089,15.66124080485,15.75050226619,15.84027256598,15.93055451337,16.0213510245,16.11266503216,16.22109048883,16.31354291552,16.40652227664,16.50003157548,16.59407373656,16.70573878851,16.80095347779,16.89671084507,16.99301388521,17.08986590459,17.18726993397,17.30292672931,17.40154500258,17.50072545316,17.60047118468,17.70078541898,17.81989766631,17.92146252619,18.023606257,18.12633215803,18.22964354736,18.35231459047,18.45691397115,18.56210951808,18.66790462912,18.77430261304,18.88130712282,19.00836345475,19.11670199894,19.22565790976,19.335234928,19.44543648263,19.57628896102,19.68786429416,19.80007566685,19.91292659048,20.02642071019,20.16118263857,20.27609169854,20.39165568498,20.50787833065,20.62476338959,20.74231451743,20.88189396397,21.00091073243,21.12060583931,21.24098302814,21.36204643183,21.50579618625,21.62836889778,21.75164008927,21.875613993,22.00029448845,22.14833914981,22.27457391904,22.40152829449,22.52920624893,22.65761190639,22.78674941445,22.94008616579,23.07083364148,23.202326315,23.33456843363,23.46756413327,23.62548236417,23.76013626908,23.89555763659,24.03175070206,24.16872014141,24.30647024079,24.47003364934,24.60950094889,24.74976328722,24.89082505353,25.03269080417,25.2011409598,25.3447753621,25.48922841152,25.63450477396,25.78060914191,25.95409219477,26.10201805756,26.25078702673,26.40040390759,26.55087337946,26.70220060843,26.88188539622,27.03509923475,27.18918616153,27.34415146685,27.5],"description":"Kwazy temperament, g=162.741892, p=600, 5-limit"},"lambdoma5_12":{"frequencies":[261.6255653006,21.80213044172,23.78414230005,26.16255653006,29.06950725562,32.70319566257,37.37508075723,43.60426088343,47.56828460011,52.32511306012,58.13901451124,65.40639132515,71.35242690016,74.75016151446,78.48766959018,87.20852176687,95.13656920022,98.10958698772,104.65022612024,109.01065220858,112.12524227169,116.27802902249,118.92071150027,130.8127826503,145.34753627811,149.50032302891,156.97533918036,163.51597831288,174.41704353373,186.87540378614,196.21917397545,209.30045224048,218.02130441717,261.6255653006,327.03195662575,348.83408706747,392.4383479509,436.04260883433,523.2511306012,654.0639132515,784.8766959018,1046.5022612024,1308.127826503],"description":"5x12 Lambdoma"},"lambdoma_prim":{"frequencies":[261.6255653006,8.43953436454,9.02157121726,11.37502457829,13.76976659477,15.38973913533,16.87906872907,18.04314243452,20.12504348466,22.75004915657,23.78414230005,25.31860309361,27.06471365179,27.53953318954,30.77947827066,34.12507373486,37.37508075723,40.25008696932,41.30929978431,42.19767182268,45.10785608631,46.16921740599,47.56828460011,52.32511306012,56.87512289143,59.07674055175,60.37513045398,63.15099852083,68.84883297384,71.35242690016,74.75016151446,76.94869567665,79.62517204801,87.20852176687,96.38836616338,100.62521742331,104.65022612024,107.72817394731,112.12524227169,118.92071150027,130.8127826503,140.87530439263,156.97533918036,166.48899610038,174.41704353373,186.87540378614,261.6255653006,366.27579142084,392.4383479509,436.04260883433,523.2511306012,610.45965236807,654.0639132515,784.8766959018,915.6894785521,1308.127826503,1831.3789571042],"description":"Prime Lambdoma"},"lambert":{"frequencies":[261.6255653006,276.15600972046,293.19138048956,310.67551062492,328.56569462012,349.50994910362,368.20801314466,391.67947347082,414.23401437362,438.93663604468,466.01326570444,491.89550004992,523.2511306012],"description":"Lambert's temperament (1774) 1/7 Pyth. comma, 5 pure"},"lara":{"frequencies":[261.6255653006,286.4606265643,298.28060863281,313.11013128311,341.05478972476,377.11473546037,395.40657391157,420.13030572059,450.02449304881,492.74350578058,523.2511306012,577.23956595248,599.67057787333],"description":"Sundanese 'multi-laras' gamelan Ki Barong tuning, Weintraub, TL 15-2-99 1/1=497"},"lebanon":{"frequencies":[261.6255653006,285.30470202322,311.12698372208,349.22823143301,391.99543598175,415.30469757995,466.16376151809,523.2511306012],"description":"Lebanese scale? Dastgah Shur"},"leedy":{"frequencies":[261.6255653006,269.80136421624,290.69507255622,294.32876096318,305.22982618403,327.03195662575,348.83408706747,359.73515228832,392.4383479509,436.04260883433,441.49314144476,457.84473927605,490.54793493862,523.2511306012],"description":"Douglas Leedy, scale for \"Pastorale\" (1987), 1/1=f, 10/9 only in vocal parts"},"leeuw1":{"frequencies":[261.6255653006,311.12698372208,349.22823143301,380.8360868427,415.30469757995,466.16376151809,508.3551866238,554.36526195375,604.53960488156,659.25511382574,739.98884542327,806.96355802011,880,987.76660251225],"description":"Ton de Leeuw: non-oct. mode from \"Car nos vignes sont en fleurs\",part 5. 1/1=A"},"leftpistol":{"frequencies":[261.6255653006,275.93321340298,279.06726965397,294.32876096318,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,436.04260883433,441.49314144476,490.54793493862,523.2511306012],"description":"Left Pistol"},"legros1":{"frequencies":[261.6255653006,274.22463192287,292.50627485027,309.49749487796,327.03195662575,348.83408706747,365.63284274659,391.22147055517,411.33694767869,437.39890198442,465.11211608996,489.02683710225,523.2511306012],"description":"Example of temperament with 3 just major thirds"},"legros2":{"frequencies":[261.6255653006,275.07759559501,292.50627485027,309.49749487796,327.03195662575,348.83408706747,366.77012764335,391.22147055517,412.61639318626,437.39890198442,465.11211608996,489.02683710225,523.2511306012],"description":"Example of temperament with 2 just major thirds"},"lehman-bach":{"frequencies":[261.6255653006,276.86979852503,293.00227310437,310.77584116741,328.14198392915,349.6228209638,369.15973155124,391.5530240856,414.83597850347,438.51190905657,465.63764214343,492.21297564769,523.2511306012],"description":"Brad Lehman's Bach keyboard temperament"},"lemba10":{"frequencies":[261.6255653006,283.65327551057,298.9489942119,324.1191713102,341.59697290141,370.35792032269,401.5404117335,423.19307614937,458.82405293702,483.56568031466,524.27976214079],"description":"10-note Lemba scale, Herman Miller"},"lemba12":{"frequencies":[261.6255653006,276.1173031791,283.29759227608,298.9897683987,323.75689816556,341.69016129748,369.99442271164,390.48883496177,400.64329718448,422.83538548023,457.86139629758,483.22286023634,523.2511306012],"description":"Lemba[12] in 270-et (poptimal)"},"lemba22":{"frequencies":[261.6255653006,268.42900262332,276.1173031791,283.29759227608,298.9897683987,306.76484424299,315.55115201964,323.75689816556,341.69016129748,350.57563899649,360.61677037127,369.99442271164,379.61593604418,390.48883496177,400.64329718448,422.83538548023,433.83100318771,446.25671880862,457.86139629758,483.22286023634,495.78882330645,509.98912747823,523.2511306012],"description":"Lemba[22] in 270-et (poptimal)"},"lemba24":{"frequencies":[261.6255653006,275.73346179752,283.65327551057,290.60211247891,298.9489942119,307.53562105228,315.06951922004,324.1191713102,332.05932738876,341.59697290141,351.40856549044,360.01724743313,370.35792032269,390.32910012969,401.5404117335,411.37720579947,423.19307614937,435.34833037897,446.01333880095,458.82405293702,470.06416125332,483.56568031466,497.45499966368,509.64147516102,524.27976214079],"description":"24-note Lemba scale for mapping millerlemba24.kbm"},"lemba8":{"frequencies":[261.6255653006,275.73334871592,283.6533803711,298.94898212432,307.53584843097,324.11927802481,341.59694330429,351.4088110982,370.358025147],"description":"Lemba temperament (4 down, 3 up) TOP tuning, Herman Miller, TL 22-11-2004"},"leusden":{"frequencies":[261.6255653006,275.54404190554,292.50627485027,310.51268695591,327.03195662575,349.91912034749,367.08095907728,391.22147055517,413.66634097248,437.39890198442,466.16376151809,489.02683710225,523.2511306012],"description":"Organ in Gereformeerde kerk De Koningshof, Henk van Eeken, 1984, a'=415, modif. 1/4 mean"},"leven":{"frequencies":[261.6255653006,279.06726965397,298.97057995496,313.95067836072,330.39003879965,348.83408706747,369.35382642901,392.4383479509,418.60090448096,448.46752658184,465.11211608996,502.32108537715,523.2511306012],"description":"Leven's monochord ?"},"ligon":{"frequencies":[261.6255653006,279.66870773512,292.40504357126,309.19384990071,329.87571277032,342.12573923925,366.27579142084,392.4383479509,411.12588832951,436.04260883433,462.87600014722,485.87604984397,523.2511306012],"description":"Jacky Ligon, strictly proper all prime scale, TL 08-09-2000"},"ligon2":{"frequencies":[261.6255653006,276.16031892841,292.40504357126,310.68035879446,331.39238271409,355.06326719367,382.37582620857,411.78935130154,441.2028763945,470.61640148747,500.02992658044,529.4434516734,558.85697676637],"description":"Jacky Ligon, 19-limit symmetrical non-octave scale, 2001"},"ligon3":{"frequencies":[261.6255653006,273.51763645063,286.54228580542,300.86940009569,316.70463167967,334.29933343966,341.25073734861,376.08675011961,401.15920012759,427.90314680276,471.58492637221,481.3910401531,508.13498682828,534.87893350345,561.62288017862,588.36682685379,615.11077352897],"description":"Jacky Ligon, 23-limit non-octave scale (2001)"},"ligon4":{"frequencies":[261.6255653006,278.49926570678,289.46759601673,308.13698517552,320.27237341115,340.92853547661,362.91692931321,386.32347802158,401.53832428939,427.43578342293,444.26952759254,472.92296174596,491.54841572131,523.2511306012,556.99853141357,592.92249142473,616.27397035104,640.54474682231,681.85707095323,725.83385862642,754.41987838254,803.07664857879],"description":"Jacky Ligon, 2/1 Phi Scale, TL 12-04-2001"},"ligon5":{"frequencies":[261.6255653006,273.22765669781,280.653851324,293.09977429907,314.41721066027,328.36040925687,337.28508524374,352.24238645938,377.86132347501,394.61802538749,405.34378524393,423.31898451752,454.1076550834,474.24531572837,487.13535379632,508.73764640933,545.73895363303],"description":"Jacky Ligon, scale for \"Two Golden Flutes\" (2001)"},"ligon6":{"frequencies":[261.6255653006,280.653851324,293.09977429907,314.41721066027,328.36040925687,352.24238645938,377.86132347501,394.61802538749,423.31898451752,442.09155952525,474.24531572837,508.73764640933,531.29821178855,569.94005600595],"description":"Jacky Ligon, \"Primal Golden Tuning\" (2001)"},"ligon7":{"frequencies":[261.6255653006,294.32876096318,321.08592105074,361.22166118208,394.05999401681,443.31749326891,483.61908356609,527.58445479937],"description":"Jacky Ligon, 7 tone, 27/22=generator, MMM 22-01-2002"},"lindley_ea":{"frequencies":[261.6255653006,275.62199471997,293.00227310437,310.07474405997,328.14198392915,349.6228209638,367.9112241576,391.5530240856,413.43299207996,438.51190905657,465.63764214343,491.10256480205,523.2511306012],"description":"Mark Lindley +J. de Boer +W. Drake (1991), for organ Grosvenor Chapel, London"},"lindley_sf":{"frequencies":[261.6255653006,276.24519242498,293.00227310437,310.07474405997,328.14198392915,349.6228209638,368.32692341742,391.5530240856,413.90012676351,438.51190905657,465.63764214343,491.10256480205,523.2511306012],"description":"Lindley (1988) suggestion nr. 2 for Stanford Fisk organ"},"ling-lun":{"frequencies":[261.6255653006,279.38237857051,294.32876096318,314.30517589183,331.11985608357,353.59332287831,372.50983809402,392.4383479509,419.07356785577,441.49314144476,471.45776383774,496.67978412536,523.2511306012],"description":"Scale of Ling Lun from C"},"liu_major":{"frequencies":[261.6255653006,290.69507255622,322.99452506247,348.83408706747,392.4383479509,436.04260883433,484.4917875937,523.2511306012],"description":"Linus Liu's Major Scale, see his 1978 book, \"Intonation Theory\""},"liu_mel":{"frequencies":[261.6255653006,290.69507255622,313.95067836072,348.83408706747,392.4383479509,423.83341578697,436.04260883433,470.92601754108,484.4917875937,523.2511306012],"description":"Linus Liu's Melodic Minor, use 5 and 7 descending and 6 and 8 ascending"},"liu_minor":{"frequencies":[261.6255653006,290.69507255622,313.95067836072,348.83408706747,387.59343007496,418.60090448096,484.4917875937,523.2511306012],"description":"Linus Liu's Harmonic Minor"},"liu_pent":{"frequencies":[261.6255653006,294.32876096318,331.11985608357,353.19451315581,392.4383479509,441.49314144476,496.67978412536,529.79176973372],"description":"Linus Liu's \"pentatonic scale\""},"lorina":{"frequencies":[261.6255653006,271.31540105247,293.02063313667,305.22982618403,313.95067836072,348.83408706747,348.83408706747,385.55346465352,406.97310157871,457.84473927605,457.84473927605,465.11211608996,523.2511306012],"description":"Lorina"},"lt46a":{"frequencies":[261.6255653006,265.62583852249,273.73233506765,277.91772325275,286.39934942254,290.77841553921,299.65253047503,308.79746990018,313.51900484808,323.08712797864,328.02715279963,338.03804253716,348.35444940179,353.68081538041,364.47461587782,370.04745828823,381.3407438317,387.1714705201,398.98735486934,411.16384203565,417.45056598488,430.19052226982,436.76816801564,450.09766813034,463.83396431287,470.92601754108,485.29796386361,492.71820372913,507.75521382755,523.2511306012],"description":"13-limit temperament, minimax g=495.66296 cents"},"lucy_19":{"frequencies":[261.6255653006,272.17716319349,280.81422591737,292.13972001074,301.4102593031,313.56641022552,326.2128298123,336.56461921066,350.13857756143,364.25998604447,375.81913491042,390.97626371576,406.74469336313,419.65201956185,436.57696862128,450.43096951372,468.59726172356,487.49621708267,502.96605061019,523.2511306012],"description":"Lucy's 19-tone scale"},"lucy_24":{"frequencies":[261.6255653006,269.92785558198,272.17712546173,280.81425349217,292.13970819848,301.41031849758,303.92192719902,313.56642833783,326.21280343239,336.56467170065,339.36921655583,350.13858362887,364.25994396351,375.81917832675,390.97625694066,403.38329512334,406.744629928,419.65205349792,436.57694340361,450.43105016925,454.18442712942,468.59728067062,487.49616921257,502.96612033609,523.2511306012],"description":"Lucy/Harrison, meantone tuning from Bbb to Cx, third=1200.0/pi, 1/1=A"},"lucy_31":{"frequencies":[261.6255653006,269.92785558198,272.17712546173,280.81425349217,283.15423815518,292.13970819848,301.41031849758,303.92192719902,313.56642833783,323.51698308414,326.21280343239,336.56467170065,339.36921655583,350.13858362887,361.24970022276,364.25994396351,375.81917832675,378.95082751155,390.97625694066,403.38329512334,406.744629928,419.65205349792,432.96907456701,436.57694340361,450.43105016925,454.18442712942,468.59728067062,483.46750424654,487.49616921257,502.96612033609,507.15726445705,523.2511306012],"description":"Lucy/Harrison's meantone tuning, 1/1=A"},"lucy_7":{"frequencies":[261.6255653006,292.13972001074,326.2128298123,350.13857756143,390.97626371576,436.57696862128,487.49621708267,523.2511306012],"description":"Diatonic Lucy's scale"},"lumma5":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,306.59245933664,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,436.04260883433,459.88868900496,490.54793493862,523.2511306012],"description":"Carl Lumma's 5-limit version of lumma7, also Fokker 12-tone just."},"lumma7":{"frequencies":[261.6255653006,279.06726965397,293.02063313667,305.22982618403,327.03195662575,348.83408706747,366.27579142084,390.69417751556,418.60090448096,436.04260883433,457.84473927605,488.36772189445,523.2511306012],"description":"Carl Lumma's 7-limit 12-tone scale, a.k.a GW Smith's Prism. TL 21-11-98"},"lumma7t":{"frequencies":[261.6255653006,279.68948643792,293.67396186758,305.56991806333,326.66797434652,349.22276480589,366.68390442934,392.00157215927,419.06732091375,436.04260883433,457.84473927605,489.45662770953,523.2511306012],"description":"Tempered lumma7, 6 tetrads + 4 triads within 2c of Just, TL 19-2-99"},"lumma7t72":{"frequencies":[261.6255653006,279.86396690685,293.66476791741,305.19382000629,326.46944327063,349.22823143301,366.44956000397,391.99543598175,419.32216217931,435.78442404634,457.27406033445,489.15147723638,523.2511306012],"description":"72-tET version of lumma7t"},"lumma7t_keen":{"frequencies":[261.6255653006,279.95098841649,293.39965821869,305.14186035122,326.51537799354,349.38597341375,366.17023517096,391.81845653432,419.26317124465,436.04260556019,456.98979229899,488.99939844699,523.2511306012],"description":"Dave Keenan's adaptation of lumma7t to include 6:8:11, TL 17-04-9"},"lumma_10":{"frequencies":[261.6255653006,281.2143451833,302.26980244078,324.90175210669,349.22823143301,375.37611551499,391.99543598175,421.34544350737,452.89298412314,486.80259447109,523.2511306012],"description":"Carl Lumma's 10-tone 125 cent Pyth. scale, TL 29-12-1999"},"lumma_12_fun":{"frequencies":[261.6255653006,276.16031892841,293.246794009,310.68035879446,327.94037872749,348.23056788569,368.93292606842,390.99572534534,413.52379936426,439.8701910135,464.30742384759,491.05951174505,522.34585182853],"description":"Rational well temperament based on 577/289, 3/2, and 19/16."},"lumma_12_moh-ha-ha":{"frequencies":[261.6255653006,276.16031892841,293.42033886144,310.68035879446,330.09788121912,349.51540364377,368.93292606842,391.72740891476,414.24047839262,440.13050829216,466.02053819169,493.4335110265,523.2511306012],"description":"Rational well temperament."},"lumma_12_strangeion":{"frequencies":[261.6255653006,277.97716313189,292.40504357126,310.68035879446,330.09788121912,349.23197505989,368.93292606842,391.9912339477,414.71297038361,440.63253103259,468.17206422213,492.47165233054,523.2511306012],"description":"19-limit \"dodekaphonic\" scale."},"lumma_22":{"frequencies":[261.6255653006,263.29318697558,262.98919438538,262.83732973433,262.68555277841,262.53386346698,263.29318697558,262.38226174944,262.98919438538,262.23074757519,263.29318697558,262.68555277841,262.07932089369,263.29318697558,262.83732973433,263.59753095473,262.38226174944,263.44531501617,262.68555277841,262.98919438538,263.29318697558,263.902226729,261.92798165442],"description":"Carl Lumma, intervals of attraction by trial and error, 1999."},"lumma_5151":{"frequencies":[261.6255653006,276.7826524273,292.81785438923,309.78204413166,327.729041887,346.71578592374,369.67398581173,391.09077971329,413.74834001613,437.71854962063,463.0774559108,489.90551202062,522.3451906503],"description":"Carl Lumma's 5151 temperament III (1197/709.5/696). June 2003"},"lumma_al1":{"frequencies":[261.6255653006,274.63272075836,292.81785438923,309.78204413166,327.729041887,346.71578592374,366.8025131876,391.09077971329,413.74834001613,437.71854962063,463.0774559108,489.90551202062,522.3451906503],"description":"Alaska I (1197/709.5/696), Carl Lumma, 6 June 2003."},"lumma_al2":{"frequencies":[261.6255653006,275.18850165466,292.98704147282,310.05056613125,328.10786809908,347.216824829,367.43868454848,391.20374747207,413.98739946535,438.09796819065,463.6127330944,490.61347436729,522.3451906503],"description":"Alaska II (1197/707/696.5), Carl Lumma, 6 June 2003."},"lumma_al3":{"frequencies":[261.6255653006,275.18850165466,292.98704147282,310.05056613125,328.10786809908,349.32910706765,367.43868454848,391.20374747207,413.98739946535,438.09796819065,463.6127330944,490.61347436729,522.3451906503],"description":"Alaska III (1197/707/696.5), Carl Lumma, 6 June 2003."},"lumma_al4":{"frequencies":[261.6255653006,276.38325105256,293.32570896007,309.87152561537,328.86683469969,349.02656754477,368.7143392539,391.31674786192,413.39000965417,438.73106346722,464.55095742407,491.89038573682,522.04355935974],"description":"Alaska IV (1196/701/697), Carl Lumma, 6 June 2003."},"lumma_al5":{"frequencies":[261.6255653006,276.84261239447,293.89809826895,310.99222741882,329.08061019985,349.35433052883,369.67398581173,391.17550247358,415.27471248744,439.42852501549,464.98720675925,493.63374591774,522.3451906503],"description":"Alaska V (1197/702/696.375), Carl Lumma, 6 June 2003."},"lumma_al6":{"frequencies":[261.6255653006,276.86260193655,293.83444433876,310.94732162256,329.05685050583,349.22823143301,369.56723519412,391.09077971329,415.06487744922,439.23819834286,464.81937009253,493.31307433255,522.04355935974],"description":"Alaska VI (1196/701/696), Carl Lumma, 6 June 2003."},"lumma_al7":{"frequencies":[261.6255653006,276.11677207256,293.26810788146,310.16878953668,328.73958549954,348.42227432308,368.499294457,391.39134599911,413.94674961638,438.72852926454,464.99660740427,491.79379203259,522.3451906503],"description":"Alaska VII, Carl Lumma, 27 Jan 2004"},"lumma_dec1":{"frequencies":[261.6255653006,286.10322937235,299.18791603519,327.17991022208,342.14320575162,374.15409293384,391.26571058456,427.87249484695,457.55816161244,489.30340830564,523.2511306012],"description":"Carl Lumma, two 5-tone 7/4-chains, 5/4 apart in 31-tET, TL 9-2-2000"},"lumma_dec2":{"frequencies":[261.6255653006,286.10322937235,292.57243455474,327.17991022208,342.14320575162,382.6142546815,391.26571058456,437.54730686196,457.55816161244,511.68128147674,523.2511306012],"description":"Carl Lumma, two 5-tone 3/2-chains, 7/4 apart in 31-tET, TL 9-2-2000"},"lumma_magic":{"frequencies":[261.6255653006,293.02063313667,299.00064605783,313.95067836072,327.03195662575,348.83408706747,366.27579142084,373.75080757229,418.60090448096,436.04260883433,457.84473927605,467.18850946536,523.2511306012],"description":"Magic chord test, Carl Lumma, TL 24-06-99"},"lumma_synchtrines+2":{"frequencies":[261.6255653006,277.1478691313,293.59111644706,311.009943641,329.46223568632,349.00930447981,369.71610741159,391.65144749868,414.88821865981,439.50363030131,465.57948255979,493.20241832805,522.46423212702],"description":"The 12-tone equal temperament with 2:3:4 brats of +2"},"lumma_synchtrines-2":{"frequencies":[261.6255653006,277.19623399848,293.69359242342,311.17279259662,329.69226891672,349.31393351076,370.10338321153,392.13011885309,415.46777761785,440.19437666896,466.39258399594,494.14997995304,523.55935978973],"description":"The 12-tone equal temperament with 2:3:4 brats of -2"},"lydian_chrom":{"frequencies":[261.6255653006,275.39533189537,290.69507255622,307.79478270659,317.12189733406,327.03195662575,373.75080757229,402.50086969323,418.60090448096,427.14378008261,436.04260883433,475.68284600109,523.2511306012,550.79066379074,581.39014511244,615.58956541318,634.24379466812,654.0639132515,747.50161514457,805.00173938646,837.20180896192,854.28756016522,872.08521766867,951.36569200218,1046.5022612024],"description":"Lydian Chromatic Tonos"},"lydian_chrom2":{"frequencies":[261.6255653006,272.09058791262,283.42769574232,340.11323489078,377.90359432309,400.13321751856,425.14154361347,523.2511306012],"description":"Schlesinger's Lydian Harmonia in the chromatic genus"},"lydian_chrominv":{"frequencies":[261.6255653006,271.68808704293,281.75060878526,362.25078272391,402.50086969323,422.62591317789,442.75095666255,523.2511306012],"description":"A harmonic form of Schlesinger's Chromatic Lydian inverted"},"lydian_diat":{"frequencies":[261.6255653006,275.39533189537,290.69507255622,327.03195662575,348.83408706747,373.75080757229,387.59343007496,402.50086969323,436.04260883433,455.00098313148,475.68284600109,498.33441009638,523.2511306012,550.79066379074,581.39014511244,654.0639132515,697.66817413493,747.50161514457,852.70554616492,805.00173938646,872.08521766867,910.00196626296,951.36569200218,996.66882019276,1046.5022612024],"description":"Lydian Diatonic Tonos"},"lydian_diat2":{"frequencies":[261.6255653006,283.42769574232,309.19384990071,340.11323489078,358.01393146398,377.90359432309,425.14154361347,485.87604984397,523.2511306012],"description":"Schlesinger's Lydian Harmonia, a subharmonic series through 13 from 26"},"lydian_diat2inv":{"frequencies":[261.6255653006,281.75060878526,322.00069575458,362.25078272391,382.37582620857,402.50086969323,442.75095666255,483.00104363188,523.2511306012],"description":"Inverted Schlesinger's Lydian Harmonia, a harmonic series from 13 from 26"},"lydian_diatcon":{"frequencies":[261.6255653006,283.42769574232,309.19384990071,340.11323489078,358.01393146398,425.14154361347,485.87604984397,523.2511306012],"description":"A Lydian Diatonic with its own trite synemmenon replacing paramese"},"lydian_enh":{"frequencies":[261.6255653006,275.39533189537,290.69507255622,299.00064605783,303.33398875432,307.79478270659,373.75080757229,402.50086969323,410.39304360878,414.45634107026,418.60090448096,475.68284600109,523.2511306012,550.79066379074,581.39014511244,598.00129211566,606.66797750864,615.58956541318,747.50161514457,805.00173938646,820.78608721757,828.91268214051,837.20180896192,951.36569200218,1046.5022612024],"description":"Lydian Enharmonic Tonos"},"lydian_enh2":{"frequencies":[261.6255653006,266.75547834571,272.09058791262,340.11323489078,377.90359432309,388.70083987518,400.13321751856,523.2511306012],"description":"Schlesinger's Lydian Harmonia in the enharmonic genus"},"lydian_enhinv":{"frequencies":[261.6255653006,266.65682617177,271.68808704293,362.25078272391,402.50086969323,412.56339143556,422.62591317789,523.2511306012],"description":"A harmonic form of Schlesinger's Enharmonic Lydian inverted"},"lydian_pent":{"frequencies":[261.6255653006,269.93113880221,283.42769574232,340.11323489078,377.90359432309,395.48050568695,425.14154361347,523.2511306012],"description":"Schlesinger's Lydian Harmonia in the pentachromatic genus"},"lydian_pis":{"frequencies":[261.6255653006,290.69507255622,327.03195662575,373.75080757229,402.50086969323,436.04260883433,475.68284600109,523.2511306012,550.79066379074,581.39014511244,654.0639132515,747.50161514457,805.00173938646,872.08521766867,951.36569200218,1046.5022612024],"description":"The Diatonic Perfect Immutable System in the Lydian Tonos"},"lydian_tri":{"frequencies":[261.6255653006,268.51044859798,275.76748774928,340.11323489078,377.90359432309,392.4383479509,408.13588186894,523.2511306012],"description":"Schlesinger's Lydian Harmonia in the first trichromatic genus"},"lydian_tri2":{"frequencies":[261.6255653006,268.51044859798,283.42769574232,340.11323489078,377.90359432309,392.4383479509,425.14154361347,523.2511306012],"description":"Schlesinger's Lydian Harmonia in the second trichromatic genus"},"nachbaur_6":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,392.4383479509,457.84473927605,523.2511306012],"description":"Fred Nachbaur's harmonic hexatonic, as used in \"Void of Sensation\""},"nassarre":{"frequencies":[261.6255653006,277.66336828161,294.34406205295,311.66659310186,331.15428443044,350.6431449633,372.56793743951,394.49404533893,419.16071913933,443.82887286778,471.58032351597,495.88429116026,523.2511306012],"description":"Nassarre's Equal Semitones"},"negri5_19":{"frequencies":[261.6255653006,271.22480440713,281.41555648081,291.74090527404,302.70251050738,313.80889368201,325.59966315504,337.54616011163,350.22880998446,363.07896889448,376.72096510961,390.54314115106,405.21705098851,420.08476989056,435.86864979507,451.86099895106,468.83881245397,486.04086171852,504.30291533224,523.2511306012],"description":"Negri temperament, g=126.238272, 5-limit"},"negri_19":{"frequencies":[261.6255653006,269.02825605326,281.18681366715,289.14299126725,302.21061955257,310.76166549402,324.80633749066,333.99672707734,349.09149261831,358.96903024071,375.19240283292,392.14898023137,403.24482870584,421.46921730446,433.39468387282,452.98167562873,465.79878414581,486.85025820508,500.62567766841,523.2511306012],"description":"Negri temperament, 13-limit, g=124.831"},"negri_29":{"frequencies":[261.6255653006,269.02825605326,276.64040740805,281.18681366715,289.14299126725,297.32428710198,302.21061955257,310.76166549402,319.55466133443,324.80633749066,333.99672707734,343.44715857517,349.09149261831,358.96903024071,369.1260526158,375.19240283292,385.80846524917,392.14898023137,403.24482870584,414.65463641221,421.46921730446,433.39468387282,445.65757880387,452.98167562873,465.79878414581,478.97855252217,486.85025820508,500.62567766841,514.79087238232,523.2511306012],"description":"Negri temperament, 13-limit, g=124.831"},"neid-mar-morg":{"frequencies":[261.6255653006,277.49581689502,293.99657683935,311.12698372208,329.99999983505,349.6228209638,369.99442271164,392.4383479509,415.77394625748,440,466.69047534984,494.44133512215,523.2511306012],"description":"Neidhardt-Marpurg-de Morgan temperament (1858)"},"neidhardt1":{"frequencies":[261.6255653006,276.24519242498,293.00227310437,310.42509491746,328.14198392915,348.83408706747,368.32692341742,391.5530240856,414.36778843034,438.51190905657,465.11211608996,491.65745674141,523.2511306012],"description":"Neidhardt I temperament (1724)"},"neidhardt2":{"frequencies":[261.6255653006,276.55731914056,293.00227310437,310.77584116741,328.51274831708,349.22823143301,369.15973155124,391.5530240856,414.36778843034,438.51190905657,466.16376151809,492.7691222293,523.2511306012],"description":"Neidhardt II temperament (1724)"},"neidhardt3":{"frequencies":[261.6255653006,276.55731914056,293.00227310437,310.77584116741,328.51274831708,348.83408706747,369.15973155124,391.5530240856,414.36778843034,438.51190905657,465.63764214343,492.7691222293,523.2511306012],"description":"Neidhardt III temperament (1724) 'Grosse Stadt'"},"neidhardt4":{"frequencies":[261.6255653006,277.18263097687,293.66476791741,311.12698372208,329.62755691287,349.22823143301,369.99442271164,391.99543598175,415.30469757995,440,466.16376151809,493.88330125613,523.2511306012],"description":"Neidhardt IV temperament (1724), equal temperament"},"neidhardtn":{"frequencies":[261.6255653006,276.86979852503,293.66476791741,310.77584116741,329.62755691287,348.83408706747,369.99442271164,391.5530240856,415.30469757995,439.50340943686,466.16376151809,493.32589719545,523.2511306012],"description":"Johann Georg Neidhardt's temperament (1732), alt. 1/6 & 0 P, also Marpurg nr.10"},"neogeb24":{"frequencies":[261.6255653006,270.11478301563,282.39420473706,291.55732426372,295.23185084282,304.81152420286,308.65309481038,318.66826025208,333.15492371116,343.96512368902,348.30015108876,359.6017829051,375.94928703407,388.14807710176,393.03994675222,405.79329398283,424.24066266408,438.00640969567,443.52664897728,457.91818970179,463.68937649142,478.73515685363,500.49846361623,516.73862125829,523.2511306012],"description":"Neo-Gothic e-based lineotuning (T/S or Blackwood's R=e, ~2.71828), 24 notes"},"neogji12":{"frequencies":[261.6255653006,282.52678126125,294.32876096318,317.84262891891,332.97799220076,348.83408706747,374.60024122586,392.4383479509,423.79017189188,441.49314144476,443.97065626768,499.46698830115,523.2511306012],"description":"M. Schulter, neo-Gothic 12-note JI (prim. 2/3/7/11) 1/1=F with Eb key as D+1"},"neogp16a":{"frequencies":[261.6255653006,274.38778799819,281.28352228595,295.02457363685,309.19384990071,317.19205704586,332.33517754401,348.83408706747,366.27579142084,374.86334014511,392.4383479509,411.12588832951,422.62591317789,442.75095666255,464.34856430463,498.91386871277,523.2511306012],"description":"M. Schulter, scale from mainly prime-to-prime ratios and octave complements (Gb-D#)"},"neutr_diat":{"frequencies":[261.6255653006,294.32876096318,320.24370022528,348.83408706747,392.4383479509,427.47405410759,479.82340237272,523.2511306012],"description":"Neutral Diatonic, 9 + 9 + 12 parts, geometric mean of major and minor"},"neutr_pent1":{"frequencies":[261.6255653006,302.32287545847,348.83408706747,392.4383479509,453.48431318771,523.2511306012],"description":"Quasi-Neutral Pentatonic 1, 15/13 x 52/45 in each trichord, after Dudon"},"neutr_pent2":{"frequencies":[261.6255653006,301.87565226992,348.83408706747,392.4383479509,452.81347840488,523.2511306012],"description":"Quasi-Neutral Pentatonic 2, 15/13 x 52/45 in each trichord, after Dudon"},"new_enh":{"frequencies":[261.6255653006,264.89588486686,279.06726965397,348.83408706747,392.4383479509,397.34382730029,418.60090448096,523.2511306012],"description":"New Enharmonic"},"new_enh2":{"frequencies":[261.6255653006,327.03195662575,331.11985608357,348.83408706747,392.4383479509,490.54793493862,496.67978412536,523.2511306012],"description":"New Enharmonic permuted"},"newcastle":{"frequencies":[261.6255653006,273.65745935891,291.9012907804,312.65334602246,327.03195662575,350.28154752005,366.3906401674,390.81668391305,410.48618883318,436.04260883433,467.04206359353,490.54793493862,523.2511306012],"description":"Newcastle modified 1/3-comma meantone"},"norden":{"frequencies":[261.6255653006,274.87601291722,292.73769384471,310.07474405997,327.54963108844,349.78078158391,366.5013507395,391.37619916626,412.31401916973,437.91808280662,466.37437567834,489.99465727995,523.2511306012],"description":"Reconstructed Schnitger temperament, organ in Norden. Ortgies, 2002"},"novaro":{"frequencies":[261.6255653006,274.70684356563,279.06726965397,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,490.54793493862,498.33441009638,523.2511306012],"description":"9-limit diamond with 21/20, 16/15, 15/8 and 40/21 added for evenness"},"novaro15":{"frequencies":[261.6255653006,279.06726965397,280.31310567921,281.75060878526,283.42769574232,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,301.87565226992,305.22982618403,309.19384990071,313.95067836072,319.76457981184,322.00069575458,327.03195662575,332.97799220076,336.37572681506,340.11323489078,348.83408706747,356.76213450082,359.73515228832,362.25078272391,366.27579142084,373.75080757229,377.90359432309,380.54627680087,383.71749577421,392.4383479509,402.50086969323,406.97310157871,411.12588832951,418.60090448096,425.14154361347,428.11456140098,436.04260883433,442.75095666255,448.50096908674,453.48431318771,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,483.00104363188,485.87604984397,488.36772189445,490.54793493862,523.2511306012],"description":"1-15 diamond, see Novaro, 1927, Sistema Natural base del Natural-Aproximado, p"},"novaro_eb":{"frequencies":[261.6255653006,277.27733921611,293.70273468471,311.34510173929,329.85947563084,349.74559786079,370.61463194963,392.51515715445,416.03831243363,440.72414616847,467.23897542105,495.06435356607,524.26505360912],"description":"Novaro (?) equal beating 4/3 with strectched octave, almost pure 3/2"},"janke1":{"frequencies":[261.6255653006,276.38325105256,293.32570896007,310.58830860439,328.86683469969,349.02656754477,368.7143392539,391.76907592069,414.34624765043,439.23819834286,465.62553897253,492.45896815637,523.2511306012],"description":"Rainer Janke, Temperatur I"},"janke2":{"frequencies":[261.6255653006,276.38325105256,292.98704147282,310.58830860439,328.48713220126,349.02656754477,368.7143392539,391.54284657258,414.34624765043,438.73106346722,465.62553897253,491.89038573682,523.2511306012],"description":"Rainer Janke, Temperatur II"},"janke3":{"frequencies":[261.6255653006,276.22365192501,292.98704147282,310.40895756597,328.29744538229,349.02656754477,368.50142299854,391.54284657258,414.10698098223,438.47771564426,465.62553897253,491.60634075178,523.2511306012],"description":"Rainer Janke, Temperatur III"},"janke4":{"frequencies":[261.6255653006,275.90473010106,292.98704147282,310.76776326996,328.10786809908,349.22823143301,368.07595926604,391.54284657258,413.86785247997,438.47771564426,465.89457252293,491.32245979018,523.2511306012],"description":"Rainer Janke, Temperatur IV"},"janke5":{"frequencies":[261.6255653006,275.58617649731,292.98704147282,310.05056613125,328.10786809908,348.82502010853,367.43868454848,391.54284657258,413.39000965417,438.47771564426,465.08793784701,491.0387427573,523.2511306012],"description":"Rainer Janke, Temperatur V"},"janke6":{"frequencies":[261.6255653006,275.74540729824,292.98704147282,310.58830860439,328.10786809908,349.43001184052,367.65098676472,391.54284657258,413.86785247997,438.47771564426,465.89457252293,491.0387427573,523.2511306012],"description":"Rainer Janke, Temperatur VI"},"janke7":{"frequencies":[261.6255653006,275.42703764514,292.81785438923,311.12698372208,327.91840028839,349.63190883464,367.0144478307,391.54284657258,413.62886206386,438.22451411849,467.24207374344,490.75518955849,523.2511306012],"description":"Rainer Janke, Temperatur VII"},"jemblung1":{"frequencies":[261.6255653006,298.87388797409,337.89601991959,388.44742741354,452.30188977628,523.2511306012],"description":"Scale of bamboo gamelan jemblung from Kalijering, slendro-like. 1/1=590 Hz."},"jemblung2":{"frequencies":[261.6255653006,300.03885820455,355.06324470257,391.40016308218,451.61555914985,523.2511306012],"description":"Bamboo gamelan jemblung at Royal Batavia Society. 1/1=504 Hz."},"ji_10coh":{"frequencies":[261.6255653006,283.42769574232,299.7792935736,327.03195662575,348.83408706747,370.63621750918,392.4383479509,436.04260883433,457.84473927605,485.0974023282,523.2511306012],"description":"Differentially coherent 10-tone scale"},"ji_10coh2":{"frequencies":[261.6255653006,305.22982618403,313.95067836072,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,470.92601754108,479.64686971777,523.2511306012],"description":"Other diff. coherent 10-tone scale"},"ji_11":{"frequencies":[261.6255653006,276.96780524107,294.32876096318,316.53463456122,336.37572681506,356.10146388137,384.42940207435,406.97310157871,432.48307733364,465.11211608996,494.26637409559,523.2511306012],"description":"3 and 7 prime rational interpretation of 11-tET. OdC 2000"},"ji_12":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Basic JI with 7-limit tritone"},"ji_12a":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,305.22982618403,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,448.50096908674,457.84473927605,490.54793493862,523.2511306012],"description":"7-limit 12-tone scale"},"ji_12b":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,305.22982618403,327.03195662575,343.38355445704,366.27579142084,392.4383479509,418.60090448096,448.50096908674,457.84473927605,490.54793493862,523.2511306012],"description":"alternate 7-limit 12-tone scale"},"ji_12c":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Kurzweil \"Just with natural b7th\", is Sauveur Just with 7/4"},"ji_13":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,310.07474405997,327.03195662575,348.83408706747,367.91095120397,372.08969287196,392.4383479509,418.60090448096,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"5-limit 12-tone symmetrical scale with two tritones"},"ji_17":{"frequencies":[261.6255653006,271.31540105247,283.8170195002,294.32876096318,310.07474405997,321.55899383997,336.37572681506,348.83408706747,361.75386806997,378.42269266694,392.4383479509,406.97310157871,425.72552925031,441.49314144476,465.11211608996,482.33849075995,504.56359022259,523.2511306012],"description":"3 and 7 prime rational interpretation of 17-tET. OdC"},"ji_17a":{"frequencies":[261.6255653006,272.52663052146,282.55561052465,294.32876096318,310.07474405997,321.08592105074,334.88072358477,348.83408706747,363.36884069528,376.74081403286,392.4383479509,408.78994578219,426.35277308246,441.49314144476,465.11211608996,484.4917875937,502.32108537715,523.2511306012],"description":"3, 5 and 11 prime rational interpretation of 17-tET, OdC"},"ji_17b":{"frequencies":[261.6255653006,272.52663052146,285.40970760065,294.32876096318,310.07474405997,319.76457981184,334.88072358477,348.83408706747,359.73515228832,380.54627680087,392.4383479509,408.78994578219,428.11456140098,441.49314144476,465.11211608996,479.64686971777,502.32108537715,523.2511306012],"description":"Alt. 3, 5 and 11 prime rational interpretation of 17-tET, OdC"},"ji_19":{"frequencies":[261.6255653006,272.52663052146,275.93321340298,279.06726965397,294.32876096318,306.59245933664,313.95067836072,327.03195662575,348.83408706747,353.19451315581,367.91095120397,392.4383479509,408.78994578219,418.60090448096,436.04260883433,441.49314144476,459.88868900496,470.92601754108,490.54793493862,523.2511306012],"description":"5-limit 19-tone scale"},"ji_20":{"frequencies":[261.6255653006,271.31540105247,279.38237857051,288.32205155576,299.00064605783,310.07474405997,321.55899383997,331.11985608357,348.83408706747,356.10146388137,372.50983809402,384.42940207435,392.4383479509,413.43299207996,425.72552925031,441.49314144476,457.84473927605,474.80195184183,489.99465727995,504.56359022259,523.2511306012],"description":"3 and 7 prime rational interpretation of 20-tET. OdC"},"ji_21":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,290.69507255622,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,490.54793493862,504.56359022259,523.2511306012],"description":"7-limit 21-tone just scale, Op de Coul, 2001"},"ji_22":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,282.55561052465,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,340.65828815182,348.83408706747,363.36884069528,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,454.2110508691,470.92601754108,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"5-limit 22-tone scale (Zarlino?)"},"ji_27":{"frequencies":[261.6255653006,267.90457886781,275.62199471997,282.55561052465,290.69507255622,299.00064605783,305.22982618403,313.95067836072,320.49131749323,331.11985608357,336.37572681506,348.83408706747,356.10146388137,366.27579142084,373.75080757229,384.42940207435,392.4383479509,406.97310157871,413.43299207996,427.14378008261,436.04260883433,448.50096908674,457.84473927605,470.92601754108,484.4917875937,496.67978412536,510.98743222773,523.2511306012],"description":"7-limit rational interpretation of 27-tET, OdC"},"ji_29":{"frequencies":[261.6255653006,267.90457886781,275.62199471997,282.55561052465,287.78812183066,294.32876096318,301.39265122629,310.07474405997,317.12189733406,323.76163705949,331.11985608357,340.65828815182,348.83408706747,356.76213450082,367.91095120397,372.08969287196,383.71749577421,392.4383479509,401.85686830172,413.43299207996,422.82919644541,431.68218274599,441.49314144476,454.2110508691,465.11211608996,475.68284600109,484.4917875937,496.67978412536,510.98743222773,523.2511306012],"description":"3,5,11-prime rational interpretation of 29-tET, OdC"},"ji_30":{"frequencies":[261.6255653006,267.57160087561,274.70684356563,280.31310567921,286.15296204753,294.32876096318,299.7792935736,308.34441624714,313.95067836072,321.92208230347,329.64821227876,336.37572681506,344.91651675372,353.19451315581,360.81424763342,370.01329949656,379.40816842909,387.59343007496,396.89567239676,406.97310157871,415.27867508032,425.24536328225,436.04260883433,443.97065626768,456.65553216105,465.11211608996,478.40103369253,488.36772189445,498.33441009638,511.62332769895,523.2511306012],"description":"11-limit rational interpretation of 30-tET"},"ji_31":{"frequencies":[261.6255653006,267.57160087561,274.08392555301,280.31310567921,285.40970760065,293.02063313667,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,334.88072358477,343.38355445704,348.83408706747,356.76213450082,366.27579142084,373.75080757229,383.71749577421,392.4383479509,398.6675280771,408.78994578219,418.60090448096,428.11456140098,436.04260883433,448.50096908674,457.84473927605,467.18850946536,479.64686971777,490.54793493862,499.46698830115,512.78610798918,523.2511306012],"description":"A just 11-limit 31-tone scale, optimized for Mann complexity"},"ji_31a":{"frequencies":[261.6255653006,267.90457886781,272.52663052146,279.06726965397,286.15296204753,294.32876096318,299.00064605783,305.22982618403,313.95067836072,318.93402246168,327.03195662575,334.88072358477,343.38355445704,348.83408706747,358.80077526939,366.27579142084,373.75080757229,381.53728273004,392.4383479509,398.6675280771,408.78994578219,418.60090448096,429.2294430713,436.04260883433,448.50096908674,457.84473927605,465.11211608996,478.40103369253,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"A just 7-limit 31-tone scale"},"ji_31b":{"frequencies":[261.6255653006,267.90457886781,275.93321340298,282.55561052465,287.4304306281,294.32876096318,301.39265122629,306.59245933664,313.95067836072,319.36714514233,327.03195662575,334.88072358477,344.91651675372,353.19451315581,359.28803828513,367.91095120397,376.74081403286,383.2405741708,392.4383479509,401.85686830172,408.78994578219,418.60090448096,431.14564594215,441.49314144476,452.08897683944,459.88868900496,470.92601754108,479.0507177135,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"A just 5-limit 31-tone scale, corner clipped genus"},"ji_31c":{"frequencies":[261.6255653006,267.57160087561,272.52663052146,279.06726965397,285.40970760065,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,334.88072358477,343.38355445704,348.83408706747,359.73515228832,366.27579142084,373.75080757229,380.54627680087,392.4383479509,398.6675280771,408.78994578219,418.60090448096,428.11456140098,436.04260883433,448.50096908674,457.84473927605,465.11211608996,479.64686971777,490.54793493862,502.32108537715,511.62332769895,523.2511306012],"description":"A just 11-limit 31-tone scale"},"ji_5coh":{"frequencies":[261.6255653006,305.22982618403,348.83408706747,381.53728273004,446.94367405519,523.2511306012],"description":"Differential fully coherent pentatonic scale"},"ji_6coh":{"frequencies":[261.6255653006,294.32876096318,330.74639366397,372.08969287196,418.60090448096,465.11211608996,523.2511306012],"description":"Differential coherent 6-tone scale, OdC 2003"},"ji_7":{"frequencies":[261.6255653006,290.69507255622,318.93402246168,348.83408706747,392.4383479509,429.2294430713,470.92601754108,523.2511306012],"description":"7-limit rational interpretation of 7-tET. OdC"},"ji_7a":{"frequencies":[261.6255653006,287.78812183066,319.76457981184,348.83408706747,392.4383479509,428.11456140098,470.92601754108,523.2511306012],"description":"Superparticular approximation to 7-tET. Op de Coul, 1998"},"ji_8coh":{"frequencies":[261.6255653006,286.99041781007,312.35527031954,339.96223546814,370.00947616612,405.83764015148,441.71144237774,480.75585116768,523.2511306012],"description":"Differential coherent 8-tone scale, OdC, 2003"},"ji_8coh3":{"frequencies":[261.6255653006,277.97716313189,302.50455987882,327.03195662575,359.73515228832,392.4383479509,425.14154361347,466.02053819169,523.2511306012],"description":"Differential fully coherent 8-tone scale, OdC, 2003"},"ji_9coh":{"frequencies":[261.6255653006,287.78812183066,313.95067836072,327.03195662575,366.27579142084,392.4383479509,418.60090448096,470.92601754108,497.08857407114,523.2511306012],"description":"Differentially coherent 9-tone scale"},"ji_ri24a":{"frequencies":[261.6255653006,269.10058145205,277.01530443593,285.40970760065,294.32876096318,301.87565226992,310.68035879446,319.76457981184,329.87571277032,340.11323489078,348.83408706747,359.73515228832,370.63621750918,380.54627680087,392.4383479509,402.50086969323,414.99227599406,428.11456140098,440.63253103259,453.48431318771,465.11211608996,479.64686971777,494.18162334558,508.71637697339,523.2511306012],"description":"M. Schulter, just/rational intonation system - with circulating 24-note set"},"jioct12":{"frequencies":[261.6255653006,272.52663052146,282.55561052465,302.80736724606,313.95067836072,327.03195662575,363.36884069528,376.74081403286,392.4383479509,436.04260883433,454.2110508691,470.92601754108,523.2511306012],"description":"12-tone JI version of Messiaen's octatonic scale, Erlich & Par�zek"},"jobin-bach":{"frequencies":[261.6255653006,275.07759559501,292.50627485027,309.76836826904,327.03195662575,348.83408706747,366.77012764335,391.22147055517,412.61639318626,437.39890198442,464.6525521713,489.02683710225,523.2511306012],"description":"Emile Jobin, WTC temperament after Bach's signet"},"johnson-secor_rwt":{"frequencies":[261.6255653006,276.16031892841,293.03678286293,310.07474405997,327.94037872749,348.83408706747,368.21375857121,391.52992584916,414.24047839262,438.40450629885,465.11211608996,490.95167809495,523.2511306012],"description":"Johnson/Secor proportional-beating well-temperament with five 24/19s."},"johnson_44":{"frequencies":[261.6255653006,265.7783520514,269.99705605222,274.2827236086,278.63641763414,283.05921791404,287.55222124002,292.11654190835,296.75331210627,301.46368356757,306.24882108355,311.17820103386,316.11753722951,321.13527558179,326.23266245367,331.4109583385,336.67144939063,342.01544029518,347.44425644654,352.9592442771,358.56177366235,364.2532300084,370.03502692537,375.90859839047,381.87540114246,387.93691728375,394.09464571975,400.35011587045,406.70487919155,413.16051176499,419.71861468993,426.38081694263,433.14876596753,440.02414274758,447.00865248514,454.10402744924,461.31203006992,468.63444275836,476.07308421189,483.62979961065,491.30646309654,499.10497838378,507.02727962797,515.07533168556,523.2511306012],"description":"Aaron Johnson, 44-tET approximation"},"johnson_7":{"frequencies":[261.6255653006,288.83389952765,318.87182567809,352.10227751942,388.71994014354,429.2294430713,473.86811641255,523.2511306012],"description":"Aaron Johnson, 7-tET approximation"},"johnson_eb":{"frequencies":[261.6255653006,273.1678696521,292.40504357126,312.71949922989,327.03195662575,349.65487315468,365.50630446407,390.89937403737,408.78994578219,437.06859144336,467.84806971401,488.62421754671,523.2511306012],"description":"Aaron Johnson, \"1/4-comma tempered\" equal beating C-G-D-A-E plus just thirds"},"johnson_ratwell":{"frequencies":[261.6255653006,276.16031892841,292.90688289089,310.07474405997,327.94037872749,348.83408706747,368.21375857121,391.49724879514,414.24047839262,438.30776524386,465.11211608996,490.95167809495,523.2511306012],"description":"Aaron Johnson, rational well-temperament with five 24/19's"},"johnson_temp":{"frequencies":[261.6255653006,275.52965735686,292.50638298357,309.88336774144,327.03195662575,348.76230617841,367.55223824197,391.22154286826,413.09299784305,437.39914452994,464.92072007996,490.30891677011,523.2511306012],"description":"Aaron Johnson, temperament with just 5/4, 24/19 and 19/15"},"johnston":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,315.35224388912,327.03195662575,359.73515228832,367.91095120397,392.4383479509,401.35740131342,441.49314144476,457.84473927605,490.54793493862,523.2511306012],"description":"Ben Johnston's combined otonal-utonal scale"},"johnston_21":{"frequencies":[261.6255653006,272.52663052146,282.55561052465,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,340.65828815182,348.83408706747,363.36884069528,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,454.2110508691,470.92601754108,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"Johnston 21-note just enharmonic scale"},"johnston_22":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,290.69507255622,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,343.38355445704,353.19451315581,367.91095120397,378.42269266694,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,490.54793493862,504.56359022259,523.2511306012],"description":"Johnston 22-note scale from end of string quartet nr. 4"},"johnston_25":{"frequencies":[261.6255653006,272.52663052146,275.93321340298,279.06726965397,290.69507255622,294.32876096318,306.59245933664,313.95067836072,327.03195662575,331.11985608357,334.88072358477,348.83408706747,353.19451315581,367.91095120397,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,441.49314144476,459.88868900496,465.11211608996,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Johnston 25-note just enharmonic scale"},"johnston_6-qt":{"frequencies":[261.6255653006,262.79353657426,266.47048317654,267.57160087561,271.31540105247,272.52663052146,277.4816601673,280.31310567921,284.23518205497,290.69507255622,294.32876096318,297.30177875068,299.7792935736,300.33547037059,305.22982618403,306.59245933664,310.07474405997,311.45900631024,316.53463456122,317.12189733406,319.76457981184,322.99452506247,327.03195662575,334.46450109452,339.14425131559,342.60490694126,348.83408706747,350.39138209902,355.29397756872,356.76213450082,361.75386806997,363.36884069528,367.91095120397,373.75080757229,381.53728273004,382.24514410802,387.59343007496,390.82337532559,392.4383479509,396.40237166758,399.70572476481,406.97310157871,408.78994578219,413.43299207996,420.46965851882,426.35277308246,436.04260883433,445.95266812602,452.19233508746,459.88868900496,465.11211608996,467.18850946536,475.68284600109,479.64686971777,484.4917875937,486.49381977384,490.54793493862,248.7057842981,498.33441009638,508.71637697339,516.79124009995,523.2511306012],"description":"11-limit complete system from Ben Johnston's _6th Quartet_"},"johnston_6-qt_row":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,306.59245933664,327.03195662575,350.39138209902,363.36884069528,399.70572476481,408.78994578219,436.04260883433,445.95266812602,490.54793493862,508.71637697339],"description":"11-limit 'prime row' from Ben Johnston's \"6th Quartet\""},"johnston_81":{"frequencies":[116.54094037952,117.99770213426,119.33792294863,119.89808681021,120.82964698549,121.39681289533,122.77564089365,122.91427305652,124.31033640482,124.45070146973,125.86421560988,127.43751830501,127.89129259755,128.03570110055,129.48993375502,131.10855792696,132.74741490105,134.25516331721,134.88534766148,135.93335285867,136.57141450725,138.12259600536,138.27855718859,139.84912845542,141.59724256112,142.26189011172,143.87770417225,145.6761754744,147.49712766783,149.17240368579,151.03705873186,151.74601611917,153.46955111706,155.38792050603,157.33026951235,159.11723059817,159.29689788126,161.10619598065,161.86241719378,163.70085452487,163.8856974087,165.74711520643,165.93426862631,167.81895414651,169.91669107334,170.71426813406,172.6532450067,174.81141056928,176.9965532014,179.00688442294,179.84713021531,181.24447047823,182.095219343,184.16346134048,184.37140958479,186.46550460723,188.79632341482,189.68252014896,191.15627745751,191.83693889633,194.23490063253,196.66283689044,198.89653824771,199.12112235157,199.83014468368,201.38274497581,202.32802149222,204.62606815608,204.85712176088,207.18389400804,207.41783578289,209.77369268314,212.39586384168,213.39283516758,215.81655625837,218.5142632116,221.24569150175,223.75860552868,226.55558809779,227.61902417875,230.2043266756,233.08188075904],"description":"Johnston 81-note 5-limit scale of Sonata for Microtonal Piano"},"jorgensen":{"frequencies":[261.6255653006,269.51415085551,288.85811466493,309.59046173614,318.92511007349,352.12195684808,355.62605411908,388.77403176757,408.50706336067,429.24143792307,469.25139168707,473.92081401802,523.2511306012],"description":"Jorgensen's 5&7 temperament"},"jousse":{"frequencies":[261.6255653006,276.90198715646,293.15566421679,311.51473523959,328.62702621286,349.28097970329,369.20264759391,391.76800554826,415.35298052707,439.0631553946,466.60176257857,492.27019703794,523.2511306012],"description":"Temperament of Jean Jousse (1832)"},"jousse2":{"frequencies":[261.6255653006,277.21176919085,293.63180098233,311.16627887077,329.63881547742,349.36510452864,370.14670828388,392.04008509316,415.41939014292,440.0494382652,466.3511549761,494.0599599767,523.2511306012],"description":"Jean Jousse's quasi-equal temperament"},"quasi_5":{"frequencies":[261.6255653006,302.26980244078,349.22823143301,391.99543598175,452.89298412314,523.2511306012],"description":"Quasi-Equal 5-Tone in 24-tET, 5 5 4 5 5 steps"},"quasi_9":{"frequencies":[261.6255653006,281.2143451833,302.26980244078,324.90175210669,349.22823143301,391.99543598175,421.34544350737,452.89298412314,486.80259447109,523.2511306012],"description":"Quasi-Equal Enneatonic, Each \"tetrachord\" has 125 + 125 + 125 + 125 cents"},"quint_chrom":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,348.83408706747,392.4383479509,415.52295665389,441.49314144476,523.2511306012],"description":"Aristides Quintilianus' Chromatic genus"},"oconnell":{"frequencies":[261.6255653006,267.57429119961,272.27874977392,278.46970304972,283.3657217904,288.34782337261,294.90414810658,300.08911516052,305.36524364276,312.30850472426,317.79947295261,323.38698268281,330.74001416845,336.55504284097,344.20748191927,350.25929591231,356.41751010259,364.52157313929,370.93054700815,377.45220049416,386.03454097812,392.82175095637,399.72829510222,408.81713953112,416.00491024634,423.31905787312],"description":"Walter O'Connell, Pythagorean scale of 25 octaves reduced by Phi. XH 15 (1993)"},"oconnell_11":{"frequencies":[261.6255653006,272.27874977392,288.34782337261,300.08911516052,312.30850472426,323.38698268281,344.20748191927,356.41751010259,370.93054700815,386.03454097812,408.81713953112,423.31905787312],"description":"Walter O'Connell, 11-note mode of 25-tone scale"},"oconnell_14":{"frequencies":[261.6255653006,272.27874977392,283.3657217904,288.34782337261,300.08911516052,312.30850472426,323.38698268281,336.55504284097,344.20748191927,356.41751010259,370.93054700815,386.03454097812,399.72829510222,408.81713953112,423.31905787312],"description":"Walter O'Connell, 14-note mode of 25-tone scale"},"oconnell_7":{"frequencies":[261.6255653006,283.3657217904,300.08911516052,323.38698268281,344.20748191927,370.93054700815,392.82175095637,423.31905787312],"description":"Walter O'Connell, 7-note mode of 25-tone scale"},"oconnell_9":{"frequencies":[261.6255653006,278.46970304972,294.90414810658,305.36524364276,323.38698268281,344.20748191927,364.52157313929,377.45220049416,399.72829510222,423.31905787312],"description":"Walter O'Connell, 9-tone mode of 25-tone scale"},"oconnell_9a":{"frequencies":[261.6255653006,272.27874977392,288.34782337261,305.36524364276,323.38698268281,344.20748191927,356.41751010259,377.45220049416,399.72829510222,423.31905787312],"description":"Walter O'Connell, 7+2 major mode analogy for 25-tone scale"},"octony_min":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,490.54793493862,523.2511306012],"description":"Octony on Harmonic Minor, from Palmer on an album of Turkish music"},"octony_rot":{"frequencies":[261.6255653006,327.03195662575,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,490.54793493862,523.2511306012],"description":"Rotated Octony on Harmonic Minor"},"octony_trans":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,327.03195662575,348.83408706747,408.78994578219,420.46965851882,436.04260883433,523.2511306012],"description":"Complex 10 of p. 115, an Octony based on Archytas's Enharmonic,"},"octony_trans2":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,315.35224388912,324.36230800023,336.37572681506,348.83408706747,504.56359022259,523.2511306012],"description":"Complex 6 of p. 115 based on Archytas's Enharmonic, an Octony"},"octony_trans3":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,306.59245933664,315.35224388912,327.03195662575,348.83408706747,490.54793493862,523.2511306012],"description":"Complex 5 of p. 115 based on Archytas's Enharmonic, an Octony"},"octony_trans4":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,336.37572681506,348.83408706747,420.46965851882,432.48307733364,448.50096908674,523.2511306012],"description":"Complex 11 of p. 115, an Octony based on Archytas's Enharmonic, 8 tones"},"octony_trans5":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,317.94773560837,327.03195662575,339.14425131559,348.83408706747,508.71637697339,523.2511306012],"description":"Complex 15 of p. 115, an Octony based on Archytas's Enharmonic, 8 tones"},"octony_trans6":{"frequencies":[261.6255653006,269.10058145205,271.31540105247,279.06726965397,336.37572681506,345.98646186692,348.83408706747,358.80077526939,523.2511306012],"description":"Complex 14 of p. 115, an Octony based on Archytas's Enharmonic, 8 tones"},"octony_u":{"frequencies":[261.6255653006,280.31310567921,301.87565226992,327.03195662575,356.76213450082,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"7)8 octony from 1.3.5.7.9.11.13.15, 1.3.5.7.9.11.13 tonic (subharmonics 8-16)"},"odd1":{"frequencies":[261.6255653006,272.52663052146,313.95067836072,327.03195662575,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"ODD-1"},"odd2":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,306.59245933664,313.95067836072,327.03195662575,348.83408706747,363.36884069528,392.4383479509,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"ODD-2"},"oettingen":{"frequencies":[261.6255653006,264.89588486686,267.90457886781,272.52663052146,275.93321340298,279.06726965397,282.55561052465,287.4304306281,290.69507255622,294.32876096318,298.00787047521,301.39265122629,306.59245933664,310.42486507835,313.95067836072,317.87506184023,323.35923445661,327.03195662575,331.11985608357,334.88072358477,339.06673262958,344.91651675372,348.83408706747,353.19451315581,357.20610515709,363.36884069528,367.91095120397,372.50983809402,376.74081403286,383.2405741708,388.03108134794,392.4383479509,397.34382730029,401.85686830172,408.78994578219,413.89982010446,418.60090448096,423.83341578697,431.14564594215,436.04260883433,441.49314144476,446.50763144636,452.08897683944,459.88868900496,465.11211608996,470.92601754108,476.81259276034,485.03885168492,490.54793493862,496.67978412536,502.32108537715,510.98743222773,517.37477513058,523.2511306012],"description":"von Oettingen's Orthotonophonium tuning"},"oettingen2":{"frequencies":[261.6255653006,264.89588486686,267.90457886781,272.52663052146,275.93321340298,279.06726965397,282.55561052465,287.4304306281,290.69507255622,294.32876096318,297.67175429757,301.39265122629,306.59245933664,310.07474405997,313.95067836072,317.51653791741,322.99452506247,327.03195662575,331.11985608357,334.88072358477,340.65828815182,344.91651675372,348.83408706747,353.19451315581,357.20610515709,363.36884069528,367.91095120397,372.08969287196,376.74081403286,383.2405741708,387.59343007496,392.4383479509,396.89567239676,401.85686830172,408.78994578219,413.43299207996,418.60090448096,423.83341578697,431.14564594215,436.04260883433,441.49314144476,446.50763144636,454.2110508691,459.88868900496,465.11211608996,470.92601754108,476.27480687611,484.4917875937,490.54793493862,496.11959049595,502.32108537715,510.98743222773,516.79124009995,523.2511306012],"description":"von Oettingen's Orthotonophonium tuning with central 1/1"},"ogr10":{"frequencies":[261.6255653006,264.15640940857,271.89678302796,296.5055443788,342.56848033562,359.46139971304,411.32572372413,440,484.46499093218,513.27277840175,523.2511306012],"description":"Optimal Golomb Ruler of 10 segments, length 72"},"ogr10a":{"frequencies":[261.6255653006,264.15640940857,285.30470202322,314.13668154225,329.62755691287,352.60650301302,431.60923940535,448.5538823653,457.27406033445,508.3551866238,523.2511306012],"description":"2nd Optimal Golomb Ruler of 10 segments, length 72"},"ogr11":{"frequencies":[261.6255653006,265.92749183559,274.74472021414,318.1829357186,331.4244391468,362.52783176564,371.50609336774,409.69842558521,455.51656649021,482.27514684959,486.22402266421,523.2511306012],"description":"Optimal Golomb Ruler of 11 segments, length 85"},"ogr12":{"frequencies":[261.6255653006,265.06964174786,270.3209511875,308.09015504092,333.2396629384,346.57411320722,384.79959982017,413.49815209867,456.11269186454,468.20039948765,496.58195036371,499.83980314828,523.2511306012],"description":"Optimal Golomb Ruler of 12 segments, length 106"},"ogr2":{"frequencies":[261.6255653006,329.62755691287,523.2511306012],"description":"Optimal Golomb Ruler of 2 segments, length 3"},"ogr3":{"frequencies":[261.6255653006,293.66476791741,415.30469757995,523.2511306012],"description":"Optimal Golomb Ruler of 3 segments, length 6"},"ogr4":{"frequencies":[261.6255653006,278.64197723942,336.62443200122,461.29362042034,523.2511306012],"description":"Optimal Golomb Ruler of 4 segments, length 11"},"ogr4a":{"frequencies":[261.6255653006,296.76515515861,406.67242132093,433.12283887627,523.2511306012],"description":"2nd Optimal Golomb Ruler of 4 segments, length 11"},"ogr5":{"frequencies":[261.6255653006,272.51337835337,307.97166902637,393.32961502355,426.7484383229,523.2511306012],"description":"Optimal Golomb Ruler of 5 segments, length 17"},"ogr5a":{"frequencies":[261.6255653006,272.51337835337,307.97166902637,393.32961502355,482.27514684959,523.2511306012],"description":"2nd Optimal Golomb Ruler of 5 segments, length 17"},"ogr5b":{"frequencies":[261.6255653006,272.51337835337,362.52783176564,426.7484383229,463.0066556268,523.2511306012],"description":"3rd Optimal Golomb Ruler of 5 segments, length 17"},"ogr5c":{"frequencies":[261.6255653006,272.51337835337,362.52783176564,409.69842558521,444.50800708553,523.2511306012],"description":"4th Optimal Golomb Ruler of 5 segments, length 17"},"ogr6":{"frequencies":[261.6255653006,268.98086109226,292.31087910123,345.21700307457,430.94493093825,495.02573326308,523.2511306012],"description":"Optimal Golomb Ruler of 6 segments, length 25"},"ogr6a":{"frequencies":[261.6255653006,276.5429423948,284.31762274025,345.21700307457,407.69874723177,468.32288027948,523.2511306012],"description":"2nd Optimal Golomb Ruler of 6 segments, length 25"},"ogr6b":{"frequencies":[261.6255653006,268.98086109226,354.92237405774,407.69874723177,443.06044202496,495.02573326308,523.2511306012],"description":"3rd Optimal Golomb Ruler of 6 segments, length 25"},"ogr6c":{"frequencies":[261.6255653006,268.98086109226,317.66442301495,354.92237405774,455.51656649021,495.02573326308,523.2511306012],"description":"4th Optimal Golomb Ruler of 6 segments, length 25"},"ogr6d":{"frequencies":[261.6255653006,276.5429423948,317.66442301495,375.1593523779,468.32288027948,481.48922855473,523.2511306012],"description":"5th Optimal Golomb Ruler of 6 segments, length 25"},"ogr7":{"frequencies":[261.6255653006,267.01398215014,283.85429714132,314.3146261019,355.21191871351,409.69842558521,502.34551296122,523.2511306012],"description":"Optimal Golomb Ruler of 7 segments, length 34"},"ogr8":{"frequencies":[261.6255653006,265.77967818767,283.06627815664,316.06708432391,387.90015179087,400.3161696196,454.08364189083,499.09751029017,523.2511306012],"description":"Optimal Golomb Ruler of 8 segments, length 44"},"ogr9":{"frequencies":[261.6255653006,264.94361147373,282.17583275232,296.76515515861,349.59519124833,363.06573983159,401.57942110183,438.61588607285,510.2272282764,523.2511306012],"description":"Optimal Golomb Ruler of 9 segments, length 55"},"oldani":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,310.07474405997,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"This scale by Norbert L. Oldani appeared in Interval 5(3), p.10-11"},"oljare":{"frequencies":[261.6255653006,286.15296204753,305.22982618403,327.03195662575,348.83408706747,381.53728273004,392.4383479509,406.97310157871,436.04260883433,457.84473927605,490.54793493862,508.71637697339,523.2511306012],"description":"Mats �ljare, scale for \"Tampere\" (2001)"},"oljare17":{"frequencies":[261.6255653006,272.51337835337,320.78822215662,334.13814720468,393.32961502355,409.69842558521,426.7484383229,502.34551296122,523.2511306012],"description":"Mats �ljare, scale for \"Fafner\" (2001), MOS in 17-tET"},"olympos":{"frequencies":[261.6255653006,279.06726965397,348.83408706747,372.08969287196,465.11211608996,523.2511306012],"description":"Scale of ancient Greek flutist Olympos, 6th century BC as reported by Partch"},"opelt":{"frequencies":[261.6255653006,272.52663052146,282.55561052465,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,363.36884069528,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,454.2110508691,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Friederich Wilhelm Opelt 19-tone"},"organ1373a":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,311.64221749042,331.11985608357,348.83408706747,369.35373924791,392.4383479509,415.52295665389,441.49314144476,465.11211608996,496.67978412536,523.2511306012],"description":"English organ tuning (1373) with 18:17:16 ficta semitones (Eb-G#)"},"organ1373b":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,311.64221749042,331.11985608357,348.83408706747,369.35373924791,392.4383479509,415.52295665389,441.49314144476,467.46332623563,496.67978412536,523.2511306012],"description":"English organ tuning (1373) with 18:17:16 accidental semitones (Eb-G#)"},"ragib":{"frequencies":[261.6255653006,269.99542342683,281.01564479119,288.12007609225,294.32876096318,303.49446183192,311.45900631024,323.77767743764,335.77702597132,341.99420300732,348.83408706747,360.36579242507,371.06455309218,381.37837507376,392.4383479509,407.46331920162,417.22825371678,432.79663407874,450.28451247858,458.15534711532,465.11211608996,476.50902003141,487.19844562495,503.12608711654,523.2511306012],"description":"Idris Ragib Bey, vol.5 d'Erlanger, p 40. Idris Rag'ib Bey"},"ragib7":{"frequencies":[261.6255653006,270.30192333353,281.29980781121,288.32205155576,294.32876096318,303.74668805875,311.45900631024,324.36230800023,336.37572681506,341.71502406609,348.83408706747,360.4025644447,370.6997805717,381.53728273004,392.4383479509,406.97310157871,417.13259773693,432.48307733364,450.69091522486,457.84473927605,465.11211608996,476.92160341255,486.65469735975,502.32108537715,523.2511306012],"description":"7-limit version of Idris Rag'ib Bey scale"},"rameau-flat":{"frequencies":[261.6255653006,276.01120901503,292.50629850443,312.00666699279,327.03195662575,349.91920725962,366.20974703841,391.22137338448,415.30469757995,437.39882871549,468.01000025525,489.02679755603,523.2511306012],"description":"Rameau bemols, see Pierre-Yves Asselin in \"Musique et temperament\""},"rameau-gall":{"frequencies":[261.6255653006,274.65078342868,292.50627485027,310.49874388777,327.03195662575,349.91912034749,366.20104475463,391.22147055517,412.61639318626,437.39890198442,468.01003810189,489.02683710225,523.2511306012],"description":"Rameau's temperament, after Gallimard (1st solution)"},"rameau-merc":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,308.72950296259,327.03195662575,348.83408706747,365.63284274659,391.22147055517,409.55238583376,437.39890198442,464.53468854848,489.02683710225,523.2511306012],"description":"Rameau's temperament, after Mercadier"},"rameau-minor":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,353.19451315581,392.4383479509,418.60090448096,441.49314144476,470.92601754108,490.54793493862,523.2511306012],"description":"Rameau's systeme diatonique mineur on E. Asc. 4-6-8-9, desc. 9-7-5-4"},"rameau-nouv":{"frequencies":[261.6255653006,275.98004852257,292.50627485027,311.49614460359,327.03195662575,349.91912034749,367.37127028704,391.22147055517,414.64857675456,437.39890198442,468.01003810189,489.02683710225,523.2511306012],"description":"Temperament by Rameau in Nouveau Systeme (1726)"},"rameau-sharp":{"frequencies":[261.6255653006,273.37431312998,292.50629850443,308.54983514133,327.03195662575,348.83408706747,365.63293356166,391.22137338448,409.42528169498,437.39882871549,464.33633889105,489.02679755603,523.2511306012],"description":"Rameau dieses, see Pierre-Yves Asselin in \"Musique et temperament\""},"rameau":{"frequencies":[261.6255653006,275.07757335026,292.50629850443,310.73186404381,327.03195662575,349.91920725962,366.77009798369,391.22137338448,412.61635981914,437.39882871549,468.01000025525,489.02679755603,523.2511306012],"description":"Rameau's modified meantone temperament (1725)"},"ramis":{"frequencies":[261.6255653006,275.93321340298,290.69507255622,310.07474405997,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.43299207996,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Monochord of Ramos de Pareja (Ramis de Pareia), Musica practica (1482). Carlos: Switched on Bach"},"rapoport_8":{"frequencies":[261.6255653006,297.86386736488,316.53463456122,336.37572681506,382.96782946913,406.97310157871,432.48307733364,492.38720931745,523.2511306012],"description":"Paul Rapoport, cycle of 14/9 close to 8 out of 11-tET, XH 13, 1991"},"rast_moha":{"frequencies":[261.6255653006,293.66476791741,320.24370022528,349.22823143301,391.99543598175,427.47405410759,479.82340237272,523.2511306012],"description":"Rast + Mohajira (Dudon) 4 + 3 + 3 Rast and 3 + 4 + 3 Mohajira tetrachords"},"rat_dorenh":{"frequencies":[261.6255653006,267.70988077271,274.08392555301,359.73515228832,411.12588832951,418.60090448096,426.35277308246,523.2511306012],"description":"Rationalized Schlesinger's Dorian Harmonia in the enharmonic genus"},"rat_hypodenh":{"frequencies":[261.6255653006,270.06509966514,279.06726965397,348.83408706747,380.54627680087,389.39619021485,398.6675280771,523.2511306012],"description":"1+1 rationalized enharmonic genus derived from K.S.'s 'Bastard' Hypodorian"},"rat_hypodenh2":{"frequencies":[261.6255653006,270.06509966514,288.69027895239,348.83408706747,380.54627680087,389.39619021485,408.39112632289,523.2511306012],"description":"1+2 rationalized enharmonic genus derived from K.S.'s 'Bastard' Hypodorian"},"rat_hypodenh3":{"frequencies":[261.6255653006,270.06509966514,299.00064605783,348.83408706747,380.54627680087,389.39619021485,418.60090448096,523.2511306012],"description":"1+3 rationalized enharmonic genus derived from K.S.'s 'Bastard' Hypodorian"},"rat_hypodhex":{"frequencies":[261.6255653006,267.19206668997,273.00058987889,348.83408706747,380.54627680087,386.4008349055,392.4383479509,523.2511306012],"description":"1+1 rationalized hexachromatic/hexenharmonic genus derived from K.S.'Bastard'"},"rat_hypodhex2":{"frequencies":[261.6255653006,267.19206668997,279.06726965397,348.83408706747,380.54627680087,386.4008349055,398.6675280771,523.2511306012],"description":"1+2 rat. hexachromatic/hexenharmonic genus derived from K.S.'s 'Bastard' Hypodo"},"rat_hypodhex3":{"frequencies":[261.6255653006,267.19206668997,285.40970760065,348.83408706747,380.54627680087,386.4008349055,405.0976494977,523.2511306012],"description":"1+3 rat. hexachromatic/hexenharmonic genus from K.S.'s 'Bastard' Hypodorian"},"rat_hypodhex4":{"frequencies":[261.6255653006,267.19206668997,292.04714266113,348.83408706747,380.54627680087,386.4008349055,411.73859457144,523.2511306012],"description":"1+4 rat. hexachromatic/hexenharmonic genus from K.S.'s 'Bastard' Hypodorian"},"rat_hypodhex5":{"frequencies":[261.6255653006,267.19206668997,299.00064605783,348.83408706747,380.54627680087,386.4008349055,418.60090448096,523.2511306012],"description":"1+5 rat. hexachromatic/hexenharmonic genus from K.S.'s 'Bastard' Hypodorian"},"rat_hypodhex6":{"frequencies":[261.6255653006,273.00058987889,292.04714266113,348.83408706747,380.54627680087,392.4383479509,411.73859457144,523.2511306012],"description":"2+3 rationalized hexachromatic/hexenharmonic genus from K.S.'s 'Bastard' hypod"},"rat_hypodpen":{"frequencies":[261.6255653006,268.33391312882,275.39533189537,348.83408706747,380.54627680087,387.59343007496,394.90651366128,523.2511306012],"description":"1+1 rationalized pentachromatic/pentenharmonic genus derived from K.S.'s 'Bastar"},"rat_hypodpen2":{"frequencies":[261.6255653006,268.33391312882,282.83844897362,348.83408706747,380.54627680087,387.59343007496,402.50086969323,523.2511306012],"description":"1+2 rationalized pentachromatic/pentenharmonic genus from K.S.'s 'Bastard' hyp"},"rat_hypodpen3":{"frequencies":[261.6255653006,268.33391312882,290.69507255622,348.83408706747,380.54627680087,387.59343007496,410.39304360878,523.2511306012],"description":"1+3 rationalized pentachromatic/pentenharmonic genus from 'Bastard' Hypodorian"},"rat_hypodpen4":{"frequencies":[261.6255653006,268.33391312882,299.00064605783,348.83408706747,380.54627680087,387.59343007496,418.60090448096,523.2511306012],"description":"1+4 rationalized pentachromatic/pentenharmonic genus from 'Bastard' Hypodorian"},"rat_hypodpen5":{"frequencies":[261.6255653006,275.39533189537,290.69507255622,348.83408706747,380.54627680087,394.90651366128,410.39304360878,523.2511306012],"description":"2+3 rationalized pentachromatic/pentenharmonic genus from 'Bastard' Hypodorian"},"rat_hypodpen6":{"frequencies":[261.6255653006,268.33391312882,299.00064605783,348.83408706747,380.54627680087,394.90651366128,418.60090448096,523.2511306012],"description":"2+3 rationalized pentachromatic/pentenharmonic genus from 'Bastard' Hypodorian"},"rat_hypodtri":{"frequencies":[261.6255653006,273.00058987889,285.40970760065,348.83408706747,380.54627680087,392.4383479509,405.0976494977,523.2511306012],"description":"rationalized first (1+1) trichromatic genus derived from K.S.'s 'Bastard' hyp"},"rat_hypodtri2":{"frequencies":[261.6255653006,273.00058987889,299.00064605783,348.83408706747,380.54627680087,392.4383479509,418.60090448096,523.2511306012],"description":"rationalized second (1+2) trichromatic genus derived from K.S.'s 'Bastard' hyp"},"rat_hypolenh":{"frequencies":[261.6255653006,268.33391312882,275.39533189537,348.83408706747,373.75080757229,402.50086969323,410.39304360878,418.60090448096,523.2511306012],"description":"Rationalized Schlesinger's Hypolydian Harmonia in the enharmonic genus"},"rat_hypopchrom":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,362.25078272391,392.4383479509,409.50088481833,428.11456140098,523.2511306012],"description":"Rationalized Schlesinger's Hypophrygian Harmonia in the chromatic genus"},"rat_hypopenh":{"frequencies":[261.6255653006,269.10058145205,277.01530443593,362.25078272391,392.4383479509,400.78810003496,409.50088481833,523.2511306012],"description":"Rationalized Schlesinger's Hypophrygian Harmonia in the enharmonic genus"},"rat_hypoppen":{"frequencies":[261.6255653006,273.79419624481,294.32876096318,362.25078272391,392.4383479509,405.97070477679,428.11456140098,523.2511306012],"description":"Rationalized Schlesinger's Hypophrygian Harmonia in the pentachromatic genus"},"rat_hypoptri":{"frequencies":[261.6255653006,271.68808704293,282.55561052465,362.25078272391,392.4383479509,403.65087217807,415.52295665389,523.2511306012],"description":"Rationalized Schlesinger's Hypophrygian Harmonia in first trichromatic genus"},"rat_hypoptri2":{"frequencies":[261.6255653006,271.68808704293,294.32876096318,362.25078272391,392.4383479509,403.65087217807,428.11456140098,523.2511306012],"description":"Rationalized Schlesinger's Hypophrygian Harmonia in second trichromatic genus"},"rectsp10":{"frequencies":[261.6255653006,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,336.37572681506,340.11323489078,348.83408706747,359.73515228832,366.27579142084,373.75080757229,377.90359432309,392.4383479509,406.97310157871,411.12588832951,418.60090448096,425.14154361347,436.04260883433,444.76346101102,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,485.87604984397,490.54793493862,494.18162334558,497.08857407114,523.2511306012],"description":"Rectangle minimal beats spectrum of order 10"},"rectsp10a":{"frequencies":[261.6255653006,275.39533189537,277.01530443593,279.06726965397,281.75060878526,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,307.79478270659,313.95067836072,319.76457981184,322.00069575458,327.03195662575,332.97799220076,336.37572681506,340.11323489078,348.83408706747,359.73515228832,362.25078272391,366.27579142084,373.75080757229,377.90359432309,380.54627680087,392.4383479509,402.50086969323,406.97310157871,411.12588832951,418.60090448096,425.14154361347,428.11456140098,436.04260883433,444.76346101102,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,485.87604984397,490.54793493862,494.18162334558,497.08857407114,523.2511306012],"description":"Rectangle minimal beats spectrum of order 10 union with inversion"},"rectsp11":{"frequencies":[261.6255653006,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,309.19384990071,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,340.11323489078,348.83408706747,356.76213450082,359.73515228832,366.27579142084,373.75080757229,377.90359432309,380.54627680087,392.4383479509,404.33041910093,406.97310157871,411.12588832951,418.60090448096,425.14154361347,428.11456140098,436.04260883433,444.76346101102,448.50096908674,451.89870370104,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,485.87604984397,490.54793493862,494.18162334558,497.08857407114,499.46698830115,523.2511306012],"description":"Rectangle minimal beats spectrum of order 11"},"rectsp12":{"frequencies":[261.6255653006,283.42769574232,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,309.19384990071,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,340.11323489078,348.83408706747,356.76213450082,359.73515228832,366.27579142084,370.63621750918,373.75080757229,377.90359432309,380.54627680087,392.4383479509,404.33041910093,406.97310157871,411.12588832951,414.24047839262,418.60090448096,425.14154361347,428.11456140098,436.04260883433,444.76346101102,448.50096908674,451.89870370104,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,485.87604984397,490.54793493862,494.18162334558,497.08857407114,499.46698830115,501.44900015948,523.2511306012],"description":"Rectangle minimal beats spectrum of order 12"},"rectsp6":{"frequencies":[261.6255653006,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,470.92601754108,479.64686971777,523.2511306012],"description":"Rectangle minimal beats spectrum of order 6 (=songlines)"},"rectsp6a":{"frequencies":[261.6255653006,285.40970760065,290.69507255622,299.00064605783,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,373.75080757229,392.4383479509,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,479.64686971777,523.2511306012],"description":"Rectangle minimal beats spectrum of order 6 union with inversion"},"rectsp7":{"frequencies":[261.6255653006,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,411.12588832951,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,479.64686971777,485.87604984397,523.2511306012],"description":"Rectangle minimal beats spectrum of order 7"},"rectsp7a":{"frequencies":[261.6255653006,281.75060878526,285.40970760065,290.69507255622,299.00064605783,305.22982618403,313.95067836072,327.03195662575,332.97799220076,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,406.97310157871,411.12588832951,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,479.64686971777,485.87604984397,523.2511306012],"description":"Rectangle minimal beats spectrum of order 7 union with inversion"},"rectsp8":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,392.4383479509,411.12588832951,418.60090448096,425.14154361347,436.04260883433,448.50096908674,457.84473927605,470.92601754108,479.64686971777,485.87604984397,490.54793493862,523.2511306012],"description":"Rectangle minimal beats spectrum of order 8"},"rectsp8a":{"frequencies":[261.6255653006,279.06726965397,281.75060878526,285.40970760065,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,322.00069575458,327.03195662575,332.97799220076,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,380.54627680087,392.4383479509,406.97310157871,411.12588832951,418.60090448096,425.14154361347,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,485.87604984397,490.54793493862,523.2511306012],"description":"Rectangle minimal beats spectrum of order 8 union with inversion"},"rectsp9":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,377.90359432309,392.4383479509,406.97310157871,411.12588832951,418.60090448096,425.14154361347,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,485.87604984397,490.54793493862,494.18162334558,523.2511306012],"description":"Rectangle minimal beats spectrum of order 9"},"rectsp9a":{"frequencies":[261.6255653006,277.01530443593,279.06726965397,281.75060878526,285.40970760065,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,322.00069575458,327.03195662575,332.97799220076,336.37572681506,348.83408706747,359.73515228832,362.25078272391,366.27579142084,373.75080757229,377.90359432309,380.54627680087,392.4383479509,406.97310157871,411.12588832951,418.60090448096,425.14154361347,428.11456140098,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,485.87604984397,490.54793493862,494.18162334558,523.2511306012],"description":"Rectangle minimal beats spectrum of order 9 union with inversion"},"redfield":{"frequencies":[261.6255653006,290.69507255622,327.03195662575,348.83408706747,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"Redfield New Diatonic"},"reinhard":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,309.81974838229,327.03195662575,348.83408706747,369.35373924791,392.4383479509,413.09299784305,436.04260883433,461.69217405988,490.54793493862,523.2511306012],"description":"Reinhard 19-limit superparticular"},"reinhard17":{"frequencies":[261.6255653006,277.01530443593,277.97716313189,286.94416839421,292.40504357126,296.50897400735,307.79478270659,317.68818643644,338.57426097725,342.12573923925,369.35373924791,400.13321751856,404.33041910093,430.91269578922,444.76346101102,477.08191319521,492.47165233054,523.2511306012],"description":"Reinhard's Harmonic-17 tuning for \"Tresspass\", 1998"},"renteng1":{"frequencies":[261.6255653006,285.40970760065,313.15788183285,391.64553850062,426.52890806662,523.2511306012],"description":"Gamelan Renteng from Chileunyi (Tg. Sari). 1/1=330 Hz"},"renteng2":{"frequencies":[261.6255653006,294.32876096318,311.77048523333,396.07199334683,425.86840190162,523.2511306012],"description":"Gamelan Renteng from Chikebo (Tg. Sari). 1/1=360 Hz"},"renteng3":{"frequencies":[261.6255653006,278.97471276149,312.97903559457,379.60005211265,409.44065404912,468.42785143649,523.2511306012],"description":"Gamelan Renteng from Lebakwangi (Pameungpeuk). 1/1=377 Hz"},"renteng4":{"frequencies":[261.6255653006,296.45730715573,311.93819010347,397.0826586675,424.17395032031,523.2511306012],"description":"Gamelan Renteng Bale` bandung from Kanoman (Cheribon). 1/1=338 Hz"},"robot":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,294.32876096318,306.59245933664,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"Dead Robot (see lattice)"},"robot_live":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,327.03195662575,334.88072358477,348.83408706747,376.74081403286,392.4383479509,418.60090448096,446.50763144636,490.54793493862,502.32108537715,523.2511306012],"description":"Live Robot"},"romieu":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Romieu's Monochord, Memoire theorique & pratique (1758)"},"romieu_inv":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Romieu inverted, Pure (just) C minor in Wilkinson: Tuning In"},"rosati_21":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,490.54793493862,523.2511306012],"description":"Dante Rosati, JI guitar tuning"},"rosati_21a":{"frequencies":[261.6255653006,280.31310567921,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,488.36772189445,523.2511306012],"description":"Alternative version of rosati_21 with more tetrads"},"rousseau":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,363.36884069528,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Rousseau's Monochord, Dictionnaire de musique (1768)"},"rousseauw":{"frequencies":[261.6255653006,276.81658657456,293.31219032635,311.14941643136,328.83652403056,349.33732971591,369.19521129916,391.76004912942,415.1051791302,439.20783490896,466.32059269121,492.40223109551,523.2511306012],"description":"Jean-Jacques Rousseau's temperament (1768)"},"rsr_12":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"RSR - 7 limit JI"},"rvf-1":{"frequencies":[261.6255653006,272.14556467328,280.20095193414,292.09989854643,304.19649364034,313.29104303136,326.0297292803,340.21856244106,350.08660369014,364.11104988921,374.67209286633,390.97784457618,406.87534373272,419.03967825638,436.39317047385,454.92493848389,468.39051363853,487.22455955444,508.94280091833,523.2511306012],"description":"D-A 695 cents, the increment is 0.25 cents, interval range 49.5 to 75.5"},"rvf-2":{"frequencies":[261.6255653006,272.87751533003,278.75612859219,292.27711197479,305.71136588092,312.51386339015,326.29348693151,342.97106251658,349.87433921674,364.79522794952,372.13777859784,391.13596290168,408.38225803817,417.4934384938,436.65792486176,457.83788806384,467.7011114131,487.81592522452,513.9947144098,523.2511306012],"description":"695 cents, 0.607 cents, 31-90 cents, C-A# is 7/4."},"rvf-3":{"frequencies":[261.6255653006,272.98787180262,278.19314238431,292.29399505039,306.11778315204,312.24320803046,326.25579420701,343.90343447252,349.81371586656,364.81629995674,371.08598724028,391.15855645336,408.71263878415,416.89098941754,436.60748307387,458.73792719255,467.48503753613,487.78774868553,515.83876338215,523.2511306012],"description":"694.737, 0.082, 25-97, the fifth E#-B# is 3/2."},"majmin":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,313.95067836072,327.03195662575,348.83408706747,363.36884069528,367.91095120397,392.4383479509,408.78994578219,418.60090448096,436.04260883433,465.11211608996,470.92601754108,490.54793493862,523.2511306012],"description":"Malcolm & Marpurg 4 (Yamaha major & minor) mixed. Mersenne/Ban without D#"},"major_clus":{"frequencies":[261.6255653006,275.93321340298,290.69507255622,294.32876096318,327.03195662575,348.83408706747,367.91095120397,392.4383479509,436.04260883433,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"Chalmers' Major Mode Cluster"},"major_wing":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Chalmers' Major Wing with 7 major and 6 minor triads"},"malcolm":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Malcolm's Monochord (1721), and C major in Yamaha synths, Wilkinson: Tuning In"},"malcolm2":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,348.83408706747,370.63621750918,392.4383479509,414.24047839262,436.04260883433,463.29527188648,490.54793493862,523.2511306012],"description":"Malcolm 2"},"malcolm_ap":{"frequencies":[261.6255653006,279.47938236087,293.66476791741,313.97746652079,326.1838132033,349.22823143301,369.99442271164,391.99543598175,419.68935090103,436.0054062308,466.16376151809,489.82458627646,523.2511306012],"description":"Best approximations in mix of all ETs from 12-23 to Malcolm's Monochord"},"malcolm_me":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,392.4383479509,457.84473927605,490.54793493862,523.2511306012],"description":"Malcolm's Mid-East"},"malcolme":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,372.08969287196,392.4383479509,418.60090448096,436.04260883433,465.11211608996,496.11959049595,523.2511306012],"description":"Most equal interval permutation of Malcolm's Monochord"},"malcolme2":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Inverse most equal interval permutation of Malcolm's Monochord"},"malcolms":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,369.99442271164,392.4383479509,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Symmetrical version of Malcolm's Monochord and Albion scale"},"malerbi":{"frequencies":[261.6255653006,275.62199471997,292.73769384471,310.07474405997,327.54963108844,348.83408706747,367.49599295996,391.37619916626,413.43299207996,437.91808280662,465.11211608996,489.99465727995,523.2511306012],"description":"Luigi Malerbi's well-temperament nr.1 (1794) (nr.2 = Young)"},"malgache":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,306.59245933664,327.03195662575,353.19451315581,367.91095120397,392.4383479509,413.89982010446,441.49314144476,459.88868900496,490.54793493862,523.2511306012],"description":"tuning from Madagascar"},"malgache1":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,310.07474405997,327.03195662575,353.19451315581,376.74081403286,392.4383479509,418.60090448096,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"tuning from Madagascar"},"malgache2":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,313.95067836072,327.03195662575,353.19451315581,367.91095120397,392.4383479509,408.78994578219,441.49314144476,470.92601754108,490.54793493862,523.2511306012],"description":"tuning from Madagascar"},"malkauns":{"frequencies":[261.6255653006,313.95067836072,348.83408706747,418.60090448096,465.11211608996,523.2511306012],"description":"Raga Malkauns, inverse of prime_5"},"mambuti":{"frequencies":[261.6255653006,294.34406205295,331.72862856444,394.26624244126,466.16376151809,525.06772693396,590.39077962608,792.18471060794,999.82182774046],"description":"African Mambuti Flutes (aerophone; vertical wooden; one note each)"},"mandelbaum5":{"frequencies":[261.6255653006,272.52663052146,282.55561052465,290.69507255622,302.80736724606,313.95067836072,327.03195662575,340.65828815182,348.83408706747,363.36884069528,376.74081403286,392.4383479509,403.74315632809,418.60090448096,436.04260883433,454.2110508691,470.92601754108,484.4917875937,502.32108537715,523.2511306012],"description":"Mandelbaum's 5-limit 19-tone scale, kleismic detempered circle of minor thirds"},"mandelbaum7":{"frequencies":[261.6255653006,272.52663052146,280.31310567921,294.32876096318,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,376.74081403286,392.4383479509,406.97310157871,418.60090448096,436.04260883433,457.84473927605,470.92601754108,490.54793493862,504.56359022259,523.2511306012],"description":"Mandelbaum's 7-limit 19-tone scale"},"marimba1":{"frequencies":[261.6255653006,284.4818984792,319.50463429683,342.83241505062,371.92288545737,411.72190027758,457.09800545097,500.48847822777,547.68138927822,612.97866327818,651.68292300609,728.11694797601,807.8963375694,903.69557412727,1013.19282257599,1069.7265813247,1225.95732655636,1303.36584601218],"description":"Marimba of the Bakwese, SW Belgian Congo (Zaire). 1/1=140.5 Hz"},"marimba2":{"frequencies":[261.6255653006,279.11058864149,318.03161540472,343.03050002254,379.95718438213,421.58889248327,458.6849347701,519.33670373121,571.2689787911,613.68721319418,694.83488613378,761.23234162637,846.59395682498,953.56868388592,1049.52904699774,1145.8425062572,1271.3918647407,1389.66977226756],"description":"Marimba of the Bakubu, S. Belgian Congo (Zaire). 1/1=141.5 Hz"},"marimba3":{"frequencies":[261.6255653006,296.73398952435,348.2210758395,420.13030572059,476.50902003141,518.73708886244,603.49292471609,696.44215167899,840.26061144117,953.01804006282,1037.47417772488],"description":"Marimba from the Yakoma tribe, Zaire. 1/1=185.5 Hz"},"marion":{"frequencies":[261.6255653006,269.91407136119,278.46532473603,287.28749371714,296.38899008685,305.77900572762,315.46632790985,325.46074015958,335.7715953476,346.4093067252,357.3838291689,368.70624618807,380.38737313392,392.4383479509,411.71310103548,431.93429139282,453.14890242083,475.40520223986,498.75490298644,523.2511306012],"description":"scale with two different ET step sizes"},"marion1":{"frequencies":[261.6255653006,262.79353657426,272.52663052146,280.31310567921,286.15296204753,294.32876096318,305.22982618403,311.45900631024,327.03195662575,336.37572681506,343.38355445704,350.39138209902,367.91095120397,373.75080757229,381.53728273004,392.4383479509,408.78994578219,420.46965851882,436.04260883433,457.84473927605,467.18850946536,476.92160341255,490.54793493862,515.07533168556,523.2511306012],"description":"Marion's 7-limit Scale # 1"},"marion10":{"frequencies":[261.6255653006,267.07609791103,272.52663052146,286.15296204753,290.69507255622,296.75121990114,305.22982618403,317.94773560837,327.03195662575,339.14425131559,356.10146388137,363.36884069528,370.93902487643,381.53728273004,400.61414686654,406.97310157871,408.78994578219,423.93031414449,436.04260883433,445.12682985172,457.84473927605,474.80195184183,476.92160341255,484.4917875937,508.71637697339,523.2511306012],"description":"Marion's 7-limit Scale # 10"},"marion15":{"frequencies":[261.6255653006,269.10058145205,280.31310567921,288.32205155576,299.00064605783,313.95067836072,320.35783506196,327.03195662575,336.37572681506,353.19451315581,358.80077526939,360.4025644447,373.75080757229,384.42940207435,392.4383479509,403.65087217807,418.60090448096,420.46965851882,427.14378008261,448.50096908674,461.31528248922,470.92601754108,480.53675259294,504.56359022259,523.2511306012],"description":"Marion's 7-limit Scale # 15"},"marion19":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,286.15296204753,294.32876096318,309.04519901133,313.95067836072,315.35224388912,327.03195662575,336.37572681506,343.38355445704,353.19451315581,366.27579142084,367.91095120397,373.75080757229,392.4383479509,403.65087217807,412.06026534844,420.46965851882,441.49314144476,457.84473927605,470.92601754108,490.54793493862,504.56359022259,515.07533168556,523.2511306012],"description":"Marion's 7-limit Scale # 19"},"marion26":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,284.8811711051,293.02063313667,303.87324917877,305.22982618403,310.07474405997,325.57848126297,334.88072358477,341.85740532612,348.83408706747,366.27579142084,379.84156147346,390.69417751556,406.97310157871,418.60090448096,427.32175665765,434.10464168396,455.80987376816,465.11211608996,474.80195184183,488.36772189445,512.78610798918,523.2511306012],"description":"Marion's 7-limit Scale # 26"},"marissing":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,436.04260883433,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"Peter van Marissing, just scale, Mens en Melodie, 1979"},"marpurg-1":{"frequencies":[261.6255653006,276.86979852503,294.32876096318,311.47852302926,329.62755691287,348.83408706747,370.83100115625,392.4383479509,415.30469757995,439.50340943686,467.21778431035,494.44133512215,523.2511306012],"description":"Other temperament by Marpurg, 3 fifths 1/3 Pyth. comma flat"},"marpurg-t1":{"frequencies":[261.6255653006,275.62199471997,294.32876096318,310.07474405997,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.43299207996,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Marpurg's temperament nr.1, Kirnbergersche Temperatur (1766)"},"marpurg-t11":{"frequencies":[261.6255653006,278.12325072816,294.32876096318,311.47852302926,331.11985608357,348.83408706747,371.66947115233,392.4383479509,416.24372513446,441.49314144476,466.16376151809,496.67978412536,523.2511306012],"description":"Marpurg's temperament nr.11, 6 tempered fifths"},"marpurg-t12":{"frequencies":[261.6255653006,279.06706247425,294.66131982972,310.42509491746,330.74614861362,349.22823143301,372.08941681833,392.88175996935,418.60059350213,441.99197952365,465.63764214343,496.11922267243,523.2511306012],"description":"Marpurg's temperament nr.12, 4 tempered fifths"},"marpurg-t2":{"frequencies":[261.6255653006,278.75210322491,294.32876096318,313.59611581451,331.11985608357,348.83408706747,371.66947115233,392.4383479509,418.12815462835,441.49314144476,470.39417348663,495.55929511749,523.2511306012],"description":"Marpurg's temperament nr.2, 2 tempered fifths, Neue Methode (1790)"},"marpurg-t3":{"frequencies":[261.6255653006,276.55731914056,294.32876096318,311.12698372208,331.11985608357,348.83408706747,368.74309237173,392.4383479509,414.83597850347,441.49314144476,465.11211608996,491.65745674141,523.2511306012],"description":"Marpurg's temperament nr.3, 2 tempered fifths"},"marpurg-t4":{"frequencies":[261.6255653006,276.86979852503,294.32876096318,310.07474405997,331.11985608357,348.83408706747,369.15973155124,392.4383479509,415.30469757995,441.49314144476,465.11211608996,492.21297564769,523.2511306012],"description":"Marpurg's temperament nr.4, 2 tempered fifths"},"marpurg-t5":{"frequencies":[261.6255653006,277.80935667884,294.32876096318,312.53552595124,331.11985608357,348.83408706747,370.41247575694,392.4383479509,416.71403480995,441.49314144476,468.80328869252,493.88330125613,523.2511306012],"description":"Marpurg's temperament nr.5, 2 tempered fifths"},"marpurg-t7":{"frequencies":[261.6255653006,276.86979852503,293.00227310437,310.07474405997,329.62755691287,348.83408706747,369.15973155124,390.66969766777,415.30469757995,439.50340943686,465.11211608996,492.21297564769,523.2511306012],"description":"Marpurg's temperament nr.7, 3 tempered fifths"},"marpurg-t8":{"frequencies":[261.6255653006,277.49581689502,293.33333347996,311.12698372208,329.99999983505,348.83408706747,369.99442271164,391.11111150212,414.83597850347,440,466.69047534984,493.32589719545,523.2511306012],"description":"Marpurg's temperament nr.8, 4 tempered fifths"},"marpurg-t9":{"frequencies":[261.6255653006,277.49581689502,294.32876096318,312.18279369479,331.11985608357,350.01785633742,371.24999944327,392.4383479509,416.24372513446,441.49314144476,468.27419030811,496.67978412536,523.2511306012],"description":"Marpurg's temperament nr.9, 4 tempered fifths"},"marpurg":{"frequencies":[261.6255653006,277.49581689502,293.83071040301,311.12698372208,329.99999983505,349.42557141756,369.99442271164,392.4383479509,415.53937569366,440,466.69047534984,494.16238213869,523.2511306012],"description":"Marpurg, Versuch ueber die musikalische Temperatur (1776), p. 153"},"marpurg1":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Marpurg's Monochord no.1 (1776)"},"marpurg3":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"Marpurg 3"},"marpurg4":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,313.95067836072,327.03195662575,348.83408706747,363.36884069528,392.4383479509,408.78994578219,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Marpurg 4, also Yamaha Pure Minor"},"marsh":{"frequencies":[261.6255653006,275.50659558095,293.15632631094,311.93674864629,328.48713220126,349.53094576004,368.07595926604,391.65594491223,412.43597848639,438.85779226656,466.97226207056,491.74834273545,523.2511306012],"description":"John Marsh's meantone temperament (1809)"},"marsh2":{"frequencies":[261.6255653006,277.22760066578,293.66431501254,311.21660561883,329.70790803338,349.18845812715,369.99117208793,391.90679138833,415.30984563838,439.96491544382,466.29335337935,494.03030700757,523.2511306012],"description":"John Marsh's quasi-equal temperament (1840)"},"mavila12":{"frequencies":[261.6255653006,256.98292999787,287.53945699376,321.72930260925,316.02010771872,353.59644178868,347.32175377489,388.62000642034,381.72381344999,427.11263899087,477.89842030218,469.41794908116,525.2340355968],"description":"A 12-note mavila scale (for warping meantone-based music)"},"mavila9":{"frequencies":[261.6255653006,287.53945699376,316.02010771872,321.72930260925,353.59644178868,388.62000642034,427.11263899087,434.82882549415,477.89842030218,525.2340355968],"description":"9-note scale of mavila temperament (TOP tuning)"},"mavlim1":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,465.11211608996,523.2511306012],"description":"First 27/25&135/128 scale"},"mbira_banda":{"frequencies":[261.6255653006,291.13134764929,327.53979283172,368.50142299854,404.88256627495,443.57258128492,480.10063929961,555.00605988575],"description":"Mubayiwa Bandambira's tuning of keys R2-R9 from Berliner: The soul of mbira."},"mbira_banda2":{"frequencies":[261.6255653006,321.16993719469,360.29289210659,380.8360868427,422.32008370967,461.34206956593,587.32953583482,513.96502576833,761.67217368541,711.48673390068,849.04255025658,936.10488897708,1046.50286568598,633.49659152295,1055.60951665979,1174.65975017952,1321.5609185619,1486.83332446121,1633.62433483289,1789.73120457747,1937.11498804338,2239.34414798534],"description":"Mubayiwa Bandambira's Mbira DzaVadzimu tuning B1=114 Hz"},"mbira_gondo":{"frequencies":[261.6255653006,315.28798447451,345.21700307457,379.51849407657,422.56409582244,461.07566488503,564.05539604512,516.94239487354,778.57545143809,697.24717811406,842.69088701475,926.42243447898,1029.11884353824,628.3943418294,1040.47545270591,1153.813137635,1308.64724593201,1415.59600512246,1572.51770682594,1715.83353717518,1883.05646656025,2103.91477035149],"description":"John Gondo's Mbira DzaVadzimu tuning B1=122 Hz"},"mbira_kunaka":{"frequencies":[261.6255653006,292.98704147282,325.27731021818,350.44066402496,386.59871897734,434.19311733646,479.82340237272,507.76825077597],"description":"John Kunaka's mbira tuning of keys R2-R9"},"mbira_kunaka2":{"frequencies":[261.6255653006,340.26769547546,358.83903996308,405.11650317313,448.98591596033,490.75518955849,622.61349925697,541.70354187177,817.28364083393,724.3415782324,907.35693646861,997.5144154576,1094.73088724383,673.88551872153,1085.91380691742,1216.08403680913,1350.10935126711,1454.55340013417,1604.63250673428,1802.17976955899,1991.5747030301,2107.56373750553],"description":"John Kunaka's Mbira DzaVadzimu tuning B1=113 Hz"},"mbira_mude":{"frequencies":[261.6255653006,289.28740724512,309.15639683494,364.68988616898,372.56793743951,408.17001145418,507.1819925915,459.74594725879,689.63684605432,610.50517472746,760.79276355093,824.39562982862,887.65774573556,562.75365576207,888.68380073365,1015.53708814899,1126.80895076279,1206.28956516212,1365.00817887311,1507.58874420517,1666.02447560859,1935.99638964471],"description":"Hakurotwi Mude's Mbira DzaVadzimu tuning B1=132 Hz"},"mbira_mujuru":{"frequencies":[261.6255653006,281.37682788104,301.05008478933,329.43721154897,394.9500460767,419.64523240241,533.01280425363,488.77489658044,700.88132804992,602.10016957865,765.19999119503,809.29752893,942.6160133907,577.57308891646,937.72844143307,1046.50286568598,1145.18149427149,1243.7900049313,1411.51350174391,1540.15576038017,1658.34356815416,1904.9365287586],"description":"Ephat Mujuru's Mbira DzaVadzimu tuning, B1=106 Hz"},"mbira_zimb":{"frequencies":[261.6255653006,276.86260193655,305.95868600104,343.62544191138,379.08031027329,408.40584780369,453.41648894489,507.76825077597],"description":"Shona mbira scale"},"mboko_bow":{"frequencies":[261.6255653006,347.61817721989,375.37611551499],"description":"African Mboko Mouth Bow (chordophone, single string, plucked)"},"mboko_zither":{"frequencies":[261.6255653006,294.68429813772,319.3201344739,354.92237405774,396.55020354877,418.67676528474,472.67116512585,513.07516347663],"description":"African Mboko Zither (chordophone; idiochordic palm fibre, plucked)"},"mcclain":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,306.59245933664,327.03195662575,331.11985608357,367.91095120397,392.4383479509,408.78994578219,441.49314144476,490.54793493862,510.98743222773,523.2511306012],"description":"McClain's 12-tone scale, see page 119 of The Myth of Invariance"},"mcclain_18":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,306.59245933664,319.36714514233,327.03195662575,331.11985608357,344.91651675372,367.91095120397,383.2405741708,392.4383479509,408.78994578219,413.89982010446,441.49314144476,459.88868900496,490.54793493862,496.67978412536,510.98743222773,523.2511306012],"description":"McClain's 18-tone scale, see page 143 of The Myth of Invariance"},"mcclain_8":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,367.91095120397,392.4383479509,408.78994578219,441.49314144476,490.54793493862,523.2511306012],"description":"McClain's 8-tone scale, see page 51 of The Myth of Invariance"},"mccoskey_22":{"frequencies":[261.6255653006,270.06509966514,279.06726965397,287.78812183066,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,382.37582620857,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,490.54793493862,506.89953276991,523.2511306012],"description":"31-limit rational interpretation of 22-tET, Marion McCoskey"},"mclaren_bar":{"frequencies":[261.6255653006,281.77400528964,292.14326370913,304.76756192248,325.50548568708,328.66136118639,353.45752508165,360.67039921732,379.1552038283,397.63971531932,405.75513620619,436.411067852,476.98680497297,521.16951219839],"description":"Metal bar scale. see McLaren, Xenharmonicon 15, pp.31-33"},"mclaren_cps":{"frequencies":[261.6255653006,275.93321340298,286.15296204753,294.32876096318,306.59245933664,327.03195662575,343.38355445704,367.91095120397,392.4383479509,408.78994578219,429.2294430713,441.49314144476,457.84473927605,490.54793493862,515.07533168556,523.2511306012],"description":"2)12 [1,2,3,4,5,6,8,9,10,12,14,15] a degenerate CPS"},"mclaren_harm":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,304.4370214407,307.2300216374,348.83408706747,380.54627680087,389.39619021485,393.97732186443,398.6675280771,465.11211608996,523.2511306012],"description":"from \"Wilson part 9\", claimed to be Schlesingers Dorian Enharmonic, prov. unkn"},"mclaren_rath1":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,334.88072358477,341.71502406609,348.83408706747,372.08969287196,380.54627680087,389.39619021485,398.6675280771,492.47165233054,507.3950357345,523.2511306012],"description":"McLaren Rat H1"},"mclaren_rath2":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,334.88072358477,341.71502406609,348.83408706747,380.54627680087,389.39619021485,398.6675280771,440.63253103259,452.54151835779,465.11211608996,523.2511306012],"description":"McLaren Rat H2"},"mean10":{"frequencies":[261.6255653006,272.18829429226,292.14313377277,313.56091500001,326.220453695,350.13653284039,364.27275363262,390.97854693193,406.76370320307,436.58461973079,468.59178605305,487.51045723915,523.2511306012],"description":"3/10-comma meantone scale"},"mean11":{"frequencies":[261.6255653006,272.83457350033,292.34115464648,313.24237654315,326.6628419965,350.01792709981,365.01399145768,391.11103243201,407.86767761879,437.02858581415,468.2743796482,488.33699124025,523.2511306012],"description":"3/11-comma meantone scale. A.J. Ellis no. 10"},"mean11ls_19":{"frequencies":[261.6255653006,272.93479580544,280.25721516838,292.37183188538,305.01012622427,313.1930753928,326.73140514978,340.85495140859,349.99956372811,365.12891753666,374.92476290643,391.13155279262,408.03891236124,418.98596425085,437.09738047696,455.99169236578,468.2252457596,488.46511500326,509.57988860269,523.2511306012],"description":"Least squares appr. to 3/2, 5/4, 7/6, 15/14 and 11/8, Petr Par�zek"},"mean13":{"frequencies":[261.6255653006,273.83184954717,292.64606374809,312.75295135888,327.34460995374,349.8355370417,366.15730590163,391.31494185909,409.57195510156,437.7124891801,467.78648270341,489.61131479929,523.2511306012],"description":"3/13-comma meantone scale"},"mean14":{"frequencies":[261.6255653006,274.22463192287,292.76593693997,312.56088569186,327.61283758281,349.76390952171,366.60744235102,391.39507854003,410.24343789088,437.98145930734,467.59494724206,490.11285326462,523.2511306012],"description":"3/14-comma meantone scale (Giordano Riccati, 1762)"},"mean14_15":{"frequencies":[261.6255653006,274.22463192287,279.31500250577,292.76593693997,306.86462618694,312.56088569186,327.61283758281,349.76390952171,366.60744235102,391.39507854003,410.24343789088,417.8586951835,437.98145930734,467.59494724206,490.11285326462,523.2511306012],"description":"15 of 3/14-comma meantone scale"},"mean14_19":{"frequencies":[261.6255653006,274.22463192287,279.31500250577,292.76593693997,306.86462618694,312.56088569186,327.61283758281,343.38964426558,349.76390952171,366.60744235102,373.41269440635,391.39507854003,410.24343789088,417.8586951835,437.98145930734,459.07327263526,467.59494724206,490.11285326462,513.71515101261,523.2511306012],"description":"19 of 3/14-comma meantone scale"},"mean14_7":{"frequencies":[261.6255653006,292.76593693997,327.61283758281,349.76390952171,391.39507854003,437.98145930734,490.11285326462,523.2511306012],"description":"Least squares appr. of 5L+2S to Ptolemy's Intense Diatonic scale"},"mean14a":{"frequencies":[261.6255653006,274.24690838881,292.77273178776,312.55000460003,327.62804498858,349.75985073129,366.63296888199,391.39962048672,410.28152481852,437.9967071602,467.58409501387,490.1412915133,523.2511306012],"description":"fifth of sqrt(5/2)-1 octave \"recursive\" meantone, Paul Hahn"},"mean16":{"frequencies":[261.6255653006,274.864106667,292.9608347655,312.24903186879,328.04917632434,349.64754658398,367.34009701877,391.52533508436,411.33694767869,438.41888642025,467.28387071703,490.92894854125,523.2511306012],"description":"3/16-comma meantone scale"},"mean17":{"frequencies":[261.6255653006,273.72412433093,292.61316553779,312.80569569783,327.2710181906,349.85520131118,366.03383354947,391.29294726693,409.38781813791,437.63868343995,467.83907547741,489.47372981579,523.2511306012],"description":"4/17-comma meantone scale, least squares error of 5/4 and 3/2"},"mean17_17":{"frequencies":[261.6255653006,273.72412433093,279.67971414776,292.61316553779,306.14471057197,312.80569569783,327.2710181906,349.85520131118,366.03383354947,373.99786656393,391.29294726693,409.38781813791,418.29512920081,437.63868343995,457.8767570375,467.83907547741,489.47372981579,523.2511306012],"description":"4/17-comma meantone scale with split C#/Db, D#/Eb, F#/Gb, G#/Ab and A#/Bb"},"mean17_19":{"frequencies":[261.6255653006,273.72412433093,279.67971414776,292.61316553779,306.14471057197,312.80569569783,327.2710181906,342.40527209253,349.85520131118,366.03383354947,373.99786656393,391.29294726693,409.38781813791,418.29512920081,437.63868343995,457.8767570375,467.83907547741,489.47372981579,512.10885267608,523.2511306012],"description":"4/17-comma meantone scale, least squares error of 5/4 and 3/2"},"mean18":{"frequencies":[261.6255653006,272.71477685134,292.30447317753,313.30134186202,326.58087306932,350.03988839382,364.87661266094,391.0864943589,407.66301227525,436.94633423564,468.33314368944,488.18382342185,523.2511306012],"description":"5/18-comma meantone scale (Smith). 3/2 and 5/3 eq. beat. A.J. Ellis no. 9"},"mean19":{"frequencies":[261.6255653006,273.06170311607,292.41066686775,313.13068664042,326.81820677503,349.97632128221,365.27443420834,391.15752841841,408.25574814862,437.18446858874,468.16306089008,488.62733218513,523.2511306012],"description":"5/19-comma meantone scale, fifths beats three times third. A.J. Ellis no. 11"},"mean19r":{"frequencies":[261.6255653006,273.04332227389,292.40504357126,313.13971948727,326.80563693258,349.97968716666,365.25335892465,391.15376651139,408.22434232755,437.17185753972,468.17206422213,488.60384173026,523.2511306012],"description":"Approximate 5/19-comma meantone with 19/17 tone, Petr Parizek, 2002"},"mean23":{"frequencies":[261.6255653006,274.15058593695,292.74334833321,312.59706303545,327.56228503462,349.77740346966,366.52259116395,391.37997903742,410.11684180717,437.93077103284,467.63102771476,490.01832104213,523.2511306012],"description":"5/23-comma meantone scale, A.J. Ellis no. 4"},"mean23six":{"frequencies":[261.6255653006,273.11604376732,292.42729246507,313.10398392891,326.85537164611,349.96637341293,365.33674088125,391.16864715511,408.34860251967,437.22175336101,468.13644404983,488.69678846289,523.2511306012],"description":"6/23-comma meantone scale"},"mean25":{"frequencies":[261.6255653006,272.66208311698,292.28833573479,313.32728859832,326.54481265413,350.04955123355,364.81618195011,391.07569872695,407.57299290994,436.91015056532,468.35900068872,488.11644468937,523.2511306012],"description":"7/25-comma meantone scale, least square weights 3/2:0 5/4:1 6/5:1"},"mean26":{"frequencies":[261.6255653006,272.91754119498,292.36655103694,313.20156187458,326.7196004604,350.00272362315,365.10913291207,391.12802157824,408.00943064927,437.08553692506,468.23370304224,488.44305713046,523.2511306012],"description":"7/26-comma meantone scale (Woolhouse 1835). Almost equal to meaneb742"},"mean26_21":{"frequencies":[261.6255653006,272.91754592428,280.26986822267,292.36655272572,304.98534036063,313.20156006546,326.71960423481,335.52133892506,340.8210986211,350.00272362315,365.10913712997,374.9450750913,391.12802157824,408.00943771953,419.00109777107,437.08553944976,455.95052092314,468.23370033762,488.44306277317,501.60158217053,509.52467838008,523.2511306012],"description":"21 of 7/26-comma meantone scale (Woolhouse 1835)"},"mean27":{"frequencies":[261.6255653006,273.15429014256,292.43899158768,313.08519355925,326.88152513903,349.9593710588,365.38059276675,391.17647406766,408.41395592075,437.24799400905,468.11771609009,488.74567091648,523.2511306012],"description":"7/27-comma meantone scale, least square weights 3/2:2 5/4:1 6/5:1"},"mean29":{"frequencies":[261.6255653006,273.57932033947,292.56893127899,312.87664195194,327.1720749345,349.88164908166,365.86785468743,391.26336919078,409.14031659695,437.53944680455,467.90980928584,489.28875967044,523.2511306012],"description":"7/29-comma meantone scale, least square weights 3/2:4 5/4:1 6/5:1"},"mean2sev":{"frequencies":[261.6255653006,272.52663052146,292.24684137387,313.39402123097,326.45210604021,350.07440004945,364.66083404534,391.04793957621,407.34160211012,436.81711699543,468.42550014967,487.94322738789,523.2511306012],"description":"2/7-comma meantone scale. Zarlino's temperament (1558). See also meaneb371"},"mean2sev_15":{"frequencies":[261.6255653006,272.52663052146,280.55692507618,292.24689370448,304.42377254813,313.39402847191,326.45203249943,350.07447082328,364.66081719444,391.04786051887,407.34165622677,419.34452602299,436.81710690282,468.42541627199,487.94330348661,523.2511306012],"description":"15 of 2/7-comma meantone scale"},"mean2sev_19":{"frequencies":[261.6255653006,272.52663052146,280.55692507618,292.24689370448,304.42377254813,313.39402847191,326.45203249943,340.0543130973,350.07447082328,364.66081719444,375.40603866065,391.04786051887,407.34165622677,419.34452602299,436.81710690282,455.01770749831,468.42541627199,487.94330348661,508.27414914183,523.2511306012],"description":"19 of 2/7-comma meantone scale"},"mean2sev_31":{"frequencies":[261.6255653006,264.72620698393,272.52663052146,280.55692507618,283.88190679319,292.24689370448,300.8583415146,304.42377254813,313.39402847191,317.10820138491,326.45203249943,336.07138073182,340.0543130973,350.07447082328,354.22315547012,364.66081719444,375.40603866065,379.85514366424,391.04786051887,395.6823437549,407.34165622677,419.34452602299,424.31412061457,436.81710690282,449.68851049921,455.01770749831,468.42541627199,473.97693555703,487.94330348661,502.32108537715,508.27414914183,523.2511306012],"description":"31 of 2/7-comma meantone scale"},"mean2seveb":{"frequencies":[261.6255653006,274.26749945295,292.59076110537,312.44357330613,327.42660602987,349.76102048238,366.6169314736,391.04794861134,410.01084835752,437.49574139527,467.27496094916,489.74950989452,523.2511306012],"description":"\"2/7-comma\" meantone with equal beating fifths. A.J. Ellis no. 8"},"mean2sevr":{"frequencies":[261.6255653006,272.52663052146,292.24289114742,313.39346366789,326.45152465405,350.07234194042,364.65868952128,391.04531121882,407.33886585294,436.81651812993,468.41855142334,487.93599106598,523.2511306012],"description":"Rational approximation to 2/7-comma meantone, 1/1 = 262.9333"},"mean9":{"frequencies":[261.6255653006,274.03547926168,292.70827332867,306.59245933664,327.48360691354,349.79835961887,366.39065074918,391.35653176554,409.92008797511,437.85206746661,467.68706357679,489.87127257422,523.2511306012],"description":"2/9-comma meantone scale, Lemme Rossi, Sistema musico (1666)"},"mean94":{"frequencies":[261.6255653006,268.79084150406,291.09659021292,315.25339315665,323.88740273232,350.76536842075,360.37196303797,390.27761906502,400.96635635801,434.24075936811,470.27645613296,483.15616342113,523.2511306012],"description":"4/9-comma meantone scale"},"mean9_15":{"frequencies":[261.6255653006,274.03547926168,279.45274708261,292.70827332867,306.59245933664,312.65343270838,327.48360691354,349.79835961887,366.39065074918,391.35653176554,409.92008797511,418.0235894185,437.85206746661,467.68706357679,489.87127257422,523.2511306012],"description":"15 of 2/9-comma meantone scale"},"mean9_19":{"frequencies":[261.6255653006,274.03547926168,279.45274708261,292.70827332867,306.59245933664,312.65343270838,327.48360691354,343.0174228875,349.79835961887,366.39065074918,373.63364091796,391.35653176554,409.92008797511,418.0235894185,437.85206746661,458.62082212371,467.68706357679,489.87127257422,513.10776453427,523.2511306012],"description":"19 of 2/9-comma meantone scale"},"mean9_31":{"frequencies":[261.6255653006,268.72322665693,274.03547926168,279.45274708261,287.03404351137,292.70827332867,298.49467410529,306.59245933664,312.65343270838,321.13524775754,327.48360691354,333.95746354843,343.0174228875,349.79835961887,359.28803828513,366.39065074918,373.63364091796,383.76997851754,391.35653176554,401.97367512027,409.92008797511,418.0235894185,429.36393755067,437.85181455341,446.50763144636,458.62082212371,467.68706357679,480.3749841712,489.87127257422,499.55528826613,513.10776453427,523.2511306012],"description":"31 of 2/9-comma meantone scale"},"meaneb1071":{"frequencies":[261.6255653006,273.45959631537,292.5323192343,305.76452283047,327.09038632535,349.9034421565,365.73073124967,391.23900009103,408.93579686983,437.45744778434,457.24482979639,489.13584427285,523.2511306012],"description":"Equal beating 7/4 = 3/2 same."},"meaneb1071a":{"frequencies":[261.6255653006,273.94115519525,292.67936294368,306.45675889694,327.41929816594,349.81553441422,366.28252094772,391.33731744348,409.75863641311,437.78732645584,458.39517452459,489.75074612717,523.2511306012],"description":"Equal beating 7/4 = 3/2 opposite."},"meaneb341":{"frequencies":[261.6255653006,272.43747957464,292.21954801903,313.43802026715,326.39113133433,350.09085029289,364.55867287416,391.02956482064,407.18921698842,436.75579855003,468.46925117002,487.82916876009,523.2511306012],"description":"Equal beating 6/5 = 5/4 same. Almost 4/15 Pyth. comma"},"meaneb371":{"frequencies":[261.6255653006,272.52577151658,292.24657972098,313.39444482621,326.45151771442,350.07455777399,364.65985037488,391.0477633913,407.34013625771,436.81652657765,468.42591953828,487.94213100406,523.2511306012],"description":"Equal beating 6/5 = 3/2 same. Practically 2/7-comma (Zarlino)"},"meaneb371a":{"frequencies":[261.6255653006,269.83862220337,291.42039690163,314.72828847419,324.6081803116,350.57044084899,361.57569171511,390.49462500658,421.72650333798,434.96526321606,469.75391665508,484.50062400899,523.2511306012],"description":"Equal beating 6/5 = 3/2 opposite. Almost 2/5-comma"},"meaneb381":{"frequencies":[261.6255653006,275.92799893014,293.28437056932,311.73248946737,328.77414682856,349.45463702831,368.55847249214,391.74146894101,416.38271791821,439.14534885862,466.76838786866,492.28548089506,523.2511306012],"description":"Equal beating 6/5 = 8/5 same. Almost 1/7-comma"},"meaneb451":{"frequencies":[261.6255653006,274.36682021224,292.8092284668,312.49148032108,327.70992276921,349.73795145032,366.77030983847,391.42412846541,410.48661799548,438.07873640926,467.5258138363,490.29448158868,523.2511306012],"description":"Equal beating 5/4 = 4/3 same, 5/24 comma meantone. A.J. Ellis no. 6"},"meaneb471":{"frequencies":[261.6255653006,272.3284467197,292.18612898941,313.49179640307,326.31648163178,350.11087068539,364.43361138613,391.00720457415,407.00321492741,436.68087780422,468.52283272721,487.68970701588,523.2511306012],"description":"Equal beating 5/4 = 3/2 same. Almost 5/17-comma"},"meaneb471a":{"frequencies":[261.6255653006,274.14912748586,292.7429036132,312.59777626068,327.56128980523,349.7776701617,366.52092076205,391.37968062521,410.11434970273,437.92977184699,467.63173811584,490.01645860508,523.2511306012],"description":"Equal beating 5/4 = 3/2 opposite. Almost 1/5 Pyth. Gottfried Keller (1707)"},"meaneb471b":{"frequencies":[261.6255653006,272.31089540773,292.18072491748,313.50040506268,326.30440921209,350.11400731728,364.41338872146,391.00370158472,406.97310157871,436.668886633,468.53149836075,487.66729542944,523.2511306012],"description":"21/109-comma meantone with 9/7 major thirds, almost equal beating 5/4 and 3/2"},"meaneb472":{"frequencies":[261.6255653006,270.83769079127,291.72826852127,314.23020335825,325.29440843388,350.38540704884,362.72286472858,390.7008399429,404.45761497645,435.65472502222,469.25816799182,485.78126704788,523.2511306012],"description":"Beating of 5/4 = twice 3/2 same. Almost 5/14-comma"},"meaneb472_19":{"frequencies":[261.6255653006,270.8378472333,281.80541953687,291.72826852127,302.00051792575,314.23002185182,325.29459633135,336.74877333101,350.38540704884,362.72307424558,377.41153667283,390.7008399429,404.45808222448,420.83660282593,435.65497666633,450.99513069838,469.25816799182,485.78154764623,502.88674365212,523.2511306012],"description":"Beating of 5/4 = twice 3/2 same, 19 tones"},"meaneb472a":{"frequencies":[261.6255653006,274.74648495017,292.92493846141,312.30633997417,327.96897748493,349.66886860972,367.20529370531,391.50146074488,411.13561642091,438.33843670622,467.34113372786,490.7787182415,523.2511306012],"description":"Beating of 5/4 = twice 3/2 opposite. Almost 3/17-comma"},"meaneb591":{"frequencies":[261.6255653006,273.06215106005,292.41085266114,313.13038820279,326.81843330822,349.97621009739,365.27491737756,391.15765268623,418.87439289145,437.18488525956,468.16276342643,488.62782610925,523.2511306012],"description":"Equal beating 4/3 = 5/3 same."},"meaneb732":{"frequencies":[261.6255653006,272.00548436883,292.08705896894,313.65121264041,326.09523618955,350.1701397801,364.06303937825,390.94102347986,406.4514961644,436.45893055948,468.68174619223,487.27655969467,523.2511306012],"description":"Beating of 3/2 = twice 6/5 same. Almost 4/13-comma"},"meaneb732_19":{"frequencies":[261.6255653006,272.00553778846,280.94077405591,292.08707584055,303.67560621907,313.65118727632,326.09527197795,339.03307470248,350.17012966679,364.06310036266,376.02237826726,390.94103477068,406.45158772689,419.80330474394,436.45896585468,453.77543893118,468.68171912011,487.27662724555,506.60928680033,523.2511306012],"description":"Beating of 3/2 = twice 6/5 same, 19 tones"},"meaneb732a":{"frequencies":[261.6255653006,270.68848625127,291.6822692306,314.3042667302,325.1920204578,350.41293324447,362.5515203525,390.67014898736,404.20304509584,435.55206635241,469.33217160858,485.59021720901,523.2511306012],"description":"Beating of 3/2 = twice 6/5 opposite. Almost 1/3 Pyth. comma"},"meaneb742":{"frequencies":[261.6255653006,272.89343543801,292.35917287023,313.21341909223,326.70311046689,350.00714105462,365.08148980199,391.12308516115,407.96824372307,437.06899032128,468.24551969328,488.41224041213,523.2511306012],"description":"Beating of 3/2 = twice 5/4 same."},"meaneb742a":{"frequencies":[261.6255653006,273.78850133971,292.63287562287,312.77409391616,327.31510698093,349.84341999552,366.10759179471,391.30612443552,409.49789158088,437.68290117536,467.80756449982,489.55615570194,523.2511306012],"description":"Beating of 3/2 = twice 5/4 opposite. Almost 3/13-comma, 3/14 Pyth. comma"},"meaneb781":{"frequencies":[261.6255653006,273.88372205101,292.66195046404,312.72748571568,327.38015167213,349.82604176358,366.21672762941,391.32556326448,418.15568884829,437.74813244966,467.76108961433,489.67748280644,523.2511306012],"description":"Equal beating 3/2 = 8/5 same."},"meaneb891":{"frequencies":[261.6255653006,272.7426257605,292.31307409948,313.28760473417,326.59990179186,350.03483972175,364.90860969063,391.092135133,419.1546662649,436.96549358815,468.31936361194,488.21959184068,523.2511306012],"description":"Equal beating 8/5 = 5/3 same. Almost 5/18-comma"},"meaneight":{"frequencies":[261.6255653006,276.08926119362,293.33333347996,311.65444160511,328.88393162803,349.42547049952,368.74309237173,391.77416758435,413.43299207996,439.25532436715,466.69047534984,492.49097043477,523.2511306012],"description":"1/8 Pyth. comma meantone scale"},"meanfifth":{"frequencies":[261.6255653006,274.56546814423,292.86978442859,312.39456569414,327.84548435462,349.70179235499,366.99791252626,391.46460164194,410.82629477826,438.21464222188,467.42914467878,490.54793493862,523.2511306012],"description":"1/5-comma meantone scale (Verheijen)"},"meanfifth2":{"frequencies":[261.6255653006,279.06726965397,292.86986732103,312.39452419152,327.84547867349,349.70184487387,366.99801003998,391.46454285105,417.56218018201,438.2147004401,467.42901237995,490.54793493862,523.2511306012],"description":"1/5-comma meantone by John Holden (1770)"},"meanfifth_19":{"frequencies":[261.6255653006,274.56546814423,279.06726965397,292.86978442859,307.35519222791,312.39456569414,327.84548435462,344.06059968708,349.70179235499,366.99791252626,373.01539917593,391.46460164194,410.82629477826,417.56217294621,438.21464222188,459.88868900496,467.42914467878,490.54793493862,514.81033759999,523.2511306012],"description":"19 of 1/5-comma meantone scale"},"meanfifth_43":{"frequencies":[261.6255653006,265.91515911649,270.13633240739,274.56546814423,279.06726965397,283.49717461664,288.14537375445,292.86978442859,297.67175429757,302.39711110066,307.35519222791,312.39456569414,317.35355938713,322.556865357,327.84548435462,333.22081516619,338.51040756711,344.06059968708,349.70179235499,355.43547760922,361.07770857381,366.99791252626,373.01539917593,378.93660287884,385.14971481892,391.46460164194,397.88302689184,404.19904307077,410.82629477826,417.56217294621,424.19061149626,431.14564594215,438.21464222188,445.39957775044,452.46991103879,459.88868900496,467.42914467878,475.09307907327,482.63477102771,490.54793493862,498.59100550039,506.50570672499,514.81033759999,523.2511306012],"description":"Complete 1/5-comma meantone scale"},"meanfiftheb":{"frequencies":[261.6255653006,275.80023422757,293.11157312801,311.73372470712,328.53333183909,349.48325286892,368.3828117434,391.46459711956,412.7266004334,438.69360944226,466.62683936965,491.82624824197,523.2511306012],"description":"\"1/5-comma\" meantone with equal beating fifths"},"meangold":{"frequencies":[261.6255653006,272.97231199113,292.38331430233,313.17462880702,326.75706743029,349.99269211627,365.17193449866,391.13923210785,408.10300926149,437.12312635029,468.20685771475,488.51307131873,523.2511306012],"description":"Meantone scale with Blackwood's R = phi, and diat./chrom. ST = phi, ~4/15-comma"},"meanhalf":{"frequencies":[261.6255653006,267.49544939623,290.69507255622,315.90677595028,322.99452506247,351.00752840096,358.88280562497,390.00836666198,398.75867291663,433.34262909025,470.92601754108,481.49180950675,523.2511306012],"description":"1/2-comma meantone scale"},"meanhar2":{"frequencies":[261.6255653006,273.08769296879,292.41861893027,305.22982618403,326.83598255713,349.97156260351,365.30423365264,391.16284711627,408.30015740759,437.20230245522,456.35665612784,488.66055322307,523.2511306012],"description":"1/9-Harrison's comma meantone scale"},"meanhar3":{"frequencies":[261.6255653006,274.22153683641,292.76499331753,306.86017365004,327.61072570921,343.38355445704,366.60389537541,391.39444778107,410.23814647641,437.9793418028,459.06587176894,490.10890120058,523.2511306012],"description":"1/11-Harrison's comma meantone scale"},"meanharris":{"frequencies":[261.6255653006,273.71072489962,292.60907359238,306.12544311476,327.26186315247,349.85764856047,366.01847563765,391.29021017831,409.36491649663,437.62950220286,457.84473927605,489.45661357347,523.2511306012],"description":"1/10-Harrison's comma meantone scale"},"meanhsev":{"frequencies":[261.6255653006,265.69493617871,271.18768033644,275.4057836544,279.68949451567,284.03983498254,289.91182549392,294.4211659268,299.00064605783,305.1819244006,309.92877868547,314.74946639166,321.25632089757,326.25319922315,331.32779988873,336.4813337451,343.43745382287,348.77934146077,354.20431777528,361.52682728594,367.15008027699,372.86080050545,378.66034414493,386.48843610249,392.49994642563,398.60496085649,406.84537033315,413.17351844213,419.60009331305,426.12662827999,434.93599657884,441.70106893056,448.57136642871,457.84473927605,464.96613926104,472.19830582795,481.96011959425,489.45661357347,497.06970936204,504.80122352123,515.23704142273,523.2511306012],"description":"1/14-septimal schisma tempered meantone scale"},"meanhskl":{"frequencies":[261.6255653006,275.0605216927,293.02063313667,312.15345277639,328.18310911307,349.61186736411,367.56508220664,391.56529173291,411.67289207144,438.55312706018,467.18850946536,491.17950266504,523.2511306012],"description":"Half septimal kleisma meantone"},"meanlst357_19":{"frequencies":[261.6255653006,273.71260157103,279.68803244686,292.60971924044,306.12821574316,312.81131320311,327.26311833974,342.38279105966,349.85736361975,366.02068710341,374.01129952811,391.29052886394,409.36829077259,418.30522648629,437.63082426891,457.84952434322,467.84458559023,489.45917220726,512.07206464598,523.2511306012],"description":"19 of mean-tone scale, least square error in 3/2, 5/4 and 7/4"},"meanmalc":{"frequencies":[261.6255653006,279.16226462633,292.82999876562,312.45832383396,327.75622702832,349.72564885805,366.84815356577,391.43789792004,417.67588698136,438.12522309524,467.49265244264,490.38100841085,523.2511306012],"description":"Meantone approximation to Malcolm's Monochord, 3/16 Pyth. comma"},"meannkleis":{"frequencies":[261.6255653006,277.55670411237,293.77792781181,311.66693695111,329.88161264913,349.96913477239,370.42222384066,392.07096746411,415.94530241673,440.25439013544,467.06275302556,494.35929617392,523.2511306012],"description":"1/5 kleisma tempered meantone scale"},"meanpi":{"frequencies":[261.6255653006,275.38456311745,294.43027471344,309.91448590794,326.2128298123,348.77404705732,367.11600789597,392.50613131028,413.14795414706,434.87532652316,464.95175460796,489.40347900327,523.2511306012],"description":"Pi-based meantone with Harrison's major third by Erv Wilson"},"meanpi2":{"frequencies":[261.6255653006,287.5806999253,296.7710142931,326.2128298123,336.6377243117,370.0346037192,381.85992557156,394.06315326167,433.15704755212,446.99959483943,491.34516423327,507.04724898227,523.2511306012],"description":"Pi-based meantone by Erv Wilson analogous to 22-tET"},"meanpkleis":{"frequencies":[261.6255653006,274.33428876064,294.88060759996,309.2047285643,324.22465805628,348.50752497012,365.43662717622,392.80607455881,411.88702081614,442.73537947933,464.24169412807,486.7926967469,523.2511306012],"description":"1/5 kleisma positive temperament"},"meanquar":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,312.977175335,327.03195662575,349.91912034749,365.63284274659,391.22147055517,408.78994578219,437.39890198442,468.01003810189,489.02683710225,523.2511306012],"description":"1/4-comma meantone scale. Pietro Aaron's temp. (1523). 6/5 beats twice 3/2"},"meanquar_14":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,305.64177427204,312.977175335,327.03195662575,349.91912034749,365.63284274659,391.22147055517,408.78994578219,418.60090448096,437.39890198442,468.01003810189,489.02683710225,523.2511306012],"description":"1/4-comma meantone scale with split D#/Eb and G#/Ab, Otto Gibelius (1666)"},"meanquar_15":{"frequencies":[261.6255653006,273.37431312998,279.93529690293,292.50627485027,305.64177427204,312.977175335,327.03195662575,349.91912034749,365.63284274659,391.22147055517,408.78994578219,418.60090448096,437.39890198442,468.01003810189,489.02683710225,523.2511306012],"description":"1/4-comma meantone scale with split C#/Db, D#/Eb and G#/Ab"},"meanquar_16":{"frequencies":[261.6255653006,273.37431312998,279.93548123753,292.50629850443,305.64179898843,312.97722776199,327.03195662575,349.91920725962,365.63293356166,391.22137338448,408.78994578219,418.60090448096,437.39882871549,457.04097849371,468.01000025525,489.02679755603,523.2511306012],"description":"1/4-comma meantone scale with split C#/Db, D#/Eb, G#/Ab and A#/Bb"},"meanquar_17":{"frequencies":[261.6255653006,273.37431312998,279.93529690293,292.50627485027,305.64177250659,312.977175335,327.03195662575,349.91912034749,365.63284274659,374.40803131735,391.22147055517,408.78994578219,418.60090448096,437.39889945791,457.04105241293,468.01003810189,489.02683710225,523.2511306012],"description":"1/4-comma meantone scale with split C#/Db, D#/Eb, F#/Gb, G#/Ab and A#/Bb"},"meanquar_19":{"frequencies":[261.6255653006,273.37431312998,279.93529690293,292.50627485027,305.64177427204,312.977175335,327.03195662575,341.71789064962,349.91912034749,365.63284274659,374.40803131735,391.22147055517,408.78994578219,418.60090448096,437.39890198442,457.04105241293,468.01003810189,489.02683710225,510.98743222773,523.2511306012],"description":"19 of 1/4-comma meantone scale"},"meanquar_27":{"frequencies":[261.6255653006,273.37431312998,279.93529690293,285.65065877038,292.50627485027,299.52642572255,305.64177427204,312.977175335,327.03195662575,334.88072358477,341.71789064962,349.91912034749,365.63284274659,374.40803131735,382.05221698715,391.22147055517,400.61078621746,408.78994578219,418.60090448096,427.14736482575,437.39890198442,447.89647345742,457.04105241293,468.01003810189,489.02683710225,500.76348165392,510.98743222773,523.2511306012],"description":"27 of 1/4-comma meantone scale"},"meanquar_31":{"frequencies":[261.6255653006,267.90457886781,273.37431312998,279.93529690293,285.65065877038,292.50627485027,299.52642572255,305.64177427204,312.977175335,320.48862783822,327.03195662575,334.88072358477,341.71789064962,349.91912034749,358.31717956585,365.63284274659,374.40803131735,382.05221698715,391.22147055517,400.61078621746,408.78994578219,418.60090448096,427.14736482575,437.39890198442,447.89647345742,457.04105241293,468.01003810189,479.24227945773,489.02683710225,500.76348165392,510.98743222773,523.2511306012],"description":"31 of 1/4-comma meantone scale"},"meanquareb":{"frequencies":[261.6255653006,274.90575459855,292.80763523599,312.14798050979,327.88746490679,349.6453532581,367.3522744581,391.22144795733,411.14173398328,437.99455416256,467.00507093977,490.61429903129,523.2511306012],"description":"Variation on 1/4-comma meantone with equal beating fifths"},"meanquarm23":{"frequencies":[261.6255653006,273.51763645063,292.40504357126,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,408.78994578219,436.04260883433,468.17206422213,489.12605686634,523.2511306012],"description":"1/4-comma meantone approximation with minimal order 23 beatings"},"meanquarr":{"frequencies":[261.6255653006,273.37036621967,292.50063201309,312.98169478553,327.03195662575,349.92419358955,365.62579001637,391.21579858034,408.78994578219,437.39258595147,468.01906681552,489.01974822542,523.2511306012],"description":"Rational approximation to 1/4-comma meantone, Kenneth Scholz, MTO 4.4, 1998"},"meansabat":{"frequencies":[261.6255653006,279.13726386405,294.25495796556,313.95067836072,330.95382015833,348.87783040382,372.229687597,392.38914286775,418.65339720992,441.32709511026,470.8669722571,496.36848628125,523.2511306012],"description":"1/9-schisma meantone scale of Eduard Sa'bat-Garibaldi"},"meansabat_53":{"frequencies":[261.6255653006,264.79625752493,268.00537599851,271.25338610366,275.79485124716,279.13726386405,282.52018221184,285.94410045135,290.73152483281,294.25495796556,297.82109228474,301.4304452945,305.08354077075,310.19140758515,313.95067836072,317.75550958044,321.60645175541,326.99095182327,330.95382015833,334.96471528237,339.02421924159,343.13292113612,348.87783040382,353.10595017045,357.38531136087,361.71653498009,367.77258074571,372.229687597,376.74081403286,381.30660995465,385.92774054592,392.38914286775,397.14458487807,401.95765903525,406.82906379475,413.640406907,418.65339720992,423.72714093867,428.86237189887,436.04260883433,441.32709511026,446.67562589029,452.08897683944,457.56793273834,465.22877230071,470.8669722571,476.57350267936,482.349191678,490.42492909292,496.36848628125,502.38407462043,508.4725670703,514.63484717027,523.2511306012],"description":"53-tone 1/9-schisma meantone scale"},"meanschis":{"frequencies":[261.6255653006,275.81646505128,294.24573392894,310.20599265769,327.03195662575,348.88329767713,367.80716871461,392.38299382393,413.66634097248,436.10412364188,465.24335632603,490.47874118496,523.2511306012],"description":"1/8-schisma temperament, Helmholtz"},"meanschis7":{"frequencies":[261.6255653006,275.84425785506,294.23387584933,310.2247482054,327.0846843223,348.89032888179,367.85164222246,392.37508610937,413.69968681881,436.18322603255,465.26210635182,490.54793493862,523.2511306012],"description":"1/7-schisma linear temperament"},"meanschis_17":{"frequencies":[261.6255653006,275.81646505128,290.77709705464,294.24573392894,310.20599265769,327.03195662575,330.93307160522,348.88329767713,367.80716871461,372.19468374184,392.38299382393,413.66634097248,436.10412364188,441.30634506723,465.24335632603,490.47874118496,496.32958936031,523.2511306012],"description":"17-tone 1/8-schisma linear temperament"},"meansept":{"frequencies":[261.6255653006,273.93523095528,292.67762672082,312.70235991264,327.41522444303,349.81667202162,366.27579142084,391.33604481052,409.74867679276,437.78330574787,467.73603562223,489.74334292241,523.2511306012],"description":"Meantone scale with septimal diminished fifth"},"meansept2":{"frequencies":[261.6255653006,273.61459551034,286.15296204753,292.57963558274,305.98714063953,320.00886175336,327.19620693615,342.18982383643,349.87514759905,365.9082279648,382.67602660872,391.27063976147,409.20043831214,427.95210889573,437.56358849756,457.61500463173,478.58500343311,489.333659422,511.75744671018,523.2511306012],"description":"Meantone scale with septimal neutral second"},"meansept3":{"frequencies":[261.6255653006,267.11515986718,271.23581508831,275.42019673559,281.19923906193,285.53716249988,289.94217244295,296.02592413073,300.59257160392,305.22982618403,309.9384746623,316.44180152381,321.32358037849,326.28048244956,333.12670774706,338.26588629419,343.48414905091,348.7829114007,356.10146388137,361.59490682213,367.17305499414,374.87731434423,380.66058361349,386.53284867747,394.643327573,400.73152907611,406.91341882127,413.19091223118,421.86074762795,428.36858751681,434.97682067587,444.1040384307,450.95501471222,457.91167766162,464.97592623609,474.73234784313,482.05581210758,489.49253462334,499.76337935275,507.47298512535,515.30182087389,523.2511306012],"description":"Pythagorean scale with septimal minor third"},"meansept4":{"frequencies":[261.6255653006,266.94086705872,271.13211808455,275.38917613856,280.98410555769,285.39585012732,289.87686370457,295.76613145071,300.40996929954,305.12672026341,309.91752915454,316.21395200486,321.17884203959,326.22168604472,332.8493514236,338.07543464185,343.38355445704,348.77505435772,355.86092403367,361.44831302863,367.12342987925,374.58207334188,380.46340397682,386.43730087372,394.28810581018,400.47907310734,406.76701374557,413.15368163355,421.54749623588,428.16623317002,434.88889120201,443.72428802318,450.69091522486,457.76754776364,464.95497741911,474.40121026751,481.84980583512,489.41535214975,499.35853288878,507.19898454493,515.16253949886,523.2511306012],"description":"Pythagorean scale with septimal narrow fourth"},"meansev":{"frequencies":[261.6255653006,275.93321340298,293.28595453555,311.72996498387,328.77769811601,349.45369437647,368.5644419122,391.74252566418,413.16594588103,439.14890519043,466.76586696593,492.29212632197,523.2511306012],"description":"1/7-comma meantone scale, Jean-Baptiste Romieu (1755)"},"meansev2":{"frequencies":[261.6255653006,273.98141462199,292.76593693997,312.83835055233,327.61283758281,350.07440004945,366.60744235102,391.74252566418,410.24343789088,438.37026184168,468.42550014967,490.54793493862,524.18054130269],"description":"Meantone scale with 1/7-comma stretched octave (stretched meansept)"},"meansev_19":{"frequencies":[261.6255653006,275.93321340298,278.07859353335,293.28589524255,309.32501829942,311.72996858511,328.77775508885,346.75764506664,349.4536277652,368.56443339655,371.42996022741,391.74260033637,413.16585280598,416.37814821359,439.14890011719,463.16493144882,466.76596133102,492.29202110912,496.11959049595,523.2511306012],"description":"19 of 1/7-comma meantone scale"},"meanseveb":{"frequencies":[261.6255653006,276.822915312,293.45907344559,311.2600957924,329.2717708679,349.29792128041,369.56105314287,391.74259807358,414.53862252605,439.49286138442,466.19439430972,493.21190508606,523.2511306012],"description":"\"1/7-comma\" meantone with equal beating fifths"},"meansixth":{"frequencies":[261.6255653006,275.36245350283,293.11247215425,312.00666699279,328.38886075091,349.55699144229,367.91095120397,391.62676241399,412.18948168074,438.75944753732,467.04212833931,491.56459996916,523.2511306012],"description":"1/6-comma meantone scale (tritonic temperament of Salinas)"},"meansixth_19":{"frequencies":[261.6255653006,275.36245350283,278.49009641114,293.11247215425,308.50278723002,312.00666699279,328.38886075091,345.6314161331,349.55699144229,367.91095120397,372.08969287196,391.62676241399,412.18948168074,416.87124381956,438.75944753732,461.79691129422,467.04212833931,491.56459996916,517.37477513058,523.2511306012],"description":"19 of 1/6-comma meantone scale"},"meansixtheb":{"frequencies":[261.6255653006,276.39673661379,293.31426069206,311.4574698476,328.96404447481,349.37515437283,369.07004939896,391.62674884124,413.78350416977,439.15979251365,466.37460465854,492.63446576705,523.2511306012],"description":"\"1/6-comma\" meantone with equal beating fifths"},"meansixthm":{"frequencies":[261.6255653006,275.36250599118,293.11251278827,312.00669222389,328.38895179964,349.55706816887,367.91095120397,391.62667645325,414.52369088643,438.75941205608,467.04206359353,491.56462836305,523.2511306012],"description":"modified 1/6-comma meantone scale, wolf spread over 2 fifths"},"meansixthm2":{"frequencies":[261.6255653006,276.14113065853,293.11251278827,310.24975557428,328.38895179964,349.55706816887,367.91095120397,391.62667645325,414.52380581681,438.75941205608,465.72523006308,491.56462836305,523.2511306012],"description":"modified 1/6-comma meantone scale, wolf spread over 4 fifths"},"meansixthpm":{"frequencies":[261.6255653006,275.00020270933,293.00227310437,309.72478954314,328.14198392915,348.83408706747,367.49599295996,391.5530240856,412.50030385781,438.51190905657,465.11211608996,491.10256480205,523.2511306012],"description":"modified 1/6P-comma temperament, French 18th century"},"meansixthso":{"frequencies":[261.6255653006,273.09145986506,292.50627485027,313.30134186202,327.03195662575,350.28154752005,365.63284274659,391.62667645325,408.78994578219,437.85193595173,468.98001879925,489.53334447372,524.3356019912],"description":"1/6-comma meantone scale with 1/6-comma stretched oct, Dave Keenan TL 13-12-99"},"meanstr":{"frequencies":[261.6255653006,272.52663052146,292.30447317753,313.51763757869,326.58087306932,350.28154752005,364.87661266094,391.35649333595,407.66301227525,437.24799400905,468.98001879925,488.52085380073,523.97386302914],"description":"Meantone with 1/9-comma stretched octave, Petr Parizek (2006)"},"meanten":{"frequencies":[261.6255653006,276.96346718799,293.59840699152,311.2324721493,329.47860040677,349.26769656434,369.74365294187,391.95114287501,414.92943551322,439.85086739936,466.26912673157,493.60433806962,523.2511306012],"description":"1/10-comma meantone scale"},"meanthird":{"frequencies":[261.6255653006,271.40047399919,291.9012907804,313.95067836072,325.68056936328,350.28154752005,363.36884069528,390.81668391305,405.4184580124,436.04260883433,468.98001879925,486.50215045777,523.2511306012],"description":"1/3-comma meantone scale (Salinas)"},"meanthird_19":{"frequencies":[261.6255653006,271.40047399919,281.38801176707,291.9012907804,302.80736724606,313.95067836072,325.68056936328,337.848714425,350.28154752005,363.36884069528,376.74081403286,390.81668391305,405.4184580124,420.33785775232,436.04260883433,452.33412516107,468.98001879925,486.50215045777,504.40543017669,523.2511306012],"description":"Complete 1/3-comma meantone scale"},"meanthirdeb":{"frequencies":[261.6255653006,273.41679662438,292.30169912182,312.83755546226,326.81234905863,349.91518709086,365.63683018302,390.81669745772,408.5035451685,436.83089868331,467.63468237516,488.59687355467,523.2511306012],"description":"\"1/3-comma\" meantone with equal beating fifths"},"meanvar1":{"frequencies":[261.6255653006,274.22463192287,292.50627485027,312.00669222389,327.03195662575,349.55706816887,366.3906401674,391.22147055517,410.48618883318,437.39890198442,467.04206359353,489.53334447372,523.2511306012],"description":"Variable meantone 1: C-G-D-A-E 1/4, others 1/6"},"meanvar2":{"frequencies":[261.6255653006,274.19219069011,292.50627485027,312.04360750473,327.03195662575,349.70184487387,366.23895640989,391.22147055517,410.65012590831,437.39890198442,467.23549927892,489.3306802979,523.2511306012],"description":"Variable meantone 2: C..E 1/4, 1/5-1/6-1/7-1/8 outward both directions"},"meanvar3":{"frequencies":[261.6255653006,275.36250599118,292.50627485027,310.71739423852,327.03195662575,349.55706816887,367.15000817177,391.22147055517,413.04376116614,437.39890198442,466.0760911248,489.53334447372,523.2511306012],"description":"Variable meantone 3: C..E 1/4, 1/6 next, then Pyth."},"meanvar4":{"frequencies":[261.6255653006,275.07759559501,292.50627485027,311.03921839762,327.03195662575,349.91912034749,366.77012764335,391.22147055517,412.61639318626,437.39890198442,466.55882736321,489.02683710225,523.2511306012],"description":"Variable meantone 4: naturals 1/4-comma, accidentals Pyth."},"mediant16":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,392.4383479509,411.12588832951,418.60090448096,425.14154361347,436.04260883433,448.50096908674,457.84473927605,470.92601754108,523.2511306012],"description":"Mediant doubling of octave done four times"},"mercadier":{"frequencies":[261.6255653006,276.24519242498,293.00227310437,310.42509491746,328.14198392915,349.22823143301,368.74309237173,391.5530240856,413.90012676351,438.51190905657,465.63764214343,492.21297564769,523.2511306012],"description":"Mercadier's well-temperament (1777), 1/12 and 1/6 Pyth. comma"},"mercadier2":{"frequencies":[261.6255653006,276.14388692511,292.95319623755,310.40895756597,328.03206784165,349.20805980193,368.45885450371,391.49761638186,413.86785247997,438.37641748302,465.57175090792,491.63473786767,523.2511306012],"description":"Mercadier de Belestas (1776)"},"mercator":{"frequencies":[261.6255653006,272.09448029963,279.3054110864,290.48161516351,306.08206748155,318.32990397837,326.76614606023,335.42596179815,348.84778913489,362.80689075348,372.42184279259,387.32403355801,408.12545368833,418.94141877379,435.70530841001,453.13974129598,465.14865565404,490.12996697565,509.74216322321,523.2511306012],"description":"19 out of 53-tET, see Mandelbaum p. 331"},"merrick":{"frequencies":[261.6255653006,278.62147458377,295.28844751169,312.94924079019,329.91874474504,349.29981986967,371.62722343835,394.01440557319,416.60121863153,438.96906929631,468.0242659544,493.6331420766,523.2511306012],"description":"A. Merrick's melodically tuned equal temperament (1811)"},"mersen_l1":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,313.95067836072,327.03195662575,348.83408706747,372.08969287196,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Mersenne lute 1"},"mersen_l2":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,372.08969287196,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Mersenne lute 2"},"mersen_s1":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,313.95067836072,327.03195662575,348.83408706747,372.08969287196,392.4383479509,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Mersenne spinet 1"},"mersen_s2":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,306.59245933664,327.03195662575,348.83408706747,363.36884069528,392.4383479509,408.78994578219,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Mersenne spinet 2"},"mersenmt1":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,311.03921839762,327.03195662575,349.91912034749,365.63284274659,391.22147055517,408.78994578219,437.39890198442,466.55882736321,489.02683710225,523.2511306012],"description":"Mersenne's Improved Meantone 1"},"mersenmt2":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,309.11326130363,327.03195662575,349.91912034749,365.63284274659,391.22147055517,408.78994578219,437.39890198442,465.11211608996,489.02683710225,523.2511306012],"description":"Mersenne's Improved Meantone 2"},"mersenne":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,306.59245933664,310.07474405997,313.95067836072,322.99452506247,327.03195662575,340.65828815182,344.52749339997,348.83408706747,363.36884069528,367.91095120397,372.08969287196,376.74081403286,387.59343007496,392.4383479509,408.78994578219,413.43299207996,418.60090448096,430.65936674996,436.04260883433,454.2110508691,459.88868900496,465.11211608996,470.92601754108,484.4917875937,490.54793493862,510.98743222773,523.2511306012],"description":"31-note choice system of Mersenne, Harmonie universelle (1636)"},"meyer":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,373.75080757229,392.4383479509,418.60090448096,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,490.54793493862,523.2511306012],"description":"Max Meyer, see Doty, David, 1/1 August 1992 (7:4) p.1 and 10-14"},"meyer_29":{"frequencies":[261.6255653006,268.26840191956,275.93321340298,286.15296204753,289.72987407313,294.32876096318,306.59245933664,321.92208230347,327.03195662575,331.11985608357,343.38355445704,344.91651675372,357.69120255941,367.91095120397,372.50983809402,383.2405741708,386.30649876417,392.4383479509,408.78994578219,413.89982010446,429.2294430713,441.49314144476,457.84473927605,459.88868900496,482.88312345521,490.54793493862,496.67978412536,510.98743222773,515.07533168556,523.2511306012],"description":"Max Meyer, see Doty, David, 1/1 August 1992 (7:4) p.1 and 10-14"},"mid_enh1":{"frequencies":[261.6255653006,269.10058145205,336.37572681506,348.83408706747,392.4383479509,403.65087217807,504.56359022259,523.2511306012],"description":"Mid-Mode1 Enharmonic, permutation of Archytas's with the 5/4 lying medially"},"mid_enh2":{"frequencies":[261.6255653006,271.31540105247,339.14425131559,348.83408706747,392.4383479509,406.97310157871,508.71637697339,523.2511306012],"description":"Permutation of Archytas' Enharmonic with the 5/4 medially and 28/27 first"},"miller19":{"frequencies":[261.6255653006,271.16557874802,283.07475767856,293.39690257971,304.09543631541,315.18408718336,326.67707691855,338.58915326012,350.93559605343,363.73224209988,376.99551198295,390.74241649248,407.9032302438,422.77716528297,438.1934715504,454.17192383337,470.73301771751,487.89800430439,505.68889852562,524.12852955557],"description":"TOP tempered nr. 64 [1202.9, 570.4479508], 7-limit {225/224, 1029/1000}"},"miller7":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,313.95067836072,329.64821227876,353.19451315581,366.27579142084,392.4383479509,412.06026534844,439.53094970501,470.92601754108,494.47231841813,523.2511306012],"description":"Herman Miller, 7-limit JI. mode of parizek_ji1"},"miller_12":{"frequencies":[261.6255653006,273.36657578691,291.63627719304,313.29104303136,327.35065305942,349.22823143301,364.90060015836,391.99543598175,418.19337019276,436.9606979923,456.57025003029,487.08386390194,523.2511306012],"description":"Herman Miller, scale with appr. to three 7/4 and one 11/8. Tuning List 19-11-99"},"miller_12a":{"frequencies":[261.6255653006,273.46133384191,291.68681828778,313.23675853409,327.40738352015,349.22823143301,365.02708698668,391.99543598175,418.12090908234,437.03642407223,456.80766452229,487.25270356141,523.85596330884],"description":"Herman Miller, \"Starling\" scale, alternative version TL 25-11-99"},"miller_12r":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,313.95067836072,327.03195662575,348.83408706747,363.36884069528,392.4383479509,418.60090448096,436.04260883433,454.2110508691,484.4917875937,523.2511306012],"description":"Herman Miller, \"Starling\" scale rational version"},"miller_ar1":{"frequencies":[261.6255653006,276.1828093671,293.13465239421,310.07474405997,327.9937953665,348.83408706747,368.24374600687,391.64146650178,414.27421384356,438.21489534465,465.11211608996,490.99166158792,523.2511306012],"description":"Herman Miller, \"Arrow I\" well-temperament"},"miller_ar2":{"frequencies":[261.6255653006,276.1828093671,293.13465239421,310.2849072826,328.2161033156,349.07052034394,368.24374600687,391.64146650178,414.27421384356,438.51190905657,465.42736069124,491.32444638706,523.2511306012],"description":"Herman Miller, \"Arrow II\" well-temperament"},"miller_b1":{"frequencies":[261.6255653006,276.37000081643,292.93610587951,310.49521248455,328.2161033156,348.83408706747,368.4933346061,391.64146650178,413.993616853,438.80912407872,465.11211608996,491.32444638706,523.2511306012],"description":"Herman Miller, \"Butterfly I\" well-temperament"},"miller_b2":{"frequencies":[261.6255653006,276.55731914056,293.13465239421,310.70566022736,328.2161033156,349.07052034394,368.74309237173,392.17254067411,414.27421384356,439.10654054756,465.42736069124,491.99069280383,523.2511306012],"description":"Herman Miller, \"Butterfly II\" well-temperament"},"miller_bug":{"frequencies":[261.6255653006,275.99574470663,292.73769384471,310.49521248455,327.54963108844,348.83408706747,368.4933346061,391.64146650178,413.993616853,437.62147130622,465.11211608996,491.32444638706,523.2511306012],"description":"Herman Miller, \"Bug I\" well-temperament"},"miller_dim":{"frequencies":[261.6255653006,272.37088095799,275.97178311718,291.10467300644,307.06737543415,311.12698372208,323.9053895548,328.18760802294,346.1837483498,365.1667076515,369.99442271164,385.1905938463,390.2830385166,411.68417663589,434.25884690128,440,458.07139483414,464.12736626882,489.57775198944,516.42371048788,523.2511306012],"description":"Diminished temperament, g=92.421, oct=1/4, 7-limit"},"miller_nikta":{"frequencies":[261.6255653006,272.78230567952,282.82337239762,292.30660227893,305.1368529352,315.1779191367,326.89249731477,341.39626079795,349.76381456689,364.82541608424,379.88701473,391.60159255926,407.77886614283,422.28262813098,436.22855406869,456.86852448015,469.69877536137,488.10739794888,508.74736733766,523.2511306012],"description":"Herman Miller, 19-tone scale of \"Nikta\". Tuning List 22-1-99"},"miller_sp":{"frequencies":[261.6255653006,276.74268633071,292.73329748773,304.15432597486,321.72882314722,340.31880135827,353.5963846,374.02771873076,395.63960626236,411.07553805605,434.82810464551,459.95313047266,477.89826295658,505.51194770063,525.23456349057],"description":"Herman Miller, Superpelog temperament, TOP tuning"},"minor_5":{"frequencies":[261.6255653006,299.00064605783,348.83408706747,418.60090448096,465.11211608996,523.2511306012],"description":"A minor pentatonic"},"minor_clus":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,348.83408706747,353.19451315581,372.08969287196,392.4383479509,418.60090448096,441.49314144476,465.11211608996,470.92601754108,523.2511306012],"description":"Chalmers' Minor Mode Cluster, Genus [333335]"},"minor_wing":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,327.03195662575,348.83408706747,376.74081403286,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Chalmers' Minor Wing with 7 minor and 6 major triads"},"minortone":{"frequencies":[261.6255653006,264.87670583656,269.18630372462,273.56601964703,276.96554054138,281.47182622933,286.05143175444,290.70554674078,294.31805527354,299.10666990622,303.97319627313,307.75057781118,312.75774231814,317.84637624619,323.01780144749,327.03184444407,332.35271908155,337.76016543181,341.95740725719,347.52112383796,353.17536321933,358.9216002989,363.3818066762,369.29410472703,375.30259493676,379.96636500161,386.14849505708,392.43120962619,398.81614754309,403.7721109712,410.34156772664,417.0179085097,422.20006196255,429.06934285921,436.05038835349,443.14501943782,448.65184388114,455.95150328441,463.36992699746,469.12808274602,476.76089208744,484.51788878959,492.4010934061,498.52001054206,506.63103252794,514.8740254656,523.2511306012],"description":"Minortone temperament, g=182.466089, 5-limit"},"miracle1":{"frequencies":[261.6255653006,266.71173418545,279.86396690685,285.30470202322,299.37379946195,305.19382000629,320.24370022528,326.46944327063,342.56848033562,349.22823143301,366.44956000397,373.57357677338,391.99543598175,399.61607881612,419.32216217931,427.47405410759,448.5538823653,457.27406033445,479.82340237272,489.15147723638,513.27277840175,523.2511306012],"description":"21 out of 72-tET Pyth. scale \"Miracle/Blackjack\", Keenan & Erlich, TL 2-5-2001"},"miracle1a":{"frequencies":[261.6255653006,266.57640943865,279.87817034289,285.17441410431,299.40418912991,305.0699313594,320.29246281951,326.35348199782,342.63803067389,349.1219037468,366.54256247747,373.47879032775,392.11482112276,399.53496279579,419.47115746916,427.40897376302,448.73603972606,457.22764679928,480.04261976898,489.12665346498,513.5333359992,523.2511306012],"description":"Version of Blackjack with just 11/8 intervals"},"miracle2":{"frequencies":[261.6255653006,266.71172956369,274.52699087907,279.86396690685,285.30469707927,293.66477470251,299.3738011912,305.19381471768,314.13668880034,320.24370207508,326.46943949911,336.03573785931,342.56848231438,349.22822739856,359.4614100947,366.44956423737,373.57357245769,380.83607584373,391.99544051026,399.61607650784,407.38486242506,419.32216702351,427.4740516384,435.78441397758,448.55389013814,457.27405769313,466.16375074742,479.82341068742,489.15147723638,498.66088722045,513.27278729609,523.2511306012],"description":"31 out of 72-tET Pythagorean scale \"Miracle/Canasta\", tempered Fokker-M, 36 7-limit tetrads"},"miracle24":{"frequencies":[261.6255653006,266.71173418545,274.52698453615,279.86396690685,285.30470202322,299.37379946195,305.19382000629,320.24370022528,326.46944327063,342.56848033562,349.22823143301,366.44956000397,373.57357677338,391.99543598175,399.61607881612,419.32216217931,427.47405410759,448.5538823653,457.27406033445,466.16376151809,479.82340237272,489.15147723638,498.66089874196,513.27277840175,523.2511306012],"description":"Miracle[24] in 72-tET tuning."},"miracle2a":{"frequencies":[261.6255653006,266.57640943865,274.68028654691,279.87817034289,285.17441410431,293.84366906071,299.40418912991,305.0699313594,314.34400674513,320.29246281951,326.35348199782,336.27457379784,342.63803067389,349.1219037468,359.73515228832,366.54256247747,373.47879032775,380.54627680087,392.11482112276,399.53496279579,407.09552105481,419.47115746916,427.40897376302,435.49700296564,448.73603972606,457.22764679928,465.87994655565,480.04261976898,489.12665346498,498.38259075187,513.5333359992,523.2511306012],"description":"Version of Canasta with just 11/8 intervals"},"miracle3":{"frequencies":[261.6255653006,266.71172956369,271.8967720342,274.52699087907,279.86396690685,285.30469707927,290.85119844166,293.66477470251,299.3738011912,305.19381471768,311.12697293924,314.13668880034,320.24370207508,326.46943949911,332.81620914398,336.03573785931,342.56848231438,349.22822739856,356.01744208336,359.4614100947,366.44956423737,373.57357245769,380.83607584373,384.52012922913,391.99544051026,399.61607650784,407.38486242506,411.32573797959,419.32216702351,427.4740516384,435.78441397758,440.00001524924,448.55389013814,457.27405769313,466.16375074742,470.67322937359,479.82341068742,489.15147723638,498.66088722045,503.48472993456,513.27278729609,523.2511306012],"description":"41 out of 72-tET Pythagorean scale \"Miracle/Studloco\", Erlich/Keenan 2001"},"miracle31s":{"frequencies":[261.6255653006,266.63636836248,274.61234258734,279.87187586531,285.23214274484,293.7643779857,299.39072204343,305.12482507342,314.2521161294,320.27085311289,326.40486440328,336.1687117034,342.60720791066,349.16901789451,359.61381619398,366.50134650551,373.52079096839,380.6746756467,392.06191220286,399.57090708206,407.22371854314,419.40512463865,427.43781242392,435.62434685833,448.6553095271,457.24821364991,466.00569400686,479.94546308962,489.13765420145,498.50589943595,513.41785698047,523.2511306012],"description":"Canasta with Secor's minimax generator of 116.7155941 cents (5:9 exact). XH5, 1976"},"miracle3a":{"frequencies":[261.6255653006,266.57640943865,271.6209387912,274.68028654691,279.87817034289,285.17441410431,290.57088243021,293.84366906071,299.40418912991,305.0699313594,310.84289043406,314.34400674513,320.29246281951,326.35348199782,332.52919812642,336.27457379784,342.63803067389,349.1219037468,355.72847573316,359.73515228832,366.54256247747,373.47879032775,380.54627680087,384.83248369581,392.11482112276,399.53496279579,407.09552105481,411.6807594913,419.47115746916,427.40897376302,435.49700296564,440.40213577526,448.73603972606,457.22764679928,465.87994655565,471.12729153307,480.04261976898,489.12665346498,498.38259075187,503.99602271809,513.5333359992,523.2511306012],"description":"Version of Studloco with just 11/8 intervals"},"miracle3ls":{"frequencies":[261.6255653006,266.8561524992,272.19132869617,274.36355553357,279.84880885615,285.44374339214,291.1505189834,293.47406686496,299.34138986722,305.32601617869,311.43030899178,313.91568307924,320.1916880693,326.59318586748,333.12264767748,335.78115718319,342.4943108472,349.34167821305,356.32594256772,359.16962765504,366.35037871957,373.67471357934,381.14545968569,384.18721873359,391.86813762951,399.70261841457,407.69373119716,410.94736065575,419.16328558448,427.54349328421,436.09121881038,439.57145109254,448.35967321435,457.32356924795,466.46667727785,470.18934850506,479.58967749961,489.177972196,498.95793401383,502.93987502638,512.99500332159,523.2511306012],"description":"Miracle-41 in a 7-limit least-squares tuning, Gene Ward Smith, 2001"},"miracle3p":{"frequencies":[261.6255653006,266.34679554672,270.06721067987,274.94077677072,279.90228841312,284.95333588433,290.09553330897,294.14767822015,299.45579274291,304.85969791727,310.36112062791,314.69634158508,320.37527393455,326.15668500873,332.04242788125,336.6805001021,342.75615313904,348.94144590806,355.2383548887,360.20043713509,366.70052302062,373.3179099666,380.0547104455,385.36343543368,392.31760641523,399.39727291251,406.60469732047,412.28427858225,419.7242587073,427.29849640545,435.00941939202,441.0857666732,449.04549132915,457.14885520764,465.39844769831,471.89927840742,480.41505607532,489.08450736089,497.91040254418,504.86537329764,513.97604599191,523.2511306012],"description":"Least squares Pythagorean approximation to partch_43"},"miracle41s":{"frequencies":[261.6255653006,266.63636836248,269.45164985995,274.61234258734,279.87187586531,285.23214274484,290.69507255622,293.7643779857,299.39072204343,305.12482507342,310.96875093738,314.2521161294,320.27085311289,326.40486440328,332.65635780028,336.1687117034,342.60720791066,349.16901789451,355.85650343121,359.61381619398,366.50134650551,373.52079096839,380.6746756467,384.69403121132,392.06191220286,399.57090708206,407.22371854314,411.52339231679,419.40512463865,427.43781242392,435.62434685833,440.22388881539,448.6553095271,457.24821364991,466.00569400686,470.92601754108,479.94546308962,489.13765420145,498.50589943595,503.76937659657,513.41785698047,523.2511306012],"description":"StudLoco with Secor's minimax generator of 116.7155941 cents (5:9 exact). XH5, 1976"},"miracle_12":{"frequencies":[261.6255653006,279.86396690685,299.37379946195,320.24370022528,336.03572815422,342.56848033562,359.46139971304,366.44956000397,384.52011812375,411.32572372413,440,470.6732130613,523.2511306012],"description":"A 12-tone subset of Blackjack with six 4-7-9-11 tetrads"},"miracle_12a":{"frequencies":[261.6255653006,279.86396690685,299.37379946195,320.24370022528,342.56848033562,366.44956000397,391.99543598175,419.32216217931,448.5538823653,479.82339960115,489.15147723638,513.27277840175,523.2511306012],"description":"A 12-tone chain of Miracle generators and subset of Blackjack"},"24erlich-keenan":{"frequencies":[261.6255653006,266.71173469898,279.86396636799,285.30470202322,290.8512090818,299.37380003836,305.19381941867,320.24370022528,326.46944389922,342.56847967604,349.22823143301,356.01745305102,366.44956070954,373.5735760541,391.99543598175,399.61607958554,407.38487340641,419.32216137194,427.47405410759,448.55388322895,457.27405945401,479.82340237272,489.15147817819,498.66089778183,523.2511306012],"description":"24 note mapping for Erlich/Keenan Miracle scale low version, tuned to 72-equal"},"miracle_8":{"frequencies":[261.6255653006,279.86396690685,314.13668154225,336.03572815422,366.44956000397,391.99543598175,419.32216217931,448.5538823653,523.2511306012],"description":"tet3a in 72-et"},"miring1":{"frequencies":[261.6255653006,285.29448470177,307.6953604706,387.15515639797,420.96788906714,523.2511306012],"description":"Gamelan Miring from Serdang wetan, Tangerang. 1/1=309.5 Hz"},"miring2":{"frequencies":[261.6255653006,279.34865171253,304.66723527068,384.42070010042,412.69311132744,523.2511306012],"description":"Gamelan Miring (Melog gender) from Serdang wetan"},"misca":{"frequencies":[261.6255653006,274.70684356563,289.16509849014,305.22982618403,348.83408706747,392.4383479509,412.06026534844,433.74764773521,457.84473927605,523.2511306012],"description":"21/20 x 20/19 x 19/18=7/6 7/6 x 8/7=4/3"},"miscb":{"frequencies":[261.6255653006,269.80136421624,278.50463402967,319.76457981184,348.83408706747,392.4383479509,404.70204632437,417.75695104451,479.64686971777,523.2511306012],"description":"33/32 x 32/31x 31/27=11/9 11/9 x 12/11=4/3"},"miscc":{"frequencies":[261.6255653006,276.00059636107,292.04714266113,310.07474405997,348.83408706747,392.4383479509,414.00089454161,438.0707139917,465.11211608996,523.2511306012],"description":"96/91 x 91/86 x 86/54=32/27. 32/27 x 9/8=4/3."},"miscd":{"frequencies":[261.6255653006,271.68808704293,282.55561052465,294.32876096318,348.83408706747,392.4383479509,407.5321305644,423.83341578697,441.49314144476,523.2511306012],"description":"27/26 x 26/25 x 25/24=9/8. 9/8 x 32/27=4/3."},"misce":{"frequencies":[261.6255653006,280.31310567921,301.87565226992,327.03195662575,348.83408706747,392.4383479509,420.46965851882,452.81347840488,490.54793493862,523.2511306012],"description":"15/14 x 14/13 x 13/12=5/4. 5/4 x 16/15= 4/3."},"miscf":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,348.83408706747,378.42269266694,392.4383479509,406.97310157871,418.60090448096,504.56359022259,523.2511306012],"description":"SupraEnh1"},"miscg":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,336.37572681506,348.83408706747,392.4383479509,406.97310157871,418.60090448096,504.56359022259,523.2511306012],"description":"SupraEnh 2"},"misch":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,336.37572681506,348.83408706747,392.4383479509,406.97310157871,490.54793493862,504.56359022259,523.2511306012],"description":"SupraEnh 3"},"misty":{"frequencies":[261.6255653006,268.57642185399,270.57706033988,272.59260010205,274.62315370363,276.66883458144,284.01936005382,286.13503371773,288.26646546986,290.41377434565,292.57708030445,300.35025535204,302.58757688062,304.84156607104,307.11234355974,309.40003795144,311.70477168653,319.9861304005,322.36972224007,324.77106769218,327.19030275625,329.62755691287,338.38508739928,340.90573394089,343.44515491415,346.00349213972,348.58088853904,357.84197030948,360.50755209334,363.19298782427,365.89842747751,368.62402219236,378.41760905933,381.23645754858,384.07630597582,386.93730633346,389.81962065329,392.72340320054,403.157261366,406.16039889903,409.18590458221,412.23394976407,415.30469757995,426.33849458487,429.51431022199,432.71378016074,435.93708308397,439.18439906139,450.85263092877,454.21105352848,457.59449053401,461.00313090234,464.43716505707,476.77631130474,480.3278378528,483.9058226648,487.51045723915,491.14194572312,494.80048247871,507.94632001299,511.73003620658,515.54193450341,519.38223078906,523.2511306012],"description":"Misty temperament, g=96.787939, p=400, 5-limit"},"mistyschism":{"frequencies":[261.6255653006,278.75251614148,294.32876096318,310.42486507835,330.74639366397,348.83408706747,372.08969287196,392.4383479509,418.12877421223,440.99519155196,465.63729761752,496.11959049595,523.2511306012],"description":"Mistyschism scale 32805/32768 and 67108864/66430125"},"mixed9_3":{"frequencies":[261.6255653006,273.20871865617,285.30470202322,311.12698372208,349.22823143301,391.99543598175,409.35055662695,427.47405410759,466.16376151809,523.2511306012],"description":"A mixture of the hemiolic chromatic and diatonic genera, 75 + 75 + 150 + 200 c"},"mixed9_4":{"frequencies":[261.6255653006,271.89678302796,282.57123920205,305.19382000629,349.22823143301,391.99543598175,407.38487419079,423.37848741825,457.27406033445,523.2511306012],"description":"Mixed enneatonic 4, each \"tetrachord\" contains 67 + 67 + 133 + 233 cents."},"mixed9_5":{"frequencies":[261.6255653006,277.18263097687,293.66476791741,329.62755691287,349.22823143301,391.99543598175,415.30469757995,440,493.88330125613,523.2511306012],"description":"A mixture of the intense chromatic genus and the permuted intense diatonic"},"mixed9_6":{"frequencies":[261.6255653006,277.18263097687,293.66476791741,311.12698372208,349.22823143301,391.99543598175,415.30469757995,440,466.16376151809,523.2511306012],"description":"Mixed 9-tonic 6, Mixture of Chromatic and Diatonic"},"mixed9_7":{"frequencies":[261.6255653006,277.18263097687,311.12698372208,329.62755691287,349.22823143301,391.99543598175,415.30469757995,466.16376151809,493.88330125613,523.2511306012],"description":"Mixed 9-tonic 7, Mixture of Chromatic and Diatonic"},"mixed9_8":{"frequencies":[261.6255653006,293.66476791741,311.12698372208,329.62755691287,349.22823143301,391.99543598175,440,466.16376151809,493.88330125613,523.2511306012],"description":"Mixed 9-tonic 8, Mixture of Chromatic and Diatonic"},"mixol_chrom":{"frequencies":[261.6255653006,274.08392555301,287.78812183066,302.93486508491,311.12229387098,319.76457981184,359.73515228832,411.12588832951,426.35277308246,434.39716502741,442.75095666255,479.64686971777,523.2511306012,548.16785110602,575.57624366132,605.86973016981,622.24458774197,639.52915962369,719.47030457665,822.25177665903,852.70554616492,868.79433005482,885.50191332511,959.29373943553,1046.5022612024],"description":"Mixolydian chromatic tonos"},"mixol_chrom2":{"frequencies":[261.6255653006,271.31540105247,281.75060878526,332.97799220076,366.27579142084,385.55346465352,406.97310157871,523.2511306012],"description":"Schlesinger's Mixolydian Harmonia in the chromatic genus"},"mixol_chrominv":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,373.75080757229,411.12588832951,429.81342870813,448.50096908674,523.2511306012],"description":"A harmonic form of Schlesinger's Chromatic Mixolydian inverted"},"mixol_diat":{"frequencies":[261.6255653006,274.08392555301,287.78812183066,319.76457981184,338.57426097725,359.73515228832,383.71749577421,411.12588832951,442.75095666255,460.46099492906,479.64686971777,500.50108144463,523.2511306012,548.16785110602,575.57624366132,639.52915962369,677.14852195449,719.47030457665,767.43499154843,822.25177665903,885.50191332511,920.92198985811,959.29373943553,1001.00216288925,1046.5022612024],"description":"Mixolydian diatonic tonos"},"mixol_diat2":{"frequencies":[261.6255653006,281.75060878526,305.22982618403,332.97799220076,348.83408706747,366.27579142084,406.97310157871,457.84473927605,523.2511306012],"description":"Schlesinger's Mixolydian Harmonia, a subharmonic series though 13 from 28"},"mixol_diatcon":{"frequencies":[261.6255653006,281.75060878526,305.22982618403,332.97799220076,392.4383479509,406.97310157871,457.84473927605,523.2511306012],"description":"A Mixolydian Diatonic with its own trite synemmenon replacing paramese"},"mixol_diatinv":{"frequencies":[261.6255653006,299.00064605783,336.37572681506,348.83408706747,411.12588832951,448.50096908674,485.87604984397,523.2511306012],"description":"A Mixolydian Diatonic with its own trite synemmenon replacing paramese"},"mixol_diatinv2":{"frequencies":[261.6255653006,299.00064605783,336.37572681506,348.83408706747,373.75080757229,411.12588832951,448.50096908674,485.87604984397,523.2511306012],"description":"Inverted Schlesinger's Mixolydian Harmonia, a harmonic series from 14 from 28"},"mixol_enh":{"frequencies":[261.6255653006,274.08392555301,287.78812183066,295.1673044417,299.00064605783,302.93486508491,348.83408706747,411.12588832951,418.60090448096,422.44127975143,426.35277308246,469.85815809087,523.2511306012,548.16785110602,575.57624366132,590.33460888341,598.00129211566,605.86973016981,697.66817413493,822.25177665903,837.20180896192,844.88255950285,852.70554616492,939.71631618175,1046.5022612024],"description":"Mixolydian Enharmonic Tonos"},"mixol_enh2":{"frequencies":[261.6255653006,266.38239376061,271.31540105247,332.97799220076,366.27579142084,375.66747838035,385.55346465352,523.2511306012],"description":"Schlesinger's Mixolydian Harmonia in the enharmonic genus"},"mixol_enhinv":{"frequencies":[261.6255653006,270.34641747729,279.06726965397,373.75080757229,411.12588832951,420.46965851882,429.81342870813,523.2511306012],"description":"A harmonic form of Schlesinger's Mixolydian inverted"},"mixol_penta":{"frequencies":[261.6255653006,269.32043486826,281.75060878526,332.97799220076,366.27579142084,381.53728273004,406.97310157871,523.2511306012],"description":"Schlesinger's Mixolydian Harmonia in the pentachromatic genus"},"mixol_pis":{"frequencies":[261.6255653006,287.78812183066,319.76457981184,359.73515228832,411.12588832951,442.75095666255,479.64686971777,523.2511306012,548.16785110602,575.57624366132,639.52915962369,719.47030457665,822.25177665903,885.50191332511,959.29373943553,1046.5022612024],"description":"The Diatonic Perfect Immutable System in the Mixolydian Tonos"},"mixol_tri1":{"frequencies":[261.6255653006,268.0066766494,274.70684356563,332.97799220076,366.27579142084,378.90599112501,392.4383479509,523.2511306012],"description":"Schlesinger's Mixolydian Harmonia in the first trichromatic genus"},"mixol_tri2":{"frequencies":[261.6255653006,268.0066766494,281.75060878526,332.97799220076,366.27579142084,378.90599112501,406.97310157871,523.2511306012],"description":"Schlesinger's Mixolydian Harmonia in the second trichromatic genus"},"mmmgeo1":{"frequencies":[261.6255653006,291.52662303231,317.822348206,348.40303271111,392.9238840789,423.23948674937,463.96335069158,523.2511306012],"description":"Scale for MakeMicroMusic in Peppermint 24, maybe a bit like Georgian tunings"},"mmmgeo2":{"frequencies":[261.6255653006,295.05751399041,323.4477810403,352.62279726972,392.9238840789,430.73079539701,485.77193724523,529.58860866211],"description":"Scale for MakeMicroMusic in Peppermint 24, maybe a bit like Georgian tunings"},"mmmgeo3a":{"frequencies":[261.6255653006,281.81099471089,317.822348206,348.40303271111,392.9238840789,423.23948674937,463.96335069158,523.2511306012],"description":"Peppermint 24 scale for MakeMicroMusic, maybe a bit \"Georgian-like\"?"},"mmmgeo4a":{"frequencies":[261.6255653006,281.81099471089,317.822348206,348.40303271111,392.9238840789,423.23948674937,477.32335087626,523.2511306012],"description":"Peppermint 24 scale for MakeMicroMusic, maybe a bit \"Georgian-like\"?"},"mmmgeo4b":{"frequencies":[261.6255653006,295.05751399041,323.4477810403,348.40303271111,392.9238840789,430.73079539701,485.77193724523,523.2511306012],"description":"Peppermint 24 scale for MakeMicroMusic, maybe a bit \"Georgian-like\"?"},"mmswap":{"frequencies":[261.6255653006,251.16054268858,294.32876096318,282.55561052465,313.95067836072,348.83408706747,353.19451315581,392.4383479509,376.74081403286,418.60090448096,423.83341578697,470.92601754108,523.2511306012],"description":"Swapping major and minor in 5-limit JI"},"mokhalif":{"frequencies":[261.6255653006,293.66476791741,329.62755691287,349.22823143301,391.99543598175,425.01198472693,477.05982293263,523.2511306012],"description":"Iranian mode Mokhalif from C"},"montvallon":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.89982010446,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Montvallon's Monochord, Nouveau sisteme de musique (1742)"},"monzismic":{"frequencies":[261.6255653006,265.20988799749,268.52946324281,272.20837072565,275.61554447717,279.39153269358,282.88861654172,286.76424730356,290.69297498385,294.33151655947,298.3639173457,302.09847446042,306.23728412706,310.07039048391,314.31841699833,318.25267316085,322.61279858837,327.03265671938,331.12605620426,335.66254762155,339.86396564906,344.52016812641,348.83245514045,353.61152766937,358.03760933268,362.94279426564,367.48567344471,372.52029869489,377.62390147213,382.35053879638,387.58881783384,392.44018387738,397.81669307529,402.79607923799,408.31446627855,413.42525081527,419.08925963743,424.33490995001,430.14838328955,436.04150237937,441.49934027584,447.54796975207,453.14983163098,459.35807517454,465.10776160818,471.47983118983,477.38124304179,483.92146177974,489.97860285142,496.69140794435,503.49617981289,509.7983334288,516.78267280423,523.2511306012],"description":"Monzismic temperament, g=249.018448, 5-limit"},"sevengroups":{"frequencies":[261.6255653006,261.6255653006,275.62199471997,265.19499215873,270.69536599394,266.7406479561],"description":"Here are some suggestions for a logical system encompassing intervals into seven broad groups: skhisma, kleisma, comma,"},"monzo-sym-11":{"frequencies":[261.6255653006,269.80136421624,276.76092858245,279.06726965397,285.40970760065,286.15296204753,287.78812183066,294.32876096318,299.00064605783,304.4370214407,305.22982618403,313.95067836072,314.76825825228,327.03195662575,332.97799220076,334.88072358477,341.71502406609,343.38355445704,348.83408706747,359.73515228832,366.27579142084,373.75080757229,380.54627680087,392.4383479509,398.6675280771,400.61414686654,408.78994578219,411.12588832951,418.60090448096,434.91003062957,436.04260883433,448.50096908674,449.66894036041,457.84473927605,465.11211608996,475.68284600109,478.40103369253,479.64686971777,490.54793493862,494.63583439645,507.3950357345,523.2511306012],"description":"Monzo symmetrical system: 11-limit"},"monzo-sym-5":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,334.88072358477,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Monzo symmetrical system: 5-limit"},"monzo-sym-7":{"frequencies":[261.6255653006,279.06726965397,286.15296204753,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,334.88072358477,341.71502406609,343.38355445704,348.83408706747,366.27579142084,373.75080757229,392.4383479509,398.6675280771,400.61414686654,408.78994578219,418.60090448096,436.04260883433,448.50096908674,457.84473927605,465.11211608996,478.40103369253,490.54793493862,523.2511306012],"description":"Monzo symmetrical system: 7-limit"},"monzo_sumerian_2place12":{"frequencies":[261.6255653006,277.17835052447,293.68632213351,311.15032543183,329.66469551353,349.22211163595,369.93402791915,391.94841243536,415.27867508032,439.91220695103,466.03267445926,493.6331420766,523.2511306012],"description":"Monzo - most accurate 2-place sexagesimal 12-tET approximation"},"monzo_sumerian_simp12":{"frequencies":[261.6255653006,277.34158865788,293.41184893525,310.84225580269,329.78012432849,348.83408706747,370.22485655745,392.4383479509,415.27867508032,440.11777340288,466.26338370404,493.6331420766,523.2511306012],"description":"Monzo - simplified 2-place sexagesimal 12-tET approximation"},"morgan":{"frequencies":[261.6255653006,277.18263097687,294.07958763262,310.86358783941,330.18637907377,349.03110370139,370.30791823326,392.32757291716,415.07027187895,440.74593809176,465.76911360306,494.58094207912,523.2511306012],"description":"Augustus de Morgan's temperament (1843)"},"mos11-34":{"frequencies":[261.6255653006,272.51337835337,301.75671459889,314.3146261019,348.04364484358,362.52783176564,377.61479489998,418.13653788176,435.53771116377,453.66305442345,502.34551296122,523.2511306012],"description":"Wilson 11 of 34-tET, G=9, Chain of minor & major thirds with Kleismatic fusion"},"mos12-17":{"frequencies":[261.6255653006,272.51337835337,283.85429714132,307.97166902637,320.78822215662,348.04364484358,362.52783176564,377.61479489998,409.69842558521,426.7484383229,463.0066556268,482.27514684959,523.2511306012],"description":"MOS 12 of 17, generator 7"},"mos12-22":{"frequencies":[261.6255653006,287.56082683758,296.76515515861,326.18384711731,336.62443200122,347.39920007397,381.83730669135,394.05926325844,433.12283887627,446.9863572706,491.29666030217,507.02222283506,523.2511306012],"description":"MOS 12 of 22, contains nearly just, recognizable diatonic, and pentatonic scales"},"mos13-22":{"frequencies":[261.6255653006,278.64197723942,296.76515515861,316.06708432391,326.18384711731,347.39920007397,369.99442271164,381.83730669135,406.67242132093,433.12283887627,446.9863572706,476.05883716226,507.02222283506,523.2511306012],"description":"MOS 13 of 22, contains 5 and 9 tone MOS as well. G=5 or 17"},"mos15-22":{"frequencies":[261.6255653006,278.64197723942,287.56082683758,306.26409645618,316.06708432391,336.62443200122,347.39920007397,369.99442271164,381.83730669135,406.67242132093,419.68930726506,446.9863572706,461.29362042034,491.29666030217,507.02222283506,523.2511306012],"description":"MOS 15 in 22, contains 7 and 8 tone MOS as well. G= 3 or 19"},"moscow":{"frequencies":[261.6255653006,277.4816141504,293.64820765919,311.48626315692,329.67368081467,349.7414907984,370.88289054572,392.4383479509,416.22242101754,440.4723112686,467.22939450183,494.51052097482,523.2511306012],"description":"Charles E. Moscow's equal beating piano tuning (1895)"},"mundeuc45":{"frequencies":[261.6255653006,267.57160087561,269.80136421624,271.31540105247,274.70684356563,280.31310567921,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,310.07474405997,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,343.38355445704,348.83408706747,356.76213450082,359.73515228832,366.27579142084,373.75080757229,380.54627680087,383.71749577421,392.4383479509,398.6675280771,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,441.49314144476,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,488.36772189445,499.46698830115,504.56359022259,507.3950357345,513.90736041189,523.2511306012],"description":"Euclidean reduced detempered Miracle[45] with Tenney tie-breaker"},"musaqa":{"frequencies":[261.6255653006,293.66476791741,320.24370022528,349.22823143301,391.99543598175,427.47405410759,466.16376151809,523.2511306012],"description":"Egyptian scale by Miha'il Musaqa"},"musaqa_24":{"frequencies":[261.6255653006,269.02051582234,276.67624041581,284.6011815168,292.80374147632,300.29158209195,310.07474405997,319.15917884888,328.55303549378,338.26335715633,348.29659232622,358.65845048745,369.35373924791,380.38618160659,391.75821216589,403.47075130695,415.52295665389,427.91195157543,440.63253103259,453.67684579974,467.03406698289,480.69003385373,494.62688932105,508.8227088795,523.2511306012],"description":"from d'Erlanger vol.5, p.34, after Mih.a'il Mu^saqah, 1899, a Lebanese scholar"},"myna23":{"frequencies":[261.6255653006,267.85369360167,274.23008563259,291.58574485564,298.52709031489,305.63367799752,312.90944157785,320.35840837329,327.98470157359,348.7424193045,357.04440817535,365.54403007102,374.24598974517,383.15510395049,392.27630410488,417.10295228105,427.03229805648,437.19801690717,447.60573581317,458.26121570764,469.17035466565,498.86352554567,510.73922293119,522.89762727195],"description":"23 notes of Myna temperament, 7-limit TOP tuning (Paul Erlich)"},"mystic-r":{"frequencies":[261.6255653006,367.91095120397,465.11211608996,654.0639132515,872.08521766867,1177.3150438527],"description":"Skriabin's mystic chord, op. 60 rationalised"},"mystic":{"frequencies":[261.6255653006,369.99442271164,466.16376151809,659.25511382574,880,1174.65907166964],"description":"Skriabin's mystic chord, op. 60"},"urmawi":{"frequencies":[261.6255653006,294.32876096318,326.6631048533,348.83408706747,392.4383479509,441.49314144476,471.45776383774,523.2511306012],"description":"al-Urmawi, one of twelve maqam rows. First tetrachord is Rast"},"valentine":{"frequencies":[261.6255653006,276.16031892841,294.32876096318,310.68035879446,330.47439827444,348.83408706747,371.78369805875,392.4383479509,414.24047839262,440.63253103259,466.02053819169,495.71159741166,523.2511306012],"description":"Robert Valentine, tuning with primes 3 & 19, TL 7-2-2002"},"valentine2":{"frequencies":[261.6255653006,286.10322937235,312.87102146627,349.87955533643,382.6142546815,418.41160951721,467.90420651233,511.68128147674,559.55413558945,625.74204293254,684.28641150324,748.30818586768,782.53142116911,855.74498969389,935.80841302466,1046.5022612024],"description":"Robert Valentine, two octave 31-tET subset for guitar, TL 10-5-2002"},"vallotti":{"frequencies":[261.6255653006,276.24519242498,293.00227310437,310.77584116741,328.14198392915,349.6228209638,368.32692341742,391.5530240856,414.36778843034,438.51190905657,466.16376151809,491.10256480205,523.2511306012],"description":"Vallotti & Young scale (Vallotti version)"},"vavoom":{"frequencies":[164.81377845643,165.83014536684,167.75567809608,168.79018601865,170.75008918846,172.7327497266,173.79795102719,175.81600173949,176.90021569146,178.95428827501,180.05785630665,182.14859375797,184.26360775673,185.39991601304,187.55268266167,188.70927492235,190.90046811205,192.07770535997,194.30800987601,196.56421264146,197.77637683895,200.07285246365,201.3066535986,203.64411977036,206.00872855044,207.27913480479,209.68595147418,210.9790342774,213.42881100738,214.74497512464,217.23848121866,219.76094059848,221.11615343515,223.68363702025,225.06304018178,227.6763542391,229.0803795269,231.74034082302,234.43118684139,235.87686755635,238.61574610914,240.08723199411,242.87499909192,244.37274935352,247.21027763268,250.08075380295,251.62294163139,254.54465534315,256.1143694988,259.0882353168,260.68597011615,263.71291896434,266.77501515601,268.42015092639,271.53690502834,273.21140777811,276.38379544331,278.08818779989,281.31720045362,284.58370833477,286.33866758091,289.66348210637,291.44976709494,294.83392732599,296.65209720599,300.09666587055,303.58123106099,305.45334345815,309.00010579622,310.90563508986,314.51570836542,316.45525105281,320.12976356015,323.84694071013,325.84402686189,329.62755691286],"description":"Vavoom temperament, g=111.875426, 5-limit"},"veroli":{"frequencies":[261.6255653006,276.87699530057,293.57148765354,310.97965314221,329.42008585855,349.28270065725,369.64409253099,391.93430587921,414.97617910427,439.79164309579,466.09106516521,493.49262474744,523.2511306012],"description":"Claudio di Veroli's well temperament (1978)"},"vertex_chrom":{"frequencies":[261.6255653006,271.89678302796,317.17549194805,349.22823143301,391.99543598175,407.38487419079,448.5538823653,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 66.7 + 266.7 + 166.7 cents"},"vertex_chrom2":{"frequencies":[261.6255653006,274.52698453615,323.3415889232,349.22823143301,391.99543598175,411.32572372413,484.46499093218,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 83.3 + 283.3 + 133.3 cents"},"vertex_chrom3":{"frequencies":[261.6255653006,275.18850165466,324.90175210669,349.22823143301,391.99543598175,412.31687950427,486.80259447109,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 87.5 + 287.5 + 125 cents"},"vertex_chrom4":{"frequencies":[261.6255653006,275.40936140075,325.42347822215,349.22823143301,391.99543598175,412.64779522483,487.58430040208,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 88.9 + 288.9 + 122.2 cents"},"vertex_chrom5":{"frequencies":[261.6255653006,282.57123920205,329.62755691287,349.22823143301,391.99543598175,423.37848741825,493.88330125613,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 133.3 + 266.7 + 100 cents"},"vertex_diat":{"frequencies":[261.6255653006,299.37379946195,323.3415889232,349.22823143301,391.99543598175,448.5538823653,484.46499932732,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 233.3 + 133.3 + 133.3 cents"},"vertex_diat10":{"frequencies":[261.6255653006,295.79278388132,324.90175210669,349.22823143301,391.99543598175,443.18842137843,486.80259447109,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 212.5 + 162.5 + 125 cents"},"vertex_diat11":{"frequencies":[261.6255653006,295.79278388132,306.66641795878,349.22823143301,391.99543598175,443.18842137843,459.48046426806,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 212.5 + 62.5 + 225 cents"},"vertex_diat12":{"frequencies":[261.6255653006,293.66476791741,315.65242990842,349.22823143301,391.99543598175,440,472.94426956511,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 200 + 125 + 175 cents"},"vertex_diat2":{"frequencies":[261.6255653006,299.37379946195,329.62755691287,349.22823143301,391.99543598175,448.5538823653,493.88330125613,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 233.3 + 166.7 + 100 cents"},"vertex_diat3":{"frequencies":[261.6255653006,273.20871865617,311.12698372208,349.22823143301,391.99543598175,409.35055662695,466.16376151809,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 75 + 225 + 200 cents"},"vertex_diat4":{"frequencies":[261.6255653006,297.93622032612,329.62755691287,349.22823143301,391.99543598175,446.39994737251,493.88330125613,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 225 + 175 + 100 cents"},"vertex_diat5":{"frequencies":[261.6255653006,275.18850165466,315.65242990842,349.22823143301,391.99543598175,412.31687950427,472.94426956511,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 87.5 + 237.5 + 175 cents"},"vertex_diat7":{"frequencies":[261.6255653006,293.66476791741,306.66641795878,349.22823143301,391.99543598175,440,459.48046426806,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 200 + 75 + 225 cents"},"vertex_diat8":{"frequencies":[261.6255653006,277.18263097687,306.66641795878,349.22823143301,391.99543598175,415.30469757995,459.48046426806,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 100 + 175 + 225 cents"},"vertex_diat9":{"frequencies":[261.6255653006,295.79278388132,320.24370022528,349.22823143301,391.99543598175,443.18842137843,479.82340237272,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 212.5 + 137.5 + 150 cents"},"vertex_sdiat":{"frequencies":[261.6255653006,275.18850165466,306.66641795878,349.22823143301,391.99543598175,412.31687950427,459.48046426806,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 87.5 + 187.5 + 225 cents"},"vertex_sdiat2":{"frequencies":[261.6255653006,273.20871865617,302.26980244078,349.22823143301,391.99543598175,409.35055662695,452.89298412314,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 75 + 175 + 250 cents"},"vertex_sdiat3":{"frequencies":[261.6255653006,265.43099677612,302.26980244078,349.22823143301,391.99543598175,397.69714089209,452.89298412314,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 25 + 225 + 250 cents"},"vertex_sdiat4":{"frequencies":[261.6255653006,271.8968348557,302.26980244078,349.22823143301,391.99543598175,407.38495184466,452.89298412314,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 66.7 + 183.3 + 250 cents"},"vertex_sdiat5":{"frequencies":[261.6255653006,299.37374239667,302.26980244078,349.22823143301,391.99543598175,448.55379686399,452.89298412314,523.2511306012],"description":"A vertex tetrachord from Chapter 5, 233.33 + 16.67 + 250 cents"},"vicentino1":{"frequencies":[261.6255653006,267.54129532085,273.59078691818,279.77706779472,286.10322937235,292.57243455474,295.8616864168,299.18791603519,305.95298478736,312.87102146627,319.94548489658,327.17991022208,330.85823737058,334.57791819083,342.14320575162,349.87955533643,357.79083283678,365.88099775759,374.15409293384,382.6142546815,391.26571058456,395.66452371628,400.11279059885,409.15991580663,418.41160951721,427.87249484695,437.54730686196,442.46644183113,447.44088028055,457.55816161244,467.90420651233,478.48419305869,489.30340830564,494.80441235385,500.36726155789,511.68128147674,523.2511306012],"description":"Usual Archicembalo tuning, 31-tET plus D,E,G,A,B a 10th tone higher"},"vicentino2":{"frequencies":[261.6255653006,262.40966637115,273.59078691818,274.41074818102,279.77706779472,280.61556956011,292.57243455474,293.44928279173,305.95298478736,306.86993670158,312.87102146627,313.80870698104,327.17991022208,328.16047998243,342.14320575162,343.16862103779,349.87955533643,350.92815470883,365.88099775759,366.97755604579,374.15409293384,391.26571058456,392.4383479509,409.15991580663,410.38618254261,418.41160951721,419.66560148231,437.54730686196,438.85865161274,457.55816161244,458.92947695163,467.90420651233,469.30653196482,489.30340830564,490.7698679226,511.68128147674,523.2511306012],"description":"Alternative Archicembalo tuning, lower 3 rows the same upper 3 rows 3/2 higher"},"vicentino2q217":{"frequencies":[261.6255653006,262.46259217279,273.59078691818,274.46609608433,279.77706779472,280.67216895906,292.57243455474,293.50847071582,305.95298478736,306.93183153514,312.87102146627,313.87199953275,327.17991022208,328.2266690608,342.14320575162,343.23783523487,349.87955533643,350.99893596542,365.88099775759,367.05157442308,374.15409293384,391.26571058456,392.51750150462,409.15991580663,410.46895395112,418.41160951721,419.7502468954,437.54730686196,438.9471656765,457.55816161244,459.02204178186,467.90420651233,469.40118981889,489.30340830564,490.86885203792,511.68128147674,523.2511306012],"description":"Vicentino's second tuning, 217-tET version"},"vicentino36":{"frequencies":[261.6255653006,262.43934012943,273.37431312998,274.22463192287,279.93529690293,280.80602334765,292.50627485027,293.41610276971,305.64177427204,306.59245933664,312.97717714283,313.95067836072,327.03195662575,328.04917632434,341.71789064962,349.91912034749,351.00752840096,365.63284274659,366.77012764335,374.40803131735,375.5726110527,391.22147055517,392.4383479509,408.78994578219,410.06146948999,418.60090448096,419.90294514449,437.39889945791,438.75941205608,457.04105505291,458.46266117889,468.01003810189,469.46576276783,489.02683710225,490.54793493862,510.98743222773,523.2511306012],"description":"Vicentino's second tuning of 1555"},"victor_eb":{"frequencies":[261.6255653006,276.45300885359,293.16631378471,311.00963644582,328.52867116285,348.83408706747,368.60401198904,391.83966133014,414.6795130731,439.03603741286,465.77732204887,492.79300649794,523.2511306012],"description":"Equal beating Victorian piano temperament, interpr. by Bill Bremmer (improved)"},"victorian":{"frequencies":[261.6255653006,276.5429423948,293.32570896007,310.76776326996,328.29744538229,349.22823143301,368.92737853004,391.99543598175,414.58565256441,438.73106346722,465.89457252293,492.17459484008,523.2511306012],"description":"Form of Victorian temperament (1885)"},"vitale1":{"frequencies":[261.6255653006,280.31310567921,294.32876096318,305.22982618403,327.03195662575,336.37572681506,343.38355445704,348.83408706747,373.75080757229,392.4383479509,420.46965851882,441.49314144476,457.84473927605,490.54793493862,504.56359022259,515.07533168556,523.2511306012],"description":"Rami Vitale's 7-limit just scale"},"vitale2":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,299.00064605783,305.22982618403,313.95067836072,336.37572681506,348.83408706747,366.27579142084,392.4383479509,412.06026534844,441.49314144476,448.50096908674,457.84473927605,470.92601754108,504.56359022259,523.2511306012],"description":"Rami Vitale, inverse mode of vitale1"},"vitale3":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,343.38355445704,348.83408706747,366.27579142084,373.75080757229,392.4383479509,412.06026534844,420.46965851882,441.49314144476,448.50096908674,457.84473927605,470.92601754108,490.54793493862,504.56359022259,515.07533168556,523.2511306012],"description":"Superset of several Byzantine scales by Rami Vitale, TL 29-Aug-2001"},"vogel_21":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,294.32876096318,305.22982618403,310.07474405997,313.95067836072,321.55899383997,330.74639366397,348.83408706747,361.75386806997,372.08969287196,392.4383479509,406.97310157871,413.43299207996,418.60090448096,428.74532511996,440.99519155196,465.11211608996,482.33849075995,496.11959049595,523.2511306012],"description":"Martin Vogel's 21-tone Archytas system, see Divisions of the tetrachord"},"vogelh_b":{"frequencies":[261.6255653006,276.37000081643,292.73769384471,310.07474405997,327.54963108844,349.78078158391,367.49599295996,391.37619916626,413.43299207996,437.91808280662,465.11211608996,489.99465727995,523.2511306012],"description":"Harald Vogel's temperament, van Eeken organ in Bunschoten, Immanuelkerk, 1992"},"vogelh_fisk":{"frequencies":[261.6255653006,274.01856817608,292.73769384471,312.85332572834,327.54963108844,349.78078158391,366.49445363528,391.37619916626,409.75340805561,437.91808280662,467.82492621575,489.99465727995,523.2511306012],"description":"Modified meantone tuning of Fisk organ in Memorial Church at Stanford"},"vogelh_hb":{"frequencies":[261.6255653006,276.50527247638,293.79744652436,312.85332572834,329.92547760025,349.78078158391,369.82037393809,392.08397832814,413.47189899094,440.29822362186,467.82492621575,494.44133512215,523.2511306012],"description":"Harald Vogel hybrid meantone (1984)"},"vogelh_jakobi":{"frequencies":[261.6255653006,275.2485073924,292.86986732103,310.4251397446,327.84547867349,349.70184487387,366.99801003998,391.46454285105,412.87276088221,438.2147004401,466.26912673157,490.54793493862,523.2511306012],"description":"Harald Vogel's temperament for the Schnitger organ in St. Jakobi, Hamburg"},"volans":{"frequencies":[261.6255653006,288.78654445823,322.09885310804,352.06379107796,388.6137256405,429.95038611107,482.60299106564,523.2511306012],"description":"African scale according to Kevin Volans 1/1=G"},"vong":{"frequencies":[261.6255653006,287.78812183066,324.77656382143,353.19451315581,392.4383479509,431.68218274599,476.53227965466,523.2511306012],"description":"Vong Co Dan Tranh scale, Vietnam"},"vries19-72":{"frequencies":[261.6255653006,271.89678302796,282.57123920205,293.66476791741,305.19382000629,314.13668154225,326.46944327063,339.28638158975,352.60650301302,366.44956000397,377.18735172911,391.99543598175,407.38487419079,423.37848741825,452.89298412314,470.6732130613,489.15147723638,508.3551866238,523.2511306012],"description":"Leo de Vries 19/72 Through-Transposing-Tonality 18 tone scale"},"vries35-72":{"frequencies":[261.6255653006,320.24370022528,326.46944327063,332.81622067851,339.28638158975,345.88232658126,352.60650301302,359.46139971304,366.44956000397,448.5538823653,457.27406033445,466.16376151809,475.22628419761,484.46499093218,493.88330125613,503.48470957687,513.27277840175,523.2511306012],"description":"Leo de Vries 35/72 Through-Transposing-Tonality 17 tone scale"},"vries5-72":{"frequencies":[261.6255653006,269.29177952703,274.52698453615,282.57123920205,288.06460709314,296.5055443788,302.26980244078,317.17549194805,332.81622067851,349.22823143301,366.44956000397,384.52011812375,403.48177901006,423.37848741825,444.25635547592,466.16376151809,489.15147723638,513.27277840175,523.2511306012],"description":"Leo de Vries 5/72 Through-Transposing-Tonality 18 tone scale"},"vries6-31":{"frequencies":[261.6255653006,292.57243455474,299.18791603519,334.57791819083,342.14320575162,382.6142546815,391.26571058456,437.54730686196,447.44088028055,500.36726155789,511.68128147674,523.2511306012],"description":"Leo de Vries 6/31 TTT used in \"For 31-tone organ\" (1995)"},"vulture":{"frequencies":[261.6255653006,265.58852967049,269.02996542365,272.51599294435,276.04719319079,279.62414831161,283.24745441839,286.9177088442,290.63552324927,294.40151054717,298.21629835234,302.73351960911,306.6562716924,310.62985211059,314.65492307423,318.73214815075,322.86220682342,327.0457799678,331.28356479042,335.57625992643,339.9245807679,344.32924417279,349.54496173019,354.07428378691,358.66229781376,363.30976018416,368.01744541334,372.78612960355,377.61660747204,382.50967536449,387.46614872711,392.486844677,398.43202813578,403.59481739244,408.82450722915,414.12195980508,419.48805795853,424.92368633675,430.42975080549,436.00715908665,441.65684067409,447.37972696622,453.17677170128,460.0412514682,466.0023613576,472.04071122634,478.15730738573,484.35315820906,490.6292962557,496.98675620078,503.42659462849,509.94988192555,516.55769649554,523.2511306012],"description":"Vulture temperament, g=475.542233, 5-limit"},"walker_21":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,294.32876096318,299.00064605783,305.22982618403,310.07474405997,313.95067836072,327.03195662575,336.37572681506,348.83408706747,392.4383479509,406.97310157871,418.60090448096,436.04260883433,441.49314144476,448.50096908674,457.84473927605,465.11211608996,470.92601754108,490.54793493862,523.2511306012],"description":"Douglas Walker, 1977, for \"out of the fathomless dark/into the limitless light"},"walkerr_11":{"frequencies":[261.6255653006,291.47537246454,299.00064605783,333.11471138804,341.71502406609,380.70252730062,390.53145607553,435.08860262928,484.72943438718,497.2441172906,510.08190181294,523.2511306012],"description":"Robert Walker, \"Seven to Pi\" scale, TL 09-07-2002"},"wauchope":{"frequencies":[261.6255653006,274.70684356563,305.22982618403,327.03195662575,366.27579142084,392.4383479509,436.04260883433,457.84473927605,523.2511306012],"description":"Symmetrical 7-limit JI whole-half step scale, Ken Wauchope"},"wendell1":{"frequencies":[261.6255653006,276.25045813601,293.35468319005,310.78176509232,328.42642049784,348.83408706747,369.47972269069,391.8804287311,414.37568699689,438.92294511207,466.17264740545,492.63963050051,523.2511306012],"description":"Robert Wendell's Natural Synchronous well-temperament (2003)"},"wendell1r":{"frequencies":[261.6255653006,276.25560153172,293.36810129327,310.78755172318,328.43721515437,348.83408706747,369.49186704867,391.89926583958,414.38340229758,438.93945576706,466.18132758477,492.65582273156,523.2511306012],"description":"Rational version of wendell1 by Gene Ward Smith"},"wendell2":{"frequencies":[261.6255653006,276.37223575148,293.46077701205,310.91876490958,328.50868755512,348.91469434159,369.57235851938,392.00856887742,414.55835341999,438.92345217603,466.37814713124,492.76314493882,523.2511306012],"description":"Robert Wendell's Very Mild Synchronous well-temperament (2003)"},"werck1":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,306.59245933664,313.95067836072,327.03195662575,348.83408706747,363.36884069528,367.91095120397,392.4383479509,408.78994578219,418.60090448096,436.04260883433,441.49314144476,459.88868900496,465.11211608996,470.92601754108,490.54793493862,523.2511306012],"description":"Werckmeister I (just intonation)"},"werck3":{"frequencies":[261.6255653006,275.62199471997,292.34127285051,310.07474405997,327.77163799145,348.83408706747,367.49599295996,391.11111150212,413.43299207996,437.02884834934,465.11211608996,491.65745674141,523.2511306012],"description":"Andreas Werckmeister's temperament III (the most famous one, 1681)"},"werck3_eb":{"frequencies":[261.6255653006,275.62199471997,292.52927773082,310.07474405997,328.06371231954,348.83408706747,367.49599295996,391.41011079897,413.43299207996,437.41828331138,465.11211608996,492.10978071589,523.2511306012],"description":"Werckmeister III equal beating version, 5/4 beats twice 3/2"},"werck3_mod":{"frequencies":[261.6255653006,275.62199471997,292.34127285051,310.07474405997,327.77163799145,348.83408706747,367.49599295996,391.11111150212,413.43299207996,437.02884834934,465.11211608996,490.82535372381,523.2511306012],"description":"Modified Werckmeister III with B between E and F#, Nijsse (1997), organ Soest"},"werck4":{"frequencies":[261.6255653006,274.37997440822,293.00227310437,310.07474405997,328.14198392915,348.83408706747,367.49599295996,390.66969766777,411.5699614066,437.52264545758,467.21778431035,489.99465727995,523.2511306012],"description":"Andreas Werckmeister's temperament IV"},"werck5":{"frequencies":[261.6255653006,276.55731914056,294.32876096318,311.12698372208,328.88393162803,350.01785633742,369.99442271164,392.4383479509,413.43299207996,440,466.69047534984,493.32589719545,523.2511306012],"description":"Andreas Werckmeister's temperament V"},"werck6":{"frequencies":[261.6255653006,275.69145590816,291.35574317567,310.77945938738,328.70904358281,348.83408706747,368.91086905696,391.43977709097,413.53718386224,438.27872477707,466.16918908107,493.06356537421,523.2511306012],"description":"Andreas Werckmeister's \"septenarius\" tuning VI"},"werck6_dup":{"frequencies":[261.6255653006,275.62199471997,291.49363009634,310.67551062492,328.56569462012,348.83408706747,368.92162485303,391.67947347082,413.43299207996,438.08759304581,466.01326570444,492.84854168382,523.2511306012],"description":"Andreas Werckmeister's VI in the interpretation by Dupont (1935)"},"werck_cl5":{"frequencies":[261.6255653006,274.56549986328,292.86986732103,309.97737261399,327.84547867349,349.70184487387,366.99801003998,391.46454285105,412.14811800305,438.2147004401,466.26912673157,490.54793493862,523.2511306012],"description":"Werckmeister Clavier temperament (Nothw. Anm.) Poletti reconstr. 1/5-comma"},"werck_cl6":{"frequencies":[261.6255653006,275.36250599118,293.11251278827,310.35057963607,328.38895179964,349.55706816887,367.91095120397,391.62667645325,413.31226430431,438.75941205608,466.0760911248,491.56462836305,523.2511306012],"description":"Werckmeister Clavier temperament (Nothw. Anm.) Poletti reconstr. 1/6-comma"},"werck_puzzle":{"frequencies":[261.6255653006,272.52663052146,291.60349465796,306.59245933664,327.03195662575,347.47145391486,365.18568489875,389.71308164569,408.78994578219,436.04260883433,461.93263873387,490.54793493862,523.2511306012],"description":"From Hypomnemata Musica, 1697, p. 49, 1/1=192, fifths tempered superparticular"},"white":{"frequencies":[261.6255653006,275.93321340298,289.72987407313,294.32876096318,305.22982618403,310.42486507835,327.03195662575,331.11985608357,343.38355445704,348.83408706747,367.91095120397,386.30649876417,392.4383479509,406.97310157871,413.89982010446,436.04260883433,441.49314144476,457.84473927605,465.11211608996,490.54793493862,496.67978412536,515.07533168556,523.2511306012],"description":"Justin White's 22-tone scale based on Al-Farabi's tetrachord"},"wicks":{"frequencies":[261.6255653006,276.65728054629,293.45376109391,310.36444075595,329.26048109616,348.28499607284,369.54304125029,391.93835601961,414.48592121967,439.68064187634,465.04666232412,493.39072329352,523.2511306012],"description":"Mark Wicks' equal beating temperament for organs (1887)"},"wier_cl":{"frequencies":[261.6255653006,276.16031892841,290.69507255622,305.22982618403,319.76457981184,348.83408706747,370.63621750918,392.4383479509,414.24047839262,436.04260883433,457.84473927605,479.64686971777,523.2511306012],"description":"Danny Wier, ClownTone (2003)"},"wiesse":{"frequencies":[261.6255653006,277.49581689502,294.32876096318,312.18279369479,331.11985608357,348.83408706747,369.99442271164,392.4383479509,416.24372513446,441.49314144476,465.11211608996,496.67978412536,523.2511306012],"description":"Von Wiesse's 1/2 Pyth. comma tuning"},"wilson1":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,367.91095120397,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,459.88868900496,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Wilson's 19-tone Scott scale (1976)"},"wilson11":{"frequencies":[261.6255653006,271.31540105247,277.4816601673,291.35574317567,305.22982618403,312.16686768822,325.57848126297,332.97799220076,348.83408706747,366.27579142084,374.60024122586,392.4383479509,406.97310157871,416.22249025095,437.0336147635,457.84473927605,468.25030153232,488.36772189445,499.46698830115,523.2511306012],"description":"Wilson 11-limit 19-tone scale, 1977"},"wilson1t":{"frequencies":[261.6255653006,273.34666024156,279.64601698606,292.92954243175,306.05308604033,313.10617410217,327.13365148064,334.67254769546,349.66622272551,366.27579142084,374.71672979763,391.50442319155,409.04422481132,418.47077311482,437.21869500104,457.98711402938,468.54156606881,489.53271107931,500.81414097667,523.2511306012],"description":"Wilson's Scott scale, wilson1, in minimax minerva tempering"},"wilson2":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,294.32876096318,305.22982618403,313.95067836072,327.03195662575,339.14425131559,348.83408706747,361.75386806997,372.08969287196,392.4383479509,406.97310157871,418.60090448096,441.49314144476,457.84473927605,470.92601754108,490.54793493862,508.71637697339,523.2511306012],"description":"Wilson 19-tone, 1975"},"wilson3":{"frequencies":[261.6255653006,274.70684356563,286.15296204753,294.32876096318,305.22982618403,313.95067836072,327.03195662575,343.38355445704,348.83408706747,366.27579142084,381.53728273004,392.4383479509,412.06026534844,429.2294430713,441.49314144476,457.84473927605,470.92601754108,490.54793493862,515.07533168556,523.2511306012],"description":"Wilson 19-tone"},"wilson5":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,353.19451315581,367.91095120397,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,441.49314144476,459.88868900496,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Wilson's 22-tone 5-limit scale"},"wilson7":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,290.69507255622,294.32876096318,305.22982618403,313.95067836072,327.03195662575,339.14425131559,348.83408706747,353.19451315581,367.91095120397,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,441.49314144476,457.84473927605,470.92601754108,490.54793493862,508.71637697339,523.2511306012],"description":"Wilson's 22-tone 7-limit 'marimba' scale"},"wilson7_2":{"frequencies":[261.6255653006,263.718569823,274.70684356563,286.15296204753,294.32876096318,305.22982618403,313.95067836072,327.03195662575,329.64821227876,343.38355445704,353.19451315581,366.27579142084,376.74081403286,392.4383479509,408.78994578219,412.06026534844,436.04260883433,439.53094970501,457.84473927605,470.92601754108,490.54793493862,494.47231841813,523.2511306012],"description":"Wilson 7-limit scale"},"wilson7_3":{"frequencies":[261.6255653006,267.90457886781,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,334.88072358477,348.83408706747,353.19451315581,372.08969287196,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,465.11211608996,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Wilson 7-limit scale"},"wilson7_4":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,290.69507255622,294.32876096318,305.22982618403,313.95067836072,327.03195662575,339.14425131559,348.83408706747,361.75386806997,372.08969287196,387.59343007496,392.4383479509,406.97310157871,418.60090448096,436.04260883433,441.49314144476,457.84473927605,470.92601754108,490.54793493862,508.71637697339,523.2511306012],"description":"Wilson 7-limit 22-tone scale XH 3, 1975"},"wilson_17":{"frequencies":[261.6255653006,275.93321340298,290.69507255622,294.32876096318,310.42486507835,327.03195662575,331.11985608357,348.83408706747,367.91095120397,372.50983809402,392.4383479509,413.89982010446,436.04260883433,441.49314144476,465.11211608996,490.54793493862,496.67978412536,523.2511306012],"description":"Wilson's 17-tone 5-limit scale"},"wilson_31":{"frequencies":[261.6255653006,265.7783520514,271.31540105247,279.06726965397,285.40970760065,294.32876096318,299.00064605783,305.22982618403,313.95067836072,321.08592105074,327.03195662575,332.22294006425,339.14425131559,348.83408706747,354.37113606854,361.75386806997,372.08969287196,380.54627680087,392.4383479509,398.6675280771,406.97310157871,418.60090448096,428.11456140098,441.49314144476,448.50096908674,457.84473927605,470.92601754108,481.6288815761,490.54793493862,498.33441009638,508.71637697339,523.2511306012],"description":"Wilson 11-limit 31-tone scale XH 3, 1975"},"wilson_41":{"frequencies":[261.6255653006,265.7783520514,271.31540105247,275.62199471997,279.06726965397,285.40970760065,290.69507255622,294.32876096318,299.00064605783,305.22982618403,310.07474405997,313.95067836072,321.08592105074,327.03195662575,331.11985608357,336.37572681506,343.38355445704,348.83408706747,354.37113606854,361.75386806997,367.49599295996,372.08969287196,380.54627680087,387.59343007496,392.4383479509,398.6675280771,406.97310157871,413.43299207996,418.60090448096,428.11456140098,436.04260883433,441.49314144476,448.50096908674,457.84473927605,465.11211608996,470.92601754108,481.6288815761,490.54793493862,496.67978412536,504.56359022259,515.07533168556,523.2511306012],"description":"Wilson 11-limit 41-tone scale XH 3, 1975"},"wilson_alessandro":{"frequencies":[261.6255653006,265.58571790036,269.80136421624,270.50397193556,275.93321340298,278.232656848,284.55612632182,286.15296204753,288.53757006459,294.32876096318,295.09524211152,303.52653474327,304.3169684275,305.22982618403,309.14739649778,314.76825825228,321.92208230347,324.60476632267,327.03195662575,331.98214737546,337.2517052703,340.06213614756,343.38355445704,347.79082106,351.18772614924,354.11429053382,359.73515228832,365.180362113,367.91095120397,370.97687579734,379.40816842909,386.30649876417,391.2646736925,392.4383479509,393.46032281536,404.70204632437,405.75595790334,413.89982010446,417.348985272,419.69101100305,429.2294430713,432.80635509689,441.49314144476,442.64286316727,449.66894036041,456.47545264125,457.84473927605,463.72109474667,472.15238737843,482.88312345521,486.907149484,490.54793493862,494.63583439645,505.87755790546,515.07533168556,521.68623159,523.2511306012],"description":"D'Alessandro, genus [3 3 3 5 7 11 11] plus 8 pigtails, XH 12, 1989"},"wilson_bag":{"frequencies":[261.6255653006,294.32876096318,318.85615771011,349.51540364377,392.4383479509,425.14154361347,466.02053819169,523.2511306012],"description":"Erv's bagpipe, mar '97, after Theodore Podnos (37-39)."},"wilson_class":{"frequencies":[261.6255653006,272.52663052146,293.02063313667,305.22982618403,327.03195662575,348.83408706747,366.27579142084,381.53728273004,418.60090448096,436.04260883433,457.84473927605,488.36772189445,523.2511306012],"description":"Class Scale, Erv Wilson, 9 july 1967"},"wilson_dia1":{"frequencies":[261.6255653006,269.10058145205,277.01530443593,285.40970760065,294.32876096318,303.82323712328,313.95067836072,324.77656382143,336.37572681506,348.83408706747,362.25078272391,371.78369805875,381.83190611439,392.4383479509,403.65087217807,415.52295665389,428.11456140098,441.49314144476,455.73485568492,470.92601754108,487.16484573215,504.56359022259,523.2511306012],"description":"Wilson Diaphonic cycles, tetrachordal form"},"wilson_dia2":{"frequencies":[261.6255653006,268.51044859798,275.76748774928,283.42769574232,291.52562990638,300.09991313892,309.19384990071,318.85615771011,329.14184021688,340.11323489078,351.84127747322,364.40703738298,377.90359432309,388.70083987518,400.13321751856,412.25846653428,425.14154361347,438.85578695585,453.48431318771,469.12170329763,485.87604984397,503.87145909745,523.2511306012],"description":"Wilson Diaphonic cycle, conjunctive form"},"wilson_dia3":{"frequencies":[261.6255653006,268.51044859798,275.76748774928,283.42769574232,291.52562990638,300.09991313892,309.19384990071,318.85615771011,329.14184021688,340.11323489078,351.84127747322,364.40703738298,377.90359432309,392.4383479509,403.65087217807,415.52295665389,428.11456140098,441.49314144476,455.73485568492,470.92601754108,487.16484573215,504.56359022259,523.2511306012],"description":"Wilson Diaphonic cycle on 3/2"},"wilson_dia4":{"frequencies":[261.6255653006,269.10058145205,277.01530443593,285.40970760065,294.32876096318,303.82323712328,313.95067836072,324.77656382143,336.37572681506,348.83408706747,358.01393146398,381.83190611439,377.90359432309,388.70083987518,400.13321751856,412.25846653428,425.14154361347,438.85578695585,453.48431318771,469.12170329763,485.87604984397,503.87145909745,523.2511306012],"description":"Wilson Diaphonic cycle on 4/3"},"wilson_duo":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,286.15296204753,294.32876096318,305.22982618403,313.95067836072,327.03195662575,339.14425131559,348.83408706747,361.75386806997,367.91095120397,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,441.49314144476,457.84473927605,470.92601754108,490.54793493862,508.71637697339,523.2511306012],"description":"Wilson 'duovigene'"},"wilson_enh":{"frequencies":[261.6255653006,264.37951861955,279.06726965397,348.83408706747,392.4383479509,396.56927792933,418.60090448096,523.2511306012],"description":"Wilson's Enharmonic & 3rd new Enharmonic on Hofmann's list of superp. 4chords"},"wilson_enh2":{"frequencies":[261.6255653006,265.7783520514,275.62199471997,348.83408706747,392.4383479509,398.6675280771,413.43299207996,523.2511306012],"description":"Wilson's 81/64 Enharmonic, a strong division of the 256/243 pyknon"},"wilson_facet":{"frequencies":[261.6255653006,271.31540105247,274.70684356563,290.69507255622,294.32876096318,305.22982618403,313.95067836072,327.03195662575,339.14425131559,348.83408706747,353.19451315581,366.27579142084,387.59343007496,392.4383479509,406.97310157871,412.06026534844,436.04260883433,452.19233508746,457.84473927605,470.92601754108,488.36772189445,508.71637697339,523.2511306012],"description":"Wilson study in 'conjunct facets', Hexany based"},"wilson_gh1":{"frequencies":[261.6255653006,286.54684077898,313.84200313831,343.73718179912,398.2573899082,436.19359890902,477.74343791599,523.2511306012],"description":"Golden Horagram nr.1: 1phi+0 / 7phi+1"},"wilson_gh11":{"frequencies":[261.6255653006,294.51148904212,316.87124012705,356.70145865606,383.78276711707,432.02365977685,464.82353976398,523.2511306012],"description":"Golden Horagram nr.11: 1phi+0 / 3phi+1"},"wilson_gh2":{"frequencies":[261.6255653006,290.51361927671,322.59142140135,358.21117585067,382.16527586729,424.3630293795,471.22015545621,523.2511306012],"description":"Golden Horagram nr.2: 1phi+0 / 6phi+1"},"wilson_gh50":{"frequencies":[261.6255653006,270.80964219588,280.31611759965,306.81496952381,317.58537244461,347.60736272384,359.80973785756,372.44046183271,407.64801512355,421.95805149354,461.8466031062,478.05922145,523.2511306012],"description":"Golden Horagram nr.50: 7phi+2 / 17phi+5"},"wilson_helix":{"frequencies":[261.6255653006,283.42769574232,294.32876096318,305.22982618403,327.03195662575,348.83408706747,359.73515228832,392.4383479509,425.14154361347,436.04260883433,457.84473927605,479.64686971777,523.2511306012],"description":"Wilson's Helix Song, see David Rosenthal, Helix Song, XH 7&8, 1979. Also Secor, 1964"},"wilson_hypenh":{"frequencies":[261.6255653006,266.38239376061,271.31540105247,348.83408706747,392.4383479509,399.57359064092,406.97310157871,523.2511306012],"description":"Wilson's Hyperenharmonic, this genus has a CI of 9/7"},"wilson_l1":{"frequencies":[261.6255653006,269.80136421624,274.70684356563,286.15296204753,294.32876096318,305.22982618403,314.76825825228,327.03195662575,337.2517052703,343.38355445704,359.73515228832,366.27579142084,377.72190990274,392.4383479509,404.70204632437,419.69101100305,431.68218274599,449.66894036041,457.84473927605,472.15238737843,490.54793493862,503.62921320365,523.2511306012],"description":"Wilson 11-limit scale"},"wilson_l2":{"frequencies":[261.6255653006,267.07609791103,279.79400733536,287.78812183066,294.32876096318,305.22982618403,314.76825825228,327.03195662575,335.75280880244,348.83408706747,359.73515228832,373.05867644715,381.53728273004,392.4383479509,411.12588832951,419.69101100305,436.04260883433,447.67041173658,457.84473927605,479.64686971777,490.54793493862,503.62921320365,523.2511306012],"description":"Wilson 11-limit scale"},"wilson_l3":{"frequencies":[261.6255653006,269.80136421624,274.70684356563,286.15296204753,294.32876096318,305.22982618403,313.95067836072,327.03195662575,332.97799220076,343.38355445704,359.73515228832,366.27579142084,381.53728273004,392.4383479509,406.97310157871,418.60090448096,429.2294430713,441.49314144476,457.84473927605,470.92601754108,490.54793493862,499.46698830115,523.2511306012],"description":"Wilson 11-limit scale"},"wilson_l4":{"frequencies":[261.6255653006,267.07609791103,274.70684356563,290.69507255622,299.00064605783,305.22982618403,313.95067836072,327.03195662575,339.14425131559,348.83408706747,356.10146388137,366.27579142084,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,488.36772189445,508.71637697339,523.2511306012],"description":"Wilson 11-limit scale"},"wilson_l5":{"frequencies":[261.6255653006,267.07609791103,279.79400733536,285.40970760065,299.00064605783,305.22982618403,313.95067836072,327.03195662575,332.97799220076,348.83408706747,356.10146388137,366.27579142084,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,479.64686971777,488.36772189445,508.71637697339,523.2511306012],"description":"Wilson 11-limit scale"},"wilson_l6":{"frequencies":[261.6255653006,267.57160087561,277.4816601673,285.40970760065,294.32876096318,305.22982618403,312.16686768822,327.03195662575,332.97799220076,348.83408706747,356.76213450082,369.97554688974,381.53728273004,392.4383479509,406.97310157871,416.22249025095,436.04260883433,443.97065626768,457.84473927605,475.68284600109,490.54793493862,499.46698830115,523.2511306012],"description":"Wilson 1 3 7 9 11 15 eikosany plus 9/8 and tritone. Used Stearns: Jewel"},"window":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,294.32876096318,297.67175429757,306.59245933664,327.03195662575,334.88072358477,348.83408706747,363.36884069528,367.91095120397,372.08969287196,376.74081403286,392.4383479509,408.78994578219,418.60090448096,446.50763144636,459.88868900496,465.11211608996,470.92601754108,502.32108537715,523.2511306012],"description":"Window lattice"},"wonder1":{"frequencies":[261.6255653006,272.72256190885,277.86237426839,283.09905309511,288.43442562998,293.8703485525,299.4087202614,312.10830899518,317.99039712482,323.98334274799,330.08923137594,336.31019538088,342.64839962317,357.18202566262,363.91358676728,370.77201292014,377.75969724053,384.87907140314,392.13262172187,408.76514672187,416.46885901676,424.31776026786,432.3145818485,440.46211650535,448.76319953449,467.79774494453,476.61400354229,485.59641603135,494.74811665626,504.07229015717,513.57219283465,523.2511306012],"description":"Wonder Scale, gen=~233.54 cents, 8/7+1029/1024^7/25, LS 12:14:18:21, M.Schulter"},"wonder36":{"frequencies":[261.6255653006,271.89678302796,277.18263097687,282.57123920205,288.06460709314,293.66476791741,299.37379946195,311.12698372208,317.17549194805,323.3415889232,329.62755691287,336.03572815422,342.56848033562,356.01745236555,362.93866220634,369.99442271164,377.18735172911,384.52011812375,391.99543598175,407.38487419079,415.30469757995,423.37848741825,431.60923940535,440,448.5538823653,466.16376151809,475.22628419761,484.46499093218,493.88330125613,503.48470957687,513.27277840175,523.2511306012],"description":"Wonder Scale, 36-tET version"},"wronski":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,308.86351459099,327.03195662575,348.83408706747,370.63621750918,392.4383479509,416.96574469783,441.49314144476,463.29527188648,494.18162334558,523.2511306012],"description":"Wronski's scale, from Jocelyn Godwin, \"Music and the Occult\", p. 105."},"wurschmidt":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,313.95067836072,331.11985608357,353.19451315581,367.91095120397,392.4383479509,413.89982010446,441.49314144476,470.92601754108,490.54793493862,523.2511306012],"description":"W�rschmidt's normalised 12-tone system"},"wurschmidt1":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,363.36884069528,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,465.11211608996,490.54793493862,502.32108537715,523.2511306012],"description":"W�rschmidt-1 19-tone scale"},"wurschmidt2":{"frequencies":[261.6255653006,272.52663052146,282.55561052465,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,363.36884069528,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,465.11211608996,484.4917875937,502.32108537715,523.2511306012],"description":"W�rschmidt-2 19-tone scale"},"wurschmidt_31":{"frequencies":[261.6255653006,267.90457886781,272.52663052146,279.06726965397,287.4304306281,294.32876096318,301.39265122629,306.59245933664,313.95067836072,319.36714514233,327.03195662575,334.88072358477,340.65828815182,348.83408706747,357.20610515709,363.36884069528,376.74081403286,383.2405741708,392.4383479509,401.85686830172,408.78994578219,418.60090448096,428.6473261885,436.04260883433,446.50763144636,454.2110508691,465.11211608996,476.27480687611,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"W�rschmidt's 31-tone system"},"wurschmidt_31a":{"frequencies":[261.6255653006,267.90457886781,272.52663052146,279.06726965397,287.4304306281,294.32876096318,301.39265122629,306.59245933664,313.95067836072,319.36714514233,327.03195662575,334.88072358477,340.65828815182,348.83408706747,357.20610515709,363.36884069528,372.08969287196,383.2405741708,392.4383479509,401.85686830172,408.78994578219,418.60090448096,428.6473261885,436.04260883433,446.50763144636,454.2110508691,465.11211608996,476.27480687611,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"W�rschmidt's 31-tone system with alternative tritone"},"wurschmidt_53":{"frequencies":[261.6255653006,264.89588486686,267.90457886781,272.52663052146,275.93321340298,279.06726965397,282.55561052465,287.4304306281,290.69507255622,294.32876096318,297.67175429757,301.39265122629,306.59245933664,310.07474405997,313.95067836072,319.36714514233,321.48549464138,327.03195662575,331.11985608357,334.88072358477,340.65828815182,344.91651675372,348.83408706747,353.19451315581,357.20610515709,363.36884069528,367.91095120397,372.08969287196,376.74081403286,383.2405741708,387.59343007496,392.4383479509,396.89567239676,401.85686830172,408.78994578219,413.43299207996,418.60090448096,425.82286018978,428.6473261885,436.04260883433,441.49314144476,446.50763144636,454.2110508691,459.88868900496,465.11211608996,470.92601754108,476.27480687611,484.4917875937,490.54793493862,496.11959049595,502.32108537715,510.98743222773,516.79124009995,523.2511306012],"description":"W�rschmidt's 53-tone system"},"wurschmidt_temp":{"frequencies":[261.6255653006,270.6876810201,276.46178051834,282.35904862511,288.38211267756,294.53365605714,300.81641938515,307.23320174366,313.78686192261,320.48031969341,327.31655710978,338.6540596739,345.87796520471,353.25596548096,360.79134753214,368.48746850413,376.34775715481,384.37571538166,392.57491978195,400.94902556208,409.5017589506,423.68596790742,432.72370810117,441.95423435346,451.38165902684,461.01018486849,470.84409628664,480.88777706987,491.14570185547,501.62244073019,512.32266126632,523.2511306012],"description":"W�rschmidt temperament, 5-limit, g=387.744375, 5-limit"},"t-side":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,294.32876096318,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,418.60090448096,436.04260883433,490.54793493862,523.2511306012],"description":"Tau-on-Side"},"t-side2":{"frequencies":[261.6255653006,294.32876096318,306.59245933664,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,436.04260883433,459.88868900496,470.92601754108,490.54793493862,523.2511306012],"description":"Tau-on-Side opposite"},"tagawa_55":{"frequencies":[261.6255653006,277.01530443593,277.97716313189,279.06726965397,280.31310567921,281.75060878526,283.42769574232,285.40970760065,287.78812183066,290.69507255622,294.32876096318,296.50897400735,299.00064605783,301.87565226992,305.22982618403,307.79478270659,309.19384990071,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,348.83408706747,356.76213450082,359.73515228832,362.25078272391,366.27579142084,369.35373924791,370.63621750918,373.75080757229,377.90359432309,380.54627680087,383.71749577421,392.4383479509,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,442.75095666255,444.76346101102,448.50096908674,453.48431318771,457.84473927605,461.69217405988,465.11211608996,470.92601754108,475.68284600109,479.64686971777,483.00104363188,485.87604984397,488.36772189445,490.54793493862,492.47165233054,494.18162334558,523.2511306012],"description":"Rick Tagawa, 17-limit diamond subset with good 72-tET approximation, 2003"},"tamil":{"frequencies":[261.6255653006,275.62199471997,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,331.11985608357,348.83408706747,353.19451315581,372.50983809402,387.59343007496,392.4383479509,413.43299207996,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,496.67978412536,523.2511306012],"description":"Possible Tamil sruti scale. Alternative 11th sruti is 45/32 or 64/45"},"tamil_vi":{"frequencies":[261.6255653006,275.62199471997,290.69507255622,310.07474405997,327.03195662575,348.83408706747,367.91095120397,387.59343007496,413.43299207996,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Vilarippalai scale in Tamil music, Vidyasankar Sundaresan"},"tamil_vi2":{"frequencies":[261.6255653006,275.62199471997,290.69507255622,310.07474405997,327.03195662575,348.83408706747,367.49599295996,387.59343007496,413.43299207996,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Vilarippalai scale with 1024/729 tritone"},"tanaka":{"frequencies":[261.6255653006,272.52663052146,275.93321340298,279.06726965397,290.69507255622,294.32876096318,306.59245933664,313.95067836072,327.03195662575,331.11985608357,344.91651675372,348.83408706747,353.19451315581,363.36884069528,367.91095120397,372.08969287196,387.59343007496,392.4383479509,408.78994578219,418.60090448096,436.04260883433,441.49314144476,459.88868900496,465.11211608996,470.92601754108,490.54793493862,523.2511306012],"description":"26-note choice system of Shoh� Tanaka, Studien i.G.d. reinen Stimmung (1890)"},"tanbur":{"frequencies":[261.6255653006,268.33391312882,275.39533189537,282.83844897362,290.69507255622,299.00064605783,306.66732929008,314.73752216614,323.24394168414,332.22294006425,341.71502406609,351.76546595039,523.2511306012],"description":"Sub-40 tanbur scale"},"tansur":{"frequencies":[261.6255653006,275.71279889585,293.19126194179,310.07474405997,328.21516866261,348.83408706747,367.61706537823,391.78834765065,413.56919813705,438.48689188122,465.11211608996,491.022754507,523.2511306012],"description":"William Tans'ur temperament from A New Musical Grammar (1746) p. 73"},"tartini_7":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,367.91095120397,392.4383479509,418.60090448096,490.54793493862,523.2511306012],"description":"Tartini (1754) with 2 neochromatic tetrachords, 1/1=d, Minor Gipsy (Slovakia)"},"taylor_g":{"frequencies":[261.6255653006,274.70684356563,287.78812183066,294.32876096318,313.95067836072,353.19451315581,366.27579142084,392.4383479509,412.06026534844,418.60090448096,431.68218274599,470.92601754108,523.2511306012],"description":"Gregory Taylor's Dutch train ride scale based on pelog_schmidt"},"taylor_n":{"frequencies":[261.6255653006,275.93341798027,292.67158636845,310.42509491746,327.40170814054,348.83408706747,367.9112241576,391.33200541501,413.90012676351,437.76975193523,465.63764214343,491.10256480205,523.2511306012],"description":"Nigel Taylor's Circulating Balanced temperament (20th cent.)"},"telemann":{"frequencies":[261.6255653006,264.94361147373,271.70648167539,275.15237829755,278.64197723942,282.17583275232,289.3785657319,293.0485888979,296.76515515861,300.52885648597,304.34029066685,308.20006306951,312.10878854255,316.06708432391,324.13491490251,328.24573110938,332.40868242763,336.62443200122,345.21700307457,349.59519124833,354.02890545793,363.06573983159,367.67029324081,372.33324354561,377.05533136015,386.67993129161,391.58396987353,396.55020354877,406.67242132093,411.83001550364,417.05301810033,422.34226102699,433.12283887627,438.61588607285,444.17860098504,449.81186203693,461.29362042034,467.14394139401,473.06846134744,485.14386048744,491.29666030217,497.52749252881,503.83734680745,516.69814597997,523.2511306012],"description":"G.Ph. Telemann (1767). 55-tET interpretation of Klang- und Intervallen-Tafel"},"telemann_28":{"frequencies":[261.6255653006,264.94361147373,275.15237829755,278.64197723942,293.0485888979,296.76515515861,308.20006306951,312.10878854255,328.24573110938,332.40868242763,345.21700307457,349.59519124833,354.02890545793,367.67029324081,372.33324354561,386.67993129161,391.58396987353,396.55020354877,406.67242132093,411.83001550364,438.61588607285,444.17860098504,461.29362042034,467.14394139401,473.06846134744,491.29666030217,497.52749252881,516.69814597997,523.2511306012],"description":"Telemann's tuning as described on Sorge's monochord, 1746, 1748, 1749"},"temes-mix":{"frequencies":[261.6255653006,306.31659399917,323.38698268281,342.47239171077,361.55773069062,378.62819763364,399.72843132859,423.31905787312,446.91000942727,523.2511306012],"description":"Temes' 5-tone Phi scale mixed with its octave inverse"},"temes-ur":{"frequencies":[261.6255653006,306.31659399917,323.38703872151,342.47239171077,361.55773069062,423.31905787312],"description":"Temes' Ur 5-tone phi scale"},"temes":{"frequencies":[261.6255653006,306.31659399917,323.38703872151,342.47239171077,361.55773069062,423.31905787312,495.63057556553,523.2511306012,554.13187513888,585.01259700885,684.94462120932],"description":"Temes' 5-tone Phi scale / 2 cycle"},"temes2-mix":{"frequencies":[261.6255653006,306.31659399917,323.38698268281,342.47239171077,361.55773069062,399.72843132859,423.31905787312,468.0102705885,495.63057556553,523.2511306012,552.41124604023,585.01259700885,646.77396536561,684.94438778203,757.25639526728,799.45686265718,846.63811574624,893.82001885454,1046.5022612024],"description":"Temes' 2 cycle Phi scale mixed with its 4/1 inverse"},"temp10coh":{"frequencies":[261.6255653006,279.06726965397,299.10339764541,320.57805584394,343.5945271479,368.2635494613,394.70435354475,423.05284121745,453.57582505819,488.36772189445,523.2511306012],"description":"Differential coherent 10-tone scale, OdC, 2003"},"temp10ebss":{"frequencies":[261.6255653006,280.43397904206,300.58585223371,322.17714382919,345.31067040124,370.09659148016,396.65293718743,425.1061627261,455.59176355181,488.25490599611,523.2511306012],"description":"Cycle of 10 equal \"beating\" 15/14's"},"temp11ebst":{"frequencies":[261.6255653006,278.68301283272,296.80966039395,316.07252488244,336.70993118161,358.64093492832,381.94662420398,406.71316497313,433.24697173408,461.44397806515,491.40843569917,523.2511306012],"description":"Cycle of 11 equal beating 9/7's"},"temp12coh3":{"frequencies":[261.6255653006,279.8393060116,294.68135606466,311.32770136359,332.21069717879,353.56473801237,370.2386298036,397.61708850394,418.97112933752,440.1984563065,471.2874275201,496.80305467842,523.2511306012],"description":"Differential coherent scale, interval=3, OdC, 2003"},"temp12ebf":{"frequencies":[261.6255653006,277.18807786937,293.58315284916,311.09098010692,329.5354160273,349.23174343306,369.98176018664,391.84186131702,415.18563115404,439.77824302677,466.03998256716,493.70667148145,523.2511306012],"description":"Equal beating temperament tuned by The Best Factory Tuners (1840)"},"temp12ebf4":{"frequencies":[261.6255653006,276.98801737971,293.51517393789,310.79793252689,329.39098365485,348.83408706747,369.75126958642,391.78747833067,414.83115644933,439.62189128662,465.54602917011,493.43560586205,523.2511306012],"description":"Eleven equal beating fifths and just fourth"},"temp12ebfo":{"frequencies":[261.6255653006,277.20265787963,293.64844512428,311.16011036869,329.64835309433,349.33484978517,370.11921182839,392.06266066657,415.42830219132,440.09698059047,466.36447845344,494.0968438935,523.62658899088],"description":"Equal beating fifths and fifth beats twice octave at C"},"temp12ebfp":{"frequencies":[261.6255653006,277.75307788644,293.77513637875,310.82931496301,329.94340332986,349.12935317325,370.63270249518,391.99544730302,416.18671544528,440.21980402758,465.80107112682,494.47220378931,523.2511306012],"description":"All fifths except G#-Eb beat same as 700 c. C-G"},"temp12ebfr":{"frequencies":[261.6255653006,277.1880780098,293.58315312731,311.09097992515,329.53543943235,349.23174457993,369.98176152553,391.84186168221,415.185630746,439.77824342227,466.03998361904,493.70667287983,523.2511306012],"description":"Exact values of equal beating temperament of Best Factory Tuners (1840)"},"temp12ep":{"frequencies":[261.6255653006,277.19910487213,293.6996776193,311.18246278326,329.70593120198,349.3320268423,370.12638880276,392.15855510068,415.50221189151,440.23542223935,466.44090588941,494.20629608476,523.62445363767],"description":"Pythagorean comma distributed equally over octave and fifth: 1/19-Pyth comma"},"temp12fo1o":{"frequencies":[261.6255653006,277.20349049726,293.7089710611,311.19723286579,329.72679517909,349.35966199273,370.1615231373,392.20198585541,415.5548023839,440.29810917508,466.51470234738,494.29230838881,523.72386870485],"description":"Fifth beats same octave opposite"},"temp12fo2o":{"frequencies":[261.6255653006,277.19623399848,293.69359242342,311.17279259662,329.69226891672,349.31393351076,370.10338107372,392.13011658806,415.46777521802,440.19437666896,466.39258399594,494.14997995304,523.55935978973],"description":"Fifth beats twice octave opposite"},"temp12p10":{"frequencies":[261.6255653006,277.12003622197,293.53214922797,310.91625060765,329.32990524605,349.3071136959,369.493381814,391.90691363044,415.11714643072,439.70197837153,465.74281849401,493.32589719545,523.2511306012],"description":"1/10-Pyth. comma well temperament"},"temp12p6":{"frequencies":[261.6255653006,275.62199471997,293.00227310437,310.07474405997,328.14198392915,349.6228209638,367.9112241576,391.5530240856,413.43299207996,438.51190905657,466.16376151809,491.10256480205,523.2511306012],"description":"Modified 1/6-Pyth. comma temperament"},"temp12p8":{"frequencies":[261.6255653006,277.02617059261,293.33333347996,310.60041853231,328.88393162803,349.42547049952,369.36822764145,391.77416758435,414.83597850347,439.25532436715,465.90062756558,492.49097043477,523.2511306012],"description":"1/8-Pyth. comma well temperament"},"temp12p8a":{"frequencies":[261.6255653006,276.55731914056,293.33333347996,311.12698372208,328.88393162803,349.42547049952,368.74309237173,391.77416758435,414.83597850347,439.25532436715,466.69047534984,492.49097043477,523.2511306012],"description":"1/8-Pyth. comma well temperament, consecutive just fifths"},"temp12s17":{"frequencies":[261.6255653006,275.41266079541,292.61316553779,309.9334225479,327.2710181906,348.78108411875,367.16108497228,391.29294726693,413.18177371806,437.63868343995,464.97078294553,490.98112850332,523.2511306012],"description":"4/17th synt. comma \"well\"-temperament. OdC 1999"},"temp12s3":{"frequencies":[261.6255653006,275.79485124716,293.07576161921,310.19140758515,326.99095182327,348.87783040382,367.77258074571,390.81668391305,413.640406907,437.79703699716,465.22877230071,490.42492909292,523.2511306012],"description":"1/3 synt. comma \"well\"-temperament. OdC 1999"},"temp12septendec":{"frequencies":[261.6255653006,277.01530443593,293.31032234393,310.5638707171,328.83233370046,348.17541215342,368.65631875068,390.34198455955,413.30334035457,437.61515184999,463.35732874365,494.18162334558,523.2511306012],"description":"Scale with 18/17 steps"},"temp12w2b":{"frequencies":[261.6255653006,276.80621914251,293.38957467182,310.9374037046,329.12408537692,349.33498699812,369.32540968366,391.68699838314,414.83365420901,439.33301386008,466.03043161756,492.93477894539,523.2511306012],"description":"The fifths on white keys beat twice the amount of fifths on black keys"},"temp15coh":{"frequencies":[261.6255653006,273.98642352939,286.93424587686,300.52595924487,314.76156220527,329.6715499436,345.28562122078,360.48992106995,377.61407292725,395.54746439596,414.33033691342,434.93480826785,455.53927928881,477.11963158959,499.65025190386,523.2511306012],"description":"Differential coherent 15-tone scale, OdC, 2003"},"temp15ebmt":{"frequencies":[261.6255653006,274.13344448045,287.10161388969,300.54701305042,315.02372625978,330.03318193885,345.59498492211,361.72946206059,379.10151766291,397.1128647533,415.78702800292,435.14840215297,455.99486887387,477.60848441971,500.01748339385,523.2511306012],"description":"Cycle of 15 equal beating minor thirds"},"temp15ebsi":{"frequencies":[261.6255653006,274.09084013406,287.01483652929,300.41443756554,314.84183942382,329.80016763418,345.30896502873,361.38848559819,378.7013656391,396.65136316555,415.2619179078,434.55734100747,455.33280077531,476.87279531786,499.20546063174,523.2511306012],"description":"Cycle of 15 equal beating major sixths"},"temp15mt":{"frequencies":[261.6255653006,272.10155294862,290.46827626332,302.09918118188,314.19580976213,326.77681046955,348.83408706747,362.80207077951,377.32935907335,392.4383479509,418.92774655891,435.70241417719,453.14877154631,471.29371440761,503.10581234929,523.2511306012],"description":"Cycle of 15 minor thirds, Petr Parizek"},"temp16d3":{"frequencies":[261.6255653006,272.52663052146,287.69189096389,299.67905363019,312.16568143019,325.17258353382,338.72144179457,352.83483584176,372.46899992671,387.98854005196,404.15472995283,420.99451113006,438.53594735503,462.93911228358,482.22824196207,502.32108537715,523.2511306012],"description":"Cycle of 16 thirds tempered by 1/3 small diesis"},"temp16d4":{"frequencies":[261.6255653006,271.36369423603,291.82218013836,302.68427617679,313.95067836072,325.63643364742,337.75715313333,350.32902355546,376.74081403286,390.76372105392,405.30858212106,420.39482899491,436.04260883433,468.91646607712,486.37029938793,504.47379566792,523.2511306012],"description":"Cycle of 16 thirds tempered by 1/4 small diesis"},"temp16ebs":{"frequencies":[261.6255653006,273.35566334732,285.38860666159,297.73221513295,311.13803992337,324.88997598926,338.996955196,354.31789928052,370.0343963911,386.15666093499,403.66631166114,421.62802297921,440.05346707662,460.0644954801,480.59216613216,501.64981691394,523.2511306012],"description":"Cycle of 16 equal beating sevenths"},"temp16ebt":{"frequencies":[261.6255653006,273.54317752885,285.74681450472,298.24333695649,311.03977535434,324.14332902314,339.04034606654,354.29488987405,369.91554384313,385.91109319424,402.29053605603,420.91180538217,439.97998583037,459.50580330844,479.50024102158,499.97454326842,523.2511306012],"description":"Cycle of 16 equal beating thirds"},"temp16l4":{"frequencies":[261.6255653006,278.81939890042,286.59644689091,305.43134787805,313.95067836072,322.70763593891,343.91573686494,353.50850469302,376.74081403286,387.24916379762,412.69888495295,424.21020636659,436.04260883433,464.69899736225,477.66074674968,509.05224558146,523.2511306012],"description":"Cycle of 16 fifths tempered by 1/4 major limma"},"temp17c10":{"frequencies":[261.6255653006,278.13248184697,287.25399162485,296.67464640038,315.39293803189,325.73642523995,336.41913481987,347.45218787195,369.37422084479,381.48805431277,393.9991677018,418.85802036446,432.59470262079,446.78188702878,474.97099505857,490.54793493862,506.63572944675,523.2511306012],"description":"Cycle of 17 fifths tempered by 1/10 of \"17-tET comma\""},"temp17c11":{"frequencies":[261.6255653006,276.93071634298,286.5293181416,296.46061382736,313.80362259461,324.68026371274,335.93389640617,347.57758745223,367.91095120397,380.66298908833,393.8570200719,416.89773925535,431.34769064645,446.29848691039,472.40704302301,488.78098359819,505.72245578392,523.2511306012],"description":"Cycle of 17 fifths tempered by 1/11 of \"17-tET comma\""},"temp17c12":{"frequencies":[261.6255653006,275.93321340298,285.92682111936,296.28237159295,312.48531442823,323.80274674587,335.53006800342,347.68212334757,366.69599021774,379.97679689512,393.73860099464,415.27118158544,430.3112595477,445.8960513142,470.2809925818,487.31338757149,504.96265307831,523.2511306012],"description":"Cycle of 17 fifths tempered by 1/12 of \"17-tET comma\""},"temp17c13":{"frequencies":[261.6255653006,275.09197878886,285.41800532755,296.13163442011,311.37414725128,323.06208421743,335.18874504319,347.77059980835,365.67107999768,379.3971387881,393.63842979584,413.89982010446,429.43622376713,445.55581352332,468.48950048969,486.07501593832,504.32063522708,523.2511306012],"description":"Cycle of 17 fifths tempered by 1/13 of \"17-tET comma\""},"temp17c14":{"frequencies":[261.6255653006,274.37296298479,284.98259752889,296.00249241327,310.42486507835,322.42857866752,334.89645942743,347.84645641687,364.79486552165,378.90099378095,393.5525871037,412.72797362103,428.68761089217,445.26438593469,466.95936897503,485.01606158014,503.77098227424,523.2511306012],"description":"Cycle of 17 fifths tempered by 1/14 of \"17-tET comma\""},"temp17c15":{"frequencies":[261.6255653006,273.75133628611,284.60578240525,295.8906154666,309.60449456672,321.88054534371,334.64335075548,347.91221098893,364.0371787025,378.47152629398,393.47820661021,411.71505587788,428.03986711385,445.01196937812,465.63729761752,484.10016650719,503.29510175355,523.2511306012],"description":"Cycle of 17 fifths tempered by 1/15 of \"17-tET comma\""},"temp17ebf":{"frequencies":[261.6255653006,272.44226039746,283.83762774933,295.84262353625,308.01140541539,320.83119298602,334.33681303028,348.02669374128,362.44895565855,377.64277622383,393.64943714798,409.87448211667,426.96753159265,444.97502525992,463.22819966593,482.45788080796,502.71631088044,523.2511306012],"description":"Cycle of 17 equal beating fifths"},"temp17ebs":{"frequencies":[261.6255653006,272.25303191034,284.09302419378,294.99486987374,307.14054534497,320.67196534338,333.1312181383,347.01199086095,362.47647062671,376.71561430061,392.57935523584,410.25304697073,426.52635565248,444.65634289229,464.854847056,483.45291583119,504.17290303449,523.2511306012],"description":"Cycle of 17 equal beating sevenths"},"temp17fo2":{"frequencies":[261.6255653006,272.49443630436,283.81483782984,295.60553136463,307.88605111976,320.67674980257,333.99881838086,347.87433573796,362.32629011314,377.37863296804,393.05630224552,409.38528080469,426.39262165238,444.10651133426,462.55629730628,481.77255670213,501.78712602614,522.6331757532],"description":"Fifth beats twice octave"},"temp17nt":{"frequencies":[261.6255653006,272.67141175251,283.62400127587,295.59862296305,308.07881564783,321.08592105074,333.98321109015,348.08400151932,362.78013022893,377.35217954558,393.28401259522,409.88848628312,426.35277308246,444.35341180422,463.11404114636,482.66674266598,502.05436630802,523.2511306012],"description":"17-tone temperament with 27/22 neutral thirds"},"temp17s":{"frequencies":[261.6255653006,272.47577100117,283.83144686231,295.66037914716,307.98229466369,320.75501909295,334.12277657932,348.04764753103,362.48197303348,377.58873713905,393.32509157531,409.63717539588,426.70917767843,444.49267120113,463.01730800927,482.21968335939,502.31662775181,523.2511306012],"description":"Cycle of 17 fifths tempered by 2 schismas. Schulter, Tuning List 10-9-98"},"temp19d5":{"frequencies":[261.6255653006,270.66831710441,280.02362001571,289.70227696231,304.50185643804,315.02657220273,325.91506125677,337.17989695691,348.83408706747,360.89108965294,379.3273836973,392.4383479509,406.00247545366,420.03542981361,434.55341522625,449.57319616728,472.53985806789,488.87259164079,505.76984518255,523.2511306012],"description":"Cycle of 19 thirds tempered by 1/5 small diesis. Third = 3\\5"},"temp19ebf":{"frequencies":[261.6255653006,271.21349495395,281.45216719787,291.55303152151,302.33945232218,313.85796000757,325.22143162672,337.35615460362,350.31447634238,363.09838134063,376.74994653359,390.21776437961,404.59965986997,419.95766938963,435.10896436483,451.288596451,468.56635736893,485.61156561298,503.81364896584,523.2511306012],"description":"Cycle of 19 equal beating fifths"},"temp19ebmt":{"frequencies":[261.6255653006,271.3515811897,281.43551369743,291.89053542337,302.73030209663,313.98726376766,325.65848288741,337.75920164946,350.30522706536,363.3129458114,376.82130195458,390.82676353803,405.34762742982,420.40285701732,436.01212051281,452.22214724761,469.0287008844,486.45373685079,504.52001310976,523.2511306012],"description":"Cycle of 19 equal beating minor thirds"},"temp19ebo":{"frequencies":[261.6255653006,277.22364042749,293.65618047886,311.2040149966,329.6906225544,349.43193638686,370.22936988938,392.1394232912,415.53653598153,440.18534605859,466.50709783521,494.2370091719,523.84897992059,555.04513017437,587.91021027711,623.0058793126,659.97909442818,699.46172209312,741.05658909815,784.8766959018],"description":"Cycle of 19 equal beating octaves in twelfth"},"temp19ebt":{"frequencies":[261.6255653006,271.59402175166,281.80172126331,292.25440577595,302.95795550425,313.91838845704,325.14187338321,337.60244413755,350.36206814823,363.42792409681,376.80735887968,390.50790160795,404.53725818867,420.11297167574,436.06250107414,452.39482160095,469.11911613638,486.2447950704,503.78149001575,523.2511306012],"description":"Cycle of 19 equal beating thirds"},"temp19k10":{"frequencies":[261.6255653006,271.76196854941,282.29109592175,293.22816309454,304.58897525989,314.09773337131,326.2671147593,338.90798583865,352.03861397416,365.67797428016,377.09383089344,391.70392883316,406.88007915549,422.6442137645,439.01911266466,452.72455471179,470.26488431194,488.48479525859,507.41061720556,523.2511306012],"description":"Chain of 19 minor thirds tempered by 1/10 kleisma"},"temp19k3":{"frequencies":[261.6255653006,272.95237156345,284.76956174698,297.09836322231,309.96092731219,314.44113201634,328.05453510669,342.25731432435,357.07498823553,372.53417996774,377.91882441317,394.28042610165,411.35038641496,429.15937528906,447.73938330242,454.2110508691,473.87564511273,494.39160029408,515.79576952378,523.2511306012],"description":"Chain of 19 minor thirds tempered by 1/3 kleisma"},"temp19k4":{"frequencies":[261.6255653006,272.52663052146,283.88190679319,295.71031957624,308.03158289191,314.31844786309,327.4150485592,341.05734286691,355.26806612985,370.07090075127,377.62397563434,393.35830866491,409.74823893478,426.8210805314,444.6052930255,453.67960031314,472.58291784883,492.27387080735,512.78528301977,523.2511306012],"description":"Chain of 19 minor thirds tempered by 1/4 kleisma"},"temp19k5":{"frequencies":[261.6255653006,272.27150423996,283.35064249518,294.88062803952,306.8797443789,314.24485853342,327.03195662575,340.33937954017,354.18830437416,368.6007608062,377.44717941318,392.80607455881,408.78994578219,425.42422593284,442.73537947933,453.36102900438,471.8089732132,491.00759210237,510.98743222773,523.2511306012],"description":"Chain of 19 minor thirds tempered by 1/5 kleisma"},"temp19k6":{"frequencies":[261.6255653006,272.10155294862,282.99701916355,294.32876096318,306.11424676116,314.19580976213,326.77681046955,339.86157848985,353.47028562902,367.62391141072,377.32935907335,392.4383479509,408.1523292189,424.49552853314,441.49314144476,453.14877154631,471.29371440761,490.16521545931,509.79236747994,523.2511306012],"description":"Chain of 19 minor thirds tempered by 1/6 kleisma"},"temp19k7":{"frequencies":[261.6255653006,271.9802243463,282.7447017667,293.93521741989,305.56863311614,314.16077935352,326.59468561952,339.52070304385,352.95830848174,366.92774752709,377.24522513926,392.17589782962,407.69749910471,423.83341578697,440.60837682578,452.99722066906,470.92601754108,489.56440442681,508.94046380742,523.2511306012],"description":"Chain of 19 minor thirds tempered by 1/7 kleisma"},"temp19k8":{"frequencies":[261.6255653006,271.88926339885,282.55561052465,293.64040364533,305.16005936662,314.13450956378,326.45815718343,339.26526937521,352.57481080357,366.4064920117,377.18213591051,391.97917444376,407.35670799125,423.33750965456,439.94524339387,452.88359011983,470.65043349884,489.11427877975,508.30246674991,523.2511306012],"description":"Chain of 19 minor thirds tempered by 1/8 kleisma"},"temp19k9":{"frequencies":[261.6255653006,271.81853598083,282.40862793607,293.41130980736,304.84265779003,314.11407882217,326.35200974457,339.06673262958,352.27682225125,366.00158141044,377.13307501509,391.82623534045,407.09184571451,422.95220417284,439.43048454013,452.79523167251,470.4362008006,488.76446469244,507.80680338678,523.2511306012],"description":"Chain of 19 minor thirds tempered by 1/9 kleisma"},"temp19lst":{"frequencies":[261.6255653006,270.56149416036,279.80263334807,289.3594074481,304.78245180412,315.19242188443,325.95794877725,337.09117667186,348.60466454729,360.5114003397,379.7268899367,392.69661814622,406.10933276067,419.98016416303,434.32475952075,449.15930043669,473.09978287909,489.25870067642,505.96953296163,523.2511306012],"description":"Cycle of 19 least squares thirds 5/4^5 = 3/2"},"temp19lst2":{"frequencies":[261.6255653006,270.86681403244,280.43448605562,290.34011310859,303.98143643885,314.71879896063,325.83542931914,337.34472599098,349.26055890156,361.59728998429,378.58655645252,391.95915298383,405.80409975455,420.1380835834,434.97837844393,450.34287106955,471.50175486263,488.15634183652,505.39920634693,523.2511306012],"description":"Cycle of 19 least squares thirds 5/4, 3/2 (5), 6/5 (4)"},"temp21ebs":{"frequencies":[261.6255653006,270.48603901573,279.57527100587,288.89916626223,298.46378542286,308.59004184051,318.97773454914,329.63361550747,340.56460989801,352.13747205507,364.00912264098,376.18727282918,388.67983604901,401.90596519454,415.47356606258,429.3914526989,443.66866815503,458.78424493347,474.29007331382,490.19622772738,506.51304733863,523.2511306012],"description":"Cycle of 21 equal beating sevenths"},"temp22ebf":{"frequencies":[261.6255653006,269.81217946012,278.43675961795,287.52273893052,297.09479717246,306.30473778727,316.00739221221,326.22911792828,336.99768333647,347.35886661388,358.27435338478,369.77379349451,381.88843101834,394.65117841871,406.93109909525,419.8679691216,433.49693671533,447.85502662133,461.66993710068,476.2239184443,491.55650493929,507.70935693135,523.2511306012],"description":"Cycle of 22 equal beating fifths"},"temp22ebt":{"frequencies":[261.6255653006,270.16401944699,278.90739732088,287.86061708193,297.02871287074,306.4168425362,316.03028815926,325.87445510174,336.54752540671,347.4767459334,358.66827061689,370.12838991426,381.86355177507,393.88036006393,406.18556836568,419.52690380046,433.1884314408,447.17783799964,461.50298590676,476.17193984405,491.19294816955,506.57446222015,523.2511306012],"description":"Cycle of 22 equal beating thirds"},"temp22fo2":{"frequencies":[261.6255653006,269.97341665226,278.58762814388,287.47669703533,296.64939669548,306.114775449,315.88217199169,325.96122111215,336.36187067071,347.09438029185,358.16933884319,369.59767092309,381.39065611261,393.55992749281,406.11749146369,419.07573510033,432.44744798202,446.24582051114,460.48446638525,475.17743368268,490.33921589034,505.98477744485,522.12955176559],"description":"Fifth beats twice opposite rate as octave"},"temp23ebs":{"frequencies":[261.6255653006,269.54528659271,277.75645349026,286.26979186473,295.09642104593,304.24787054065,313.41421505132,322.9178815064,332.77128133421,342.98728793362,353.5792427091,364.56098080918,375.56059498003,386.96499273375,398.78907363541,411.04828247111,423.75862731373,436.93671323096,450.13624919654,463.82153026575,478.01042762353,492.72147385367,507.97388874722,523.2511306012],"description":"Cycle of 23 equal beating major sixths"},"temp24ebaf":{"frequencies":[261.6255653006,269.28287293678,277.23083697142,285.33112867981,293.73889258015,302.30779732819,311.20195864933,320.26658492056,329.67528611807,339.26431305611,349.21731641877,359.36108127338,369.88988063787,380.8183283077,391.95623237686,403.5169050439,415.29914897519,427.52862168357,439.9924847314,452.92944495636,466.1143590732,479.79973930305,493.74741628009,508.22451419243,523.2511306012],"description":"Cycle of 24 equal beating 11/8's"},"temp24ebf":{"frequencies":[261.6255653006,269.29177952703,277.18807786937,285.37455545576,293.58315284916,302.20762754558,311.09098010692,320.17688686519,329.5354160273,339.23795459232,349.23174343306,359.45337270909,369.98176018664,380.89707445632,391.84186131702,403.3411703213,415.18563115404,427.4653330282,439.77824302677,452.71493931339,466.03998256716,479.66882917609,493.70667148145,508.26043277122,523.2511306012],"description":"24-tone ET with 23 equal beatings fifths. Fifth on 17 slightly smaller."},"temp25ebt":{"frequencies":[261.6255653006,269.07040607882,276.69392272178,284.50040351526,292.49424189123,300.67993013952,309.06207502162,317.64539198503,326.43470939254,335.74076076764,345.27015661764,355.02825763358,365.02055286832,375.25266439783,385.73034580726,396.45949385543,407.44613828076,419.07870286007,430.99044652419,443.18807578441,455.67844358274,468.46858279232,481.56568677979,494.97711759939,508.71042703507,523.2511306012],"description":"Cycle of 25 equal beating thirds"},"temp26eb3":{"frequencies":[261.6255653006,268.53506427639,276.23413316293,283.52944261778,291.01742029734,298.70315454572,307.26715974579,315.38204761281,323.71124866952,332.26042290088,341.78653782772,350.81307822085,360.07800843467,370.40166886388,380.18393134541,390.22454217496,400.5303243006,412.0137801623,422.89501338113,434.06361862988,445.5271853685,458.30072684004,470.40439262311,482.82771472967,495.57913524385,509.78770018956,523.2511306012],"description":"Cycle of 26 fifths, 5/4 beats three times 3/2"},"temp26ebf":{"frequencies":[261.6255653006,268.42568455944,275.6873347244,283.44184249631,290.6057533496,298.25588724353,306.42524452376,315.14906491362,323.2084665433,331.81486605817,341.00539333861,350.8196903474,359.88651586494,369.56871668171,379.90806097321,389.45994242989,399.66012078319,410.55259814459,422.18435687733,432.93022440227,444.40542617247,456.65946119637,469.74519313893,481.83429211771,494.74389287961,508.52968420524,523.2511306012],"description":"Cycle of 26 equal beating fifths"},"temp26ebmt":{"frequencies":[261.6255653006,268.65375733515,276.22103845862,283.50786797993,291.35362426947,298.90860888253,307.04308924768,315.80151824033,324.23534814673,333.31608510092,342.06028051348,351.47518831899,360.54116941247,370.30254728737,380.81265974123,390.93325547321,401.83014055422,412.32317421544,423.62106542614,434.50024245702,446.21389528982,458.82603004394,470.97074536855,484.04700949484,496.63864979835,510.1961187079,523.2511306012],"description":"Cycle of 26 equal beating minor thirds"},"temp26ebs":{"frequencies":[261.6255653006,268.70854008298,275.97438147252,283.42781183148,291.07367309004,298.91693448926,307.01176285104,315.31558194419,323.83378869523,332.57191674,341.53564330438,350.78687613393,360.27695513986,370.01204624828,379.9984780646,390.24273934583,400.81557597059,411.66137956276,422.7871998129,434.200265189,445.90799193987,457.99123299379,470.38643795716,483.10166179174,496.14516363988,509.5254229925,523.2511306012],"description":"Cycle of 26 equal beating sevenths"},"temp27c8":{"frequencies":[261.6255653006,268.8683660761,273.88218275531,281.46429379013,289.25630678777,297.26403435806,305.49344487497,313.95067836072,319.80518189674,328.65861797738,337.75715313333,347.10756874671,356.7168418477,363.36884069528,373.42828707985,383.76621672426,394.39034225616,405.30858212106,412.86671295557,424.29645219584,436.04260883433,448.1139452722,460.51946086698,473.26841152735,482.09384659572,495.44005640506,509.15574351714,523.2511306012],"description":"Cycle of 27 fifths tempered by 1/8 of difference between augm. 2nd and 5/4"},"temp27eb2":{"frequencies":[261.6255653006,268.46319812592,275.47953375729,282.6792426258,290.06711722511,297.6480770209,305.21714541248,313.19405229436,321.37943712173,329.77875040935,338.39757940759,347.00289091411,356.07187808578,365.37788286775,374.92710181611,384.72589137834,394.78077412888,404.81988946592,415.39993259502,426.25648711974,437.39677971686,448.82822593369,460.24174609969,472.27024976331,484.61312060812,497.27857467888,510.27504274822,523.2511306012],"description":"Cycle of 27 fourths, 5/4 beats twice 4/3"},"temp28ebt":{"frequencies":[261.6255653006,268.20719354764,274.94677993062,281.84811597329,288.91508487862,296.15166190523,303.56191452522,311.15001492268,318.92023016627,326.87692943437,335.10396312415,343.5284476344,352.15511767098,360.98882840285,370.03454814671,379.29736707683,388.78249121135,398.49525813745,408.44113355924,418.72492751128,429.25553103998,440.03886948281,451.08100913788,462.38815755283,473.96667987616,485.82308640697,497.96404651665,510.39638953936,523.2511306012],"description":"Cycle of 28 equal beating thirds"},"temp29c14":{"frequencies":[261.6255653006,268.03384168485,274.59908446169,281.12309545065,288.00894581307,294.85155418799,302.07367045706,309.47268578827,316.82523654187,324.58557784847,332.29718551084,340.4364979057,348.77517523396,357.06148706459,365.80737813473,374.49834647311,383.67133729641,392.78672100419,402.40767098088,412.26427490957,422.0589810157,432.39692561869,442.66994710331,453.51274088813,464.62111626441,475.65973015548,487.31057837675,498.88825560972,511.10806227553,523.2511306012],"description":"Cycle of 29 fifths 1/14 comma positive"},"temp29ebf":{"frequencies":[261.6255653006,267.97141371953,274.40384216744,281.08918054527,287.86573007783,294.90872015661,302.04780073409,309.28428172011,316.80528774769,324.42890571749,332.35226986162,340.383734589,348.52477529448,356.98590767403,365.56247629567,374.47626314535,383.51165984234,392.90231649713,402.42108995343,412.06973029551,422.09773822292,432.26256191617,442.8270465847,453.53566813958,464.39038927288,475.67189906986,487.10732348594,498.99237046175,511.03956815915,523.2511306012],"description":"Cycle of 29 equal beating fifths"},"temp29fo":{"frequencies":[261.6255653006,267.94780983951,274.42283293416,281.05432651499,287.84607006616,294.80193939197,301.92589896847,309.2220107369,316.69443479624,324.34743177532,332.18536334326,340.21270232633,348.43402388135,356.85401564372,365.47747852664,374.30932945854,383.35460418662,392.61845788025,402.10617708826,411.82316930666,421.77497497272,431.96726840975,442.4058610624,453.0967048103,464.04589268124,475.25967298378,486.74443697706,498.50673304697,510.55326782272,522.89091000079],"description":"Fifth beats with opposite equal rate as octave"},"temp31c51":{"frequencies":[261.6255653006,267.17944246504,273.80687224646,279.61933836952,286.55534345926,292.63843680803,298.85066583755,306.26370726525,312.76517639908,319.40466275447,327.32754956004,334.27616903285,342.56794607269,349.84009583671,357.26662128823,366.1286782788,373.90098334082,383.17565840352,391.30984260196,399.61670205031,409.52926208827,418.22288720188,428.59697681668,437.69538032917,446.98692528774,458.07451174337,467.79867446983,477.72926229583,489.57941763243,499.97237729845,512.37427391379,523.2511306012],"description":"Cycle of 31 51/220-comma tempered fifths (twice diff. of 31-tET and 1/4-comma)"},"temp31coh":{"frequencies":[261.6255653006,267.17903658035,272.71444919697,278.8328003927,286.67318542907,292.31259119845,298.22448926086,305.9625493141,312.79375273624,319.37019903425,325.99008611032,333.53448283298,342.55073731576,349.35067604096,356.49690427728,365.94514964733,373.94225818849,381.74854907994,389.68867781295,401.66236977474,409.34549662494,417.52928752537,426.20510506248,437.61344561246,447.02040600938,456.30467151405,466.17931462488,479.8608061495,489.18804557359,499.02680928636,509.58872491278,523.2511306012],"description":"Differential coherent 31-tone scale, interval=8, OdC, 2003"},"temp31eb1":{"frequencies":[261.6255653006,267.35556661283,273.21106374578,279.19480525048,287.36432599524,293.65804565963,300.08960744161,306.66203029506,313.37839929357,320.24186707858,327.25565533923,334.42305632458,341.74743438901,349.23222958864,356.8809512704,367.32364464292,375.36859607341,383.58974428421,391.99094825517,400.57615379751,409.34938620036,418.31476585427,427.47650107887,436.83889236244,446.40633438056,459.46863260649,469.5317006585,479.81516534138,490.32385367952,501.06269841655,512.03674033076,523.2511306012],"description":"Cycle of 31 thirds, 3/2 beats equal 5/4. Third 1/18 synt. comma higher"},"temp31eb1a":{"frequencies":[261.6255653006,267.52830363402,273.56421824856,279.73631545395,286.19123047598,292.64821393201,299.25087842544,306.00251077972,312.90647197491,319.96619882071,327.18520755731,334.56708808783,342.11551697966,349.83425186023,357.90667665031,365.98168819447,374.23888853079,382.68238383924,391.31637942763,400.14517332125,409.17316051655,418.40483516889,427.84479530109,437.49773526159,447.36846272566,457.69148927209,468.01782376277,478.57713873597,489.37469064597,500.41585743254,511.7061296998,523.2511306012],"description":"Cycle of 31 thirds, 5/4 beats equal 7/4"},"temp31eb2":{"frequencies":[261.6255653006,267.43633367564,273.37616065041,279.44791264824,286.8151286113,293.18536340431,299.69708268426,306.35342885652,313.15761412007,320.11292201761,327.22270902014,334.4904061467,341.91952062013,349.51363755953,357.2764217104,366.69546492458,374.83986170174,383.16514754137,391.67534003419,400.37454600262,409.26696348258,418.35688374945,427.64869338884,437.14687641357,446.85601642745,458.63669049374,468.82312458207,479.23580188553,489.87974732177,500.7600974131,511.88210276525,523.2511306012],"description":"Cycle of 31 thirds, 3/2 beats twice 5/4"},"temp31eb2a":{"frequencies":[261.6255653006,267.30377559621,273.10522335955,279.03258328435,287.71713441117,293.9616250555,300.34164347605,306.86013111019,313.520093235,320.3246003528,327.27678960683,334.37986622751,341.63710501026,349.05185182525,356.62752721996,367.72712485201,375.70811839104,383.86232802855,392.19351543866,400.70551714108,409.40225971792,418.28775270674,427.36609266644,436.64146506587,446.11814621352,460.00303307438,469.98674378481,480.18713671772,490.60891465214,501.25688243424,512.13594919255,523.2511306012],"description":"Cycle of 31 thirds, 5/4 beats twice 3/2"},"temp31eb2b":{"frequencies":[261.6255653006,267.52098517401,273.5492512983,279.71335720518,286.24081966732,292.69091492047,299.28635537219,306.03041620307,312.92644639599,319.97787039914,327.18818982659,334.56098519707,342.09991771207,349.80873107384,357.97195918064,366.0384300542,374.28666922186,382.72077261519,391.34492846269,400.16341936959,409.18062444454,418.40102147414,427.82918914659,437.46980932536,447.32766937413,457.76662230541,468.08184681118,478.62951259033,489.41485742956,500.44323714283,511.72012823096,523.2511306012],"description":"Cycle of 31 thirds, 5/4 beats twice 7/4 (7/4 beats twice 5/4 gives 31-tET)"},"temp31ebf":{"frequencies":[261.6255653006,267.58895287558,273.47207673981,279.84020613447,286.1226232561,292.32048149598,299.02929415269,305.64780689513,312.81195283539,319.87967238294,326.85226402826,334.39967773649,341.84550545999,349.90516819854,357.85635261941,365.7005167875,374.19135817901,382.56791460144,390.83172556312,399.77680617055,408.60149248083,418.153686518,427.57731316062,436.87410111252,446.93731687602,456.86508723973,467.61130449655,478.21288647115,488.67177324268,499.99289085438,511.16163412976,523.2511306012],"description":"Cycle of 31 equal beating fifths"},"temp31ebf2":{"frequencies":[261.6255653006,268.47208070676,273.9410776603,281.1098810272,286.83632036086,292.67941197057,300.33857976184,306.45672349367,312.69950064833,320.88257689406,327.41921873353,335.98749730659,342.8318387903,349.81560715632,358.96997989875,366.28249344322,375.86779039798,383.5245262314,391.33723606718,401.57819634767,409.75867428285,420.48170539436,429.04726334649,437.78730875453,449.24382765192,458.39529367535,467.73318258368,479.97335657757,489.75080836323,502.56716753771,512.80487382351,523.2511306012],"description":"Cycle of 31 fifths, 3/2 beats equal 7/4"},"temp31ebs":{"frequencies":[261.6255653006,267.49970467488,273.5255021102,279.70687352555,286.04783307233,292.55250379055,299.22511217624,305.93841412724,312.82503848113,319.88946348152,327.13627425327,334.57018402367,342.19602042672,349.86836735032,357.73879552978,365.81242398075,374.09449397971,382.59039112658,391.30563169636,400.0740276901,409.06880268892,418.29580572823,427.76103041037,437.4706255228,447.4309015606,457.4519243295,467.73166961576,478.27681510244,489.09421437332,500.19089295757,511.57406697079,523.2511306012],"description":"Cycle of 31 equal beating sevenths"},"temp31ebs1":{"frequencies":[261.6255653006,267.15774161678,272.80689957055,278.57550963341,287.00766304701,293.07655388437,299.27377555355,305.60203820353,312.06411627904,318.6628357552,328.30838543699,335.25059642555,342.33960321815,349.5785118895,356.97048813578,364.51877275634,375.55232561156,383.49353066309,391.60265342908,399.88324912115,408.33893898267,416.9734277591,429.59472356821,438.6786743379,447.954711436,457.42689142912,467.09936712211,476.97636845082,491.41388278482,501.80502418824,512.41589335668,523.2511306012],"description":"Cycle of 31 sevenths, 3/2 beats equal 7/4. 17/9 schisma fifth"},"temp31ebs2":{"frequencies":[261.6255653006,267.52957387699,273.56681763873,279.74030009523,286.13080593576,292.58781532731,299.19053769144,305.94226304679,312.84635035505,319.90623967996,327.21431324819,334.59843914397,342.14920188821,349.87035796113,357.76575454309,365.83932576918,374.19671203989,382.64107477964,391.27599615891,400.10577865514,409.13482199124,418.3676180873,427.92498506647,437.58181190976,447.45656083737,457.55415226032,467.87960969795,478.43807796233,489.36771995709,500.41110255739,511.70370009509,523.2511306012],"description":"Cycle of 31 sevenths, 3/2 beats twice 7/4. Almost 31-tET"},"temp31ebsi":{"frequencies":[261.6255653006,267.31506098272,273.2139312212,279.32987994092,285.67089487749,292.24525964349,299.06156112772,306.12870201667,312.71376833043,319.5411631371,326.61980701828,333.95894503443,341.56816427739,349.45740040562,357.63696227352,366.11753111539,374.01961057916,382.2124855973,390.7068565555,399.51382386635,408.64488423766,418.11197066674,427.92744450622,438.10412760018,447.58662182594,457.41807184609,467.61131789159,478.17967690081,489.136951815,500.49745466086,512.27602199232,523.2511306012],"description":"Cycle of 31 equal beating major sixths"},"temp31ebt":{"frequencies":[261.6255653006,267.508686718,273.53300221315,279.70190221389,286.0188552526,292.48741633838,299.11122072338,305.89399777728,312.83956126154,319.95181832117,327.23477005018,334.588671338,342.11906613961,349.83019225353,357.72638299858,365.81208378543,374.09184045976,382.57031224079,391.25226584136,400.14258695229,409.24627647794,418.43865241641,427.85164834976,437.49055334209,447.36079317794,457.46791872903,467.81761394993,478.41570188597,489.26814549043,500.38104816704,511.76065992154,523.2511306012],"description":"Cycle of 31 equal beating thirds"},"temp31g3":{"frequencies":[261.6255653006,266.21023205793,270.87523947024,275.62199471997,289.25983723073,294.32876096318,299.48651076576,304.73464409936,310.07474405997,315.5084236529,331.11985608357,336.92232427465,342.82647426905,348.83408706747,354.94697625466,361.16698614085,379.03761443004,385.6797831671,392.4383479509,399.31534788729,406.31285900225,413.43299207996,433.88975562921,441.49314144476,449.22976592409,457.10196592055,465.11211608996,473.26263524279,496.67978412536,505.38348615935,514.23971114652,523.2511306012],"description":"Wonder Scale, cycle of 31 sevenths tempered by 1/3 gamelan residue, s.wonder1"},"temp31g4":{"frequencies":[261.6255653006,266.75106828164,271.97698492363,277.30528403104,287.97116616014,293.61280545832,299.36497003718,305.22982618403,311.20958045219,317.30648321666,329.51091606373,335.96636137331,342.54827390456,349.25913259695,356.10146388137,363.07784268567,377.0427625798,384.42940207435,391.96075366681,399.63965159508,407.46898671086,415.4517078616,431.43106138252,439.88322158593,448.50096908674,457.28754710584,466.24626137824,475.38048570318,493.66485502092,503.33623955776,513.19709315346,523.2511306012],"description":"Cycle of 31 sevenths tempered by 1/4 gamelan residue"},"temp31g5":{"frequencies":[261.6255653006,267.07609791103,272.64018328418,278.3201871026,287.20071989568,293.1840695693,299.2920706603,305.52732176658,311.89247392994,318.39023342226,328.54930692245,335.39408374843,342.38146206091,349.5144087687,356.79595852417,364.22920722399,375.85089312601,383.68111960674,391.67447579625,399.83436022994,408.16424460367,416.66766586736,429.96253800336,438.92009035289,448.06425836543,457.39892986705,466.92807368021,476.65574406444,491.86469103391,502.11187209711,512.57253609913,523.2511306012],"description":"Cycle of 31 sevenths tempered by 1/5 gamelan residue"},"temp31g6":{"frequencies":[261.6255653006,267.29300481931,273.08321314304,278.9988528944,286.68823620156,292.89859205665,299.24348036203,305.72581270733,312.34856974117,319.11478979112,327.9097940226,335.01310892782,342.27029731995,349.68469585889,357.2597060542,364.99881126821,375.05840734677,383.18307527508,391.48374080678,399.96422099622,408.62840644009,417.48028065389,428.98629965513,438.27917301224,447.77335490729,457.47320099372,467.3831713443,477.50781354513,490.66822826519,501.2972832058,512.15658610391,523.2511306012],"description":"Cycle of 31 sevenths tempered by 1/6 gamelan residue"},"temp31g7":{"frequencies":[261.6255653006,267.44804485495,273.40010374961,279.48462577409,286.32273545638,292.69485077785,299.20877758909,305.86767190621,312.6747599825,319.63333987564,327.45376040978,334.74124806474,342.19091885571,349.80638115363,357.59132564064,365.54952414453,374.49336901227,382.82772265927,391.34755742947,400.0570012071,408.96027492626,418.06169111145,428.2903432132,437.821949061,447.565680886,457.52625955954,467.70851101039,478.11736856842,489.81539667363,500.71624319167,511.85968815724,523.2511306012],"description":"Cycle of 31 sevenths tempered by 1/7 gamelan residue"},"temp31h10":{"frequencies":[261.6255653006,267.8597617245,273.71072489962,279.68949451567,286.35413084244,292.60907359238,299.00064605783,306.12544311476,312.81225819702,320.26616683613,327.26186315247,334.41036913783,342.37893460431,349.85764856047,358.19430059608,366.01847563765,374.01355928612,382.92581520849,391.29021017831,400.61414686654,409.36491649663,418.30683086326,428.27453775026,437.62950220286,447.18881072031,457.84473927605,467.84561789912,478.99376955124,489.45661357347,500.14800438647,512.06587983104,523.2511306012],"description":"Cycle of 31 fifths tempered by 1/10 Harrison's comma"},"temp31h11":{"frequencies":[261.6255653006,269.21878403965,274.22153683641,279.31725480271,287.42394184039,292.76499331753,298.20529308835,306.86017365004,312.56239683413,321.63396690808,327.61072570921,333.69854562169,343.38355445704,349.7644731902,359.91576765193,366.60389537541,373.41630725864,384.25405432087,391.39444778107,402.75397853578,410.23814647641,417.86138882164,429.98907567166,437.9793418028,446.11808436842,459.06587176894,467.59645436585,481.16761342105,490.10890120058,499.21634316923,513.70521350358,523.2511306012],"description":"Cycle of 31 fifths tempered by 1/11 Harrison's comma"},"temp31h12":{"frequencies":[261.6255653006,270.35656674398,274.64794212014,279.0074329748,288.31850430385,292.89498819461,297.54411640065,307.47379627264,312.35433239663,322.77826253379,327.90172667751,333.10651564349,344.2229903876,349.68684701428,361.35664068489,367.0924599966,372.91932620731,385.3644371109,391.48133253101,404.54589939324,410.96726244836,417.49055189439,431.4231018689,438.27108715714,445.22777061734,460.08596806997,467.38892215786,482.98668436162,490.65313915878,498.44128370652,515.07533168556,523.2511306012],"description":"Cycle of 31 fifths tempered by 1/12 Harrison's comma"},"temp31h8":{"frequencies":[261.6255653006,264.15772162327,272.31089540773,280.71571360382,283.4326348965,292.18072491748,301.19882119914,304.11398928909,313.50040506268,316.53463456122,326.30440921209,336.37572681506,339.63135730234,350.11400731728,353.50260556257,364.41338872146,375.66093089504,379.29678648678,391.00370158472,394.788050771,406.97310157871,419.5342415638,423.59472503043,436.668886633,450.14658206855,454.50334862767,468.53149836075,473.06620699858,487.66729542944,502.71904336675,507.58463809481,523.2511306012],"description":"Cycle of 31 fifths tempered by 1/8 Harrison's comma"},"temp31h9":{"frequencies":[261.6255653006,266.20804854623,273.08769296879,280.14512719472,285.05198845745,292.41861893027,299.97562432697,305.22982618403,313.11791376428,318.60230743232,326.83598255713,335.28243953396,341.15505431438,349.97156260351,356.10146388137,365.30423365264,374.74482972428,381.30864508241,391.16284711627,398.01423104415,408.30015740759,418.85190169901,426.18827121524,437.20230245522,448.50096908674,456.35665612784,468.15032961482,476.35018210031,488.66055322307,501.28905975035,510.06935121341,523.2511306012],"description":"Cycle of 31 fifths tempered by 1/9 Harrison's comma"},"temp31ms":{"frequencies":[261.6255653006,267.90457886781,273.56603860918,280.13162379381,286.05147140959,292.91670530125,299.10673210371,306.2852939563,312.75782903301,320.26401722477,327.03195662575,334.88072358477,341.95754947331,350.16453098318,357.56433846376,366.14588292411,373.88341429498,382.85661659068,390.94728541851,400.33002063726,408.78994578219,418.60090448096,427.44693588739,437.70566275183,446.9554220819,457.68235263341,467.35426952494,478.57076966998,488.68410850494,500.41252756995,510.98743222773,523.2511306012],"description":"Cycle of 31 5th root of 5/4 chromatic semitones"},"temp31mt":{"frequencies":[261.6255653006,267.90457886781,274.33428876064,280.9183116909,285.65057792122,292.50627485027,299.52642572255,306.71505845072,314.07622014281,319.36714514233,327.03195662575,334.88072358477,342.9178609508,351.14788961362,359.57543896435,365.63273925968,374.40803131735,383.39382442208,392.5952765698,402.01756125559,408.78994578219,418.60090448096,428.6473261885,438.93486201703,449.46929870544,457.04092569426,468.01003810189,479.24227945773,490.7440946167,502.52195335034,510.98743222773,523.2511306012],"description":"Cycle of 31 square root of 5/4 meantones"},"temp31to":{"frequencies":[261.6255653006,267.53589118464,273.57973594714,279.76011588387,286.08011543105,292.54288870475,299.15166280294,305.90973254237,312.82047235615,319.88733118052,327.11383586587,334.50359293692,342.06029039257,349.78769954651,357.68967690936,365.77016611333,374.03319988033,382.48290424395,391.12349182016,399.95927701915,408.9946695077,418.23417857039,427.68241536008,437.34409519915,447.22403993284,457.32718033558,467.65855857191,478.22333071276,489.02676930874,500.07426891005,511.37133726836,522.92361522538],"description":"Third beats with opposite equal rate as octave"},"temp31w10":{"frequencies":[261.6255653006,267.37376533775,273.24825962152,279.25182297475,287.24047076273,293.55146000581,300.00110689476,306.59245933664,313.32863150945,320.21280450383,327.24823031411,334.4382321302,341.78620813039,349.29562523194,356.97015906904,367.18199034811,375.24938058245,383.49402021056,391.91980359563,400.53071066429,409.33081115087,418.32425711308,427.51529892703,436.90827798988,446.50763144636,459.28102021135,469.37192694062,479.68454193593,490.22373920221,500.99449133668,512.00188868489,523.2511306012],"description":"Cycle of 31 thirds tempered by 1/10 Wuerschmidt comma"},"temp31w11":{"frequencies":[261.6255653006,267.42197848694,273.34681181717,279.40291364591,286.91265577589,293.26931399985,299.76680465545,306.40825140143,313.19684009872,320.13583435099,327.22856275086,334.47843511672,341.88893114233,349.46360748692,357.20610515709,366.80702823839,374.93377645155,383.2405741708,391.73141324262,400.41036830387,409.28161120445,418.34939984118,427.61808628905,437.09212645494,446.77606497733,458.78443573652,468.94897543376,479.33871705477,489.95864449434,500.81386326642,511.90958055231,523.2511306012],"description":"Cycle of 31 thirds tempered by 1/11 Wuerschmidt comma"},"temp31w12":{"frequencies":[261.6255653006,267.46216197987,273.42896553533,279.52888390694,286.63976159726,293.03439921138,299.57169286871,306.25482853931,313.08705807777,320.0717057658,327.2121755928,334.51194000906,341.9745565771,349.60365642833,357.40295156876,366.49485373999,374.67097398132,383.02949720151,391.57448819698,400.31011139524,409.24061734241,418.37035125513,427.70376253715,437.24539007841,446.99988402026,458.37102198078,468.59680699416,479.0507177135,489.73784363297,500.66339010461,511.83267129957,523.2511306012],"description":"Cycle of 31 thirds tempered by 1/12 Wuerschmidt comma"},"temp31w13":{"frequencies":[261.6255653006,267.49616787535,273.49850059869,279.63551774138,286.40905375482,292.83577174957,299.40669857094,306.12507001426,312.99419468163,320.01745343487,327.19830857776,334.54029455907,342.04702698539,349.72220057363,357.56974544479,366.23091133098,374.44874787361,382.85098402684,391.44175752404,400.22529663315,409.2059314354,418.38808223908,427.77627085136,437.37511801764,447.18935574711,458.02150335998,468.29902426597,478.80716193382,489.55109116118,500.53609997149,511.7676037195,523.2511306012],"description":"Cycle of 31 thirds tempered by 1/13 Wuerschmidt comma"},"temp31w14":{"frequencies":[261.6255653006,267.52531966849,273.55811412425,279.72695193191,286.21145362846,292.66562728487,299.26534666214,306.01389218024,312.91461811683,319.97095981222,327.18642276261,334.56459899164,342.10915585471,349.82384327668,357.71250180664,366.00482869479,374.25837321367,382.69803863807,391.32802257119,400.15261355898,409.17620468607,418.4030501472,427.83842920638,437.48634583318,447.35182400506,457.72212848121,468.04393370572,478.5984967348,489.39107187298,500.42702361787,511.71183724724,523.2511306012],"description":"Cycle of 31 thirds tempered by 1/14 Wuerschmidt comma"},"temp31w15":{"frequencies":[261.6255653006,267.55058630145,273.60979095449,279.80621811014,286.0403087015,292.51824916652,299.142895223,305.91756930507,312.84566908988,319.93066920159,327.176122954,334.58566413263,342.16300881716,349.91195724514,357.83639571789,365.80900091179,374.09345893182,382.56553686518,391.22947931103,400.08963362509,409.15044340767,418.41645289306,427.89230922859,437.58276480531,447.49267964143,457.46282942114,467.82296651709,478.41773025336,489.25243249537,500.33250769337,511.66351279634,523.2511306012],"description":"Cycle of 31 thirds tempered by 1/15 Wuerschmidt comma, almost 31-tET"},"temp31w8":{"frequencies":[261.6255653006,267.24122592191,272.97742543896,278.83674800471,288.14389744169,294.32876096318,300.64638059818,307.09960331181,313.69134300364,320.42456924675,327.30232268102,334.32770172848,341.50387698892,348.83408706747,356.32163474066,368.21511264804,376.11866406852,384.19186344763,392.4383479509,400.86184099795,409.46613795376,418.25512179799,427.23275920923,436.40309460541,445.77026919414,460.64940473745,470.53701427025,480.63685362987,490.95348377613,501.49155234204,512.25581818623,523.2511306012],"description":"Cycle of 31 thirds tempered by 1/8 Wuerschmidt comma"},"temp31w9":{"frequencies":[261.6255653006,267.31485098896,273.12785536516,279.06726965397,287.64164332106,293.89667226994,300.28772424256,306.81775371411,313.48978461115,320.30690488373,327.27226963218,334.38910256736,341.66069947616,349.09042189481,356.68171037974,367.64079770339,375.63548096925,383.80401588848,392.15018302326,400.67784514756,409.39095139962,418.29352970104,427.38970265849,436.68368016368,446.1797636563,459.88868900496,469.88938665048,480.10755840871,490.54793493862,501.21534712998,512.11473036853,523.2511306012],"description":"Cycle of 31 thirds tempered by 1/9 Wuerschmidt comma"},"temp32ebf":{"frequencies":[261.6255653006,266.99024669658,272.64192755012,278.59596223891,284.86852586219,291.47665855944,298.4383110444,304.47357861204,310.83171904039,317.53000821614,324.58664278196,332.02079024875,339.85265231199,346.64232633314,353.79523650997,361.33080945807,369.26952339658,377.6329406438,386.44378308989,395.72598875513,403.77301123196,412.25053247262,421.18158418009,430.59042797451,440.50262726312,450.945108697,459.9980085603,469.53522100534,479.58265227668,490.16760508681,501.31882698223,513.0666164148,523.2511306012],"description":"Cycle of 32 equal beating fifths"},"temp33a12":{"frequencies":[261.6255653006,266.94139439278,272.36523138282,277.89927397158,284.73748648557,290.5229142688,296.42589304627,302.44880952638,308.5941041528,316.1876182869,322.61206437627,329.16704532903,335.85521147284,342.67927280589,351.11151394887,358.24555988319,365.52455654698,372.95145333883,382.12859604556,389.89286138208,397.81488464837,405.89786889835,414.14508930077,424.3358756666,432.95772800787,441.75476312782,450.73053786756,459.88868900496,471.20507923536,480.77924170569,490.54793493862,500.51511311891,512.83118959171,523.2511306012],"description":"Cycle of 33 fifths tempered by 1/12 \"11 fifths\" comma"},"temp34eb2a":{"frequencies":[261.6255653006,267.30377714022,273.10522651459,279.03258811962,285.08859470169,291.27603831759,293.96161656556,300.34163653669,306.86012579271,313.52008961307,320.32459850253,327.27678960683,334.37986815896,341.63710895701,349.05185787385,356.62753339984,364.36762821878,372.27571081823,375.70810971034,383.86232137672,392.19350864246,400.70551251195,409.40225735312,418.28775270674,427.36609513501,436.64147011015,446.11815394416,455.80051576031,465.69301950749,469.98673021106,480.18712562304,490.60890615053,501.2568766435,512.13594623433,523.2511306012],"description":"Cycle of 34 thirds, 5/4 beats twice 3/2"},"temp34ebsi":{"frequencies":[261.6255653006,266.99788221884,272.57696520339,278.14698300137,283.93137567849,289.70637009331,295.70363067102,301.69114426564,307.90910207865,314.36637542255,320.81315450625,327.50805511637,334.19207543599,341.13334896852,348.06334108321,355.26005273528,362.44506998142,369.90662102486,377.65534755435,385.39148338011,393.42536256589,401.44618836017,409.77571602141,418.09170597447,426.72775997548,435.3497813463,444.30364141769,453.60211446558,462.88547695756,472.52613162558,482.15112257833,492.14655599832,502.125745683,512.48900933996,523.2511306012],"description":"Cycle of 34 equal beating major sixths"},"temp34ebt":{"frequencies":[261.6255653006,266.93199967636,272.36578831151,277.92998813547,283.62773001764,289.46221547291,295.43672985114,301.55463262869,307.81936583026,314.23445063866,320.80349820247,327.5302045997,334.16324661664,340.95548417522,347.91073392156,355.03290870525,362.32601803901,369.79415983503,377.44153922514,385.2724539348,393.29131162714,401.50262139782,409.91100286066,418.20230551726,426.69260242977,435.3866631899,444.28938530291,453.40576935587,462.74094691381,472.3001707563,482.08881469934,492.11238732973,502.37652397446,512.8870010249,523.2511306012],"description":"Cycle of 34 equal beating thirds"},"temp34w10":{"frequencies":[261.6255653006,267.37376533775,273.24825962152,279.25182297475,281.06516151868,287.24047076273,293.55146000581,300.00110689476,306.59245933664,313.32863150945,320.21280450383,327.24823031411,334.4382321302,341.78620813039,349.29562523194,351.5637974276,359.28803828513,367.18199034811,375.24938058245,383.49402021056,391.91980359563,400.53071066429,409.33081115087,418.32425711308,427.51529892703,436.90827798988,446.50763144636,449.40705529895,459.28102021135,469.37192694062,479.68454193593,490.22373920221,500.99449133668,512.00188868489,523.2511306012],"description":"Cycle of 34 thirds tempered by 1/10 Wuerschmidt comma"},"temp34w5":{"frequencies":[261.6255653006,266.84400329087,272.16653090376,277.59522118835,285.18293865736,290.87125860088,296.67303727804,302.5905394405,308.62607485572,314.78199505921,321.06070411799,327.46464776022,333.99632772474,340.65828815182,347.45313114562,356.95032497057,364.07013256472,371.33195122039,378.73861781039,386.29301712643,393.99809806388,401.85686830172,409.8723892274,418.04779164423,426.38625992488,434.89105154177,443.56547936435,455.68978545099,464.77906877635,474.04965097839,483.50514461458,493.14924173292,502.98569917153,513.01835960126,523.2511306012],"description":"Cycle of 34 thirds tempered by 1/5 Wuerschmidt comma"},"temp34w6":{"frequencies":[261.6255653006,267.02047390967,272.52663052146,278.06968704778,283.80368699438,289.65592453275,295.6288411546,301.72492193478,307.94670831505,314.29679425134,320.77782174252,327.39249271371,334.14356492035,341.03384719449,348.06621207862,355.14570764395,362.46906930947,369.94344613252,377.57194788125,385.35775486011,393.30411308867,401.41432870635,409.69178284295,418.13992649314,426.76227456772,435.56242170336,444.42154779224,453.58584388327,462.93911228358,472.48525217168,482.22824196207,492.17213857029,502.32108537715,512.67931193931,523.2511306012],"description":"Cycle of 34 thirds tempered by 1/6 Wuerschmidt comma"},"temp34w7":{"frequencies":[261.6255653006,267.14659557842,272.78413659373,276.97759061533,282.82259314675,288.79093992594,294.88523549471,301.10813946365,307.46236235072,313.95067836072,320.57591524951,327.34096447962,334.24877325582,341.30235609413,348.50479124753,353.86228320674,361.3297679824,368.9548354601,376.74081403286,384.69109896591,392.80915578714,401.0985286019,409.56282802254,418.20574780595,427.03105980737,436.04260883433,442.74580331919,452.08897683944,461.62931955889,471.37098776125,481.31823237599,491.47539447856,501.84689823661,512.43727265667,523.2511306012],"description":"Cycle of 34 thirds tempered by 1/7 Wuerschmidt comma"},"temp34w8":{"frequencies":[261.6255653006,267.24122592191,272.97742543896,276.16133434798,282.08899791039,288.14389744169,294.32876096318,300.64638059818,307.09960331181,313.69134300364,320.42456924675,327.30232268102,334.32770172848,341.50387698892,348.83408706747,352.90276052629,360.47764004221,368.21511264804,376.11866406852,384.19186344763,392.4383479509,400.86184099795,409.46613795376,418.25512179799,427.23275920923,436.40309460541,441.49314144476,450.96957067185,460.64940473745,470.53701427025,480.63685362987,490.95348377613,501.49155234204,512.25581818623,523.2511306012],"description":"Cycle of 34 thirds tempered by 1/8 Wuerschmidt comma"},"temp34w9":{"frequencies":[261.6255653006,267.31485098896,273.12785536516,279.06726965397,281.5197407082,287.64164332106,293.89667226994,300.28772424256,306.81775371411,313.48978461115,320.30690488373,327.27226963218,334.38910256736,341.66069947616,349.09042189481,352.15826244648,359.81626391233,367.64079770339,375.63548096925,383.80401588848,392.15018302326,400.67784514756,409.39095139962,418.29352970104,427.38970265849,436.68368016368,440.52130132575,450.10083737825,459.88868900496,469.88938665048,480.10755840871,490.54793493862,501.21534712998,512.11473036853,523.2511306012],"description":"Cycle of 34 thirds tempered by 1/9 Wuerschmidt comma"},"temp35ebsi":{"frequencies":[261.6255653006,266.57889315685,271.71450319234,277.03910343536,282.55964921963,288.28335166643,294.21768457231,300.3704033182,306.74954035112,312.48255822683,318.42655208483,324.58928450704,330.97880464114,337.6034601246,344.47190142434,351.59310182482,358.97636423712,366.63132974323,373.51095055492,380.64374131787,388.03901984907,395.70644562254,403.65603146762,411.89816253905,420.4436041444,429.30351656419,438.48947534443,446.74502047858,455.30437022365,464.17870575399,473.37961532931,482.91911915131,492.80967579032,503.06420520117,513.69610107468,523.2511306012],"description":"Cycle of 35 equal beating major sixths"},"temp37ebs":{"frequencies":[261.6255653006,266.54882370674,271.76117582243,276.81154351547,282.15846820925,287.3392230449,292.82419544994,298.13870690002,303.76528724985,309.7222634282,315.49411047005,321.60488016898,327.52574544851,333.79428377068,339.86801168664,346.29839044807,353.1063601343,359.70275861181,366.68649693083,373.45319917734,380.61724149647,387.55864668979,394.907650003,402.68818871569,410.22692643911,418.2083422233,425.94171605945,434.12919568644,442.06222705415,450.46108885682,459.35313199837,467.96883572953,477.09045247204,485.92859505436,495.28571063961,504.35203618851,513.95073426779,523.2511306012],"description":"Cycle of 37 equal beating sevenths"},"temp37ebt":{"frequencies":[261.6255653006,266.44794669373,271.38606435347,276.44269655507,281.62068893017,286.92295259461,292.35247205526,297.91229840101,303.60556084342,309.43546158348,315.40528084,321.51837488336,327.7781831369,333.8061589736,339.9788066307,346.29959662983,352.77208770341,359.39991652139,366.18681567584,373.13659908053,380.25317623321,387.54055229398,395.00282568127,402.64419215928,410.46895395112,418.00392297279,425.71973353547,433.62072344005,441.71133574434,449.99612361773,458.47974493329,467.16697490003,476.06269518051,485.17191513214,494.49975815874,504.05146656861,513.83241864047,523.2511306012],"description":"Cycle of 37 equal beating thirds"},"temp3ebt":{"frequencies":[261.6255653006,330.24866439584,416.02753826489,523.2511306012],"description":"Cycle of 3 equal beating thirds"},"temp4ebmt":{"frequencies":[261.6255653006,310.36356181711,368.84915763691,439.03187262068,523.2511306012],"description":"Cycle of 4 equal beating minor thirds"},"temp4ebsi":{"frequencies":[261.6255653006,310.92686529443,370.08842528703,441.08229727815,523.2511306012],"description":"Cycle of 4 equal beating major sixths"},"temp53ebs":{"frequencies":[261.6255653006,264.97369574946,268.51842903659,272.2713107977,275.7058824095,279.342132921,283.19190440533,286.71515038985,290.44528277978,294.39444663109,298.00865518834,301.83509073593,305.88621462445,310.17522146598,314.10044576101,318.25616227247,322.65590013911,326.68246801001,330.94547393755,335.45880590636,339.58933056423,343.96239778214,348.59225483118,353.4939765515,357.97994689961,362.72933676467,367.75761084241,372.35940104854,377.23140801172,382.38950169412,387.11009989437,392.10789272021,397.3991578827,403.00112480292,408.12795020911,413.55582307376,419.3024201087,424.56160969567,430.12961973912,436.02458225248,441.41955172249,447.13131541518,453.17847579573,459.58072182695,465.43995070361,471.64323472325,478.21077610462,484.22127701861,490.5847168482,497.32181757346,503.48749858841,510.01522804676,516.92626488088,523.2511306012],"description":"Cycle of 53 equal beating harmonic sevenths"},"temp53ebsi":{"frequencies":[261.6255653006,265.08815342092,268.54511416675,272.14096825888,275.73097879106,279.31515577755,283.04333763043,286.76545980208,290.48153462492,294.34691329876,298.20601137227,302.05883614112,306.06646174912,310.06757319581,314.22944103195,318.38454699407,322.53289853772,326.84792360782,331.1559371129,335.45694960827,339.93076775401,344.39731584765,348.85660497561,353.49505873963,358.12597594237,362.74936749482,367.55851619873,372.35985057275,377.35409330215,382.34021841275,387.3182413058,392.49627136254,397.66588656991,402.8271015422,408.19568270781,413.55554119639,418.90668980097,424.47283359145,430.02993471298,435.57800299537,441.34898312942,447.11058430799,453.10367443873,459.08702461554,465.06065502782,471.27428848056,477.47782740925,483.67128540638,490.11358366391,496.54541154487,502.96678854317,509.64616466331,516.31468511822,523.2511306012],"description":"Cycle of 53 equal beating major sixths"},"temp53ebt":{"frequencies":[261.6255653006,265.06408390481,268.61942739596,272.14046995187,275.78114176924,279.3866896354,283.11473715719,286.8068186786,290.62433945466,294.40503066492,298.31417332138,302.18560037327,306.18856199636,310.15290198883,314.25193588094,318.31142144389,322.50883104059,326.66574402863,330.9638909587,335.40807143415,339.80937339101,344.36021509659,348.86714800611,353.52720940583,358.14231011275,362.91421253104,367.64007568808,372.5265022753,377.36578530136,382.3694885676,387.32491504393,392.44870495902,397.52306357866,402.76982394565,407.96596497751,413.33865052838,418.89387526617,424.39550434456,430.08405345947,435.71772111176,441.54279782575,447.31167294612,453.27655186057,459.18388087721,465.29191391782,471.34101945319,477.59564801313,483.78993007475,490.19466758193,496.53761595054,503.09606844751,509.59124455492,516.30709807412,523.2511306012],"description":"Cycle of 53 equal beating thirds"},"temp57ebs":{"frequencies":[261.6255653006,264.8277951114,268.04955507264,271.33445958124,274.63939933433,278.00911284632,281.39937814535,284.85609135359,288.33388628378,291.8798428433,295.4474281527,299.08493440323,302.74462553584,306.42663750246,310.18081323211,313.95788745209,317.80898926922,321.68357852782,325.63410692083,329.60872876069,333.66125215256,337.73849074816,341.89564167341,346.07814569972,350.28615866377,354.57664765081,358.89330206442,363.2945606359,367.72266219717,372.23755268366,376.77997919433,381.41143316036,386.07113633698,390.82216502962,395.60217018381,400.41132814233,405.3147417445,410.24806349136,415.27807310888,420.33876095689,425.4986359826,430.68997922537,435.98307052812,441.30844296951,446.73819252663,452.20105472878,457.69723413281,463.30113726238,468.93921588924,474.68780077646,480.47144432851,486.36844238798,492.30140788993,498.35065469266,504.4367956254,510.6422225112,516.88549425379,523.2511306012],"description":"Cycle of 57 equal beating harmonic sevenths"},"temp59ebt":{"frequencies":[261.6255653006,264.71774803536,267.84005552541,271.00645194849,274.20369404321,277.44608402629,280.72006081878,284.04026812198,287.39281927261,290.79271098314,294.22572486522,297.70721418515,301.22261902261,304.78766466692,308.38743972219,312.03804524126,315.72421513091,319.46243532331,323.23707283878,327.06501147453,330.93024062011,334.83312418563,338.79111909993,342.78767359614,346.84065928187,350.93313112856,355.08338946648,359.27407840069,363.52394351295,367.81521017702,372.16707169716,376.56132871014,381.01763522853,385.51735474883,390.08061088885,394.68832388107,399.36109834092,404.07939600279,408.86431870994,413.69585627072,418.57446131049,423.52195428502,428.51764625978,433.58387848862,438.69946807471,443.88729218006,449.12565432864,454.4379830027,459.80206875391,465.24189440938,470.73471441434,476.30509804765,481.92974808423,487.63381799831,493.39345924022,499.23442935246,505.13230099895,511.11345315981,517.15287439575,523.2511306012],"description":"Cycle of 59 equal beating thirds"},"temp5ebf":{"frequencies":[261.6255653006,300.99242152138,345.28013476976,397.76927639746,456.81956072863,523.2511306012],"description":"Cycle of 5 equal beating fifths"},"temp5ebs":{"frequencies":[261.6255653006,300.72264357012,345.40501873528,396.4705903526,454.83124362955,523.2511306012],"description":"Cycle of 5 equal beating harmonic sevenths"},"temp6":{"frequencies":[261.6255653006,292.50629174609,327.17562781541,373.91502405318,418.23333786749,467.5991148023,523.2511306012],"description":"Tempered wholetone scale with approximations to 5/4 (4), 7/5 (4) and 7/4 (1)"},"temp65ebf":{"frequencies":[261.6255653006,264.41601755103,267.24454169377,270.11165630441,273.01788702098,275.96376822181,278.903505094,281.88335012505,284.90384796088,287.96555727487,291.06903608099,294.16604397209,297.30530343106,300.48739162418,303.71289539257,306.98240612292,310.29652144782,313.60372560746,316.95605020285,320.35411162765,323.7985328567,327.28994911888,330.77408078649,334.30574717623,337.88559766085,341.51429052286,345.19248907458,348.92086961342,352.64147345074,356.41283883338,360.23565716142,364.11063345825,368.0384739541,371.95812372083,375.93124824951,379.95858022583,384.04085801267,388.17883226226,392.30817269042,396.49385281186,400.73664000181,405.03730976228,409.39665754461,413.81548025993,418.22508312451,422.69484912531,427.22559773342,431.81816208034,436.47338166162,441.11888946365,445.82778005125,450.60091414809,455.43916939942,460.34343547357,465.31460883154,470.27541574397,475.30390033467,480.4009926512,485.56762723834,490.80474851567,496.03094699932,501.32844669322,506.69822455894,512.14126217109,517.65855736571,523.2511306012],"description":"Cycle of 65 equal beating fifths"},"temp65ebt":{"frequencies":[261.6255653006,264.43406811535,267.2034679247,270.07937559507,272.91523803531,275.86016780291,278.76409255008,281.77970028627,284.75331888701,287.84130158502,290.886287826,294.04838131756,297.16644728835,300.4044304772,303.59732911309,306.91302510559,310.18255295306,313.57782661988,316.92582314139,320.40258196387,323.83093239735,327.39113302053,330.90176198948,334.36350914498,337.95839429282,341.50322405771,345.18438591943,348.81429298672,352.58380229516,356.30082494405,360.1608038988,363.96703524466,367.91965255368,371.81723365001,375.86471396542,379.85583700975,384.00045811272,388.08736764479,392.33145942297,396.5164558179,400.86240365726,405.1478399234,409.59809307723,413.98637838791,418.31356254814,422.80716945583,427.23820566351,431.83965831621,436.37704077554,441.08892851835,445.73520856761,450.56017999004,455.31796985254,460.25874195194,465.13071889642,470.19006822446,475.1789734801,480.35974823468,485.46838574269,490.77349931217,496.0047455553,501.43718079349,506.7939752079,512.35679191473,517.84214996629,523.2511306012],"description":"Cycle of 65 equal beating thirds"},"temp6eb2":{"frequencies":[261.6255653006,293.46010680596,329.2739659995,369.56455759223,414.89147313404,465.88425311859,523.2511306012],"description":"Cycle of 6 equal beating 9/8 seconds"},"temp6s":{"frequencies":[261.6255653006,271.93638072959,309.96730300827,353.31693843766,402.72911708552,459.05170412301,523.2511306012],"description":"Cycle of 6 tempered harmonic sevenths, 6/5 and 4/3 minimax, Op de Coul, 2002"},"temp6teb":{"frequencies":[261.6255653006,314.31996068356,377.55323514312,453.43316449459,544.48907971635,653.75617798246,784.8766959018],"description":"Cycle of 6 equal beating 6/5's in a twelfth"},"temp7-5ebf":{"frequencies":[261.6255653006,272.53310095338,288.29512120063,313.54121701986,318.29837158817,352.05202827415,359.67534615791,387.61143614087,414.35283422339,427.61576999092,475.86500581459,472.62064557223,523.2511306012],"description":"7 equal beating fifths on white, 5 equal beating fifths on black"},"temp7ebf":{"frequencies":[261.6255653006,288.29512120063,318.29837158817,352.05202827415,387.61143614087,427.61576999092,472.62064557223,523.2511306012],"description":"Cycle of 7 equal beating fifths"},"temp7ebnt":{"frequencies":[261.6255653006,288.84289825546,318.65722544634,351.9228541964,388.36258888271,429.02057812008,473.55803233064,523.2511306012],"description":"Cycle of 7 equal beating 11/9 neutral thirds"},"temp8eb3q":{"frequencies":[261.6255653006,285.27029088455,311.06453578321,339.20371183191,369.9009952302,403.38894083349,439.92124473489,479.77466958441,523.2511306012],"description":"Cycle of 8 equal \"beating\" 12/11's"},"temp9ebmt":{"frequencies":[261.6255653006,282.57058469242,305.18178513943,329.6176429161,355.99737593287,384.50587463168,415.28223014648,448.54214811156,484.4478959333,523.2511306012],"description":"Cycle of 9 equal beating 7/6 septimal minor thirds"},"tenney_11":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,392.4383479509,408.78994578219,425.14154361347,457.84473927605,523.2511306012],"description":"Scale of James Tenney's \"Spectrum II\" for wind quintet"},"tertiadia":{"frequencies":[261.6255653006,279.06726965397,297.67175429757,306.59245933664,327.03195662575,348.83408706747,372.08969287196,392.4383479509,418.60090448096,431.14564594215,459.88868900496,490.54793493862,523.2511306012],"description":"Tertiadia 2048/2025 and 262144/253125 scale"},"tertiadie":{"frequencies":[261.6255653006,279.06726965397,297.67175429757,306.59245933664,327.03195662575,348.83408706747,372.08969287196,383.2405741708,408.78994578219,436.04260883433,476.27480687611,490.54793493862,523.2511306012],"description":"First Tertiadie 262144/253125 and 128/125 scale"},"tet3a":{"frequencies":[261.6255653006,280.31310567921,313.95067836072,336.37572681506,366.27579142084,392.4383479509,418.60090448096,448.50096908674,523.2511306012],"description":"Eight notes, two major one minor tetrad"},"tetracot":{"frequencies":[261.6255653006,266.81074454173,272.09868928948,277.49143626213,289.66902367154,295.4099985897,301.26475437609,307.23554606336,320.71844041089,327.07478634962,333.55710924695,340.16790585091,355.09602205939,362.13370020095,369.31085868177,376.6302618745,393.15851224787,400.95055410677,408.89702710335,417.00099192139,435.30089370336,443.92815899023,452.72640877864,461.69903182491,481.96048707062,491.51250279099,501.25383072009,523.2511306012],"description":"tetracot temperament, g=176.28227, 5-limit"},"tetragam-di":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,290.69507255622,327.03195662575,348.83408706747,372.08969287196,392.4383479509,418.60090448096,436.04260883433,436.04260883433,457.84473927605,523.2511306012],"description":"Tetragam Dia2"},"tetragam-enh":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,279.06726965397,327.03195662575,348.83408706747,366.27579142084,392.4383479509,406.97310157871,418.60090448096,418.60090448096,457.84473927605,523.2511306012],"description":"Tetragam Enharm."},"tetragam-hex":{"frequencies":[261.6255653006,271.31540105247,294.32876096318,305.22982618403,327.03195662575,343.38355445704,381.53728273004,392.4383479509,406.97310157871,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Tetragam/Hexgam"},"tetragam-py":{"frequencies":[261.6255653006,275.62199471997,294.32876096318,294.32876096318,331.11985608357,348.83408706747,372.50983809402,392.4383479509,413.43299207996,441.49314144476,441.49314144476,465.11211608996,523.2511306012],"description":"Tetragam Pyth."},"tetragam-slpe":{"frequencies":[261.6255653006,261.6255653006,300.52885648597,300.52885648597,279.06726965397,345.21700307457,348.83408706747,396.55020354877,455.51656649021,392.4383479509,455.51656649021,418.60090448096,523.2511306012],"description":"Tetragam Slendro as 5-tET, Pelog-like pitches on C# E F# A B"},"tetragam-slpe2":{"frequencies":[261.6255653006,261.6255653006,300.52885648597,300.52885648597,286.29520819723,345.21700307457,313.29104303136,396.55020354877,396.55020354877,387.04559340587,455.51656649021,423.54155496477,523.2511306012],"description":"Tetragam Slendro as 5-tET, Pelog-like pitches on C# E F# A B"},"tetragam-sp":{"frequencies":[261.6255653006,271.31540105247,271.31540105247,271.31540105247,336.37572681506,348.83408706747,366.27579142084,392.4383479509,406.97310157871,406.97310157871,406.97310157871,457.84473927605,523.2511306012],"description":"Tetragam Septimal"},"tetragam-un":{"frequencies":[261.6255653006,269.80136421624,285.40970760065,285.40970760065,319.76457981184,348.83408706747,359.73515228832,392.4383479509,404.70204632437,428.11456140098,428.11456140098,479.64686971777,523.2511306012],"description":"Tetragam Undecimal"},"tetragam13":{"frequencies":[261.6255653006,275.95382006469,307.00724256551,307.00724256551,341.55514486295,341.55514486295,400.80167111126,400.80167111126,445.90437572008,445.90437572008,445.90437572008,496.08254310677,523.2511306012],"description":"Tetragam (13-tET)"},"tetragam5":{"frequencies":[261.6255653006,300.52885648597,300.52885648597,300.52885648597,300.52885648597,345.21700307457,345.21700307457,396.55020354877,455.51656649021,455.51656649021,455.51656649021,455.51656649021,523.2511306012],"description":"Tetragam (5-tET)"},"tetragam7":{"frequencies":[261.6255653006,288.85811466493,288.85811466493,288.85811466493,318.92511007349,352.12195684808,352.12195684808,388.77403176757,429.24143792307,429.24143792307,429.24143792307,473.92081401802,523.2511306012],"description":"Tetragam (7-tET)"},"tetragam8":{"frequencies":[261.6255653006,285.30470202322,311.12698372208,311.12698372208,339.28638158975,339.28638158975,403.48177901006,403.48177901006,440,440,440,440,523.2511306012],"description":"Tetragam (8-tET)"},"tetragam9a":{"frequencies":[261.6255653006,282.57118533961,305.19387818096,305.19387818096,329.62755691287,356.01738450312,415.30469757995,415.30469757995,448.55379686399,448.55379686399,448.55379686399,484.46508327871,523.2511306012],"description":"Tetragam (9-tET) A"},"tetragam9b":{"frequencies":[261.6255653006,282.57118533961,282.57118533961,282.57118533961,305.19387818096,305.19387818096,384.52019141924,384.52019141924,415.30469757995,415.30469757995,415.30469757995,448.55379686399,523.2511306012],"description":"Tetragam (9-tET) B"},"tetraphonic_31":{"frequencies":[261.6255653006,266.96486255163,272.52663052146,278.32506946872,284.37561445717,290.69507255622,297.30177875068,304.21577360535,311.45900631024,319.05556743976,327.03195662575,333.99008336247,341.25073734861,348.83408706747,356.76213450082,365.05892832642,373.75080757229,382.86668092771,392.4383479509,400.61414686654,409.13785211902,418.03215325205,427.32175665765,437.0336147635,447.19718719986,457.84473927605,467.58611670746,477.75103228805,488.36772189445,499.46698830115,511.08249965699,523.2511306012],"description":"31-tone Tetraphonic Cycle, conjunctive form on 5/4, 6/5, 7/6 and 8/7"},"tetratriad":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,348.83408706747,367.91095120397,392.4383479509,436.04260883433,441.49314144476,490.54793493862,523.2511306012],"description":"4:5:6 Tetratriadic scale"},"tetratriad1":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,327.03195662575,348.83408706747,392.4383479509,436.04260883433,441.49314144476,490.54793493862,523.2511306012],"description":"3:5:9 Tetratriadic scale"},"tetratriad2":{"frequencies":[261.6255653006,296.75121990114,305.22982618403,356.10146388137,373.75080757229,415.4517078616,436.04260883433,448.50096908674,508.71637697339,523.2511306012],"description":"3:5:7 Tetratriadic scale"},"thailand":{"frequencies":[261.6255653006,281.86483947605,307.02089761314,350.84574289301,397.92692612688,408.40584780369,474.03826620294,539.82938999168],"description":"Observed ranat tuning from Thailand, Helmholtz/Ellis p. 518, nr.85"},"thailand2":{"frequencies":[261.6255653006,293.66476791741,318.39923223688,356.77227917518,391.76907592069,435.19747628762,477.88722128969,525.37110555681],"description":"Observed ranat t'hong tuning, Helmholtz/Ellis p. 518"},"thailand3":{"frequencies":[261.6255653006,293.32570896007,322.47117131255,354.92237405774,396.55020354877,437.46578647972,488.21056770985,538.58355905405],"description":"Observed tak'hay tuning. Helmholtz, p. 518"},"thailand4":{"frequencies":[261.6255653006,281.88044777549,304.38587215019,332.5176539627,392.71966479735,416.35036198375,461.923848369,523.2511306012,563.76089555097,608.77174430039,665.59794246809,786.00196746963,831.57545378481,924.97296635309,1046.5022612024,1127.52179110194],"description":"Khong mon (bronze percussion vessels) tuning, Gemeentemuseum Den Haag 1/1=465"},"thirds":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,313.95067836072,327.03195662575,348.83408706747,363.36884069528,392.4383479509,418.60090448096,436.04260883433,454.2110508691,502.32108537715,523.2511306012],"description":"Major and minor thirds parallellogram"},"thomas":{"frequencies":[261.6255653006,280.80530480292,294.66217084622,313.95044496966,332.05645032639,350.21604710412,374.62015588545,391.99543598175,420.73257541073,441.99197952365,468.79922683914,499.49209883845,523.2511306012],"description":"Tuning of the Thomas/Philpott organ, Gereformeerde Kerk, St. Jansklooster"},"tiby1":{"frequencies":[261.6255653006,295.66718139806,337.56154978455,348.04364484358,393.32961502355,444.50800708553,507.49227916989,523.2511306012],"description":"Tiby's 1st Byzantine Liturgical genus, 12 + 13 + 3 parts"},"tiby2":{"frequencies":[261.6255653006,295.66718139806,311.12698372208,348.04364484358,393.32961502355,444.50800708553,467.75037672729,523.2511306012],"description":"Tiby's second Byzantine Liturgical genus, 12 + 5 + 11 parts"},"tiby3":{"frequencies":[261.6255653006,295.66718139806,324.07484847125,348.04364484358,393.32961502355,444.50800708553,487.21628271135,523.2511306012],"description":"Tiby's third Byzantine Liturgical genus, 12 + 9 + 7 parts"},"tiby4":{"frequencies":[261.6255653006,286.76251801126,324.07484847125,348.04364484358,393.32961502355,431.12067692221,487.21628271135,523.2511306012],"description":"Tiby's fourth Byzantine Liturgical genus, 9 + 12 + 7 parts"},"todi_av":{"frequencies":[261.6255653006,276.38325105256,310.05056613125,371.27895029721,392.44854854484,413.39000965417,495.88429116026,523.2511306012],"description":"Average of 8 interpretations of raga Todi, in B. Bel, 1988."},"tonos15_pis":{"frequencies":[261.6255653006,287.78812183066,319.76457981184,359.73515228832,383.71749577421,442.75095666255,479.64686971777,523.2511306012,548.16785110602,575.57624366132,639.52915962369,719.47030457665,767.43499154843,885.50191332511,959.29373943553,1046.5022612024],"description":"Diatonic Perfect Immutable System in the new Tonos-15"},"tonos17_pis":{"frequencies":[261.6255653006,285.40970760065,313.95067836072,348.83408706747,369.35373924791,418.60090448096,483.00104363188,523.2511306012,546.00117975777,570.81941520131,627.90135672144,697.66817413493,738.70747849581,784.8766959018,897.00193817349,1046.5022612024],"description":"Diatonic Perfect Immutable System in the new Tonos-17"},"tonos19_pis":{"frequencies":[261.6255653006,281.75060878526,305.22982618403,332.97799220076,385.55346465352,406.97310157871,457.84473927605,523.2511306012,542.63080210495,563.50121757052,610.45965236807,665.95598440153,771.10692930703,813.94620315742,915.6894785521,1046.5022612024],"description":"Diatonic Perfect Immutable System in the new Tonos-19"},"tonos21_pis":{"frequencies":[261.6255653006,299.00064605783,322.00069575458,348.83408706747,398.6675280771,440.63253103259,465.11211608996,523.2511306012,558.13453930795,598.00129211566,644.00139150917,697.66817413493,797.33505615421,881.26506206518,930.22423217991,1046.5022612024],"description":"Diatonic Perfect Immutable System in the new Tonos-21"},"tonos23_pis":{"frequencies":[261.6255653006,294.32876096318,336.37572681506,362.25078272391,409.50088481833,448.50096908674,470.92601754108,523.2511306012,554.03060887186,588.65752192635,672.75145363011,724.50156544782,819.00176963666,897.00193817349,941.85203508216,1046.5022612024],"description":"Diatonic Perfect Immutable System in the new Tonos-23"},"tonos25_pis":{"frequencies":[261.6255653006,294.32876096318,336.37572681506,362.25078272391,376.74081403286,428.11456140098,470.92601754108,523.2511306012,554.03060887186,588.65752192635,672.75145363011,724.50156544782,753.48162806573,856.22912280196,941.85203508216,1046.5022612024],"description":"Diatonic Perfect Immutable System in the new Tonos-25"},"tonos27_pis":{"frequencies":[261.6255653006,290.69507255622,327.03195662575,373.75080757229,387.59343007496,436.04260883433,498.33441009638,523.2511306012,550.79066379074,581.39014511244,654.0639132515,747.50161514457,775.18686014993,872.08521766867,996.66882019276,1046.5022612024],"description":"Diatonic Perfect Immutable System in the new Tonos-27"},"tonos29_pis":{"frequencies":[261.6255653006,287.78812183066,319.76457981184,359.73515228832,396.94913355953,442.75095666255,479.64686971777,523.2511306012,548.16785110602,575.57624366132,639.52915962369,719.47030457665,793.89826711906,885.50191332511,959.29373943553,1046.5022612024],"description":"Diatonic Perfect Immutable System in the new Tonos-29"},"tonos31_pis":{"frequencies":[261.6255653006,273.51763645063,300.86940009569,334.29933343966,388.21858076863,429.81342870813,462.87600014722,501.44900015948,523.2511306012,547.03527290125,601.73880019138,668.59866687931,776.43716153726,859.62685741626,925.75200029443,1046.5022612024],"description":"Diatonic Perfect Immutable System in the new Tonos-31"},"tonos31_pis2":{"frequencies":[261.6255653006,285.40970760065,313.95067836072,348.83408706747,405.0976494977,448.50096908674,483.00104363188,523.2511306012,546.00117975777,570.81941520131,627.90135672144,697.66817413493,810.19529899541,897.00193817349,966.00208726375,1046.5022612024],"description":"Diatonic Perfect Immutable System in the new Tonos-31B"},"tonos33_pis":{"frequencies":[261.6255653006,285.40970760065,313.95067836072,348.83408706747,380.54627680087,418.60090448096,465.11211608996,523.2511306012,546.00117975777,570.81941520131,627.90135672144,697.66817413493,761.09255360175,837.20180896192,930.22423217991,1046.5022612024],"description":"Diatonic Perfect Immutable System in the new Tonos-33"},"top31":{"frequencies":[261.6255653006,267.49189720203,273.48976766293,279.62212612306,285.89198815637,292.30243695391,298.85662483994,305.55777482212,312.40918217641,319.41421606749,326.57632120555,333.89901954025,341.38591199258,349.04068022565,358.99452880887,367.04412845091,375.2742212459,383.6888543241,392.29216556304,401.08838562235,410.08184002413,419.27695128006,428.67824106611,438.29033244612,448.11795214515,458.16593287385,468.4392157049,478.94285250284,489.68200840824,500.66196437769,511.88811978069,523.36599505479],"description":"Top temperament, 11-limit, {225/224, 385/384, 1331/1323}, Gene Ward Smith"},"trab19":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,297.67175429757,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,367.91095120397,372.08969287196,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,459.88868900496,465.11211608996,490.54793493862,523.2511306012],"description":"Diamond {1,3,5,45,75,225}"},"trab19a":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,297.67175429757,306.59245933664,313.95067836072,327.03195662575,344.91651675372,348.83408706747,367.91095120397,372.08969287196,392.4383479509,396.89567239676,418.60090448096,436.04260883433,446.50763144636,459.88868900496,465.11211608996,490.54793493862,523.2511306012],"description":"Diamond {1,3,9,15,675}"},"tranh":{"frequencies":[261.6255653006,290.69507255622,348.83408706747,392.4383479509,436.04260883433,523.2511306012],"description":"Bac Dan Tranh scale, Vietnam"},"tranh2":{"frequencies":[261.6255653006,290.69507255622,307.79478270659,392.4383479509,436.04260883433,523.2511306012],"description":"Dan Ca Dan Tranh Scale"},"tranh3":{"frequencies":[261.6255653006,317.68818643644,348.83408706747,392.4383479509,473.41768959156,476.53227965466,523.2511306012],"description":"Sa Mac Dan Tranh scale"},"tri12-1":{"frequencies":[261.6255653006,264.29521392612,275.21650375777,319.76457981184,323.02748368748,332.97799220076,336.37572681506,406.97310157871,411.12588832951,428.11456140098,432.48307733364,502.48719684718,523.2511306012],"description":"12-tone Tritriadic of 7:9:11"},"tri12-2":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,336.37572681506,348.83408706747,356.10146388137,392.4383479509,406.97310157871,448.50096908674,457.84473927605,474.80195184183,504.56359022259,523.2511306012],"description":"12-tone Tritriadic of 6:7:9"},"tri19-1":{"frequencies":[261.6255653006,266.96486255163,269.10058145205,305.22982618403,311.45900631024,313.95067836072,320.35783506196,356.10146388137,363.36884069528,366.27579142084,373.75080757229,376.74081403286,384.42940207435,427.32175665765,436.04260883433,439.53094970501,448.50096908674,508.71637697339,512.78610798918,523.2511306012],"description":"3:5:7 Tritriadic 19-Tone Matrix"},"tri19-2":{"frequencies":[261.6255653006,282.55561052465,290.69507255622,294.32876096318,313.95067836072,322.99452506247,327.03195662575,348.83408706747,353.19451315581,363.36884069528,376.74081403286,387.59343007496,392.4383479509,418.60090448096,423.83341578697,436.04260883433,465.11211608996,470.92601754108,484.4917875937,523.2511306012],"description":"3:5:9 Tritriadic 19-Tone Matrix"},"tri19-3":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,313.95067836072,327.03195662575,334.88072358477,348.83408706747,363.36884069528,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,465.11211608996,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"4:5:6 Tritriadic 19-Tone Matrix"},"tri19-4":{"frequencies":[261.6255653006,264.89588486686,290.69507255622,294.32876096318,322.99452506247,327.03195662575,331.11985608357,334.88072358477,363.36884069528,367.91095120397,372.08969287196,376.74081403286,408.78994578219,413.43299207996,418.60090448096,423.83341578697,465.11211608996,470.92601754108,516.79124009995,523.2511306012],"description":"4:5:9 Tritriadic 19-Tone Matrix"},"tri19-5":{"frequencies":[261.6255653006,266.96486255163,284.8811711051,290.69507255622,302.73815413355,316.53463456122,322.99452506247,329.64821227876,336.37572681506,366.27579142084,373.75080757229,406.97310157871,415.27867508032,423.83341578697,432.48307733364,452.19233508746,470.92601754108,480.53675259294,512.78610798918,523.2511306012],"description":"5:7:9 Tritriadic 19-Tone Matrix"},"tri19-6":{"frequencies":[261.6255653006,267.07609791103,294.32876096318,299.00064605783,305.22982618403,336.37572681506,341.71502406609,343.38355445704,348.83408706747,356.10146388137,384.42940207435,392.4383479509,398.6675280771,400.61414686654,406.97310157871,448.50096908674,457.84473927605,465.11211608996,512.57253609913,523.2511306012],"description":"6:7:8 Tritriadic 19-Tone Matrix"},"tri19-7":{"frequencies":[261.6255653006,271.31540105247,288.32205155576,294.32876096318,299.00064605783,305.22982618403,316.53463456122,336.37572681506,348.83408706747,356.10146388137,384.42940207435,392.4383479509,406.97310157871,432.48307733364,448.50096908674,457.84473927605,465.11211608996,474.80195184183,504.56359022259,523.2511306012],"description":"6:7:9 Tritriadic 19-Tone Matrix"},"tri19-8":{"frequencies":[261.6255653006,264.29521392612,272.43653907335,275.21650375777,316.53463456122,319.76457981184,323.02748368748,332.97799220076,336.37572681506,350.27555023717,390.82337532559,406.97310157871,411.12588832951,423.79017189188,428.11456140098,432.48307733364,497.4115685962,502.48719684718,517.96576564563,523.2511306012],"description":"7:9:11 Tritriadic 19-Tone Matrix"},"tri19-9":{"frequencies":[261.6255653006,266.96486255163,286.15296204753,293.02063313667,299.00064605783,320.49131749323,327.03195662575,334.88072358477,341.71502406609,366.27579142084,373.75080757229,400.61414686654,408.78994578219,418.60090448096,427.14378008261,457.84473927605,467.18850946536,478.40103369253,512.78610798918,523.2511306012],"description":"4:5:7 Tritriadic 19-Tone Matrix"},"triang11":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,313.95067836072,327.03195662575,348.83408706747,359.73515228832,366.27579142084,373.75080757229,380.54627680087,392.4383479509,418.60090448096,436.04260883433,448.50096908674,465.11211608996,523.2511306012],"description":"11-limit triangular diamond lattice with 64/63 intervals removed"},"triaphonic_12":{"frequencies":[261.6255653006,275.39533189537,290.69507255622,307.79478270659,327.03195662575,348.83408706747,367.19377586049,387.59343007496,410.39304360878,436.04260883433,461.69217405988,490.54793493862,523.2511306012],"description":"12-tone Triaphonic Cycle, conjunctive form on 4/3, 5/4 and 6/5"},"triaphonic_17":{"frequencies":[261.6255653006,271.31540105247,281.75060878526,293.02063313667,305.22982618403,318.50068819203,332.97799220076,348.83408706747,361.75386806997,375.66747838035,390.69417751556,406.97310157871,422.62591317789,439.53094970501,457.84473927605,477.75103228805,499.46698830115,523.2511306012],"description":"17-tone Triaphonic Cycle, conjunctive form on 4/3, 7/6 and 9/7"},"trichord7":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,327.03195662575,343.38355445704,348.83408706747,392.4383479509,436.04260883433,441.49314144476,457.84473927605,490.54793493862,523.2511306012],"description":"Trichordal undecatonic, 7-limit"},"tricot":{"frequencies":[261.6255653006,264.94025538413,268.70564228797,272.11003565477,275.55755973666,279.4738436282,283.01466417842,286.6003471482,290.673570175,294.35628843049,298.08566525814,302.32211998602,306.15242072385,310.03124984507,314.43747949204,318.42127516569,322.45554578164,327.03835025925,331.18179578139,335.37773516927,339.62683737367,344.45368576554,348.81777463097,353.23715677741,358.25743790514,362.79641682209,367.39290067029,372.61436622199,377.33523951767,382.11592657559,387.54663888312,392.45669803325,397.4289679423,403.0773124301,408.18413893183,413.35566924724,419.23036738005,424.541846554,429.92062250389,436.03074525334,441.55507841911,447.14940523431,453.50438708518,459.25010687752,465.06861996272,470.9608512551,477.65424916833,483.70593529179,489.8342966599,496.79592520903,503.09012862502,509.46407999504,516.70469117363,523.2511306012],"description":"Tricot temperament, g=565.988015, 5-limit"},"tritriad":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,348.83408706747,392.4383479509,418.60090448096,470.92601754108,523.2511306012],"description":"Tritriadic scale of the 10:12:15 triad, natural minor mode"},"tritriad10":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,348.83408706747,366.27579142084,392.4383479509,488.36772189445,523.2511306012],"description":"Tritriadic scale of the 10:14:15 triad"},"tritriad11":{"frequencies":[261.6255653006,309.19384990071,356.76213450082,383.71749577421,421.62797713733,453.48431318771,486.49381977384,523.2511306012],"description":"Tritriadic scale of the 11:13:15 triad"},"tritriad13":{"frequencies":[261.6255653006,294.32876096318,340.11323489078,348.83408706747,392.4383479509,453.48431318771,510.16985233617,523.2511306012],"description":"Tritriadic scale of the 10:13:15 triad"},"tritriad14":{"frequencies":[261.6255653006,294.32876096318,336.37572681506,348.83408706747,392.4383479509,448.50096908674,504.56359022259,523.2511306012],"description":"Tritriadic scale of the 14:18:21 triad"},"tritriad18":{"frequencies":[261.6255653006,294.32876096318,319.76457981184,348.83408706747,392.4383479509,426.35277308246,479.64686971777,523.2511306012],"description":"Tritriadic scale of the 18:22:27 triad"},"tritriad22":{"frequencies":[261.6255653006,294.32876096318,321.08592105074,348.83408706747,392.4383479509,428.11456140098,481.6288815761,523.2511306012],"description":"Tritriadic scale of the 22:27:33 triad"},"tritriad26":{"frequencies":[261.6255653006,294.32876096318,301.87565226992,348.83408706747,392.4383479509,402.50086969323,452.81347840488,523.2511306012],"description":"Tritriadic scale of the 26:30:39 triad"},"tritriad3":{"frequencies":[261.6255653006,305.22982618403,356.10146388137,373.75080757229,436.04260883433,448.50096908674,508.71637697339,523.2511306012],"description":"Tritriadic scale of the 3:5:7 triad. Possibly Mathews's 3.5.7a"},"tritriad32":{"frequencies":[261.6255653006,294.32876096318,322.00069575458,348.83408706747,392.4383479509,429.33426100611,483.00104363188,523.2511306012],"description":"Tritriadic scale of the 26:32:39 triad"},"tritriad3c":{"frequencies":[261.6255653006,305.22982618403,366.27579142084,373.75080757229,427.32175665765,436.04260883433,512.78610798918,523.2511306012],"description":"From 1/1 7/6 7/5, a variant of the 3.5.7 triad"},"tritriad3d":{"frequencies":[261.6255653006,305.22982618403,313.95067836072,363.36884069528,366.27579142084,436.04260883433,508.71637697339,523.2511306012],"description":"From 1/1 7/6 5/3, a variant of the 3.5.7 triad"},"tritriad5":{"frequencies":[261.6255653006,290.69507255622,329.64821227876,366.27579142084,406.97310157871,423.83341578697,470.92601754108,523.2511306012],"description":"Tritriadic scale of the 5:7:9 triad. Possibly Mathews's 5.7.9a."},"tritriad68":{"frequencies":[261.6255653006,305.22982618403,348.83408706747,392.4383479509,406.97310157871,457.84473927605,465.11211608996,523.2511306012],"description":"Tritriadic scale of the 6:7:8 triad"},"tritriad68i":{"frequencies":[261.6255653006,299.00064605783,348.83408706747,392.4383479509,398.6675280771,448.50096908674,465.11211608996,523.2511306012],"description":"Tritriadic scale of the subharmonic 6:7:8 triad"},"tritriad69":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,348.83408706747,392.4383479509,406.97310157871,457.84473927605,523.2511306012],"description":"Tritriadic scale of the 6:7:9 triad, septimal natural minor"},"tritriad7":{"frequencies":[261.6255653006,264.29521392612,323.02748368748,332.97799220076,336.37572681506,411.12588832951,428.11456140098,523.2511306012],"description":"Tritriadic scale of the 7:9:11 triad"},"tritriad9":{"frequencies":[261.6255653006,272.93037367779,319.76457981184,362.25078272391,377.90359432309,442.75095666255,461.88217083933,523.2511306012],"description":"Tritriadic scale of the 9:11:13 triad"},"tsjerepnin":{"frequencies":[261.6255653006,290.69507255622,313.95067836072,348.83408706747,367.91095120397,392.4383479509,418.60090448096,470.92601754108,490.54793493862,523.2511306012],"description":"Scale from Ivan Tsjerepnin's Santur Opera (1977) & suite from it Santur Live!"},"tsuda13":{"frequencies":[261.6255653006,281.75060878526,283.42769574232,322.00069575458,340.11323489078,362.25078272391,377.90359432309,402.50086969323,425.14154361347,442.75095666255,485.87604984397,518.26778650024,523.2511306012],"description":"Mayumi Tsuda's Harmonic-13 scale. 1/1=440 Hz."},"tuneable3":{"frequencies":[36.70809598968,41.95210970249,42.82611198796,43.59086398774,44.04971518762,44.86545065405,45.8851199871,46.71939489596,47.1961234153,47.72052478658,48.94412798624,49.55592958607,50.47363198581,51.39133438555,52.00313598538,52.44013712811,53.02280531843,53.39359416681,55.06214398452,57.10148265061,57.68415084093,58.73295358349,59.65065598323,61.1801599828,62.40376318246,62.92816455374,64.23916798194,66.07457278142,66.74199270851,67.29817598108,68.17217826655,68.82767998065,70.35718398022,73.41619197936,79.53420797764,80.7578111773,82.59321597678,85.65222397592,87.18172797549,88.09943037523,89.14823311779,89.73090130811,90.10169015649,91.7702399742,94.39224683061,95.44104957317,96.35875197291,97.88825597248,100.94726397162,102.7826687711,104.00627197076,104.88027425623,105.53577597033,110.12428796904,114.20296530123,114.71279996775,115.36830168185,116.24230396732,117.46590716698,119.30131196646,120.61231539466,122.3603199656,123.88982396517,124.80752636491,125.85632910747,128.47833596388,132.14914556285,134.59635196216,137.6553599613,139.49076476078,140.71436796044,141.58837024591,146.83238395872,152.950399957,154.17400315666,156.00940795614,159.06841595528,161.51562235459,165.18643195356,168.85724155253,171.30444795184,174.36345595098,176.19886075046,183.5404799484,190.88209914634,192.71750394582,195.77651194496,201.89452794324,205.56533754221,208.01254394152,211.07155194066,220.24857593808,229.4255999355,232.48460793464,238.60262393292,244.7206399312,247.77964793034,256.95667192776,269.19270392432,275.3107199226,281.42873592088,293.66476791744],"description":"Marc Sabat, 3 octaves of intervals tuneable by ear"},"tuners1":{"frequencies":[261.6255653006,276.50456653385,293.15590636358,311.0676370396,328.627540632,349.28088891463,369.11955599459,391.76814585061,414.75684959346,439.06365754828,466.60145532616,492.6062100846,523.2511306012],"description":"The Tuner's Guide well temperament no. 1 (1840)"},"tuners2":{"frequencies":[261.6255653006,276.9861853325,293.55936848273,311.27971878774,329.48489606404,349.42029142443,369.90111701824,391.99869425741,415.03962525779,439.89939957166,466.4799232208,493.78769382322,523.2511306012],"description":"The Tuner's Guide well temperament no. 2 (1840)"},"tuners3":{"frequencies":[261.6255653006,276.9180796764,293.64050032496,311.25753558078,329.38199580693,349.20116137147,369.59117881045,391.8877401954,415.37711930697,439.91014033466,466.33569310799,493.52238512763,523.2511306012],"description":"The Tuner's Guide well temperament no. 3 (1840)"},"turkish":{"frequencies":[261.6255653006,279.06726965397,327.03195662575,348.83408706747,392.4383479509,436.04260883433,465.11211608996,523.2511306012],"description":"Turkish, 5-limit from Palmer on a Turkish music record, harmonic minor inverse"},"turkish_24":{"frequencies":[261.6255653006,275.62199471997,279.38237857051,290.36720431405,294.32876096318,310.07474405997,314.30517589183,326.6631048533,331.11985608357,344.13890881665,348.83408706747,367.49599295996,372.50983809402,387.15627241873,392.4383479509,413.43299207996,419.07356785577,435.55080647107,441.49314144476,458.8518784222,465.11211608996,489.99465727995,496.67978412536,516.20836322497,523.2511306012],"description":"Ra'uf Yekta, 24-tone Pythagorean Turkish Theoretical Gamut, 1/1=D (perde yegah) at 294 Hz"},"turkish_24a":{"frequencies":[261.6255653006,275.62199471997,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,331.11985608357,344.52749339997,348.83408706747,367.91095120397,372.08969287196,387.59343007496,392.4383479509,413.43299207996,418.60090448096,436.04260883433,441.49314144476,459.36999119996,465.11211608996,490.54793493862,496.67978412536,516.79124009995,523.2511306012],"description":"Turkish gamut with schismatic simplifications"},"turkish_41":{"frequencies":[261.6255653006,266.80864394988,272.09440643071,275.67629620338,281.13773466533,286.70737164501,290.48162858661,294.30556868769,300.13607443832,306.08208692954,310.11139540064,316.25503135793,322.52037740267,326.76608188608,333.2396629384,339.84149442859,344.31521657963,348.8478314504,355.75887527351,362.80683626646,367.58287746967,374.8650823332,382.29155536296,387.32409620162,392.42288612931,400.19720009986,408.12552912594,413.49815209867,421.6899870258,430.04411333507,435.70527569249,441.44096240275,450.1863739015,459.10504388656,465.14876849982,474.36385666592,483.76150545705,490.12981126508,499.83980314828,509.74215733443,516.45247616827,523.2511306012],"description":"Abd�lkadir T�re and M. Ekrem Karadeniz theoretical Turkish gamut"},"turkish_41a":{"frequencies":[261.6255653006,268.5590565112,272.09440643071,275.67629620338,279.3053384865,286.70737164501,290.48162858661,294.30556868769,298.17984938441,306.08208692954,310.11139540064,314.19374626607,322.52037740267,326.76608188608,335.42589979828,339.84149442859,344.31521657963,348.8478314504,353.4401143131,362.80683626646,367.58287746967,377.32440283229,382.29155536296,387.32409620162,392.42288612931,402.82271318249,408.12552912594,413.49815209867,424.45650702809,430.04411333507,435.70527569249,441.44096240275,453.1398459935,459.10504388656,465.14876849982,477.47594368525,483.76150545705,490.12981126508,503.11902634639,509.74215733443,516.45247616827,523.2511306012],"description":"Karadeniz's theoretical Turkish gamut, quantized to subset of 53-tET"},"turkish_aeu":{"frequencies":[261.6255653006,275.62199471997,279.38237857051,290.36720431405,294.32876096318,310.07474405997,314.30517589183,326.6631048533,331.11985608357,348.83408706747,353.59332287831,367.49599295996,372.50983809402,387.15627241873,392.4383479509,413.43299207996,419.07356785577,435.55080647107,441.49314144476,465.11211608996,471.45776383774,489.99465727995,496.67978412536,516.20836322497,523.2511306012],"description":"Arel-Ezgi-Uzdilek (AEU) 24 tone theoretical system"},"turkish_bagl":{"frequencies":[261.6255653006,277.01530443593,285.40970760065,294.32876096318,311.64221749042,321.08592105074,331.11985608357,348.83408706747,369.35373924791,380.54627680087,392.4383479509,415.52295665389,428.11456140098,441.49314144476,465.11211608996,492.47165233054,507.3950357345,523.2511306012],"description":"Ratios of the 17 frets on the neck of \"Baglama\" (\"saz\") according to Yal��n Tura"},"two29":{"frequencies":[261.6255653006,265.43099677612,267.95417262175,271.85165581044,274.43586616969,278.42762776199,281.0743490329,285.16266958193,287.87341387594,292.06062910037,294.83694510625,299.12544722478,301.96892109338,306.36116019141,309.2734164419,313.77190187131,316.75460431924,321.36190613206,324.41675883995,329.13550925662,332.26425750751,337.09715242073,340.3015837153,345.25138423021,348.53332930799,353.60286331966,356.96419720496,362.15636101402,365.59900408717,370.91676405444,374.44268531179,379.88907958456,383.50028913155,389.07842928561,392.77699240278,398.49006531303,402.2780950448,408.12936467525,412.00902517967,418.00183444819,421.97534223334,428.1131149215,432.1827401118,438.46898282094,442.63705045414,449.07535460876,453.34424596425,459.9382898638,464.31044382305,471.06399474345,475.54190918343,482.45882552933,487.04505874954,494.12929225872,498.82646444278,506.0820624438,510.89285715645,518.32396488098,523.2511306012],"description":"Two 29-tET scales 25 cents shifted, many near just intervals"},"two29a":{"frequencies":[261.6255653006,264.02813680074,267.95417262175,270.41486126945,274.43586616969,276.95607779319,281.0743490329,283.65552346679,287.87341387594,290.51702578379,294.83694510625,297.54450482308,301.96892109338,304.74197548856,309.2734164419,312.11354980287,316.75460431924,319.66343925668,324.41675883995,327.39595721478,332.26425750751,335.31552138031,340.3015837153,343.42665631876,348.53332930799,351.73399604284,356.96419720496,360.24228665998,365.59900408717,368.95638908389,374.44268531179,377.88128181162,383.50028913155,387.02206376789,392.77699240278,396.38395721814,402.2780950448,405.97231075214,412.00902517967,415.79260233969,421.97534223334,425.85044246025,432.1827401118,436.15157730833,442.63705045414,446.70189207635,453.34424596425,457.50741431695,464.31044382305,468.5743173866,475.54190918343,479.90892674463,487.04505874954,491.51771254425,498.82646444278,503.40730976502,510.89285715645,515.58451111167,523.2511306012],"description":"Two 29-tET scales 15.826 cents shifted, 13-limit chords, Mystery temperament, Gene Ward Smith"},"xenakis_chrom":{"frequencies":[261.6255653006,274.52698453615,329.62755691287,349.22823143301,391.99543598175,411.32572372413,493.88330125613,523.2511306012],"description":"Xenakis's Byzantine Liturgical mode, 5 + 19 + 6 parts"},"xenakis_diat":{"frequencies":[261.6255653006,293.66476791741,326.46944327063,349.22823143301,391.99543598175,440,489.15147723638,523.2511306012],"description":"Xenakis's Byzantine Liturgical mode, 12 + 11 + 7 parts"},"xenakis_schrom":{"frequencies":[261.6255653006,279.86396690685,326.46944327063,349.22823143301,391.99543598175,419.32216217931,489.15147723638,523.2511306012],"description":"Xenakis's Byzantine Liturgical mode, 7 + 16 + 7 parts"},"xenoga24":{"frequencies":[261.6255653006,265.7783520514,279.38237857051,283.8170195002,294.32876096318,299.00064605783,310.07474405997,314.99656539426,331.11985608357,336.37572681506,348.83408706747,354.37113606854,372.50983809402,378.42269266694,392.4383479509,398.6675280771,419.07356785577,425.72552925031,441.49314144476,448.50096908674,465.11211608996,472.49484809138,496.67978412536,504.56359022259,523.2511306012],"description":"M. Schulter, 3+7 ratios Xeno-Gothic adaptive tuning (keyboards 64:63 apart)"},"xylophone2":{"frequencies":[261.6255653006,295.19538981304,332.68808325276,388.83826257328,446.65787257783,506.59641128799,527.19506190947,579.57827742703,633.13077520476,751.1860077911,842.69088701475],"description":"African Yaswa xylophones (idiophone; calbash resonators with membrane)"},"xylophone3":{"frequencies":[261.6255653006,292.47977325983,348.01999353916,392.4383479509,442.29334161825,523.2511306012],"description":"African Banyoro xylophone (idiophone; loose log)"},"xylophone4":{"frequencies":[261.6255653006,281.70207497315,314.1971709147,349.63190883464,391.76907592069,436.9606979923,505.71930677521,568.9637969584,597.94115990992,660.7800775993,716.43551549302],"description":"African Bapare xylophone (idiophone, loose-log)"},"zalzal":{"frequencies":[261.6255653006,294.32876096318,321.08592105074,348.83408706747,392.4383479509,428.11456140098,465.11211608996,523.2511306012],"description":"Tuning of popular flute by Al Farabi & Zalzal. First tetrachord is modern Rast"},"zalzal2":{"frequencies":[261.6255653006,294.32876096318,331.11985608357,348.83408706747,387.59343007496,419.89288258121,465.11211608996,523.2511306012],"description":"Zalzal's Scale, a medieval Islamic with Ditone Diatonic & 10/9 x 13/12 x 72/65"},"zarlino":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,348.83408706747,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"Ptolemy's Intense Diatonic Systonon, also Zarlino's scale"},"zarlino2":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,348.83408706747,363.36884069528,367.91095120397,392.4383479509,408.78994578219,436.04260883433,465.11211608996,470.92601754108,490.54793493862,523.2511306012],"description":"16-note choice system of Zarlino, Sopplimenti musicali (1588)"},"zartehijaz1":{"frequencies":[261.6255653006,280.55696721076,336.07142343876,350.07440004945,375.4060213132,393.89732161404,446.43551156053,468.42549744394,502.32108537715,523.2511306012],"description":"Scale from Zarlino temperament extraordinaire -- lower Hijaz tetrachord"},"zesster_a":{"frequencies":[261.6255653006,279.06726965397,313.95067836072,334.88072358477,348.83408706747,392.4383479509,418.60090448096,502.32108537715,523.2511306012],"description":"Harmonic six-star, group A, from Fokker"},"zesster_b":{"frequencies":[261.6255653006,293.02063313667,299.00064605783,334.88072358477,366.27579142084,418.60090448096,457.84473927605,478.40103369253,523.2511306012],"description":"Harmonic six-star, group B, from Fokker"},"zesster_c":{"frequencies":[261.6255653006,299.00064605783,305.22982618403,348.83408706747,398.6675280771,406.97310157871,457.84473927605,465.11211608996,523.2511306012],"description":"Harmonic six-star, group C on Eb, from Fokker"},"zesster_mix":{"frequencies":[261.6255653006,274.70684356563,279.06726965397,293.02063313667,299.00064605783,313.95067836072,334.88072358477,348.83408706747,358.80077526939,366.27579142084,392.4383479509,418.60090448096,457.84473927605,478.40103369253,488.36772189445,502.32108537715,523.2511306012],"description":"Harmonic six-star, groups A, B and C mixed, from Fokker"},"zest24":{"frequencies":[261.6255653006,269.33468959023,272.52663052146,280.55696721076,292.24684137387,300.8582598368,308.87634556583,317.97777315513,326.45210604021,336.07142343876,350.07440004945,360.38977980792,364.66083404534,375.4060213132,391.04793957621,402.57065589001,410.30971075781,422.39999923493,436.81711699543,449.68847932918,465.03699205118,478.73988827571,487.94322738789,502.32108537715,523.2511306012],"description":"Zarlino Extraordinaire Spectrum Temperament (two circles at ~50.28c apart)"},"zir_bouzourk":{"frequencies":[261.6255653006,281.75060878526,305.22982618403,313.95067836072,353.19451315581,392.4383479509,523.2511306012],"description":"Zirafkend Bouzourk (IG #3, DF #9), from both Rouanet and Safi al-Din"},"zwolle":{"frequencies":[261.6255653006,275.62199471997,294.32876096318,310.07474405997,331.11985608357,348.83408706747,367.49599295996,392.4383479509,413.43299207996,441.49314144476,465.11211608996,496.67978412536,523.2511306012],"description":"Henri Arnaut De Zwolle. Pythagorean on G flat."},"zwolle2":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,311.68386704488,327.03195662575,349.91912034749,365.63284274659,391.22147055517,408.78994578219,437.39890198442,467.04206359353,489.02683710225,523.2511306012],"description":"Henri Arnaut De Zwolle's modified meantone tuning (c. 1440)"},"yarman12":{"frequencies":[261.6255653006,283.42769574232,294.32876096318,309.19384990071,332.97799220076,348.83408706747,377.90359432309,392.4383479509,411.12588832951,442.75095666255,465.11211608996,499.46698830115,523.2511306012],"description":"Detempered Yarman 13-limit, [<1 1 -20 -6 -3 -1|, <0 1 38 15 11 8|]"},"yarman12_80":{"frequencies":[261.6255653006,282.84340331238,295.36595061166,319.3201344739,333.45764463229,348.2210758395,376.46181130035,393.12919962609,425.01198472693,443.82887286778,479.82340237272,501.06699929295,523.2511306012],"description":"Ozan Yarman MOS, 80-et version"},"yarman17":{"frequencies":[261.6255653006,274.08392555301,283.42769574232,294.32876096318,309.19384990071,322.00069575458,332.97799220076,348.83408706747,362.25078272391,377.90359432309,392.4383479509,411.12588832951,425.14154361347,442.75095666255,465.11211608996,485.87604984397,499.46698830115,523.2511306012],"description":"80-et commas 13-limit detempering of a chain of 16 fifths"},"yarman_ney-ahengs":{"frequencies":[261.6255653006,275.39533189537,294.32876096318,310.07474405997,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.43299207996,436.04260883433,465.11211608996,494.18162334558,523.2511306012],"description":"Well Temperament for piano by Ozan Yarman from Ney Ahengs"},"yasser_6":{"frequencies":[261.6255653006,291.88463270656,325.64340264099,363.30663963964,405.32593044476,452.20508247496,523.2511306012],"description":"Yasser Hexad, 6 of 19 as whole tone scale"},"yasser_diat":{"frequencies":[261.6255653006,281.42815779395,291.88463270656,313.97755176024,325.64340264099,350.29154279212,376.80531512858,390.80553229045,420.38583225541,436.00528786292,469.00678383895,486.43275040712,523.2511306012],"description":"Yasser's Supra-Diatonic, the flat notes are V,W,X,Y,and Z"},"yasser_ji":{"frequencies":[261.6255653006,282.64904822654,294.32876096318,304.39128270551,327.03195662575,347.87575166344,359.73515228832,391.36022062136,425.14154361347,434.84468957929,457.84473927605,478.32915853722,523.2511306012],"description":"Yasser's just scale, 2 Yasser hexads, 121/91 apart"},"yekta":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,372.08969287196,392.4383479509,418.60090448096,436.04260883433,470.92601754108,502.32108537715,523.2511306012],"description":"Rauf Yekta's 12-tone tuning suggested in 1922 Lavignac Music Encyclopedia"},"young-g":{"frequencies":[261.6255653006,299.07507698093,319.76457981184,341.88537054616,390.82337532559,446.76650366117,477.67301428683,510.71739232152,583.82257301724,667.39198333921,713.56092257662,762.92356430953,872.13001648254,996.96833978235,1065.93668681199,1139.67601990796,1302.81150610354,1489.29848625885,1592.32474578757,1702.47910946196,1946.17475603251,2224.75468143463,2378.65811671778,2543.20970830682,2907.24890901465,3323.39919648924,3553.30434397593,3799.11599765247,4342.92768045015],"description":"Gayle Young's Harmonium, see PNM 26(2): 204-212 (1988)"},"young-lm_guitar":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"LaMonte Young, Tuning of For Guitar '58. 1/1 March '92, inv.of Mersenne lute 1"},"young-lm_piano":{"frequencies":[261.6255653006,289.72987407313,294.32876096318,300.46061014991,343.38355445704,338.01818641865,386.30649876417,392.4383479509,400.61414686654,457.84473927605,450.69091522486,515.07533168556,523.2511306012],"description":"LaMonte Young's Well-Tempered Piano"},"young-w10":{"frequencies":[261.6255653006,277.18263097687,302.26980244078,320.24370022528,349.22823143301,369.99442271164,391.99543598175,427.47405410759,452.89298412314,493.88330125613,523.2511306012],"description":"William Lyman Young 10 out of 24-tET (1961)"},"young-w14":{"frequencies":[261.6255653006,277.18263097687,293.66476791741,302.26980244078,320.24370022528,339.28638158975,359.46139971304,369.99442271164,391.99543598175,415.30469757995,427.47405410759,452.89298412314,479.82340237272,508.3551866238,523.2511306012],"description":"William Lyman Young 14 out of 24-tET (1961)"},"young-wt":{"frequencies":[261.6255653006,285.40970760065,309.19384990071,348.83408706747,392.4383479509,428.11456140098,463.79077485106,523.2511306012],"description":"William Lyman Young \"exquisite 3/4 tone Hellenic Lyre\" dorian"},"young":{"frequencies":[261.6255653006,275.62199471997,293.00227310437,310.07474405997,328.14198392915,348.83408706747,367.49599295996,391.5530240856,413.43299207996,438.51190905657,465.11211608996,491.10256480205,523.2511306012],"description":"Thomas Young well temperament (1807), also Luigi Malerbi nr.2 (1794)"},"young2":{"frequencies":[261.6255653006,276.24519242498,293.00227310437,310.77584116741,328.14198392915,349.22823143301,368.32692341742,391.5530240856,414.36778843034,438.51190905657,466.16376151809,491.65745674141,523.2511306012],"description":"Thomas Young well temperament no.2 (1799)"},"yugo_bagpipe":{"frequencies":[261.6255653006,277.02257024271,294.00421879736,322.47117131255,341.84370465044,381.9375744369,404.41509766528,430.1988069325,452.63145841613,463.74664903953,478.99265177484,502.22604835608,523.2511306012],"description":"Yugoslavian Bagpipe"},"yves":{"frequencies":[261.6255653006,290.69507255622,327.03195662575,348.83408706747,392.4383479509,436.04260883433,465.11211608996,523.2511306012],"description":"St Yves's scale II from Jocelyn Godwin, \"Music and the Occult\", 1995."},"saba_sup":{"frequencies":[261.6255653006,287.78812183066,313.95067836072,327.03195662575,392.4383479509,418.60090448096,470.92601754108,497.08857407114,523.2511306012],"description":"Superparticular version of maqam Sab"},"sabagh":{"frequencies":[261.6255653006,275.67629620338,279.3053384865,286.70737164501,294.30556868769,310.11139540064,314.19374626607,322.52037740267,326.76608188608,331.06767743197,348.8478314504,362.80683626646,367.58287746967,372.42178901277,392.42288612931,413.49815209867,418.94150105041,430.04411333507,441.44096240275,465.14876849982,471.27205084813,483.76150545705,490.12981126508,496.58195036371,523.2511306012],"description":"Twfiq Al-Sabagh, Arabic master musical scale in 53-tET (1954)"},"sabbagh":{"frequencies":[261.6255653006,294.30556868769,321.46759848648,348.8478314504,392.42288612931,428.64035280622,465.14876849982,523.2511306012],"description":"Tawfiq as-Sabbagh, a composer from Syria. 1/1=G"},"safi_diat":{"frequencies":[261.6255653006,276.16031892841,305.22982618403,348.83408706747,392.4383479509,414.24047839262,457.84473927605,523.2511306012],"description":"Safi al-Din's Diatonic, also the strong form of Avicenna's 8/7 diatonic"},"safi_diat2":{"frequencies":[261.6255653006,283.79722337692,310.07474405997,348.83408706747,392.4383479509,425.69583506538,465.11211608996,523.2511306012],"description":"Safi al-Din's 2nd Diatonic, a 3/4 tone diatonic like Ptolemy's Equable Diatonic"},"safi_major":{"frequencies":[261.6255653006,281.75060878526,322.00069575458,348.83408706747,375.66747838035,392.4383479509,523.2511306012],"description":"Singular Major (DF #6), from Safi al-Din, strong 32/27 chromatic"},"salinas_19":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,294.32876096318,306.59245933664,313.95067836072,327.03195662575,340.65828815182,348.83408706747,363.36884069528,372.08969287196,392.4383479509,408.78994578219,418.60090448096,436.04260883433,454.2110508691,465.11211608996,490.54793493862,510.98743222773,523.2511306012],"description":"Salinas' enharmonic tuning for his 19-tone instr. \"instrumentum imperfectum\""},"salinas_24":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,306.59245933664,313.95067836072,327.03195662575,340.65828815182,348.83408706747,363.36884069528,367.91095120397,372.08969287196,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,454.2110508691,459.88868900496,465.11211608996,470.92601754108,490.54793493862,510.98743222773,523.2511306012],"description":"Salinas enharmonic system \"instrumentum perfectum\". Subset of Mersenne"},"salinas_enh":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,348.83408706747,392.4383479509,408.78994578219,418.60090448096,523.2511306012],"description":"Salinas's and Euler's enharmonic"},"salunding":{"frequencies":[261.6255653006,282.38958039978,310.76686573877,390.36201910543,419.43149305958,523.2511306012],"description":"Gamelan slunding, Kengetan, South-Bali. 1/1=378 Hz"},"sankey":{"frequencies":[261.6255653006,274.88665260982,292.54735824399,309.58527581215,327.03195662575,348.83408706747,366.73895666255,391.24894371175,412.31687950427,437.13741259348,464.79252184829,489.99465727995,523.2511306012],"description":"John Sankey's Scarlatti tuning, personal evaluation based on d'Alembert's"},"santur1":{"frequencies":[261.6255653006,282.02765077995,319.3201344739,347.21689301951,376.46192220133,427.47393558663,475.68393915562,504.55222794679,523.2511306012],"description":"Persian santur tuning. 1/1=E"},"santur2":{"frequencies":[261.6255653006,281.2143451833,317.48098583281,345.21700307457,375.37611551499,423.78627283082,475.68393915562,498.18106573801,523.2511306012],"description":"Persian santur tuning. 1/1=E"},"sanza":{"frequencies":[261.6255653006,293.15632631094,308.97787266236,346.21547002486,390.18821123181,462.40922843744,524.46149515038,595.18445928535,620.10113226249],"description":"African N'Gundi Sanza (idiophone; set of lamellas, thumb-plucked)"},"sanza2":{"frequencies":[261.6255653006,390.63923480058,465.35666077712,523.2511306012,588.68812410589,663.45725712889,702.9084786129,783.08569314515],"description":"African Baduma Sanza (idiophone, like mbira)"},"sauveur":{"frequencies":[261.6255653006,274.85950244128,292.7026939092,313.25286195357,328.80795208256,349.69755047152,367.27338607435,391.35133250294,417.15885134862,438.29716799286,468.84228427561,491.11646492505,523.2511306012],"description":"Sauveur's tempered system of the harpsichord. Trait� (1697)"},"sauveur2":{"frequencies":[261.6255653006,278.64199172491,293.04864983565,312.10886966906,328.2456799168,349.5951549002,372.33322418948,391.58401058733,417.05308314313,438.61577206336,467.14384425417,491.2966347616,523.2511306012],"description":"Sauveur's Syste^me Chromatique des Musiciens (Memoires 1701), 12 out of 55."},"sauveur_17":{"frequencies":[261.6255653006,275.62199471997,290.36720431405,294.32876096318,310.07474405997,326.6631048533,331.11985608357,348.83408706747,367.49599295996,372.50983809402,392.4383479509,413.43299207996,419.07356785577,441.49314144476,465.11211608996,489.99465727995,496.67978412536,523.2511306012],"description":"Sauveur's oriental system, aft. Kitab al-adwar (Bagdad 1294) by Safi al-Din"},"sauveur_ji":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,313.95067836072,327.03195662575,348.83408706747,367.91095120397,392.4383479509,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Aplication des sons harmoniques aux jeux d'orgues (1702) (PB 81/80 & 128/125)"},"savas_bardiat":{"frequencies":[261.6255653006,282.57123920205,317.17549194805,349.22823143301,391.99543598175,423.37848741825,475.22628419761,523.2511306012],"description":"Savas's Byzantine Liturgical mode, 8 + 12 + 10 parts"},"savas_barenh":{"frequencies":[261.6255653006,282.57123920205,329.62755691287,349.22823143301,391.99543598175,423.37848741825,493.88330125613,523.2511306012],"description":"Savas's Byzantine Liturgical mode, 8 + 16 + 6 parts"},"savas_chrom":{"frequencies":[261.6255653006,282.57123920205,323.3415889232,349.22823143301,391.99543598175,423.37848741825,484.46499093218,523.2511306012],"description":"Savas's Chromatic, Byzantine Liturgical mode, 8 + 14 + 8 parts"},"savas_diat":{"frequencies":[261.6255653006,288.06460709314,311.12698372208,349.22823143301,391.99543598175,431.60923940535,466.16376151809,523.2511306012],"description":"Savas's Diatonic, Byzantine Liturgical mode, 10 + 8 + 12 parts"},"savas_palace":{"frequencies":[261.6255653006,277.18263097687,336.03572815422,349.22823143301,391.99543598175,415.30469757995,503.48470957687,523.2511306012],"description":"Savas's Byzantine Liturgical mode, 6 + 20 + 4 parts"},"scalatron":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,294.32876096318,306.59245933664,313.95067836072,327.03195662575,340.65828815182,348.83408706747,367.91095120397,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,459.88868900496,470.92601754108,490.54793493862,510.98743222773,523.2511306012],"description":"Scalatron (tm) 19-tone scale, see manual, 1974"},"scheengaas":{"frequencies":[261.6255653006,273.84069463911,292.6487650037,312.74862113192,327.53979283172,350.03605285217,366.8025131876,391.54284657258,418.19337019276,437.97145880542,467.51204131067,489.62261321254,523.2511306012],"description":"Scheengaas' variation"},"scheffer":{"frequencies":[261.6255653006,274.56546814423,292.86978442859,309.86465789076,327.84548435462,349.70179235499,366.99791252626,391.46460164194,410.82629477826,438.21464222188,467.42914467878,490.54793493862,523.2511306012],"description":"H.Th. Scheffer (1748) modified 1/5-comma temperament, Sweden"},"schidlof":{"frequencies":[261.6255653006,264.89588486686,274.70684356563,280.31310567921,294.32876096318,305.22982618403,315.35224388912,322.99452506247,327.03195662575,348.83408706747,353.19451315581,366.27579142084,373.75080757229,392.4383479509,406.97310157871,420.46965851882,436.04260883433,457.84473927605,467.18850946536,484.4917875937,490.54793493862,523.2511306012],"description":"Schidlof"},"schillinger":{"frequencies":[261.6255653006,262.8879410321,275.85161280553,277.18263097687,278.52007147562,292.25460328695,293.66476791741,295.08173676673,309.63296633914,311.12698372208,312.62820992379,328.04470063332,329.62755691287,331.21805066987,347.55125362114,349.22823143301,350.91330087035,368.21772660991,369.99442271164,371.77969159194,390.11309203208,391.99543598175,393.88686247394,413.31042363438,415.30469757995,417.30859414412,437.88714035463,440,442.12305445465,463.92526470026,466.16376151809,468.41305936011,491.51169649079,493.88330125613,496.26634930797,520.73850287792,523.2511306012],"description":"Joseph Schillinger's double equal temperament, p.664 Mathematical Basis..."},"schis41":{"frequencies":[261.6255653006,266.96486255163,272.52663052146,275.21650375777,280.31310567921,285.40970760065,290.69507255622,294.32876096318,299.00064605783,305.22982618403,311.45900631024,313.95067836072,321.08592105074,327.03195662575,329.64821227876,336.37572681506,343.38355445704,348.83408706747,355.95315006884,363.36884069528,366.27579142084,373.75080757229,380.54627680087,387.59343007496,392.4383479509,398.6675280771,406.97310157871,415.27867508032,418.60090448096,428.11456140098,436.04260883433,441.49314144476,448.50096908674,457.84473927605,465.11211608996,470.92601754108,484.4917875937,490.54793493862,497.4115685962,504.56359022259,512.78610798918,523.2511306012],"description":"41&53 <<1 -8 -14 23 -15 -25 33 -10 81 113||"},"schisynch17":{"frequencies":[261.6255653006,275.80289341725,290.74848220557,294.25152581512,310.19683462128,327.0062098829,330.94609980123,348.87986495302,367.78544978395,387.71551660339,392.38685458718,413.65005636851,436.06549769577,441.31937388998,465.23419873014,490.4449531872,496.35401261224,523.2511306012],"description":"fifth satisfies f^9 + f^8 - 64 = 0"},"schlick":{"frequencies":[261.6255653006,275.62199471997,293.00227310437,311.47852302926,328.14198392915,349.6228209638,367.9112241576,391.5530240856,414.36778843034,438.51190905657,466.69047534984,491.10256480205,523.2511306012],"description":"Reconstructed temp. A. Schlick, Spiegel d. Orgelmacher und Organisten (1511)"},"schlick2":{"frequencies":[261.6255653006,275.31092272332,293.00227310437,311.83045953724,328.14198392915,349.6228209638,367.9112241576,391.5530240856,415.30469757995,438.51190905657,466.69047534984,491.10256480205,523.2511306012],"description":"Schlick's temperament reconstructed by F.J. Ratte (1991)"},"schlick3":{"frequencies":[261.6255653006,275.31092431358,293.00227310437,311.83045953724,328.14198392915,349.6228209638,367.70355049744,391.5530240856,415.07027187895,438.51190905657,466.95405539699,491.10256480205,523.2511306012],"description":"Possible well-tempered interpretation of 1555 tuning, Margo Schulter"},"schlick4":{"frequencies":[261.6255653006,275.29566620843,293.00166043901,311.83758337792,328.14192706649,349.6222474261,367.6987228158,391.55300599201,415.35839309639,438.51185079886,466.95962791236,491.10245700671,523.2511306012],"description":"Another reconstructed Schlick's modified meantone (Poletti?)"},"scholz":{"frequencies":[261.6255653006,271.31540105247,299.00064605783,305.22982618403,348.83408706747,392.4383479509,406.97310157871,457.84473927605,523.2511306012],"description":"Simple Tune #1 Carter Scholz"},"scholz_epi":{"frequencies":[261.6255653006,1046.5022612024,1308.127826503,1569.7533918036,1831.3789571042,2093.0045224048,2354.6300877054,2616.255653006,2877.8812183066,3139.5067836072,3401.1323489078,3662.7579142084,3924.383479509,4186.0090448096,4709.2601754108,5232.511306012,5494.1368713126,5755.7624366132,6279.0135672144,6540.639132515,6802.2646978156,7063.8902631162,7325.5158284168,8372.0180896192,8633.6436549198,9156.894785521,9418.5203508216,10203.3970467234,10465.022612024,10988.2737426252,11511.5248732264,11773.150438527,12558.0271344288,12819.6526997294,13081.27826503,14127.7805262324,14389.406091533,14651.0316568336,16482.4106139378,16744.0361792384,17005.661744539],"description":"Carter Scholz, Epimore"},"schulter":{"frequencies":[261.6255653006,277.184065539,293.66520219021,311.12905403417,329.62853176407,349.23107169224,369.99606406306,391.99572582396,415.30715405467,440.00097595231,466.1672081452,493.88512703986,523.25577305438],"description":"Margo Schulter's 5-limit JI virt. ET, \"scintilla of Artusi\" tempered 22-08-98"},"schulter_17":{"frequencies":[261.6255653006,272.43653907335,282.13181390574,295.15344695336,308.77608605158,319.09647917983,332.97799220076,348.34640884647,361.82138782225,375.64984936577,392.98775403209,410.26687922759,423.79017189188,443.34998408798,463.81254988138,480.53289366295,500.16624277499,523.2511306012],"description":"Neo-Gothic well-temperament (14:11, 9:7 hypermeantone fifths) TL 04-09-2000"},"schulter_24":{"frequencies":[261.6255653006,270.06509966514,283.8170195002,292.97240722602,295.75063903546,305.22982618403,307.79478270659,317.68818643644,334.29933343966,345.08318290545,348.06842720833,359.29644098925,377.90359432309,390.09403284964,393.30161007617,406.07983174306,426.86276443782,440.63253103259,444.76346101102,458.66231916761,462.87600014722,477.80748402293,502.32108537715,518.89070451286,523.2511306012],"description":"Rational intonation (RI) scale with some \"17-ish\" features (24 notes)"},"schulter_cart34":{"frequencies":[261.6255653006,270.08718526646,272.51337835337,281.3271372098,283.85429714132,293.03484945212,295.66718139806,305.22982618403,307.97166902637,317.93223698752,320.78822215662,331.16330924834,334.13814720468,344.94500399825,348.04364484358,359.30023993517,362.52783176564,374.2528814026,377.61479489998,389.82779436071,393.32961502355,406.05087076101,409.69842558521,422.94908927295,426.7484383229,440.55054172958,444.50800708553,458.88449901367,463.0066556268,477.98143975034,482.27514684959,497.87312179111,502.34551296122,518.59261334435,523.2511306012],"description":"\"Carthesian tuning\" with two 17-tET chains 55.106 cents apart"},"schulter_diat7":{"frequencies":[261.6255653006,295.1673044417,332.97799220076,348.83408706747,392.4383479509,442.75095666255,499.46698830115,523.2511306012],"description":"Diatonic scale, symmetrical tetrachords based on 14/11 and 13/11 triads"},"schulter_ham":{"frequencies":[261.6255653006,272.52663052146,283.8170195002,295.75063903546,307.79478270659,320.70230585235,334.29933343966,348.01136516401,362.25078272391,377.90359432309,393.36609818246,409.50088481833,426.86276443782,444.76346101102,462.87600014722,482.33849075995,502.32108537715,523.2511306012],"description":"New rational tuning of \"Hammond organ type\", TL 01-03-2002"},"schulter_jot17a":{"frequencies":[261.6255653006,271.31540105247,281.75060878526,295.1673044417,305.22982618403,318.50068819203,332.97799220076,348.83408706747,361.75386806997,375.66747838035,392.4383479509,406.97310157871,422.62591317789,442.75095666255,457.84473927605,477.75103228805,499.46698830115,523.2511306012],"description":"Just octachord tuning -- 4:3-9:8-4:3 division, 17 steps (7 + 3 + 7), Bb-Bb"},"schulter_jot17bb":{"frequencies":[261.6255653006,271.31540105247,281.75060878526,295.15228855401,305.22982618403,318.50068819203,332.97799220076,348.83408706747,361.75386806997,375.66747838035,392.4383479509,406.97310157871,422.62591317789,442.72843283101,457.84473927605,477.75103228805,499.46698830115,523.2511306012],"description":"\"Just Octachord Tuning\" (Bb-Eb, F-Bb) -- 896:891 divided into 1792:1787:1782"},"schulter_jwt17":{"frequencies":[261.6255653006,272.43653907335,282.34838235411,295.1673044417,308.34441624714,319.76457981184,332.97799220076,347.8430811383,362.25078272391,376.08675011961,393.55640592227,409.81906732402,425.14154361347,443.97065626768,462.87600014722,481.6288815761,500.8899711738,523.2511306012],"description":"\"Just well-tuned 17\" circulating system"},"schulter_lin76-34":{"frequencies":[261.6255653006,270.6250663876,281.88470155261,291.58108453077,295.07956188513,305.22982618403,308.89206602106,319.51745915009,332.81131277165,344.25948974019,348.39001840879,360.3740779397,375.36781334896,388.27986588625,392.93856423817,406.45502016129,423.36600317146,437.92911415628,443.18352164838,458.42832346067,463.9286840578,479.88708893184,499.85328649772,517.04744024951,523.2511306012],"description":"Two 12-note chains, ~704.160 cents, 34 4ths apart (32 4ths = 7:6), TL 29-11-02"},"schulter_pel":{"frequencies":[261.6255653006,271.31540105247,305.22982618403,392.4383479509,406.97310157871,523.2511306012],"description":"Just pelog-style Phrygian pentatonic"},"schulter_pepr":{"frequencies":[261.6255653006,270.64528702739,281.81099471089,291.52662303231,295.05751399041,305.22982618403,308.92668738628,319.57714790608,332.76158224462,344.23376719628,348.40303271111,360.41446953256,375.28368107222,388.22184469544,392.9238840789,406.47020586181,423.23948674937,437.83095983374,443.13385158124,458.41119660824,463.96335069158,479.95880706014,499.75992392917,516.98949183803,523.2511306012],"description":"Peppermint 24: Wilson/Pepper apotome/limma=Phi, 2 chains spaced for pure 7:6"},"schulter_qcm62a":{"frequencies":[261.6255653006,262.43934012943,267.90457886781,268.73788454005,273.37431312998,274.22463192287,279.93529690293,280.80602334765,285.65065877038,286.53916259713,292.50627485027,293.41610276971,299.52642572255,300.45808951291,305.64177427204,306.59245933664,312.977175335,313.95067836072,320.36052345918,320.48862783822,327.03195662575,328.04917632434,334.88072358477,335.92235492515,341.71789064962,342.78078913836,349.91912034749,351.00752840096,358.31717956585,359.43170941363,365.63284274659,366.77012764335,374.40803131735,375.5726110527,382.05221698715,383.2405741708,391.22147055517,392.4383479509,400.61078621746,401.85686830172,408.78994578219,410.06146948999,418.60090448096,419.90294514449,427.14736482575,428.47598794138,437.39890198442,438.75941205608,447.89647345742,449.28963835923,457.04105241293,458.46266117889,468.01003810189,469.46576276783,479.24227945773,480.73294151703,489.02683710225,490.54793493862,500.76348165392,502.32108537715,510.98743222773,512.57683571821,523.2511306012],"description":"1/4-comma meantone, two 31-notes at 1/4-comma (Vicentino-like system)"},"schulter_qcmlji24":{"frequencies":[261.6255653006,262.43934012943,273.37431312998,274.22463192287,292.50627485027,293.41610276971,306.59245933664,312.977175335,327.03195662575,328.04917632434,349.91912034749,351.00752840096,365.63284274659,366.77012764335,391.22147055517,392.4383479509,408.78994578219,410.06146948999,437.39890198442,438.75941205608,458.46266117889,468.01003810189,489.02683710225,490.54793493862,523.2511306012],"description":"24-note adaptive JI (Eb-G#/F'-A#') for Lasso's Prologue to _Prophetiae_"},"schulter_qcmqd8_4":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,309.28772967674,327.03195662575,349.91912034749,365.63284274659,391.22147055517,411.22091428214,437.39890198442,465.24335632603,489.02683710225,523.2511306012],"description":"F-C# in 1/4-comma meantone, other 5ths ~4.888 cents wide or (2048/2025)^(1/4)"},"schulter_sq":{"frequencies":[261.6255653006,271.31540105247,279.38237857051,289.72987407313,294.32876096318,305.22982618403,310.07474405997,325.94610833227,331.11985608357,343.38355445704,348.83408706747,361.75386806997,372.50983809402,386.30649876417,392.4383479509,406.97310157871,419.07356785577,434.59481110969,441.49314144476,457.84473927605,465.11211608996,488.9191624984,496.67978412536,515.07533168556,523.2511306012],"description":"\"Sesquisexta\" tuning, two 12-tone Pyth. manuals a 7/6 apart. TL 16-5-2001"},"schulter_tedorian":{"frequencies":[261.6255653006,295.99553712036,309.28772789022,347.85054122562,393.54796334264,442.61656607198,462.49302735707,523.2511306012],"description":"Eb Dorian in temperament extraordinaire -- neo-medieval style"},"schulter_zarte84":{"frequencies":[261.6255653006,272.52663052146,292.24684137387,308.87634556583,326.45210604021,350.07440004945,364.66083404534,391.04793957621,410.30971075781,436.81711699543,465.03699205118,487.94322738789,523.2511306012],"description":"Temperament extraordinaire, Zarlino's 2/7-comma meantone (F-C#)"},"schulter_zarte84n":{"frequencies":[261.6255653006,272.46997760396,292.1447183254,308.81896225817,326.44489157977,350.01709816983,364.52535053201,391.11195868293,410.09013064752,436.73596474349,465.11312402839,488.01232708701,523.2511306012],"description":"Zarlino temperament extraordinaire, 1024-tET mapping"},"scotbag":{"frequencies":[261.6255653006,290.69507255622,327.03195662575,356.76213450082,387.59343007496,436.04260883433,479.64686971777,523.2511306012],"description":"Scottish bagpipe tuning"},"scotbag2":{"frequencies":[261.6255653006,290.69507255622,319.76457981184,348.83408706747,392.4383479509,428.11456140098,470.92601754108,523.2511306012],"description":"Scottish bagpipe tuning 2"},"scotbag3":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,359.73515228832,392.4383479509,441.49314144476,479.64686971777,523.2511306012],"description":"Scottish bagpipe tuning 3"},"scotbag4":{"frequencies":[261.6255653006,293.15632631094,318.58319997217,348.2210758395,392.67530119805,428.21545238314,468.59347232539,523.2511306012],"description":"Scottish Higland Bagpipe by Macdonald, Edinburgh. Helmholtz/Ellis p. 515, nr.52"},"scottd1":{"frequencies":[261.6255653006,275.93341798027,292.67158636845,310.42509491746,327.40170814054,349.22823143301,367.9112241576,391.5530240856,413.90012676351,437.52264545758,465.63764214343,490.54829628849,523.2511306012],"description":"Dale Scott's temperament 1, TL 9-6-1999"},"scottd2":{"frequencies":[261.6255653006,276.1828093671,292.93610587951,310.70566022736,327.9937953665,349.3071136959,368.24374600687,391.64146650178,414.27421384356,438.21489534465,466.05849010807,491.32444638706,523.2511306012],"description":"Dale Scott's temperament 2, TL 9-6-1999"},"scottd3":{"frequencies":[261.6255653006,276.40121172404,293.16775656083,310.95136287868,328.51274831708,349.22813057195,368.53494914961,391.77416758435,414.60181737882,438.75957425603,466.42704408487,491.93513777943,523.2511306012],"description":"Dale Scott's temperament 3, TL 9-6-1999"},"scottd4":{"frequencies":[261.6255653006,276.60439543337,293.30494246724,310.98285414553,328.78580734933,349.37474066871,369.05201453919,391.83105388699,414.77686160481,439.10664961187,466.16991430388,492.5350487994,523.2511306012],"description":"Dale Scott's temperament 4, TL 9-6-1999"},"scottj":{"frequencies":[261.6255653006,294.32876096318,336.37572681506,348.83408706747,392.4383479509],"description":"Jeff Scott's \"seven and five\" tuning, fifth-repeating. TL 20-04-99"},"scottj2":{"frequencies":[261.6255653006,290.69507255622,299.00064605783,305.22982618403,313.95067836072,348.83408706747,366.27579142084,406.97310157871,418.60090448096,428.11456140098,436.04260883433,485.87604984397,523.2511306012,566.85539148463,581.39014511244,598.00129211566,610.45965236807,680.22646978156,719.47030457665,784.8766959018],"description":"Jeff Scott's \"just tritone/13\" tuning. TL 17-03-2001"},"secor12_1":{"frequencies":[261.6255653006,275.03488264166,292.74290192225,310.07362690431,327.56128791316,349.21167447253,366.91716522699,391.37968062521,412.76363757129,437.92977184699,465.61556619611,490.01645577464,523.2511306012],"description":"George Secor's 12-tone temperament ordinaire #1, proportional beating"},"secor12_2":{"frequencies":[261.6255653006,275.62199471997,292.79557634972,310.07474405997,327.35540669465,348.83408706747,367.49599295996,391.60840570078,413.43299207996,437.83150862942,465.11211608996,489.99465727995,523.2511306012],"description":"George Secor's closed 12-tone well-temperament #2, with 7 just fifths"},"secor12_3":{"frequencies":[261.6255653006,274.49585366342,292.50627485027,309.76836826904,327.03195662575,349.57337698802,365.99447173417,391.22147055517,411.74378028931,437.39890198442,466.09783352473,489.02683710225,523.2511306012],"description":"George Secor's closed 12-tone temperament #3 with 5 meantone, 3 just, and 2 wide fifths"},"secor17htt1":{"frequencies":[261.6255653006,266.21235100401,283.6936382117,294.88137067808,304.94368688875,319.75456524059,327.03195662575,348.50707605838,360.3992766165,372.69727792826,392.80658053205,399.69321489333,425.93975025566,435.63385416574,457.84473927605,480.08189580921,491.0082387498,523.2511306012],"description":"George Secor's 17-tone high-tolerance temperament subset #1 on C (5/4 & 7/4 exact)"},"secor17htt2":{"frequencies":[261.6255653006,266.21235100401,279.78524030783,294.88137067808,300.05119287674,319.75456524059,327.03195662575,348.50707605838,360.3992766165,372.69727792826,392.80658053205,399.69321489333,425.93975025566,442.73709545768,457.84473927605,480.08189580921,491.0082387498,523.2511306012],"description":"George Secor's 17-tone high-tolerance temperament subset #2 on Eo (5/4 & 7/4 exact)"},"secor17htt3":{"frequencies":[261.6255653006,270.55308473255,279.78524030783,294.88137067808,300.05119287674,319.75456524059,327.03195662575,343.70575469589,360.3992766165,368.60172104124,392.80658053205,399.69321489333,425.93975025566,442.73709545768,457.84473927605,480.08189580921,491.0082387498,523.2511306012],"description":"George Secor's 17-tone high-tolerance temperament subset #3 on G (5/4 & 7/4 exact)"},"secor17htt4":{"frequencies":[261.6255653006,270.55308473255,279.78524030783,294.88137067808,300.05119287674,319.75456524059,332.36439517321,343.70575469589,360.3992766165,368.60172104124,392.80658053205,399.69321489333,420.07165483694,442.73709545768,450.49910517366,480.08189580921,491.0082387498,523.2511306012],"description":"George Secor's 17-tone high-tolerance temperament subset #4 on Bo (5/4 & 7/4 exact)"},"secor17wt":{"frequencies":[261.6255653006,271.90848849519,284.45827635845,296.12458543709,307.25838681362,320.91221742866,335.17278980765,347.77473997341,362.0378075073,378.74746489181,393.63374363584,408.43373030454,427.2847686483,445.53990619223,462.29147990415,482.0422296857,504.29062567056,523.2511306012],"description":"George Secor's well temperament with 5 pure 11/7 and 3 near just 11/6"},"secor19wt":{"frequencies":[261.6255653006,272.32755795875,282.27948808054,292.18583194851,304.13791554835,314.37102040472,326.31582004031,339.6640167515,350.11094753355,364.43250202589,378.27942889874,391.0071187494,407.00156221801,421.24111755476,436.68033801788,454.54308187078,469.17957429271,487.6886112017,506.92782577841,523.2511306012],"description":"George Secor's 19-tone well temperament with ten 5/17-comma fifths"},"secor19wt1":{"frequencies":[261.6255653006,272.32845615788,282.22605479514,292.18610873661,304.13920677667,314.3856167727,326.31643450984,339.6657766488,350.11078170334,364.43353349925,378.23315721313,391.00730395019,407.00309738029,421.33223555387,436.68095599763,454.54522431957,469.16941157468,487.689760539,506.89867708289,523.2511306012],"description":"George Secor's 19-tone proportional-beating (5/17-comma) well temperament (v.1)"},"secor19wt2":{"frequencies":[261.6255653006,272.32845615788,282.22605479514,292.18610873661,304.13920677667,314.27577204952,326.31643450984,339.6657766488,350.11078170334,364.43353349925,378.23315721313,391.00730395019,407.00309738029,421.20165315727,436.68095599763,454.54522431957,469.03541436973,487.689760539,506.89867708289,523.2511306012],"description":"George Secor's 19-tone proportional-beating (5/17-comma) well temperament (v.2)"},"secor1_4tx":{"frequencies":[261.6255653006,274.52656755164,292.65557420835,309.65910769439,327.20096538886,349.14957009195,366.50113643833,391.42429537222,412.04336447213,437.62002395673,465.5327601226,489.58458498887,523.2511306012],"description":"George Secor's rational 1/4-comma temperament extraordinaire"},"secor1_5tx":{"frequencies":[261.6255653006,275.23833828784,292.86443876933,310.12174699459,327.84546895566,349.26796031009,366.98445105045,391.462133155,412.85750743176,438.21197504744,465.69061374678,490.54793493862,523.2511306012],"description":"George Secor's 1/5-comma temperament extraordinaire (ratios supplied by G. W. Smith)"},"secor1_5wt":{"frequencies":[261.6255653006,275.62199471997,292.86443876933,310.07474405997,327.84546895566,348.83408706747,367.44664657419,391.462133155,413.43299207996,438.21197504744,465.11211608996,490.54793493862,523.2511306012],"description":"George Secor's 1/5-comma well-temperament (ratios supplied by G. W. Smith)"},"secor1_7wt":{"frequencies":[261.6255653006,276.40791719395,293.28186156416,310.6264877857,328.77715667764,349.45479875891,368.54388959194,391.74026793015,414.61187579093,439.14616729155,465.93973167855,492.29203182992,523.2511306012],"description":"George Secor's 1/7-comma well-temperament (ratios supplied by G. W. Smith)"},"secor22_19p3":{"frequencies":[261.6255653006,266.86058412305,272.32845615788,282.28026746552,292.18610873661,304.13920677667,314.37137994881,326.31643450984,339.6657766488,350.11078170334,357.11635499175,364.43353349925,378.28077924825,391.00730395019,407.00309738029,421.28573964817,436.68095599763,454.54522431957,469.17973147781,477.89781576412,487.689760539,506.93004530576,523.2511306012],"description":"George Secor's 19+3 well temperament with ten ~5/17-comma (equal-beating) fifths and 3 pure 9:11. TL 28-6-2002,26-10-2006. Aux=1,10,19"},"secor22_ji29":{"frequencies":[261.6255653006,272.52663052146,283.42769574232,286.15296204753,294.32876096318,305.22982618403,316.13089140489,327.03195662575,340.65828815182,348.83408706747,359.73515228832,370.63621750918,381.53728273004,392.4383479509,414.24047839262,425.14154361347,436.04260883433,441.49314144476,457.84473927605,479.64686971777,490.54793493862,501.44900015948,523.2511306012],"description":"George Secor's 22-tone just intonation (29-limit otonality on 4/3)"},"secor29htt":{"frequencies":[261.6255653006,270.55308473255,276.71069203503,283.6936382117,290.1503157249,294.88137067808,304.94368688875,310.54087273367,319.75456524059,327.03195662575,332.36439517321,343.70575469589,348.50707605838,360.3992766165,368.60172104124,377.19539564757,387.3949548402,392.80658053205,406.21042497925,415.4555026381,425.93975025566,435.63385416574,442.73709545768,457.84473927605,464.24049278842,480.08189580921,491.0082387498,499.01438878341,516.04239079678,523.2511306012],"description":"George Secor's 29-tone 13-limit high-tolerance temperament (5/4 & 7/4 exact)"},"secor2_11wt":{"frequencies":[261.6255653006,275.91396717201,292.9984614786,310.40321306851,328.14053952957,349.20361470207,367.88528956268,391.55148162785,413.87095075801,438.50612639837,465.60481960276,491.10222639053,523.2511306012],"description":"George Secor's rational 2/11-comma well-temperament"},"secor41htt":{"frequencies":[261.6255653006,266.21235100401,270.55308473255,276.71069203503,279.78524030783,283.6936382117,290.1503157249,294.88137067808,300.05119287674,304.94368688875,310.54087273367,315.34936221801,319.75456524059,327.03195662575,332.36439517321,338.19136297459,343.70575469589,348.50707605838,354.61705516636,360.3992766165,368.60172104124,372.69727792826,377.90358994896,387.3949548402,392.80658053205,399.69321489333,406.21042497925,415.4555026381,420.07165483694,425.93975025566,435.63385416574,442.73709545768,450.49910517366,457.84473927605,464.24049278842,473.46789104304,480.08189580921,491.0082387498,499.01438878341,507.7630447553,516.04239079678,523.2511306012],"description":"George Secor's 13-limit high-tolerance temperament superset (5/4 & 7/4 exact)"},"secor5_23tx":{"frequencies":[261.6255653006,275.02417915696,292.7420830065,310.0721322444,327.56084927797,349.21018850905,366.91927748105,391.38056264645,412.75664067387,437.92311604224,465.61358467873,490.0190422864,523.2511306012],"description":"George Secor's rational 5/23-comma temperament extraordinaire"},"secor5_23wt":{"frequencies":[261.6255653006,275.62199471997,292.75872440224,310.07474405997,327.56278518065,348.83408706747,367.49599295996,391.3766908411,413.43299207996,437.81158306864,465.11211608996,489.99465727995,523.2511306012],"description":"George Secor's rational 5/23-comma proportional-beating well-temperament"},"secor7p":{"frequencies":[261.6255653006,281.10327891957,302.03108525935,356.94582815655,383.52002471837,412.07263653985,442.75095666255,523.2511306012],"description":"George Secor's pelog-like MOS with near just 11:13:15:19 tetrads (1979)"},"secor_vrwt":{"frequencies":[261.6255653006,276.32932769153,293.15777167588,310.55777256823,328.11844153148,349.04269216937,368.62018440632,392.00375398861,414.25255044712,438.65017260809,465.6191423793,491.6947801169,523.2511306012],"description":"George Secor's Victorian rational well-temperament (based on Ellis #2)"},"secor_wt1-7":{"frequencies":[261.6255653006,276.2204353545,293.2843722634,310.74798946314,328.77415062671,349.45463702831,368.55847674989,391.74146894101,414.33065282463,439.14535139523,466.13275379077,492.28548658217,523.2511306012],"description":"George Secor's 1/7-comma well-temperament"},"secor_wt10":{"frequencies":[261.6255653006,276.4188590209,293.2843722634,310.62634254146,328.77415062671,349.45463500978,368.55847887877,391.7414712038,414.6282883241,439.14535393183,465.93951357928,492.28548942572,523.2511306012],"description":"George Secor's 12-tone well-temperament, proportional beating"},"secor_wtpb-24a":{"frequencies":[261.6255653006,275.62199471997,292.84836938997,310.07474405997,327.30111872997,348.83408706747,367.49599295996,391.90002374246,413.43299207996,437.54991661796,465.11211608996,490.95167809495,523.2511306012],"description":"George Secor's 24-triad proportional-beating well-temperament (24a)"},"secor_wtpb-24b":{"frequencies":[261.6255653006,275.62199471997,292.56126314547,310.07474405997,327.51644841334,348.83408706747,367.49599295996,391.46936437571,413.43299207996,437.76524630133,465.11211608996,490.37746560595,523.2511306012],"description":"George Secor's 24-triad proportional-beating well-temperament (24b)"},"segah":{"frequencies":[261.6255653006,293.66476791741,320.24370022528,349.22823143301,391.99543598175,440,479.82340237272,523.2511306012],"description":"Arabic SEGAH (Dudon) Two 4 + 3 + 3 tetrachords"},"segah2":{"frequencies":[261.6255653006,293.66476791741,318.39923223688,349.22823143301,391.99543598175,425.01198472693,466.16376151809,523.2511306012],"description":"Iranian mode Segah from C"},"segah_rat":{"frequencies":[261.6255653006,294.32876096318,319.76457981184,348.83408706747,392.4383479509,441.49314144476,479.64686971777,523.2511306012],"description":"Rationalized Arabic Seg�h\r"},"seidel974":{"frequencies":[261.6255653006,262.64754016506,266.73543962288,267.75741448733,268.77938935179,273.88926367407,274.91123853852,276.95518826743,277.97716313189,280.0211128608,283.08703745416,284.10901231862,285.13098718308,287.17493691199,289.2188866409,290.24086150535,294.32876096318,457.84473927605,461.93263873387,463.97658846278,468.0644879206,474.19633710734,476.24028683625,482.37213602298,486.4600354808,488.50398520971,492.59188466754,498.72373385427,506.89953276991,513.03138195665,515.07533168556,519.16323114338,523.2511306012],"description":"Dave Seidel, Base 9:7:4 Symmetry, scale for Passacaglia and Fugue State (2005)"},"seikilos":{"frequencies":[261.6255653006,271.31540105247,294.32876096318,305.22982618403,336.37572681506,348.83408706747,356.10146388137,392.4383479509,406.97310157871,441.49314144476,457.84473927605,504.56359022259,523.2511306012],"description":"Seikilos Tuning"},"sekati1":{"frequencies":[261.6255653006,285.2147362526,318.99014578736,340.97107458785,383.86043226246,424.60539155549,468.56721805116,523.2511306012],"description":"Gamelan sekati from Sumenep, East-Madura. 1/1=244 Hz."},"sekati2":{"frequencies":[261.6255653006,288.87830434024,317.34219433319,357.31261688157,393.64955765984,420.29657220667,469.35141988267,523.2511306012],"description":"Gamelan Kyahi Sepuh from kraton Solo. 1/1=216 Hz."},"sekati3":{"frequencies":[261.6255653006,291.90272733088,308.20569577938,369.53649673407,403.69531865382,425.43272843735,475.11832680028,523.2511306012],"description":"Gamelan Kyahi Henem from kraton Solo. 1/1=168.5 Hz."},"sekati4":{"frequencies":[261.6255653006,271.36353278789,288.89182053123,342.12578909252,379.12979967788,410.29128883625,439.50493264224,523.2511306012],"description":"Gamelan Kyahi Guntur madu from kraton Jogya. 1/1=201.5 Hz."},"sekati5":{"frequencies":[261.6255653006,274.79663866182,311.31645994273,355.61927540077,375.97459751383,397.52718524897,433.44837981883,523.2511306012],"description":"Gamelan Kyahi Naga Ilaga from kraton Jogya. 1/1=218.5 Hz."},"sekati6":{"frequencies":[261.6255653006,284.57524936299,310.80330758934,358.01400474517,390.79902205709,427.51850178351,468.18764285778,523.2511306012],"description":"Gamelan Kyahi Munggang from Paku Alaman, Jogya. 1/1=199.5 Hz."},"sekati7":{"frequencies":[261.6255653006,286.67481979642,318.21831168293,371.10013445627,390.58282835584,422.12643845206,463.87524473877,523.2511306012],"description":"Gamelan of Sultan Anom from Cheribon. 1/1=282 Hz."},"sekati8":{"frequencies":[261.6255653006,287.04067548259,315.94410704802,350.82750428678,381.72407804086,425.57749367468,447.5043967797,523.2511306012],"description":"The old Sultans-gamelan Kyahi Suka rame from Banten. 1/1=262.5 Hz."},"sekati9":{"frequencies":[261.6255653006,280.44107893528,310.90439774384,346.74342440827,376.31071188751,412.14996063869,455.1567650372,523.2511306012],"description":"Gamelan Sekati from Katjerbonan, Cheribon. 1/1=292 Hz."},"selisir":{"frequencies":[261.6255653006,278.78833362316,320.24370022528,380.8360868427,417.71053321823,524.76452349887],"description":"Gamelan semara pagulingan, Bali. Pagan Kelod"},"selisir2":{"frequencies":[261.6255653006,279.59466973861,299.66214729245,376.46181130035,408.17001145418,520.23742585195],"description":"Gamelan semara pagulingan, Bali. Kamasan"},"selisir3":{"frequencies":[261.6255653006,284.98499077387,305.5412851438,378.42269266694,406.45400323486,523.2511306012],"description":"Gamelan gong, Pliatan, Bali. 1/1=280 Hz, McPhee, 1966"},"selisir4":{"frequencies":[261.6255653006,277.23130136276,295.59098907682,376.373620257,399.32323124828,523.2511306012],"description":"Gamelan gong, Apuan, Bali. 1/1=285 Hz. McPhee, 1966"},"selisir5":{"frequencies":[261.6255653006,275.89605068063,309.19384990071,383.40037296022,406.23315014465,523.2511306012],"description":"Gamelan gong, Sayan, Bali. 1/1=275 Hz. McPhee, 1966"},"selisir6":{"frequencies":[261.6255653006,282.63199755101,312.23197007902,396.25769882774,415.35445602102,523.2511306012],"description":"Gamelan gong, Gianyar, Bali. 1/1=274 Hz. McPhee, 1966"},"semipor1":{"frequencies":[261.6255653006,290.69507255622,313.95067836072,327.03195662575,353.19451315581,392.4383479509,436.04260883433,470.92601754108,523.2511306012],"description":"First 16/15&250/243 = 648/625&250/243 scale"},"semisixths":{"frequencies":[261.6255653006,264.19830736984,270.23055453212,272.88791531122,275.57140613391,281.86332858923,284.63508234504,291.13394747727,293.99686553194,300.70948316519,303.66656221886,306.65272199551,313.65430163898,316.7386758187,323.97054074552,327.15636145846,330.37351240232,337.91669168384,341.23965429995,349.03093233441,352.46319080675,360.51072564419,364.05587272954,367.63587953306,376.02984347246,379.72760059524,388.39764380609,392.21702191873,396.07395857323,405.11722624758,409.10101938242,418.44172684717,422.55654641528,426.71183224275,436.45463212963,440.74658728358,450.80983509489,455.24295209046,465.63718490681,470.21611194415,474.84006394159,485.68174342829,490.45777940536,501.656046885,506.58917188228,511.57080469686,523.2511306012],"description":"Semisixths temperament, 13-limit, g=443.0"},"scalamakesrc2\\semisixths_8":{"frequencies":[261.6255653006,282.20554108354,304.40437778605,337.94858305883,364.53227585368,393.20709362444,436.53702313055,470.87587163898,522.76460573117],"description":"8-note MOS of Semisixths [7, 9, 13, -2, 1, 5] temperament, TOP tuning"},"semisuper":{"frequencies":[261.6255653006,267.78942821112,272.60119889127,277.49943141001,284.03728045772,289.141002119,295.95312328758,301.27095467792,308.36885759663,313.90977919898,321.30545111289,327.07882560827,334.78475653951,340.80033382945,348.82954357113,355.09748450744,363.46353108469,369.99442271164,378.7114412363,385.5163125912,392.44345945086,401.68937424288,408.90712663484,418.54092077997,426.06147005461,436.09942062666,443.93546710474,454.39452662825,462.55931114028,473.45714317395,481.96445416288,493.31947147471,502.18367855499,514.01505508798,523.2511306012],"description":"Semisuper temperament, g=71.146064, p=600, 5-limit"},"semithirds":{"frequencies":[13.75,13.81661017188,13.90316796691,13.99026794524,14.07791366516,14.14611237417,14.23473442257,14.3239115844,14.41364750281,14.48347263281,14.57420816344,14.665512046,14.73655738771,14.82887834882,14.92177776458,15.01525908647,15.08799873642,15.18252139242,15.27763629821,15.37334698758,15.4478213521,15.54459820959,15.64198144101,15.73997475533,15.81622511342,15.91530993122,16.01501558389,16.11534586889,16.19341466585,16.29486248479,16.39694594444,16.47637891809,16.57959953527,16.68346670883,16.78798468204,16.86931199442,16.97499424439,17.08133847,17.18834901569,17.27161584349,17.37981843193,17.48869878298,17.59826134469,17.68351394199,17.7942969746,17.90577393328,18.01794937217,18.10523509614,18.21866011204,18.33279560295,18.42160666689,18.53701356879,18.6531435747,18.77000099922,18.86093005309,18.97908920954,19.09798871479,19.21763298632,19.3107305405,19.43170758802,19.55344264036,19.67594033402,19.77125798984,19.89512013023,20.01975835255,20.14517740386,20.24276822054,20.36958425827,20.49719488615,20.62560496443,20.72552315291,20.85536353332,20.98601745346,21.08768161561,21.21979095359,21.352727802,21.48649759166,21.59058626784,21.72584618454,21.86195334633,21.99891331359,22.10548432428,22.24396995552,22.38332303719,22.52354926226,22.63266180681,22.7744500803,22.91712649141,23.06069686887,23.17241155847,23.3175812365,23.46366023269,23.57732716458,23.72503340608,23.87366512928,24.02322785632,24.1396055475,24.29083432682,24.44301065897,24.59614033986,24.71529329517,24.87012861873,25.02593409262,25.18271565096,25.30471019771,25.46323807533,25.62275923969,25.78327976642,25.90818367164,26.07049216435,26.23381763196,26.36090411207,26.52604894185,26.69222821075,26.85944870765,26.98956598001,27.15864922771,27.32879158412,27.5],"description":"Semithirds temperament, g=193.199615, 5-limit"},"sensisynch19":{"frequencies":[261.6255653006,272.4389540986,281.73678149918,293.38139793239,303.39395317428,313.74821628003,326.71591476706,337.86611241253,351.83064080634,363.83795665907,376.25506171692,391.80626469239,405.17787315281,421.92450060765,436.32398762558,454.35793210906,469.86431365505,485.89989602801,505.98288939536,523.2511306012],"description":"Sensi[19] in synch (brat=-1) tuning, generator ~162/125 satisfies g^9-g^7-4=0"},"serre_enh":{"frequencies":[261.6255653006,265.7783520514,279.06726965397,348.83408706747,392.4383479509,398.6675280771,418.60090448096,523.2511306012],"description":"Dorian mode of the Serre's Enharmonic"},"sev-elev":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,305.22982618403,327.03195662575,336.37572681506,359.73515228832,392.4383479509,406.97310157871,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"\"Seven-Eleven Blues\" of Pitch Palette"},"sha":{"frequencies":[261.6255653006,266.96486255163,280.31310567921,284.82183961519,290.63452941521,294.32876096318,300.33547037059,305.16625703708,320.42456924675,326.96384715385,343.31203882349,348.83408706747,355.95315006884,373.75080757229,392.4383479509,400.44729382745,406.8883429195,420.46965851882,427.23275920923,435.9517939049,457.74938532681,480.63685362987,490.44577048562,498.33441009638,523.2511306012],"description":"Three chains of sqrt(3/2) separated by 10/7"},"shahin":{"frequencies":[261.6255653006,277.01530443593,282.55561052465,294.32876096318,310.50067090621,317.47821407264,328.55303549378,348.83408706747,357.66532977804,371.78369805875,376.74081403286,392.4383479509,415.52295665389,428.11456140098,441.49314144476,463.20591889287,478.90781444856,495.71159741166,523.2511306012],"description":"Mohajeri Shahin Iranian style scale, TL 9-4-2006"},"shahin_wt":{"frequencies":[261.6255653006,276.93928561067,294.25491037444,311.47852302926,329.62755691287,348.92163548373,370.73795561568,392.4383479509,415.30469757995,439.61371330969,467.10055427519,494.44133512215,523.2511306012],"description":"Mohajeri Shahin, well temperament, TL 28-12-2006"},"shalfun":{"frequencies":[261.6255653006,269.43930514995,277.46904793785,285.74220762407,294.32876096318,302.80736724606,311.45900631024,320.30554027987,329.50323085718,338.98103822311,348.83408706747,359.12912189513,369.78878487717,380.87868001252,392.4383479509,404.24222079821,416.2697936366,428.68354137408,441.49314144476,454.4477424016,467.68960547122,481.19471271032,494.94053216156,508.90014647073,523.2511306012],"description":"d'Erlanger vol.5, p.40. After Alexandre ^Salfun (Chalfoun)"},"sharm1c-conm":{"frequencies":[261.6255653006,305.22982618403,318.50068819203,332.97799220076,406.97310157871,430.91269578922,457.84473927605,523.2511306012],"description":"Subharm1C-ConMixolydian"},"sharm1c-conp":{"frequencies":[261.6255653006,313.95067836072,330.47439827444,348.83408706747,418.60090448096,448.50096908674,483.00104363188,523.2511306012],"description":"Subharm1C-ConPhryg"},"sharm1c-dor":{"frequencies":[261.6255653006,319.76457981184,338.57426097725,359.73515228832,383.71749577421,411.12588832951,479.64686971777,547.03527290125,523.2511306012],"description":"Subharm1C-Dorian"},"sharm1c-lyd":{"frequencies":[261.6255653006,309.19384990071,323.91736656265,340.11323489078,382.37582620857,377.90359432309,485.87604984397,503.87145909745,523.2511306012],"description":"Subharm1C-Lydian"},"sharm1c-mix":{"frequencies":[261.6255653006,305.22982618403,318.50068819203,332.97799220076,366.27579142084,457.84473927605,488.36772189445,523.2511306012],"description":"Subharm1C-Mixolydian"},"sharm1c-phr":{"frequencies":[261.6255653006,313.95067836072,330.47439827444,348.83408706747,392.4383479509,483.00104363188,502.32108537715,523.2511306012],"description":"Subharm1C-Phrygian"},"sharm1e-conm":{"frequencies":[261.6255653006,318.50068819203,325.57848126297,332.97799220076,430.91269578922,443.97065626768,457.84473927605,523.2511306012],"description":"Subharm1E-ConMixolydian"},"sharm1e-conp":{"frequencies":[261.6255653006,330.47439827444,339.40613876835,348.83408706747,448.50096908674,465.11211608996,483.00104363188,523.2511306012],"description":"Subharm1E-ConPhrygian"},"sharm1e-dor":{"frequencies":[261.6255653006,338.57426097725,348.83408706747,359.73515228832,383.71749577421,411.12588832951,500.50108144463,511.62332769895,523.2511306012],"description":"Subharm1E-Dorian"},"sharm1e-lyd":{"frequencies":[261.6255653006,323.91736656265,331.81779013735,340.11323489078,382.37582620857,377.90359432309,503.87145909745,513.37846775967,523.2511306012],"description":"Subharm1E-Lydian"},"sharm1e-mix":{"frequencies":[261.6255653006,318.50068819203,325.57848126297,332.97799220076,366.27579142084,488.36772189445,505.20798816668,523.2511306012],"description":"Subharm1E-Mixolydian"},"sharm1e-phr":{"frequencies":[261.6255653006,330.47439827444,339.40613876835,348.83408706747,392.4383479509,502.32108537715,512.57253609913,523.2511306012],"description":"Subharm1E-Phrygian"},"sharm2c-15":{"frequencies":[261.6255653006,327.03195662575,341.25073734861,356.76213450082,392.4383479509,461.69217405988,490.54793493862,523.2511306012],"description":"Subharm2C-15-Harmonia"},"sharm2c-hypod":{"frequencies":[261.6255653006,322.00069575458,334.88072358477,348.83408706747,364.00078650518,380.54627680087,465.11211608996,492.47165233054,523.2511306012],"description":"SHarm2C-Hypodorian"},"sharm2c-hypol":{"frequencies":[261.6255653006,307.79478270659,327.03195662575,348.83408706747,373.75080757229,402.50086969323,475.68284600109,498.33441009638,523.2511306012],"description":"SHarm2C-Hypolydian"},"sharm2c-hypop":{"frequencies":[261.6255653006,336.37572681506,348.83408706747,362.25078272391,376.74081403286,392.4383479509,470.92601754108,495.71159741166,523.2511306012],"description":"SHarm2C-Hypophrygian"},"sharm2e-15":{"frequencies":[261.6255653006,341.25073734861,348.83408706747,356.76213450082,392.4383479509,490.54793493862,506.37206187213,523.2511306012],"description":"Subharm2E-15-Harmonia"},"sharm2e-hypod":{"frequencies":[261.6255653006,334.88072358477,341.71502406609,348.83408706747,364.00078650518,380.54627680087,492.47165233054,507.3950357345,523.2511306012],"description":"SHarm2E-Hypodorian"},"sharm2e-hypol":{"frequencies":[261.6255653006,327.03195662575,337.58137458142,348.83408706747,373.75080757229,402.50086969323,498.33441009638,510.48890790361,523.2511306012],"description":"SHarm2E-Hypolydian"},"sharm2e-hypop":{"frequencies":[261.6255653006,348.83408706747,355.41586229515,362.25078272391,376.74081403286,392.4383479509,495.71159741166,509.10920815252,523.2511306012],"description":"SHarm2E-Hypophrygian"},"sherwood":{"frequencies":[261.6255653006,279.50101530337,292.73346657716,312.73435005323,327.54017122074,349.91920725962,366.48547573919,391.52543233055,418.27599117656,438.07873640926,468.01000025525,490.16733894289,523.65750116998],"description":"Sherwood's improved meantone temperament"},"shrutar":{"frequencies":[261.6255653006,269.80136421624,277.49581689502,285.40970760065,294.32876096318,304.37698984459,313.95067836072,327.03195662575,336.37572681506,348.83408706747,359.73515228832,368.95121675679,379.48299988042,392.4383479509,405.83598431812,417.42065019394,428.11456140098,441.49314144476,457.84473927605,470.92601754108,490.54793493862,505.97733342682,523.2511306012],"description":"Paul Erlich's Shrutar tuning (from 9th fret) tempered with Dave Keenan"},"shrutar_temp":{"frequencies":[261.6255653006,269.67683152447,277.97586744827,286.53029793775,295.34798250635,304.4370214407,313.80576690868,327.74897996102,337.83512841993,348.23166805304,358.94815083964,369.99442271164,381.38063259971,393.11724175776,405.21503337437,417.68512248001,430.53896367224,443.78837151315,463.50705251482,477.77102045752,492.47394780842,507.62934310616,523.2511306012],"description":"Shrutar temperament, 11-limit, g=52.474, 1/2 oct."},"shrutart":{"frequencies":[261.6255653006,269.83675183105,278.27349931787,286.14641333958,294.32706056425,305.2349557921,313.94319125793,327.02936607233,337.2932679302,348.82502010853,358.79758764604,369.99442271164,381.540672377,392.44854854484,405.86600994967,418.6042204156,436.0530078362,448.49343183014,465.11480315564,478.41198231361,491.94721442498,507.32849364948,523.2511306012],"description":"Paul Erlich's 'Shrutar' tuning tempered by Dave Keenan, TL 29-12-2000"},"siamese":{"frequencies":[261.6255653006,269.26067151764,288.95340229325,296.22023396764,319.13574119147,352.26720984209,362.5475414329,388.79334481031,400.18585940536,429.40436513853,443.77760270734,473.98350631811,523.2511306012],"description":"Siamese Tuning, after Clem Fortuna's Microtonal Guide"},"silbermann1":{"frequencies":[261.6255653006,275.15551885617,293.66476791741,312.53552595124,327.77163799145,349.82028288879,367.9112241576,391.99543598175,411.56972129721,438.75957425603,467.74568907204,491.10256480205,523.2511306012],"description":"Gottfried Silbermann's temperament nr. 1"},"silbermann2":{"frequencies":[261.6255653006,275.00020270933,293.00227310437,312.18279369479,328.14198392915,349.6228209638,367.49599295996,391.5530240856,411.56972129721,438.51190905657,467.21778431035,491.10256480205,523.2511306012],"description":"Gottfried Silbermann's temperament nr. 2, 1/6 Pyth. comma meantone"},"silbermann2a":{"frequencies":[261.6255653006,275.00020270933,293.00227310437,310.77584116741,328.14198392915,349.6228209638,367.49599295996,391.5530240856,411.56972129721,438.51190905657,467.21778431035,491.10256480205,523.2511306012],"description":"Modified Silbermann's temperament nr. 2, also used by Hinsz in Midwolda"},"silver":{"frequencies":[261.6255653006,277.18807786937,293.58315284916,311.09098010692,329.53543886896,349.23174545031,369.98176232374,391.84186131702,415.18563115404,439.77824302677,466.03998256716,493.70667148145,523.2511306012],"description":"Equal beating chromatic scale, A.L.Leigh Silver JASA 29/4, 476-481, 1957"},"silver_10":{"frequencies":[261.6255653006,270.26884019355,294.27266239927,320.41022551991,330.99364634362,360.39280035711,392.40094712608,405.36462386145,441.36692569059,480.56953386201,523.2511306012],"description":"Ten-tone MOS from 350.9 cents"},"silver_11":{"frequencies":[261.6255653006,277.73657748574,294.83971256733,315.81001885226,335.25773244276,355.90304440354,381.21644531515,404.69191411574,429.61301214396,460.16899244324,488.50639225338,523.2511306012],"description":"Eleven-tone MOS from 1+sqr(2), 1525.864 cents"},"silver_11a":{"frequencies":[261.6255653006,272.21316796874,283.22923537857,314.22802528801,326.94437231289,340.17533123945,377.40674067136,392.67983758722,408.5710143206,453.28817432381,471.63208149661,523.2511306012],"description":"Eleven-tone MOS from 317.17 cents"},"silver_11b":{"frequencies":[261.6255653006,281.48899567641,302.85877036442,316.87090334834,340.92873240472,366.81310701257,383.78194911277,412.91987382947,444.27004083312,464.82473992747,500.11279777071,523.2511306012],"description":"Eleven-tone MOS from 331.67 cents"},"silver_7":{"frequencies":[261.6255653006,277.73649727228,315.81000061035,335.2576162513,381.21640127531,404.69175048432,460.16888612163,523.2511306012],"description":"Seven-tone MOS from 1+sqr(2), 1525.864 cents"},"silver_8":{"frequencies":[261.6255653006,288.49477506296,306.46277751246,337.93681424842,358.98416079003,395.852196628,420.50662316693,492.57276348379,523.2511306012],"description":"Eight-tone MOS from 273.85 cents"},"silver_9":{"frequencies":[261.6255653006,294.18258755347,307.6617709921,345.94759796409,361.79860795042,406.82129262791,425.46148093979,478.40645551359,500.32661205896,523.2511306012],"description":"Nine-tone MOS from 280.61 cents"},"silvermean":{"frequencies":[261.6255653006,286.15296204753,327.03195662575,345.42750418595,392.4383479509,416.96574469783,474.19633710734,523.2511306012],"description":"First 6 approximants to the Silver Mean, 1+ sqr(2) reduced by 2/1"},"simonton":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,348.83408706747,370.63621750918,392.4383479509,414.24047839262,436.04260883433,465.11211608996,494.18162334558,523.2511306012],"description":"Simonton Integral Ratio Scale, JASA 25/6 (1953): A new integral ratio scale"},"sims":{"frequencies":[261.6255653006,272.52663052146,283.42769574232,294.32876096318,305.22982618403,316.13089140489,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,408.78994578219,425.14154361347,441.49314144476,457.84473927605,474.19633710734,490.54793493862,506.89953276991,523.2511306012],"description":"Ezra Sims' 18-tone mode"},"sims2":{"frequencies":[261.6255653006,269.80136421624,277.97716313189,286.15296204753,294.32876096318,302.50455987882,310.68035879446,318.85615771011,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,408.78994578219,425.14154361347,441.49314144476,457.84473927605,474.19633710734,490.54793493862,506.89953276991,523.2511306012],"description":"Sims II"},"sims_24":{"frequencies":[261.6255653006,269.80136421624,272.52663052146,277.97716313189,283.42769574232,286.15296204753,294.32876096318,302.50455987882,305.22982618403,310.68035879446,316.13089140489,318.85615771011,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,408.78994578219,425.14154361347,441.49314144476,457.84473927605,474.19633710734,490.54793493862,506.89953276991,523.2511306012],"description":"See his article, Reflections on This and That, 1991 p.93-106"},"sin":{"frequencies":[261.6255653006,275.08939827539,302.09917071192,334.63165645627,369.99442271164,407.01712569342,445.10399729103,483.9175316883,523.2511306012,562.97086325858,602.98541169118,643.23087116255,683.66056756853,724.23972686276,764.94197926416,805.74682982871,846.63811574624,887.6028851904,928.63083777952,969.71346974542,1010.84345850104,1052.01529432917],"description":"1/sin(2pi/n), n=4..25"},"sinemod12":{"frequencies":[261.6255653006,270.6035983646,282.0485507085,292.16840832754,301.82804372114,314.42520179993,326.24260278214,336.76433478807,350.4641458176,364.21811789193,375.86233664064,390.61306119732,406.50371126161,419.61372202861,435.38454314112,453.55584308858,468.551249676,485.36279478778,505.89080731022,523.2511306012],"description":"Sine modulated F=12, A=-.08203754"},"sinemod8":{"frequencies":[261.6255653006,272.43905323978,281.98404270447,290.99567087708,301.68076007415,314.40050256998,326.99158834066,337.97331861211,348.96407538813,362.38276875396,377.76595534172,392.29216556304,405.04934945717,418.6525822649,435.418746849,453.77727371169,470.43955130022,485.47382867757,502.48255971303,523.2511306012],"description":"Sine modulated F=8, A=.11364155. Deviation minimal3/2, 4/3, 5/4, 6/5, 5/3, 8/5"},"singapore":{"frequencies":[261.6255653006,291.46787011619,321.35550581422,354.51258839996,385.70651737906,428.95813651779,462.1422075194,523.2511306012],"description":"An observed xylophone tuning from Singapore"},"sintemp6":{"frequencies":[261.6255653006,277.18263097687,292.42974339757,312.08834713741,327.870830746,349.91196330865,369.15973155124,391.11111150212,416.11779639122,437.6550518996,467.60417912673,491.80624587316,523.2511306012],"description":"Sine modulated fifths, A=1/6 Pyth, one cycle, f0=-90 degrees"},"sintemp6a":{"frequencies":[261.6255653006,276.17281343288,293.21211353711,310.64741311165,328.42667470471,349.22823143301,368.43838932195,391.77416758435,414.19655102258,438.82595961933,465.90062756558,491.80624587316,523.2511306012],"description":"Sine modulated fifths, A=1/12 Pyth, one cycle, f0= D-A"},"sintemp_19":{"frequencies":[261.6255653006,272.86445838226,281.30973389888,292.50627485027,304.14845459111,313.56198179795,327.03195662575,338.65502209741,350.02113164026,365.30494475029,376.98581738134,391.19763056219,407.47965586966,419.94695489748,437.42555500456,453.91586039553,468.43012697388,488.88431353627,505.29249383438,523.2511306012],"description":"Sine modulated thirds, A=7.366 cents, one cycle over fifths, f0=90 degrees"},"sintemp_7":{"frequencies":[261.6255653006,291.06608881088,319.67397341855,351.09362859375,390.60192440975,432.07134328681,473.03044489876,523.2511306012],"description":"Sine modulated fifths, A=8.12 cents, one cycle, f0=90 degrees"},"slen_pel":{"frequencies":[261.6255653006,261.6255653006,283.17034563789,298.45295203849,338.50336851425,364.68988616898,346.01554587335,389.06292924114,398.38689497567,420.13030572059,455.51656649021,493.31307433255,523.2511306012],"description":"Pelog white, Slendro black"},"slen_pel16":{"frequencies":[261.6255653006,261.6255653006,285.30470202322,285.30470202322,297.93622032612,311.12698372208,339.28638158975,386.37547528213,386.37547528213,403.48177901006,421.34544350737,440,523.2511306012],"description":"16-tET Slendro and Pelog"},"slen_pel23":{"frequencies":[261.6255653006,261.6255653006,295.14355885465,295.14355885465,286.38154466424,343.14246862785,313.47984535337,398.94762483098,398.94762483098,387.10394860926,450.05828708186,423.73315704439,523.2511306012],"description":"23-tET Slendro and Pelog"},"slen_pel_jc":{"frequencies":[261.6255653006,261.6255653006,299.00064605783,299.00064605783,279.06726965397,341.71502406609,348.83408706747,392.4383479509,392.4383479509,392.4383479509,448.50096908674,418.60090448096,523.2511306012],"description":"Slendro/JC PELOG S1c,P1c#,S2d,eb,P2e,S3f,P3f#,S4g,ab,P4a,S5bb,P5b"},"slen_pel_schmidt":{"frequencies":[261.6255653006,261.6255653006,294.32876096318,305.22982618403,327.03195662575,348.83408706747,359.73515228832,392.4383479509,392.4383479509,457.84473927605,457.84473927605,490.54793493862,523.2511306012],"description":"Dan Schmidt (Pelog white, Slendro black)"},"slendro":{"frequencies":[261.6255653006,298.45295203849,346.01554587335,398.38689497567,455.51656649021,523.2511306012],"description":"Observed Javanese Slendro scale, Helmholtz/Ellis p. 518, nr.94"},"slendro10":{"frequencies":[261.6255653006,304.21577360535,342.24274530602,391.67780832635,463.92905474816,523.2511306012],"description":"Low gender from Singaraja (banjar Lod Peken), Bali. 1/1=172 Hz. McPhee, 1966."},"slendro11":{"frequencies":[261.6255653006,299.11221417218,343.62760815601,387.36203100102,452.96366529656,523.2511306012],"description":"Low gender from Sawan, Bali. 1/1=167.5 Hz. McPhee, 1966."},"slendro2":{"frequencies":[261.6255653006,299.13295468097,343.58614396263,395.91119354826,450.08870388136,523.2511306012],"description":"Gamelan slendro from Ranchaiyuh, distr. Tanggerang, Batavia. 1/1=282.5 Hz"},"slendro3":{"frequencies":[261.6255653006,298.44694115772,339.14425131559,391.46936437571,453.48431318771,522.28214737536],"description":"Gamelan kodok ngorek. 1/1=270 Hz"},"slendro4":{"frequencies":[261.6255653006,294.5074669504,344.54514337401,400.3014113889,467.49486258632,523.2511306012],"description":"Low gender in saih lima from Kuta, Bali. 1/1=183 Hz. McPhee, 1966"},"slendro5_1":{"frequencies":[261.6255653006,299.00064605783,336.37572681506,392.4383479509,448.50096908674,523.2511306012],"description":"A slendro type pentatonic which is based on intervals of 7; from Lou Harrison"},"slendro5_2":{"frequencies":[261.6255653006,305.22982618403,348.83408706747,392.4383479509,457.84473927605,523.2511306012],"description":"A slendro type pentatonic which is based on intervals of 7, no. 2"},"slendro5_4":{"frequencies":[261.6255653006,294.32876096318,348.83408706747,392.4383479509,448.50096908674,523.2511306012],"description":"A slendro type pentatonic which is based on intervals of 7, no. 4"},"slendro6":{"frequencies":[261.6255653006,295.05549864457,341.56671025356,398.25224940202,461.478427683,523.2511306012],"description":"Low gender from Klandis, Bali. 1/1=180 Hz. McPhee, 1966"},"slendro8":{"frequencies":[261.6255653006,309.85821141747,350.78288084997,406.32350365121,467.71050779996,523.2511306012],"description":"Low gender from Tabanan, Bali. 1/1=179 Hz. McPhee, 1966."},"slendro9":{"frequencies":[261.6255653006,299.00064605783,336.37572681506,388.70083987518,448.50096908674,523.2511306012],"description":"Low gender from Singaraja (banjar Panataran), Bali. 1/1=175 Hz. McPhee, 1966."},"slendro_7_1":{"frequencies":[261.6255653006,299.00064605783,341.71502406609,392.4383479509,448.50096908674,523.2511306012],"description":"Septimal Slendro 1, From HMSL Manual, also Lou Harrison, Jacques Dudon"},"slendro_7_2":{"frequencies":[261.6255653006,294.32876096318,343.38355445704,392.4383479509,448.50096908674,523.2511306012],"description":"Septimal Slendro 2, From Lou Harrison, Jacques Dudon's APTOS"},"slendro_7_3":{"frequencies":[261.6255653006,294.32876096318,336.37572681506,392.4383479509,448.50096908674,523.2511306012],"description":"Septimal Slendro 3, Harrison, Dudon, called \"MILLS\" after Mills Gamelan"},"slendro_7_4":{"frequencies":[261.6255653006,294.32876096318,343.38355445704,392.4383479509,457.84473927605,523.2511306012],"description":"Septimal Slendro 4, from Lou Harrison, Jacques Dudon, called \"NAT\""},"slendro_7_5":{"frequencies":[261.6255653006,305.22982618403,343.38355445704,400.61414686654,467.3831713443,523.2511306012],"description":"Septimal Slendro 5, from Jacques Dudon"},"slendro_7_6":{"frequencies":[261.6255653006,299.00064605783,341.71502406609,390.53145607553,455.62003208812,523.2511306012],"description":"Septimal Slendro 6, from Robert Walker"},"slendro_a1":{"frequencies":[261.6255653006,299.00064605783,348.83408706747,392.4383479509,457.84473927605,523.2511306012],"description":"Dudon's Slendro A1, \"Seven-Limit Slendro Mutations\", 1/1 8:2'94 hexany 1.3.7.21"},"slendro_a2":{"frequencies":[261.6255653006,299.00064605783,341.71502406609,398.6675280771,448.50096908674,523.2511306012],"description":"Dudon's Slendro A2 from \"Seven-Limit Slendro Mutations\", 1/1 8:2 Jan 1994"},"slendro_alv":{"frequencies":[261.6255653006,299.00064605783,348.83408706747,406.97310157871,465.11211608996,523.2511306012],"description":"Bill Alves, slendro for Gender Barung, 1/1 vol.9 no.4, 1997. 1/1=282.86"},"slendro_ang":{"frequencies":[261.6255653006,299.00064605783,340.82516392797,388.43396508487,445.83123341082,523.2511306012],"description":"Gamelan Angklung Sangsit, North Bali. 1/1=294 Hz"},"slendro_av":{"frequencies":[261.6255653006,298.97057995496,344.02264297658,395.86362945285,454.20288100724,525.67465946865],"description":"Average of 30 measured slendro gamelans, W. Surjodiningrat et al., 1993."},"slendro_dudon":{"frequencies":[261.6255653006,305.22982618403,348.83408706747,399.70572476481,457.84473927605,523.2511306012],"description":"Dudon's Slendro from \"Fleurs de lumie`re\""},"slendro_gum":{"frequencies":[261.6255653006,305.03156112838,348.43777142572,394.8168394034,470.92601754108,525.62941881859],"description":"Gumbeng, bamboo idiochord from Banyumas. 1/1=440 Hz"},"slendro_ky1":{"frequencies":[261.6255653006,297.58776037991,344.33874539242,394.68595744625,449.52853279627,523.2511306012],"description":"Kyahi Kanyut Me`sem slendro, Mangku Nagaran, Solo. 1/1=291 Hz"},"slendro_ky2":{"frequencies":[261.6255653006,302.42139140287,345.87786599062,395.54249276388,453.1886900261,523.2511306012],"description":"Kyahi Pengawe' sari, Paku Alaman, Jogya. 1/1=295 Hz"},"slendro_laras":{"frequencies":[261.6255653006,299.00064605783,348.83408706747,392.4383479509,448.50096908674,523.2511306012,598.00129211566,697.66817413493],"description":"Lou Harrison, gamelan \"Si Betty\""},"slendro_m":{"frequencies":[261.6255653006,299.00064605783,348.83408706747,392.4383479509,448.50096908674,523.2511306012],"description":"Dudon's Slendro M from \"Seven-Limit Slendro Mutations\", 1/1 8:2 Jan 1994"},"slendro_madu":{"frequencies":[261.6255653006,300.52885648597,345.61604384578,394.49404533893,447.94973572445,522.94897617031],"description":"Sultan's gamelan Madoe kentir, Jogjakarta, Jaap Kunst"},"slendro_mat":{"frequencies":[261.6255653006,261.6255653006,299.00064605783,299.00064605783,341.71502406609,343.38355445704,348.83408706747,392.4383479509,398.6675280771,448.50096908674,455.62003208812,457.84473927605,523.2511306012],"description":"Dudon's Slendro Matrix from \"Seven-Limit Slendro Mutations\", 1/1 8:2 Jan 1994"},"slendro_pa":{"frequencies":[261.6255653006,304.19649364034,353.69443592699,411.24653512154,478.16333951147,523.2511306012],"description":"\"Blown fifth\" primitive slendro, von Hornbostel"},"slendro_pas":{"frequencies":[261.6255653006,300.35531433711,343.03050002254,393.12919962609,450.54468214486,523.2511306012],"description":"Gamelan slendro of regent of Pasoeroean, Jaap Kunst"},"slendro_pb":{"frequencies":[261.6255653006,304.72408298441,342.83241505062,399.30842833955,449.24533531117,523.2511306012],"description":"\"Blown fifth\" medium slendro, von Hornbostel"},"slendro_pc":{"frequencies":[261.6255653006,299.48910562989,342.83241505062,392.44854854484,449.24533531117,523.2511306012],"description":"\"Blown fifth\" modern slendro, von Hornbostel"},"slendro_pliat":{"frequencies":[261.6255653006,299.73468146833,339.98478643783,393.08060743874,447.03290350508,523.2511306012,599.46936293666,679.96957287566,786.16121487749,894.06580701017],"description":"Gender wayang from Pliatan, South Bali (Slendro), 1/1=305.5 Hz"},"slendro_q13":{"frequencies":[261.6255653006,307.00725675226,360.2608752926,400.8015646157,470.32478922042,523.2511306012],"description":"13-tET quasi slendro, Blackwood"},"slendro_s1":{"frequencies":[261.6255653006,299.00064605783,348.83408706747,398.6675280771,457.84473927605,523.2511306012],"description":"Dudon's Slendro S1 from \"Seven-Limit Slendro Mutations\", 1/1 8:2 Jan 1994"},"slendro_s2":{"frequencies":[261.6255653006,299.00064605783,341.71502406609,398.6675280771,455.62003208812,523.2511306012],"description":"Dudon's Slendro S2"},"slendro_udan":{"frequencies":[261.6255653006,305.22982618403,351.32575911795,402.50086969323,465.11211608996,523.2511306012],"description":"Slendro Udan Mas (approx)"},"slendro_wolf":{"frequencies":[261.6255653006,298.18866107946,339.86157848985,395.0032340925,450.20632964813,523.2511306012],"description":"Daniel Wolf's slendro. Tuning List 30 5 1997"},"slendrob1":{"frequencies":[261.6255653006,307.44024341205,355.66611281954,409.9203247543,476.83364134848,523.2511306012],"description":"Gamelan miring of Musadikrama, desa Katur, Bajanegara. 1/1=434 Hz"},"slendrob2":{"frequencies":[261.6255653006,307.55978097874,346.50416420081,398.42969909174,449.35693171058,523.2511306012],"description":"Gamelan miring from Bajanegara. 1/1=262 Hz"},"slendrob3":{"frequencies":[261.6255653006,304.90191053936,342.27700149692,398.33972372326,447.51732140012,523.2511306012],"description":"Gamelan miring from Ngumpak, Bajanegara. 1/1=266 Hz"},"slendroc1":{"frequencies":[261.6255653006,297.59222964268,344.42030317161,394.72197985873,449.50490455178,523.2511306012],"description":"Kyahi Kanyut mesem slendro (Mangku Nagaran Solo). 1/1=291 Hz"},"slendroc2":{"frequencies":[261.6255653006,302.44445076078,346.01554587335,396.09235530397,453.15466093696,523.2511306012],"description":"Kyahi Pengawe sari (Paku Alaman, Jogja). 1/1=295 Hz."},"slendroc3":{"frequencies":[261.6255653006,301.39807245198,344.42030317161,395.40657391157,451.84778706363,523.2511306012],"description":"Gamelan slendro of R.M. Jayadipura, Jogja. 1/1=231 Hz"},"slendroc4":{"frequencies":[261.6255653006,299.14332201883,343.8239850859,396.09235530397,450.28451247858,523.2511306012],"description":"Gamelan slendro, Rancha iyuh, Tanggerang, Batavia. 1/1=282.5 Hz"},"slendroc5":{"frequencies":[261.6255653006,299.83528893666,340.07120590121,393.12919962609,447.17417015401,523.2511306012],"description":"Gender wayang from Pliatan, South Bali. 1/1=611 Hz"},"slendroc6":{"frequencies":[261.6255653006,296.73398952435,343.8239850859,396.7793260952,453.9405988926,527.19506190947,607.33963549452,696.44215167899,797.23415748628,918.4302691641,1071.58188326661],"description":"from William Malm: Music Cultures of the Pacific, the Near East and Asia."},"slendrod1":{"frequencies":[261.6255653006,292.47977325983,340.6610152784,389.06292924114,444.85552088095,523.2511306012],"description":"Gender wayang from Ubud (S. Bali). 1/1=347 Hz"},"smith_eh":{"frequencies":[261.6255653006,272.7117507892,292.30354792656,313.30283124826,326.5788018031,350.04044239751,364.87314355143,391.08587539224,407.65784362321,436.94425707006,468.33462614046,488.17995458879,523.2511306012],"description":"Robert Smith's Equal Harmony temperament (1749)"},"smith_mq":{"frequencies":[261.6255653006,273.37438418823,292.50629623572,312.97714101186,327.03200500996,349.91910755601,365.63292511375,391.22148485648,408.79006910398,437.39894995248,468.01000388518,489.02693031834,523.2511306012],"description":"Robert Smith approximation of quarter comma meantone fifth"},"scalamakesrc2\\smithgw-ball":{"frequencies":[261.6255653006,267.07609791103,272.52663052146,274.70684356563,280.31310567921,286.15296204753,294.32876096318,300.46061014991,305.22982618403,306.59245933664,313.95067836072,320.49131749323,327.03195662575,333.84512238879,336.37572681506,343.38355445704,350.39138209902,357.69120255941,366.27579142084,367.91095120397,373.75080757229,381.53728273004,392.4383479509,400.61414686654,408.78994578219,412.06026534844,420.46965851882,429.2294430713,436.04260883433,448.50096908674,457.84473927605,467.18850946536,470.92601754108,476.92160341255,480.73697623985,490.54793493862,500.76768358318,515.07533168556,523.2511306012],"description":"Ball 2 around tetrad lattice hole"},"smithgw46":{"frequencies":[261.6255653006,273.72380653152,313.47993226845,327.97605323154,364.46098649856,392.98113253789,436.69740466987,456.89141950378,523.2511306012],"description":"Gene Ward Smith 46-tET subset \"Star\""},"smithgw46a":{"frequencies":[261.6255653006,282.09853500802,313.47993226845,327.97605323154,375.61187043063,392.98113253789,436.69740466987,470.87026054824,523.2511306012],"description":"46-tET version of \"Star\", alternative version"},"smithgw72a":{"frequencies":[261.6255653006,285.30470202322,299.37379946195,326.46944327063,342.56848033562,373.57357677338,391.99543598175,427.47405410759,435.78442404634,457.27406033445,498.66089874196,523.2511306012],"description":"Gene Ward Smith 72-tET subset, TL 04-01-2002"},"smithgw72c":{"frequencies":[261.6255653006,279.86396690685,305.19382000629,326.46944327063,349.22823143301,391.99543598175,419.32216217931,457.27406033445,489.15147723638,523.2511306012],"description":"Gene Ward Smith 72-tET subset, TL 04-01-2002"},"smithgw72d":{"frequencies":[261.6255653006,305.19382000629,326.46944327063,349.22823143301,366.44956000397,391.99543598175,419.32216217931,489.15147723638,523.2511306012],"description":"Gene Ward Smith 72-tET subset, TL 04-01-2002"},"smithgw72e":{"frequencies":[261.6255653006,279.86396690685,326.46944327063,349.22823143301,366.44956000397,391.99543598175,419.32216217931,489.15147723638,523.2511306012],"description":"Gene Ward Smith 72-tET subset, TL 04-01-2002"},"smithgw72f":{"frequencies":[261.6255653006,326.46944327063,349.22823143301,435.78442404634,466.16376151809,523.2511306012],"description":"Gene Ward Smith 72-tET subset, TL 04-01-2002"},"smithgw72g":{"frequencies":[261.6255653006,326.46944327063,349.22823143301,391.99543598175,419.32216217931,523.2511306012],"description":"Gene Ward Smith 72-tET subset, TL 04-01-2002"},"smithgw72h":{"frequencies":[261.6255653006,279.86396690685,314.13668154225,349.22823143301,391.99543598175,435.78442404634,489.15147723638,523.2511306012],"description":"Gene Ward Smith 72-tET subset, TL 09-01-2002"},"smithgw72i":{"frequencies":[261.6255653006,279.86396690685,293.66476791741,314.13668154225,326.46944327063,349.22823143301,366.44956000397,391.99543598175,419.32216217931,435.78442404634,470.6732130613,489.15147723638,523.2511306012],"description":"Gene Ward Smith 72-tET subset version of Duodene, TL 02-06-2002"},"smithgw72j":{"frequencies":[261.6255653006,274.52698453615,305.19382000629,326.46944327063,349.22823143301,366.44956000397,391.99543598175,435.78442404634,457.27406033445,489.15147723638,523.2511306012],"description":"{225/224, 441/440} tempering of decad, 72-et version (2002)"},"smithgw84":{"frequencies":[261.6255653006,286.48426603331,306.03443598155,335.11270457212,357.98136125932,391.99543598175,418.74586628806,458.53356119912,489.82466832727,523.2511306012],"description":"Gene Ward Smith 84-tET subset, 11-limit temperament \"Orwell\", 2002"},"smithgw_18":{"frequencies":[261.6255653006,272.52663052146,280.31310567921,286.15296204753,294.32876096318,306.59245933664,327.03195662575,343.38355445704,350.39138209902,367.91095120397,381.53728273004,392.4383479509,408.78994578219,420.46965851882,436.04260883433,457.84473927605,467.18850946536,490.54793493862,523.2511306012],"description":"Gene Ward Smith chord analogue to periodicity blocks, TL 12-07-2002"},"smithgw_21":{"frequencies":[261.6255653006,267.07609791103,280.31310567921,286.15296204753,299.00064605783,305.22982618403,320.49131749323,327.03195662575,343.38355445704,348.83408706747,366.27579142084,373.75080757229,392.4383479509,398.6675280771,418.60090448096,427.14378008261,448.50096908674,457.84473927605,478.40103369253,488.36772189445,512.57253609913,523.2511306012],"description":"Gene Ward Smith symmetrical 7-limit JI version of Blackjack, TL 10-5-2002"},"smithgw_45":{"frequencies":[261.6255653006,267.02002970726,269.13627541126,274.68560334708,276.86260193655,282.57123920205,288.39758300936,290.68325478745,296.67686217097,299.02814898089,305.19382000629,311.48661940174,313.95528147508,320.42873367481,322.96826575344,329.62755691287,336.42415617173,339.09045868095,346.08217376006,348.82502010853,356.01745236555,363.35818557229,366.23795155866,373.78942366597,376.75185941212,384.52011812375,392.44854854484,395.55886785613,403.71490654806,406.9145164708,415.30469757995,423.86787605389,427.22720671064,436.03621571368,439.49198556474,448.5538823653,457.80262665414,461.43090443914,470.94516310483,474.67759826036,484.46499093218,494.45418731234,498.37294408452,508.64890891624,512.68016480935,523.2511306012],"description":"Gene Ward Smith large limma repeating 5-tone MOS"},"smithgw_58":{"frequencies":[261.6255653006,264.89588486686,267.57160087561,269.80136421624,274.70684356563,279.06726965397,282.55561052465,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,301.49231810831,305.22982618403,310.07474405997,313.95067836072,317.12189733406,319.76457981184,323.76163705949,327.03195662575,332.97799220076,336.37572681506,340.54567384169,343.38355445704,348.83408706747,353.19451315581,356.76213450082,359.73515228832,366.27579142084,370.01329949656,373.75080757229,380.54627680087,383.71749577421,387.59343007496,392.4383479509,398.6675280771,401.98975747775,406.97310157871,411.12588832951,418.60090448096,423.83341578697,428.11456140098,431.68218274599,436.04260883433,441.49314144476,448.50096908674,452.23847716247,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,484.4917875937,490.54793493862,498.33441009638,507.3950357345,511.62332769895,516.79124009995,523.2511306012],"description":"Gene Ward Smith 58-tone epimorphic superset of Partch's 43-tone scale"},"smithgw_9":{"frequencies":[261.6255653006,279.06726965397,305.22982618403,327.03195662575,348.83408706747,392.4383479509,418.60090448096,448.50096908674,490.54793493862,523.2511306012],"description":"Gene Ward Smith \"Miracle-Magic square\" tuning, genus chromaticum of ji_12a"},"smithgw_al-baked":{"frequencies":[261.6255653006,277.59364499865,293.85651796007,311.0721560172,330.05816364769,349.39467974592,369.86402907174,392.4383479509,415.42941801053,439.76742419786,466.60823379256,493.94455998605,522.88238970142],"description":"Baked alaska, with beat ratios of 2 and 3/2"},"smithgw_al-fried":{"frequencies":[261.6255653006,277.00141553195,293.28091128458,310.96067952124,329.23597434237,348.58531822795,369.59898601143,391.32048195179,414.31855981944,439.29480556849,465.11235566178,492.44721175277,522.13326741512],"description":"Fried alaska, with octave-fifth brats of 1 and 2"},"smithgw_asbru":{"frequencies":[261.6255653006,275.52281548997,293.66476791741,313.00128725319,329.62755691287,351.33206601369,367.77883484915,391.99543598175,415.30469757995,440,468.97204376297,490.92584627687,523.2511306012],"description":"Modified bifrost (2003)"},"smithgw_bifrost":{"frequencies":[261.6255653006,275.07759559501,292.50627485027,311.03921839762,327.03195662575,349.91912034749,366.77012764335,391.22147055517,413.66634097248,437.39889945791,466.55882736321,489.02683710225,523.2511306012],"description":"Six meantone fifths, four pure, two of sqrt(2048/2025 sqrt(5))"},"smithgw_cauldron":{"frequencies":[261.6255653006,275.03056468741,291.83931845209,312.58541512404,325.54230007562,350.31873582686,364.83969341757,390.77519652096,414.65779561271,435.90375768372,469.07960710644,486.243977751,523.2511306012],"description":"Circulating temperament with two pure 9/7 thirds"},"smithgw_ck":{"frequencies":[195.99771799087,198.06437430898,200.15282320192,202.2632921446,203.72940721765,205.87758869102,208.04842120778,210.24214482145,211.76609376362,213.99901760782,216.25548480725,218.5357448459,220.11981156469,222.44081817627,224.78629944762,227.15651084977,228.80306427848,231.21563094,233.65363506284,235.34728316698,237.82885399313,240.33658984216,242.87076938222,244.63122826831,247.21069030843,249.81735238129,252.45149840587,254.28140507407,256.96262135434,259.67210915034,262.4101678886,264.31225911206,267.09924514556,269.91561641866,272.7616843206,274.73881033537,277.63573538138,280.56320805899,282.59688215652,285.57666497222,288.58786914203,291.63082264784,293.74472081062,296.84205135845,299.9720393359,303.13503255793,305.33231946532,308.55183127196,311.80529233825,315.09305703284,317.37702217863,320.72353853051,324.10533989702,327.52280172307,329.89686439088,333.37539375097,336.89059979959,339.33256534187,342.91058750208,346.52633537645,350.18021075922,352.71850659998,356.43767199462,360.19605541958,363.99406623991,366.6324923874,370.49837299068,374.40501441099,378.35285076765,381.09535716275,385.11373623244,389.17448849491,391.99543598174],"description":"Catakleismic temperament, g=316.745, 11-limit"},"smithgw_decab":{"frequencies":[261.6255653006,274.70684356563,293.02063313667,313.95067836072,348.83408706747,366.27579142084,392.4383479509,418.60090448096,439.53094970501,488.36772189445,523.2511306012],"description":"(10/9) <==> (16/15) transform of decaa"},"smithgw_decac":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,313.95067836072,348.83408706747,373.75080757229,392.4383479509,418.60090448096,448.50096908674,498.33441009638,523.2511306012],"description":"inversion of decaa"},"smithgw_decad":{"frequencies":[261.6255653006,280.31310567921,311.45900631024,327.03195662575,348.83408706747,373.75080757229,392.4383479509,436.04260883433,467.18850946536,498.33441009638,523.2511306012],"description":"inversion of decab"},"smithgw_diff13":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,299.00064605783,313.95067836072,320.35783506196,336.37572681506,406.97310157871,427.32175665765,436.04260883433,457.84473927605,488.36772189445,498.33441009638,523.2511306012],"description":"mod 13 perfect difference set, 7-limit"},"smithgw_dwarf6_7":{"frequencies":[261.6255653006,299.00064605783,327.03195662575,373.75080757229,392.4383479509,448.50096908674,523.2511306012],"description":"Dwarf(<6 10 14 17|)"},"smithgw_exotic1":{"frequencies":[261.6255653006,274.95996987324,293.39100498914,313.05750197389,327.96500300935,349.94905375768,367.78508905896,392.4383479509,411.12588832951,438.68435539504,468.09011223803,491.94750426812,523.2511306012],"description":"Exotic temperament featuring four pure 14/11 thirds and two pure fifths"},"smithgw_glumma":{"frequencies":[261.6255653006,269.10058145205,299.00064605783,313.95067836072,327.03195662575,358.80077526939,373.75080757229,392.4383479509,436.04260883433,448.50096908674,457.84473927605,512.57253609913,523.2511306012],"description":"Gene Smith's Glumma scale, 7-limit, 2002"},"smithgw_gm":{"frequencies":[261.6255653006,264.89588486686,269.80136421624,274.70684356563,279.06726965397,285.40970760065,290.69507255622,294.32876096318,299.00064605783,305.22982618403,310.07474405997,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,343.38355445704,348.83408706747,353.19451315581,359.73515228832,366.27579142084,373.75080757229,380.54627680087,387.59343007496,392.4383479509,398.6675280771,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,441.49314144476,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,490.54793493862,498.33441009638,507.3950357345,516.79124009995,523.2511306012],"description":"Gene Ward Smith \"Genesis Minus\" periodicity block"},"smithgw_graileq":{"frequencies":[261.6255653006,274.83794140225,293.02845982215,312.42294214419,328.20064112269,350.39711148969,365.67350481015,391.53226450123,414.40482204179,438.61355268439,469.63029662389,490.10494633744,523.2511306012],"description":"56% RMS grail + 44% JI grail"},"smithgw_grailrms":{"frequencies":[261.6255653006,274.64037495938,293.11160698959,312.82513967025,328.38692028068,350.6222941497,365.93760986436,391.94882001935,414.52240989365,438.39608269016,469.55771333591,490.068176414,523.2511306012],"description":"RMS optimized Holy Grail"},"smithgw_hahn12":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Hahn-reduced 12 note scale, Fokker block 225/224, 126/125, 64/63"},"smithgw_hahn15":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,373.75080757229,392.4383479509,418.60090448096,436.04260883433,457.84473927605,470.92601754108,490.54793493862,523.2511306012],"description":"Hahn-reduced 15 note scale"},"smithgw_hahn16":{"frequencies":[261.6255653006,280.31310567921,294.32876096318,299.00064605783,313.95067836072,327.03195662575,343.38355445704,348.83408706747,366.27579142084,392.4383479509,408.78994578219,418.60090448096,436.04260883433,457.84473927605,488.36772189445,490.54793493862,523.2511306012],"description":"Hahn-reduced 16 note scale"},"smithgw_hahn19":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,294.32876096318,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,366.27579142084,373.75080757229,392.4383479509,406.97310157871,418.60090448096,436.04260883433,457.84473927605,470.92601754108,490.54793493862,508.71637697339,523.2511306012],"description":"Hahn-reduced 19 note scale"},"smithgw_hahn22":{"frequencies":[261.6255653006,272.52663052146,280.31310567921,290.69507255622,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,363.36884069528,366.27579142084,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,490.54793493862,508.71637697339,523.2511306012],"description":"Hahn-reduced 22 note scale"},"smithgw_indianred":{"frequencies":[261.6255653006,275.93321340298,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,331.11985608357,348.83408706747,353.19451315581,367.91095120397,372.08969287196,392.4383479509,413.43299207996,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,496.11959049595,523.2511306012],"description":"32805/32768 Hahn-reduced"},"smithgw_klv":{"frequencies":[261.6255653006,271.78681896552,282.34272472006,293.30861211826,314.10491445143,326.30440921209,338.97771913949,352.14324873572,377.11107157735,391.75765725694,406.97310157871,422.77949745352,452.75560414132,470.34014155688,488.60764618722,523.2511306012],"description":"Variant of kleismic with 9/7 thirds, g=316.492"},"smithgw_meandin":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,313.95067836072,336.37572681506,348.83408706747,373.75080757229,392.4383479509,418.60090448096,448.50096908674,470.92601754108,504.56359022259,523.2511306012],"description":"Gene Smith, inverted detempered 7-limit meantone"},"smithgw_meanred":{"frequencies":[261.6255653006,281.29980781121,291.99281841585,313.95067836072,325.57848126297,350.39138209902,363.36884069528,390.69417751556,420.46965851882,436.04260883433,468.83301301868,486.65469735975,523.2511306012],"description":"171-et Hahn reduced rational Meantone[12]"},"smithgw_meantune":{"frequencies":[261.6255653006,273.55401844854,279.77233440758,292.56174910339,312.85829351777,327.16018629281,334.59705725462,349.85254391288,365.77071543428,374.29488261541,391.03456781852,418.40555295943,437.51985793188,468.14464283802,489.08159472971,500.47948461038,523.2511306012],"description":"Meantune scale/temperament, Gene Ward Smith, 2003"},"smithgw_mir22":{"frequencies":[261.6255653006,267.57160087561,274.70684356563,280.31310567921,285.40970760065,299.00064605783,305.22982618403,319.76457981184,327.03195662575,343.38355445704,348.83408706747,366.27579142084,373.75080757229,392.4383479509,398.6675280771,418.60090448096,428.11456140098,448.50096908674,457.84473927605,479.64686971777,490.54793493862,512.78610798918,523.2511306012],"description":"11-limit Miracle[22]"},"smithgw_mmt":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,307.38829724655,327.03195662575,349.91912034749,365.63284274659,391.22147055517,411.12588832951,437.39890198442,459.65271605653,489.02683710225,523.2511306012],"description":"Modified meantone with 5/4, 14/11 and 44/35 major thirds, TL 17-03-2003"},"smithgw_modmos12a":{"frequencies":[261.6255653006,265.27772209197,292.31087910123,304.72408298441,326.59518553839,340.46429857933,364.90060015836,391.09077971329,407.69874723177,425.01198472693,455.51656649021,488.21056770985,523.2511306012],"description":"A 12-note modmos in 50-et meantone"},"smithgw_octoid":{"frequencies":[261.6255653006,272.34559486824,274.88944875317,277.45706359738,280.04865972334,282.66446436432,285.30470202322,296.99497716113,299.76906949343,302.56907333554,305.39522895084,308.24778413898,311.12698372208,323.87531915696,326.90048829645,329.95391413777,333.03585868997,336.14659218049,339.28638158975,353.18853996009,356.48751029933,359.81729479041,363.17817915623,366.5704580819,369.99442271164,385.15483391523,388.75238658,392.38354231563,396.04861270515,399.74791910495,403.48177901006,420.01432465796,423.93748365756,427.89728706578,431.89407466632,435.9281969008,440,458.02886886968,462.30710409523,466.62530033172,470.98382811593,475.38306960714,479.82340237272,499.48402328631,504.14947188193,508.85849826899,513.6115065207,518.40891338474,523.2511306012],"description":"Octoid temperament, g=16.096, oct=1/8, 11-limit"},"smithgw_orw18r":{"frequencies":[261.6255653006,269.10058145205,280.31310567921,286.15296204753,299.00064605783,305.22982618403,327.03195662575,336.37572681506,348.83408706747,358.80077526939,381.53728273004,392.4383479509,406.97310157871,418.60090448096,448.50096908674,457.84473927605,474.80195184183,490.54793493862,523.2511306012],"description":"Rational version of two cycles of 9-tone \"Orwell\""},"smithgw_pel1":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,294.32876096318,327.03195662575,348.83408706747,363.36884069528,392.4383479509,408.78994578219,418.60090448096,436.04260883433,490.54793493862,523.2511306012],"description":"125/108, 135/128 periodicity block no. 1"},"smithgw_pel2":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,490.54793493862,523.2511306012],"description":"125/108, 135/128 periodicity block no. 2"},"smithgw_pel3":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"125/108, 135/128 periodicity block no. 3"},"smithgw_pk":{"frequencies":[261.6255653006,271.01659746112,280.74472171431,290.822034715,313.8821415949,325.1489200649,336.82012073975,348.91025643633,376.57634157395,390.09352641046,404.09590743895,418.60090448096,451.79296003201,468.01003810189,484.80922990434,523.2511306012],"description":"Parakleismic temperament, g=315.263, 5-limit"},"smithgw_pris":{"frequencies":[261.6255653006,279.06726965397,293.02063313667,305.22982618403,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,488.36772189445,523.2511306012],"description":"optimized (15/14)^3 (16/15)^4 (21/20)^3 (25/24)^2 scale"},"smithgw_prisa":{"frequencies":[261.6255653006,274.70684356563,293.02063313667,313.95067836072,327.03195662575,343.38355445704,366.27579142084,392.4383479509,418.60090448096,439.53094970501,457.84473927605,488.36772189445,523.2511306012],"description":"optimized (15/14)^3 (16/15)^4 (21/20)^3 (25/24)^2 scale"},"smithgw_pum13marv":{"frequencies":[261.6255653006,293.67396865289,305.56991629828,343.00138030143,326.66798000724,366.68389807519,349.22276077151,392.00157668785,407.88051296056,457.84473927605,436.04260883433,489.45661357347,549.41368713126,523.2511306012],"description":"pum13 marvel tempered and in epimorphic order"},"smithgw_qm3a":{"frequencies":[261.6255653006,279.86396690685,305.19382000629,326.46944327063,349.22823143301,366.44956000397,391.99543598175,419.32216217931,457.27406033445,489.15147723638,523.2511306012],"description":"Qm(3) 10-note quasi-miracle scale, mode A, 72-tET, TL 04-01-2002"},"smithgw_qm3b":{"frequencies":[261.6255653006,279.86396690685,299.37379946195,326.46944327063,349.22823143301,373.57357677338,391.99543598175,419.32216217931,448.5538823653,489.15147723638,523.2511306012],"description":"Qm(3) 10-note quasi-miracle scale, mode B"},"smithgw_ragasyn1":{"frequencies":[261.6255653006,269.16210421872,290.69507255622,313.95067836072,322.99452506247,348.83408706747,363.36884069528,392.4383479509,403.74315632809,436.04260883433,470.92601754108,484.4917875937,523.2511306012],"description":"Ragasyn 6561/6250 81/80 scale"},"smithgw_rainbow":{"frequencies":[261.6255653006,273.37431312998,292.50627485027,310.51268695591,327.03195662575,349.91912034749,365.63284274659,391.22147055517,412.03444522126,437.39889945791,468.01003810189,489.02683710225,523.2511306012],"description":"Circulating 1/4-comma meantone, Gene Ward SMith"},"smithgw_ratwell":{"frequencies":[261.6255653006,275.62199471997,293.02063313667,310.07474405997,326.72451751701,348.83408706747,367.49599295996,392.4383479509,413.43299207996,437.57747881743,465.11211608996,489.99465727995,523.2511306012],"description":"7-limit rational well-temperament"},"smithgw_ratwolf":{"frequencies":[261.6255653006,272.55669785235,292.25605339318,313.37920299881,326.47268679644,350.06888377949,364.69531895389,391.05410158062,407.39296674476,436.83777202739,468.410735204,487.98168129749,523.2511306012],"description":"Eleven fifths of (418/5)^(1/11) and one 20/13 wolf, G.W. Smith 2003"},"smithgw_rectoo":{"frequencies":[261.6255653006,290.69507255622,299.00064605783,313.95067836072,327.03195662575,348.83408706747,392.4383479509,408.78994578219,418.60090448096,436.04260883433,457.84473927605,470.92601754108,523.2511306012],"description":"Hahn-reduced circle of fifths via <12 19 27 34| kernel"},"smithgw_sc19":{"frequencies":[261.6255653006,269.16210421872,282.55561052465,290.69507255622,302.80736724606,313.95067836072,327.03195662575,339.06673262958,348.83408706747,363.36884069528,376.74081403286,392.4383479509,403.74315632809,418.60090448096,436.04260883433,452.08897683944,470.92601754108,484.4917875937,508.60009894437,523.2511306012],"description":"Fokker block from commas <81/80, 78732/78125>, Gene Ward Smith 2002"},"smithgw_sch13":{"frequencies":[261.6255653006,269.71217215021,278.04872701265,282.14859498561,290.86954990528,295.15846273282,304.2815407612,313.68660297237,318.31195648825,328.15068782436,332.98931632582,343.28171142549,353.89223299652,359.11042631209,370.21019888355,375.66900084958,387.28058594818,392.99109319609,405.13808832031,417.66053353744,423.81899742763,436.9188548657,443.36128543927,457.06517711961,471.19264083172,478.14044600934,492.91932687455,500.18749236202,515.64783010531,523.2511306012],"description":"13-limit schismic temperament, g=704.3917, TL 31-10-2002"},"smithgw_sch13a":{"frequencies":[261.6255653006,266.49502311502,271.45511438723,280.18048669638,285.39529457963,294.56874561631,300.051354061,305.6360048159,315.46005229837,321.33149462105,331.66004360268,337.8330052901,344.12086009392,355.18192699392,361.79268541866,373.4217751344,380.37201938485,392.59830625439,399.90547017058,407.34863733398,420.4420328577,428.26743302475,442.03321824291,450.26048038501,458.64087358289,473.38295124548,482.19370453904,497.69284002863,506.95605959354,523.2511306012],"description":"13-limit schismic temperament, g=702.660507, TL 31-10-2002"},"smithgw_scj22a":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,301.39265122629,313.95067836072,327.03195662575,334.88072358477,348.83408706747,361.67118147155,363.36884069528,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,454.2110508691,465.11211608996,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"225/224 ^ 15625/15552 = [6,5,22,37,-18,-6] catakleismic"},"smithgw_scj22b":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,334.88072358477,348.83408706747,353.19451315581,372.08969287196,387.59343007496,392.4383479509,408.78994578219,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"5120/5103 ^ 225/224 = [1,-8,-14,-10,25,-15] schismic candidate"},"smithgw_scj22c":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,357.20610515709,367.91095120397,383.2405741708,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,465.11211608996,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"225/224 ^ 65625/65536 = [7,-3,827,7,-21] orwell candidate"},"smithgw_secab":{"frequencies":[261.6255653006,274.07613169002,291.39807132323,313.10572011471,348.73657263424,365.33268718488,392.54808236386,417.35759110361,437.21932894603,486.97408086388,523.2511306012],"description":"{126/125, 176/175} tempering of decab, 328-et version"},"smithgw_secac":{"frequencies":[261.6255653006,281.11531641881,298.8821409504,313.10572011471,348.73657263424,374.71564313773,392.54808236386,417.35759110361,448.44857247831,499.48119153644,523.2511306012],"description":"{126/125, 176/175} tempering of decac, 328-et version"},"smithgw_secad":{"frequencies":[261.6255653006,281.11531641881,313.10572011471,328.00618883132,348.73657263424,374.71564313773,392.54808236386,437.21932894603,469.78990700991,499.48119153644,523.2511306012],"description":"{126/125, 176/175} tempering of decad, 328-et version"},"smithgw_smalldi11":{"frequencies":[261.6255653006,269.10058145205,305.22982618403,313.95067836072,322.92069774245,366.27579142084,373.75080757229,423.93031414449,436.04260883433,448.50096908674,508.71637697339,523.2511306012],"description":"Small diesic 11-note block, <10/9, 126/125, 1728/1715> commas"},"smithgw_smalldi19a":{"frequencies":[261.6255653006,269.10058145205,272.52663052146,299.00064605783,305.22982618403,313.95067836072,317.94773560837,327.03195662575,358.80077526939,366.27579142084,373.75080757229,381.53728273004,418.60090448096,430.56093032327,436.04260883433,448.50096908674,457.84473927605,502.32108537715,508.71637697339,523.2511306012],"description":"Small diesic 19-note block, <16/15, 126/125, 1728/1715> commas"},"smithgw_smalldi19b":{"frequencies":[261.6255653006,266.96486255163,274.70684356563,299.00064605783,305.22982618403,313.95067836072,320.49131749323,327.03195662575,358.80077526939,366.27579142084,373.75080757229,381.53728273004,418.60090448096,427.14378008261,436.04260883433,448.50096908674,457.84473927605,498.33441009638,512.78610798918,523.2511306012],"description":"Small diesic 19-note block, <16/15, 126/125, 2401/2400> commas"},"smithgw_smalldi19c":{"frequencies":[261.6255653006,267.07609791103,274.70684356563,280.31310567921,286.15296204753,313.95067836072,320.49131749323,327.03195662575,336.37572681506,343.38355445704,373.75080757229,381.53728273004,392.4383479509,400.61414686654,436.04260883433,448.50096908674,457.84473927605,470.92601754108,508.71637697339,523.2511306012],"description":"Small diesic 19-note scale containing glumma"},"smithgw_smalldiglum19":{"frequencies":[261.6255653006,267.74077300753,273.99891691894,280.40333801024,286.95745534843,312.9293240034,320.24370022528,327.729041887,335.38934511627,343.22869944589,374.29355081838,383.0422478503,391.99543598175,401.15789496562,437.46578647972,447.69106452518,458.15534711532,468.86422071654,511.30005826145,523.2511306012],"description":"Small diesic \"glumma\" variant of 19-note MOS, 31/120 version"},"smithgw_smalldimos11":{"frequencies":[261.6255653006,267.74077300753,305.78200836532,312.9293240034,320.24370022528,365.74467430283,374.29355081838,427.47405410759,437.46578647972,447.69106452518,511.30005826145,523.2511306012],"description":"Small diesic 11-note MOS, 31/120 version"},"smithgw_smalldimos19":{"frequencies":[261.6255653006,267.74077300753,273.99891691894,298.79793764201,305.78200836532,312.9293240034,320.24370022528,327.729041887,357.39105439675,365.74467430283,374.29355081838,383.0422478503,417.71053321823,427.47405410759,437.46578647972,447.69106452518,458.15534711532,499.62194879119,511.30005826145,523.2511306012],"description":"Small diesic 19-note MOS, 31/120 version"},"smithgw_star":{"frequencies":[261.6255653006,272.52663052146,313.95067836072,327.03195662575,376.74081403286,392.4383479509,436.04260883433,470.92601754108,523.2511306012],"description":"Gene Ward Smith \"Star\" scale, untempered version"},"smithgw_star2":{"frequencies":[261.6255653006,282.55561052465,313.95067836072,327.03195662575,376.74081403286,392.4383479509,436.04260883433,470.92601754108,523.2511306012],"description":"Gene Ward Smith \"Star\" scale, alternative untempered version"},"starra":{"frequencies":[261.6255653006,274.07613169002,294.49338559574,313.10572011471,328.00618883132,343.61575980934,374.71564313773,392.54808236386,411.22915413197,437.21932894603,458.02627217006,492.14685988839,523.2511306012],"description":"12 note {126/125, 176/175} scale, 328-et version"},"smithgw_starrb":{"frequencies":[261.6255653006,274.07613169002,287.1192112957,305.26548915336,328.00618883132,343.61575980934,365.33268718488,392.54808236386,411.22915413197,437.21932894603,458.02627217006,479.82340237272,523.2511306012],"description":"12 note {126/125, 176/175} scale, 328-et version"},"smithgw_starrc":{"frequencies":[261.6255653006,274.07613169002,287.1192112957,313.10572011471,328.00618883132,343.61575980934,365.33268718488,392.54808236386,411.22915413197,437.21932894603,458.02627217006,492.14685988839,523.2511306012],"description":"12 note {126/125, 176/175} scale, 328-et version"},"smithgw_tetra":{"frequencies":[261.6255653006,274.84135386022,293.90210492181,314.2847539672,326.44746606412,342.93767672779,366.7210324511,392.15380743582,419.35039192746,435.57910814854,457.58200907672,489.31615916483,523.2511306012],"description":"{225/224, 385/384} tempering of two-tetrachord 12-note scale"},"smithgw_tr31":{"frequencies":[261.6255653006,267.54129532085,292.57243455474,299.18791603519,305.95298478736,334.57791819083,342.14320575162,349.87955533643,391.26571058456,400.11279059885,409.15991580663,447.44088028055,457.55816161244,467.90420651233,511.68128147674,523.2511306012],"description":"6/31 generator supermajor seconds tripentatonic scale"},"smithgw_tr7_13":{"frequencies":[261.6255653006,183.87449048025,346.05860897284,243.21533855007,457.74028507734,321.70694650116,605.46440189891,425.52973856044,299.06887661109,562.85871464284,395.58580335293,744.50714985079,523.2511306012],"description":"81/80 ==> 28561/28672"},"smithgw_tr7_13b":{"frequencies":[261.6255653006,372.25357492539,395.58580335293,281.42935732142,299.06887661109,425.52973856044,302.73220094945,321.70694650116,457.74028507734,486.43067710015,346.05860897284,367.7489809605,523.2511306012],"description":"reverse reduced 81/80 ==> 28561/28672"},"smithgw_tr7_13r":{"frequencies":[261.6255653006,367.7489809605,346.05860897284,486.43067710015,457.74028507734,321.70694650116,302.73220094945,425.52973856044,299.06887661109,281.42935732142,395.58580335293,372.25357492539,523.2511306012],"description":"reduced 81/80 ==> 28561/28672"},"smithgw_tra":{"frequencies":[261.6255653006,128.35937755236,399.56478905052,196.03545836752,610.23096296248,299.39301413087,931.96857771927,457.24471305759,224.33452437931,698.32199734535,342.61245382262,1066.50464849657,523.2511306012],"description":"81/80 ==> 1029/512"},"smithgw_tre":{"frequencies":[261.6255653006,256.71872396454,399.56476227799,392.07084290614,305.11544059319,299.39293769309,465.98419519089,457.24482979639,448.66910888407,349.16106442144,342.6124767791,533.2523889322,523.2511306012],"description":"81/80 ==> 1029/512 ==> reduction"},"smithgw_treb":{"frequencies":[261.6255653006,266.6261944661,342.6124767791,349.16106442144,448.66910888407,457.24482979639,465.98419519089,299.39293769309,305.11544059319,392.07084290614,399.56476227799,513.43744792908,523.2511306012],"description":"reversed 81/80 ==> 1029/512 ==> reduction"},"smithgw_trx":{"frequencies":[261.6255653006,490.17835855476,354.35176059633,331.954494127,479.94227969828,449.60690021487,325.02250210538,304.47902995326,285.23403465053,412.39349145653,386.32762147798,279.2776760715,523.2511306012],"description":"reduced 3/2->7/6 5/4->11/6 scale"},"smithgw_trxb":{"frequencies":[261.6255653006,279.2776760715,386.32762147798,412.39349145653,285.23403465053,304.47902995326,325.02250210538,449.60690021487,479.94227969828,331.954494127,354.35176059633,490.17835855476,523.2511306012],"description":"reversed reduced 3/2->7/6 5/4->11/6 scale"},"smithgw_wa":{"frequencies":[261.6255653006,273.6474362764,299.37379946195,313.13022722746,327.51877211613,349.22823143301,374.77430422696,391.99543598175,417.97870684853,437.18511000944,469.1652354389,500.26367760099,523.2511306012],"description":"Wreckmeister A temperament, TL 2-6-2002"},"smithgw_wa120":{"frequencies":[261.6255653006,273.99891691894,298.79793764201,312.9293240034,327.729041887,349.22823143301,374.29355081838,391.99543598175,417.71053321823,437.46578647972,468.86422071654,499.62194879119,523.2511306012],"description":"120-tET version of Wreckmeister A temperament"},"smithgw_wb":{"frequencies":[261.6255653006,280.76349612739,291.78605424516,313.13022722746,327.51877211613,349.22823143301,365.2755039332,391.99543598175,417.97870684853,437.18511000944,469.1652354389,487.58430040208,523.2511306012],"description":"Wreckmeister B temperament, TL 2-6-2002"},"smithgw_well1":{"frequencies":[261.6255653006,275.92984511873,292.92635710626,310.42107575858,327.5229776175,349.2237102284,367.90646015831,391.734151992,413.8947676781,437.99072463899,465.63161363786,490.54194687775,523.2511306012],"description":"Well-temperament, Gene Ward Smith (2005)"},"smithgw_whelp1":{"frequencies":[261.6255653006,275.93321340298,292.50627485027,310.07474405997,327.03195662575,348.05120395042,368.50381975103,390.45372436301,413.66634097248,438.25895612273,464.36382062247,491.65133958137,523.2511306012],"description":"well-temperament with one pure third, Gene Ward Smith, 2003"},"smithgw_whelp2":{"frequencies":[261.6255653006,275.85000668176,292.43269265164,309.98104674077,327.03195662575,347.97308568611,368.21146504308,391.7894791814,413.34036955908,438.14417346548,464.48314871299,489.73685071229,523.2511306012],"description":"well-temperament with two pure thirds"},"smithgw_whelp3":{"frequencies":[261.6255653006,275.96871294479,292.50627485027,310.03485655885,327.03195662575,349.46135677641,368.11883862276,391.73393619399,413.66634097248,436.82669499534,464.84945270756,489.66742197778,523.2511306012],"description":"well-temperament with three pure thirds"},"smithgw_wiz28":{"frequencies":[261.6255653006,269.80136421624,277.4816601673,280.31310567921,287.78812183066,297.30177875068,305.22982618403,308.34441624714,317.12189733406,327.03195662575,336.37572681506,345.34574619679,348.83408706747,359.73515228832,370.01329949656,380.54627680087,392.4383479509,396.40237166758,406.97310157871,418.60090448096,431.68218274599,436.04260883433,448.50096908674,460.46099492906,475.68284600109,490.54793493862,493.35106599542,508.71637697339,523.2511306012],"description":"11-limit Wizard[28]"},"smithgw_wiz34":{"frequencies":[261.6255653006,269.80136421624,272.52663052146,277.4816601673,280.31310567921,287.78812183066,297.30177875068,305.22982618403,308.34441624714,313.95067836072,317.12189733406,327.03195662575,336.37572681506,345.34574619679,348.83408706747,356.76213450082,359.73515228832,370.01329949656,380.54627680087,383.71749577421,392.4383479509,396.40237166758,406.97310157871,418.60090448096,431.68218274599,436.04260883433,443.97065626768,448.50096908674,460.46099492906,475.68284600109,490.54793493862,493.35106599542,504.56359022259,508.71637697339,523.2511306012],"description":"11-limit Wizard[34]"},"smithgw_wiz38":{"frequencies":[261.6255653006,269.80136421624,272.52663052146,277.4816601673,280.31310567921,285.40970760065,287.78812183066,297.30177875068,305.22982618403,308.34441624714,313.95067836072,317.12189733406,327.03195662575,336.37572681506,339.14425131559,345.34574619679,348.83408706747,356.76213450082,359.73515228832,370.01329949656,380.54627680087,383.71749577421,392.4383479509,396.40237166758,403.65087217807,406.97310157871,418.60090448096,431.68218274599,436.04260883433,443.97065626768,448.50096908674,460.46099492906,475.68284600109,479.64686971777,490.54793493862,493.35106599542,504.56359022259,508.71637697339,523.2511306012],"description":"11-limit Wizard[38]"},"smithgw_wreckpop":{"frequencies":[261.6255653006,272.73569398658,292.31087910123,313.29104303136,326.59518553839,350.03605285217,364.90060015836,391.09077971329,419.16071913933,436.9606979923,455.51656649021,501.93603498211,523.2511306012],"description":"\"Wreckmeister\" 13-limit meanpop (50-et) tempered thirds"},"smithj12":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,306.59245933664,331.11985608357,344.91651675372,363.36884069528,392.4383479509,408.78994578219,441.49314144476,459.88868900496,496.67978412536,523.2511306012],"description":"J. Smith, 5-limit JI scale, MMM 21-3-2006"},"smithj17":{"frequencies":[261.6255653006,272.57820116223,283.17034563789,295.02492750576,308.97787266236,319.3201344739,332.68808325276,348.42227432308,363.00854876594,377.11473546037,392.90218486657,411.48414905414,425.25755219187,443.06044202496,464.01459698705,479.54632553791,499.62194879119,523.2511306012],"description":"J. Smith 17-tone well temperament, MMM 12-2006"},"smithrk_19":{"frequencies":[261.6255653006,274.68253637698,286.11368885031,294.3308008075,305.19387818096,313.95878694534,327.0246436172,343.34529416761,348.83287827711,366.24211271841,381.48359653409,392.43970784476,406.92376081862,418.61050714007,436.03134720211,457.79213919624,470.93981233279,488.32112480698,508.64303280756,523.2511306012],"description":"19 out of 612-tET by Roger K. Smith, 1978"},"smithrk_mult":{"frequencies":[261.6255653006,274.70684356563,286.15296204753,294.32876096318,305.22982618403,313.95067836072,327.03195662575,343.38355445704,348.83408706747,366.27579142084,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,457.84473927605,470.92601754108,488.36772189445,508.71637697339,523.2511306012],"description":"Roger K. Smith, \"Multitonic\" scale, just version"},"solar":{"frequencies":[261.6255653006,394.58976180129,774.00176545642,2207.36533954793,5481.83445910426,34573.03685904828,65024.37680021134,105705.6559450381],"description":"Solar system scale: 0=Pluto, 8=Mercury. 1/1=248.54 years period"},"solemn":{"frequencies":[261.6255653006,313.95067836072,348.83408706747,392.4383479509,418.60090448096,470.92601754108,523.2511306012],"description":"Solemn 6"},"songlines":{"frequencies":[261.6255653006,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,470.92601754108,479.64686971777,523.2511306012],"description":"Songlines.DEM, Bill Thibault and Scott Gresham-Lancaster. 1992 ICMC (=rectsp6)"},"sorge":{"frequencies":[261.6255653006,272.52663052146,294.32876096318,306.59245933664,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,436.04260883433,470.92601754108,490.54793493862,523.2511306012],"description":"Sorge's Monochord (1756)"},"sorge1":{"frequencies":[261.6255653006,276.86979852503,293.00227310437,311.47852302926,328.88393162803,349.6228209638,369.57684148724,391.5530240856,415.30469757995,439.00737933323,466.69047534984,493.32589719545,523.2511306012],"description":"Georg Andreas Sorge, 1744 (A)"},"sorge2":{"frequencies":[261.6255653006,276.24519242498,293.00227310437,310.77584116741,328.88393162803,348.83408706747,368.74309237173,391.5530240856,414.36778843034,438.51190905657,465.63764214343,492.21297564769,523.2511306012],"description":"Georg Andreas Sorge, 1744 (B)"},"sorge3":{"frequencies":[261.6255653006,276.55731914056,293.00227310437,310.77584116741,328.51274831708,348.83408706747,369.15973155124,391.5530240856,414.83597850347,438.51190905657,465.63764214343,492.7691222293,523.2511306012],"description":"Georg Andreas Sorge, well temperament, (1756, 1758)"},"sparschuh":{"frequencies":[261.6255653006,276.27659695743,293.02063313667,310.81117157711,328.60171001755,349.008504111,368.36879594324,391.3918456897,414.41489543615,439.53094970501,465.69350623507,491.85606276513,523.2511306012],"description":"Andreas Sparschuh WTC temperament, 1/1=C=250, modified Collatz sequence"},"sparschuh2":{"frequencies":[261.6255653006,276.27659695743,293.02063313667,310.81117157711,328.60171001755,349.008504111,368.36879594324,391.3918456897,414.41489543615,438.48444744381,465.69350623507,491.85606276513,523.2511306012],"description":"Modified Sparschuh temperament with A=419Hz by Tom Dent"},"spec1_14":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,392.4383479509,408.78994578219,425.14154361347,441.49314144476,457.84473927605,523.2511306012],"description":"Spectrum sequence of 8/7: 1 to 27 reduced by 2/1"},"spec1_17":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,359.73515228832,376.08675011961,392.4383479509,408.78994578219,425.14154361347,441.49314144476,490.54793493862,523.2511306012],"description":"Spectrum sequence of 7/6: 1 to 27 reduced by 2/1"},"spec1_25":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,408.78994578219,425.14154361347,457.84473927605,490.54793493862,523.2511306012],"description":"Spectrum sequence of 5/4: 1 to 25 reduced by 2/1"},"spec1_33":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,327.03195662575,343.38355445704,359.73515228832,392.4383479509,408.78994578219,425.14154361347,457.84473927605,474.19633710734,490.54793493862,523.2511306012],"description":"Spectrum sequence of 4/3: 1 to 29 reduced by 2/1"},"spec1_4":{"frequencies":[261.6255653006,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,408.78994578219,425.14154361347,457.84473927605,490.54793493862,523.2511306012],"description":"Spectrum sequence of 7/5: 1 to 25 reduced by 2/1"},"spec1_5":{"frequencies":[261.6255653006,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,392.4383479509,408.78994578219,425.14154361347,441.49314144476,457.84473927605,490.54793493862,523.2511306012],"description":"Spectrum sequence of 1.5: 1 to 27 reduced by 2/1"},"specr2":{"frequencies":[261.6255653006,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,392.4383479509,408.78994578219,425.14154361347,457.84473927605,474.19633710734,490.54793493862,523.2511306012],"description":"Spectrum sequence of sqrt(2): 1 to 29 reduced by 2/1"},"specr3":{"frequencies":[261.6255653006,277.97716313189,310.68035879446,327.03195662575,359.73515228832,392.4383479509,408.78994578219,425.14154361347,441.49314144476,474.19633710734,490.54793493862,506.89953276991,523.2511306012],"description":"Spectrum sequence of sqrt(3): 1 to 31 reduced by 2/1"},"spon_chal1":{"frequencies":[261.6255653006,280.31310567921,285.40970760065,286.15296204753,348.83408706747,392.4383479509,420.46965851882,428.11456140098,429.2294430713,523.2511306012],"description":"JC Spondeion, from discussions with George Kahrimanis about tritone of spondeion"},"spon_chal2":{"frequencies":[261.6255653006,275.62199471997,279.06726965397,285.40970760065,348.83408706747,392.4383479509,413.43299207996,418.60090448096,428.11456140098,523.2511306012],"description":"JC Spondeion II, 10 May 1997. Various tunings for the parhypatai and hence trito"},"spon_mont":{"frequencies":[261.6255653006,271.31540105247,348.83408706747,392.4383479509,428.11456140098,523.2511306012],"description":"Montford's Spondeion, a mixed septimal and undecimal pentatonic, 1923"},"spon_terp":{"frequencies":[261.6255653006,285.40970760065,348.83408706747,392.4383479509,428.11456140098,523.2511306012],"description":"Subharm. 6-tone series, guess at Greek poet Terpander's, 6th c. BC & Spondeion, Winnington-Ingram (1928)"},"stade":{"frequencies":[261.6255653006,274.22463192287,292.50627485027,309.28772967674,327.03195662575,348.83408706747,365.63284274659,391.22147055517,411.33694767869,437.39890198442,465.11211608996,489.02683710225,523.2511306012],"description":"Organs in St. Cosmae, Stade; Magnuskerk, Anloo; H.K. Sluipwijk, modif. 1/4 mean"},"stanhope":{"frequencies":[261.6255653006,275.62199471997,293.00227310437,310.07474405997,326.6631048533,348.83408706747,367.49599295996,392.4383479509,413.43299207996,437.52264545758,465.11211608996,489.99465727995,523.2511306012],"description":"Well temperament of Charles, third earl of Stanhope (1806)"},"stanhope2":{"frequencies":[261.6255653006,275.85537639807,293.11251278827,310.16223770573,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.66634097248,437.85193595173,465.11211608996,490.54793493862,523.2511306012],"description":"Stanhope temperament (real version?) with 1/3 synt. comma temp."},"stanhope_f":{"frequencies":[261.6255653006,275.62199471997,292.46014274879,310.07474405997,326.6631048533,348.83408706747,367.49599295996,392.4383479509,413.43299207996,436.79202494356,465.11211608996,489.99465727995,523.2511306012],"description":"Stanhope temperament, equal beating version by Farey (1807)"},"stanhope_s":{"frequencies":[261.6255653006,275.77758308753,293.11247215425,310.2497806633,327.03195662575,348.83408706747,367.7034443005,392.4383479509,413.66637442451,437.85181455341,465.11211608996,490.54793493862,523.2511306012],"description":"Stanhope temperament, alt. version with 1/3 syntonic comma"},"starling":{"frequencies":[261.6255653006,278.9816419584,293.66476791741,313.14630527334,327.50195613664,349.22823143301,367.60851651046,391.99543598175,418.00016846495,437.16266336983,466.16376151809,490.69849857048,523.2511306012],"description":"Starling temperament, Herman Miller (1999)"},"stearns":{"frequencies":[261.6255653006,299.00064605783,336.37572681506,366.27579142084,398.6675280771,448.50096908674,504.56359022259,523.2511306012],"description":"Dan Stearns, guitar scale"},"stearns2":{"frequencies":[261.6255653006,280.31310567921,287.78812183066,299.00064605783,313.95067836072,317.68818643644,336.37572681506,340.11323489078,355.06326719367,366.27579142084,373.75080757229,392.4383479509,411.12588832951,418.60090448096,429.81342870813,444.76346101102,448.50096908674,467.18850946536,470.92601754108,485.87604984397,497.08857407114,504.56359022259,523.2511306012],"description":"Dan Stearns, scale for \"At A Day Job\" based on harmonics 10-20 and 14-28"},"stearns3":{"frequencies":[261.6255653006,304.11599009871,327.88291945286,364.30920726489,423.47641042702,470.52269644143,546.93995798074,607.70247408742,706.39900722312,784.8766959018],"description":"Dan Stearns, trivalent version of Bohlen's Lambda scale"},"stearns4":{"frequencies":[261.6255653006,296.65550714972,336.37572681506,347.46339693852,393.986457405,446.73865184892,461.46412096988,523.2511306012],"description":"Dan Stearns, 1/4-septimal comma temperament, tuning-math 2-12-2001"},"steldek1":{"frequencies":[261.6255653006,274.70684356563,275.93321340298,280.31310567921,286.15296204753,294.32876096318,305.22982618403,309.04519901133,315.35224388912,321.92208230347,327.03195662575,331.11985608357,343.38355445704,353.19451315581,367.91095120397,381.53728273004,386.30649876417,392.4383479509,400.61414686654,408.78994578219,412.06026534844,420.46965851882,429.2294430713,436.04260883433,441.49314144476,457.84473927605,490.54793493862,504.56359022259,508.71637697339,515.07533168556,523.2511306012],"description":"Stellated two out of 1 3 5 7 9 dekany"},"steldek1s":{"frequencies":[261.6255653006,274.70684356563,275.93321340298,280.31310567921,286.15296204753,294.32876096318,305.22982618403,309.04519901133,315.35224388912,321.92208230347,327.03195662575,331.11985608357,339.14425131559,343.38355445704,353.19451315581,360.4025644447,367.91095120397,381.53728273004,386.30649876417,392.4383479509,400.61414686654,408.78994578219,412.06026534844,420.46965851882,429.2294430713,436.04260883433,441.49314144476,457.84473927605,482.88312345521,490.54793493862,494.47231841813,504.56359022259,508.71637697339,515.07533168556,523.2511306012],"description":"Superstellated two out of 1 3 5 7 9 dekany"},"steldek2":{"frequencies":[261.6255653006,262.3068818769,269.80136421624,274.70684356563,280.31310567921,286.15296204753,294.32876096318,299.7792935736,308.34441624714,312.16686768822,314.76825825228,327.03195662575,337.2517052703,343.38355445704,356.76213450082,359.73515228832,377.72190990274,381.53728273004,385.43052030892,392.4383479509,393.46032281536,400.61414686654,408.78994578219,416.22249025095,419.69101100305,429.2294430713,431.68218274599,449.66894036041,457.84473927605,472.15238737843,490.54793493862,494.63583439645,499.46698830115,503.62921320365,513.90736041189,523.2511306012],"description":"Stellated two out of 1 3 5 7 11 dekany"},"steldek2s":{"frequencies":[261.6255653006,262.3068818769,269.80136421624,274.70684356563,280.31310567921,286.15296204753,294.32876096318,295.09524211152,299.7792935736,302.17752792219,308.34441624714,312.16686768822,314.76825825228,327.03195662575,337.2517052703,343.38355445704,349.7425091692,356.76213450082,359.73515228832,377.72190990274,381.53728273004,385.43052030892,392.4383479509,393.46032281536,400.61414686654,408.78994578219,416.22249025095,419.69101100305,429.2294430713,431.68218274599,440.49202321019,449.66894036041,454.06089845559,457.84473927605,472.15238737843,490.54793493862,494.63583439645,499.46698830115,503.62921320365,513.90736041189,523.2511306012],"description":"Superstellated two out of 1 3 5 7 11 dekany"},"steleik1":{"frequencies":[220,220.57291666667,224.58333333333,225,226.875,229.16666666667,232.03125,235.27777777778,238.21875,240.625,242.63020833333,243.08035714286,247.5,248.14453125,252.08333333333,252.65625,255.234375,256.66666666667,257.8125,262.5,264.6875,270.703125,272.25,275,277.29166666667,278.4375,280.72916666667,283.59375,288.75,294.09722222222,297.7734375,302.5,308.80208333333,309.375,311.953125,315,315.10416666667,317.625,320.83333333333,324.10714285714,324.84375,330,330.859375,336.11111111111,336.875,340.3125,343.75,346.5,346.61458333333,350,352.91666666667,353.57142857143,360.9375,366.66666666667,371.25,378.125,385,388.92857142857,392.12962962963,393.75,397.03125,401.04166666667,403.33333333333,412.5,415.9375,423.5,425.390625,427.77777777778,432.14285714286,433.125,440],"description":"Stellated Eikosany 3 out of 1 3 5 7 9 11"},"steleik1s":{"frequencies":[123.47082531403,123.79236392162,125.33976847064,127.32928860509,129.9819821177,130.22313607339,131.308328874,132.59082945654,132.63467563031,133.69575303535,135.04621518722,136.42423779117,136.73429287706,138.90467847828,139.26640941182,141.47698733899,141.79852594658,143.24544968073,144.69237341488,145.8499124022,145.89814319334,147.3231438406,148.55083670594,148.82644122673,151.92699208562,154.33853164254,156.26776328807,156.6747105883,159.16161075637,160.43490364242,160.48795751267,162.05545822466,163.70908534941,165.05648522882,165.43161360434,165.73853682068,167.11969129419,168.80776898403,169.77238480679,173.63084809785,175.077771832,175.80123369908,178.26100404713,179.05681210091,180.06162024963,181.89898372156,182.31239050275,185.20623797104,185.68854588243,189.06470126211,189.41547065221,190.99393290764,192.92316455317,195.33470411009,198.06778227459,200.54362955302,202.56932278083,204.25740047067,204.63635668676,208.35701771743,208.89961411773,212.21548100849,212.69778891987,214.8681745211,216.07394429955,217.03856012232,220.07531363843,220.98471576091,222.82625505891,227.89048812843,229.19271948917,231.50779746381,233.43702910934,233.87012192772,234.4016449321,236.33087657764,238.74241613455,241.07423537553,241.15395569146,243.083187337,246.94165062806],"description":"Superstellated Eikosany 3 out of 1 3 5 7 9 11"},"steleik2":{"frequencies":[123.47082531403,124.49974885831,126.04313417474,126.11662871362,127.68005799519,128.74405847848,129.64436657973,130.41605923794,132.04518818306,132.96858110742,133.76006075687,135.81790784543,137.94006265552,138.64744759221,140.44806379471,141.47698733899,144.0492961997,145.92006628022,146.26543921816,147.13606683255,148.16499037684,148.55083670594,151.25176100969,152.15206911093,154.33853164254,154.49287017418,155.62468607289,156.05340421634,157.14468676331,157.64578589202,158.45422581967,160.51207290824,160.9300730981,163.85607442716,164.62776708537,167.20007594608,169.77238480679,170.24007732692,171.65874463798,172.85915543964,173.88807898393,175.56007974339,176.56328019906,180.06162024963,181.09054379391,182.8317990227,183.92008354069,185.20623797104,186.74962328747,187.26408505961,190.14507098361,193.11608771773,194.02558263633,197.55332050245,198.06778227459,200.6400911353,201.66901467958,202.31209189476,203.72686176815,204.2880927923,205.78470885672,205.99049356557,208.95062745451,210.19438118936,214.01609721099,214.57343079747,216.07394429955,217.36009872991,217.87456050205,220.70410024883,224.71690207153,226.36317974239,229.30296129748,230.47887391952,234.08010632452,237.68133872951,239.0961086029,240.76810936236,243.77573203026,245.22677805425,246.94165062806],"description":"Stellated Eikosany 3 out of 1 3 5 7 11 13"},"steleik2s":{"frequencies":[61.73541265702,61.89618196081,62.32902239411,62.70002847979,63.66464430255,64.65940436978,64.99099105886,65.83502990378,66.22690508177,66.31733781516,67.05419712422,67.52310759362,68.40003106886,68.56192463352,68.97003132776,69.45233923915,69.63320470592,70.8992629733,71.32128239576,72.34618670745,72.41853289415,72.94907159667,73.15003322642,73.66157192031,73.89646213689,74.27541835298,75.24003417574,75.43597176474,76.80753488774,77.16926582128,78.37503559973,79.58080537819,79.800036247,80.24397875634,80.46503654906,81.02772911234,81.51003702372,82.29378737972,82.71580680218,82.76403759332,84.40388449202,84.45309958502,84.8861924034,85.7024057919,86.21253915971,86.81542404893,87.05458499673,87.53888591601,87.7800398717,89.13050202357,90.52316611769,90.94949186079,92.60311898553,92.84427294122,94.05004271968,94.53235063106,94.83379307568,95.49696645383,95.7600434964,96.46158227659,96.55804385887,97.94560661931,98.52861618252,100.32004556766,100.58129568632,101.28466139042,101.88754627965,102.12870023534,103.45504699165,104.17850885872,105.33604784604,105.47988405157,106.10774050425,107.4857631082,108.03697214979,109.72504983963,111.41312752947,112.07630090762,112.86005126361,113.15395764711,114.2698743892,114.95005221294,115.75389873191,115.86965263064,116.71851455468,118.16543828883,118.23433941902,119.7000543705,120.57697784574,120.69755482359,121.54159366851,122.26505553558,123.47082531404],"description":"Superstellated Eikosany 3 out of 1 3 5 7 11 13"},"stelhex1":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,286.15296204753,294.32876096318,327.03195662575,343.38355445704,381.53728273004,392.4383479509,400.61414686654,408.78994578219,429.2294430713,457.84473927605,490.54793493862,523.2511306012],"description":"Stellated two out of 1 3 5 7 hexany, also dekatesserany, mandala, tetradekany"},"stelhex2":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,327.03195662575,331.11985608357,353.19451315581,367.91095120397,392.4383479509,408.78994578219,436.04260883433,441.49314144476,490.54793493862,523.2511306012],"description":"Stellated two out of 1 3 5 9 hexany"},"stelhex3":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,281.36411960997,289.40309445597,297.67175429757,339.14425131559,348.83408706747,358.80077526939,361.75386806997,372.08969287196,385.87079260796,434.10464168396,465.11211608996,523.2511306012],"description":"Stellated Tetrachordal Hexany based on Archytas's Enharmonic"},"stelhex4":{"frequencies":[261.6255653006,269.10058145205,276.78916949353,279.06726965397,287.04062021552,297.67175429757,336.37572681506,348.83408706747,358.80077526939,361.75386806997,372.08969287196,382.72082695402,430.56093032327,465.11211608996,523.2511306012],"description":"Stellated Tetrachordal Hexany based on the 1/1 35/36 16/15 4/3 tetrachord"},"stelhex5":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,331.11985608357,343.38355445704,386.30649876417,392.4383479509,400.61414686654,441.49314144476,457.84473927605,504.56359022259,515.07533168556,523.2511306012],"description":"Stellated two out of 1 3 7 9 hexany, stellation is degenerate"},"stelhex6":{"frequencies":[261.6255653006,269.80136421624,294.32876096318,299.7792935736,327.03195662575,337.2517052703,356.76213450082,359.73515228832,392.4383479509,408.78994578219,431.68218274599,449.66894036041,490.54793493862,494.63583439645,523.2511306012],"description":"Stellated two out of 1 3 5 11 hexany, from The Giving, by Stephen J. Taylor"},"stelpd1":{"frequencies":[207.65234878997,208.19311011494,212.37172035338,214.14148468966,218.03496622947,219.00833661442,222.07265078927,222.48465941783,222.99030637105,224.84855892414,227.11975648903,229.43730502463,233.60889238872,237.93498298851,240.90917027586,242.2610735883,244.73312535961,245.28933700815,247.76700707894,249.83173213793,250.29524184505,254.84606442405,255.50972605016,256.96978162759,259.56543598746,262.81000393731,267.67685586207,272.54370778684,275.32476602956,277.59081348659,280.33067086646,281.06069865517,283.1622938045,285.52197958621,292.0111154859,297.32040849473,299.79807856552,302.82634198537,305.91640669951,306.61167126019,311.47852318496,312.28966517242,317.24664398468,317.96765908464,318.55758053007,321.21222703448,324.45679498433,327.0524493442,330.35600943859,333.10897618391,333.72698912674,340.67963473354,342.62637550345,346.08724798328,350.41333858307,356.90247448276,363.39161038245,367.09968803941,371.65051061841,374.7475982069,380.69597278161,385.45467244138,389.34815398119,392.59272193104,396.42721132631,399.73077142069,400.47238695209,401.51528379311,403.7684559805,407.88854226601,408.81556168025,415.30469757994],"description":"Stellated two out of 1 3 5 7 9 11 pentadekany"},"stelpd1s":{"frequencies":[21.82676446456,21.88360499702,22.15715005948,22.2309638065,22.3228272933,22.50885085408,22.68892166091,22.91810268779,23.02041564622,23.14959867453,23.15196087848,23.34251199682,23.38581906917,23.43896865797,23.624449876,23.63429339678,23.87302363311,24.11662591508,24.35217522905,24.55511002263,24.61905562165,25.00983428231,25.20991295657,25.32245721084,25.46455854199,25.72440097609,25.78286552376,25.93612444091,26.04329850885,26.26032599642,26.30904645282,26.78739275196,26.85715158725,27.01062102489,27.2834555807,27.56185818867,27.62449877546,27.69643757435,28.01101439619,28.1360635676,28.29395393554,28.36115207614,28.41087110056,28.58266775121,28.64762835974,28.9399510981,29.17813999603,29.29871082246,29.46613202716,29.54286674598,29.7637697244,30.01180113877,30.06748166036,30.69388752829,30.99367756425,31.12334932909,31.25195821062,31.51239119571,31.65307151355,31.83069817748,32.15550122011,32.2285819047,32.41274522987,32.74014669684,32.82540749553,33.0742298264,33.34644570974,33.42223308636,33.48424093995,33.76327628112,34.09304532068,34.10431947588,34.37715403168,34.58149925455,34.7243980118,35.01376799523,35.07872860376,35.45144009517,35.80953544967,36.01416136652,36.17493887262,36.37794077427,36.74914425156,36.83266503394,36.92858343247,37.50234985274,37.51475142346,37.81486943485,37.88116146742,38.19683781298,38.26770393137,38.58660146413,38.90418666137,39.06494776328,39.39048899464,40.01573485169,40.28572738088,40.51593153734,40.92518337105,41.25258483802,41.26622656581,41.342787283,41.66927761416,42.01652159428,42.09447432451,42.2040953514,42.44093090331,42.61630665085,42.87400162681,42.9714425396,43.65352892912],"description":"Superstellated two out of 1 3 5 7 9 11 pentadekany"},"stelpent1":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,286.15296204753,290.69507255622,294.32876096318,305.22982618403,313.95067836072,327.03195662575,336.37572681506,343.38355445704,348.83408706747,353.19451315581,366.27579142084,367.91095120397,373.75080757229,381.53728273004,392.4383479509,406.97310157871,412.06026534844,420.46965851882,436.04260883433,441.49314144476,448.50096908674,457.84473927605,470.92601754108,490.54793493862,504.56359022259,508.71637697339,515.07533168556,523.2511306012],"description":"Stellated one out of 1 3 5 7 9 pentany"},"stelpent1s":{"frequencies":[261.6255653006,271.31540105247,274.70684356563,275.93321340298,280.31310567921,282.55561052465,286.15296204753,288.32205155576,290.69507255622,294.32876096318,301.46155672497,305.22982618403,309.04519901133,313.95067836072,315.35224388912,320.35783506196,321.92208230347,327.03195662575,329.64821227876,336.37572681506,339.14425131559,343.38355445704,348.83408706747,353.19451315581,360.4025644447,366.27579142084,367.91095120397,373.75080757229,381.53728273004,386.30649876417,387.59343007496,392.4383479509,395.57785473451,403.65087217807,406.97310157871,411.88864507966,412.06026534844,420.46965851882,429.2294430713,436.04260883433,439.53094970501,441.49314144476,448.50096908674,452.19233508746,457.84473927605,470.92601754108,480.53675259294,482.88312345521,488.36772189445,490.54793493862,494.47231841813,498.33441009638,504.56359022259,508.71637697339,515.07533168556,523.2511306012],"description":"Superstellated one out of 1 3 5 7 9 pentany"},"steltet1":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,286.15296204753,305.22982618403,313.95067836072,327.03195662575,343.38355445704,366.27579142084,373.75080757229,381.53728273004,392.4383479509,436.04260883433,448.50096908674,457.84473927605,490.54793493862,523.2511306012],"description":"Stellated one out of 1 3 5 7 tetrany"},"steltet1s":{"frequencies":[261.6255653006,274.70684356563,280.31310567921,286.15296204753,305.22982618403,313.95067836072,320.35783506196,327.03195662575,343.38355445704,366.27579142084,373.75080757229,381.53728273004,392.4383479509,429.2294430713,436.04260883433,439.53094970501,448.50096908674,457.84473927605,490.54793493862,508.71637697339,523.2511306012],"description":"Superstellated one out of 1 3 5 7 tetrany"},"steltet2":{"frequencies":[261.6255653006,267.07609791103,272.52663052146,286.15296204753,305.22982618403,327.03195662575,333.84512238879,343.38355445704,381.53728273004,392.4383479509,400.61414686654,408.78994578219,436.04260883433,457.84473927605,476.92160341255,490.54793493862,523.2511306012],"description":"Stellated three out of 1 3 5 7 tetrany"},"steltet2s":{"frequencies":[261.6255653006,286.15296204753,294.32876096318,300.46061014991,306.59245933664,327.03195662575,343.38355445704,350.53737850823,357.69120255941,367.91095120397,392.4383479509,400.61414686654,408.78994578219,429.2294430713,441.49314144476,457.84473927605,490.54793493862,500.76768358318,510.98743222773,515.07533168556,523.2511306012],"description":"Superstellated three out of 1 3 5 7 tetrany"},"steltri1":{"frequencies":[261.6255653006,313.95067836072,327.03195662575,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"Stellated one out of 1 3 5 triany"},"steltri2":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,392.4383479509,408.78994578219,490.54793493862,523.2511306012],"description":"Stellated two out of 1 3 5 triany"},"stevin":{"frequencies":[261.6255653006,277.20445571159,293.66434538175,311.1256573916,329.66931111467,349.25319089654,369.99797100919,392.00714009679,415.41055144586,440.15068186507,466.27261682516,494.00597677606,523.2511306012],"description":"Simon Stevin, monochord division of 10000 parts for 12-tET (1585)"},"stopper":{"frequencies":[261.6255653006,277.19910487213,293.6996776193,311.18246278326,329.70593120198,349.3320268423,370.12638880276,392.15855510068,415.50221189151,440.23542223935,466.44090588941,494.20629608476,523.62445363767,554.79375523088,587.81844599272,622.80896314278,659.88233179115,699.16252826162,740.78092441407,784.8766959018],"description":"Bernard Stopper, piano tuning with 19th root of 3 (1988)"},"storbeck":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,339.14425131559,348.83408706747,353.19451315581,358.80077526939,381.53728273004,387.59343007496,392.4383479509,403.65087217807,418.60090448096,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,523.2511306012],"description":"Ulrich Storbeck, 2001"},"strahle":{"frequencies":[261.6255653006,278.94941459687,296.90543930973,315.65242990842,335.0021118691,355.12744448111,376.24442122187,398.15684412917,421.10213511252,444.85552088095,469.94877954106,496.17080790016,523.2511306012],"description":"Strahle's Geometrical scale"},"sub24-12":{"frequencies":[261.6255653006,273.00058987889,285.40970760065,299.00064605783,313.95067836072,330.47439827444,348.83408706747,369.35373924791,392.4383479509,418.60090448096,448.50096908674,483.00104363188,523.2511306012],"description":"Subharmonics 24-12"},"sub24":{"frequencies":[261.6255653006,10.90106522086,11.37502457829,11.89207115003,12.45836025241,13.08127826503,13.76976659477,14.53475362781,15.38973913533,16.35159783129,17.44170435337,18.68754037861,20.12504348466,21.80213044172,23.78414230005,26.16255653006,29.06950725562,32.70319566257,37.37508075723,43.60426088343,52.32511306012,65.40639132515,87.20852176687,130.8127826503,261.6255653006],"description":"Subharmonics 24-1"},"sub40":{"frequencies":[261.6255653006,275.39533189537,290.69507255622,307.79478270659,327.03195662575,348.83408706747,373.75080757229,402.50086969323,418.60090448096,436.04260883433,475.68284600109,498.33441009638,523.2511306012],"description":"sub 40-20"},"sub48":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,313.95067836072,330.47439827444,348.83408706747,369.35373924791,392.4383479509,418.60090448096,448.50096908674,465.11211608996,502.32108537715,523.2511306012],"description":"12 of sub 48 (Leven)"},"sub50":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,311.45900631024,327.03195662575,344.24416486921,373.75080757229,384.74347838324,408.78994578219,436.04260883433,467.18850946536,484.4917875937,523.2511306012],"description":"12 of sub 50"},"sub8":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,322.00069575458,348.83408706747,380.54627680087,418.60090448096,465.11211608996,523.2511306012],"description":"Subharmonic series 1/16 - 1/8"},"sumatra":{"frequencies":[261.6255653006,266.79889483106,324.44528279699,356.96377863828,390.9602296356,474.47355835313,530.64156666967,639.28283484968,713.92755727656,784.8766959018],"description":"\"Archeological\" tuning of Pasirah Rus orch. in Muaralakitan, Sumatra. 1/1=354 Hz"},"super_10":{"frequencies":[261.6255653006,283.42769574232,305.22982618403,327.03195662575,348.83408706747,370.63621750918,392.4383479509,425.14154361347,457.84473927605,490.54793493862,523.2511306012],"description":"A superparticular 10-tone scale"},"super_11":{"frequencies":[261.6255653006,283.42769574232,305.22982618403,327.03195662575,348.83408706747,370.63621750918,392.4383479509,418.60090448096,444.76346101102,470.92601754108,497.08857407114,523.2511306012],"description":"A superparticular 11-tone scale"},"super_12":{"frequencies":[261.6255653006,279.06726965397,296.50897400735,313.95067836072,331.39238271409,348.83408706747,372.08969287196,395.34529867646,418.60090448096,441.85651028546,465.11211608996,494.18162334558,523.2511306012],"description":"A superparticular 12-tone scale"},"super_12_1":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,317.68818643644,336.37572681506,355.06326719367,373.75080757229,392.4383479509,418.60090448096,444.76346101102,470.92601754108,497.08857407114,523.2511306012],"description":"Another superparticular 12-tone scale"},"super_12_2":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,317.68818643644,336.37572681506,355.06326719367,373.75080757229,392.4383479509,420.46965851882,448.50096908674,473.41768959156,498.33441009638,523.2511306012],"description":"Another superparticular 12-tone scale"},"super_13":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,418.60090448096,444.76346101102,470.92601754108,497.08857407114,523.2511306012],"description":"A superparticular 13-tone scale"},"super_14":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,414.24047839262,436.04260883433,457.84473927605,479.64686971777,501.44900015948,523.2511306012],"description":"A superparticular 14-tone scale"},"super_15":{"frequencies":[261.6255653006,276.16031892841,290.69507255622,305.22982618403,319.76457981184,334.29933343966,348.83408706747,363.36884069528,381.53728273004,399.70572476481,417.87416679957,436.04260883433,457.84473927605,479.64686971777,501.44900015948,523.2511306012],"description":"A superparticular 15-tone scale"},"super_17":{"frequencies":[261.6255653006,274.08392555301,286.54228580542,299.00064605783,311.45900631024,323.91736656265,336.37572681506,348.83408706747,363.36884069528,377.90359432309,392.4383479509,411.12588832951,429.81342870813,448.50096908674,467.18850946536,485.87604984397,504.56359022259,523.2511306012],"description":"Superparticular 17-tone scale"},"super_19":{"frequencies":[261.6255653006,272.52663052146,283.42769574232,294.32876096318,305.22982618403,316.13089140489,327.03195662575,340.11323489078,353.19451315581,366.27579142084,379.35706968587,392.4383479509,408.13588186894,423.83341578697,439.53094970501,455.22848362304,470.92601754108,488.36772189445,505.80942624783,523.2511306012],"description":"Superparticular 19-tone scale"},"super_19_1":{"frequencies":[261.6255653006,272.09058791262,282.55561052465,293.02063313667,303.4856557487,313.95067836072,325.57848126297,337.20628416522,348.83408706747,363.36884069528,377.90359432309,392.4383479509,408.13588186894,423.83341578697,439.53094970501,455.22848362304,470.92601754108,488.36772189445,505.80942624783,523.2511306012],"description":"Superparticular 19-tone scale"},"super_19_2":{"frequencies":[261.6255653006,269.80136421624,277.97716313189,294.32876096318,302.50455987882,310.68035879446,318.85615771011,327.03195662575,343.38355445704,359.73515228832,376.08675011961,392.4383479509,408.78994578219,425.14154361347,441.49314144476,457.84473927605,474.19633710734,490.54793493862,506.89953276991,523.2511306012],"description":"Superparticular 19-tone scale"},"super_22":{"frequencies":[261.6255653006,270.96933548991,280.31310567921,289.65687586852,299.00064605783,308.34441624714,317.68818643644,327.03195662575,337.93302184661,348.83408706747,359.73515228832,370.63621750918,381.53728273004,392.4383479509,406.45400323486,420.46965851882,434.48531380278,448.50096908674,463.45100138963,478.40103369253,493.35106599542,508.30109829831,523.2511306012],"description":"Superparticular 22-tone scale"},"super_22_1":{"frequencies":[261.6255653006,272.09058791262,282.55561052465,293.02063313667,303.4856557487,313.95067836072,325.16320258789,336.37572681506,347.58825104223,358.80077526939,370.01329949656,381.22582372373,392.4383479509,405.51962621593,418.60090448096,431.68218274599,444.76346101102,457.84473927605,470.92601754108,484.00729580611,497.08857407114,510.16985233617,523.2511306012],"description":"Superparticular 22-tone scale"},"super_24":{"frequencies":[261.6255653006,270.34641747729,279.06726965397,287.78812183066,296.50897400735,305.22982618403,313.95067836072,322.67153053741,331.39238271409,340.11323489078,348.83408706747,359.73515228832,370.63621750918,381.53728273004,392.4383479509,405.51962621593,418.60090448096,431.68218274599,444.76346101102,457.84473927605,470.92601754108,484.00729580611,497.08857407114,510.16985233617,523.2511306012],"description":"Superparticular 24-tone scale, inverse of Mans.ur 'Awad"},"super_7":{"frequencies":[261.6255653006,287.78812183066,313.95067836072,353.19451315581,392.4383479509,431.68218274599,470.92601754108,523.2511306012],"description":"A superparticular 7-tone scale"},"super_8":{"frequencies":[261.6255653006,287.78812183066,313.95067836072,340.11323489078,366.27579142084,392.4383479509,436.04260883433,479.64686971777,523.2511306012],"description":"A superparticular 8 tone scale"},"super_9":{"frequencies":[261.6255653006,287.78812183066,313.95067836072,340.11323489078,366.27579142084,392.4383479509,425.14154361347,457.84473927605,490.54793493862,523.2511306012],"description":"A superparticular 9-tone scale"},"suppig":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,294.32876096318,306.59245933664,313.95067836072,327.03195662575,340.65828815182,348.83408706747,367.91095120397,376.74081403286,392.4383479509,408.78994578219,418.60090448096,436.04260883433,459.88868900496,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"Friedrich Suppig's 19-tone JI scale. Calculus Musicus, Berlin 1722"},"sur_7":{"frequencies":[261.6255653006,280.40333801024,327.729041887,351.25128999693,383.0422478503,410.5345162762,479.82340237272,523.2511306012],"description":"7-tone surupan"},"sur_9":{"frequencies":[261.6255653006,280.40333801024,305.78200836532,327.729041887,351.25128999693,383.0422478503,410.5345162762,447.69106452518,479.82340237272,523.2511306012],"description":"Theoretical nine-tone surupan gamut"},"sur_ajeng":{"frequencies":[261.6255653006,285.30470202322,305.78200836532,383.0422478503,417.71053321823,523.2511306012],"description":"Surupan ajeng"},"sur_degung":{"frequencies":[261.6255653006,322.09885310804,345.21700307457,396.55020354877,488.21056770985,523.2511306012],"description":"Surupan degung"},"sur_madenda":{"frequencies":[261.6255653006,322.09885310804,345.21700307457,425.01198472693,488.21056770985,523.2511306012],"description":"Surupan madenda"},"sur_melog":{"frequencies":[261.6255653006,280.40333801024,305.78200836532,383.0422478503,410.5345162762,523.2511306012],"description":"Surupan melog"},"sur_miring":{"frequencies":[261.6255653006,285.30470202322,305.78200836532,389.73770840504,417.71053321823,523.2511306012],"description":"Surupan miring"},"sur_x":{"frequencies":[261.6255653006,280.40333801024,305.78200836532,383.0422478503,417.71053321823,523.2511306012],"description":"Surupan tone-gender X (= unmodified nyorog)"},"sur_y":{"frequencies":[261.6255653006,280.40333801024,300.52885648597,383.0422478503,410.5345162762,523.2511306012],"description":"Surupan tone-gender Y (= mode on pamiring)"},"sverige":{"frequencies":[261.6255653006,293.66476791741,329.62755691287,349.22823143301,391.99543598175,440,466.16376151809,493.88330125613,523.2511306012,554.36526195375,587.32953583482,622.25396744417,659.25511382574,698.45646286601,739.98884542327,783.9908719635,830.60939515989,880,932.32752303618,987.76660251225,1046.5022612024,1174.65907166964,1318.51022765149,1396.91292573202,1567.98174392701],"description":"Scale on Swedish 50 crown banknote of some kind of violin."},"syntonolydian":{"frequencies":[261.6255653006,294.32876096318,331.11985608357,372.50983809402,392.4383479509,441.49314144476,496.67978412536,523.2511306012],"description":"Greek Syntonolydian, also genus duplicatum medium, or ditonum (Al-Farabi)"},"syrian":{"frequencies":[261.6255653006,268.67837258085,275.62199471997,279.38237857051,286.74979536837,294.32876096318,302.10804307229,310.07474405997,314.30517589183,322.59351978942,326.6631048533,331.11985608357,339.85160932548,348.83408706747,358.05397697456,367.49599295996,372.50983809402,382.33306049116,392.4383479509,402.81072409638,413.43299207996,419.07356785577,430.12469305256,441.49314144476,453.13547910064,465.11211608996,477.40530263275,489.99465727995,496.67978412536,509.77741398822,523.2511306012],"description":"After ^Sayh.'Ali ad-Darwis^ (Shaykh Darvish) from d'Erlanger vol.5, p.29"},"szpak_24":{"frequencies":[261.6255653006,270.98948203641,277.18263097687,287.10335517712,293.66476791741,304.17540907689,311.12698372208,322.26262012861,329.62755691287,341.42535271779,349.22823143301,361.7275606831,369.99442271164,383.23700075636,391.99543598175,406.02545869431,415.30469757995,430.16898885692,440,455.74816803176,466.16376151809,482.84836435151,493.88330125613,511.56002220218,523.2511306012],"description":"Stephen Szpak's scale, TL 2-1-2004"},"pagano_b":{"frequencies":[261.6255653006,277.97716313189,289.55954492905,312.72430852337,333.57259575826,351.8148470888,370.63621750918,389.16802838464,416.96574469783,444.76346101102,463.29527188648,486.4600354808,523.2511306012],"description":"Pat Pagano and David Beardsley, 17-limit scale, TL 27-2-2001"},"palace":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,299.00064605783,336.37572681506,348.83408706747,373.75080757229,392.4383479509,409.50088481833,428.11456140098,448.50096908674,470.92601754108,523.2511306012],"description":"Palace mode+"},"palace2":{"frequencies":[261.6255653006,277.01530443593,336.37572681506,348.83408706747,392.4383479509,428.11456140098,470.92601754108,523.2511306012],"description":"Byzantine Palace mode, 17-limit"},"panpipe1":{"frequencies":[261.6255653006,305.78200836532,346.61566493686,386.59871897734,424.03113209229,475.68400784708,523.2511306012],"description":"Palina panpipe of Solomon Islands. 1/1=f+45c. From Ocora CD Guadalcanal"},"panpipe2":{"frequencies":[261.6255653006,301.39807245198,340.46429857933,389.512652082,435.70052664441,481.48922855473,540.45338572244,606.98892366383,675.83458963267,749.45240308975,819.17415016614,915.78156525194,979.24522642508,1073.44040298899,1178.73719255088,1360.28482360484],"description":"Lalave panpipe of Solomon Islands. 1/1=f'+47c."},"panpipe3":{"frequencies":[261.6255653006,302.44445076078,341.44901934006,382.59999559751,433.19107626846,482.88183400971,542.01653249392,602.10016957865,677.78929781797,755.1012944609,822.018116801,906.30932187391,994.06270356141,1067.87449159209,1155.14617783291,1300.35790771888],"description":"Tenaho panpipe of Solomon Islands. 1/1=f'+67c."},"parachrom":{"frequencies":[261.6255653006,274.52698453615,288.06460709314,349.22823143301,391.99543598175,411.32572372413,431.60923940535,523.2511306012],"description":"Parachromatic, new genus 5 + 5 + 20 parts"},"parakleismic":{"frequencies":[261.6255653006,269.41173453909,271.00883762044,279.07425994419,280.72864356353,282.39283618632,290.79705467987,292.52093234567,301.22657042972,303.0122754386,312.03014360907,313.87989341557,323.22118988972,325.13728335605,327.06473376202,336.79842078181,338.79499972275,348.87778808468,350.94597487438,361.39038519337,363.53274806687,374.35175001315,376.5709514911,387.77797996035,390.07677146523,392.38919046486,404.06698135965,406.46233589795,418.55895395107,421.04021853379,433.57068509561,436.14094342919,449.12081866987,451.783257426,465.22865943552,467.98658728446,470.76086444006,484.77105399159,487.64483417146,502.15750307968,505.13434926963,520.16751901001,523.2511306012],"description":"Parakleismic temperament, g=315.250913, 5-limit"},"parizek":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,327.03195662575,343.38355445704,359.73515228832,392.4383479509,425.14154361347,441.49314144476,457.84473927605,490.54793493862,523.2511306012],"description":"Petr Parizek, 12-tone Linear Level tuning, 1/1=Ab"},"parizek_13lqmt":{"frequencies":[261.6255653006,272.70676208351,292.18581651805,313.05623198362,325.57848126297,348.83408706747,365.23227064756,391.32028997953,406.97310157871,436.04260883433,467.18850946536,486.97636086341,523.2511306012],"description":"April 2003 - Petr Parizek"},"parizek_17lqmt":{"frequencies":[261.6255653006,272.52663052146,291.99281841585,312.60407618638,327.03195662575,350.39138209902,364.70475555078,390.75509523297,408.78994578219,436.04260883433,467.18850946536,488.44386904122,523.2511306012],"description":"To tune the scale by ear, please choose the intervals in the following order:"},"parizek_7lmtd1":{"frequencies":[261.6255653006,280.31310567921,293.02063313667,313.95067836072,327.03195662575,350.39138209902,366.27579142084,392.4383479509,418.60090448096,437.98922762377,468.83301301868,490.54793493862,523.2511306012],"description":"Use SET MIDDLE 62"},"parizek_7lqmtd2":{"frequencies":[261.6255653006,280.31310567921,293.02063313667,313.95067836072,327.03195662575,350.39138209902,366.27579142084,390.69417751556,418.60090448096,437.98922762377,468.83301301868,488.36772189445,523.2511306012],"description":"Use SET MIDDLE 62"},"parizek_cirot":{"frequencies":[261.6255653006,273.76082553017,293.33333347996,307.98092841354,327.40170814054,348.04713286849,366.66693712906,392.88175996935,409.71484950008,438.01699797506,463.01593599647,491.10256480205,523.2511306012],"description":"Overtempered circular tuning (1/1 is F)"},"parizek_epi":{"frequencies":[261.6255653006,283.42769574232,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,392.4383479509,418.60090448096,436.04260883433,457.84473927605,479.64686971777,523.2511306012],"description":"In The Epimoric World"},"parizek_epi2":{"frequencies":[261.6255653006,283.42769574232,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,523.2511306012,523.2511306012],"description":"In the Epimoric World - extended (version for two keyboards)"},"parizek_epi2a":{"frequencies":[261.6255653006,283.42769574232,287.78812183066,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,392.4383479509,411.12588832951,418.60090448096,425.14154361347,436.04260883433,448.50096908674,457.84473927605,470.92601754108,479.64686971777,485.87604984397,523.2511306012,523.2511306012],"description":"April 2003 - Petr Parizek"},"parizek_ji1":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,305.22982618403,327.03195662575,343.38355445704,366.27579142084,392.4383479509,412.06026534844,436.04260883433,457.84473927605,490.54793493862,523.2511306012],"description":"Petr Parizek, 12-tone septimal tuning, 2002."},"parizek_jiweltmp":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,329.45441556372,348.83408706747,370.63621750918,392.4383479509,416.96574469783,440.63253103259,465.11211608996,494.18162334558,523.2511306012],"description":"April 2003 - Petr Parizek"},"jiwt2":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,310.68035879446,331.11985608357,348.83408706747,372.08969287196,392.4383479509,415.8649508569,441.49314144476,465.11211608996,496.67978412536,523.2511306012],"description":"June 2003 - Petr Parizek"},"parizek_llt7":{"frequencies":[261.6255653006,283.42769574232,327.03195662575,359.73515228832,392.4383479509,425.14154361347,479.64686971777,523.2511306012],"description":"7-tone mode of Linear Level Tuning 2000 (= wilson_helix)"},"parizek_qmeb1":{"frequencies":[261.6255653006,273.53155294581,293.066620053,305.25690181412,326.9069921792,350.33366042609,366.2083106197,392.1884190578,408.50877577745,437.87542071709,457.7197748295,488.61098601707,523.2511306012],"description":"Equal beating quasi-meantone tuning no. 1 - F...A# (1/1 = 261.7Hz)(3/2 5/3 5/4 7/4 7/6)"},"parizek_qmeb2":{"frequencies":[261.6255653006,274.12423619715,293.39509530855,306.21121252767,327.1564453797,350.32795211486,366.55713600477,391.6914154272,409.44351174042,438.20041390279,457.4712730142,489.73875803795,523.2511306012],"description":"Equal beating quasi-meantone tuning no. 2 - F...A# (1/1 = 262.7Hz)"},"parizek_qmeb3":{"frequencies":[261.6255653006,274.23252240717,293.57983281823,306.4052273004,327.28159934073,350.29865766202,366.78755898655,391.93906252094,409.53887392713,438.37260750749,457.59509656107,490.04864950866,523.2511306012],"description":"Equal beating quasi-meantone tuning no. 3 - F...A#. 1/1 = 262Hz"},"parizek_qmtp12":{"frequencies":[261.6255653006,273.55480692456,293.00227310437,305.44101254122,326.6631048533,350.4133380576,366.39100206434,391.84790908124,408.48291326839,437.52264545758,457.47219685667,489.2574430773,523.2511306012],"description":"12-tone quasi-meantone tuning with 1/9 Pyth. comma as basic tempering unit (F...A#)"},"parizek_qmtp24":{"frequencies":[261.6255653006,273.14323313659,280.64720643091,285.59764149034,293.00227310437,305.44101254122,313.83229199844,326.6631048533,335.63741195089,341.5578378819,350.4133380576,365.83975262993,375.89034660662,381.37064019061,391.84790908124,407.86833637529,419.07356785577,437.52264545758,448.86620556368,457.47219685667,469.33298761093,489.2574430773,502.69865025911,510.02774559919,523.2511306012],"description":"24-tone quasi-meantone tuning with 1/9 Pyth. comma as basic tempering unit (Bbb...C##)"},"parizek_syndiat":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,327.03195662575,348.83408706747,353.19451315581,387.59343007496,392.4383479509,436.04260883433,441.49314144476,484.4917875937,490.54793493862,523.2511306012],"description":"Petr Parizek, diatonic scale with syntonic alternatives"},"parizek_syntonal":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,294.32876096318,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,436.04260883433,441.49314144476,490.54793493862,523.2511306012],"description":"Petr Parizek, Syntonic corrections in JI tonality, Jan. 2004"},"parizek_temp19":{"frequencies":[261.6255653006,276.69969455132,294.32876096318,310.68035879446,328.58088727969,349.51540364377,368.93292606842,392.4383479509,415.04954182698,438.10784970625,466.02053819169,492.87133091954,523.2511306012],"description":"Petr Parizek, genus [3 3 19 19 19] well temperament"},"partch-barstow":{"frequencies":[261.6255653006,279.06726965397,287.78812183066,290.69507255622,294.32876096318,299.00064605783,313.95067836072,327.03195662575,348.83408706747,359.73515228832,373.75080757229,392.4383479509,418.60090448096,436.04260883433,448.50096908674,470.92601754108,479.64686971777,490.54793493862,523.2511306012],"description":"Guitar scale for Partch's Barstow (1941, 1968)"},"partch-greek":{"frequencies":[261.6255653006,261.6255653006,271.31540105247,294.32876096318,279.06726965397,348.83408706747,313.95067836072,392.4383479509,392.4383479509,406.97310157871,418.60090448096,418.60090448096,523.2511306012],"description":"Partch Greek scales from \"Two Studies on Ancient Greek Scales\" on black/white"},"partch-grm":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,294.32876096318,313.95067836072,348.83408706747,392.4383479509,406.97310157871,418.60090448096,523.2511306012],"description":"Partch Greek scales from \"Two Studies on Ancient Greek Scales\" mixed"},"partch-indian":{"frequencies":[261.6255653006,269.80136421624,277.97716313189,285.40970760065,294.32876096318,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,383.71749577421,392.4383479509,406.97310157871,411.12588832951,428.11456140098,441.49314144476,457.84473927605,475.68284600109,490.54793493862,507.3950357345,523.2511306012],"description":"Partch's Indian Chromatic, Exposition of Monophony, 1933."},"partch-ur":{"frequencies":[261.6255653006,267.07609791103,269.80136421624,274.08392555301,279.06726965397,285.40970760065,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,343.38355445704,348.83408706747,356.76213450082,359.73515228832,366.27579142084,373.75080757229,380.54627680087,383.71749577421,392.4383479509,398.6675280771,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,490.54793493862,499.46698830115,507.3950357345,512.57253609913,523.2511306012],"description":"Ur-Partch curved keyboard, published in Interval"},"partch_29-av":{"frequencies":[261.6255653006,269.80136421624,274.70684356563,280.31310567921,285.40970760065,290.69507255622,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,380.54627680087,392.4383479509,406.97310157871,418.60090448096,428.11456140098,436.04260883433,448.50096908674,457.84473927605,470.92601754108,479.64686971777,488.36772189445,498.33441009638,507.3950357345,523.2511306012],"description":"29-tone JI scale from Partch's Adapted Viola 1928-30"},"partch_29":{"frequencies":[261.6255653006,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,380.54627680087,392.4383479509,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,523.2511306012],"description":"Partch/Ptolemy 11-limit Diamond"},"partch_37":{"frequencies":[261.6255653006,267.07609791103,269.80136421624,274.08392555301,279.06726965397,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,380.54627680087,392.4383479509,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,490.54793493862,499.46698830115,507.3950357345,512.57253609913,523.2511306012],"description":"From \"Exposition on Monophony\" 1933, unp. see Ayers, 1/1 vol.9(2)"},"partch_39":{"frequencies":[261.6255653006,267.07609791103,269.80136421624,274.08392555301,279.06726965397,285.40970760065,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,343.38355445704,348.83408706747,356.76213450082,359.73515228832,366.27579142084,373.75080757229,380.54627680087,383.71749577421,392.4383479509,398.6675280771,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,490.54793493862,499.46698830115,507.3950357345,512.57253609913,523.2511306012],"description":"Ur-Partch Keyboard 39 tones, published in Interval"},"partch_41":{"frequencies":[261.6255653006,281.75060878526,283.42769574232,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,309.19384990071,313.95067836072,319.76457981184,322.00069575458,327.03195662575,332.97799220076,336.37572681506,340.11323489078,348.83408706747,359.73515228832,362.25078272391,366.27579142084,373.75080757229,377.90359432309,380.54627680087,392.4383479509,402.50086969323,406.97310157871,411.12588832951,418.60090448096,425.14154361347,428.11456140098,436.04260883433,442.75095666255,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,483.00104363188,485.87604984397,523.2511306012],"description":"13-limit Diamond after Partch, Genesis of a Music, p 454, 2nd edition"},"partch_41a":{"frequencies":[261.6255653006,267.07609791103,269.80136421624,274.08392555301,279.06726965397,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,343.38355445704,348.83408706747,356.76213450082,359.73515228832,366.27579142084,373.75080757229,380.54627680087,383.71749577421,392.4383479509,398.6675280771,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,490.54793493862,499.46698830115,507.3950357345,512.57253609913,523.2511306012],"description":"From \"Exposition on Monophony\" 1933, unp. see Ayers, 1/1 vol. 9(2)"},"partch_41comb":{"frequencies":[261.6255653006,267.07609791103,269.80136421624,274.08392555301,274.70684356563,279.06726965397,280.31310567921,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,348.83408706747,359.73515228832,366.27579142084,373.75080757229,380.54627680087,392.4383479509,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,488.36772189445,490.54793493862,498.33441009638,499.46698830115,507.3950357345,512.57253609913,523.2511306012],"description":"41-tone JI combination from Partch's 29-tone and 37-tone scales"},"partch_43":{"frequencies":[261.6255653006,264.89588486686,269.80136421624,274.70684356563,279.06726965397,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,310.07474405997,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,343.38355445704,348.83408706747,353.19451315581,359.73515228832,366.27579142084,373.75080757229,380.54627680087,387.59343007496,392.4383479509,398.6675280771,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,441.49314144476,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,490.54793493862,498.33441009638,507.3950357345,516.79124009995,523.2511306012],"description":"Harry Partch's 43-tone pure scale"},"partch_43a":{"frequencies":[261.6255653006,267.07609791103,269.80136421624,274.70684356563,279.06726965397,285.40970760065,287.78812183066,290.69507255622,294.32876096318,299.00064605783,305.22982618403,310.07474405997,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,343.38355445704,348.83408706747,356.76213450082,359.73515228832,366.27579142084,373.75080757229,380.54627680087,383.71749577421,392.4383479509,398.6675280771,406.97310157871,411.12588832951,418.60090448096,428.11456140098,436.04260883433,441.49314144476,448.50096908674,457.84473927605,465.11211608996,470.92601754108,475.68284600109,479.64686971777,490.54793493862,498.33441009638,507.3950357345,512.57253609913,523.2511306012],"description":"From \"Exposition on Monophony\" 1933, unp. see Ayers, 1/1 vol. 9(2)"},"patala":{"frequencies":[261.6255653006,289.6217982776,320.24370022528,355.94891173479,393.58362272115,439.74591942221,480.6555937997,537.34060327431],"description":"Observed patala tuning from Burma, Helmholtz/Ellis p. 518, nr.83"},"pelog1":{"frequencies":[261.6255653006,285.79952600623,313.83440569119,359.87690576543,393.35634555235,426.98050185716,482.04578814299,523.2511306012],"description":"Gamelan Saih pitu from Ksatria, Den Pasar (South Bali). 1/1=312.5 Hz"},"pelog10":{"frequencies":[261.6255653006,290.16653606067,310.14521470005,342.49164912079,385.30310526088,418.60090448096,442.38504678101,523.2511306012],"description":"Balinese saih 7 scale, Krobokan. 1/1=275 Hz. McPhee, 1966"},"pelog11":{"frequencies":[261.6255653006,289.11520789678,327.03195662575,352.6257619269,388.64667309147,441.73012112348,478.69895237627,523.2511306012],"description":"Balinese saih pitu, gamelan luang, banjar Se`se'h. 1/1=276 Hz. McPhee, 1966"},"pelog11i":{"frequencies":[261.6255653006,267.83009854382,287.76973397991,309.19384990071,332.21296611011,356.94582815655,383.52002471837,392.61532371972,421.84506978464,453.25093845942,486.99493426005,523.2511306012],"description":"George Secor's isopelogic scale with ~537.84194 generator and just 13/11"},"pelog12":{"frequencies":[261.6255653006,284.41230790592,308.04300430555,358.68021049276,385.68672051706,409.31741667997,472.61392441399,523.2511306012],"description":"Balinese saih pitu, gamelan Semar Pegulingan, Tampak Gangsai, 1/1=310, McPhee"},"pelog13":{"frequencies":[261.6255653006,289.80062617913,323.61069924911,351.78575931905,394.45085229937,454.02098012766,494.27106657141,523.2511306012],"description":"Balinese saih pitu, gamelan Semar Pegulingan, Klungkung, 1/1=325. McPhee, 1966"},"pelog14":{"frequencies":[261.6255653006,287.66412867175,309.98289727559,347.18084494866,375.69927149802,402.97776645827,427.77639824032,523.2511306012],"description":"Balinese saih pitu, suling gambuh, Tabanan, 1/1=211 Hz, McPhee, 1966"},"pelog15":{"frequencies":[261.6255653006,284.9387344858,307.6043148279,344.51683351465,375.60105909492,407.98046074103,427.4081017287,523.2511306012],"description":"Balinese saih pitu, suling gambuh, Batuan, 1/1=202 Hz. McPhee, 1966"},"pelog2":{"frequencies":[261.6255653006,285.30470202322,314.92395982138,345.81573716922,388.6137256405,424.52127512829,466.97226207056,523.2511306012],"description":"Bamboo gambang from Batu lulan (South Bali). 1/1=315 Hz"},"pelog3":{"frequencies":[261.6255653006,285.63448939555,315.83481057014,390.18821123181,421.34544350737,523.2511306012],"description":"Gamelan Gong from Padangtegal, distr. Ubud (South Bali). 1/1=555 Hz"},"pelog4":{"frequencies":[261.6255653006,290.96323214696,317.29765457754,352.87817160549,385.03871768789,434.94616895528,470.49199937597,523.2511306012],"description":"Hindu-Jav. demung, excavated in Banjarnegara. 1/1=427 Hz"},"pelog5":{"frequencies":[261.6255653006,284.64626913494,310.94732162256,358.21775774651,390.8649420513,427.47405410759,468.32288027948,523.2511306012],"description":"Gamelan Kyahi Munggang (Paku Alaman, Jogja). 1/1=199.5 Hz"},"pelog6":{"frequencies":[261.6255653006,282.02769802256,315.83481057014,354.51258839996,386.37547528213,413.39000965417,523.2511306012],"description":"Gamelan Semar pegulingan, Ubud (S. Bali). 1/1=263.5 Hz"},"pelog7":{"frequencies":[261.6255653006,281.2143451833,303.31920717687,353.89879686059,384.81637482457,412.43597848639,448.72664641273,523.2511306012],"description":"Gamelan Kantjilbelik (kraton Jogja). Measured by Surjodiningrat, 1972."},"pelog8":{"frequencies":[261.6255653006,281.2143451833,305.0763174688,362.1707891162,386.59871897734,415.30469757995,456.83405152976,529.33101587613,573.91491069685,623.33318620372,730.64478690489,786.25839925218,840.74610520523,945.88853913022,1075.30214607265],"description":"from William Malm: Music Cultures of the Pacific, the Near East and Asia."},"pelog9":{"frequencies":[261.6255653006,282.57123920205,305.19382000629,356.01745236555,384.52011812375,415.30469757995,448.5538823653,523.2511306012],"description":"9-tET Pelog"},"pelog9i":{"frequencies":[261.6255653006,287.76973397991,309.19384990071,332.21296611011,356.94582815655,383.52002471837,421.84506978464,453.25093845942,486.99493426005,523.2511306012],"description":"George Secor's isopelogic scale with ~537.84194 generator and just 13/11"},"pelog_24":{"frequencies":[261.6255653006,293.66476791741,320.24370022528,349.22823143301,391.99543598175,440,479.82340237272,523.2511306012],"description":"Subset of 24-tET (Sumatra?)"},"pelog_a":{"frequencies":[261.6255653006,280.7274598329,305.95868600104,363.84824628932,386.82209166041,411.72190027758,452.10885997356,523.2511306012],"description":"Pelog, average class A. Kunst 1949"},"pelog_alv":{"frequencies":[261.6255653006,299.00064605783,313.95067836072,343.38355445704,392.4383479509,418.60090448096,457.84473927605,523.2511306012],"description":"Bill Alves JI Pelog, 1/1 vol. 9 no. 4, 1997. 1/1=293.33"},"pelog_av":{"frequencies":[261.6255653006,280.40333801024,305.78200836532,357.39105439675,385.26118901859,411.72190027758,452.89298412314,523.2511306012],"description":"\"Normalised Pelog\", Kunst, 1949. Average of 39 Javanese gamelans"},"pelog_b":{"frequencies":[261.6255653006,280.07959041159,302.79405018898,354.30787302884,382.82105786018,408.64182041696,451.58686491179,523.2511306012],"description":"Pelog, average class B. Kunst 1949"},"pelog_c":{"frequencies":[261.6255653006,279.91785681123,304.37225518229,350.84574289301,384.81637482457,410.29745071461,451.58686491179,523.2511306012],"description":"Pelog, average class C. Kunst 1949"},"pelog_he":{"frequencies":[261.6255653006,283.17034563789,338.50336851425,364.68988616898,389.06292924114,420.13030572059,493.31307433255,523.2511306012],"description":"Observed Javanese Pelog scale, Helmholtz/Ellis p. 518, nr.96"},"pelog_jc":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,392.4383479509,418.60090448096,523.2511306012],"description":"John Chalmers' Pelog, on keys C# E F# A B c#, like Olympos' Enharmonic on 4/3"},"pelog_laras":{"frequencies":[261.6255653006,283.42769574232,305.22982618403,370.63621750918,392.4383479509,414.24047839262,457.84473927605,523.2511306012],"description":"Lou Harrison, gamelan \"Si Betty\""},"pelog_me1":{"frequencies":[261.6255653006,281.13654920971,305.96893643544,353.85975480175,389.33427481332,412.3928606827,454.07565526112,523.2511306012],"description":"Gamelan Kyahi Kanyut Mesem pelog (Mangku Nagaran). 1/1=295 Hz"},"pelog_me2":{"frequencies":[261.6255653006,277.86440299076,299.96729002515,349.58586605592,383.41679241104,405.97081699752,447.47001910635,523.2511306012],"description":"Gamelan Kyahi Bermara (kraton Jogja). 1/1=290 Hz"},"pelog_me3":{"frequencies":[261.6255653006,281.75056896146,306.90688773629,358.59164065877,385.12012728597,411.64865826518,457.38747412584,523.2511306012],"description":"Gamelan Kyahi Pangasih (kraton Solo). 1/1=286 Hz"},"pelog_pa":{"frequencies":[261.6255653006,286.29520819723,313.29104303136,342.83241505062,387.04559340587,423.54155496477,463.47885582013,523.2511306012],"description":"\"Blown fifth\" pelog, von Hornbostel, type a."},"pelog_pa2":{"frequencies":[261.6255653006,286.29520819723,313.29104303136,353.69443592699,387.04559340587,423.54155496477,463.47885582013,523.2511306012],"description":"New mixed gender Pelog"},"pelog_pb":{"frequencies":[261.6255653006,277.98432293805,304.19649364034,353.69443592699,387.04559340587,411.24653512154,450.02449304881,523.2511306012],"description":"\"Primitive\" Pelog, step of blown semi-fourths, von Hornbostel, type b."},"pelog_pb2":{"frequencies":[261.6255653006,277.50302994288,303.66981774726,353.69443592699,387.04559340587,410.5345162762,449.24533531117,523.2511306012],"description":"\"Primitive\" Pelog, Kunst: Music in Java, p. 28"},"pelog_schmidt":{"frequencies":[261.6255653006,287.78812183066,313.95067836072,366.27579142084,392.4383479509,418.60090448096,470.92601754108,523.2511306012],"description":"Modern Pelog designed by Dan Schmidt and used by Berkeley Gamelan"},"pelog_selun":{"frequencies":[261.6255653006,281.10829462369,350.68958753059,378.52209447746,416.55977244877,523.2511306012,562.21664032682,701.37917506118,757.04418895493,833.11970794305,1046.5022612024,1124.43328065364],"description":"Gamelan selunding from Kengetan, South Bali (Pelog), 1/1=141 Hz"},"pelog_slen":{"frequencies":[261.6255653006,289.4545544734,306.66641795878,334.42210013281,344.22141564971,354.30787302884,386.37547528213,397.69714089209,446.39994737251,459.48046426806,493.88330125613,523.2511306012],"description":"W.P. Malm, pelog+slendro, Musical Cultures Of The Pacific, The Near East, And Asia. P: 1,3,5,6,8,10; S: 2,4,7,9"},"pelog_str":{"frequencies":[261.6255653006,282.73796785026,305.22982618403,329.86096249197,356.10146388137,384.83778957396,415.4517078616,448.97742116962,484.69365917187,523.80699136456],"description":"JI Pelog with stretched 2/1 and extra tones between 2-3, 6-7. Wolf, XH 11, '87"},"pelogic":{"frequencies":[261.6255653006,268.93425429917,294.59920226397,322.71340889889,353.51061198674,363.38617257172,398.06486099125,436.0530078362,477.66644151787,523.2511306012],"description":"Pelogic temperament, g=521.1, 5-limit"},"pelogic2":{"frequencies":[261.6255653006,252.56770712848,285.96465797334,276.06414495892,312.56802260838,301.74646235804,341.64630500046,386.82209166041,373.42974737602,422.80824892286,408.17001145418,462.1422075194,523.2511306012],"description":"Pelogic temperament, g=677.0 in cycle of fifths order"},"penta1":{"frequencies":[261.6255653006,282.55561052465,294.32876096318,313.95067836072,331.11985608357,372.50983809402,376.74081403286,397.34382730029,423.83341578697,441.49314144476,470.92601754108,496.67978412536,523.2511306012],"description":"Pentagonal scale 9/8 3/2 16/15 4/3 5/3"},"penta2":{"frequencies":[261.6255653006,267.07609791103,286.15296204753,305.22982618403,312.97980223949,333.84512238879,356.10146388137,363.36884069528,400.61414686654,436.04260883433,457.84473927605,476.92160341255,523.2511306012],"description":"Pentagonal scale 7/4 4/3 15/8 32/21 6/5"},"penta_opt":{"frequencies":[261.6255653006,292.5084949701,327.03692214239,391.62201198054,436.95817401562,523.2511306012],"description":"Optimally consonant major pentatonic, John deLaubenfels, 2001"},"pentadekany":{"frequencies":[261.6255653006,283.42769574232,299.7792935736,305.22982618403,327.03195662575,354.2846196779,359.73515228832,381.53728273004,389.71308164569,419.69101100305,425.14154361347,436.04260883433,457.84473927605,479.64686971777,495.99846754905,523.2511306012],"description":"2)6 1.3.5.7.11.13 Pentadekany (1.3 tonic)"},"pentadekany2":{"frequencies":[261.6255653006,269.80136421624,294.32876096318,299.7792935736,305.22982618403,327.03195662575,343.38355445704,359.73515228832,381.53728273004,392.4383479509,419.69101100305,436.04260883433,457.84473927605,479.64686971777,490.54793493862,523.2511306012],"description":"2)6 1.3.5.7.9.11 Pentadekany (1.3 tonic)"},"pentadekany3":{"frequencies":[261.6255653006,277.97716313189,278.79474302345,287.78812183066,291.4672313427,300.86940009569,305.77487944508,319.67373760167,359.73515228832,376.08675011961,405.51962621593,413.69542513157,430.86460285443,444.76346101102,506.89953276991,523.2511306012],"description":"2)6 1.5.11.17.23.31 Pentadekany (1.5 tonic)"},"pentatetra1":{"frequencies":[261.6255653006,275.39533189537,290.69507255622,327.03195662575,348.83408706747,392.4383479509,413.09299784305,436.04260883433,490.54793493862,523.2511306012],"description":"Penta-tetrachord 20/19 x 19/18 x 18/17 x 17/16 = 5/4. 5/4 x 16/15 = 4/3"},"pentatetra2":{"frequencies":[261.6255653006,275.39533189537,307.79478270659,327.03195662575,348.83408706747,392.4383479509,413.09299784305,461.69217405988,490.54793493862,523.2511306012],"description":"Penta-tetrachord 20/19 x 19/18 x 18/17 x 17/16 = 5/4. 5/4 x 16/15 = 4/3"},"pentatetra3":{"frequencies":[261.6255653006,290.69507255622,307.79478270659,327.03195662575,348.83408706747,392.4383479509,436.04260883433,461.69217405988,490.54793493862,523.2511306012],"description":"Penta-tetrachord 20/19 x 19/18 x 18/17 x 17/16 = 5/4. 5/4 x 16/15 = 4/3"},"pentatriad":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,327.03195662575,348.83408706747,367.91095120397,392.4383479509,436.04260883433,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"4:5:6 Pentatriadic scale"},"pentatriad1":{"frequencies":[261.6255653006,290.69507255622,294.32876096318,327.03195662575,348.83408706747,387.59343007496,392.4383479509,436.04260883433,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"3:5:9 Pentatriadic scale"},"pepper":{"frequencies":[261.6255653006,274.70684356563,290.69507255622,294.32876096318,305.22982618403,327.03195662575,343.38355445704,348.83408706747,367.91095120397,392.4383479509,406.97310157871,436.04260883433,441.49314144476,457.84473927605,465.11211608996,490.54793493862,515.07533168556,523.2511306012],"description":"Keenan Pepper's 17-tone jazz tuning, TL 07-06-2000"},"pepper2":{"frequencies":[261.6255653006,281.81099471089,295.05751399041,308.92668738628,332.76158224462,348.40303271111,375.28368107222,392.9238840789,423.23948674937,443.13385158124,463.96335069158,499.75992392917,523.2511306012],"description":"Keenan Pepper's \"Noble Fifth\" with chromatic/diatonic semitone = Phi (12)"},"peprmint":{"frequencies":[261.6255653006,270.64528749638,281.81099405977,291.52662269553,295.0575145017,305.22982618403,308.92668738628,319.57714845986,332.76158147578,344.23376699744,348.40303331485,360.41446869983,375.28368085545,388.22184514393,392.92388339801,406.47020562703,423.23948723831,437.83096109824,443.13385158124,458.41119713782,463.9633498876,479.95880678291,499.75992479518,516.98949333115,523.2511306012],"description":"Peppermint 24: Wilson/Pepper apotome/limma=Phi, 2 chains spaced for pure 7:6"},"perkis-indian":{"frequencies":[261.6255653006,269.10058145205,277.01530443593,285.40970760065,294.32876096318,303.82323712328,313.95067836072,327.03195662575,336.37572681506,348.83408706747,358.01393146398,369.99442271164,377.90359432309,388.70083987518,400.13321751856,412.18367363396,425.14154361347,438.99882991118,453.48431318771,469.12170329763,485.27322596079,503.87145909745,523.2511306012],"description":"Indian 22 Perkis"},"perrett-tt":{"frequencies":[261.6255653006,274.70684356563,286.15296204753,294.32876096318,305.22982618403,313.95067836072,327.03195662575,343.38355445704,348.83408706747,366.27579142084,381.53728273004,392.4383479509,412.06026534844,418.60090448096,436.04260883433,457.84473927605,470.92601754108,490.54793493862,515.07533168556,523.2511306012],"description":"Perrett Tierce-Tone"},"perrett":{"frequencies":[261.6255653006,274.70684356563,279.06726965397,348.83408706747,392.4383479509,412.06026534844,418.60090448096,523.2511306012],"description":"Perrett / Tartini / Pachymeres Enharmonic"},"perrett_14":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,305.22982618403,327.03195662575,343.38355445704,348.83408706747,366.27579142084,392.4383479509,412.06026534844,436.04260883433,457.84473927605,490.54793493862,515.07533168556,523.2511306012],"description":"Perrett's 14-tone system (subscale of tierce-tone)"},"perrett_chrom":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,348.83408706747,392.4383479509,412.06026534844,441.49314144476,523.2511306012],"description":"Perrett's Chromatic"},"perry":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,490.54793493862,523.2511306012],"description":"Robin Perry, Tuning List 22-9-'98"},"perry2":{"frequencies":[261.6255653006,274.70684356563,290.69507255622,305.22982618403,327.03195662575,348.83408706747,373.75080757229,392.4383479509,415.27867508032,436.04260883433,457.84473927605,498.33441009638,523.2511306012],"description":"Robin Perry, 7-limit scale, TL 22-10-2006"},"perry3":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,307.79478270659,327.03195662575,348.83408706747,369.35373924791,370.63621750918,392.4383479509,418.60090448096,444.76346101102,465.11211608996,492.47165233054,523.2511306012],"description":"Robin Perry, symmetrical 3,5,17 scale, TL 22-10-2006"},"persian-far":{"frequencies":[261.6255653006,275.58617649731,282.84340331238,294.51413096332,310.22971009486,318.39923223688,331.53706992441,349.22823143301,362.58942698662,376.46181130035,391.99543598175,412.91271853531,423.78627283082,441.27260666252,464.81937009253,477.05982293263,496.7443381147,523.2511306012],"description":"Hormoz Farhat, average of observed Persian tar and sehtar tunings (1966)"},"persian-vaz":{"frequencies":[261.6255653006,277.18263097687,285.30470202322,293.66476791741,311.12698372208,320.24370022528,329.62755691287,349.22823143301,359.46139971304,380.8360868427,391.99543598175,415.30469757995,427.47405410759,440,466.16376151809,479.82340237272,493.88330125613,523.2511306012],"description":"Vaziri's Persian tuning, using quartertones"},"persian":{"frequencies":[261.6255653006,275.62199471997,282.55561052465,294.32876096318,310.07474405997,317.87506184023,331.11985608357,348.83408706747,363.36884069528,376.74081403286,392.4383479509,413.43299207996,423.83341578697,441.49314144476,465.11211608996,476.81259276034,496.67978412536,523.2511306012],"description":"Persian Tar Scale, from Dariush Anooshfar, Internet Tuning List 2/10/94"},"persian2":{"frequencies":[261.6255653006,275.62199471997,288.32205155576,294.32876096318,310.07474405997,321.08592105074,331.11985608357,348.83408706747,367.49599295996,384.42940207435,392.4383479509,413.43299207996,428.11456140098,441.49314144476,465.11211608996,489.99465727995,512.57253609913,523.2511306012],"description":"Traditional Persian scale, from Mark Rankin"},"phi1_13":{"frequencies":[261.6255653006,272.27874348295,293.41755524936,305.36527715608,329.07281683115,342.47239171077,356.41758627629,384.088434771,399.72820043646,416.00480451705,448.3020273708,466.55651779723,502.7784067407,523.2511306012],"description":"Pythagorean scale with (Phi + 1) / 2 as fifth"},"phi_10":{"frequencies":[261.6255653006,277.06593756944,293.41755524936,323.38703872151,342.47239171077,362.68389667063,399.72820043646,423.31898451752,448.3020273708,494.09131284284,523.2511306012],"description":"Pythagorean scale with Phi as fifth"},"phi_12":{"frequencies":[261.6255653006,280.653851324,301.06608340242,314.41721066027,337.28508524374,352.24238645938,377.86132347501,405.34355110824,423.31898451752,454.10739278061,474.24531572837,508.73764640933,531.29821178855],"description":"Non-Octave Pythagorean scale with Phi as fourth. Jacky Ligon TL 12-04-2001"},"phi_13":{"frequencies":[261.6255653006,277.06593756944,293.41755524936,305.36527715608,323.38703872151,342.47239171077,362.68389667063,377.45230514615,399.72820043646,423.31898451752,448.3020273708,466.55651779723,494.09131284284,523.2511306012],"description":"Pythagorean scale with Phi as fifth"},"phi_13a":{"frequencies":[261.6255653006,280.653851324,293.09977429907,314.41721066027,328.36040925687,352.24238645938,377.86132347501,394.61802538749,423.31898451752,442.09155952525,474.24531572837,508.73764640933,531.29821178855,569.94005600595],"description":"Non-Octave Pythagorean scale with Phi as fifth, Jacky Ligon TL 12-04-2001"},"phi_13b":{"frequencies":[261.6255653006,277.56939878091,287.90530191745,305.45065986668,316.82478268872,336.13253486432,356.61692887617,369.89633953852,392.4383479509,407.05164722964,431.8579526603,458.17598957099,475.23717379553,504.19880204444],"description":"Non-Octave Pythagorean scale with 12 3/2s, Jacky Ligon, TL 12-04-2001"},"phi_17":{"frequencies":[261.6255653006,276.86436108535,292.99059544936,310.05629713556,328.11582814217,347.22745468775,367.4522682176,388.8548834608,411.50435256812,435.47307590797,460.83762934409,487.67984759381,516.08523529366,546.14543793146,577.9565447239,611.62018657326,647.24497389216,684.94478342154],"description":"Phi + 1 equal division by 17, Brouncker (1653)"},"phi_7b":{"frequencies":[261.6255653006,277.06593756944,299.7954575021,323.38703872151,342.47239171077,369.42210382256,399.72820043646,423.31898451752],"description":"Heinz Bohlen's Pythagorean scale with Phi as fifth (1999)"},"phi_7be":{"frequencies":[261.6255653006,277.18263097687,299.37379946195,323.3415889232,342.56848033562,369.99442271164,399.61607881612,423.37848741825],"description":"36-tET approximation of phi_7b"},"phi_8":{"frequencies":[261.6255653006,280.010356995,292.01318753119,312.53354015396,325.93049860793,348.83408706747,373.34714284662,389.35091690288,416.71138708025],"description":"Non-Octave Pythagorean scale with 4/3s, Jacky Ligon, TL 12-04-2001"},"phi_8a":{"frequencies":[261.6255653006,275.77662731691,284.90271245142,300.31281179658,310.2506767011,327.03195662575,344.72084112096,356.12824371673,375.39107678967],"description":"Non-Octave Pythagorean scale with 5/4s, Jacky Ligon, TL 12-04-2001"},"phillips_19":{"frequencies":[261.6255653006,274.63272075836,286.12988535196,293.66476791741,305.42895910556,326.59518553839,329.62755691287,342.83241505062,349.22823143301,366.5907009274,384.81637482457,391.99543598175,407.69874723177,428.71043212875,440,457.62637091093,489.33987776603,493.88330125613,513.66823365307,523.2511306012],"description":"Pauline Phillips, organ manual scale, TL 7-10-2002"},"phillips_19a":{"frequencies":[261.6255653006,274.58143914872,285.65749968142,293.61100773131,305.45468261618,326.62388782443,329.50688232588,342.79852229325,349.26020182051,366.55580177366,381.34192228364,391.95955371998,407.7704102616,427.96347506501,439.87918162894,457.62301915088,489.33808574423,493.65730140218,509.07699553894,523.2511306012],"description":"Adaptation by Gene Ward Smith with more consonant chords, TL 25-10-2002"},"phillips_22":{"frequencies":[261.6255653006,275.93321340298,286.15296204753,294.32876096318,305.5744765615,306.59245933664,327.03195662575,331.11985608357,343.38355445704,349.22797321314,367.91095120397,392.4383479509,407.76797091773,408.78994578219,416.96574469783,429.2294430713,441.49314144476,457.84473927605,459.88868900496,490.54793493862,496.67978412536,515.07533168556,523.2511306012],"description":"All-key 19-limit JI scale (2002), TL 21-10-2002"},"phillips_ji":{"frequencies":[261.6255653006,275.93321340298,286.15296204753,294.32876096318,305.5744765615,306.59245933664,327.03195662575,331.11985608357,349.22797321314,367.91095120397,386.30649876417,392.4383479509,407.76797091773,408.78994578219,429.2294430713,441.49314144476,457.84473927605,459.88868900496,490.54793493862,496.67978412536,515.07533168556,523.2511306012],"description":"Pauline Phillips, JI 0 #/b \"C\" scale (2002), TL 8-10-2002"},"phryg_chromcon2":{"frequencies":[261.6255653006,283.42769574232,294.32876096318,305.22982618403,392.4383479509,414.24047839262,436.04260883433,523.2511306012],"description":"Harmonic Conjunct Chromatic Phrygian"},"phryg_chromconi":{"frequencies":[261.6255653006,283.42769574232,348.83408706747,370.63621750918,392.4383479509,479.64686971777,501.44900015948,523.2511306012],"description":"Inverted Conjunct Chromatic Phrygian"},"phryg_chrominv":{"frequencies":[261.6255653006,272.52663052146,283.42769574232,348.83408706747,392.4383479509,414.24047839262,436.04260883433,523.2511306012],"description":"Inverted Schlesinger's Chromatic Phrygian"},"phryg_chromt":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,313.95067836072,324.77656382143,336.37572681506,362.25078272391,392.4383479509,409.50088481833,418.60090448096,428.11456140098,470.92601754108,523.2511306012,554.03060887186,588.65752192635,627.90135672144,649.55312764287,672.75145363011,724.50156544782,784.8766959018,819.00176963666,837.20180896192,856.22912280196,941.85203508216,1046.5022612024],"description":"Phrygian Chromatic Tonos"},"phryg_diat":{"frequencies":[261.6255653006,285.40970760065,313.95067836072,348.83408706747,369.35373924791,392.4383479509,448.50096908674,483.00104363188,523.2511306012],"description":"Schlesinger's Phrygian Harmonia, a subharmonic series through 13 from 24"},"phryg_diatcon":{"frequencies":[261.6255653006,285.40970760065,313.95067836072,348.83408706747,369.35373924791,448.50096908674,483.00104363188,523.2511306012],"description":"A Phrygian Diatonic with its own trite synemmenon replacing paramese"},"phryg_diatinv":{"frequencies":[261.6255653006,283.42769574232,305.22982618403,370.63621750918,392.4383479509,436.04260883433,479.64686971777,523.2511306012],"description":"Inverted Conjunct Phrygian Harmonia with 17, the local Trite Synemmenon"},"phryg_diatsinv":{"frequencies":[261.6255653006,283.42769574232,305.22982618403,348.83408706747,370.63621750918,392.4383479509,436.04260883433,479.64686971777,523.2511306012],"description":"Inverted Schlesinger's Phrygian Harmonia, a harmonic series from 12 from 24"},"phryg_enh":{"frequencies":[261.6255653006,267.19206668997,273.00058987889,348.83408706747,392.4383479509,405.0976494977,418.60090448096,523.2511306012],"description":"Schlesinger's Phrygian Harmonia in the enharmonic genus"},"phryg_enhcon":{"frequencies":[261.6255653006,283.42769574232,288.87822835275,294.32876096318,392.4383479509,403.33941317176,414.24047839262,523.2511306012],"description":"Harmonic Conjunct Enharmonic Phrygian"},"phryg_enhinv":{"frequencies":[261.6255653006,327.03195662575,337.93302184661,348.83408706747,392.4383479509,501.44900015948,512.35006538034,523.2511306012],"description":"Inverted Schlesinger's Enharmonic Phrygian Harmonia"},"phryg_enhinv2":{"frequencies":[261.6255653006,267.07609791103,272.52663052146,348.83408706747,392.4383479509,403.33941317176,414.24047839262,523.2511306012],"description":"Inverted harmonic form of Schlesinger's Enharmonic Phrygian"},"phryg_penta":{"frequencies":[261.6255653006,270.64713651786,285.40970760065,348.83408706747,392.4383479509,413.09299784305,448.50096908674,523.2511306012],"description":"Schlesinger's Phrygian Harmonia in the pentachromatic genus"},"phryg_pis":{"frequencies":[261.6255653006,294.32876096318,336.37572681506,362.25078272391,392.4383479509,428.11456140098,470.92601754108,523.2511306012,554.03060887186,588.65752192635,672.75145363011,724.50156544782,784.8766959018,856.22912280196,941.85203508216,1046.5022612024],"description":"The Diatonic Perfect Immutable System in the Phrygian Tonos"},"phryg_tri1":{"frequencies":[261.6255653006,273.00058987889,285.40970760065,348.83408706747,392.4383479509,418.60090448096,448.50096908674,523.2511306012],"description":"Schlesinger's Phrygian Harmonia in the chromatic genus"},"phryg_tri1inv":{"frequencies":[261.6255653006,305.22982618403,327.03195662575,348.83408706747,392.4383479509,479.64686971777,501.44900015948,523.2511306012],"description":"Inverted Schlesinger's Chromatic Phrygian Harmonia"},"phryg_tri2":{"frequencies":[261.6255653006,269.10058145205,285.40970760065,348.83408706747,392.4383479509,409.50088481833,448.50096908674,523.2511306012],"description":"Schlesinger's Phrygian Harmonia in the second trichromatic genus"},"phryg_tri3":{"frequencies":[261.6255653006,269.10058145205,277.01530443593,348.83408706747,392.4383479509,409.50088481833,428.11456140098,523.2511306012],"description":"Schlesinger's Phrygian Harmonia in the first trichromatic genus"},"phrygian":{"frequencies":[261.6255653006,290.69507255622,313.95067836072,327.03195662575,348.83408706747,353.19451315581,387.59343007496,392.4383479509,418.60090448096,436.04260883433,465.11211608996,470.92601754108,523.2511306012],"description":"Old Phrygian ??"},"phrygian_diat":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,336.37572681506,348.83408706747,362.25078272391,376.74081403286,392.4383479509,428.11456140098,448.50096908674,470.92601754108,495.71159741166,523.2511306012,554.03060887186,588.65752192635,672.75145363011,697.66817413493,724.50156544782,753.48162806573,784.8766959018,856.22912280196,897.00193817349,941.85203508216,991.42319482333,1046.5022612024],"description":"Phrygian Diatonic Tonos"},"phrygian_enh":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,303.82323712328,308.80394592858,313.95067836072,348.83408706747,392.4383479509,400.78810003496,405.0976494977,409.50088481833,459.44001711325,523.2511306012],"description":"Phrygian Enharmonic Tonos"},"phrygian_harm":{"frequencies":[261.6255653006,273.00058987889,285.40970760065,299.00064605783,313.95067836072,330.47439827444,348.83408706747,369.35373924791,392.4383479509,418.60090448096,448.50096908674,483.00104363188,523.2511306012],"description":"Phrygian Harmonia-Aliquot 24 (flute tuning)"},"piano":{"frequencies":[261.6255653006,275.93321340298,279.06726965397,294.32876096318,305.22982618403,313.95067836072,327.03195662575,348.83408706747,367.91095120397,372.08969287196,392.4383479509,406.97310157871,418.60090448096,436.04260883433,441.49314144476,457.84473927605,465.11211608996,490.54793493862,515.07533168556,523.2511306012],"description":"Enhanced Piano Total Gamut, see 1/1 vol. 8/2 January 1994"},"piano7":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,305.22982618403,327.03195662575,348.83408706747,367.91095120397,392.4383479509,406.97310157871,441.49314144476,457.84473927605,490.54793493862,523.2511306012],"description":"Enhanced piano 7-limit"},"pipedum_10":{"frequencies":[261.6255653006,279.06726965397,306.59245933664,327.03195662575,348.83408706747,372.08969287196,396.89567239676,431.14564594215,459.88868900496,490.54793493862,523.2511306012],"description":"2048/2025 and 34171875/33554432 are homophonic intervals"},"pipedum_10a":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,327.03195662575,348.83408706747,372.08969287196,392.4383479509,418.60090448096,465.11211608996,490.54793493862,523.2511306012],"description":"2048/2025 and 25/24, Manuel Op de Coul, 2001"},"pipedum_10b":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,348.83408706747,367.91095120397,392.4383479509,418.60090448096,446.50763144636,490.54793493862,523.2511306012],"description":"225/224, 64/63 and 25/24 are homophonic intervals"},"pipedum_10c":{"frequencies":[261.6255653006,280.31310567921,305.22982618403,327.03195662575,348.83408706747,373.75080757229,392.4383479509,429.2294430713,457.84473927605,490.54793493862,523.2511306012],"description":"225/224, 64/63 and 49/48 are homophonic intervals"},"pipedum_10d":{"frequencies":[261.6255653006,279.06726965397,299.00064605783,318.93402246168,343.38355445704,372.08969287196,392.4383479509,425.24536328225,448.50096908674,488.36772189445,523.2511306012],"description":"1029/1024, 2048/2025 and 64/63 are homophonic intervals"},"pipedum_10e":{"frequencies":[261.6255653006,286.15296204753,305.22982618403,327.03195662575,348.83408706747,367.91095120397,406.97310157871,429.2294430713,465.11211608996,490.54793493862,523.2511306012],"description":"2048/2025, 64/63 and 49/48 are homophonic intervals"},"pipedum_10f":{"frequencies":[261.6255653006,280.31310567921,294.32876096318,327.03195662575,348.83408706747,373.75080757229,392.4383479509,420.46965851882,465.11211608996,490.54793493862,523.2511306012],"description":"225/224, 64/63 and 28/27 are homophonic intervals"},"pipedum_10g":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,325.57848126297,348.83408706747,372.08969287196,398.6675280771,425.24536328225,457.84473927605,490.54793493862,523.2511306012],"description":"225/224, 1029/1024 and 2048/2025 are homophonic intervals"},"pipedum_10h":{"frequencies":[261.6255653006,286.15296204753,305.22982618403,327.03195662575,348.83408706747,373.75080757229,400.61414686654,429.2294430713,457.84473927605,490.54793493862,523.2511306012],"description":"225/224, 1029/1024 and 64/63 are homophonic intervals"},"pipedum_10i":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,321.92208230347,343.38355445704,367.91095120397,392.4383479509,418.60090448096,457.84473927605,488.36772189445,523.2511306012],"description":"225/224, 2048/2025 and 49/48 are homophonic intervals"},"pipedum_10j":{"frequencies":[261.6255653006,269.10058145205,305.22982618403,313.95067836072,348.83408706747,366.27579142084,392.4383479509,418.60090448096,457.84473927605,488.36772189445,523.2511306012],"description":"25/24, 28/27 and 49/48, Gene Ward Smith, 2002"},"pipedum_10k":{"frequencies":[261.6255653006,280.31310567921,299.00064605783,320.49131749323,343.38355445704,367.91095120397,394.1903048614,420.46965851882,455.80987376816,488.36772189445,523.2511306012],"description":"2048/2025, 225/224 and 2401/2400"},"pipedum_11":{"frequencies":[261.6255653006,272.52663052146,282.55561052465,313.95067836072,327.03195662575,363.36884069528,376.74081403286,392.4383479509,436.04260883433,454.2110508691,470.92601754108,523.2511306012],"description":"16/15 and 15625/15552 are homophonic intervals"},"pipedum_11a":{"frequencies":[261.6255653006,269.10058145205,305.22982618403,313.95067836072,322.92069774245,366.27579142084,376.74081403286,381.53728273004,436.04260883433,448.50096908674,508.71637697339,523.2511306012],"description":"126/125, 1728/1715 and 10/9, Gene Ward Smith, 2002"},"pipedum_12":{"frequencies":[261.6255653006,275.93321340298,294.32876096318,306.59245933664,327.03195662575,348.83408706747,367.91095120397,392.4383479509,413.89982010446,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"81/80 and 2048/2025 are homophonic intervals"},"pipedum_12a":{"frequencies":[261.6255653006,279.06726965397,297.67175429757,306.59245933664,327.03195662575,348.83408706747,372.08969287196,392.4383479509,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"81/80 and 2048/2025 are homophonic intervals"},"pipedum_12b":{"frequencies":[261.6255653006,274.70684356563,299.00064605783,313.95067836072,320.49131749323,348.83408706747,366.27579142084,392.4383479509,418.60090448096,448.50096908674,457.84473927605,488.36772189445,523.2511306012],"description":"64/63, 50/49 comma and 36/35 chroma"},"pipedum_12c":{"frequencies":[261.6255653006,280.31310567921,294.32876096318,315.35224388912,327.03195662575,348.83408706747,367.91095120397,392.4383479509,420.46965851882,448.50096908674,457.84473927605,490.54793493862,523.2511306012],"description":"225/224, 64/63 and 36/35 are homophonic intervals"},"pipedum_12d":{"frequencies":[261.6255653006,280.31310567921,293.02063313667,313.95067836072,327.03195662575,350.39138209902,366.27579142084,392.4383479509,418.60090448096,448.50096908674,457.84473927605,490.54793493862,523.2511306012],"description":"50/49, 128/125 and 225/224 are homophonic intervals"},"pipedum_12e":{"frequencies":[261.6255653006,280.31310567921,293.02063313667,313.95067836072,327.03195662575,350.39138209902,373.75080757229,392.4383479509,418.60090448096,439.53094970501,467.18850946536,500.55911728431,523.2511306012],"description":"50/49, 225/224 and 3136/3125 are homophonic intervals"},"pipedum_12f":{"frequencies":[261.6255653006,273.74326726486,293.02063313667,313.95067836072,327.03195662575,350.39138209902,366.27579142084,392.4383479509,408.78994578219,437.98922762377,468.83301301868,490.54793493862,523.2511306012],"description":"128/125, 3136/3125 and 703125/702464 are homophonic intervals"},"pipedum_12g":{"frequencies":[261.6255653006,279.06726965397,286.15296204753,306.59245933664,327.03195662575,348.83408706747,366.27579142084,390.69417751556,408.78994578219,437.98922762377,457.84473927605,488.36772189445,523.2511306012],"description":"50/49, 225/224 and 28672/28125 are homophonic intervals"},"pipedum_12h":{"frequencies":[261.6255653006,275.93321340298,291.02331101095,310.42486507835,330.74639366397,348.83408706747,367.91095120397,392.4383479509,413.89982010446,436.53496651643,465.11211608996,496.11959049595,523.2511306012],"description":"2048/2025 and 67108864/66430125, Gene Ward Smith, 2004"},"pipedum_12i":{"frequencies":[261.6255653006,271.31540105247,294.32876096318,305.22982618403,336.37572681506,348.83408706747,378.42269266694,392.4383479509,406.97310157871,441.49314144476,465.11211608996,504.56359022259,523.2511306012],"description":"64/63 and 6561/6272, Gene Ward Smith, 2004"},"pipedum_12j":{"frequencies":[261.6255653006,283.8170195002,285.83021674664,310.07474405997,336.37572681506,348.83408706747,378.42269266694,392.4383479509,413.43299207996,448.50096908674,465.11211608996,504.56359022259,523.2511306012],"description":"6561/6272 and 59049/57344"},"pipedum_12k":{"frequencies":[261.6255653006,271.31540105247,294.32876096318,305.22982618403,336.37572681506,348.83408706747,356.10146388137,392.4383479509,406.97310157871,448.50096908674,457.84473927605,474.80195184183,523.2511306012],"description":"64/63 and 729/686, Gene Ward Smith, 2004"},"pipedum_12l":{"frequencies":[261.6255653006,276.16031892841,294.32876096318,310.68035879446,331.39238271409,348.83408706747,368.21375857121,392.4383479509,414.24047839262,441.49314144476,465.11211608996,497.08857407114,523.2511306012],"description":"81/80, 361/360 and 513/512, Gene Ward Smith"},"pipedum_13":{"frequencies":[261.6255653006,276.76092858245,287.78812183066,309.14739649778,327.03195662575,345.95116072807,359.73515228832,380.54627680087,408.78994578219,418.60090448096,449.66894036041,475.68284600109,494.63583439645,523.2511306012],"description":"33275/32768 and 163840/161051 are homophonic intervals. Op de Coul, 2001"},"pipedum_13a":{"frequencies":[261.6255653006,266.96486255163,293.02063313667,299.00064605783,327.03195662575,334.88072358477,366.27579142084,373.75080757229,408.78994578219,418.60090448096,457.84473927605,467.18850946536,512.78610798918,523.2511306012],"description":"15/14, 3136/3125, 2401/2400, Gene Ward Smith, 2002"},"pipedum_13b":{"frequencies":[261.6255653006,267.90457886781,293.02063313667,299.00064605783,327.03195662575,334.88072358477,366.27579142084,373.75080757229,408.78994578219,418.60090448096,457.84473927605,467.18850946536,510.98743222773,523.2511306012],"description":"15/14, 3136/3125, 6144/6125, Gene Ward Smith, 2002"},"pipedum_13bp":{"frequencies":[261.6255653006,282.55561052465,305.16005936662,336.45263027341,363.36884069528,392.4383479509,436.04260883433,470.92601754108,508.60009894437,545.05326104292,605.61473449213,654.0639132515,706.38902631162,784.8766959018],"description":"78732/78125 and 250/243, twelfth based, Manuel Op de Coul, 2003"},"pipedum_13bp2":{"frequencies":[261.6255653006,290.69507255622,313.95067836072,348.83408706747,376.74081403286,392.4383479509,436.04260883433,470.92601754108,523.2511306012,565.1112210493,627.90135672144,678.13346525916,726.73768139056,784.8766959018],"description":"250/243 and 648/625, twelfth based, Manuel Op de Coul, 2003"},"pipedum_13c":{"frequencies":[261.6255653006,267.07609791103,293.02063313667,299.00064605783,327.03195662575,334.88072358477,366.27579142084,373.75080757229,408.78994578219,418.60090448096,457.84473927605,467.18850946536,512.57253609913,523.2511306012],"description":"15/14, 2401/2400, 6144/6125, Gene Ward Smith, 2002"},"pipedum_13d":{"frequencies":[261.6255653006,281.04308772525,287.78812183066,309.14739649778,327.03195662575,334.88072358477,359.73515228832,380.54627680087,408.78994578219,418.60090448096,449.66894036041,475.68284600109,494.63583439645,523.2511306012],"description":"125/121 and 33275/32768, Joe Monzo, 2003"},"pipedum_13e":{"frequencies":[261.6255653006,276.76092858245,287.78812183066,304.4370214407,327.03195662575,334.88072358477,359.73515228832,380.54627680087,408.78994578219,418.60090448096,449.66894036041,475.68284600109,494.63583439645,523.2511306012],"description":"33275/32768 and 163840/161051, Manuel Op de Coul, 2004"},"pipedum_14":{"frequencies":[261.6255653006,274.70684356563,284.76252005507,305.22982618403,320.49131749323,336.37572681506,348.83408706747,373.90653707544,392.4383479509,406.97310157871,427.14378008261,448.50096908674,480.73697623985,498.33441009638,523.2511306012],"description":"81/80, 49/48 and 2401/2400, Paul Erlich, TL 17-1-2001"},"pipedum_14a":{"frequencies":[261.6255653006,274.70684356563,284.8811711051,305.22982618403,320.35783506196,336.37572681506,348.83408706747,366.27579142084,392.4383479509,406.97310157871,427.32175665765,448.50096908674,480.53675259294,498.33441009638,523.2511306012],"description":"81/80, 50/49 and 2401/2400, Paul Erlich, 2001"},"pipedum_14b":{"frequencies":[261.6255653006,274.70684356563,294.32876096318,305.22982618403,313.95067836072,339.14425131559,353.19451315581,366.27579142084,392.4383479509,406.97310157871,418.60090448096,457.84473927605,470.92601754108,508.71637697339,523.2511306012],"description":"245/243, 81/80 comma and 25/24 chroma"},"pipedum_14c":{"frequencies":[261.6255653006,280.31310567921,282.55561052465,305.22982618403,327.03195662575,336.37572681506,363.36884069528,366.27579142084,392.4383479509,403.65087217807,436.04260883433,467.18850946536,470.92601754108,508.71637697339,523.2511306012],"description":"245/243, 50/49 comma and 25/24 chroma"},"pipedum_15":{"frequencies":[261.6255653006,272.52663052146,290.69507255622,301.39265122629,313.95067836072,327.03195662575,348.83408706747,363.36884069528,376.74081403286,392.4383479509,418.60090448096,436.04260883433,454.2110508691,470.92601754108,502.32108537715,523.2511306012],"description":"126/125, 128/125 and 875/864, 5-limit, Paul Erlich, 2001"},"pipedum_15a":{"frequencies":[261.6255653006,274.70684356563,290.69507255622,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,381.53728273004,392.4383479509,418.60090448096,436.04260883433,457.84473927605,488.36772189445,502.32108537715,523.2511306012],"description":"Septimal version of pipedum_15, Manuel Op de Coul, 2001"},"pipedum_15b":{"frequencies":[261.6255653006,274.70684356563,286.15296204753,299.00064605783,311.45900631024,327.03195662575,343.38355445704,357.69120255941,382.72082695402,398.6675280771,418.60090448096,439.53094970501,457.84473927605,478.40103369253,498.33441009638,523.2511306012],"description":"126/125, 128/125 and 1029/1024, Paul Erlich, 2001"},"pipedum_15c":{"frequencies":[261.6255653006,274.70684356563,284.76252005507,299.00064605783,313.95067836072,327.03195662575,341.71502406609,358.80077526939,381.53728273004,400.61414686654,418.60090448096,436.04260883433,457.84473927605,480.73697623985,498.33441009638,523.2511306012],"description":"49/48, 126/125 and 1029/1024, Paul Erlich, 2001"},"pipedum_15d":{"frequencies":[261.6255653006,274.70684356563,286.15296204753,299.00064605783,313.95067836072,327.03195662575,343.38355445704,360.55273217989,379.68336007343,398.6675280771,418.60090448096,436.04260883433,457.84473927605,478.40103369253,498.33441009638,523.2511306012],"description":"64/63, 126/125 and 1029/1024, Paul Erlich, 2001"},"pipedum_15e":{"frequencies":[261.6255653006,273.37201925287,286.15296204753,299.00064605783,313.95067836072,332.22294006425,343.38355445704,358.80077526939,381.53728273004,398.6675280771,412.06026534844,436.04260883433,457.84473927605,478.40103369253,500.76768358318,523.2511306012],"description":"64/63, 875/864 and 1029/1024, Paul Erlich, 2001"},"pipedum_15f":{"frequencies":[261.6255653006,274.70684356563,290.69507255622,305.22982618403,313.95067836072,327.03195662575,348.83408706747,366.27579142084,387.59343007496,392.4383479509,418.60090448096,436.04260883433,465.11211608996,488.36772189445,490.54793493862,523.2511306012],"description":"126/125, 64/63 comma and 28/27 chroma"},"pipedum_15g":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,294.32876096318,313.95067836072,327.03195662575,348.83408706747,363.36884069528,376.74081403286,392.4383479509,418.60090448096,436.04260883433,465.11211608996,470.92601754108,502.32108537715,523.2511306012],"description":"128/125 and 250/243"},"pipedum_16":{"frequencies":[261.6255653006,274.70684356563,286.15296204753,299.00064605783,313.95067836072,327.03195662575,343.38355445704,355.95315006884,373.75080757229,384.58958099188,400.61414686654,418.60090448096,439.53094970501,457.84473927605,480.73697623985,498.33441009638,523.2511306012],"description":"50/49, 126/125 and 1029/1024, Paul Erlich, 2001"},"pipedum_16a":{"frequencies":[261.6255653006,272.52663052146,283.88190679319,301.39265122629,313.95067836072,327.03195662575,340.65828815182,354.85238349148,363.36884069528,385.78259356965,401.85686830172,418.60090448096,436.04260883433,454.2110508691,482.22824196207,502.32108537715,523.2511306012],"description":"3125/3072 and 1990656/1953125, OdC 2004"},"pipedum_17":{"frequencies":[261.6255653006,269.10058145205,286.15296204753,294.32876096318,305.22982618403,318.93402246168,336.37572681506,348.83408706747,358.80077526939,381.53728273004,392.4383479509,406.97310157871,429.2294430713,448.50096908674,465.11211608996,478.40103369253,508.71637697339,523.2511306012],"description":"245/243, 64/63 and 525/512, Paul Erlich, 2001"},"pipedum_17a":{"frequencies":[261.6255653006,271.31540105247,286.15296204753,296.75121990114,305.22982618403,318.93402246168,336.37572681506,348.83408706747,358.80077526939,381.53728273004,392.4383479509,406.97310157871,429.2294430713,448.50096908674,461.31528248922,478.40103369253,504.56359022259,523.2511306012],"description":"245/243, 525/512 and 1728/1715, Paul Erlich, 2001"},"pipedum_17b":{"frequencies":[261.6255653006,264.89588486686,286.15296204753,294.32876096318,305.22982618403,327.03195662575,339.14425131559,343.38355445704,367.91095120397,381.53728273004,392.4383479509,406.97310157871,436.04260883433,441.49314144476,457.84473927605,490.54793493862,508.71637697339,523.2511306012],"description":"245/243, 64/63 comma and 25/24 chroma"},"pipedum_17c":{"frequencies":[261.6255653006,273.6806973752,285.83021674664,299.00064605783,310.07474405997,321.55899383997,336.37572681506,348.83408706747,364.90759650026,378.42269266694,392.4383479509,413.43299207996,428.74532511996,448.50096908674,465.11211608996,486.54346200035,504.56359022259,523.2511306012],"description":"1605632/1594323 and 177147/175616, Manuel Op de Coul, 2002"},"pipedum_17d":{"frequencies":[261.6255653006,274.08392555301,284.23518205497,299.00064605783,308.34441624714,319.76457981184,336.37572681506,348.83408706747,365.44523407068,373.05867644715,392.4383479509,411.12588832951,426.35277308246,448.50096908674,465.11211608996,479.64686971777,504.56359022259,523.2511306012],"description":"243/242, 99/98 and 64/63, Manuel Op de Coul, 2002"},"pipedum_17e":{"frequencies":[261.6255653006,271.31540105247,286.15296204753,296.75121990114,310.07474405997,321.92208230347,336.37572681506,348.83408706747,362.16234259141,378.42269266694,395.66829320152,413.43299207996,429.2294430713,445.12682985172,465.11211608996,482.88312345521,504.56359022259,523.2511306012],"description":"245/243, 1728/1715 and 32805/32768, Manuel Op de Coul, 2003"},"pipedum_17f":{"frequencies":[261.6255653006,269.80136421624,285.40970760065,294.32876096318,310.07474405997,319.76457981184,331.11985608357,348.83408706747,359.73515228832,380.54627680087,392.4383479509,413.43299207996,428.11456140098,441.49314144476,465.11211608996,479.64686971777,507.3950357345,523.2511306012],"description":"243/242 and 8192/8019, Manuel Op de Coul"},"pipedum_17g":{"frequencies":[261.6255653006,274.08392555301,285.40970760065,299.00064605783,305.22982618403,319.76457981184,336.37572681506,348.83408706747,359.73515228832,380.54627680087,392.4383479509,406.97310157871,428.11456140098,448.50096908674,457.84473927605,479.64686971777,499.46698830115,523.2511306012],"description":"243/242, 896/891 and 99/98, Manuel Op de Coul"},"pipedum_18":{"frequencies":[261.6255653006,272.52663052146,280.31310567921,296.75121990114,305.22982618403,317.94773560837,327.03195662575,340.65828815182,350.39138209902,379.84156147346,390.69417751556,406.97310157871,418.60090448096,436.04260883433,448.50096908674,474.80195184183,488.36772189445,508.71637697339,523.2511306012],"description":"875/864, 686/675 and 128/125, Paul Erlich, 2001"},"pipedum_18a":{"frequencies":[261.6255653006,269.10058145205,280.31310567921,293.02063313667,305.22982618403,313.95067836072,327.03195662575,341.85740532612,356.10146388137,366.27579142084,384.42940207435,400.44729382745,418.60090448096,436.04260883433,448.50096908674,467.18850946536,488.36772189445,508.71637697339,523.2511306012],"description":"875/864, 686/675 and 50/49, Paul Erlich, 2001"},"pipedum_18b":{"frequencies":[261.6255653006,272.52663052146,280.31310567921,296.75121990114,305.22982618403,317.94773560837,327.03195662575,346.20975655133,356.10146388137,373.75080757229,384.42940207435,400.44729382745,418.60090448096,436.04260883433,448.50096908674,467.18850946536,488.36772189445,508.71637697339,523.2511306012],"description":"1728/1715, 875/864 and 686/675, Paul Erlich, 2001"},"pipedum_19":{"frequencies":[261.6255653006,272.52663052146,282.55561052465,290.69507255622,301.39265122629,313.95067836072,327.03195662575,339.06673262958,348.83408706747,363.36884069528,376.74081403286,392.4383479509,401.85686830172,418.60090448096,436.04260883433,452.08897683944,470.92601754108,484.4917875937,502.32108537715,523.2511306012],"description":"81/80 and 15625/15552 are homophonic intervals, inverse of Mandelbaum"},"pipedum_19a":{"frequencies":[261.6255653006,271.25338610366,282.55561052465,294.32876096318,301.39265122629,313.95067836072,327.03195662575,339.06673262958,353.19451315581,361.67118147155,376.74081403286,392.4383479509,408.78994578219,416.64520105522,434.00541776586,452.08897683944,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"3125/3072 and 15625/15552 are homophonic intervals"},"pipedum_19b":{"frequencies":[261.6255653006,272.52663052146,282.55561052465,290.69507255622,302.80736724606,313.95067836072,327.03195662575,339.06673262958,348.83408706747,363.36884069528,376.74081403286,392.4383479509,403.74315632809,418.60090448096,436.04260883433,452.08897683944,470.92601754108,484.4917875937,502.32108537715,523.2511306012],"description":"15625/15552 and 78732/78125, Paul Erlich, TL 19-2-2001"},"pipedum_19c":{"frequencies":[261.6255653006,269.10058145205,280.31310567921,290.69507255622,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,363.36884069528,376.74081403286,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,470.92601754108,488.36772189445,508.71637697339,523.2511306012],"description":"Periodicity block by Paul Erlich, 2001"},"pipedum_19d":{"frequencies":[261.6255653006,271.31540105247,280.31310567921,290.69507255622,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,363.36884069528,376.74081403286,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,470.92601754108,488.36772189445,504.56359022259,523.2511306012],"description":"Periodicity block by Paul Erlich, 2001"},"pipedum_19e":{"frequencies":[261.6255653006,269.10058145205,280.31310567921,287.04062021552,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,358.80077526939,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,476.92160341255,488.36772189445,508.71637697339,523.2511306012],"description":"Periodicity block by Paul Erlich, 2001"},"pipedum_19f":{"frequencies":[261.6255653006,269.10058145205,279.06726965397,287.04062021552,305.22982618403,315.35224388912,327.03195662575,336.37572681506,348.83408706747,358.80077526939,381.53728273004,392.4383479509,406.97310157871,418.60090448096,434.10464168396,448.50096908674,476.92160341255,490.54793493862,508.71637697339,523.2511306012],"description":"Periodicity block by Paul Erlich, 2001"},"pipedum_19g":{"frequencies":[261.6255653006,269.10058145205,280.31310567921,288.32205155576,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,360.4025644447,379.84156147346,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,474.80195184183,488.36772189445,508.71637697339,523.2511306012],"description":"Periodicity block by Paul Erlich, 2001"},"pipedum_19h":{"frequencies":[261.6255653006,274.70684356563,286.15296204753,294.32876096318,305.22982618403,313.95067836072,327.03195662575,343.38355445704,353.19451315581,366.27579142084,381.53728273004,392.4383479509,412.06026534844,415.27867508032,436.04260883433,457.84473927605,470.92601754108,490.54793493862,508.71637697339,523.2511306012],"description":"126/125, 81/80 comma and 49/48 chroma"},"pipedum_19i":{"frequencies":[261.6255653006,275.93321340298,286.15296204753,294.32876096318,305.22982618403,321.92208230347,327.03195662575,343.38355445704,348.83408706747,367.91095120397,381.53728273004,392.4383479509,406.97310157871,429.2294430713,436.04260883433,457.84473927605,465.11211608996,490.54793493862,515.07533168556,523.2511306012],"description":"225/224, 81/80 comma and 49/48 chroma"},"pipedum_19j":{"frequencies":[261.6255653006,266.96486255163,286.15296204753,293.02063313667,299.00064605783,320.49131749323,327.03195662575,333.70607818954,358.95027559242,366.27579142084,373.75080757229,381.37837507376,410.22888639134,418.60090448096,427.14378008261,457.84473927605,467.18850946536,478.40103369253,512.78610798918,523.2511306012],"description":"21/20, 3136/3125 and 2401/2400, Gene Ward Smith, 2002"},"pipedum_19k":{"frequencies":[261.6255653006,267.90457886781,286.15296204753,293.02063313667,299.00064605783,320.49131749323,327.03195662575,334.88072358477,357.69120255941,366.27579142084,373.75080757229,382.72082695402,408.78994578219,418.60090448096,427.14378008261,457.84473927605,467.18850946536,478.40103369253,510.98743222773,523.2511306012],"description":"21/20, 3136/3125 and 6144/6125, Gene Ward Smith, 2002"},"pipedum_19l":{"frequencies":[261.6255653006,267.07609791103,286.15296204753,293.02063313667,299.00064605783,320.49131749323,327.03195662575,333.84512238879,358.80077526939,366.27579142084,373.75080757229,381.53728273004,410.05802887931,418.60090448096,427.14378008261,457.84473927605,467.18850946536,478.40103369253,512.57253609913,523.2511306012],"description":"21/20, 2401/2400 and 6144/6125, Gene Ward Smith, 2002"},"pipedum_19m":{"frequencies":[261.6255653006,269.10058145205,293.02063313667,299.00064605783,305.22982618403,313.95067836072,317.94773560837,348.83408706747,358.80077526939,366.27579142084,373.75080757229,406.97310157871,418.60090448096,430.56093032327,436.04260883433,448.50096908674,488.36772189445,502.32108537715,508.71637697339,523.2511306012],"description":"126/125, 1728/1715 and 16/15, Gene Ward Smith, 2002"},"pipedum_19n":{"frequencies":[261.6255653006,267.07609791103,274.70684356563,280.31310567921,305.22982618403,313.95067836072,320.49131749323,327.03195662575,333.70607818954,366.27579142084,373.75080757229,381.53728273004,392.4383479509,427.32175665765,436.04260883433,448.50096908674,457.84473927605,467.18850946536,512.78610798918,523.2511306012],"description":"126/125, 2401/2400 and 16/15, Gene Ward Smith, 2002"},"pipedum_19o":{"frequencies":[261.6255653006,272.52663052146,280.31310567921,290.69507255622,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,363.36884069528,376.74081403286,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,470.92601754108,488.36772189445,502.32108537715,523.2511306012],"description":"225/224, 3136/3125 and 4375/4374, OdC 2000"},"pipedum_21":{"frequencies":[261.6255653006,267.07609791103,280.31310567921,284.8811711051,299.00064605783,305.22982618403,320.35783506196,327.03195662575,341.85740532612,348.83408706747,366.27579142084,373.75080757229,392.4383479509,400.44729382745,418.60090448096,427.32175665765,448.50096908674,457.84473927605,480.53675259294,488.36772189445,512.57253609913,523.2511306012],"description":"36/35, 225/224 and 2401/2400, P. Erlich, 2001. Just PB version of miracle1"},"pipedum_21a":{"frequencies":[261.6255653006,265.7783520514,286.15296204753,290.69507255622,299.00064605783,305.22982618403,327.03195662575,332.22294006425,343.38355445704,348.83408706747,373.75080757229,381.53728273004,392.4383479509,398.6675280771,429.2294430713,436.04260883433,448.50096908674,457.84473927605,490.54793493862,498.33441009638,515.07533168556,523.2511306012],"description":"1029/1024, 81/80 comma and 25/24 chroma"},"pipedum_21b":{"frequencies":[261.6255653006,267.07609791103,279.06726965397,284.8811711051,299.00064605783,305.22982618403,318.93402246168,325.57848126297,343.38355445704,348.83408706747,366.27579142084,372.08969287196,392.4383479509,398.6675280771,418.60090448096,427.32175665765,448.50096908674,457.84473927605,478.40103369253,488.36772189445,496.11959049595,523.2511306012],"description":"36/35, 225/224 and 1029/1024, Gene Ward Smith, 2002"},"pipedum_21c":{"frequencies":[261.6255653006,269.46602871384,279.06726965397,287.4304306281,297.67175429757,306.59245933664,317.51653791741,327.03195662575,344.91651675372,348.83408706747,367.91095120397,372.08969287196,392.4383479509,396.89567239676,418.60090448096,431.14564594215,446.50763144636,459.88868900496,476.27480687611,490.54793493862,508.02646066786,523.2511306012],"description":"First 128/125 and ampersand comma Fokker block"},"pipedum_22":{"frequencies":[261.6255653006,267.90457886781,279.06726965397,285.76488412567,299.40669857094,306.59245933664,313.95067836072,327.03195662575,334.88072358477,348.83408706747,357.20610515709,365.77905168086,383.2405741708,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,457.22381460107,479.0507177135,490.54793493862,510.98743222773,523.2511306012],"description":"3125/3072 and 2109375/2097152 are homophonic intervals"},"pipedum_22a":{"frequencies":[261.6255653006,267.90457886781,279.06726965397,287.4304306281,297.67175429757,306.59245933664,317.51653791741,327.03195662575,334.88072358477,348.83408706747,357.20610515709,372.08969287196,381.01984550089,392.4383479509,408.78994578219,418.60090448096,436.04260883433,446.50763144636,459.88868900496,476.27480687611,490.54793493862,508.02646066786,523.2511306012],"description":"2048/2025 and 2109375/2097152 are homophonic intervals"},"pipedum_22b":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,286.15296204753,294.32876096318,305.22982618403,313.95067836072,327.03195662575,339.14425131559,348.83408706747,357.69120255941,367.91095120397,381.53728273004,392.4383479509,406.97310157871,418.60090448096,429.2294430713,441.49314144476,457.84473927605,470.92601754108,490.54793493862,508.71637697339,523.2511306012],"description":"2025/2048, 245/243 and 64/63. P. Erlich \"7-limit Indian\", TL 19-12-2000"},"pipedum_22b2":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,286.15296204753,294.32876096318,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,358.80077526939,367.91095120397,381.53728273004,392.4383479509,406.97310157871,418.60090448096,429.2294430713,448.50096908674,465.11211608996,478.40103369253,490.54793493862,504.56359022259,523.2511306012],"description":"Version of pipedum_22b with other shape, Paul Erlich"},"pipedum_22c":{"frequencies":[261.6255653006,267.07609791103,274.70684356563,290.69507255622,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,358.80077526939,366.27579142084,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,498.33441009638,512.57253609913,523.2511306012],"description":"1728/1715, 64/63 and 50/49, Paul Erlich, 2001"},"pipedum_22d":{"frequencies":[261.6255653006,269.10058145205,274.70684356563,290.69507255622,299.00064605783,305.22982618403,313.95067836072,327.03195662575,333.84512238879,348.83408706747,358.80077526939,366.27579142084,381.53728273004,392.4383479509,410.05802887931,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,498.33441009638,508.71637697339,523.2511306012],"description":"1728/1715, 875/864 and 64/63, Paul Erlich, 2001"},"pipedum_22e":{"frequencies":[261.6255653006,269.10058145205,274.70684356563,290.69507255622,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,356.10146388137,366.27579142084,384.42940207435,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,470.92601754108,498.33441009638,508.71637697339,523.2511306012],"description":"1728/1715, 245/243 and 50/49, Paul Erlich, 2001"},"pipedum_22f":{"frequencies":[261.6255653006,269.10058145205,276.78916949353,290.69507255622,296.75121990114,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,358.80077526939,366.27579142084,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,461.31528248922,470.92601754108,494.58536650191,508.71637697339,523.2511306012],"description":"1728/1715, 245/243 and 875/864, Paul Erlich, 2001"},"pipedum_22g":{"frequencies":[261.6255653006,267.07609791103,279.06726965397,286.15296204753,299.00064605783,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,358.80077526939,366.27579142084,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,457.84473927605,478.40103369253,490.54793493862,512.57253609913,523.2511306012],"description":"225/224, 1728/1715 and 64/63, Paul Erlich, 2001"},"pipedum_22h":{"frequencies":[261.6255653006,269.10058145205,280.31310567921,287.04062021552,296.75121990114,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,358.80077526939,366.27579142084,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,461.31528248922,476.92160341255,488.36772189445,508.71637697339,523.2511306012],"description":"225/224, 1728/1715 and 875/864, Paul Erlich, 2001"},"pipedum_22i":{"frequencies":[261.6255653006,269.10058145205,279.06726965397,288.32205155576,296.75121990114,305.22982618403,313.95067836072,327.03195662575,336.37572681506,348.83408706747,358.80077526939,366.27579142084,381.53728273004,392.4383479509,406.97310157871,418.60090448096,436.04260883433,448.50096908674,461.31528248922,474.80195184183,490.54793493862,508.71637697339,523.2511306012],"description":"1728/1715, 245/243 and 245/243, Paul Erlich, 2001"},"pipedum_22j":{"frequencies":[261.6255653006,271.31540105247,280.31310567921,290.69507255622,299.00064605783,305.22982618403,320.35783506196,332.22294006425,336.37572681506,348.83408706747,353.19451315581,373.75080757229,387.59343007496,392.4383479509,406.97310157871,427.14378008261,436.04260883433,448.50096908674,465.11211608996,480.53675259294,498.33441009638,504.56359022259,523.2511306012],"description":"50/49, 64/63 and 245/243, Gene Ward Smith, 2002"},"pipedum_22k":{"frequencies":[261.6255653006,272.52663052146,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,334.88072358477,348.83408706747,359.73515228832,367.91095120397,380.54627680087,392.4383479509,408.78994578219,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,502.32108537715,523.2511306012],"description":"121/120, 2048/2025 and 4125/4096, Manuel Op de Coul"},"pipedum_22l":{"frequencies":[261.6255653006,275.62199471997,284.23518205497,290.69507255622,303.18419419197,310.07474405997,319.76457981184,330.74639366397,341.08221846597,348.83408706747,363.82103303037,372.08969287196,387.59343007496,404.24559225596,413.43299207996,426.35277308246,440.99519155196,454.77629128796,465.11211608996,485.09471070715,496.11959049595,511.62332769895,523.2511306012],"description":"121/120, 736/729, 100/99 and 2048/2025"},"pipedum_23":{"frequencies":[261.6255653006,271.25338610366,276.85245005354,287.04062021552,297.60371503945,302.80736724606,313.95067836072,325.50406332439,332.22294006425,344.44874425862,348.83408706747,363.36884069528,376.74081403286,384.51729174103,398.6675280771,413.33849311034,420.56578784176,436.04260883433,452.08897683944,461.42075008924,478.40103369253,496.00619173241,504.67894541011,523.2511306012],"description":"6144/6125, 15625/1552 and 5103/5000, Manuel Op de Coul, 2003"},"pipedum_24":{"frequencies":[261.6255653006,267.57160087561,275.93321340298,285.40970760065,290.69507255622,299.7792935736,310.07474405997,319.76457981184,327.03195662575,338.26335715633,348.83408706747,356.76213450082,367.91095120397,380.54627680087,392.4383479509,401.35740131342,413.43299207996,426.35277308246,436.04260883433,449.66894036041,465.11211608996,479.64686971777,490.54793493862,507.3950357345,523.2511306012],"description":"121/120, 16384/16335 and 32805/32768. Manuel Op de Coul, 2001"},"pipedum_24a":{"frequencies":[261.6255653006,272.52663052146,274.70684356563,286.15296204753,294.32876096318,305.22982618403,313.95067836072,321.92208230347,327.03195662575,343.38355445704,348.83408706747,366.27579142084,367.91095120397,381.53728273004,392.4383479509,412.06026534844,418.60090448096,429.2294430713,436.04260883433,457.84473927605,470.92601754108,488.36772189445,490.54793493862,515.07533168556,523.2511306012],"description":"49/48, 81/80 and 128/125, Gene Ward Smith, 2002"},"pipedum_24b":{"frequencies":[261.6255653006,271.31540105247,275.62199471997,289.72987407313,294.32876096318,305.22982618403,310.07474405997,325.94610833227,331.11985608357,343.38355445704,348.83408706747,361.75386806997,372.50983809402,386.30649876417,392.4383479509,406.97310157871,413.43299207996,434.59481110969,441.49314144476,457.84473927605,465.11211608996,482.33849075995,496.67978412536,515.07533168556,523.2511306012],"description":"49/48, 81/80 and 531441/524288"},"pipedum_25":{"frequencies":[261.6255653006,268.26840191956,274.70684356563,281.29980781121,291.99281841585,299.00064605783,306.17666156322,313.95067836072,327.03195662575,335.33550239945,343.38355445704,351.62475976401,364.99102301981,373.75080757229,382.72082695402,392.4383479509,408.78994578219,418.60090448096,429.2294430713,439.53094970501,447.89271634391,467.18850946536,478.40103369253,490.54793493862,502.32108537715,523.2511306012],"description":"65625/65536, 1029/1024 and 3125/3072, Manuel Op de Coul, 2003"},"pipedum_26":{"frequencies":[261.6255653006,267.07609791103,274.70684356563,286.15296204753,292.89859205665,299.00064605783,305.22982618403,313.95067836072,327.03195662575,333.84512238879,341.71502406609,348.83408706747,358.80077526939,366.27579142084,381.53728273004,392.4383479509,400.61414686654,410.05802887931,418.60090448096,436.04260883433,448.50096908674,457.84473927605,467.3831713443,478.40103369253,498.33441009638,512.57253609913,523.2511306012],"description":"1029/1024, 1728/1715 and 50/49, Paul Erlich, 2001"},"pipedum_26a":{"frequencies":[261.6255653006,272.52663052146,274.70684356563,286.15296204753,294.32876096318,305.22982618403,306.59245933664,321.92208230347,325.57848126297,327.03195662575,343.38355445704,348.83408706747,366.27579142084,367.91095120397,381.53728273004,392.4383479509,408.78994578219,412.06026534844,429.2294430713,436.04260883433,457.84473927605,459.88868900496,465.11211608996,488.36772189445,490.54793493862,515.07533168556,523.2511306012],"description":"50/49, 81/80 and 525/512, Gene Ward Smith, 2002"},"pipedum_26b":{"frequencies":[261.6255653006,267.90457886781,272.52663052146,279.06726965397,290.69507255622,301.39265122629,306.59245933664,313.95067836072,327.03195662575,334.88072358477,340.65828815182,348.83408706747,357.20610515709,363.36884069528,376.74081403286,392.4383479509,401.85686830172,408.78994578219,418.60090448096,436.04260883433,446.50763144636,454.2110508691,470.92601754108,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"81/80 and 78125/73728, Gene Ward Smith, 2005"},"pipedum_27":{"frequencies":[261.6255653006,271.20240005245,278.95104005395,284.76252005507,292.89859205665,299.00064605783,307.54352165948,316.40280006119,325.44288006294,332.22294006425,341.71502406609,351.47831046798,358.80077526939,369.05222599138,379.68336007343,390.53145607553,398.6675280771,410.05802887931,418.60090448096,430.56093032327,442.86267118965,455.62003208812,468.63774729064,478.40103369253,492.06963465517,502.32108537715,516.67311638793,523.2511306012],"description":"126/125, 1728/1715 and 4000/3969 are homophonic intervals, Paul Erlich"},"pipedum_27a":{"frequencies":[261.6255653006,269.10058145205,274.70684356563,280.31310567921,290.69507255622,299.00064605783,305.22982618403,313.95067836072,320.49131749323,327.03195662575,336.37572681506,348.83408706747,358.80077526939,366.27579142084,373.75080757229,381.53728273004,392.4383479509,406.97310157871,418.60090448096,427.14378008261,436.04260883433,448.50096908674,457.84473927605,470.92601754108,488.36772189445,498.33441009638,508.71637697339,523.2511306012],"description":"126/126, 1728/1715 and 64/63, Paul Erlich, 2001"},"pipedum_27b":{"frequencies":[261.6255653006,266.96486255163,272.52663052146,280.31310567921,293.02063313667,299.00064605783,305.22982618403,313.95067836072,320.49131749323,327.03195662575,333.70607818954,348.83408706747,358.80077526939,366.27579142084,373.75080757229,381.53728273004,392.4383479509,410.22888639134,418.60090448096,427.14378008261,436.04260883433,448.50096908674,457.84473927605,467.18850946536,488.36772189445,502.32108537715,512.78610798918,523.2511306012],"description":"2401/2400, 126/125 and 128/125, Paul Erlich, 2001"},"pipedum_27c":{"frequencies":[261.6255653006,266.96486255163,274.70684356563,280.31310567921,290.69507255622,299.00064605783,305.22982618403,313.95067836072,320.35783506196,327.03195662575,336.37572681506,348.83408706747,356.10146388137,366.27579142084,373.75080757229,384.42940207435,392.4383479509,406.97310157871,418.60090448096,427.32175665765,436.04260883433,448.50096908674,457.84473927605,470.92601754108,488.36772189445,498.33441009638,512.78610798918,523.2511306012],"description":"2401/2400, 126/125 and 686/675, Paul Erlich, 2001"},"pipedum_27d":{"frequencies":[261.6255653006,266.96486255163,274.70684356563,280.31310567921,290.69507255622,299.00064605783,305.22982618403,313.95067836072,320.49131749323,327.03195662575,336.37572681506,348.83408706747,355.95315006884,366.27579142084,373.75080757229,384.58958099188,392.4383479509,406.97310157871,418.60090448096,427.14378008261,436.04260883433,448.50096908674,457.84473927605,470.92601754108,488.36772189445,498.33441009638,512.78610798918,523.2511306012],"description":"2401/2400, 126/125 and 64/63, Paul Erlich, 2001"},"pipedum_27e":{"frequencies":[261.6255653006,269.10058145205,274.70684356563,282.55561052465,290.69507255622,299.00064605783,305.22982618403,313.95067836072,320.35783506196,329.64821227876,336.37572681506,348.83408706747,356.10146388137,366.27579142084,373.75080757229,384.42940207435,392.4383479509,406.97310157871,415.27867508032,427.32175665765,436.04260883433,448.50096908674,457.84473927605,470.92601754108,484.4917875937,498.33441009638,508.71637697339,523.2511306012],"description":"2401/2400, 126/125 and 245/243, Paul Erlich, 2001"},"pipedum_27f":{"frequencies":[261.6255653006,267.07609791103,272.52663052146,280.31310567921,293.02063313667,299.00064605783,305.22982618403,313.95067836072,320.35783506196,327.03195662575,333.84512238879,348.83408706747,358.80077526939,366.27579142084,373.75080757229,381.53728273004,392.4383479509,410.05802887931,418.60090448096,427.32175665765,436.04260883433,448.50096908674,457.84473927605,467.18850946536,488.36772189445,502.32108537715,512.57253609913,523.2511306012],"description":"2401/2400, 1728/1715 and 128/125, Paul Erlich, 2001"},"pipedum_27g":{"frequencies":[261.6255653006,267.07609791103,274.59243005311,280.31310567921,290.81619550312,299.00064605783,305.22982618403,313.95067836072,320.35783506196,327.03195662575,336.37572681506,348.83408706747,356.10146388137,366.27579142084,373.75080757229,384.42940207435,392.4383479509,406.97310157871,418.60090448096,427.32175665765,436.04260883433,448.50096908674,457.84473927605,470.72988009104,488.36772189445,498.54204943392,512.57253609913,523.2511306012],"description":"2401/2400, 1728/1715 and 686/675, Paul Erlich, 2001"},"pipedum_27h":{"frequencies":[261.6255653006,267.07609791103,274.70684356563,280.31310567921,290.69507255622,299.00064605783,305.22982618403,313.95067836072,320.49131749323,327.03195662575,336.37572681506,348.83408706747,356.10146388137,366.27579142084,373.75080757229,384.42940207435,392.4383479509,406.97310157871,418.60090448096,427.14378008261,436.04260883433,448.50096908674,457.84473927605,470.92601754108,488.36772189445,498.33441009638,512.57253609913,523.2511306012],"description":"2401/2400, 1728/1715 and 64/63, Paul Erlich, 2001"},"pipedum_27i":{"frequencies":[261.6255653006,269.10058145205,274.70684356563,282.43792805463,290.69507255622,299.00064605783,305.22982618403,313.95067836072,320.49131749323,329.51091606373,336.37572681506,348.83408706747,356.10146388137,366.27579142084,373.75080757229,384.42940207435,392.4383479509,406.97310157871,415.4517078616,427.14378008261,436.04260883433,448.50096908674,457.84473927605,470.92601754108,484.69365917187,498.33441009638,508.71637697339,523.2511306012],"description":"2401/2400, 1728/1715 and 245/243, Paul Erlich, 2001"},"pipedum_27j":{"frequencies":[261.6255653006,269.16210421872,276.91574508099,282.55561052465,290.69507255622,299.06900468747,305.16005936662,313.95067836072,322.99452506247,329.57286411595,339.06673262958,348.83408706747,358.88280562497,366.19207123994,376.74081403286,387.59343007496,395.48743693914,406.88007915549,418.60090448096,423.83341578697,436.04260883433,448.60350703121,461.52624180165,470.92601754108,484.4917875937,498.44834114579,508.60009894437,523.2511306012],"description":"78732/78125 and 390625000/387420489"},"pipedum_27k":{"frequencies":[261.6255653006,264.89588486686,275.62199471997,279.38237857051,290.69507255622,294.32876096318,298.00787047521,310.07474405997,313.95067836072,331.11985608357,344.52749339997,348.83408706747,353.19451315581,367.49599295996,372.50983809402,387.59343007496,392.4383479509,397.34382730029,413.43299207996,418.60090448096,441.49314144476,447.01180571282,459.36999119996,465.11211608996,470.92601754108,496.67978412536,516.79124009995,523.2511306012],"description":"67108864/66430125 and 25/24"},"pipedum_28":{"frequencies":[261.6255653006,267.90457886781,272.52663052146,279.06726965397,285.76488412567,299.40669857094,306.59245933664,313.95067836072,319.36714514233,327.03195662575,334.88072358477,340.65828815182,348.83408706747,357.20610515709,363.36884069528,383.2405741708,392.4383479509,401.85686830172,408.78994578219,418.60090448096,428.6473261885,436.04260883433,446.50763144636,457.22381460107,479.0507177135,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"393216/390625 and 16875/16384"},"pipedum_29":{"frequencies":[261.6255653006,266.96486255163,274.70684356563,280.31310567921,288.44218574391,294.32876096318,300.33547037059,310.07474405997,316.40280006119,325.57848126297,332.22294006425,341.85740532612,348.83408706747,355.95315006884,366.27579142084,373.75080757229,384.58958099188,392.4383479509,400.44729382745,412.06026534844,420.46965851882,434.10464168396,442.96392008567,455.80987376816,465.11211608996,474.60420009179,488.36772189445,498.33441009638,512.78610798918,523.2511306012],"description":"5120/5103, 225/224 and 50421/50000, Manuel Op de Coul, 2003"},"pipedum_29a":{"frequencies":[261.6255653006,272.52663052146,274.70684356563,286.15296204753,290.69507255622,294.32876096318,305.22982618403,313.95067836072,317.94773560837,327.03195662575,339.14425131559,343.38355445704,348.83408706747,363.36884069528,366.27579142084,372.60080508745,381.53728273004,392.4383479509,408.78994578219,412.06026534844,429.2294430713,436.04260883433,441.49314144476,457.84473927605,470.92601754108,476.92160341255,490.54793493862,508.71637697339,515.07533168556,523.2511306012],"description":"49/48, 55/54, 65/64, 91/90 and 100/99"},"pipedum_31":{"frequencies":[261.6255653006,271.62175694356,275.93321340298,281.68182201554,289.72987407313,294.32876096318,300.46061014991,310.42486507835,316.89204976748,321.92208230347,331.11985608357,338.01818641865,343.38355445704,356.50355598842,362.16234259141,367.91095120397,380.27045972098,386.30649876417,392.4383479509,407.43263541533,413.89982010446,422.52273302331,434.59481110969,441.49314144476,450.69091522486,465.63729761752,475.33807465122,482.88312345521,496.67978412536,507.02727962797,515.07533168556,523.2511306012],"description":"81/80, 225/224 and 1029/1024 are homophonic intervals"},"pipedum_31a":{"frequencies":[261.6255653006,269.46602871384,275.93321340298,282.55561052465,287.4304306281,294.32876096318,301.39265122629,306.59245933664,313.95067836072,321.48549464138,329.20114651277,336.83253589231,344.91651675372,353.19451315581,359.28803828513,367.91095120397,376.74081403286,385.78259356965,392.4383479509,401.85686830172,411.50143314096,421.04066986538,431.14564594215,441.49314144476,452.08897683944,459.88868900496,470.92601754108,482.22824196207,490.54793493862,502.32108537715,514.3767914262,523.2511306012],"description":"393216/390625 and 2109375/2097152 are homophonic intervals"},"pipedum_31b":{"frequencies":[261.6255653006,267.07609791103,280.31310567921,286.15296204753,290.69507255622,294.32876096318,299.00064605783,305.22982618403,307.54352165948,327.03195662575,333.84512238879,339.14425131559,343.38355445704,348.83408706747,356.10146388137,373.75080757229,381.53728273004,387.59343007496,392.4383479509,400.61414686654,406.97310157871,429.2294430713,436.04260883433,445.12682985172,448.50096908674,457.84473927605,465.11211608996,490.54793493862,498.33441009638,508.71637697339,515.07533168556,523.2511306012],"description":"245/243, 1029/1024 comma and 25/24 chroma"},"pipedum_31c":{"frequencies":[261.6255653006,265.7783520514,274.70684356563,279.06726965397,286.15296204753,293.02063313667,299.00064605783,305.22982618403,313.95067836072,320.49131749323,327.03195662575,334.88072358477,343.38355445704,348.83408706747,360.55273217989,366.27579142084,373.75080757229,384.58958099188,392.4383479509,398.6675280771,412.06026534844,418.60090448096,429.2294430713,439.53094970501,448.50096908674,457.84473927605,470.92601754108,480.73697623985,490.54793493862,502.32108537715,515.07533168556,523.2511306012],"description":"126/125, 225/224 and 1029/1024, Op de Coul"},"pipedum_31d":{"frequencies":[261.6255653006,269.10058145205,274.70684356563,280.31310567921,286.15296204753,294.32876096318,299.00064605783,305.22982618403,313.95067836072,316.53463456122,327.03195662575,336.37572681506,343.38355445704,348.83408706747,358.80077526939,366.27579142084,373.75080757229,381.53728273004,392.4383479509,403.65087217807,406.97310157871,418.60090448096,429.2294430713,436.04260883433,448.50096908674,457.84473927605,470.92601754108,478.40103369253,490.54793493862,504.56359022259,508.71637697339,523.2511306012],"description":"1728/1715, 225/224 and 81/80"},"pipedum_31e":{"frequencies":[261.6255653006,267.07609791103,272.52663052146,276.85245005354,286.15296204753,290.69507255622,299.00064605783,305.22982618403,311.45900631024,317.94773560837,327.03195662575,332.22294006425,343.38355445704,348.83408706747,357.69120255941,363.36884069528,373.75080757229,381.53728273004,392.4383479509,398.6675280771,408.78994578219,415.27867508032,429.2294430713,436.04260883433,448.50096908674,457.84473927605,467.18850946536,476.92160341255,490.54793493862,498.33441009638,508.71637697339,523.2511306012],"description":"81/80, 126/125 and 1029/1024, Gene Smith (2005) \"Synstargam\""},"pipedum_32":{"frequencies":[261.6255653006,267.07609791103,270.30192333353,280.31310567921,286.15296204753,292.11448209019,299.00064605783,305.22982618403,311.5887808962,315.35224388912,325.57848126297,333.84512238879,337.87740416691,348.83408706747,356.10146388137,360.4025644447,367.91095120397,379.84156147346,384.42940207435,394.1903048614,406.97310157871,415.4517078616,420.46965851882,429.2294430713,443.14848838571,448.50096908674,457.84473927605,474.80195184183,480.53675259294,490.54793493862,500.76768358318,512.57253609913,523.2511306012],"description":"225/224, 2048/2025 and 117649/116640"},"pipedum_32a":{"frequencies":[261.6255653006,268.26840191956,274.59243005311,280.31310567921,286.15296204753,292.89859205665,299.00064605783,305.22982618403,311.5887808962,320.35783506196,327.03195662575,333.84512238879,341.71502406609,348.83408706747,356.10146388137,364.4960256705,372.08969287196,381.53728273004,390.53145607553,398.6675280771,406.97310157871,416.56688648057,425.24536328225,434.10464168396,438.17172313528,450.50320555588,459.88868900496,469.46970335923,480.53675259294,490.54793493862,500.76768358318,512.57253609913,523.2511306012],"description":"589824/588245, 225/224 and 2048/2025"},"pipedum_34":{"frequencies":[261.6255653006,267.90457886781,272.52663052146,279.06726965397,283.88190679319,290.69507255622,294.32876096318,301.39265122629,306.59245933664,313.95067836072,321.48549464138,327.03195662575,334.88072358477,340.65828815182,348.83408706747,354.85238349148,363.36884069528,367.91095120397,376.74081403286,385.78259356965,392.4383479509,401.85686830172,408.78994578219,418.60090448096,425.82286018978,436.04260883433,446.50763144636,454.2110508691,465.11211608996,470.92601754108,482.22824196207,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"15625/15552 and 393216/390625 are homophonic intervals"},"pipedum_34a":{"frequencies":[261.6255653006,264.89588486686,272.52663052146,279.06726965397,282.55561052465,290.69507255622,294.32876096318,301.39265122629,306.59245933664,313.95067836072,317.87506184023,327.03195662575,334.88072358477,340.65828815182,348.83408706747,353.19451315581,363.36884069528,367.91095120397,376.74081403286,387.59343007496,392.4383479509,401.85686830172,408.78994578219,418.60090448096,423.83341578697,436.04260883433,441.49314144476,452.08897683944,465.11211608996,470.92601754108,484.4917875937,490.54793493862,502.32108537715,510.98743222773,523.2511306012],"description":"15625/15552 and 2048/2025, Manuel Op de Coul, 2001"},"pipedum_34b":{"frequencies":[261.6255653006,267.57160087561,272.52663052146,279.06726965397,285.40970760065,290.69507255622,294.32876096318,299.7792935736,310.07474405997,313.95067836072,319.76457981184,327.03195662575,334.88072358477,342.49164912079,348.83408706747,356.76213450082,359.73515228832,367.91095120397,380.54627680087,383.71749577421,392.4383479509,399.70572476481,408.78994578219,418.60090448096,428.11456140098,436.04260883433,441.49314144476,449.66894036041,465.11211608996,470.92601754108,479.64686971777,490.54793493862,502.32108537715,511.62332769895,523.2511306012],"description":"100/99, 243/242 and 5632/5625, Manuel Op de Coul"},"pipedum_36":{"frequencies":[261.6255653006,267.07609791103,269.10058145205,280.31310567921,286.15296204753,290.69507255622,294.32876096318,300.46061014991,305.22982618403,311.5887808962,320.35783506196,327.03195662575,333.84512238879,336.37572681506,343.38355445704,348.83408706747,356.10146388137,367.91095120397,373.75080757229,381.53728273004,384.42940207435,392.4383479509,400.61414686654,406.97310157871,420.46965851882,429.2294430713,436.04260883433,445.12682985172,448.50096908674,457.84473927605,467.3831713443,480.53675259294,490.54793493862,498.33441009638,508.71637697339,515.07533168556,523.2511306012],"description":"1029/1024, 245/243 comma and 50/49 chroma, Gene Ward Smith, 2001"},"pipedum_36a":{"frequencies":[261.6255653006,264.89588486686,275.62199471997,275.93321340298,279.06726965397,290.69507255622,293.99679436797,294.32876096318,310.07474405997,310.42486507835,313.95067836072,327.03195662575,330.74639366397,331.11985608357,348.83408706747,349.22797321314,353.19451315581,367.91095120397,372.08969287196,372.50983809402,387.59343007496,392.4383479509,397.34382730029,413.43299207996,413.89982010446,418.60090448096,436.04260883433,440.99519155196,441.49314144476,465.11211608996,465.63729761752,470.92601754108,490.54793493862,496.11959049595,496.67978412536,516.79124009995,523.2511306012],"description":"1125/1024 and 531441/524288, Op de Coul"},"pipedum_37":{"frequencies":[261.6255653006,263.718569823,276.85245005354,279.06726965397,280.31310567921,290.69507255622,293.02063313667,299.00064605783,308.98710943476,311.45900631024,313.95067836072,325.57848126297,332.22294006425,333.70607818954,346.06556256693,348.83408706747,351.62475976401,353.19451315581,370.78453132171,373.75080757229,376.74081403286,390.69417751556,392.4383479509,400.44729382745,415.27867508032,418.60090448096,421.94971171681,436.04260883433,444.94143758605,448.50096908674,465.11211608996,467.18850946536,470.92601754108,494.37937509562,498.33441009638,502.32108537715,519.0983438504,523.2511306012],"description":"250/243, 3136/3125 and 3125/3087, Gene Ward Smith, 2002"},"pipedum_38":{"frequencies":[261.6255653006,271.25338610366,272.52663052146,280.3771918945,282.55561052465,290.69507255622,292.95365699196,301.39265122629,302.80736724606,313.95067836072,315.42434088132,325.50406332439,327.03195662575,336.45263027341,339.06673262958,348.83408706747,350.47148986813,361.67118147155,363.36884069528,376.74081403286,378.50920905758,390.60487598927,392.4383479509,403.74315632809,406.88007915549,418.60090448096,420.56578784176,434.00541776586,436.04260883433,452.08897683944,454.2110508691,467.29531982417,470.92601754108,484.4917875937,488.25609498659,502.32108537715,504.67894541011,519.21702202686,523.2511306012],"description":"81/80 and 1224440064/1220703125, Manuel Op de Coul, 2001"},"pipedum_38a":{"frequencies":[261.6255653006,268.26840191956,272.52663052146,274.70684356563,279.06726965397,286.15296204753,293.02063313667,294.32876096318,305.22982618403,306.59245933664,313.95067836072,321.92208230347,327.03195662575,329.64821227876,340.65828815182,343.38355445704,348.83408706747,357.69120255941,366.27579142084,367.91095120397,381.53728273004,383.2405741708,390.69417751556,392.4383479509,408.78994578219,412.06026534844,418.60090448096,429.2294430713,436.04260883433,439.53094970501,457.84473927605,459.88868900496,470.92601754108,476.92160341255,488.36772189445,490.54793493862,510.98743222773,515.07533168556,523.2511306012],"description":"50/49, 81/80 and 3125/3072, Gene Ward Smith, 2002"},"pipedum_41":{"frequencies":[261.6255653006,265.71346475842,269.80136421624,274.70684356563,280.31310567921,286.15296204753,290.69507255622,294.32876096318,299.00064605783,303.67253115248,308.34441624714,313.95067836072,320.49131749323,327.03195662575,331.11985608357,336.37572681506,343.38355445704,348.83408706747,354.2846196779,359.73515228832,366.27579142084,373.75080757229,381.53728273004,387.40708707973,392.4383479509,400.61414686654,406.97310157871,412.06026534844,418.60090448096,425.14154361347,436.04260883433,441.49314144476,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,485.87604984397,495.99846754905,503.62921320365,513.90736041189,523.2511306012],"description":"100/99 105/104 196/195 275/273 385/384, Paul Erlich, TL 3-11-2000"},"pipedum_41a":{"frequencies":[261.6255653006,265.71346475842,269.80136421624,274.70684356563,280.31310567921,285.40970760065,290.69507255622,294.32876096318,299.00064605783,305.22982618403,309.19384990071,313.95067836072,319.76457981184,327.03195662575,332.97799220076,336.37572681506,343.38355445704,348.83408706747,353.19451315581,359.73515228832,366.27579142084,373.75080757229,380.54627680087,387.59343007496,392.4383479509,400.61414686654,406.97310157871,411.12588832951,418.60090448096,425.14154361347,436.04260883433,441.49314144476,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,485.87604984397,495.99846754905,503.62921320365,513.90736041189,523.2511306012],"description":"pipedum_41 improved shape by Manuel Op de Coul, all intervals superparticular"},"pipedum_41b":{"frequencies":[261.6255653006,265.7783520514,271.31540105247,274.70684356563,279.06726965397,284.8811711051,290.69507255622,294.32876096318,299.00064605783,305.22982618403,310.07474405997,313.95067836072,319.76457981184,327.03195662575,331.11985608357,336.37572681506,343.38355445704,348.83408706747,353.19451315581,359.73515228832,366.27579142084,373.75080757229,381.53728273004,387.59343007496,392.4383479509,398.6675280771,406.97310157871,412.06026534844,418.60090448096,425.14154361347,436.04260883433,441.49314144476,448.50096908674,457.84473927605,465.11211608996,470.92601754108,479.64686971777,490.54793493862,498.33441009638,504.56359022259,515.07533168556,523.2511306012],"description":"pipedum_41 more improved shape by M. OdC, all intervals superparticular"},"pipedum_41c":{"frequencies":[261.6255653006,267.07609791103,271.31540105247,275.93321340298,280.31310567921,286.15296204753,290.69507255622,294.32876096318,299.00064605783,305.22982618403,310.07474405997,315.35224388912,320.35783506196,327.03195662575,333.84512238879,336.37572681506,343.38355445704,348.83408706747,356.10146388137,360.4025644447,367.91095120397,373.75080757229,381.53728273004,384.42940207435,392.4383479509,398.6675280771,406.97310157871,410.05802887931,420.46965851882,429.2294430713,436.04260883433,445.12682985172,448.50096908674,457.84473927605,465.11211608996,474.80195184183,480.53675259294,490.54793493862,498.33441009638,508.71637697339,512.57253609913,523.2511306012],"description":"225/224, 245/243 and 1029/1024, Gene Ward Smith, 2002"},"pipedum_41d":{"frequencies":[261.6255653006,264.89588486686,272.52663052146,275.93321340298,279.06726965397,282.55561052465,290.69507255622,294.32876096318,297.67175429757,306.59245933664,310.07474405997,313.95067836072,317.51653791741,327.03195662575,331.11985608357,334.88072358477,344.91651675372,348.83408706747,353.19451315581,363.36884069528,367.91095120397,372.08969287196,376.74081403286,387.59343007496,392.4383479509,396.89567239676,408.78994578219,413.89982010446,418.60090448096,423.83341578697,436.04260883433,441.49314144476,446.50763144636,459.88868900496,465.11211608996,470.92601754108,484.4917875937,490.54793493862,496.11959049595,502.32108537715,517.37477513058,523.2511306012],"description":"3125/3072 and 32805/32768"},"pipedum_43":{"frequencies":[261.6255653006,269.10058145205,273.37201925287,274.70684356563,282.55561052465,286.15296204753,287.04062021552,290.69507255622,299.00064605783,305.22982618403,307.54352165948,313.95067836072,322.92069774245,327.03195662575,328.04642310345,332.22294006425,341.71502406609,343.38355445704,348.83408706747,358.80077526939,366.27579142084,369.05222599138,376.74081403286,379.68336007343,381.53728273004,392.4383479509,398.6675280771,410.05802887931,412.06026534844,418.60090448096,423.93031414449,430.56093032327,436.04260883433,448.50096908674,455.62003208812,457.84473927605,470.92601754108,478.40103369253,492.06963465517,494.47231841813,498.33441009638,508.71637697339,512.57253609913,523.2511306012],"description":"81/80, 126/125 and 12288/12005, Gene Ward Smith, 2002"},"pipedum_45":{"frequencies":[261.6255653006,265.7783520514,267.07609791103,274.70684356563,279.06726965397,280.31310567921,284.8811711051,293.02063313667,294.32876096318,299.00064605783,303.74668805875,305.22982618403,313.95067836072,320.49131749323,325.57848126297,327.03195662575,336.37572681506,341.85740532612,343.38355445704,348.83408706747,356.10146388137,358.80077526939,366.27579142084,372.08969287196,373.75080757229,384.58958099188,392.4383479509,398.6675280771,400.61414686654,406.97310157871,418.60090448096,420.46965851882,427.32175665765,436.04260883433,439.53094970501,448.50096908674,455.80987376816,457.84473927605,465.11211608996,478.40103369253,480.73697623985,488.36772189445,498.33441009638,512.78610798918,515.07533168556,523.2511306012],"description":"81/80, 525/512 and 2401/2400, Gene Ward Smith, 2002"},"scala205pipedum_45a":{"frequencies":[261.6255653006,267.07609791103,269.10058145205,274.70684356563,276.85245005354,282.55561052465,288.32205155576,290.69507255622,296.75121990114,299.00064605783,305.22982618403,311.45900631024,313.95067836072,320.49131749323,322.99452506247,329.64821227876,336.37572681506,339.14425131559,345.98646186692,348.83408706747,356.10146388137,363.28578496026,366.27579142084,373.75080757229,376.82694590621,384.42940207435,392.4383479509,395.66829320152,403.65087217807,406.97310157871,415.27867508032,423.83341578697,427.14378008261,436.04260883433,439.53094970501,448.50096908674,457.84473927605,461.31528248922,470.92601754108,474.80195184183,484.4917875937,494.47231841813,498.33441009638,508.71637697339,512.57253609913,523.2511306012],"description":"81/80, 2401/2400 and 4375/4374, Gene Ward Smith"},"pipedum_46":{"frequencies":[261.6255653006,265.7783520514,270.41454913492,274.70684356563,279.06726965397,280.31310567921,286.15296204753,290.69507255622,295.30928005711,300.46061014991,305.22982618403,310.07474405997,313.95067836072,320.49131749323,325.57848126297,327.03195662575,332.22294006425,339.14425131559,343.38355445704,348.83408706747,354.37113606854,360.55273217989,366.27579142084,372.08969287196,373.75080757229,381.53728273004,387.59343007496,392.4383479509,398.6675280771,406.97310157871,412.06026534844,418.60090448096,427.32175665765,429.2294430713,436.04260883433,442.96392008567,450.69091522486,457.84473927605,465.11211608996,470.92601754108,480.73697623985,488.36772189445,490.54793493862,498.33441009638,508.71637697339,515.07533168556,523.2511306012],"description":"126/125, 1029/1024 and 5120/5103. Manuel Op de Coul, 2001"},"pipedum_46a":{"frequencies":[261.6255653006,267.07609791103,269.10058145205,274.70684356563,279.06726965397,280.31310567921,286.15296204753,290.69507255622,294.32876096318,299.00064605783,305.22982618403,307.54352165948,313.95067836072,320.35783506196,320.49131749323,327.03195662575,332.22294006425,336.37572681506,343.38355445704,348.83408706747,353.19451315581,358.80077526939,366.12324007081,366.27579142084,373.75080757229,381.53728273004,387.59343007496,392.4383479509,398.6675280771,406.97310157871,412.06026534844,418.60090448096,427.14378008261,427.32175665765,436.04260883433,445.12682985172,448.50096908674,457.84473927605,465.11211608996,470.92601754108,478.40103369253,488.36772189445,490.54793493862,498.33441009638,508.71637697339,512.57253609913,523.2511306012],"description":"126/125, 1029/1024 and 245/243, Gene Ward Smith, 2002"},"pipedum_46b":{"frequencies":[261.6255653006,264.89588486686,271.25338610366,272.52663052146,279.06726965397,282.55561052465,283.88190679319,290.69507255622,294.32876096318,301.39265122629,302.80736724606,310.07474405997,313.95067836072,317.87506184023,322.99452506247,327.03195662575,334.88072358477,339.06673262958,340.65828815182,348.83408706747,353.19451315581,361.67118147155,363.36884069528,372.08969287196,376.74081403286,381.45007420827,387.59343007496,392.4383479509,401.85686830172,403.74315632809,408.78994578219,418.60090448096,423.83341578697,430.65936674996,436.04260883433,441.49314144476,452.08897683944,454.2110508691,465.11211608996,470.92601754108,482.22824196207,484.4917875937,490.54793493862,502.32108537715,508.60009894437,516.79124009995,523.2511306012],"description":"2048/2025 and 78732/78125"},"pipedum_46c":{"frequencies":[261.6255653006,266.47048317654,271.31540105247,274.08392555301,279.06726965397,282.62020942966,287.78812183066,290.69507255622,297.67175429757,299.7792935736,306.97399661937,310.07474405997,313.95067836072,319.76457981184,325.57848126297,328.90071066361,332.22294006425,339.14425131559,342.60490694126,348.83408706747,355.29397756872,359.73515228832,363.36884069528,372.08969287196,374.72411696701,383.71749577421,387.59343007496,394.68085279633,399.70572476481,406.97310157871,411.12588832951,418.60090448096,426.35277308246,431.68218274599,436.04260883433,446.50763144636,449.66894036041,460.46099492906,465.11211608996,467.18850946536,479.64686971777,484.4917875937,496.11959049595,499.63215595601,511.62332769895,516.79124009995,523.2511306012],"description":"126/125, 176/175, 385/384 and 896/891, Paul Erlich"},"pipedum_46d":{"frequencies":[261.6255653006,267.23182741418,272.79915715198,274.70684356563,278.36648688978,283.42769574232,287.78812183066,291.52562990638,297.59908052943,299.7792935736,303.67253115248,311.77046531655,313.95067836072,320.67819289702,324.7609013714,327.03195662575,334.03978426773,340.11323489078,343.04051394309,345.34574619679,354.2846196779,359.73515228832,366.27579142084,374.12455837986,376.74081403286,381.53728273004,389.71308164569,392.4383479509,402.90337056292,408.13588186894,411.12588832951,419.69101100305,425.14154361347,431.68218274599,439.53094970501,445.38637902364,448.50096908674,457.84473927605,467.65569797482,470.92601754108,479.64686971777,485.87604984397,490.54793493862,503.62921320365,510.16985233617,519.61744219425,523.2511306012],"description":"91/90, 121/120, 126/125, 169/168 and 176/175"},"pipedum_5":{"frequencies":[261.6255653006,313.95067836072,348.83408706747,392.4383479509,436.04260883433,523.2511306012],"description":"16/15 and 27/25"},"pipedum_50":{"frequencies":[261.6255653006,267.07609791103,269.10058145205,273.37201925287,274.70684356563,276.85245005354,284.76252005507,286.15296204753,290.69507255622,299.00064605783,300.46061014991,305.22982618403,307.54352165948,313.95067836072,316.40280006119,320.49131749323,327.03195662575,332.22294006425,333.84512238879,341.71502406609,343.38355445704,348.83408706747,358.80077526939,360.55273217989,361.60320006994,366.27579142084,373.75080757229,379.68336007343,381.53728273004,392.4383479509,398.6675280771,400.61414686654,410.05802887931,412.06026534844,418.60090448096,423.93031414449,427.14378008261,436.04260883433,445.12682985172,448.50096908674,455.62003208812,457.84473927605,470.92601754108,478.40103369253,480.73697623985,484.4917875937,498.33441009638,500.76768358318,508.71637697339,512.57253609913,523.2511306012],"description":"81/80, 126/125 and 16807/16384, Gene Ward Smith, 2002"},"pipedum_53":{"frequencies":[261.6255653006,264.89588486686,269.16210421872,272.52663052146,275.93321340298,279.06726965397,282.55561052465,287.4304306281,290.69507255622,294.32876096318,298.00787047521,302.80736724606,306.59245933664,310.07474405997,313.95067836072,317.87506184023,322.99452506247,327.03195662575,331.11985608357,334.88072358477,340.65828815182,344.91651675372,348.83408706747,353.19451315581,357.20610515709,363.36884069528,367.91095120397,372.08969287196,376.74081403286,383.2405741708,387.59343007496,392.4383479509,397.34382730029,403.74315632809,408.78994578219,413.89982010446,418.60090448096,423.83341578697,430.65936674996,436.04260883433,441.49314144476,446.50763144636,454.2110508691,459.88868900496,465.11211608996,470.92601754108,476.81259276034,484.4917875937,490.54793493862,496.67978412536,502.32108537715,510.98743222773,516.79124009995,523.2511306012],"description":"15625/15552 and 32805/32768, Manuel Op de Coul, 2001"},"pipedum_53a":{"frequencies":[261.6255653006,266.96486255163,269.10058145205,272.52663052146,276.85245005354,280.31310567921,282.55561052465,288.32205155576,290.69507255622,294.32876096318,299.00064605783,302.80736724606,305.22982618403,311.45900631024,313.95067836072,320.35783506196,322.99452506247,327.03195662575,332.22294006425,336.37572681506,339.14425131559,346.06556256693,348.83408706747,353.19451315581,358.80077526939,363.36884069528,366.27579142084,373.75080757229,376.74081403286,384.42940207435,387.59343007496,392.4383479509,398.6675280771,403.65087217807,406.97310157871,415.27867508032,418.60090448096,423.83341578697,430.56093032327,436.04260883433,441.49314144476,448.50096908674,454.2110508691,457.84473927605,467.18850946536,470.92601754108,480.53675259294,484.4917875937,490.54793493862,498.33441009638,504.56359022259,508.71637697339,519.0983438504,523.2511306012],"description":"225/224, 1728/1715 and 4375/4374, Manuel Op de Coul, 2001"},"pipedum_53b":{"frequencies":[261.6255653006,266.96486255163,269.10058145205,272.52663052146,274.70684356563,280.31310567921,286.03378130532,288.32205155576,290.69507255622,293.02063313667,299.00064605783,301.39265122629,305.22982618403,311.45900631024,313.95067836072,320.35783506196,322.92069774245,327.03195662575,333.70607818954,336.37572681506,341.85740532612,343.24053756638,348.83408706747,351.62475976401,358.80077526939,363.36884069528,366.27579142084,373.75080757229,376.74081403286,384.42940207435,389.3237578878,392.4383479509,400.44729382745,403.65087217807,406.97310157871,410.22888639134,418.60090448096,427.14378008261,430.56093032327,436.04260883433,439.53094970501,448.50096908674,457.65405008851,457.84473927605,467.18850946536,470.92601754108,478.60036745656,480.53675259294,488.36772189445,498.33441009638,502.32108537715,512.57253609913,512.78610798918,523.2511306012],"description":"225/224, 1728/1715 and 3125/3087, Gene Ward Smith, 2002"},"pipedum_55":{"frequencies":[261.6255653006,267.07609791103,269.10058145205,272.52663052146,274.70684356563,279.06726965397,280.31310567921,286.15296204753,293.02063313667,294.32876096318,296.75121990114,299.00064605783,305.22982618403,306.59245933664,313.95067836072,317.94773560837,320.49131749323,325.57848126297,327.03195662575,333.84512238879,336.37572681506,340.65828815182,343.38355445704,348.83408706747,356.10146388137,358.80077526939,366.27579142084,367.91095120397,373.75080757229,376.74081403286,381.53728273004,390.69417751556,392.4383479509,400.61414686654,403.65087217807,406.97310157871,408.78994578219,418.60090448096,427.32175665765,429.2294430713,436.04260883433,439.53094970501,445.12682985172,448.50096908674,457.84473927605,459.88868900496,470.92601754108,474.80195184183,476.92160341255,488.36772189445,490.54793493862,502.32108537715,504.56359022259,508.71637697339,520.92557002075,523.2511306012],"description":"81/80, 686/675 and 6144/6125, Gene Ward Smith, 2002"},"pipedum_58":{"frequencies":[261.6255653006,264.29521392612,268.60224704195,271.31540105247,275.62199471997,277.50997462242,280.31310567921,284.8811711051,287.78812183066,292.35618725654,295.30928005711,297.33211566688,302.17752792219,305.22982618403,310.07474405997,313.23877206058,315.35224388912,320.49131749323,323.76163705949,328.90071066361,332.22294006425,337.63694353197,339.94971891247,343.38355445704,348.83408706747,352.39361856816,358.13632938927,361.75386806997,364.23184169193,370.01329949656,373.75080757229,379.84156147346,383.71749577421,389.80824967539,392.4383479509,396.44282088917,402.90337056292,406.97310157871,413.43299207996,417.65169608078,420.46965851882,427.32175665765,431.68218274599,438.53428088482,442.96392008567,445.99817350032,453.26629188329,457.84473927605,465.11211608996,469.85815809087,477.51510585235,480.73697623985,485.64245558924,493.35106599542,498.33441009638,506.45541529795,511.62332769895,515.07533168556,523.2511306012],"description":"9801/9800, 2401/2400, 5120/5103 and 896/891"},"pipedum_58a":{"frequencies":[261.6255653006,265.65057399753,267.66008354786,270.48058443385,272.52663052146,277.4816601673,281.75060878526,285.40970760065,287.78812183066,293.02063313667,295.1673044417,297.30177875068,301.87565226992,305.22982618403,309.92566966379,313.95067836072,316.2506833304,322.00069575458,323.72860352852,327.03195662575,332.97799220076,338.10073054231,342.60490694126,344.24801655217,348.83408706747,352.18826098158,358.59168390851,362.25078272391,366.27579142084,368.95913055213,375.66747838035,379.50081999647,381.53728273004,388.47432423422,392.4383479509,399.57359064092,402.50086969323,406.97310157871,411.12588832951,418.60090448096,422.62591317789,428.25613367658,430.31002069022,436.04260883433,442.75095666255,450.80097405642,455.40098399577,457.84473927605,466.16918908107,469.58434797544,475.68284600109,483.00104363188,488.36772189445,495.88107146206,499.46698830115,503.12608711654,512.27383415502,516.54278277298,523.2511306012],"description":"126/125, 144/143, 176/175, 196/195 and 364/363"},"pipedum_5a":{"frequencies":[261.6255653006,290.69507255622,348.83408706747,392.4383479509,470.92601754108,523.2511306012],"description":"27/25 and 81/80"},"pipedum_64":{"frequencies":[261.6255653006,267.90457886781,266.96486255163,273.37201925287,274.70684356563,273.74326726486,280.31310567921,280.42990280658,284.76252005507,286.15296204753,294.32876096318,300.05312833195,299.00064605783,300.46061014991,307.67166479351,306.59245933664,313.95067836072,312.84944830269,320.35783506196,320.49131749323,328.18310911307,327.03195662575,336.37572681506,336.5158833679,341.71502406609,343.38355445704,351.62475976401,348.83408706747,358.80077526939,358.95027559242,366.12324007081,366.27579142084,375.06641041494,373.75080757229,382.72082695402,384.58958099188,383.2405741708,392.4383479509,392.60186392921,398.6675280771,400.61414686654,412.06026534844,408.78994578219,418.60090448096,428.6473261885,427.14378008261,429.2294430713,439.53094970501,437.98922762377,448.50096908674,448.68784449053,455.62003208812,457.84473927605,468.83301301868,467.18850946536,478.40103369253,480.73697623985,488.16432009441,490.54793493862,502.32108537715,500.55911728431,512.57253609913,512.78610798918,520.70860810071,523.2511306012],"description":"225/224 235298/234375 and 67108864/66706983"},"pipedum_65":{"frequencies":[261.6255653006,264.59711493117,267.38234771992,270.72462706642,273.0589090967,275.93321340298,279.06726965397,282.00481986086,285.20783756792,287.99181818792,291.26283636981,294.32876096318,297.67175429757,300.80514118491,303.39878788522,306.84479880935,310.42486507835,313.95067836072,317.25542234346,320.85881726391,323.62537374423,327.30111872997,331.11985608357,334.60532825287,338.40578383303,341.32363637087,345.20039866051,348.83408706747,352.79615324157,356.9123501364,360.9661694219,364.07854546226,367.91095120397,372.08969287196,376.00642648114,380.70650681216,383.98909091723,388.35044849308,392.4383479509,396.89567239676,401.07352157989,404.53171718029,409.58836364504,413.89982010446,418.60090448096,423.00722979129,427.81175635188,431.50049832564,436.89425455471,441.49314144476,446.50763144636,451.20771177737,455.09818182783,460.26719821402,465.11211608996,470.92601754108,475.8831335152,481.28822589586,485.43806061635,490.95167809495,496.11959049595,501.90799237931,507.60867574954,511.9854545563,517.80059799077,523.2511306012],"description":"1216/1215, 32805/32768 and 39858075/39845888. Manuel Op de Coul, 2001"},"pipedum_65a":{"frequencies":[261.6255653006,264.89588486686,267.90457886781,269.16210421872,272.52663052146,275.93321340298,279.06726965397,282.55561052465,286.08755565621,287.10624449997,290.69507255622,294.32876096318,298.00787047521,301.39265122629,302.80736724606,306.59245933664,310.07474405997,313.95067836072,317.87506184023,319.0069383333,322.99452506247,327.03195662575,331.11985608357,334.88072358477,339.06673262958,340.65828815182,344.52749339997,348.83408706747,353.19451315581,357.60944457026,358.88280562497,363.36884069528,367.91095120397,372.08969287196,376.74081403286,381.45007420827,383.2405741708,387.59343007496,392.4383479509,397.34382730029,401.85686830172,403.74315632809,408.78994578219,413.43299207996,418.60090448096,423.83341578697,429.13133348431,430.65936674996,436.04260883433,441.49314144476,446.50763144636,452.08897683944,454.2110508691,459.88868900496,465.11211608996,470.92601754108,476.81259276034,478.51040749995,484.4917875937,490.54793493862,496.67978412536,502.32108537715,508.60009894437,510.98743222773,516.79124009995,523.2511306012],"description":"78732/78125 and 32805/32768"},"pipedum_67":{"frequencies":[261.6255653006,262.79353657426,266.96486255163,267.07609791103,272.52663052146,274.70684356563,279.06726965397,280.31310567921,284.8811711051,286.15296204753,293.02063313667,294.32876096318,299.00064605783,299.12522966035,300.33547037059,305.22982618403,306.59245933664,311.45900631024,313.95067836072,320.35783506196,320.49131749323,325.57848126297,327.03195662575,332.22294006425,336.5158833679,339.00300006557,341.85740532612,343.38355445704,348.83408706747,350.39138209902,355.95315006884,360.55273217989,366.27579142084,367.91095120397,373.75080757229,373.90653707544,381.53728273004,384.58958099188,390.69417751556,392.4383479509,398.83363954714,400.44729382745,400.61414686654,406.97310157871,408.78994578219,418.60090448096,420.46965851882,427.32175665765,429.2294430713,436.04260883433,439.53094970501,448.50096908674,448.68784449053,455.80987376816,457.84473927605,459.88868900496,465.11211608996,467.18850946536,474.60420009179,480.73697623985,488.36772189445,490.54793493862,498.33441009638,504.77382505185,512.78610798918,515.07533168556,520.92557002075,523.2511306012],"description":"81/80, 1029/1024 and 9604/9375, Gene Ward Smith, 2002"},"pipedum_68":{"frequencies":[246.94165062806,250.86135936819,252.08626834948,253.99712636029,258.02882677871,259.28873315946,263.4044273366,264.58033995864,268.89201957278,272.13977824317,273.16014686758,276.57464870343,277.80935695657,282.21902928921,286.81815421096,288.0985923994,291.6998248044,292.67158592955,296.32998075367,301.03363124183,302.50352201937,307.30516522603,308.67706328508,311.01688942076,316.08531280392,317.49640795036,322.53603347338,324.11091644933,329.25553417075,333.37122834788,334.48181249092,338.66283514705,340.17472280396,345.71831087928,351.20590311546,352.77378661151,357.18345894416,358.5226927637,362.85303765756,368.76619827124,370.41247594209,376.29203905228,378.12940252422,384.13145653254,387.04324016806,388.93309973919,395.1066410049,396.87050993795,403.33802935916,409.74022030137,411.56941771343,414.86197305514,416.71403543485,423.32854393382,430.22723131644,432.1478885991,439.00737889433,441.15096961159,444.49497113051,451.55044686274,453.56629707195,460.95774783905,468.27453748728,470.36504881535,474.12796920588,476.24461192554,483.80405021008,491.68826436165,493.88330125612],"description":"245/243, 2048/2025 and 2401/2400, Gene Ward Smith, 2002"},"pipedum_7":{"frequencies":[261.6255653006,290.69507255622,317.94773560837,347.75533582165,392.4383479509,429.2294430713,476.92160341255,523.2511306012],"description":"81/80, 64/63 and 6144/6125, Manuel Op de Coul"},"pipedum_72":{"frequencies":[195.99771799087,198.44768946576,200.08100378235,201.59765279061,204.16428957382,205.79760389041,208.41771227328,209.06423252359,211.67753543014,214.37250405251,216.08748408493,217.77524221208,220.49743273973,222.31222642483,223.99739198957,226.79735938944,228.66400432268,231.52230437672,232.29359169288,235.19726158904,238.19167116946,240.09720453882,241.91718334873,244.99714748859,246.9571246685,250.10125472793,251.99706598826,254.07111591409,257.24700486302,258.04499557198,261.33029065449,264.59691928767,266.7746717098,268.79687038748,272.2190527651,274.39680518722,277.89028303104,279.99673998696,282.23671390685,285.83000540335,289.40288047089,290.3669896161,293.99657698631,296.41630189977,300.12150567352,302.39647918591,304.88533909691,308.69640583562,311.1074888744,313.59634878539,317.58889489261,321.55875607877,322.55624446497,326.66286331812,329.27616622466,333.46833963724,335.99608798435,338.76148788545,342.99600648402,347.28345656507,348.44038753932,352.79589238357,357.28750675419,360.14580680822,362.95873702013,365.86240691629,370.43568700274,373.32898664928,376.31561854247,381.10667387114,385.87050729453,387.1559861548,391.99543598174],"description":"225/224, 1029/1024 and 4375/4374, Gene Ward Smith, 2002"},"pipedum_72a":{"frequencies":[195.99771799087,197.5656997348,200.08100378235,201.59765279061,203.21043401293,205.79760389041,207.44398472154,209.99755499022,211.67753543014,213.41973736784,216.04686727389,217.77524221208,219.51744414977,222.31222642483,223.99739198957,226.84921063758,228.66400432268,230.49331635726,233.3306166558,235.19726158904,237.07883968176,240.09720453882,241.91718334873,244.99714748859,246.9571246685,248.93278166584,251.99706598826,254.07111591409,256.1036848414,259.25624072866,261.33029065449,264.65741241051,266.7746717098,268.79687038748,272.2190527651,274.39680518722,276.59197962872,279.99673998696,282.23671390685,285.83000540335,288.11664544658,290.30062001848,293.99657698631,296.3485496022,298.59492344758,302.46561418344,304.88533909691,308.7669811456,311.1074888744,313.59634878539,317.58889489261,320.12960605175,322.55624446497,326.66286331812,329.27616622466,333.46833963724,335.99608798435,338.68405668822,342.99600648402,345.73997453589,348.36074402217,352.79589238357,355.69956227973,360.07811212314,362.95873702013,365.86240691629,370.52037737472,373.32898664928,376.31561854247,381.10667387114,384.15552726211,388.884361093,391.99543598174],"description":"4375/4374, 2401/2400 and 15625/15552, Manuel Op de Coul, 2002"},"pipedum_72b":{"frequencies":[195.99771799087,197.5656997348,200.51849868858,202.12264667808,204.16428957382,205.79760389041,207.94510975112,209.60867062912,211.67753543014,213.41973736784,215.59748978996,218.74745311481,220.49743273973,222.7983318762,224.58071853121,226.79735938944,228.66400432268,230.99731048924,232.89852292125,235.19726158904,238.19167116946,240.62219842629,242.5471760137,244.99714748859,246.9571246685,249.53413170134,251.53040475495,254.07111591409,256.1036848414,259.87197430039,262.49694373777,264.59691928767,267.35799825143,269.49686223745,272.2190527651,274.39680518722,277.19677258709,279.4782275055,283.49669923679,285.83000540335,288.74663811155,291.12315365156,293.99657698631,296.3485496022,299.44095804161,301.83648570594,304.88533909691,309.37139797666,311.91766462667,314.99633248533,317.51630314521,320.82959790172,323.39623468494,326.66286331812,329.27616622466,332.71217560179,336.87107779681,340.19603908415,342.99600648402,346.49596573386,349.34778438187,352.79589238357,355.69956227973,359.32914964993,362.08404605941,367.49572123288,371.24567757199,374.30119755201,377.99559898239,381.10667387114,384.99551748207,388.16420486875,391.99543598174],"description":"225/224, 3025/3024, 1375/1372 and 4375/4374"},"pipedum_72b2":{"frequencies":[195.99771799087,198.44768946576,200.45221158157,202.12264667808,204.16428957382,205.79760389041,207.87636756607,209.06423252359,211.67753543014,213.81569235368,215.59748978996,217.77524221208,220.49743273973,222.72467953508,223.99739198957,226.79735938944,228.66400432268,230.99731048924,233.3306166558,235.19726158904,237.57299150408,239.55276643329,241.97249134675,244.99714748859,246.39713118852,249.45164107929,251.99706598826,254.07111591409,257.24700486302,258.71698774795,261.33029065449,264.59691928767,267.2696154421,269.49686223745,272.2190527651,274.39680518722,277.19677258709,279.99673998696,282.23671390685,285.0875898049,287.46331971994,290.3669896161,293.99657698631,296.96623938011,298.66318931942,302.39647918591,304.88533909691,307.99641398565,311.81455134911,313.59634878539,317.51630314521,320.72353853051,323.39623468494,326.66286331812,329.27616622466,332.60218810572,335.99608798435,338.76148788545,342.99600648402,344.95598366393,348.44038753932,352.79589238357,356.35948725613,359.32914964993,362.95873702013,367.49572123288,369.59569678278,374.17746161893,376.31561854247,380.11678640654,383.28442629326,387.1559861548,391.99543598174],"description":"Optimised version of pipedum_72b, Manuel Op de Coul"},"pipedum_72c":{"frequencies":[195.99771799087,197.5656997348,199.99767141926,201.59765279061,203.25689273127,205.79760389041,207.40499258293,209.99755499022,211.67753543014,213.41973736784,215.9974851328,217.77524221208,219.51744414977,222.31222642483,223.99739198957,226.79735938944,228.66400432268,230.49331635726,233.3306166558,235.19726158904,237.13304151982,239.99720570311,241.91718334873,244.99714748859,246.9571246685,248.88599109952,251.99706598826,254.07111591409,256.1036848414,259.19698215935,261.33029065449,264.59691928767,266.7746717098,268.79687038748,272.2190527651,274.39680518722,276.47678096998,279.99673998696,282.23671390685,285.83000540335,287.99664684373,290.3669896161,293.99657698631,296.41630189977,298.66318931942,302.39647918591,304.88533909691,308.69640583562,311.1074888744,313.59634878539,317.58889489261,320.12960605175,322.55624446497,326.66286331812,329.27616622466,333.32945236543,335.99608798435,338.76148788545,342.99600648402,345.59597621247,348.44038753932,352.79589238357,355.69956227973,359.99580855466,362.95873702013,365.86240691629,370.43568700274,373.32898664928,376.31561854247,381.10667387114,384.15552726211,388.884361093,391.99543598174],"description":"441/440, 2401/2400, 4375/4374 and 1375/1372"},"pipedum_74":{"frequencies":[174.6141157165,175.4667237034,177.38576834692,178.25190979393,182.45393315683,183.34482150233,186.25505676427,187.16450528362,187.6669026756,191.57662981467,192.51206257744,194.01568412944,194.96302633711,195.48635695375,199.55898939029,200.53339851817,202.72659239648,203.71646833592,208.51878075067,209.5369388598,210.56006844408,212.8629220163,213.90229175271,216.62558481901,218.9447197882,220.01378580279,221.73221043365,222.81488724241,228.06741644604,229.18102687791,231.68753416741,232.81882095533,233.95563160453,239.47078726834,240.6400782218,243.27191087578,244.4597620031,249.5526737115,250.2225369008,251.44432663176,253.4082404956,254.6455854199,259.95070178281,260.64847593833,261.92117357475,266.07865252038,267.37786469089,273.68089973525,275.01723225349,278.02504100089,279.3825851464,280.74675792544,285.20305567028,287.36494472201,291.02352619417,291.92629305093,292.44453950566,297.08651632321,299.33848408543,304.08988859472,305.57470250388,310.42509460711,311.94084213937,312.778171126,319.29438302446,320.85343762907,325.94634933747,328.4170796823,333.63004920107,334.22233086361,335.25910217568,339.52744722653,342.10112466906,347.53130125111,349.228231433],"description":"81/80, 126/125 and 4194304/4117715, Gene Ward Smith, 2002"},"pipedum_81":{"frequencies":[116.54094037952,117.10998793997,118.96887663743,119.87068153322,121.77339076391,122.3679873985,122.96548733697,124.86529326377,124.9173204693,126.84728204574,127.4666535401,128.08904930934,130.12220882219,130.47149010419,131.10855792696,133.18964614802,133.83998621711,135.96443044277,136.62831926329,136.99506460939,139.16958944446,139.84912845542,140.53198552796,142.70319230145,142.76265196491,144.96832233798,145.6761754744,146.38748492496,148.71109579678,149.83835191653,152.21673845488,152.95998424812,153.70685917121,155.38792050603,156.14665058662,156.56578812502,159.82757537763,160.60798346053,163.08936263023,163.15731653133,163.95398311595,166.48705768503,167.29998277138,169.12970939431,169.95553805347,170.78539907912,173.96198680558,174.81141056928,175.66498190995,177.58619486403,178.45331495614,182.66008614586,183.55198109774,184.08675852442,184.44823100545,186.46550460723,187.37598070395,190.2709230686,191.19998031015,193.29109645065,194.23490063253,195.18331323328,199.78446922203,200.75997932566,202.95565127318,203.94664566416,204.94247889494,208.7543841667,209.77369268314,210.79797829194,213.10343383684,214.14397794737,217.45248350698,218.5142632116,218.60531082127,221.98274358004,223.06664369518,227.71386543882,228.32510768232,229.43997637218,231.94931574077,233.08188075904],"description":"81/80, 126/125 and 17294403/16777216, Gene Ward Smith, 2002"},"pipedum_87":{"frequencies":[82.40688922822,83.34286871081,83.43697534357,84.3846545697,84.87648045204,85.84050961273,86.81548824043,86.91351598289,87.90068184343,87.99993493267,88.99944036648,90.43280025045,90.53491248218,91.56321025358,92.60318745646,92.70775038175,93.76072729966,93.86659726152,95.37834401414,96.46165360048,96.57057331432,97.66742427048,97.77770548075,98.88826707386,100.01144245297,100.59434720242,101.73690028175,101.85177654245,103.00861153527,104.17858588852,104.29621917947,105.48081821212,105.59992191921,107.30063701591,108.51936030054,108.64189497861,109.87585230429,111.12382494775,111.2493004581,112.5128727596,113.16864060272,114.45401281697,115.75398432057,115.88468797718,117.20090912458,117.3332465769,118.66592048864,120.5770670006,120.7132166429,122.0842803381,122.22213185094,123.61033384233,125.01430306622,125.15546301536,127.17112535219,128.61553813397,128.76076441909,130.22323236064,130.37027397433,131.85102276515,133.3485899373,133.49916054972,135.64920037567,135.80236872326,137.34481538037,138.90478118469,139.06162557262,140.6410909495,140.79989589228,143.06751602122,144.69248040072,144.85585997148,146.50113640572,146.66655822112,148.3324006108,150.01716367946,150.89152080363,152.60535042263,154.33864576076,154.51291730291,156.26787883277,156.4443287692,158.22122731818,160.76942266746,160.95095552387,162.7790404508,162.96284246792,164.81377845644],"description":"67108864/66430125 and 15625/15552, Op de Coul"},"pipedum_9":{"frequencies":[261.6255653006,280.31310567921,305.22982618403,327.03195662575,348.83408706747,392.4383479509,420.46965851882,448.50096908674,490.54793493862,523.2511306012],"description":"225/224, 49/48 and 36/35 are homophonic intervals"},"pipedum_99":{"frequencies":[41.20344461411,41.53307217102,41.72802550619,42.06184971024,42.3806858888,42.72949811834,42.92025480636,43.26361684482,43.60972577957,43.95034092172,44.14654780083,44.49972018324,44.86597302425,45.06626754668,45.407877738,45.78160512679,46.1478579678,46.35387519087,46.73538856693,47.08965098755,47.46636819545,47.68917200707,48.07068538313,48.45525086619,48.65129757643,49.0517197787,49.44413353693,49.83968660523,50.07363060743,50.47421965228,50.85682306656,51.275397742,51.50430576764,51.91634021378,52.34363519496,52.55541404861,52.975857361,53.41187264792,53.8391676291,54.07952105602,54.50191086522,54.93792615215,55.37742956136,55.62465022905,56.08246628032,56.50758118507,56.7598471725,57.22700640849,57.68482245975,58.14630103943,58.41923570866,58.86206373444,59.33296024432,59.82129736567,60.08835672891,60.56906358274,61.04214016905,61.31464972338,61.80516692116,62.29960825653,62.81236223395,63.06649685833,63.5710288332,64.0942471775,64.60700115492,64.89542526722,65.40229303827,65.92551138258,66.21982170125,66.7648408099,67.29895953638,67.80909742208,68.12738858153,68.67240769018,69.2217869517,69.77556124732,70.1030828504,70.63447648133,71.19955229318,71.53375801061,72.10602807469,72.68287629929,73.25056820286,73.57757966805,74.1662003054,74.77662170709,75.37483468075,75.67979623,76.30267521131,76.91309661301,77.25645865146,77.87451032067,78.48275164592,79.11061365909,79.4637860415,80.11780897188,80.75875144366,81.37091690649,81.75286629784,82.40688922822],"description":"2401/2400, 3136/3125 and 4375/4374, Gene Ward Smith, 2002"},"pipedum_9a":{"frequencies":[261.6255653006,282.62020942966,305.22982618403,329.72357766794,356.10146388137,384.67750727926,415.4517078616,448.79042515914,484.69365917187,523.2511306012],"description":"4375/4374, 2401/2400 and 21/20 are homophonic intervals"},"pipedum_9b":{"frequencies":[261.6255653006,279.06726965397,306.59245933664,327.03195662575,357.20610515709,383.2405741708,418.60090448096,446.50763144636,490.54793493862,523.2511306012],"description":"128/125 and 2109375/2097152 are homophonic intervals"},"pipedum_9c":{"frequencies":[261.6255653006,285.40970760065,305.22982618403,332.97799220076,348.83408706747,392.4383479509,411.12588832951,448.50096908674,479.64686971777,523.2511306012],"description":"49/48, 21/20, 99/98 and 121/120, Gene Ward Smith, 2002"},"pipedum_9d":{"frequencies":[261.6255653006,277.4816601673,308.34441624714,327.03195662575,346.85207520913,394.68085279633,418.60090448096,443.97065626768,493.35106599542,523.2511306012],"description":"128/125, 36/35, 99/98 and 121/120, Gene Ward Smith, 2002"},"pipedum_9e":{"frequencies":[261.6255653006,272.52663052146,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,502.32108537715,523.2511306012],"description":"21/20, 27/25 and 128/125"},"polansky_ps":{"frequencies":[261.6255653006,523.2511306012,784.8766959018,1046.5022612024,1308.127826503,1569.7533918036,1831.3789571042,2093.0045224048,2354.6300877054,2616.255653006,2877.8812183066,3139.5067836072,3401.1323489078,3662.7579142084,3924.383479509,4186.0090448096,4447.6346101102,327.03195662575,654.0639132515,981.09586987725,1308.127826503,1635.15978312875,1962.1917397545,2289.22369638025,2616.255653006,2943.28760963175,3270.3195662575,3597.35152288325,3924.383479509,4251.41543613475,4578.4473927605,4905.47934938625,5232.511306012,5559.54326263775,392.4383479509,784.8766959018,1177.3150438527,1569.7533918036,1962.1917397545,2354.6300877054,2747.0684356563,3139.5067836072,3531.9451315581,3924.383479509,4316.8218274599,4709.2601754108,5101.6985233617,5494.1368713126,5886.5752192635,6279.0135672144,6671.4519151653],"description":"Three interlocking harmonic series on 1:5:3 by Larry Polansky in Psaltery"},"poole":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,348.83408706747,392.4383479509,436.04260883433,457.84473927605,523.2511306012],"description":"Poole's double diatonic or dichordal scale"},"porcupine":{"frequencies":[261.6255653006,268.5059110196,275.56719913678,277.81869773502,285.12489766782,287.45448663717,295.01409284105,302.77250493809,305.24628043356,313.27378316024,315.83336022842,324.13928669805,332.66364612382,335.38164643474,344.20166244741,347.01393314922,356.13986022226,365.50578499276,368.49211923405,378.18288921726,381.27279846892,391.29968045081,401.5902538439,404.87141319969,415.51890206933,418.91386427268,429.93064777916,441.23715556831,444.84224659643,456.54090625717,460.27103529174,472.37544811397,484.79818817936,488.75918813348,501.6127950959,505.71118020326,519.01059820838,523.2511306012],"description":"porcupine temperament, g=162.996, 5-limit"},"portbag1":{"frequencies":[261.6255653006,281.75060878526,311.64221749042,334.88072358477,376.74081403286,413.43299207996,457.84473927605,523.2511306012],"description":"Portugese bagpipe tuning"},"portbag2":{"frequencies":[261.6255653006,274.70684356563,281.75060878526,310.07474405997,317.68818643644,343.38355445704,372.08969287196,392.4383479509,408.78994578219,482.37213602298,523.2511306012],"description":"Portugese bagpipe tuning 2"},"prelleur":{"frequencies":[261.6255653006,276.42153822591,293.20376052703,310.91918875105,328.72923110101,349.43408698743,368.89538496172,391.53834819612,414.55891854195,438.90564190541,466.17878415199,492.19384741628,523.2511306012],"description":"Peter Prelleur's well temperament (1731)"},"preston":{"frequencies":[261.6255653006,276.24946721727,293.45376109391,311.26733605541,328.91048112005,349.30075403587,368.79929095641,391.73834630677,413.67420227347,439.48064068428,466.20100528964,492.6657196346,523.2511306012],"description":"Preston's equal beating temperament (1785)"},"preston2":{"frequencies":[261.6255653006,276.2302000593,293.37610901672,311.58628319174,328.97985807656,349.39999567988,368.9044325484,391.80273191286,413.67420227347,439.35140993827,466.62242981045,492.67053466508,523.2511306012],"description":"Preston's theoretically correct well temperament"},"prime_10":{"frequencies":[261.6255653006,277.97716313189,310.68035879446,327.03195662575,359.73515228832,376.08675011961,392.4383479509,425.14154361347,457.84473927605,474.19633710734,523.2511306012],"description":"First 10 prime numbers reduced by 2/1"},"prime_5":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,392.4383479509,436.04260883433,523.2511306012],"description":"What Lou Harrison calls \"the Prime Pentatonic\", a widely used scale"},"primes6":{"frequencies":[261.6255653006,523.2511306012,784.8766959018,1308.127826503,1831.3789571042,2877.8812183066,3401.1323489078],"description":"First 6 primes"},"prinz":{"frequencies":[261.6255653006,275.62199471997,292.50627485027,310.07474405997,327.03195662575,348.83408706747,367.49599295996,391.22147055517,413.43299207996,437.39890198442,465.11211608996,490.54793493862,523.2511306012],"description":"Prinz well-tempermament (1808)"},"prinz2":{"frequencies":[261.6255653006,275.62199471997,291.81313052759,310.07474405997,327.03195662575,348.83408706747,367.49599295996,390.42584360243,413.43299207996,436.71344361716,465.11211608996,490.54793493862,523.2511306012],"description":"Prinz equal beating temperament (1808)"},"prod13-2":{"frequencies":[261.6255653006,265.71346475842,269.80136421624,286.15296204753,292.28481123426,294.32876096318,314.76825825228,318.85615771011,327.03195662575,343.38355445704,345.42750418595,359.73515228832,371.99885066179,392.4383479509,400.61414686654,408.78994578219,425.14154361347,449.66894036041,457.84473927605,490.54793493862,494.63583439645,523.2511306012],"description":"13-limit binary products [1 3 5 7 11 13]"},"prod13":{"frequencies":[261.6255653006,265.71346475842,269.80136421624,286.15296204753,292.28481123426,294.32876096318,314.76825825228,318.85615771011,327.03195662575,331.11985608357,343.38355445704,345.42750418595,359.73515228832,367.91095120397,371.99885066179,392.4383479509,400.61414686654,404.70204632437,408.78994578219,425.14154361347,441.49314144476,449.66894036041,457.84473927605,478.28423656516,490.54793493862,494.63583439645,515.07533168556,523.2511306012],"description":"13-limit binary products [1 3 5 7 9 11 13]"},"prod7d":{"frequencies":[261.6255653006,265.7783520514,267.90457886781,273.37201925287,279.06726965397,286.15296204753,294.32876096318,299.00064605783,300.46061014991,306.59245933664,310.07474405997,318.93402246168,327.03195662575,334.88072358477,341.71502406609,343.38355445704,348.83408706747,350.53737850823,357.69120255941,367.91095120397,372.08969287196,382.72082695402,390.53145607553,392.4383479509,398.6675280771,400.61414686654,408.78994578219,418.60090448096,429.2294430713,441.49314144476,446.50763144636,455.62003208812,457.84473927605,465.11211608996,478.40103369253,490.54793493862,500.76768358318,510.98743222773,515.07533168556,523.2511306012],"description":"Double Cubic Corner 7-limit. Chalmers '96"},"prod7s":{"frequencies":[261.6255653006,286.15296204753,294.32876096318,300.46061014991,306.59245933664,327.03195662575,343.38355445704,350.53737850823,357.69120255941,367.91095120397,392.4383479509,400.61414686654,408.78994578219,429.2294430713,441.49314144476,457.84473927605,490.54793493862,500.76768358318,510.98743222773,515.07533168556,523.2511306012],"description":"Single Cubic Corner 7-limit"},"prodq13":{"frequencies":[261.6255653006,265.71346475842,269.80136421624,276.76092858245,279.06726965397,286.15296204753,292.28481123426,294.32876096318,299.00064605783,304.4370214407,314.76825825228,318.85615771011,322.00069575458,327.03195662575,334.88072358477,341.71502406609,343.38355445704,345.42750418595,348.83408706747,359.73515228832,368.0007951481,371.99885066179,380.54627680087,392.4383479509,396.30854862103,400.61414686654,408.78994578219,418.60090448096,425.14154361347,429.33426100611,434.91003062957,449.66894036041,457.84473927605,465.11211608996,468.3646483703,478.40103369253,490.54793493862,494.63583439645,507.3950357345,515.20111320734,523.2511306012],"description":"13-limit Binary products and quotients. Chalmers '96"},"prog_ennea":{"frequencies":[261.6255653006,269.29177952703,285.30470202322,311.12698372208,349.22823143301,391.99543598175,403.48177901006,427.47405410759,466.16376151809,523.2511306012],"description":"Progressive Enneatonic, 50+100+150+200 cents in each half (500 cents)"},"prog_ennea1":{"frequencies":[261.6255653006,269.10058145205,285.40970760065,310.68035879446,348.83408706747,392.4383479509,404.33041910093,428.11456140098,465.11211608996,523.2511306012],"description":"Progressive Enneatonic, appr. 50+100+150+200 cents in each half (500 cents)"},"prog_ennea2":{"frequencies":[261.6255653006,269.55361273395,285.40970760065,321.08592105074,348.83408706747,392.4383479509,404.33041910093,428.11456140098,481.6288815761,523.2511306012],"description":"Progressive Enneatonic, appr. 50+100+200+150 cents in each half (500 cents)"},"prog_ennea3":{"frequencies":[261.6255653006,269.55361273395,285.40970760065,310.07474405997,348.83408706747,392.4383479509,404.33041910093,428.11456140098,465.11211608996,523.2511306012],"description":"Progressive Enneatonic, appr. 50+100+150+200 cents in each half (500 cents)"},"prooijen1":{"frequencies":[261.6255653006,339.14425131559,366.27579142084,436.04260883433,470.92601754108,610.45965236807,726.73768139056,784.8766959018],"description":"Kees van Prooijen, major mode of Bohlen-Pierce"},"prooijen2":{"frequencies":[261.6255653006,311.45900631024,336.37572681506,436.04260883433,470.92601754108,560.62621135843,726.73768139056,784.8766959018],"description":"Kees van Prooijen, minor mode of Bohlen-Pierce"},"ps-dorian":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,348.83408706747,392.4383479509,490.54793493862,504.56359022259,523.2511306012],"description":"Complex 4 of p. 115 based on Archytas's Enharmonic"},"ps-enh":{"frequencies":[261.6255653006,266.38239376061,279.06726965397,348.83408706747,392.4383479509,399.57359064092,418.60090448096,523.2511306012],"description":"Dorian mode of an Enharmonic genus found in Ptolemy's Harmonics"},"ps-hypod":{"frequencies":[261.6255653006,294.32876096318,367.91095120397,378.42269266694,392.4383479509,406.97310157871,418.60090448096,523.2511306012],"description":"Complex 7 of p. 115 based on Archytas's Enharmonic"},"ps-hypod2":{"frequencies":[261.6255653006,294.32876096318,305.22982618403,313.95067836072,392.4383479509,490.54793493862,504.56359022259,523.2511306012],"description":"Complex 8 of p. 115 based on Archytas's Enharmonic"},"ps-mixol":{"frequencies":[261.6255653006,271.31540105247,279.06726965397,348.83408706747,436.04260883433,448.50096908674,465.11211608996,523.2511306012],"description":"Complex 3 of p. 115 based on Archytas's Enharmonic"},"ptolemy":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,348.83408706747,392.4383479509,436.04260883433,490.54793493862,523.2511306012],"description":"Intense Diatonic Syntonon, also Zarlino's scale"},"ptolemy_chrom":{"frequencies":[261.6255653006,271.31540105247,290.69507255622,348.83408706747,392.4383479509,406.97310157871,436.04260883433,523.2511306012],"description":"Ptolemy Soft Chromatic"},"ptolemy_ddiat":{"frequencies":[261.6255653006,271.31540105247,310.07474405997,348.83408706747,392.4383479509,413.43299207996,465.11211608996,523.2511306012],"description":"Lyra tuning, Dorian mode, comb. of diatonon toniaion & diatonon ditoniaion"},"ptolemy_diat":{"frequencies":[261.6255653006,290.69507255622,313.95067836072,348.83408706747,392.4383479509,436.04260883433,470.92601754108,523.2511306012],"description":"Ptolemy's Diatonon Ditoniaion & Archytas' Diatonic, also Lyra tuning"},"ptolemy_diat2":{"frequencies":[261.6255653006,271.31540105247,305.22982618403,348.83408706747,392.4383479509,406.97310157871,457.84473927605,523.2511306012],"description":"Dorian mode of a permutation of Ptolemy's Tonic Diatonic"},"ptolemy_diat3":{"frequencies":[261.6255653006,294.32876096318,313.95067836072,348.83408706747,392.4383479509,441.49314144476,470.92601754108,523.2511306012],"description":"Dorian mode of the remaining permutation of Ptolemy's Intense Diatonic"},"ptolemy_diat4":{"frequencies":[261.6255653006,299.00064605783,310.07474405997,348.83408706747,392.4383479509,448.50096908674,465.11211608996,523.2511306012],"description":"permuted Ptolemy's diatonic"},"ptolemy_diat5":{"frequencies":[261.6255653006,271.31540105247,310.07474405997,348.83408706747,392.4383479509,406.97310157871,465.11211608996,523.2511306012],"description":"Sterea lyra, Dorian, comb. of 2 Tonic Diatonic 4chords, also Archytas' diatonic"},"ptolemy_diff":{"frequencies":[261.6255653006,294.32876096318,327.03195662575,343.38355445704,392.4383479509,425.14154361347,490.54793493862,523.2511306012],"description":"Difference tones of Intense Diatonic reduced by 2/1"},"ptolemy_enh":{"frequencies":[261.6255653006,267.43946675172,279.06726965397,348.83408706747,392.4383479509,401.15920012759,418.60090448096,523.2511306012],"description":"Dorian mode of Ptolemy's Enharmonic"},"ptolemy_exp":{"frequencies":[261.6255653006,272.52663052146,275.93321340298,287.4304306281,290.69507255622,294.32876096318,306.59245933664,327.03195662575,340.65828815182,344.91651675372,348.83408706747,363.36884069528,367.91095120397,383.2405741708,392.4383479509,408.78994578219,413.89982010446,431.14564594215,436.04260883433,441.49314144476,459.88868900496,490.54793493862,510.98743222773,517.37477513058,523.2511306012],"description":"Intense Diatonic expanded: all interval combinations"},"ptolemy_hom":{"frequencies":[261.6255653006,285.40970760065,313.95067836072,348.83408706747,392.4383479509,428.11456140098,470.92601754108,523.2511306012],"description":"Dorian mode of Ptolemy's Equable Diatonic or Diatonon Homalon"},"ptolemy_iast":{"frequencies":[261.6255653006,271.31540105247,310.07474405997,348.83408706747,392.4383479509,418.60090448096,470.92601754108,523.2511306012],"description":"Ptolemy's Iastia or Lydia tuning, mixture of Tonic Diatonic & Intense Diatonic"},"ptolemy_iastaiol":{"frequencies":[261.6255653006,271.31540105247,310.07474405997,348.83408706747,392.4383479509,441.49314144476,465.11211608996,523.2511306012],"description":"Ptolemy's kithara tuning, mixture of Tonic Diatonic and Ditone Diatonic"},"ptolemy_ichrom":{"frequencies":[261.6255653006,274.08392555301,299.00064605783,348.83408706747,392.4383479509,411.12588832951,448.50096908674,523.2511306012],"description":"Dorian mode of Ptolemy's Intense Chromatic"},"ptolemy_idiat":{"frequencies":[261.6255653006,279.06726965397,313.95067836072,348.83408706747,392.4383479509,418.60090448096,470.92601754108,523.2511306012],"description":"Dorian mode of Ptolemy's Intense Diatonic (Diatonon Syntonon)"},"ptolemy_imix":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,327.03195662575,348.83408706747,392.4383479509,418.60090448096,436.04260883433,465.11211608996,490.54793493862,523.2511306012],"description":"Ptolemy Intense Diatonic mixed with its inverse"},"ptolemy_malak":{"frequencies":[261.6255653006,274.08392555301,299.00064605783,348.83408706747,392.4383479509,406.97310157871,465.11211608996,523.2511306012],"description":"Ptolemy's Malaka lyra tuning, a mixture of Intense Chrom. & Tonic Diatonic"},"ptolemy_malak2":{"frequencies":[261.6255653006,271.31540105247,290.69507255622,348.83408706747,392.4383479509,406.97310157871,465.11211608996,523.2511306012],"description":"Malaka lyra, mixture of his Soft Chromatic and Tonic Diatonic."},"ptolemy_mdiat":{"frequencies":[261.6255653006,274.70684356563,305.22982618403,348.83408706747,392.4383479509,412.06026534844,457.84473927605,523.2511306012],"description":"Ptolemy soft diatonic"},"ptolemy_mdiat2":{"frequencies":[261.6255653006,290.69507255622,305.22982618403,348.83408706747,392.4383479509,436.04260883433,457.84473927605,523.2511306012],"description":"permuted Ptolemy soft diatonic"},"ptolemy_mdiat3":{"frequencies":[261.6255653006,299.00064605783,313.95067836072,348.83408706747,392.4383479509,448.50096908674,470.92601754108,523.2511306012],"description":"permuted Ptolemy soft diatonic"},"ptolemy_meta":{"frequencies":[261.6255653006,274.70684356563,305.22982618403,348.83408706747,392.4383479509,406.97310157871,465.11211608996,523.2511306012],"description":"Metabolika lyra tuning, mixture of Soft Diatonic & Tonic Diatonic"},"ptolemy_mix":{"frequencies":[261.6255653006,279.06726965397,290.69507255622,294.32876096318,310.07474405997,313.95067836072,327.03195662575,348.83408706747,353.19451315581,367.91095120397,372.08969287196,387.59343007496,392.4383479509,418.60090448096,436.04260883433,441.49314144476,465.11211608996,470.92601754108,490.54793493862,523.2511306012],"description":"All modes of Ptolemy Intense Diatonic mixed"},"ptolemy_prod":{"frequencies":[261.6255653006,272.52663052146,275.93321340298,279.06726965397,290.69507255622,294.32876096318,313.95067836072,327.03195662575,331.11985608357,348.83408706747,363.36884069528,367.91095120397,372.08969287196,387.59343007496,392.4383479509,418.60090448096,436.04260883433,441.49314144476,465.11211608996,484.4917875937,490.54793493862,523.2511306012],"description":"Product of Intense Diatonic with its intervals"},"ptolemy_tree":{"frequencies":[261.6255653006,294.32876096318,299.00064605783,305.22982618403,313.95067836072,327.03195662575,348.83408706747,392.4383479509,436.04260883433,457.84473927605,470.92601754108,479.64686971777,485.87604984397,490.54793493862,523.2511306012],"description":"Intense Diatonic with all their Farey parent fractions"},"pygmie":{"frequencies":[261.6255653006,299.00064605783,343.38355445704,392.4383479509,457.84473927605,523.2511306012],"description":"Pygmie scale"},"pyle":{"frequencies":[261.6255653006,277.19063644077,293.6461094938,311.15753660095,329.66944764997,349.23831768549,369.99228554622,391.93430587921,415.28070933274,439.96441988338,466.23108306565,493.99742571239,523.2511306012],"description":"Howard Willet Pyle quasi equal temperament"},"pyramid":{"frequencies":[261.6255653006,294.32876096318,306.59245933664,327.03195662575,348.83408706747,367.91095120397,392.4383479509,408.78994578219,436.04260883433,441.49314144476,465.11211608996,490.54793493862,523.2511306012],"description":"This scale may also be called the \"Wedding Cake\""},"pyramid_down":{"frequencies":[261.6255653006,279.06726965397,294.32876096318,313.95067836072,334.88072358477,348.83408706747,392.4383479509,418.60090448096,441.49314144476,465.11211608996,470.92601754108,502.32108537715,523.2511306012],"description":"Upside-Down Wedding Cake (divorce cake)"},"pyth_12":{"frequencies":[261.6255653006,279.38237857051,294.32876096318,310.07474405997,331.11985608357,348.83408706747,372.50983809402,392.4383479509,419.07356785577,441.49314144476,465.11211608996,496.67978412536,523.2511306012],"description":"12-tone Pythagorean scale"},"pyth_12s":{"frequencies":[261.6255653006,279.38237857051,294.32876096318,314.30517589183,326.6631048533,348.83408706747,367.49599295996,392.4383479509,419.07356785577,435.55080647107,471.45776383774,489.99465727995,523.2511306012],"description":"Scale with major thirds flat by a schisma"},"pyth_17":{"frequencies":[261.6255653006,275.62199471997,279.38237857051,294.32876096318,310.07474405997,314.30517589183,331.11985608357,348.83408706747,367.49599295996,372.50983809402,392.4383479509,413.43299207996,419.07356785577,441.49314144476,465.11211608996,471.45776383774,496.67978412536,523.2511306012],"description":"17-tone Pythagorean scale"},"pyth_17s":{"frequencies":[261.6255653006,275.62199471997,279.06726965397,294.32876096318,310.07474405997,313.95067836072,331.11985608357,348.83408706747,367.49599295996,372.08969287196,392.4383479509,413.43299207996,418.60090448096,441.49314144476,465.11211608996,470.92601754108,496.67978412536,523.2511306012],"description":"Schismatically altered 17-tone Pythagorean scale"},"pyth_22":{"frequencies":[261.6255653006,275.62199471997,279.38237857051,290.36720431405,294.32876096318,310.07474405997,314.30517589183,326.6631048533,331.11985608357,348.83408706747,353.59332287831,367.49599295996,372.50983809402,392.4383479509,413.43299207996,419.07356785577,435.55080647107,441.49314144476,465.11211608996,471.45776383774,489.99465727995,496.67978412536,523.2511306012],"description":"Pythagorean shrutis"},"pyth_27":{"frequencies":[261.6255653006,265.19499215873,275.62199471997,279.38237857051,290.36720431405,294.32876096318,298.34436617857,310.07474405997,314.30517589183,326.6631048533,331.11985608357,348.83408706747,353.59332287831,367.49599295996,372.50983809402,387.15627241873,392.4383479509,397.79248823809,413.43299207996,419.07356785577,435.55080647107,441.49314144476,447.51654926786,465.11211608996,471.45776383774,489.99465727995,496.67978412536,523.2511306012],"description":"27-tone Pythagorean scale"},"pyth_31":{"frequencies":[261.6255653006,265.19499215873,275.62199471997,279.38237857051,283.19406633357,294.32876096318,298.34436617857,310.07474405997,314.30517589183,318.59332496145,326.6631048533,331.11985608357,335.63741195089,348.83408706747,353.59332287831,367.49599295996,372.50983809402,377.59208844475,392.4383479509,397.79248823809,413.43299207996,419.07356785577,424.79110016094,441.49314144476,447.51654926786,465.11211608996,471.45776383774,477.8899872033,489.99465727995,496.67978412536,503.45611792634,523.2511306012],"description":"31-tone Pythagorean scale"},"pyth_7a":{"frequencies":[261.6255653006,277.97716313189,294.32876096318,312.72430852337,331.11985608357,348.83408706747,370.63621750918,392.4383479509,416.96574469783,441.49314144476,469.08646278506,496.67978412536,523.2511306012],"description":"Pythagorean 7-tone with whole tones divided arithmetically"},"pyth_7h":{"frequencies":[261.6255653006,277.01530443593,294.32876096318,311.64221749042,331.11985608357,348.83408706747,369.35373924791,392.4383479509,415.52295665389,441.49314144476,467.46332623563,496.67978412536,523.2511306012],"description":"Pythagorean 7-tone with whole tones divided harmonically"},"pyth_chrom":{"frequencies":[261.6255653006,275.62199471997,294.32876096318,348.83408706747,392.4383479509,413.43299207996,441.49314144476,465.11211608996,523.2511306012],"description":"Dorian mode of the so-called Pythagorean chromatic, recorded by Gaudentius"},"pyth_sev":{"frequencies":[261.6255653006,268.38018042036,275.30918532257,282.41708286353,291.47537246454,299.00064605783,306.7202061947,314.63906894008,322.76237975718,333.11471138804,341.71502406609,350.53737850823,359.58750736009,368.87129039875,380.70252730062,390.53145607553,400.61414686654,410.95715126868,421.56719060242,435.08860262928,446.32166408632,457.84473927605,469.66531573563,481.7910743145,497.2441172906,510.08190181294,523.2511306012],"description":"26-tone Pythagorean scale based on 7/4"},"pyth_sev_16":{"frequencies":[261.6255653006,268.38018042036,275.30918532257,282.41708286353,306.7202061947,314.63906894008,322.76237975718,350.53737850823,359.58750736009,368.87129039875,400.61414686654,410.95715126868,421.56719060242,457.84473927605,469.66531573563,481.7910743145,523.2511306012],"description":"16-tone Pythagorean scale based on 7/4, \"Armodue\""},"pyth_third":{"frequencies":[261.6255653006,267.90457886781,274.33428876064,280.9183116909,287.66035117148,290.46272611903,297.43383186155,304.57224382623,311.88197767806,319.36714514233,327.03195662575,334.88072358477,342.9178609508,351.14788961362,359.57543896435,363.07840893547,371.79228894479,380.71530478279,389.85247209758,399.20893142792,408.78994578219,418.60090448096,428.6473261885,438.93486201703,449.46929870544,453.84801015616,464.74036282794,475.89413097849,487.31559012197,499.0111642849,510.98743222773,523.2511306012],"description":"Cycle of 5/4 thirds"}} + + + diff --git a/src/strudel/xen/xen.mjs b/src/strudel/xen/xen.mjs new file mode 100644 index 0000000..cc96f41 --- /dev/null +++ b/src/strudel/xen/xen.mjs @@ -0,0 +1,64 @@ +/* +xen.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { register, _mod, parseNumeral } from '@strudel/core'; + +export function edo(name) { + if (!/^[1-9]+[0-9]*edo$/.test(name)) { + throw new Error('not an edo scale: "' + name + '"'); + } + const [_, divisions] = name.match(/^([1-9]+[0-9]*)edo$/); + return Array.from({ length: divisions }, (_, i) => Math.pow(2, i / divisions)); +} + +const presets = { + '12ji': [1 / 1, 16 / 15, 9 / 8, 6 / 5, 5 / 4, 4 / 3, 45 / 32, 3 / 2, 8 / 5, 5 / 3, 16 / 9, 15 / 8], +}; + +function withBase(freq, scale) { + return scale.map((r) => r * freq); +} + +const defaultBase = 220; + +function getXenScale(scale, indices) { + if (typeof scale === 'string') { + if (/^[1-9]+[0-9]*edo$/.test(scale)) { + scale = edo(scale); + } else if (presets[scale]) { + scale = presets[scale]; + } else { + throw new Error('unknown scale name: "' + scale + '"'); + } + } + scale = withBase(defaultBase, scale); + if (!indices) { + return scale; + } + return scale.filter((_, i) => indices.includes(i)); +} + +function xenOffset(xenScale, offset, index = 0) { + const i = _mod(index + offset, xenScale.length); + const oct = Math.floor(offset / xenScale.length); + return xenScale[i] * Math.pow(2, oct); +} + +// scaleNameOrRatios: string || number[], steps?: number +export const xen = register('xen', function (scaleNameOrRatios, pat) { + return pat.withHap((hap) => { + const scale = getXenScale(scaleNameOrRatios); + const frequency = xenOffset(scale, parseNumeral(hap.value)); + return hap.withValue(() => frequency); + }); +}); + +export const tuning = register('tuning', function (ratios, pat) { + return pat.withHap((hap) => { + const frequency = xenOffset(ratios, parseNumeral(hap.value)); + return hap.withValue(() => frequency); + }); +});