How to make the NewTimePitchModule work?

I have use the other modules like that :
private var reverbModule: AEReverbModule!
private var delayModule: AEDelayModule!

init(renderer: AERenderer, forModule module:AudioOutputModule, forTrack track: Track) {
    if let reverb = AEReverbModule(renderer: renderer) {
        reverb.dryWetMix = 20
        reverb.gain = 0
        reverb.minDelayTime = 0.03
        reverb.maxDelayTime = 0.2
        reverb.decayTimeAt0Hz = 9
        reverb.decayTimeAtNyquist = 3
        reverb.randomizeReflections = 200
        let effectModule = module.addEffect(reverb)
        effectModule.applingFor(.AmRecording, withCondition: .ThroughtAny, activate: true)
        self.reverbModule = reverb
    }

    if let delay = AEDelayModule(renderer: renderer) {
        delay.wetDryMix = 0
        delay.delayTime = 0.6
        delay.feedback = 50
        delay.lopassCutoff = 15000
        let effectModule = module.addEffect(delay)
        effectModule.applingFor(.AmRecording, withCondition: .ThroughtAny, activate: true)
        self.delayModule = delay
    }
}

override func adjustParams(value: CGFloat) {
    super.adjustParams(value)
    var value = value/100
    value = value < -1.0 ? -1.0 : value
    value = value > 1.0 ? 1.0 : value

    var dryWetMixReverb = Double((25.0 * value) + 15.0)
    if dryWetMixReverb > 40 {
        dryWetMixReverb = 40
    }

    print(dryWetMixReverb)
    self.reverbModule.dryWetMix = dryWetMixReverb
}

It works fine , but when I want to use the AENewTimePitech :
And for AETimePitchModule :
private var timePitcherModule: AENewTimePitchModule!
private var reverbModule: AEReverbModule!

init(renderer: AERenderer, forModule module:AudioOutputModule, forTrack track: Track) {

    if let newTimePitch = AENewTimePitchModule(renderer: renderer) {
        newTimePitch.rate = 16.0
        newTimePitch.pitch = -1800.0
        newTimePitch.overlap = 8.0
        newTimePitch.enablePeakLocking = 1.0
        let effectModule = module.addEffect(newTimePitch)
        effectModule.applingFor(.AmRecording, withCondition: .ThroughtAny, activate: true)
        self.timePitcherModule = newTimePitch
    }

    if let reverb = AEReverbModule(renderer: renderer) {
        reverb.dryWetMix = 0.08
        reverb.gain = 0
        reverb.minDelayTime = 0.001
        reverb.maxDelayTime = 0.008
        reverb.decayTimeAt0Hz = 1
        reverb.decayTimeAtNyquist = 0.8
        reverb.randomizeReflections = 600
        let effectModule = module.addEffect(reverb)
        effectModule.applingFor(.AmRecording, withCondition: .ThroughtAny, activate: true)
        self.reverbModule = reverb
    }
}

override func adjustParams(value: CGFloat) {
    super.adjustParams(value)
    var value = value
    value = value < -1.0 ? -1.0 : value
    value = value > 1.0 ? 1.0 : value

    let pitch = Double(-1800 + (value * 400))
    let dryWetMixReverb = Double((value * 0.07) + 0.08)

    self.reverbModule.dryWetMix = dryWetMixReverb
    self.timePitcherModule.pitch = pitch
}

It seems not work at all , anyone can help .Thx in advance !

Comments

  • @Maxime,

    I haven't tested this, but try to replicate the varispeed code placement that's in the "TAAESample" project that comes with TAAE2 GitHub repo, (starting on line #129 in AEAudioController.m):

    // Setup varispeed renderer. This is all performed on the audio thread, so the usual
        // rules apply: No holding locks, no memory allocation, no Objective-C/Swift code.
        AEVarispeedModule * varispeed = [[AEVarispeedModule alloc] initWithRenderer:renderer subrenderer:subrenderer];
        subrenderer.block = ^(const AERenderContext * _Nonnull context) {
            // Run all the players, though the mixer
            AEModuleProcess(mixer, context);
            
            // Put the resulting buffer on the output
            AERenderContextOutput(context, 1);
        };
        self.varispeed = varispeed;
    

    Try replacing the varispeed effect with newtimepitch. It seems like these two effects need their own subrenderer to be performed on the audio thread.

    Please let us know if it works for you!

    Take care,
    Mark

  • @markjeschke
    For now , I look into the TAAE samples , and I realized that , I need a new subRenderer , the frames ,the abl , the timeStamp ,timestamp.mSampleTime,timeStamp.mFlags, what are they exactly ?

    init(renderer: AERenderer, forModule module:AudioOutputModule, forTrack track: Track) {
        if let newTimePitch = AENewTimePitchModule(renderer: renderer, subrenderer: renderer) {
    
            newTimePitch.rate = 1.0/32.0
            newTimePitch.pitch = -1800.0
            newTimePitch.overlap = 8.0
            newTimePitch.enablePeakLocking = 0
    
            let frames: UInt32 = 1
            let abl = AEAudioBufferListCreate(Int32(frames))
            var timeStamp = AudioTimeStamp()
            timeStamp.mFlags = kAudioFormatFlagIsNonInterleaved
            AERendererRun(renderer, abl, frames, timeStamp)
    
            let effectModule = module.addEffect(newTimePitch)
            effectModule.applingFor(.AmRecording, withCondition: .ThroughtAny, activate: true)
            self.timePitcherModule = newTimePitch
            print(timePitcherModule.pitch)
    
        }
    

    as above in the code , if I use one renderer both for renderer and sburenderer , is that okay ?

Sign In or Register to comment.