``````# Harmonex

![logo](assets/logo.png)

[<img alt="Travis CI build status" src="https://secure.travis-ci.org/njonsson/harmonex.svg?branch=master" />][Travis-CI-build-status]
[<img alt="HexFaktor dependencies status" src="https://beta.hexfaktor.org/badge/all/github/njonsson/harmonex.svg" />][HexFaktor-deps-status]
[<img alt="Coveralls test coverage status" src="https://coveralls.io/repos/njonsson/harmonex/badge.svg?branch=master" />][Coveralls-test-coverage-status]
[<img alt="Hex release" src="https://img.shields.io/hexpm/v/harmonex.svg" />][Hex-release]

This is a collection of tools for music theory called _Harmonex_ (pronounced
“harmonics”).

**See what’s changed lately by reading [the project history][project-history].**

## Usage

What can you do with Harmonex? Its functions can answer textbook music theory
questions such as:

* [x] **Are C♯ and D♭ enharmonically equivalent pitches?**
* [x] **What are the enharmonic equivalents of F𝄪?**
`Harmonex.Pitch.enharmonics(:f_double_sharp) == [:g_natural, :a_double_flat]`
* [x] **How far apart, in semitones, are the pitches A♭ and D♯?**
* [x] **What is the interval between the pitches F♮ and B𝄫?**
`Harmonex.Pitch.interval(:f, :b_double_flat) == %Harmonex.Interval{quality:
:diminished, size: 4}`
`Harmonex.Interval.between_pitches(:f, :b_double_flat) ==
%Harmonex.Interval{quality: :diminished, size: 4}`
* [ ] **What is the key signature of G harmonic minor?**
_Answer: two flats, one sharp — B♭, E♭, and F♯._
* [ ] **What keys and modes have the signature of three sharps?**
_Answer: A major/Ionian, B Dorian, C♯ Phrygian, D Lydian, E Mixolydian, F♯
minor/Aeolian, and G♯ Locrian._
* [ ] **Does A♮ occur diatonically in the key of E♭ minor?**
* [ ] **What are the pitches of the simplest voicing of a D♭ minor triad in
second inversion?**
* [ ] **What is the name and inversion of the chord described by the pitches C♮,
F♯, and A♮?**
**of the chord described by A♭, C, and F♯?**
**of the chord described by B, D♯, E, and G♯?**
_Answer: E major seventh in second inversion._
* [ ] **What are the jazz chart symbols of the chords just mentioned?**
_Answer: F<sup>O</sup>/A♭, A♭<sup>7(no 5)</sup>, and E<sup>△7</sup>/B._
* [ ] **What is the functional-harmonic symbol of the chord described by the
pitches C♮, F♯, and A♮ in C major?**
**of the chord described by A♭, C, and F♯ in C minor?**
**of the chord described by B, D♯, E, and G♯ in E major?**

Harmonex also will have functions for exploring compositional questions such as:

* [ ] **What is the set of triads and seventh chords, including enharmonic
equivalents of same, that the keys of B Mixolydian and D Lydian have in
common?**
* [ ] **What is the set of seventh chords, including enharmonic equivalents, that
are within one degree of difference (by shifting one note by a half or whole
step) from an F major seventh chord?** **within two degrees?** **three?**
**four?**
* [ ] **What are sets of three-chord changes for modulating from the key of D
minor to F♯ major?** **sets of four-chord changes?** **sets of five-chord
changes?**

## Installation

Install [the Hex package][Hex-release] by adding `:harmonex` to the list of
dependencies in your project’s _mix.exs_ file:

```elixir
# mix.exs

# ...
def deps do
[{:harmonex, "~> 0.4.0"}]
end
# ...
```

## Contributing

To submit a patch to the project:

1. [Fork][fork-project] the official repository.
2. Create your feature branch: `git checkout -b my-new-feature`.
4. Push to the branch: `git push origin my-new-feature`.
5. [Create][compare-project-branches] a new pull request.

After cloning the repository, `mix deps.get` to install dependencies. Then
`mix test` to run the tests. You can also `iex` to get an interactive prompt that
will allow you to experiment. To build this package, `mix hex.build`.

To release a new version:

1. Update [the project history in _History.md_][project-history], and then
commit.
2. Update the version number in [_mix.exs_][mix-dot-exs-file] respecting
[Semantic Versioning][Semantic-Versioning], update
[the “Installation” section](#installation) of
commit.
3. Build and publish [the Hex package][Hex-release] with `mix hex.publish`.
4. Tag with a name like `vMAJOR.MINOR.PATCH` corresponding to the new version,
and then push commits and tags.