Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios MIDI音符信息何时在MusicTrack中播放?网间网操作系统_Ios_Sequence_Midi_Audiotoolbox_Coremidi - Fatal编程技术网

Ios MIDI音符信息何时在MusicTrack中播放?网间网操作系统

Ios MIDI音符信息何时在MusicTrack中播放?网间网操作系统,ios,sequence,midi,audiotoolbox,coremidi,Ios,Sequence,Midi,Audiotoolbox,Coremidi,我正在创建一个MIDI音符的音乐回溯,这些音符使用 MusicLayerStart(sequencePlayer) 但我想知道它们何时播放,这样我就可以为播放的每个MIDI音符更新UI // Creating MIDI Track MusicTrack track; UInt32 trackIndex = 0; musicTrackAtIndex(trackIndex, &track); //Adding Tempo addTempoEvent(0.0, 120); // Addin

我正在创建一个MIDI音符的音乐回溯,这些音符使用

MusicLayerStart(sequencePlayer)

但我想知道它们何时播放,这样我就可以为播放的每个MIDI音符更新UI

// Creating MIDI Track
MusicTrack track;
UInt32 trackIndex = 0;
musicTrackAtIndex(trackIndex, &track);

//Adding Tempo
addTempoEvent(0.0, 120);

// Adding MIDI notes
const int channel = 0;
MIDINoteMessage note;
note.channel = channel;
note.velocity = 100.0;
note.duration = 0.3;
note.releaseVelocity = 0;

note.note = 68;
addMIDINoteToTrack(track, note, 1);

note.note = 78;
addMIDINoteToTrack(track, note, 2);

note.note = 88;
addMIDINoteToTrack(track, note, 3);

note.note = 98;
addMIDINoteToTrack(track, note, 4);

MusicTimeStamp trackEnd = 4;
addEndOfTrackAtTime(trackEnd);

setLoopTrack(true); 

playSequence();
编辑

更详细地展示我是如何构建MIDI曲目的

-(void) playing4NotesInLoop {

MusicTrack musicTrack;
MusicSequence musicSequence;
MusicPlayer musicPlayer;

const int loop_length = 4;

NewMusicSequence(&musicSequence);

// Create a client
MIDIClientRef virtualMidi;
MIDIClientCreate(CFSTR("Virtual Client"),
                          MyMIDINotifyProc,
                          NULL,
                          &virtualMidi);


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


MusicSequenceNewTrack(musicSequence, &musicTrack);

MIDINoteMessage aMessage;
aMessage.channel = 1;

aMessage.duration = 0.5f;
aMessage.velocity = 100;

for(int i=0; i<4; ++i)
{
    if (i==0) {
        aMessage.note = 30;
    }else {
        aMessage.note = 60;
    }

    MusicTrackNewMIDINoteEvent(musicTrack, i, &aMessage);
}

MusicTrackLoopInfo loop_info;
loop_info.loopDuration = loop_length;
loop_info.numberOfLoops = 0;

MusicTrackSetProperty(musicTrack, kSequenceTrackProperty_LoopInfo, &loop_info, sizeof(MusicTrackLoopInfo));

MusicTimeStamp track_length;
track_length = loop_length;

MusicTrackSetProperty(musicTrack, kSequenceTrackProperty_TrackLength, &track_length, sizeof(MusicTimeStamp));

MusicSequenceSetMIDIEndpoint(musicSequence, virtualEndpoint);

NewMusicPlayer(&musicPlayer);
MusicPlayerSetSequence(musicPlayer, musicSequence);

MusicPlayerStart(musicPlayer);

}
-(无效)播放4notesinloop{
MusicTrack MusicTrack;
音乐序列音乐序列;
音乐玩家音乐玩家;
const int loop_length=4;
新音乐序列(&musicSequence);
//创建客户机
MIDIClientRef virtualMidi;
MIDIClientCreate(CFSTR(“虚拟客户端”),
MyMidiproc,
无效的
&virtualMidi);
//创建端点
MIDIEndpointRef virtualEndpoint;
MIDIDestinationCreate(virtualMidi、@“虚拟目的地”、MyMIDIReadProc、self.samplerUnit和virtualEndpoint);
MusicSequenceNewTrack(musicSequence和musicTrack);
MIDINoteMessage;
aMessage.channel=1;
aMessage.duration=0.5f;
aMessage.velocity=100;

对于(int i=0;i您使用MIDIDestinationCreate创建一个虚拟端点,然后调用MusicSequenceSetMIDIEndpoint将您的序列连接到它。您指定的读取过程将在每个事件上调用。

那么,它现在正在做您想要做的事情吗?不,MyMIDIRecProc它永远不会被调用。PS需要在UIBackgroundModes中使用音频键为了使用CoreMIDI的MidSourceCreate和MidDestinationCreate函数。您是否将plist中的键设置为audio?哇!就是这样!我完全忘了在我所需的背景模式下添加应用程序播放音频!太棒了!现在它工作得很好,非常感谢!!让我们来看看。