         tracks[trackIndex].add(event: event, position: position)
     }
 
+    /// Remove all notes
     open func clear() {
         for track in tracks {
             track.clear()
         }
     }
 
+    /// Move to a new time in the playback
+    /// - Parameter position: Time to jump to, in beats
     open func seek(to position: Double) {
         tracks.forEach({ $0.seek(to: position) })
     }
 
+
+    /// Equivalent to stop
     open func pause() {
         stop()
     }
 
+    /// Retrived a track for a given node
+    /// - Parameter node: Node you want to access the tack for
+    /// - Returns: Track associated with the given node
     open func getTrackFor(node: AKNode) -> AKSequencerTrack? {
         return tracks.first(where: { $0.targetNode == node })
     }
 
+    /// Add track associated with a node
+    /// - Parameter node: Node to create the track for
+    /// - Returns: Track associated with the given node
     open func addTrack(for node: AKNode) -> AKSequencerTrack {
         let track = AKSequencerTrack(targetNode: node)
         tracks.append(track)

    }

    /// Add a MIDI note to the track
    open func add(noteNumber: MIDINoteNumber,
                  velocity: MIDIVelocity = 127,
                  channel: MIDIChannel = 0,


    /// Initialize with a single node or with no node at all
    /// You must provide a target node for the sequencer to drive or it will not run at all
    /// - Parameter targetNode: Required node
    public convenience init(targetNode: AKNode) {
        self.init(targetNodes: [targetNode])
    }

    /// Initialize with target nodes. This will create a track for each node
    /// - Parameter targetNodes: Array of nodes to target for each track
    public required init(targetNodes: [AKNode]? = nil) {
        if let targetNodes = targetNodes {
            tracks = targetNodes.enumerated().map({ AKSequencerTrack(targetNode: $0.element) })
