Как загрузить Sound Font

Мне не повезло, загрузка файла звукового шрифта (.SF2) в моем приложении IOS. Сначала я попытался использовать код Apple из технической заметки TN2283

- (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 "в структуре 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, который я предоставлял, был нулевым, поэтому я попытался указать URL следующим образом:

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

Это сделало меня на шаг ближе. Я думаю, что теперь я предоставляю действительный URL-адрес файла звукового шрифта в моем комплекте приложений. Но это все еще не работает. Мой компилятор теперь говорит мне

ОШИБКА: [0x19a824310] 486: сбой загрузки банка DLS/SF2

Отсутствует кусок головоломки, и я не вижу, что.??

1 ответ

Ну, я нашел решение. Шрифт Sound не загружался. Он не загружался, потому что не был правильно добавлен в комплект приложений. Я перетащил его в ресурсы, но затем мне пришлось добавить его в "Копировать ресурсы комплекта" в проекте "Этапы сборки".

Другие вопросы по тегам