当通过文件(.mid)加载MusicSequence时,我已成功将Sound Font(.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)错误。任何想法如何解决这个问题?
最佳答案
这是我的github项目中与声音字体相关的代码。这会将声音字体加载到采样器单元中。如果您需要更多有关设置签名的信息,请参阅项目或阅读此post。
func loadSF2Preset(preset:UInt8) {
// This is the MuseCore soundfont. Change it to the one you have.
if let bankURL = NSBundle.mainBundle().URLForResource("GeneralUser GS MuseScore v1.442", withExtension: "sf2") {
var instdata = AUSamplerInstrumentData(fileURL: Unmanaged.passUnretained(bankURL),
instrumentType: UInt8(kInstrumentType_DLSPreset),
bankMSB: UInt8(kAUSampler_DefaultMelodicBankMSB),
bankLSB: UInt8(kAUSampler_DefaultBankLSB),
presetID: preset)
var status = AudioUnitSetProperty(
self.samplerUnit,
AudioUnitPropertyID(kAUSamplerProperty_LoadInstrument),
AudioUnitScope(kAudioUnitScope_Global),
0,
&instdata,
UInt32(sizeof(AUSamplerInstrumentData)))
CheckError(status)
}
}
您可以像这样将签名与MusicSequence关联
MusicSequenceSetAUGraph(musicSequence, self.processingGraph)
关于ios - 使用MIDI Notes将Soundfont添加到音乐轨道吗? CoreMIDI iOS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30664468/