kAudioUnitType_MusicEffect作为AVAudioUnit

时间:2016-05-13 22:55:50

标签: midi audiounit coremidi avaudioengine

我想在kAudioUnitType_MusicEffect图表中使用我的AVAudioEngine AU。所以我试着打电话:

[AVAudioUnitMIDIInstrument instantiateWithComponentDescription:desc options:kAudioComponentInstantiation_LoadInProcess completionHandler:

但是这只是正常AVAudioUnit,所以midi选择器(如 - [AVAudioUnit sendMIDIEvent:data1:data2:]:)无法识别。似乎AVAudioUnitMIDIInstrument instantiateWithComponentDescription仅适用于kAudioUnitType_MusicDevice

有什么办法吗? (注:OS X 10.11)

2 个答案:

答案 0 :(得分:0)

创建一个子类并从其init。

调用instantiateWithComponentDescription

blog post

中的Gory详细信息和github项目

http://www.rockhoppertech.com/blog/multi-timbral-avaudiounitmidiinstrument/#avfoundation

这使用Swift和kAudioUnitSubType_MIDISynth但您可以看到如何操作。

答案 1 :(得分:0)

这很有效。它是一个子类。您将它添加到引擎并通过它路由信号。

class MyAVAudioUnitDistortionEffect: AVAudioUnitEffect {

override init() {
    var description                   = AudioComponentDescription()
    description.componentType         = kAudioUnitType_Effect
    description.componentSubType      = kAudioUnitSubType_Distortion
    description.componentManufacturer = kAudioUnitManufacturer_Apple
    description.componentFlags        = 0
    description.componentFlagsMask    = 0
    super.init(audioComponentDescription: description)
}

func setFinalMix(finalMix:Float) {

    let status = AudioUnitSetParameter(
        self.audioUnit,
        AudioUnitPropertyID(kDistortionParam_FinalMix),
        AudioUnitScope(kAudioUnitScope_Global),
        0,
        finalMix,
        0)

    if status != noErr {
        print("error \(status)")
    }
}