AVAudioUnitSampler Ошибка loadSoundBankAtURL -> Невозможно найти патч 0 банк 0x0/0

Не удается загрузить звуковой шрифт с сообщением "Невозможно найти заплату 0, банк 0x0/0". URL-адрес звукового шрифта отображается правильно при просмотре полного полученного пути.

AVAudioUnitSampler наследуется от AVAudioUnitMidiInstrument

AVAudioUnitSampler не имеет собственного инициализатора.AVAudioUnitMidiInstrument есть тот, который занимает AudioComponentDescription

Использование любого приводит к той же ошибке.

var error:NSError?
let soundBankUrl:NSURL = NSURL(fileURLWithPath:
NSBundle.mainBundle().pathForResource("FluidR3 GM2-2", ofType: "SF2"))

var audioEngine:AVAudioEngine  = AVAudioEngine()        

// sampler
var audioCompDesc = AudioComponentDescription(
    componentType: OSType(kAudioUnitType_MusicDevice),
    componentSubType: OSType(kAudioUnitSubType_Sampler),
    componentManufacturer: OSType(kAudioUnitManufacturer_Apple),
    componentFlags: 0, componentFlagsMask: 0)     

var sampler:AVAudioUnitSampler = AVAudioUnitSampler(audioCompDesc)
//     var sampler:AVAudioUnitSampler = AVAudioUnitSampler()


let loaded = sampler.loadSoundBankAtURL(soundBankUrl, error: &error)

Результаты в:

Unable to find patch 0 bank 0x0/0

Используя API нижнего уровня, можно установить свойство для аудиоустройства.

AUSamplerBankPresetData bpdata;
bpdata.bankURL = (__bridge CFURLRef) presetURL;

bpdata.bankMSB = kAUSampler_DefaultMelodicBankMSB;
bpdata.bankLSB = kAUSampler_DefaultBankLSB;

bpdata.presetID = (UInt8) patch;

return [self loadSynthFromPresetURL:(NSURL*)presetURL
                          withPatch:(int) patch
                          audioUnit: (AudioUnit) audioUnit
               samplerBankPesetData: (AUSamplerBankPresetData) bpdata];

result = AudioUnitSetProperty(audioUnit,
kAUSamplerProperty_LoadPresetFromBank, kAudioUnitScope_Global,
              0, &samplerBankPresetData, sizeof(samplerBankPresetData));

1 ответ

A) Более поздняя версия, версия 3, бета-версии Xcode 6 добавила дополнительные методы, устраняя необходимость в мосте.

//
//  ViewController.swift
//  SwiftAudio
//
//  Created by Robert Buskens on 2014-06-06.
//  Copyright (c) 2014 Buskens & Associates Inc. All rights reserved.
//

import UIKit
import AVFoundation
import AudioUnit

class ViewController: UIViewController {

    var engine: AVAudioEngine
    var sampler:AVAudioUnitSampler

    init(coder aDecoder: NSCoder!) {
        var retVal:Bool = false
        var error:NSErrorPointer = nil

        engine =  AVAudioEngine()
        sampler = AVAudioUnitSampler()

        engine.attachNode(sampler)
        engine.connect(sampler, to: engine.outputNode, format: nil)

        var url = NSBundle.mainBundle().URLForResource("Framus_western", withExtension: "sf2")

        retVal = engine.startAndReturnError(error)


        var r:Bool = sampler.loadSoundBankInstrumentAtURL(url, program: 0, bankMSB: 0x79, bankLSB: 0, error: error)

        engine.startAndReturnError(error)

        println("engine start returned: \(retVal)")

        super.init(coder: aDecoder)    
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func playNote(sender: UIButton) {
        sampler.startNote(45, withVelocity: 80, onChannel: 1)
    }
}

Гораздо проще, чем без AVAudioEngine.

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