Thread: [Musickit-users] MIDIRecord...
Brought to you by:
leighsmith
From: Steve S. <st...@sp...> - 2004-05-20 20:30:32
|
I'm having trouble using MIDIRecord.. (just to get a feel for using MusicKit). I'm running MacOSX 10.3.3. I'm new to MusicKit I'm new to MIDI I'm (pretty) new to XCode (though I did a lot of NeXTStep programming a *looooooong* time ago.. so it smells familiar). Anyway.. since I'm so new and all... it seem pretty darn unlikely that my trouble is due to anything other than pilot error, but it's pretty basic, so I'm not sure how I could be terribly guilty! When I start MIDIRecord.app (according to the source) it fills a popup with the returned list from getDriverNames: [driverPopup addItemsWithTitles: [MKMidi getDriverNames]]; But this list doesn't have my MIDI Sources... only MIDI Destinations. Looking at getDriverNames, it looks like it calls the method MKMDGetAvailableDrivers. PERFORM_API const char **MKMDGetAvailableDrivers(unsigned int *selectedDriver) { const char **driverList = NULL; NSMutableArray *driverNameList = [NSMutableArray array]; ItemCount destinationIndex, destinationCount = MIDIGetNumberOfDestinations(); CFStringRef pname; unsigned int driverListIndex; for(destinationIndex = 0; destinationIndex < destinationCount; destinationIndex++) { MIDIEndpointRef destEndPoint = MIDIGetDestination(destinationIndex); MIDIObjectGetStringProperty(destEndPoint, kMIDIPropertyName, &pname); [driverNameList addObject: (NSString *) pname]; } // always create at least one entry for the terminating NULL pointer. driverList = (const char **) calloc([driverNameList count]+1, sizeof(char *)); for(driverListIndex = 0; driverListIndex < [driverNameList count]; driverListIndex++) { driverList[driverListIndex] = [[driverNameList objectAtIndex: driverListIndex] cString]; } driverList[driverListIndex] = NULL; *selectedDriver = 0; return driverList; } It's getting all the MIDI Destinations... but shouldn't MidiRecord get Sources? Is there (or should there be) an option to getDriverNames to return MIDI sources? thanks! -steve |
From: Leigh S. <le...@le...> - 2004-05-20 20:55:30
|
I must admit the last time I did anything with MIDI record was probably MacOS 10.1, and from memory, there was no documentation about CoreMIDI, it was deduced from the header files in CoreMIDI.framework. So I think at the time the appropriate thing to do to match the MusicKit API was assume destinations and sources were the same. Clearly with revised CoreMIDI under newer versions of the OS, this no longer applies. So yes, we need to retrieve sources, but more fundamentally, there seems a mismatch between what the MusicKit deems a driver, and what the CoreMIDI (and probably portmusic also) distinguishes between source and destinations within that driver. Clearly you only want to present source names when the pop up is to display sources, which is a decision which needs to be made in the application, so the problem is the semantics behind the method getDriverNames. It could be expanded to be: typedef enum { MKMidiDriverSource, MKMidiDriverDestination, MKMidiDriverBoth } MKMidiDirectionDriver; - (NSString *) getDriverNamesFor: (MKDriverDirection) direction { // Should call MKMDGetAvailableDriverSources() or MKMDGetAvailableDriverDestinations() appropriate to the direction value. // These need functions in MKPerformSndMIDI writing by modifying MKMDGetAvailableDriver()... } With getDriverNames being deprecated to become: - (NSString *) getDriverNames { // in order to preserve erroneous behaviour or return [self getDriverNamesFor: MKMidiDriverDestination]; // return [self getDriverNamesFor: MKMidiDriverBoth] // is arguably more logical. } This is just "thinking out loud", and it will be some days before I can tackle this code, unless someone wants to tackle it, so I'd welcome other thoughts or better namings on the matter. -- Leigh Smith mailto:le...@le... http://www.leighsmith.com |