• Stars
    star
    398
  • Rank 108,325 (Top 3 %)
  • Language
    Swift
  • License
    MIT License
  • Created almost 8 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Universal music theory library for iOS, iPadOS, macOS, tvOS and watchOS in Swift

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

CocoaPods

pod 'MusicTheorySwift'

Swift Package Manager

let package = Package(
  name: ...
  dependencies: [
    .package(url: "https://github.com/cemolcay/MusicTheory.git")
  ],
  targets: ...
)

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 Key struct.
  • It has a KeyType where you can set the base key like C, D, A, G, and an Accidental where it can be .natural, .flat, sharp or more specific like .sharps(amount: 3).
  • You can create Pitches with a Key and octave.
  • Also, you can create Pitches with MIDI note number. rawValue of a pitch is its MIDI note number.
  • Pitch, Key, Accidental structs are equatable, + and - custom operators defined for making calculations 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 IntegerLiteral and you can make add/substract 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

  • ScaleType enum defines a lot of readymade scales.
  • Also, you can create a custom scale type by ScaleType.custom(intervals: [Interval], description: String)
  • Scale defines a scale with a scale type and root key.
  • You can generate notes of scale in an octave range.
  • Also you can generate HarmonicField of 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

  • ChordType is a struct with ChordParts 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 ChordPart protocol.
  • Chord defines 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 ChordProgression enum.
  • 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

  • Tempo is a helper struct to define timings in your music app.
  • TimeSignature is number of beats in per measure and NoteValue of each beat.
  • You can calculate notes duration in any tempo by ther NoteValue.
  • Note value defines the note's duration in a beat. It could be whole note, half note, quarter note, 8th, 16th or 32nd note.

HarmonicFunctions

  • Harmonic functions is a utility for finding related notes or chords in a scale when composing.
  • You can create recommendation engines or chord generators with that.

Playgrounds

  • You can experiment with the library right away in the Xcode Playgrounds!
  • After cloning the project, build it for the Mac target,
  • Go to playground page in the project,
  • Make sure the macOS platform is selected,
  • And make sure the "Build Active Scheme" option is selected in the playground settings.
  • There are some recipes ready in the playground page, you can just run them right away.

Documentation

Full documentation is here

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, M1)
StepBud (iOS, AUv3, M1)
RhythmBud (iOS, AUv3, M1)
ArpBud 2 (iOS, AUv3, M1)
ChordBud 2 (iOS, AUv3, M1)
LoopBud (iOS, AUv3, M1)
Euclid Goes to Party (iOS, AUv3, M1)
SnakeBud (iOS, AUv3, M1)
MelodyBud (iOS, AUv3, M1)
ScaleBud 2 (iOS, AUv3, M1)
ShiftBud (iOS, AUv3, M1)
PolyBud (iOS, AUv3, M1)
PatternBud (iOS, AUv3, M1)
MIDI Motion (iOS, watchOS)
Textquencer (iOS, AUv3, M1)
In Theory (iOS, AUv3, M1)
BrainBud (iOS, AUv3, M1)
Binarhythmic (iOS, AUv3, M1)

More Repositories

1

CategorySliderView

slider view for choosing categories. add any UIView type as category item view. Fully customisable
Objective-C
352
star
2

PullToRefreshCoreText

PullToRefresh extension for all UIScrollView type classes with animated text drawing style
Objective-C
313
star
3

ReorderableGridView-Swift

reorderable grid view solution implemented with swift. its UIScrollView subclass, its not a collection view layout.
Swift
279
star
4

SlidingContainerViewController

An android scrollable tab bar style container view controller
Swift
219
star
5

MaterialCardView

Create material design cards quick and easy
Swift
219
star
6

StrechyParallaxScrollView

uiscrollview with strechy and parallax top view
Objective-C
207
star
7

TransitionManager

Painless custom transitioning. Easy extend, easy setup, just focus on animations.
Swift
205
star
8

BubbleControl-Swift

a bubble control highly inspired from facebook chat heads. written in swift
Swift
178
star
9

