UNPKG

5.08 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('twelvetet')) :
3 typeof define === 'function' && define.amd ? define(['twelvetet'], factory) :
4 (global.TwelveTetFretboard = factory(global.TwelveTet));
5}(this, (function (TwelveTet) { 'use strict';
6
7TwelveTet = TwelveTet && TwelveTet.hasOwnProperty('default') ? TwelveTet['default'] : TwelveTet;
8
9var classCallCheck = function (instance, Constructor) {
10 if (!(instance instanceof Constructor)) {
11 throw new TypeError("Cannot call a class as a function");
12 }
13};
14
15var createClass = function () {
16 function defineProperties(target, props) {
17 for (var i = 0; i < props.length; i++) {
18 var descriptor = props[i];
19 descriptor.enumerable = descriptor.enumerable || false;
20 descriptor.configurable = true;
21 if ("value" in descriptor) descriptor.writable = true;
22 Object.defineProperty(target, descriptor.key, descriptor);
23 }
24 }
25
26 return function (Constructor, protoProps, staticProps) {
27 if (protoProps) defineProperties(Constructor.prototype, protoProps);
28 if (staticProps) defineProperties(Constructor, staticProps);
29 return Constructor;
30 };
31}();
32
33/**
34 * @class TwelveTetFretboard
35 * @param {Array} tuning An array of values representing fretboard tuning.
36 * @param {Number} numFrets A positive integer indicating the number of frets.
37 * @param {Number} [tuningFrequency] An optional positive number indicating the tuning frequency.
38 * @example
39 * import Fretboard from 'twelvetet-fretboard'
40 *
41 * const tuning = ['E2', 'A2', 'D3', 'G3', 'B3', 'E4'] // standard guitar tuning
42 * const numFrets = 12
43 * const fretboard = new Fretboard(tuning, numFrets)
44 *
45 * console.log(fretboard.at(0, 0).toString()) // E4
46 */
47
48var TwelveTetFretboard = function () {
49 function TwelveTetFretboard(tuning, numFrets) {
50 var tuningFrequency = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 440;
51 classCallCheck(this, TwelveTetFretboard);
52
53 if (!isNonEmptyArray(tuning)) {
54 throw new TypeError("Missing or invalid argument, 'tuning'. Non-empty array expected.");
55 }
56
57 if (!isPositiveInteger(numFrets)) {
58 throw new TypeError("Missing or invalid argument, 'numFrets'. Positive integer expected.");
59 }
60
61 if (!isFrequency(tuningFrequency)) {
62 throw new TypeError("Missing or invalid argument, 'tuningFrequency'. Positive number expected.");
63 }
64
65 var twelvetet = new TwelveTet(tuningFrequency);
66 var positions = this._positions = [];
67 tuning.slice(0).reverse().forEach(function (value, stringIndex) {
68 for (var fretIndex = 0; fretIndex < numFrets; fretIndex++) {
69 positions.push({
70 pitch: twelvetet.pitch(value).next(fretIndex),
71 stringIndex: stringIndex,
72 fretIndex: fretIndex
73 });
74 }
75 });
76 }
77
78 /**
79 * Returns the pitch at `(stringIndex, fretIndex)`
80 * @function at
81 * @memberof TwelveTetFretboard
82 * @instance
83 * @param {Number} aStringIndex A zero-based integer indicating the string
84 * @param {Number} aFretIndex A zero-based integer indicating the fret
85 * @returns {external:Pitch}
86 */
87
88
89 TwelveTetFretboard.prototype.at = function at(aStringIndex, aFretIndex) {
90 if (!isNonNegativeInteger(aStringIndex)) {
91 throw new TypeError("Missing or invalid argument, 'aStringIndex'. Non-negative integer expected");
92 }
93
94 if (!isNonNegativeInteger(aFretIndex)) {
95 throw new TypeError("Missing or invalid argument, 'aFretIndex'. Non-negative integer expected.");
96 }
97
98 var position = this._positions.find(function (_ref) {
99 var stringIndex = _ref.stringIndex,
100 fretIndex = _ref.fretIndex;
101 return stringIndex === aStringIndex && fretIndex === aFretIndex;
102 });
103
104 return position != null ? position.pitch : null;
105 };
106
107 /**
108 * @property {Array.<Position>} positions An array of all the positions on the fretboard
109 * @memberof TwelveTetFretboard
110 * @instance
111 */
112
113
114 createClass(TwelveTetFretboard, [{
115 key: "positions",
116 get: function get$$1() {
117 return this._positions.map(function (position) {
118 return Object.assign({}, position);
119 });
120 }
121 }]);
122 return TwelveTetFretboard;
123}();
124
125
126function isNonEmptyArray(value) {
127 return (/^\[object Array\]$/.test(Object.prototype.toString.call(value)) && value.length > 0
128 );
129}
130
131function isInteger(value) {
132 return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
133}
134
135function isNonNegativeInteger(value) {
136 return isInteger(value) && value >= 0;
137}
138
139function isPositiveInteger(value) {
140 return isInteger(value) && value > 0;
141}
142
143function isFrequency(value) {
144 return typeof value === 'number' && isFinite(value) && value > 0;
145}
146
147return TwelveTetFretboard;
148
149})));