             duration: Float32(duration.beats))
 
         MusicTrackNewMIDINoteEvent(track, position.musicTimeStamp, &noteMessage)
+    }
+    
+    /// Add Note to sequence with AKMIDINoteData
+    ///
+    /// - parameter midiNoteData: AKMIDINoteData containing relevant note details
+    ///
+    open func add(midiNoteData: AKMIDINoteData) {
+        add(noteNumber: midiNoteData.noteNumber,
+            velocity: midiNoteData.velocity,
+            position: midiNoteData.position,
+            duration: midiNoteData.duration,
+            channel: midiNoteData.channel)
+    }
+
+    /// Erases current note events and recreates track from note data in AKMIDINoteData array
+    /// Order of structs in array is irrelevant
+    ///
+    /// - parameter midiNoteData: AKMIDINoteData array containing relevant note details
+    ///
+    open func replaceMIDINoteData(with trackMIDINoteData: [AKMIDINoteData]) {
+        clearRange(start: AKDuration(beats: 0), duration: AKDuration(beats: length))
+        trackMIDINoteData.forEach { add(midiNoteData: $0) }
     }
 
     /// Add Controller change to sequence

    open func resetPitchBend(position: AKDuration, channel: MIDIChannel = 0) {
        addPitchBend(8_192, position: position, channel: channel)
    }

    /// Copy this track to another track
    ///

            MusicTrackClear(track, start.beats, start.beats + duration.beats)
        }
    }
    // MARK: Add Events

    /// Add Note to sequence
    ///
