@tremolo-ui/functions 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/cjs/components/NumberInput/type.js +18 -60
  2. package/dist/cjs/components/NumberInput/type.js.map +1 -1
  3. package/dist/cjs/components/NumberInput/types/components/NumberInput/type.d.ts +1 -2
  4. package/dist/cjs/components/NumberInput/types/components/NumberInput/type.d.ts.map +1 -1
  5. package/dist/cjs/components/NumberInput/types/index.d.ts +5 -0
  6. package/dist/cjs/components/NumberInput/types/index.d.ts.map +1 -1
  7. package/dist/cjs/components/NumberInput/types/math.d.ts +5 -0
  8. package/dist/cjs/components/NumberInput/types/math.d.ts.map +1 -1
  9. package/dist/cjs/components/NumberInput/types/midi.d.ts +16 -3
  10. package/dist/cjs/components/NumberInput/types/midi.d.ts.map +1 -1
  11. package/dist/cjs/components/Slider/types/components/NumberInput/type.d.ts +1 -2
  12. package/dist/cjs/components/Slider/types/components/NumberInput/type.d.ts.map +1 -1
  13. package/dist/cjs/components/Slider/types/index.d.ts +5 -0
  14. package/dist/cjs/components/Slider/types/index.d.ts.map +1 -1
  15. package/dist/cjs/components/Slider/types/math.d.ts +5 -0
  16. package/dist/cjs/components/Slider/types/math.d.ts.map +1 -1
  17. package/dist/cjs/components/Slider/types/midi.d.ts +16 -3
  18. package/dist/cjs/components/Slider/types/midi.d.ts.map +1 -1
  19. package/dist/cjs/index.js +29 -4
  20. package/dist/cjs/index.js.map +1 -1
  21. package/dist/cjs/types/components/NumberInput/type.d.ts +1 -2
  22. package/dist/cjs/types/components/NumberInput/type.d.ts.map +1 -1
  23. package/dist/cjs/types/index.d.ts +5 -0
  24. package/dist/cjs/types/index.d.ts.map +1 -1
  25. package/dist/cjs/types/math.d.ts +5 -0
  26. package/dist/cjs/types/math.d.ts.map +1 -1
  27. package/dist/cjs/types/midi.d.ts +16 -3
  28. package/dist/cjs/types/midi.d.ts.map +1 -1
  29. package/dist/esm/components/NumberInput/type.js +19 -60
  30. package/dist/esm/components/NumberInput/type.js.map +1 -1
  31. package/dist/esm/components/NumberInput/types/components/NumberInput/type.d.ts +1 -2
  32. package/dist/esm/components/NumberInput/types/components/NumberInput/type.d.ts.map +1 -1
  33. package/dist/esm/components/NumberInput/types/index.d.ts +5 -0
  34. package/dist/esm/components/NumberInput/types/index.d.ts.map +1 -1
  35. package/dist/esm/components/NumberInput/types/math.d.ts +5 -0
  36. package/dist/esm/components/NumberInput/types/math.d.ts.map +1 -1
  37. package/dist/esm/components/NumberInput/types/midi.d.ts +16 -3
  38. package/dist/esm/components/NumberInput/types/midi.d.ts.map +1 -1
  39. package/dist/esm/components/Slider/types/components/NumberInput/type.d.ts +1 -2
  40. package/dist/esm/components/Slider/types/components/NumberInput/type.d.ts.map +1 -1
  41. package/dist/esm/components/Slider/types/index.d.ts +5 -0
  42. package/dist/esm/components/Slider/types/index.d.ts.map +1 -1
  43. package/dist/esm/components/Slider/types/math.d.ts +5 -0
  44. package/dist/esm/components/Slider/types/math.d.ts.map +1 -1
  45. package/dist/esm/components/Slider/types/midi.d.ts +16 -3
  46. package/dist/esm/components/Slider/types/midi.d.ts.map +1 -1
  47. package/dist/esm/components/tsconfig.tsbuildinfo +1 -1
  48. package/dist/esm/index.js +28 -5
  49. package/dist/esm/index.js.map +1 -1
  50. package/dist/esm/types/components/NumberInput/type.d.ts +1 -2
  51. package/dist/esm/types/components/NumberInput/type.d.ts.map +1 -1
  52. package/dist/esm/types/index.d.ts +5 -0
  53. package/dist/esm/types/index.d.ts.map +1 -1
  54. package/dist/esm/types/math.d.ts +5 -0
  55. package/dist/esm/types/math.d.ts.map +1 -1
  56. package/dist/esm/types/midi.d.ts +16 -3
  57. package/dist/esm/types/midi.d.ts.map +1 -1
  58. package/package.json +1 -1
  59. package/src/components/NumberInput/type.ts +22 -46
  60. package/src/index.ts +5 -0
  61. package/src/math.ts +14 -0
  62. package/src/midi.ts +21 -4
