Different types of instruments have different ways of processing notes and audio.
Note-on event
MIDI-based: Forward a MIDI note on event to the instrument plugin
Non-MIDI-based: Construct a NotePlayHandle instance for the new note and add it to AudioEngine
Note-off event
MIDI-based: Forward a MIDI note off event to the instrument plugin
Non-MIDI-based: Call NotePlayHandle::noteOff()
Processing notes in the rendering cycle
MIDI-based: Do nothing as the instrument will take care of them
Non-MIDI based and single-streamed: playNote() will process the note, but it won't render audio for the note. Instead, play() will render the final audio stream for all notes.
Non-MIDI based and multiple-streamed: playNote() will process and render the note