【问题标题】:passing a bytearray as a parameter of a method (CoreMIDI implementation)将字节数组作为方法的参数传递(CoreMIDI 实现)
【发布时间】:2013-04-25 20:13:28
【问题描述】:

我正在尝试创建一种使用 CoreMIDI 将 MIDI 信息输出到虚拟客户端的方法。 “action”方法是 MIDIReceived,它将 MIDI 数据以 MIDI 数据包的形式发送到虚拟客户端。

下面,我创建了一个接受 MIDI 字节作为参数的方法,该方法应将其添加到 MIDI 数据包列表中,然后使用 MIDIReceived 将其发送到虚拟客户端。

它不起作用。

我已经测试了这段代码,没有尝试使用自定义方法——即手动输入 midi 字节数据,它工作正常。

我认为我遇到的问题是我无法正确地将字节数组传递给方法。

我得到的对象消息的错误是“预期的表达式”。

如何将字节数组传递给方法? (最好不使用 NSData)?

#import "AppDelegate.h"
#import <CoreMIDI/CoreMIDI.h>

MIDIClientRef     theMidiClient;
MIDIEndpointRef   midiOut;
char              pktBuffer[1024];
MIDIPacketList    *pktList = (MIDIPacketList*) pktBuffer;
MIDIPacket        *pkt;

@interface PacketCreateAndSend : NSObject
-(void) packetOut:(Byte*)midiByte;
@end

@implementation PacketCreateAndSend
-(void) packetOut:(Byte*)midiByte{
    Byte testByte = *midiByte;

 //initialize MIDI packet list:
    pkt = MIDIPacketListInit(pktList);

 //add packet to MIDI packet list
    pkt = MIDIPacketListAdd(pktList, 1024, pkt, 0, 3, &testByte); 

 //send packet list to virtual client:
    MIDIReceived(midiOut, pktList);
}
@end

@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

 //create MIDI client and source:
    MIDIClientCreate(CFSTR("Magical MIDI"), NULL, NULL, &theMidiClient);
    MIDISourceCreate(theMidiClient, CFSTR("virtual MIDI created"), &midiOut);

 //create instance of PacketCreateAndSend object:
    PacketCreateAndSend *testObject = [PacketCreateAndSend new];

 //(here is where the error occurs)
 //message object with MIDI byte data:
    [testObject packetOut:{0x90, 0x3d, 0x3d}];

}
@end

如您所见,我想做的只是创建一种将 MIDI 数据传输到虚拟源的简单方法,但这样做时遇到了一些麻烦。

【问题讨论】:

  • "如何将字节数组传递给方法?" - 我不明白你的意思。 [self someMethod:array];,是吗?
  • 我是 Objective-c 的新手,所以我的措辞可能不正确。 “PacketCreateAndSend”类的方法“packetOut”有一个参数“midiByte”。我正在尝试使用参数 {0x90, 0x3d, 0x3d} 调用此方法,但编译器不会让我这样做。 [testObject packetOut:{0x90, 0x3d, 0x3d}]。
  • 您需要初始化一个数组并将指针传递给它的第一个元素。 int arr[] = { 1, 2, 3 }; [self foo:arr];
  • 我试过:int byteArray[] = {0x90, 0x3d, 0x3d};[testObject packetOut:byteArray]; 但得到“不兼容的指针类型将“int[3]”发送到“Byte *”类型的参数(又名“unsigned char *”)
  • 我还将方法接口和实现修改为:-(void) packetOut:(int*)midiByte{ Byte testByte = *midiByte; //... },但仍然没有运气。如果你看不出我是在黑暗中摸索。

标签: objective-c arrays macos bytearray coremidi


【解决方案1】:

这是固定的、功能齐全的代码。感谢您的帮助!

#import "AppDelegate.h"
#import <CoreMIDI/CoreMIDI.h>

MIDIClientRef     theMidiClient;
MIDIEndpointRef   midiOut;
char              pktBuffer[1024];
MIDIPacketList    *pktList = (MIDIPacketList*) pktBuffer;
MIDIPacket        *pkt;

@interface PacketCreateAndSend : NSObject

-(void) packetOut:(Byte[])midiByte;

@end

@implementation PacketCreateAndSend

-(void) packetOut:(Byte[])midiByte{

    pkt = MIDIPacketListInit(pktList);

    pkt = MIDIPacketListAdd(pktList, 1024, pkt, 0, 3, midiByte);

    MIDIReceived(midiOut, pktList);

}

@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

   //initialize MIDI client and source:
    MIDIClientCreate(CFSTR("Magical MIDI"), NULL, NULL, &theMidiClient);
    MIDISourceCreate(theMidiClient, CFSTR("virtual MIDI created"), &midiOut);


    PacketCreateAndSend *testObject = [PacketCreateAndSend new];


    Byte byteArray[] = {0x90, 0x3d, 0x3d};

   //send the midi packet:    
    [testObject packetOut:byteArray];
}
@end

【讨论】:

    猜你喜欢
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2020-08-14
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多