ImageFreeCut

A UIView subclass lets you draw a path over an image and crops that part.
Swift
174
star
10

GiFHUD

progress hud for displaying only animated gif images. no labels (for now)
Objective-C
159
star
11

MIDITimeTableView

Customisable and editable time table grid for showing midi or audio related data with a measure.
Swift
120
star
12

DroppyScrollView

Vertical scroll view with abilty to inserting subviews top or any index with stylish dropping animations
Objective-C
118
star
13

KeyboardLayoutEngine

⌨️ The most simple custom keyboard generator for iOS ever!
Swift
103
star
14

ChordDetector

A tiny menu bar app detecting the chords of the songs you are listening on iTunes or Spotify.
Swift
75
star
15

MIDIPianoRollView

Customisable UIScrollView subclass for rendering/editing MIDI notes on a piano roll view.
Swift
74
star
16

GiFHUD-Swift

progress hud for displaying only animated gif images implemented with swift
Swift
69
star
17

Fretboard

Customisable guitar fretboard view for iOS, tvOS and macOS with CoreGraphics
Swift
55
star
18

LiveKnob

Yet another knob for iOS but with IBDesignable and Ableton Live style.
Swift
52
star
19

JSONTableView

Expandable JSON data viewer
Swift
45
star
20

CircleOfFifths

Fully customisable IBDesignable circle of fifths implementation in swift.
Swift
44
star
21

CEMKit-Swift

UIKit & Foundation toolbelt for quick prototyping and rapid development
Swift
40
star
22

SizeClasser

Device specific UITraitCollection helper with split view detection for iOS.
Ruby
35
star
23

MIDIEventKit

MIDI data structures for Swift. Send MIDI events in human language.
Swift
30
star
24

YSTypingAnimation

customisable "is typing" animation view written in swift.
Swift
29
star
25

AUSequencer

(WIP) MIDI Sequencer Audio Unit
Objective-C++
26
star
26

TVOSPicker

A sweet horizontal picker view controller for tvOS.
Swift
25
star
27

PercentCalculator

A menu bar application that calculates parcents.
Swift
24
star
28

MIDISequencerAUv3

A great start point for making AUv3 MIDI sequencer apps.
Objective-C
24
star
29

GlowingView

A UIView extension adds customisable glow effect based on CALayer shadows.
Ruby
23
star
30

LiveFader

@IBDesignable Horizontal or vertical UIControl subclass that can start from bottom or middle of the control.
Swift
22
star
31

BlockTableView-Swift

single line UITableView creation in Swift with power of the closures
Swift
21
star
32

AIBud

An experimental CreateML project for predicting playing musical key and scale in realtime
Swift
19
star
33

ContinuesTouchCollectionView

A collection view subview for handling multiple continues touches on cells.
Swift
17
star
34

MarchingLayer

Randomly fills layer with sprites and move them in any direction and speed you want.
Swift
17
star
35

CirucularLock

fully custumisable lock control with block based callbacks.
Objective-C
16
star
36

DragMenuPicker

A custom picker lets you pick an option from its auto scrolling menu without lifting your finger up.
Swift
14
star
37

TempoStepper

Fully customisable stepper with auto stepping.
Swift
14
star
38

YSTutorialViewController

Create flat design tutorial pages quickly. It can read page data from json file, no coding required for pages ! Fully customisable.
Objective-C
13
star
39

3DTouchHelper

Easy to use continuous 3D touch gesture recognizer.
Swift
12
star
40

IBDesignableArrowView

Create IBDesignable arrow views in your storyboard!
Swift
12
star
41

DeserializableSwiftGenerator

JSONHelper or ObjectMapper deserializable swift class generator
Swift
12
star
42

MusicTheoryCpp

C++ music theory library
C++
11
star
43

RBEditorViewController

RhythmBud's Editor Code
Swift
10
star
44

Flick

A smart swipe gesture with direction, duration, velocity and force properties.
Swift
9
star
45

LaunchpadKit

Swift API for Novation Launchpad
Swift
9
star
46

