Music
Music copied to clipboard
Structures for the creation, analysis, and performance of music in Swift
Music
Structures for the creation, analysis, and performance of music in Swift. Check out the documentation.
Overview
Music is a package for anyone who wants to create, analyze, and perform music in pure Swift.
Usage
🎶 Pitch
The Pitch module provides types for structuring and transforming the frequency domain.
Basic Types
let a440: Frequency = 440 // Hz
let middleC: Pitch = 60 // MIDI note number
let e = middleC + 4 // e above middle c
let microtone = e - 0.25 // eighth-tone below the e above middle c
let anyE = Pitch.Class(e) // pitch class 4
let anyGSharp = anyE.inverse // pitch class 8
Set Operations
let set: Pitch.Class.Collection = [8,0,4,6]
set.normalForm // => [4,6,8,0]
set.primeForm // => [0,2,4,8]
Row Transformations
let pcs: Pitch.Class.Collection = [0,11,3,4,8,7,9,5,6,1,2,10]
pcs.retrograde // => [10,2,1,6,5,9,7,8,4,3,11,0]
pcs.inversion // => [0,1,9,8,4,5,3,7,6,11,10,2]
Diatonic Intervals
let majorThird: DiatonicInterval = .M3
let minorSixth = majorThird.inverse
let AAA3 = DiatonicInterval(.triple, .augmented, .third)
let noSuchThing = DiatonicInterval(.major, .fifth) ❌ will not compile!
♬ Duration
The Duration module provides types for structuring and transforming the time domain.
Basic Types
let crotchet = Duration(1,4)
let waltz = Meter(3,4)
let stayinAlive = Tempo(100, subdivision: 4)
🎚️ Dynamics
The Dynamic module provides ways to describe musical loudness in a highly subjective way.
let loud: Dynamic = .ff
let quiet: Dynamic = .p
let interp = Dynamic.Interpolation(from: .p, to: .ff)
🥁 Articulations
The Articulation type provides an interface to describe the way in which a given musical entity is performed.
let short: Articulation = .staccato
let sweet: Articulation = .tenuto
let hard: Articulation = .marcato
let hereIAm: Articulation = .accent
💾 MusicModel
The Model brings all of elements together from the modules contained in this package.
let builder = Model.Builder()
let performer = Performer(name: "Pat")
let instrument = Instrument(name: "Euphonium")
let voiceID = builder.createVoice(performer: performer, instrument: instrument)
let pitch: Pitch = 60
let articulation: Articulation = .tenuto
let dynamic: Dynamic = .fff
let note = Rhythm<Event>(1/>1, [event([pitch, dynamic, articulation])])
let rhythmID = builder.createRhythm(note, voiceID: voiceID, offset: .zero)
let model = builder.build()
Requirements
In order to use the Music package, you'll need a few things:
- Swift 5.x Toolchain (Xcode 10.2–11, or here)
- Swift Package Manager
Installation
In order to use the Music modules in your own projects, add it to the dependencies section of your Package.swift file:
let package = Package(
name: ...,
products: [ ... ],
dependencies: [
...,
.package(url: "https://github.com/dn-m/Music", from: "0.17.1")
],
targets: [ ... ]
)
Development
To contribute to the Music package, clone the git repository:
git clone https://github.com/dn-m/Music && cd Music
If you use the Xcode IDE on macOS, you can use SwiftPM to generate an .xcodeproj file:
swift package generate-xcodeproj
Inspiration
Here are some libraries in other languages that have been influential to the design of the Music package: