Pitch
is the basic unit of MusicKit
.
- A
Pitch
can be created with a MIDI number, or with a chroma and octave number.
let A4 = Pitch(midi: 69)
print(A4.noteName) // A4
print(A4.frequency) // 440.0
let DSharp2 = Pitch(chroma: .Ds, octave: 2)
let C5 = Chroma.C*5
- Changing the value of MusicKit's concert A changes the computed frequency of all pitches.
MusicKit.concertA = 444
print(A4.frequency) // 444.0
MusicKit.concertA = 440
- A
Pitch
has a Chroma
if it has an integral MIDI number.
print(A4.chroma) // Optional(A)
let AHalfSharp = Pitch(midi: 69.5)
print(AHalfSharp.chroma) // nil
- A
Chroma
and an octave number can be used to create a Pitch
.
let D5 = Pitch(chroma: .D, octave: 5)
print(D5) // D5
- A
Chroma
can be created with an index or using one of the provided constants.
let C = Chroma.C
print(C) // C
let CSharp = Chroma.Cs
print(CSharp) // C♯
let D = C + 2
print(D) // D
- A
PitchSet
is a collection of unique Pitch
instances ordered by frequency.
var CMajor = PitchSet(pitches: Chroma.C*2, Chroma.E*2, Chroma.G*2)
print(CMajor) // [C2, E2, G2]
let pitches = [Chroma.Fs*2, Chroma.As*2, Chroma.Cs*3]
var FSharpMajor = PitchSet(pitches)
print(FSharpMajor) // [F♯2, B♭2, C♯3]
PitchSet
supports many operations.
var petrushka = CMajor + FSharpMajor
print(petrushka) // [C2, E2, F♯2, G2, B♭2, C♯3]
print(CMajor == FSharpMajor) // false
print(petrushka.gamut()) // [F♯, G, B♭, C, E, C♯]
petrushka.remove(Pitch(chroma: Chroma.G, octave: 2))
print(petrushka) // [C2, E2, F♯2, B♭2, C♯3]
let F = Chroma.F
print(CMajor / F) // [F1, C2, E2, G2]
- A
Harmonizer
is a function with the signature (Pitch -> PitchSet)
.
Scale
and Chord
contain common scale and chord harmonizers.
Major
, Minor
, and Harmony
can be used to create functional harmony.
Scale
contains common scale harmonizers.
let major = Scale.Major
print(major(A4)) // [A4, B4, C♯5, D5, E5, F♯5, G♯5]
- The
Harmony
enum provides a way to create custom harmonizers from an array of semitone intervals.
let equidistantPentatonic = Harmony.create([2.4, 2.4, 2.4, 2.4, 2.4])
Chord
contains common chord harmonizers.
let minor = Chord.Minor
print(minor(A4)) // [A4, C5, E5]
Chord
also provides a function to create a chord based on a Harmonizer
(typically a scale).
let chord = Chord.create(major, indices: [0, 2, 4, 6])
let ch = chord(Pitch(midi: 69))
print(ch) // [A4, C♯5, E5, G♯5]
Chord.name
can be used to derive a chord name from a pitch set
let pitchSet: PitchSet = [Chroma.B*0, Chroma.Cs*2, Chroma.F*3, Chroma.G*4]
print(Chord.name(pitchSet)!) // G7♭5/B
let descriptor = Chord.descriptor(pitchSet)
print(descriptor!) // root: G, quality: dominant seventh flat five, bass: B
Major
and Minor
contain harmonizers for creating diatonic functional harmony.
let neapolitan = Major.bII
print(neapolitan(Chroma.C*5)) // [C♯5, E♯5, G♯5]
let G4 = Chroma.G*4
let plagalCadence = [Major.IV, Major.I] * G4
print(plagalCadence) // [[C5, E5, G5], [G4, B4, D5]]
Harmony
provides a way to create custom functional harmonizers.
let V7ofV = HarmonicFunction.create(Scale.Major, degree: 5, chord: Major.V7)
print(V7ofV(C5)) // [D6, F♯6, A6, C7]