如何加载声音字体

时间:2015-07-17 15:13:54

标签: ios soundfont

我在IOS应用程序中加载声音字体文件(.SF2)没有运气。我最初尝试使用来自Tech note TN2283的Apple代码

- (OSStatus) loadFromDLSOrSoundFont: (NSURL *)bankURL withPatch: (int)presetNumber {

OSStatus result = noErr;

// fill out a instrument data structure
AUSamplerInstrumentData instdata;
instdata.bankURL  = (CFURLRef) bankURL;
instdata.instrumentType = kInstrumentType_DLSPreset;
instdata.bankMSB  = kAUSampler_DefaultMelodicBankMSB;
instdata.bankLSB  = kAUSampler_DefaultBankLSB;
instdata.presetID = (UInt8) presetNumber;

// set the kAUSamplerProperty_LoadPresetFromBank property
result = AudioUnitSetProperty(self.mySamplerUnit,
                              kAUSamplerProperty_LoadInstrument,
                              kAudioUnitScope_Global,
                              0,
                              &instdata,
                              sizeof(instdata));

// 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; }

但是编译器抱怨说“没有名字' bankURL'在struct AUSamplerInstrumentData'这是真的,结构不包含' bankURL'构件??

然后我遇到了以下代码,Apple相信

- (OSStatus)loadSoundFont:(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;
}

这一切看起来都正确但是当我尝试使用此方法加载声音字体时,如下所示

NSURL *SFURL = [[NSBundle mainBundle] URLForResource:@"YAMAHA DX7Piano" withExtension:@"SF2"];
[self loadSoundFont:url withPatch:0];

它会抛出错误"无法在采样器上设置预设属性。"这确实让我觉得我在指定补丁号码方面存在一些错误,例如提供不存在的补丁号码。但我最终发现我提供的NSURL是null,所以我尝试按如下方式指定URL:

NSString *resources = [[NSBundle mainBundle] resourcePath];
NSURL *SFURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@",resources,@"YAMAHA DX7Piano.SF2"]];

这让我更近了一步。我想我现在正在为我的应用包中的声音字体文件提供一个有效的URL。但它仍然无法正常工作。我的编译器现在告诉我

  

错误:[0x19a824310] 486:DLS / SF2银行加载失败

缺少一块拼图,我无法看清楚。??

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。声音字体没有加载。它没有加载,因为它没有正确添加到应用程序包中。我已将其拖入资源,但必须将其添加到“复制捆绑资源”中。在项目中建立阶段'。