当 MusicSequence 由文件 (.mid) 加载时,我成功地将声音字体 (.sf2) 加载到 MusicSequence,如下所示:
//the interesting code ...
NSString *midiFilePath = [[NSBundle mainBundle]
pathForResource:@"song"
ofType:@"mid"];
// Create a new URL which points to the MIDI file
NSURL * midiFileURL = [NSURL fileURLWithPath:filePath];
MusicSequenceFileLoad(s, (__bridge CFURLRef) midiFileURL, 0, 0);
// Create a new music player
MusicPlayer p;
// Initialise the music player
NewMusicPlayer(&p);
// ************* Set the endpoint of the sequence to be our virtual endpoint
MusicSequenceSetMIDIEndpoint(s, virtualEndpoint);
// Load the sound font from file
NSURL *presetURL = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Full Grand Piano" ofType:@"sf2"]];
// Initialise the sound font
[self loadFromDLSOrSoundFont: (NSURL *)presetURL withPatch: (int)10];
// Load the sequence into the music player
MusicPlayerSetSequence(p, s);
// Called to do some MusicPlayer setup. This just
// reduces latency when MusicPlayerStart is called
MusicPlayerPreroll(p);
// Starts the music playing
MusicPlayerStart(p);
//code continues here ...
-(OSStatus) loadFromDLSOrSoundFont: (NSURL *)bankURL withPatch: (int)presetNumber {
OSStatus result = noErr;
// fill out a bank preset data structure
AUSamplerBankPresetData bpdata;
bpdata.bankURL = (__bridge CFURLRef) bankURL;
bpdata.bankMSB = kAUSampler_DefaultMelodicBankMSB;
bpdata.bankLSB = kAUSampler_DefaultBankLSB;
bpdata.presetID = (UInt8) presetNumber;
// set the kAUSamplerProperty_LoadPresetFromBank property
result = AudioUnitSetProperty(self.samplerUnit,
kAUSamplerProperty_LoadPresetFromBank,
kAudioUnitScope_Global,
0,
&bpdata,
sizeof(bpdata));
// check for errors
NSCAssert (result == noErr,
@"Unable to set the preset property on the Sampler. Error code:%d '%.4s'",
(int) result,
(const char *)&result);
return result;
}
但是,如果我想将其应用于带有带有 MIDINoteMessages 的 MusicTrack 构建的 MusicSequence:
//the interesting code here
MusicSequenceNewTrack(musicSequence, &musicTrack);
MusicSequenceGetIndTrack(musicSequence, 0, &(musicTrack));
MIDINoteMessage aMessage;
aMessage.channel = 1;
aMessage.duration = 0.3f;
aMessage.velocity = 200;
for(int i=0; i<numerator; ++i)
{
if (i==0) {
aMessage.note = 80;
}else {
aMessage.note = 60;
}
MusicTrackNewMIDINoteEvent(musicTrack, i, &aMessage);
}
MusicSequenceSetMIDIEndpoint(musicSequence, virtualEndpoint);
// Load the sound font from file
NSURL *presetURL = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Full Grand Piano" ofType:@"sf2"]];
// Initialise the sound font
[self loadFromDLSOrSoundFont: (NSURL *)presetURL withPatch: (int)10];
//code continues here
我收到(lldb)错误。知道如何解决这个问题吗?