@@ -1 +1 @@
1
- {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../../../src/components/NumberInput/type.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;AAEtC,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxE;AAED,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EACtB,KAAK,CAAC,EAAE,MAAM,EACd,YAAY,SAAI;;;;EA6CjB;AAID,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,UAShE"}
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../../../src/components/NumberInput/type.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;AAEtC,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxE;AAED,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EACtB,KAAK,CAAC,EAAE,MAAM,GACb;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb,CAkCA"}
@@ -1,4 +1,9 @@
1
1
  /**
2
+ * This is how you import top-level functions.
3
+ *
4
+ * ```ts
5
+ * import { anyFunc } from '@tremolo-ui/functions'
6
+ * ```
2
7
  * @module top-level
3
8
  */
4
9
  export * from './math';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,QAAQ,CAAA;AACtB,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,QAAQ,CAAA;AACtB,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA"}
@@ -48,6 +48,11 @@ export declare function radian(degree: number): number;
48
48
  * @category Math
49
49
  */
50
50
  export declare function degree(radian: number): number;
51
+ /**
52
+ *
53
+ * @category Math
54
+ */
55
+ export declare function mapValue(value: number, inMin: number, inMax: number, outMin: number, outMax: number): number;
51
56
  /**
52
57
  *
53
58
  * @category Math
@@ -1 +1 @@
1
- {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../../src/math.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,UAE5D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,SAAI,UAKT;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,SAAI,UAQT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,UAKZ;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAOpD;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,UAEzD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAKlE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,UAEpC;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,UAEpC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,UAElC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,UAEpC"}
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../../src/math.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,UAE5D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,SAAI,UAKT;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,SAAI,UAQT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,UAKZ;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAOpD;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,UAEzD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAKlE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,UAEpC;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,UAEpC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,UAGf;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,UAElC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,UAEpC"}
@@ -23,22 +23,35 @@ export declare function parseNoteName(noteName: string): {
23
23
  octave: number;
24
24
  };
25
25
  /**
26
- *
26
+ * Convert noteName to noteNumber
27
27
  * @category MIDI
28
28
  */
29
29
  export declare function noteNumber(noteName: string): number;
30
30
  /**
31
- *
31
+ * Convert noteNumber to noteName
32
32
  * @category MIDI
33
33
  */
34
34
  export declare function noteName(noteNumber: number): string;
35
35
  /**
36
+ * @param note noteNumber: 0 ~ 127 or noteName e.g. 'C3'
36
37
  * @category MIDI
37
38
  */
38
39
  export declare function isWhiteKey(note: number | string): boolean;
40
+ /**
41
+ * @param note noteNumber: 0 ~ 127 or noteName e.g. 'C3'
42
+ * @category MIDI
43
+ */
44
+ export declare function isBlackKey(note: number | string): boolean;
39
45
  /**
40
46
  * @category MIDI
41
47
  */
42
- export declare function isBlackKey(noteNumber: number | string): boolean;
43
48
  export declare const scaleNames: string[];
49
+ /**
50
+ * @param note noteNumber: 0 ~ 127 or noteName e.g. 'C3'
51
+ * @param detune [cent]
52
+ * @param a4 A4 frequency [Hz]
53
+ * @returns frequency [Hz]
54
+ * @category MIDI
55
+ */
56
+ export declare function noteToFrequency(note: number | string, detune?: number, a4?: number): number;
44
57
  //# sourceMappingURL=midi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"midi.d.ts","sourceRoot":"","sources":["../../../src/midi.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,SAAS,8CAA+C,CAAA;AAErE;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjD;;GAEG;AACH,eAAO,MAAM,SAAS,4EAaZ,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjD;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM;YAKJ,QAAQ;gBACpB,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE;;EAGzD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,UAK1C;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,UAI1C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,WAW/C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,WAErD;AAED,eAAO,MAAM,UAAU,UAAoD,CAAA"}
1
+ {"version":3,"file":"midi.d.ts","sourceRoot":"","sources":["../../../src/midi.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,SAAS,8CAA+C,CAAA;AAErE;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjD;;GAEG;AACH,eAAO,MAAM,SAAS,4EAaZ,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjD;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM;YAKJ,QAAQ;gBACpB,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE;;EAGzD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,UAK1C;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,UAI1C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,WAW/C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,WAE/C;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,UAAoD,CAAA;AAE3E;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,SAAI,EAAE,EAAE,SAAM,UAG1E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tremolo-ui/functions",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "description": "functions used in @tremolo-ui/react",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -2,8 +2,6 @@
2
2
  * @module NumberInput
3
3
  */
4
4
 
5
- import { toFixed } from '../../math'
6
-
7
5
  /**
8
6
  * [unit, scale][]
9
7
  * @example
@@ -12,8 +10,6 @@ import { toFixed } from '../../math'
12
10
  export type Units = [string, number][]
13
11
 
14
12
  export function selectUnit(units: Units, value: number): [string, number] {
15
- if (typeof units == 'string') return [units, 1]
16
-
17
13
  let i = 0
18
14
  for (; i < units.length; i++) {
19
15
  if (Math.abs(units[i][1]) > Math.abs(value)) break
@@ -25,45 +21,38 @@ export function parseValue(
25
21
  inputString: string,
26
22
  units?: string | Units,
27
23
  digit?: number,
28
- defaultValue = 0,
29
- ) {
30
- let str = inputString.trim()
31
- if (str == '') str = String(defaultValue)
32
- if (!units) {
33
- return {
34
- rawValue: Number(str) || defaultValue,
35
- formatValue: str,
36
- unit: '',
37
- }
38
- } else if (typeof units == 'string') {
24
+ ): {
25
+ rawValue: number
26
+ formatValue: string
27
+ unit: string
28
+ } {
29
+ const str = inputString.trim()
30
+ if (!units || typeof units == 'string') {
31
+ const m = str.match(/-?\d+(\.\d+)?/)
32
+ let v = Number(m?.[0] ?? '0')
33
+ v = isNaN(v) ? 0 : v
39
34
  return {
40
- rawValue: Number(str) || defaultValue,
41
- formatValue: `${str}${units}`,
42
- unit: units,
35
+ rawValue: v,
36
+ formatValue: (digit != undefined ? v.toFixed(digit) : v) + (units ?? ''),
37
+ unit: units ?? '',
43
38
  }
44
39
  }
45
40
 
46
41
  const unitList = units.map(([u, _s]) => u)
47
42
  const scaleList = units.map(([_u, s]) => s)
48
- let rawValue = defaultValue
49
- let formatValue = `${scaleList[0]}`
43
+ let rawValue = 0
50
44
  let unit = unitList[0]
45
+ let formatValue =
46
+ (digit != undefined ? rawValue.toFixed(digit) : rawValue) + unit
51
47
  const m = str.match(/^(-?\d+(\.\d+)?)\s*(\w*)$/)
52
48
  if (m) {
53
49
  rawValue = Number(m[1]) || 0
54
- const inputUnit = m[3]
55
- if (inputUnit != '' && unitList.indexOf(inputUnit) != -1) {
56
- rawValue *= scaleList[unitList.indexOf(inputUnit)]
57
- const s = selectUnit(units, rawValue)
58
- const v = rawValue / s[1]
59
- formatValue = `${digit != undefined ? toFixed(v, digit) : v}${s[0]}`
60
- unit = s[0]
61
- } else {
62
- const [u, scale] = selectUnit(units, rawValue)
63
- const v = rawValue / scale
64
- formatValue = `${digit != undefined ? toFixed(v, digit) : v}${u}`
65
- unit = u
66
- }
50
+ const uIndex = unitList.indexOf(m[3])
51
+ rawValue *= uIndex != -1 ? scaleList[uIndex] : 1
52
+ const [u, scale] = selectUnit(units, rawValue)
53
+ const v = rawValue / scale
54
+ formatValue = (digit != undefined ? v.toFixed(digit) : v) + u
55
+ unit = u
67
56
  }
68
57
  return {
69
58
  rawValue: rawValue,
@@ -71,16 +60,3 @@ export function parseValue(
71
60
  unit: unit,
72
61
  }
73
62
  }
74
-
75
- // TODO: toFixed 以外のフォーマット手法
76
- // e.g. 小数点第n位
77
- export function formatValue(value: number, units?: string | Units) {
78
- if (!units) {
79
- return `${value}`
80
- } else if (typeof units == 'string') {
81
- return `${value}${units}`
82
- } else {
83
- const [unit, scale] = selectUnit(units, value)
84
- return `${toFixed(value / scale)}${unit}`
85
- }
86
- }
package/src/index.ts CHANGED
@@ -1,4 +1,9 @@
1
1
  /**
2
+ * This is how you import top-level functions.
3
+ *
4
+ * ```ts
5
+ * import { anyFunc } from '@tremolo-ui/functions'
6
+ * ```
2
7
  * @module top-level
3
8
  */
4
9
 
package/src/math.ts CHANGED
@@ -109,6 +109,20 @@ export function degree(radian: number) {
109
109
  return (180 * radian) / Math.PI
110
110
  }
111
111
 
112
+ /**
113
+ *
114
+ * @category Math
115
+ */
116
+ export function mapValue(
117
+ value: number,
118
+ inMin: number,
119
+ inMax: number,
120
+ outMin: number,
121
+ outMax: number,
122
+ ) {
123
+ return ((value - inMin) / (inMax - inMin)) * (outMax - outMin) + outMin
124
+ }
125
+
112
126
  /**
113
127
  *
114
128
  * @category Math
package/src/midi.ts CHANGED
@@ -48,7 +48,7 @@ export function parseNoteName(noteName: string) {
48
48
  }
49
49
 
50
50
  /**
51
- *
51
+ * Convert noteName to noteNumber
52
52
  * @category MIDI
53
53
  */
54
54
  export function noteNumber(noteName: string) {
@@ -59,7 +59,7 @@ export function noteNumber(noteName: string) {
59
59
  }
60
60
 
61
61
  /**
62
- *
62
+ * Convert noteNumber to noteName
63
63
  * @category MIDI
64
64
  */
65
65
  export function noteName(noteNumber: number) {
@@ -69,6 +69,7 @@ export function noteName(noteNumber: number) {
69
69
  }
70
70
 
71
71
  /**
72
+ * @param note noteNumber: 0 ~ 127 or noteName e.g. 'C3'
72
73
  * @category MIDI
73
74
  */
74
75
  export function isWhiteKey(note: number | string) {
@@ -85,10 +86,26 @@ export function isWhiteKey(note: number | string) {
85
86
  }
86
87
 
87
88
  /**
89
+ * @param note noteNumber: 0 ~ 127 or noteName e.g. 'C3'
88
90
  * @category MIDI
89
91
  */
90
- export function isBlackKey(noteNumber: number | string) {
91
- return !isWhiteKey(noteNumber)
92
+ export function isBlackKey(note: number | string) {
93
+ return !isWhiteKey(note)
92
94
  }
93
95
 
96
+ /**
97
+ * @category MIDI
98
+ */
94
99
  export const scaleNames = ['major', 'minor', 'natural minor', 'pentatonic']
100
+
101
+ /**
102
+ * @param note noteNumber: 0 ~ 127 or noteName e.g. 'C3'
103
+ * @param detune [cent]
104
+ * @param a4 A4 frequency [Hz]
105
+ * @returns frequency [Hz]
106
+ * @category MIDI
107
+ */
108
+ export function noteToFrequency(note: number | string, detune = 0, a4 = 440) {
109
+ const n = typeof note == 'string' ? noteNumber(note) : note
110
+ return (a4 / 32) * 2 ** ((n - 9 + detune / 100) / 12)
111
+ }