Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AVAudioUnitSampler错误加载SoundBankaturl->;找不到修补程序0银行0x0/0_Ios_Objective C_Avfoundation_Swift_Soundfont - Fatal编程技术网

Ios AVAudioUnitSampler错误加载SoundBankaturl->;找不到修补程序0银行0x0/0

Ios AVAudioUnitSampler错误加载SoundBankaturl->;找不到修补程序0银行0x0/0,ios,objective-c,avfoundation,swift,soundfont,Ios,Objective C,Avfoundation,Swift,Soundfont,加载soundfont失败,原因是“找不到修补程序0银行0x0/0” 查看完整的结果路径时,soundfont的URL显示正确 avaudionitsampler继承自avaudionitmidiinstrument AVAudioUnitSampler没有自己的初始值设定项。 AVAudioUnitMidiInstrument有一个采用AudioComponentDescription 使用这两种方法都会导致相同的错误 var error:NSError? let soundBankUrl:N

加载soundfont失败,原因是“找不到修补程序0银行0x0/0” 查看完整的结果路径时,soundfont的URL显示正确

avaudionitsampler
继承自
avaudionitmidiinstrument

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));
A) Xcode 6 beta版的更高版本(第3版)添加了额外的方法,消除了桥接的需要。

//
//  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要简单得多。

谢谢你的回答。到目前为止,每次升级,我都会使用越来越多的C修复程序。这条路容易多了。