1 & 2) Take whatever you have done for copy so far and get rid of it. You seem to be doing it all wrong if you have the entire Edit menu enabled. The interaction between menu items, apps, documents, and first responders is very subtle and not documented in any way.
You don't want to override validateMenuItem for this. That is for something else.
You also don't want to change anything in Interface Builder related to actions on Edit menu items. Most system menu items, especially anything in the Edit menu, is dynamically created. What you see in Interface Builder is more of a suggestion of what the running app might see in some hypothetical world.
Normally, one doesn't "copy" raw data like this. Various user interface elements that might provide meaningful data will offer their data to the clipboard and, depending on focus state, will be the first responder and will activate the copy menu item. That's how the copy menu item normally gets activated. You can certainly copy raw data, but it isn't normally done and that's why you are having difficulty. The solution is pretty simple, just provide a "copy" implementation in your document class. That's all you need to do. However, it does need to look exactly like this:
- (IBAction) copy: (id) sender
{
NSPasteboard * pasteboard = [NSPasteboard generalPasteboard];
[pasteboard clearContents];
[pasteboard setString: @"This is a test" forType: NSPasteboardTypeString];
}
That is an example implementation in Objective-C, of course. You will have to re-write it in Swift and jump through all kinds of Swift hoops. You're on your own for that.
3) You normally wouldn't copy to the pasteboard in "read". You save some reference to your data and then, when the user requests a copy, you do the copy there. However, you can't just stuff data onto the pasteboard. The pasteboard is designed to transfer data from one app to another. You can define your own data type if you are strictly copying data from one place in your own app to another place. If you know that some other app accepts a very specific type of data, you might be able to just shove in that data type. I don't know.
But, in general, you just have to find the most general representation of your data and put that on the pasteboard. For MIDI data, I assume that would be NSPasteboardTypeSound (via an NSSound object). I don't know anything about that class. Supposedly it accepts anything that CoreAudio or Quicktime can handle. I assume they can handle MIDI data, so that should be what you can use. I expect that it would be copying something that really is low-level MIDI data, rather than a conversion. You can inspect it with the Apple Clipboard Viewer app.