MIDISend:在iPhone上播放音符

时间:2013-10-08 16:13:55

标签: objective-c midi coremidi

我正在尝试使用Objective-C和MIDI生成一个可以通过iPhone扬声器播放的音符。我有下面的代码,但它没有做任何事情。我究竟做错了什么?

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] = 80;

firstPacket->data[2] = 120;

MIDIPacketList pklt=packetList;

MIDISend(MIDIGetSource(0), MIDIGetDestination(0), &pklt);

1 个答案:

答案 0 :(得分:2)

你有三个问题:

  1. 声明MIDIPacketList不分配内存或初始化结构
  2. 您将MIDIGetSource(返回MIDIEndpointRef)的结果作为第一个参数传递给MIDISend,而MIDIPortRef则需要//Look to see if there's anything that will actually play MIDI notes NSLog(@"There are %lu destinations", MIDIGetNumberOfDestinations()); // Prepare MIDI Interface Client/Port for writing MIDI data: MIDIClientRef midiclient = 0; MIDIPortRef midiout = 0; OSStatus status; status = MIDIClientCreate(CFSTR("Test client"), NULL, NULL, &midiclient); if (status) { NSLog(@"Error trying to create MIDI Client structure: %d", (int)status); } status = MIDIOutputPortCreate(midiclient, CFSTR("Test port"), &midiout); if (status) { NSLog(@"Error trying to create MIDI output port: %d", (int)status); } Byte buffer[128]; MIDIPacketList *packetlist = (MIDIPacketList *)buffer; MIDIPacket *currentpacket = MIDIPacketListInit(packetlist); NSInteger messageSize = 3; //Note On is a three-byte message Byte msg[3] = {0x90, 80, 120}; MIDITimeStamp timestamp = 0; currentpacket = MIDIPacketListAdd(packetlist, sizeof(buffer), currentpacket, timestamp, messageSize, msg); MIDISend(midiout, MIDIGetDestination(0), packetlist); 。 (您可能忽略了编译器对此的警告。永远不要忽略编译器警告。)
  3. 在iOS中发送MIDI音符不会发出任何声音。如果您没有连接到iOS设备的外接MIDI设备,则需要使用CoreAudio设置会产生声音的内容。这超出了这个答案的范围。
  4. 所以这段代码会运行,但除非你有外部硬件,否则它不会发出任何声音:

    {{1}}