gpt4 book ai didi

ios - 如何知道 midi 回调中的循环结束

转载 作者:行者123 更新时间:2023-12-01 18:14:32 25 4
gpt4 key购买 nike

我有一个 midi 文件循环(带有 MusicPlayer )并遵循回调过程

static void MyMIDIReadProc(const MIDIPacketList *pktlist,
void *refCon,
void *connRefCon) {

AudioUnit *player = (AudioUnit*) refCon;

const MIDIPacket *packet = &pktlist->packet[0];

for (int i=0; i < pktlist->numPackets; i++) {
Byte midiStatus = packet->data[0];
Byte midiCommand = midiStatus >> 4;

NSMutableString *hex = [NSMutableString stringWithCapacity:10];
for (int i=0; i < 10; i++) {
[hex appendFormat:@"%02x ", packet->data[i]];

}
NSLog(hex);

if (midiCommand == 0x09) {
Byte note = packet->data[1] & 0x7F;
Byte velocity = packet->data[2] & 0x7F;
OSStatus result = noErr;
result = MusicDeviceMIDIEvent (player, midiStatus, note, velocity, 0);

}
packet = MIDIPacketNext(packet);
}
}
NSLog(hex)只会显示以 90(注意)、b0( Controller )、e0(弯音)或 c0(程序更改)开头的数据包。那么回调函数是否根本没有得到轨道结束标记 - FF 2F 00 - 或者我在这里遗漏了什么?我想在每次循环重新开始时得到通知。

这就是我注册回调的方式:
MIDIClientRef virtualMidi;
result = MIDIClientCreate(CFSTR("Virtual Client"),
MyMIDINotifyProc,
NULL,
&virtualMidi);

NSAssert( result == noErr, @"MIDIClientCreate failed. Error code: %d '%.4s'", (int) result, (const char *)&result);

// Create an endpoint
MIDIEndpointRef virtualEndpoint;
result = MIDIDestinationCreate(virtualMidi, @"Virtual Destination", MyMIDIReadProc, self.samplerUnit, &virtualEndpoint);

NSAssert( result == noErr, @"MIDIDestinationCreate failed. Error code: %d '%.4s'", (int) result, (const char *)&result);

MusicSequenceSetMIDIEndpoint(s, virtualEndpoint);

最佳答案

End Of Track Marker 是一个永远不会发送到 MIDI 设备的 Midi 元消息;它只存在于 MIDI 文件中。

更新:

您可以使用用户事件在轨道循环播放时获得通知。

为用户事件添加回调:

static void sequenceUserCallback(void *inClientData,
MusicSequence inSequence,
MusicTrack inTrack,
MusicTimeStamp inEventTime,
const MusicEventUserData *inEventData,
MusicTimeStamp inStartSliceBeat,
MusicTimeStamp inEndSliceBeat)
{
NSLog(@"track was looped");
}

并创建一个这样的用户事件:
static MusicEventUserData userData = {1, 0x01 /* anything you want*/ };

MusicTrack musicTrack;
MusicSequenceGetIndTrack(sequence, 0 /* your track index of interest */, &musicTrack);

/* timestamp 0 should be fine if you always loop from the beginning;
alternatively add the event at end of track */
MusicTrackNewUserEvent(musicTrack, 0 /* timestamp */ , &userData);

关于ios - 如何知道 midi 回调中的循环结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23664825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com