UNPKG

twelvetet-fretboard

Version:

A small fretboard utility library for Javascript. It helps you manipulate pitches on a fretboard.

146 lines (118 loc) 4.84 kB
'use strict'; function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var TwelveTet = _interopDefault(require('twelvetet')); var classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /** * @class TwelveTetFretboard * @param {Array} tuning An array of values representing fretboard tuning. * @param {Number} numFrets A positive integer indicating the number of frets. * @param {Number} [tuningFrequency] An optional positive number indicating the tuning frequency. * @example * import Fretboard from 'twelvetet-fretboard' * * const tuning = ['E2', 'A2', 'D3', 'G3', 'B3', 'E4'] // standard guitar tuning * const numFrets = 12 * const fretboard = new Fretboard(tuning, numFrets) * * console.log(fretboard.at(0, 0).toString()) // E4 */ var TwelveTetFretboard = function () { function TwelveTetFretboard(tuning, numFrets) { var tuningFrequency = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 440; classCallCheck(this, TwelveTetFretboard); if (!isNonEmptyArray(tuning)) { throw new TypeError("Missing or invalid argument, 'tuning'. Non-empty array expected."); } if (!isPositiveInteger(numFrets)) { throw new TypeError("Missing or invalid argument, 'numFrets'. Positive integer expected."); } if (!isFrequency(tuningFrequency)) { throw new TypeError("Missing or invalid argument, 'tuningFrequency'. Positive number expected."); } var twelvetet = new TwelveTet(tuningFrequency); var positions = this._positions = []; tuning.slice(0).reverse().forEach(function (value, stringIndex) { for (var fretIndex = 0; fretIndex < numFrets; fretIndex++) { positions.push({ pitch: twelvetet.pitch(value).next(fretIndex), stringIndex: stringIndex, fretIndex: fretIndex }); } }); } /** * Returns the pitch at `(stringIndex, fretIndex)` * @function at * @memberof TwelveTetFretboard * @instance * @param {Number} aStringIndex A zero-based integer indicating the string * @param {Number} aFretIndex A zero-based integer indicating the fret * @returns {external:Pitch} */ TwelveTetFretboard.prototype.at = function at(aStringIndex, aFretIndex) { if (!isNonNegativeInteger(aStringIndex)) { throw new TypeError("Missing or invalid argument, 'aStringIndex'. Non-negative integer expected"); } if (!isNonNegativeInteger(aFretIndex)) { throw new TypeError("Missing or invalid argument, 'aFretIndex'. Non-negative integer expected."); } var position = this._positions.find(function (_ref) { var stringIndex = _ref.stringIndex, fretIndex = _ref.fretIndex; return stringIndex === aStringIndex && fretIndex === aFretIndex; }); return position != null ? position.pitch : null; }; /** * @property {Array.<Position>} positions An array of all the positions on the fretboard * @memberof TwelveTetFretboard * @instance */ createClass(TwelveTetFretboard, [{ key: "positions", get: function get$$1() { return this._positions.map(function (position) { return Object.assign({}, position); }); } }]); return TwelveTetFretboard; }(); function isNonEmptyArray(value) { return (/^\[object Array\]$/.test(Object.prototype.toString.call(value)) && value.length > 0 ); } function isInteger(value) { return typeof value === 'number' && isFinite(value) && Math.floor(value) === value; } function isNonNegativeInteger(value) { return isInteger(value) && value >= 0; } function isPositiveInteger(value) { return isInteger(value) && value > 0; } function isFrequency(value) { return typeof value === 'number' && isFinite(value) && value > 0; } module.exports = TwelveTetFretboard;