MusicTheory 
A music theory library with Key, Pitch, Interval, Scale and Chord representations in swift enums.
Requirements
- Swift 4.0+
- iOS 8.0+
- macOS 10.9+
- tvOS 9.0+
- watchOS 2.0+
Install
pod 'MusicTheorySwift'
Usage
MusicTheory adds a bunch of basic enums and structs that you can define pretty much any music related data. Most importants are Pitch, Key, Scale and Chord.
All data types conforms Codable, CustomStringConvertable.
Pitch, and Accident structs are RawPresentable with Int as well as ExpressibleByIntegerLiteral that you can represent them directly with Ints.
Pitch and Key
- All keys can be defined with
Keystruct. - It has a
KeyTypewhere you can set the base key like C, D, A, G, and anAccitentalwhere it can be.natural,.flat,sharpor more specific like.sharps(amount: 3). - You can create
Pitches with aKeyand octave. - Also, you can create
Pitches with MIDI note number.rawValueof a pitch is its MIDI note number. Pitch,Key,Accidentalstructs are equatable,+and-custom operators defined for making calulations easier.- Also, there are other helper functions or properties like frequency of a note.
- You can define them with directly string representations as well.
let dFlat = Key(type: d, accidental: .flat)
let c4 = Pitch(key: Key(type: .c), octave: 4)
let aSharp: Key = "a#" // Key(type: .a, accidental: .sharp)
let gFlat3: Pitch = "gb3" // or "g♭3" or "Gb3" is Pitch(key: (type: .g, accidental: .flat), octave: 3)
Interval
- Intervals are halfsteps between pitches.
- They are
IntegerLiteraland you can make add/subsctract them between themselves, notes or note types. - You can build up a custom interval with its quality, degree and semitone properties.
- You can build scales or chords from intervals.
- Minor, major, perfect, augmented and diminished intervals up to 2 octaves are predefined.
ScaleType and Scale
ScaleTypeenum defines a lot of readymade scales.- Also, you can create a custom scale type by
ScaleType.custom(intervals: [Interval], description: String) Scaledefines a scale with a scale type and root key.- You can generate notes of scale in an octave range.
- Also you can generate
HarmonicFieldof a scale. - Harmonic field is all possible triad, tetrad or extended chords in a scale.
let c = Key(type: .c)
let maj: ScaleType = .major
let cMaj = Scale(type: maj, key: c)
ChordType and Chord
ChordTypeis a struct withChordParts which are building blocks of chords.- You can define any chord existing with
ChordType. - Thirds, fifths, sixths, sevenths and extensions are parts of the
ChordType. - Each of them also structs which conforms
ChordPartprotocol. Chorddefines chords with type and a root key.- You can generate notes of chord in any octave range.
- You can generate inversions of any chord.
let m13 = ChordType(
third: .minor,
seventh: .dominant,
extensions: [
ChordExtensionType(type: .thirteenth)
])
let cm13 = Chord(type: m13, key: Key(type: .c))
- You can generate chord progressions with
ChordProgressionenum. - For any scale, in any harmonic field, for any inversion.
let progression = ChordProgression.i_ii_vi_iv
let cSharpHarmonicMinorTriadsProgression = progression.chords(
for: cSharpHarmonicMinor,
harmonicField: .triad,
inversion: 0)
Tempo and TimeSignature
NoteValue of each beat.NoteValue.Note
Note value defines the note’s duration in a beat. It could be whole note, half note, quarter note, 8th, 16th or 32nd note.Documentation
Unit Tests
You can find unit tests in MusicTheoryTests target.
Press ⌘+U for running tests.
AppStore
This library battle tested in my apps for iOS, macOS, watchOS and tvOS, check them out!
KeyBud (iOS, watchOS, tvOS, macOS)
FretBud (iOS, watchOS, tvOS)
ChordBud (iOS)
ArpBud (iOS)
ScaleBud (iOS, AUv3)
View on GitHub
MusicTheory Reference