2014-06-15 4 views
1

'패치 0 뱅크 0x0/0을 찾을 수 없습니다'와 함께 사운드 폰을로드하는 중입니다. 전체 최종 경로를 보면 사운드 폰의 URL이 올바르게 나타납니다. AVAudioUnitMidiInstrumentAVAudioUnitSampler 오류 loadSoundBankAtURL -> 패치 0 뱅크 0x0/0을 찾을 수 없습니다.

AVAudioUnitSampler에서

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) 

결과 : 낮은 수준의 API를 사용하여

Unable to find patch 0 bank 0x0/0 

하나는 오디오 장치의 속성을 설정합니다.

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) Xcode 6 베타 버전 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없이보다 훨씬 간단합니다.

+0

답장을 보내 주셔서 감사합니다. 지금까지의 모든 업그레이드, 나는 점점 더 많은 C 수정을 해킹했습니다. 이 방법은 훨씬 쉽습니다. – plivesey