CenterTextLayer

Universal CATextLayer subclass that centers its text vertically.
Ruby
9
star
47

MothersDiceGame

Random synth patch generator iOS app
Swift
7
star
48

ALKit

Easy to use AutoLayout wrapper around NSLayoutConstraints.
Swift
7
star
49

BezierCurveEditor

UIBezierPath editor view for iOS.
Swift
6
star
50

ColorPalette

A color palette grid view for iOS.
Swift
6
star
51

StringToPath

String extension for returning UIBezierPath of the string in a font of your choice, using Core Text
Ruby
6
star
52

MotionImageView

An image view lets you move its image with gyro
Swift
6
star
53

WatchActivityIndicator

⌚️ Apple Watch WKInterfaceImage and WKInterfaceGroup extension for showing activity indicators on them quickly.
Swift
6
star
54

CEMKit

handy library for no-xibbers
Objective-C
5
star
55

AirDrawerMenuViewController

legendary airbnb drawer menu in swift
Swift
5
star
56

DroppyMenuController

A swift dropping menu controller.
Swift
5
star
57

DroppyExpandingSectionView

Instead of using UITableView or UICollectionView use this for expand/collapse behaviour. Implementation higly mimics UICollectionView. Its more easy because just waits the headers and their expanding items which are any UIView type object
Objective-C
5
star
58

RECButton

An @IBDesignable record (REC) button for iOS
Ruby
4
star
59

StatusBarTranslator

osx status bar app for translating english to french or vice versa. implemented using yandex translation api in swift
Swift
4
star
60

SlotPickerView

Picker view with multiple ranges for iOS
Swift
3
star
61

EmojiKeyboard

EmojiKeyboard provides a complete view controller with EmojiCollectionView, EmojiCollectionViewCell and EmojiCollectionViewHeader in style of Apple Emoji Keyboard.
Swift
3
star
62

OptionButton

IBDesignable option button that have vertical stacked title and option labels for iOS and tvOS.
Ruby
3
star
63

CurlUI

A tiny mac tool for testing your POST/GET requests.
Swift
2
star
64

Shadow

A simple object for adding/removing shadows from your CALayers or UIViews.
Swift
2
star
65

RadyoEksen

osx status bar application for radio eksen 96.2 FM, Istanbul
Swift
2
star
66

DurationProgressBar

UIView based progress bar that shows the duration in seconds
Swift
2
star
67

Blogs

Repo that host my blog posts about iOS and Swift
2
star
68

ImageSequance

Universal image sequance animation library for iOS, tvOS, macOS and watchOS.
Ruby
2
star
69

XYPad

A quick and easy xy-pad control for iOS
Swift
2
star
70

RowyGenerator

an experimental functional UIView generator in swift
Swift
1
star
71

YSCards

under development
Swift
1
star
72

CocosCharacterGenerator

Cocos2d Character Generator Cocoa App
Objective-C
1
star
73

IBDesignableProgressBar

Create flat progress bars directly from storyboard.
Swift
1
star
74

Hoopscore

Free and open source app for keeping score of your basketball practices
Swift
1
star
75

AutoScroller

Display custom "scroll to top" or "scroll to bottom" views in all UIScrollView instances while they are scrolling
Swift
1
star
76

SoundcloudFavoritesDownloader

download your favorites in soundcloud. or listen. or both
JavaScript
1
star
77

cucumber-step-generator

Atom package for generating cucumber step files from feature files
CoffeeScript
1
star
78

dotfiles

zsh, bash, vim and Terminal.app settings
Shell
1
star
79

ColourLoversExtensionGenerator

a status bar app for generating UIColor extension class form colourlovers.com palettes
Objective-C
1
star
80

DictUtils

Adds bunch of extensions and operators that would make working with Dicitonaries easier.
Swift
1
star
81

DSLSwitch

iOS app for controlling Marshall DSL amps
Swift
1
star
82

ProtocolOrientedViewModel

Create universal view's with different layouts for each platform and share the view logic between them.
Swift
1
star