Structures for the creation, analysis, and performance of music in Swift. Check out the documentation.
Music is a package for anyone who wants to create, analyze, and perform music in pure Swift.
Pitch module provides types for structuring and transforming the frequency domain.
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
let set: Pitch.Class.Collection = [8,0,4,6] set.normalForm // => [4,6,8,0] set.primeForm // => [0,2,4,8]
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]
let majorThird: DiatonicInterval = .M3 let minorSixth = majorThird.inverse let AAA3 = DiatonicInterval(.triple, .augmented, .third) let noSuchThing = DiatonicInterval(.major, .fifth) ❌ will not compile!
Duration module provides types for structuring and transforming the time domain.
let crotchet = Duration(1,4) let waltz = Meter(3,4) let stayinAlive = Tempo(100, subdivision: 4)
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)
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
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()
In order to use the
Music package, you'll need a few things:
In order to use the
Music modules in your own projects, add it to the
dependencies section of your
let package = Package( name: ..., products: [ ... ], dependencies: [ ..., .package(url: "https://github.com/dn-m/Music", from: "0.17.1") ], targets: [ ... ] )
To contribute to the
Music package, clone the
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
swift package generate-xcodeproj
Here are some libraries in other languages that have been influential to the design of the