Skip to content

Instantly share code, notes, and snippets.

@gregsabo
Last active June 27, 2021 22:03
Show Gist options
  • Save gregsabo/61d3156a461c8a918565f194203fe867 to your computer and use it in GitHub Desktop.
Save gregsabo/61d3156a461c8a918565f194203fe867 to your computer and use it in GitHub Desktop.
AudioKit Cheat Sheet

Play a sine wave.

import AudioKit

let osc = AKOscillator()
osc.frequency = 440.0
osc.start()
AudioKit.output = osc
AudioKit.start()

Play a simple loop.

class GameScene: SKScene {
    let sequencer = AKSequencer()
    
    override func didMove(to view: SKView) {
        let osc = AKOscillator()
        osc.frequency = 440.0
        osc.start()
        AudioKit.output = osc
        AudioKit.start()
        
        let instrument = AKCallbackInstrument {event, note, _ in
            if event == .noteOn {
                osc.frequency = note.midiNoteToFrequency()
            }
        }
        
        // Make sure you have background audio enabled.
        let track = self.sequencer.newTrack()!
        track.add(
            noteNumber: MIDINoteNumber(60),
            velocity: MIDIVelocity(100),
            position: AKDuration(beats: 0),
            duration: AKDuration(beats: 1)
        )
        track.add(
            noteNumber: MIDINoteNumber(63),
            velocity: MIDIVelocity(100),
            position: AKDuration(beats: 1),
            duration: AKDuration(beats: 1)
        )
        track.setMIDIOutput(instrument.midiIn)
        self.sequencer.enableLooping()
        self.sequencer.play()
    }
}

Get a callback each time a loop repeats

func onEachLoop(sequencer: AKSequencer, callback: @escaping () -> Void) {
    let track = sequencer.newTrack("silent callback track")!
    let callbackInstrument = AKCallbackInstrument {event, note, _ in
        if event == .noteOn {
            callback()
        }
    }
    track.add(
        noteNumber: MIDINoteNumber(60),
        velocity: MIDIVelocity(1),
        position: AKDuration(beats:0),
        duration: AKDuration(beats: 1)
    )
    track.setMIDIOutput(callbackInstrument.midiIn)
}

// Usage

onEachLoop(sequencer: self.sequencer) {
    track.add(
        noteNumber: MIDINoteNumber(Int.random(50...70)),
        velocity: MIDIVelocity(0),
        position: AKDuration(beats: Double.random(0, 4)),
        duration: AKDuration(beats: 1)
    )
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment