2016-05-13 6 views
0

Я хотел бы использовать мой kAudioUnitType_MusicEffect AU в графике AVAudioEngine. Так что я пытаюсь позвонить:kAudioUnitType_MusicEffect as AVAudioUnit

[AVAudioUnitMIDIInstrument instantiateWithComponentDescription:desc options:kAudioComponentInstantiation_LoadInProcess completionHandler: 

, но это просто yeilds нормальный AVAudioUnit, поэтому миди селекторы (как - [AVAudioUnit sendMIDIEvent:data1:data2:]:) являются непризнанными. Кажется AVAudioUnitMIDIInstrument instantiateWithComponentDescription работает только с kAudioUnitType_MusicDevice.

Любой способ сделать это? (Примечание: OS X 10.11)

ответ

0

Создайте подкласс и вызовите экземплярное описаниеWithComponentDescription из его init.

окровавленные детали и проект GitHub в этом blog post

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

Это использует Swift и kAudioUnitSubType_MIDISynth, но вы можете увидеть, как это сделать.

+0

Я не вижу, как подклассификация поможет. Мне еще нужно вызвать 'instantiateWithComponentDescription', который не работает для' kAudioUnitType_MusicEffect'. Если я переключу его на 'kAudioUnitType_MusicDevice', тогда я получаю отказ от утверждения при попытке подключить аудиовход. – Taylor

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)") 
    } 
}