CoreMidi.framework отправка миди-команд - PullRequest
1 голос
/ 30 октября 2010

есть приложение под названием FreeStyler, которым вы можете управлять с помощью команд midi.В моем приложении Mac я хочу отправлять миди-сигналы.

Может кто-нибудь показать пример этого?

Ответы [ 2 ]

3 голосов
/ 30 января 2011

Вот что нужно, чтобы отправить записку моему синтезатору blofeld. Я надеюсь, что это помогает. Вы можете использовать MIDIObjectGetProperties, чтобы найти уникальные идентификаторы для всех MIDI-устройств, подключенных к вашему Mac.

#import <Foundation/Foundation.h>

#import <CoreMIDI/CoreMIDI.h>

MIDIEndpointRef getEndpointWithUniqueID(MIDIUniqueID id){

    MIDIObjectRef endPoint;

    MIDIObjectType foundObj;

    MIDIObjectFindByUniqueID(id, &endPoint, &foundObj);

    return (MIDIEndpointRef) endPoint;

}

MIDIClientRef getMidiClient(){

    MIDIClientRef midiClient;

    NSString *outPortName =@"blofeldOut";

    MIDIClientCreate((CFStringRef)outPortName, NULL, NULL, &midiClient);

    return midiClient;

}

MIDIPortRef getOutPutPort(){

    MIDIPortRef outPort;

    NSString *outPortName =@"blofeldOut";

    MIDIOutputPortCreate(getMidiClient(), (CFStringRef)outPortName, &outPort);

    return outPort;

}

MIDIPacketList getMidiPacketList(){

    MIDIPacketList packetList;

    packetList.numPackets = 1;

    MIDIPacket* firstPacket = &packetList.packet[0];

    firstPacket->timeStamp = 0; // send immediately

    firstPacket->length = 3;

    firstPacket->data[0] = 0x90;

    firstPacket->data[1] = 60;

    firstPacket->data[2] = 64;

    // TODO: add end note sequence

    return packetList;

}

void play_note(void) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    MIDIPacketList packetList=getMidiPacketList();

    MIDIUniqueID blofeldEndpointID = -934632258;

    MIDIEndpointRef blofeldEndpoint = getEndpointWithUniqueID(blofeldEndpointID);

    MIDISend(getOutPutPort(), blofeldEndpoint, &packetList);

    MIDIEndpointDispose(blofeldEndpoint);

    [pool drain];

}

int main (int argc, const char * argv[]) {

    play_note();

    return 0;

}
1 голос
/ 31 октября 2010

Ваше приложение должно будет использовать инфраструктуру CoreMIDI для отправки или получения MIDI, с чем, как я могу судить по опыту, работать с ним не очень весело Возможно, вы захотите попробовать инфраструктуру vvopensource , которая представляет собой инфраструктуру MIDI, разработанную для какао.

...