## Classes
Array.<string>returns the intervals that define the scale degrees of a given mode
Array.<PitchString>given a pitch string and scale mode, build a pitch class scale from that pitch
Array.<PitchString>given a pitch string and scale mode, build a scale from that pitch
Stringthe interval quality between two pitch strings
Numberthe generic interval size between two pitch strings, disregarding accidentals
Stringthe interval between two pitch strings
booleandoes this pitch sound higher than that pitch?
Object | falseparses an interval string or number and return its properties in an object or return false if the string or number is not valid
object | falseparses a pitch string and return its components in an object or false if the string is not valid
PitchString | functiongiven pitch string plus given interval string equals new pitch string
Optionally, give only one parameter and get back a function with that parameter set as the default.
Numberthe number of semitones between these two pitch strings
Numbersimplify compound intervals to within the range of 1-7. Works for negative intervals as well.
Array.<PitchString>helper function to sort an array of PitchStrings from lowest to highest
Numberthe midi number of this pitch string
object | arrayhelper function to clone a simple object/array made up of primitives. Will not work if the object or array contains non-primitives.
'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G'[A-G] representing a musical lettername
'#' | 'b' | '##' | 'bb''#' for sharp, 'b' for flat. '##'' for double sharp, 'bb' for double flat.
stringMusicLetter + [AccidentalString] + [octave number]. Must match the regular expression: /(A-G)(b{1,2}|#{1,2})?(\d{1,2})?/. Accidental and octave number are optional, but if octave number is not provided, it will default to octave 4.
string[Pitch](#Pitch) | the tonic of this scale. Although all Pitch instances have an octave number, it is not used in the Key methods. |
| modeName | string | a string representing the mode name. If custom mode is provided, defaults to 'custom-scale' |
| mode | Array.<string> | an array of interval strings representing the interval each scale degree is from tonic |
| scale | [Array.<PitchString>](#PitchString) | an array of pitch class strings |
* [Key](#Key)
* [new Key(tonic, mode)](#new_Key_new)
* [.toString()](#Key+toString) ⇒ String
* [.inKey(pitch)](#Key+inKey) ⇒ boolean
* [.accidentalOn(pitch)](#Key+accidentalOn) ⇒ string
* [.pitchAtDegree(degree)](#Key+pitchAtDegree) ⇒ [Pitch](#Pitch)
* [.scaleDegree(pitch)](#Key+scaleDegree) ⇒ number
* [.plusInterval(pitch, intervalSize)](#Key+plusInterval) ⇒ [Pitch](#Pitch)
* [.range(lo, hi)](#Key+range) ⇒ [Array.<Pitch>](#Pitch)
### new Key(tonic, mode)
Creates a new key. Note that most Key methods use pitch classes without reguards
to octave number.
| Param | Type | Description |
| --- | --- | --- |
| tonic | [Pitch](#Pitch) | [PitchString](#PitchString) | the [tonic](@link https://en.wikipedia.org/wiki/Tonic_(music)) of this scale. Octave number may be provided, but do not affect the Key methods. |
| mode | string | Array.<string> | a string representing a mode name (minor, major, dorian) or an array of interval strings representing the interval each scale degree is from tonic |
### key.toString() ⇒ String
**Kind**: instance method of [Key](#Key)
**Returns**: String - the tonic + the modeName ('Bb major')
### key.inKey(pitch) ⇒ boolean
is this pitch a member of this key?
**Kind**: instance method of [Key](#Key)
**Returns**: boolean - is this pitch in the key?
| Param | Type | Description |
| --- | --- | --- |
| pitch | [Pitch](#Pitch) | [PitchString](#PitchString) | a pitch string or Pitch |
**Example**
```js
var a_major = new Key('A3', 'major')
a_major.inKey('C3') => false
a_major.inKey('C#3') => true
```
### key.accidentalOn(pitch) ⇒ string
given a letter and key, returns the accidental that should be on this letter
in this key. This method only works for standard keys like major or dorian which map evenly
to the seven music letters.
**Kind**: instance method of [Key](#Key)
**Returns**: string - the accidental that needs to be added to this letter for it
to be in the key
| Param | Type | Description |
| --- | --- | --- |
| pitch | [Pitch](#Pitch) | [PitchString](#PitchString) | a pitch string or Pitch |
### key.pitchAtDegree(degree) ⇒ [Pitch](#Pitch)
returns the Pitch at the requested scale degree. Although Pitches default to octave
number 4, this should be thought of as a pitch class
**Kind**: instance method of [Key](#Key)
**Returns**: [Pitch](#Pitch) - a pitch class string
| Param | Type | Description |
| --- | --- | --- |
| degree | number | the desired scale degree of this scale (an integer > 0) |
**Example**
```js
var a_major = new Key('A3', 'major')
a_major.scaleDegree(3) => 'C#4'number
returns the scale degree of this pitch or -1 if it is not in the key
**Kind**: instance method of [Key](#Key)
**Returns**: number - the scale degree of this pitch or -1 if not in key
| Param | Type | Description |
| --- | --- | --- |
| pitch | [Pitch](#Pitch) | [PitchString](#PitchString) | a pitch string or Pitch |
**Example**
```js
var a_major = new Key('A3', 'major')
a_major.scaleDegree('C3') => -1
a_major.scaleDegree('C#3') => 3
```
### key.plusInterval(pitch, intervalSize) ⇒ [Pitch](#Pitch)
gets the correct pitch in the key which is the given interval size away
**Kind**: instance method of [Key](#Key)
**Returns**: [Pitch](#Pitch) - the resulting Pitch
| Param | Type | Description |
| --- | --- | --- |
| pitch | [Pitch](#Pitch) | [PitchString](#PitchString) | the starting Pitch or pitch string |
| intervalSize | number | an interval as a positive or negative number. |
**Example**
```js
var a_flat_major = new Key('Ab', 'major')
a_flat_major.plusInterval('C4', 2) => Pitch: Db4
a_flat_major.plusInterval('C4', -2) => Pitch: Bb3
a_flat_major.plusInterval('Eb2', 4) => Pitch: Ab2
a_flat_major.plusInterval('G5', -10) => Pitch: Eb4
```
### key.range(lo, hi) ⇒ [Array.<Pitch>](#Pitch)
Get all the notes in this key between lo and hi (both inclusive)
**Kind**: instance method of [Key](#Key)
**Returns**: [Array.<Pitch>](#Pitch) - an array of Pitches with all the notes of this key
between lo and hi (both inclusive)
**Throws**:
- an Error if lo and hi are not both [inKey](#Key+inKey)
| Param | Type | Description |
| --- | --- | --- |
| lo | [Pitch](#Pitch) | [PitchString](#PitchString) | the starting Pitch or pitch string |
| hi | [Pitch](#Pitch) | [PitchString](#PitchString) | the ending Pitch or pitch string |
## Pitch
**Kind**: global class
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| Pitch.name | [PitchString](#PitchString) | this pitch in scientific pitch notation |
* [Pitch](#Pitch)
* [new Pitch(sciPitch)](#new_Pitch_new)
* [.toString()](#Pitch+toString) ⇒ [PitchString](#PitchString)
* [.valueOf()](#Pitch+valueOf) ⇒ Number
* [.equals(that)](#Pitch+equals) ⇒ Boolean
* [.isEnharmonic(that)](#Pitch+isEnharmonic) ⇒ Boolean
* [.isHigher(that)](#Pitch+isHigher) ⇒ Boolean
* [.sciPitch()](#Pitch+sciPitch) ⇒ [PitchString](#PitchString)
* [.letter()](#Pitch+letter) ⇒ [MusicLetter](#MusicLetter)
* [.accidental()](#Pitch+accidental) ⇒ [AccidentalString](#AccidentalString)
* [.octave()](#Pitch+octave) ⇒ Number
* [.pitchClass()](#Pitch+pitchClass) ⇒ [PitchClassString](#PitchClassString)
* [.numAccidental()](#Pitch+numAccidental) ⇒ Number
* [.midi()](#Pitch+midi) ⇒ Number
* [.semitonesTo(that)](#Pitch+semitonesTo) ⇒ Number
* [.intervalSize(that)](#Pitch+intervalSize) ⇒ Number
* [.simpleIntervalSize(that)](#Pitch+simpleIntervalSize) ⇒ Number
* [.interval(that)](#Pitch+interval) ⇒ String
* [.simpleInterval(that)](#Pitch+simpleInterval) ⇒ String
* [.plusInterval(interval)](#Pitch+plusInterval) ⇒ [Pitch](#Pitch)
### new Pitch(sciPitch)
Creates a new immutable Pitch or if given an existing Pitch, returns it.
**Throws**:
- Will throw an error if string is not a valid pitch
| Param | Type | Description |
| --- | --- | --- |
| sciPitch | [PitchString](#PitchString) | [Pitch](#Pitch) | a pitch string in scientific pitch notation or a Pitch. |
**Example**
```js
var p = new Pitch('Bb3')
p.name => 'Bb3'
// if you forget the 'new' keyword, the constructor will call it for you
var p2 = Pitch('C4')
p2 instanceof Pitch => true
// if given a Pitch as its argument, the same Pitch will be returned
var p3 = Pitch(p2)
p2 === p3 => true
// this can be used to write functions which accept pitch strings or Pitches as a parameter
```
### pitch.toString() ⇒ [PitchString](#PitchString)
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: [PitchString](#PitchString) - string in scientfic pitch notation
### pitch.valueOf() ⇒ Number
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: Number - the midi number of this pitch, so enharmonic notes will be equal
**See**: [pitch.midi()](#Pitch+midi)
### pitch.equals(that) ⇒ Boolean
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: Boolean - is this pitch spelled the same as that pitch?
| Param | Type | Description |
| --- | --- | --- |
| that | [Pitch](#Pitch) | [PitchString](#PitchString) | a Pitch or a pitch string |
### pitch.isEnharmonic(that) ⇒ Boolean
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: Boolean - does this pitch sound identical to that pitch?
| Param | Type | Description |
| --- | --- | --- |
| that | [Pitch](#Pitch) | [PitchString](#PitchString) | a Pitch or a pitch string |
### pitch.isHigher(that) ⇒ Boolean
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: Boolean - does this pitch sound higher than that pitch?
**See**: [isHigher](#isHigher)
| Param | Type | Description |
| --- | --- | --- |
| that | [Pitch](#Pitch) | [PitchString](#PitchString) | a Pitch or a pitch string |
### pitch.sciPitch() ⇒ [PitchString](#PitchString)
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: [PitchString](#PitchString) - in [scientfic pitch notation](https://en.wikipedia.org/wiki/Scientific_pitch_notation)
(same as pitch.name)
### pitch.letter() ⇒ [MusicLetter](#MusicLetter)
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: [MusicLetter](#MusicLetter) - will return 'A', 'B', 'C', 'D', 'E', 'F', or 'G'
### pitch.accidental() ⇒ [AccidentalString](#AccidentalString)
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: [AccidentalString](#AccidentalString) - 'b', 'bb', '#', '##' (double sharp is not 'x'),
or '', the empty string if there is no accidental.
### pitch.octave() ⇒ Number
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: Number - the octave number (C4 is
[middle C](https://en.wikipedia.org/wiki/C_(musical_note)#Middle_C))
### pitch.pitchClass() ⇒ [PitchClassString](#PitchClassString)
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: [PitchClassString](#PitchClassString) - the [pitch class](https://en.wikipedia.org/wiki/Pitch_class),
same as [pitch.sciPitch()](#Pitch+sciPitch) but without octave number.
### pitch.numAccidental() ⇒ Number
returns the number of accidentals on this letter:
positive for sharps, negative for flats.
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: Number - how many half steps from its letter, will be in the range [-2, 2]
**Example**
```js
var p = new Pitch('Abb3')
p.halfSteps() => -2
```
### pitch.midi() ⇒ Number
What is the [midi number](http://newt.phys.unsw.edu.au/jw/notes.html) of this pitch?
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: Number - the midi number for this pitch. C4 is 60.
**Example**
```js
toMidi('C4') => 60
toMidi('B#3') => 60
toMidi('Bb3') => 58
toMidi('A#3') => 58
```
### pitch.semitonesTo(that) ⇒ Number
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: Number - how many half steps are there between these pitches?
| Param | Type | Description |
| --- | --- | --- |
| that | [Pitch](#Pitch) | [PitchString](#PitchString) | a Pitch or a pitch string |
### pitch.intervalSize(that) ⇒ Number
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: Number - the interval size between these pitches
**See**: [intervalSize](#intervalSize)
| Param | Type | Description |
| --- | --- | --- |
| that | [Pitch](#Pitch) | [PitchString](#PitchString) | a Pitch or a pitch string |
### pitch.simpleIntervalSize(that) ⇒ Number
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: Number - the simple interval size between these pitches in range [1,7]
**See**: [simple](#intervalSize.simple)
| Param | Type | Description |
| --- | --- | --- |
| that | [Pitch](#Pitch) | [PitchString](#PitchString) | a Pitch or a pitch string |
### pitch.interval(that) ⇒ String
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: String - the interval between these pitches
**See**: [interval](#interval)
| Param | Type | Description |
| --- | --- | --- |
| that | [Pitch](#Pitch) | [PitchString](#PitchString) | a Pitch or a pitch string |
### pitch.simpleInterval(that) ⇒ String
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: String - the simple interval between these pitches
**See**: [simple](#interval.simple)
| Param | Type | Description |
| --- | --- | --- |
| that | [Pitch](#Pitch) | [PitchString](#PitchString) | a Pitch or a pitch string |
### pitch.plusInterval(interval) ⇒ [Pitch](#Pitch)
**Kind**: instance method of [Pitch](#Pitch)
**Returns**: [Pitch](#Pitch) - the resulting Pitch
**See**: [plusInterval](#plusInterval)
| Param | Type | Description |
| --- | --- | --- |
| interval | String | Number | an interval string or number with or without quality. If interval quality is not provided, accidentals on this Pitch will be ignored. |
**Example**
```js
var pitch_C4 = new Pitch('C4')
plusInterval(pitch_C4, 10) => Pitch: E5
plusInterval(pitch_C4, -10) => Pitch: A2
plusInterval(pitch_C4, 'm10') => Pitch: Eb5
plusInterval(pitch_C4, '-d7') => Pitch: D#3
```
## modeIntervals(modeName) ⇒ Array.<string>
returns the intervals that define the scale degrees of a given mode
**Kind**: global function
**Returns**: Array.<string> - an array of interval strings representing the
interval each scale degree is from tonic, always starting with 'P1' for tonic
| Param | Type | Description |
| --- | --- | --- |
| modeName | 'major' | 'minor' | 'ionian' | 'dorian' | 'phrygian' | 'lydian' | 'mixolydian' | 'aeolian' | 'locrian' | a mode name |
**Example**
```js
modeIntervals('major') => ['P1', 'M2', 'M3', 'P4', 'P5', 'M6', 'M7']
modeIntervals('dorian') => ['P1', 'M2', 'm3', 'P4', 'P5', 'M6', 'm7']
```
## scaleSet(tonic, mode) ⇒ [Array.<PitchString>](#PitchString)
given a pitch string and scale mode, build a pitch class scale from that pitch
**Kind**: global function
**Returns**: [Array.<PitchString>](#PitchString) - an array of pitch class strings (without octave number)
**See**: for a similar function which uses octave numbers, see [scale](#scale)
| Param | Type | Description |
| --- | --- | --- |
| tonic | [PitchString](#PitchString) | the [tonic](@link https://en.wikipedia.org/wiki/Tonic_(music)) of this scale. If octave number is provided, it will be ignored. |
| mode | string | Array.<string> | a string representing a mode name (minor, major, dorian) or an array of interval strings representing the interval each scale degree is from tonic |
**Example**
```js
scale('Eb4', 'major')
=> ['Eb', 'F', 'G', 'Ab', 'Bb', 'C', 'D']
```
## scale(tonic, mode) ⇒ [Array.<PitchString>](#PitchString)
given a pitch string and scale mode, build a scale from that pitch
**Kind**: global function
**Returns**: [Array.<PitchString>](#PitchString) - an array of pitch strings
| Param | Type | Description |
| --- | --- | --- |
| tonic | [PitchString](#PitchString) | the [tonic](@link https://en.wikipedia.org/wiki/Tonic_(music)) of this scale |
| mode | string | Array.<string> | a string representing a mode name (minor, major, dorian) or an array of interval strings representing the interval each scale degree is from tonic |
**Example**
```js
scale('Eb4', 'major')
=> ['Eb4', 'F4', 'G4', 'Ab4', 'Bb4', 'C5', 'D5']
```
## intervalQuality(sciPitch1, sciPitch2) ⇒ String
the interval quality between two pitch strings
**Kind**: global function
**Returns**: String - a character representing the interval between the two pitches:
- 'P' = perfect
- 'm' = minor
- 'M' = major
- 'd' = diminished
- 'A' = augmented
**Throws**:
- an error if either string is not a valid pitch
| Param | Type | Description |
| --- | --- | --- |
| sciPitch1 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
| sciPitch2 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
**Example**
```js
intervalQuality('C4', 'E4') => 'M'
intervalQuality('E4', 'Eb4') => 'm'
intervalQuality('C4', 'F4') => 'P'
intervalQuality('C4', 'F#4') => 'A'
intervalQuality('B3', 'Ab4') => 'd'
```
## intervalSize(sciPitch1, sciPitch2) ⇒ Number
the generic interval size between two pitch strings, disregarding accidentals
**Kind**: global function
**Returns**: Number - the absolute interval size between the two pitches. Always positive, even if
the first argument is higher than the second.
**Throws**:
- an error if string is not a valid pitch
**See**: [simple](#intervalSize.simple) for returning the simple interval size
| Param | Type | Description |
| --- | --- | --- |
| sciPitch1 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
| sciPitch2 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
**Example**
```js
intervalSize('C4', 'E4') => 3
intervalSize('E4', 'C4') => 3
intervalSize('C4', 'E5') => 10
intervalSize('C4', 'Eb5') => 10
intervalSize('C5', 'C5') => 1
```
### intervalSize.simple(sciPitch1, sciPitch2) ⇒ Number
the generic simple interval size (1-7) between two pitch strings, disregarding accidentals
**Kind**: static method of [intervalSize](#intervalSize)
**Returns**: Number - the simple interval size between the two pitches in range [1, 7].
Contrary to standard practice, an octave is considered compound and reduces to 1.
**Throws**:
- an error if string is not a valid pitch
| Param | Type | Description |
| --- | --- | --- |
| sciPitch1 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
| sciPitch2 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
**Example**
```js
intervalSize.simple('C4', 'E4') => 3
intervalSize.simple('C4', 'E5') => 3
intervalSize.simple('C1', 'E9') => 3
```
## interval(sciPitch1, sciPitch2) ⇒ String
the interval between two pitch strings
**Kind**: global function
**Returns**: String - the interval between the two pitches
**Throws**:
- an error if either string is not a valid pitch
**See**: [simple](#interval.simple) for returning the simple interval
| Param | Type | Description |
| --- | --- | --- |
| sciPitch1 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
| sciPitch2 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
**Example**
```js
interval('C4', 'E4') => 'M3'
interval('E4', 'Eb4') => 'm3'
interval('C4', 'F4') => 'P4'
interval('C4', 'F#4') => 'A4'
interval('B3', 'Ab4') => 'd7'
```
### interval.simple(sciPitch1, sciPitch2) ⇒ Number
the simple interval between two pitch strings
**Kind**: static method of [interval](#interval)
**Returns**: Number - the simple interval between the two pitches.
Contrary to standard practice, an octave is considered compound and reduces to 1 as in [simple](#intervalSize.simple)
**Throws**:
- an error if string is not a valid pitch
| Param | Type | Description |
| --- | --- | --- |
| sciPitch1 | String | a pitch in scientific pitch notation. |
| sciPitch2 | String | a pitch in scientific pitch notation. |
**Example**
```js
interval.simple('C4', 'E4') => 'M3'
interval.simple('C4', 'E5') => 'M3'
interval.simple('C1', 'E9') => 'M3'
```
## isHigher(sciPitch1, sciPitch2) ⇒ boolean
does this pitch sound higher than that pitch?
**Kind**: global function
**Returns**: boolean - is sciPitch1 higher than sciPitch2?
**Throws**:
- Will throw an error if string is not a valid pitch
| Param | Type | Description |
| --- | --- | --- |
| sciPitch1 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
| sciPitch2 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
**Example**
```js
isHigher('D4', 'C4') => true
isHigher('C4', 'D4') => false
isHigher('C4', 'B#3') => false // enharmonic, so they actually sound equal
isHigher('B##3', 'C4') => true // B##3 sounds higher than C4
```
## parseInterval(interval) ⇒ Object | false
parses an interval string or number and return its properties in an object or
return false if the string or number is not valid
**Kind**: global function
**Returns**: Object | false - False if invalid interval else an object
with the following properties:
- interval: string
- direction: number -1 or 1
- quality: string of 'm', 'M', 'P', 'd', or 'A' OR null if not given
- size: number, size of the interval, never negative
- simpleSize: number in range [1,7]
- perfectable: boolean (if false, this is an imperfect interval)
- octaves: number of octave changes. Will be >= 0.
- halfsteps: number|undefined if given quality, number of halfsteps this interval translates to
| Param | Type | Description |
| --- | --- | --- |
| interval | String | Number | an interval string with interval quality or a number representing only interval size. Both types of input may be signed ('-P5' or -5) to indicate a descending interval. |
**Example**
```js
parseInterval('-M6') => {interval: '-M6', direction: -1, quality: 'M', size: 6, simpleSize: 6,
perfectable: false, octaves: 0, halfsteps: 9}
parseInterval(12) => {interval: '12', direction: 1, quality: null, size: 12, simpleSize: 5,
perfectable: true, octaves 1}
parseInterval('M5') => false
```
## parsePitch(sciPitch) ⇒ object | false
parses a pitch string and return its components in an object or
false if the string is not valid
**Kind**: global function
**Returns**: object | false - False if invalid pitch string or an object
with the following properties:
- letter: string
- accidental: [AccidentalString](#AccidentalString)
- numAccidental: number of accidentals [-2, 2], positive for sharps, negative for flats
- octave: integer (if not provided, defaults to 4)
- sciPitch: [PitchString](#PitchString)
| Param | Type | Description |
| --- | --- | --- |
| sciPitch | [PitchString](#PitchString) | a pitch in scientific pitch notation |
**Example**
```js
parsePitch('Bb3') => {letter: 'B', accidental: 'b', numAccidental: -1, octave: 3, sciPitch:'Bb3'}
parsePitch('Xb4') => false
```
## plusInterval(sciPitch, interval) ⇒ [PitchString](#PitchString) | function
given pitch string plus given interval string equals new pitch string
Optionally, give only one parameter and get back a function with that parameter
set as the default.
**Kind**: global function
**Returns**: [PitchString](#PitchString) | function - the resulting pitch string, or if one argument is null, returns
a function with the provided argument set as a default.
**Throws**:
- an error if pitch string or interval string is not valid
| Param | Type | Description |
| --- | --- | --- |
| sciPitch | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
| interval | String | Number | an interval string or number with or without quality. If quality is not provided, accidentals on given pitch will be ignored. |
**Example**
```js
plusInterval('C4', 10) => 'E5'
plusInterval('C4', -10) => 'A2'
plusInterval('C4', 'm10') => 'Eb5'
plusInterval('C4', '-d7') => 'D#3'
var majorscale = ['P1', 'M2', 'M3', 'P4', 'P5', 'M6', 'M7', 'P8']
majorscale.map(plusInterval('Eb4', null))
=> ['Eb4', 'F4', 'G4', 'Ab4', 'Bb4', 'C5', 'D5', 'Eb5']
majorscale.map(plusInterval('Eb4', null)).map(plusInterval(null, '-m9'))
=> ['D3', 'E3', 'F#3', 'G3', 'A3', 'B3', 'C#4', 'D4']
```
## semitonesBetween(sciPitch1, sciPitch2) ⇒ Number
the number of semitones between these two pitch strings
**Kind**: global function
**Returns**: Number - the semitones between these two pitch strings.
**Throws**:
- Will throw an error if string is not a valid pitch
| Param | Type | Description |
| --- | --- | --- |
| sciPitch1 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
| sciPitch2 | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
**Example**
```js
semitonesBetween('C4', 'Db4') => 1
semitonesBetween('C4', 'B#3') => 0
semitonesBetween('C4', 'C5') => 12
```
## simplifyIntervalSize(intervalSize) ⇒ Number
simplify compound intervals to within the range of 1-7. Works for
negative intervals as well.
**Kind**: global function
**Returns**: Number - the simplified interval
**Throws**:
- Will throw an error if intervalSize is 0
| Param | Type | Description |
| --- | --- | --- |
| intervalSize | Number | any valid interval number |
**Example**
```js
simplifyIntervalSize(10) => 3
simplifyIntervalSize(-12) => -5
simplifyIntervalSize(-4) => -4
simplifyIntervalSize(8) => 1
```
## sortPitches(pitches) ⇒ [Array.<PitchString>](#PitchString)
helper function to sort an array of PitchStrings from lowest to highest
**Kind**: global function
**Returns**: [Array.<PitchString>](#PitchString) - a new clone of the provided pitch string
array sorted from low pitch to high pitch
| Param | Type | Description |
| --- | --- | --- |
| pitches | [Array.<PitchString>](#PitchString) | an array of pitch strings |
## toMidi(sciPitch) ⇒ Number
the [midi number](http://newt.phys.unsw.edu.au/jw/notes.html) of this pitch string
**Kind**: global function
**Returns**: Number - the midi number for this pitch. C4 is 60.
[Enharmonic](https://en.wikipedia.org/wiki/Enharmonic) notes will return the same
midi number.
**Throws**:
- Will throw an error if string is not a valid pitch
| Param | Type | Description |
| --- | --- | --- |
| sciPitch | [PitchString](#PitchString) | a pitch in scientific pitch notation. |
**Example**
```js
toMidi('C4') => 60
toMidi('B#3') => 60
toMidi('Bb3') => 58
toMidi('A#3') => 58
```
## clone(obj) ⇒ object | array
helper function to clone a simple object/array made up of primitives.
Will not work if the object or array contains non-primitives.
**Kind**: global function
**Returns**: object | array - a new clone of the provided object or array
| Param | Type | Description |
| --- | --- | --- |
| obj | object | array | an object array made up only of primitives |
## MusicLetter : 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G'
[A-G] representing a musical lettername
**Kind**: global typedef
## AccidentalString : '#' | 'b' | '##' | 'bb'
'#' for sharp, 'b' for flat.
'##'' for double sharp, 'bb' for double flat.
**Kind**: global typedef
## PitchString : string
[MusicLetter](#MusicLetter) + [[AccidentalString](#AccidentalString)] +
[octave number]. Must match the regular expression:
/(A-G)(b{1,2}|#{1,2})?(\d{1,2})?/. Accidental and octave number are optional,
but if octave number is not provided, it will default to octave 4.
**Kind**: global typedef
**Example**
```js
'C4' // middle C on a piano, the fourth octave
'B3' // the B one note below C4 on the piano (octave numbers change on C)
'Eb3' // Eb in octave 3
'F#2' // F# in octave 2
'F##7' // F double sharp in octave 7
'Dbb5' // D double flat in octave 5
```
## PitchClassString : string
[MusicLetter](#MusicLetter) + [[AccidentalString](#AccidentalString)].
**Kind**: global typedef
**Link**: same as [PitchString](#PitchString) but without octave number.
**Example**
```js
'C'
'Eb'
'F#'
'F##'
'Dbb'
```