iosswiftfrequencyaudiokitmodulation

AudioKit: how to perform frequency modulation for AKPlayer


I'm trying to perform frequency modulation on a signal coming from AKPlayer, which in return plays a mp3 file. I've tried to work with AKOperationEffect, but it doesn't work as expected:

let modulatedPlayer = AKOperationEffect(player) { player, _ in

                let oscillator = AKOperation.fmOscillator(baseFrequency: modulationFrequency,
                                                          carrierMultiplier: player.toMono(),
                               modulatingMultiplier: 100,
                               modulationIndex: 0,
                               amplitude: 1)
              return oscillator
            }

Has anybody an idea how to get the mp3 modulated? Unfortunately, the AudioKit API is not so well documented .... there are a tons of examples, but they all deal with synthetic sounds such as sine, square waves etc.


Solution

  • I took the time to create a working practical example to help you @Ulrich, you can drop and play if you have the playground environment available, or just use it as a reference trusting me it works to amend your code, it's self-explanatory but you can read more about why my version work after the code TLDR;

    Before <audio>

    After <audio>

    The following was tested and ran without problems in the latest XCode and Swift at the time of writing (XCode 11.4, Swift 5.2 and AudioKit 4.9.5):

    import AudioKitPlaygrounds
    import AudioKit
    
    let audiofile = try! AKAudioFile(readFileName: "demo.mp3")
    let player = AKPlayer(audioFile: audiofile)
    let generator = AKOperationEffect(player) { player, _ in
        let oscillator = AKOperation.fmOscillator(baseFrequency: 400,
        carrierMultiplier: player.toMono(),
        modulatingMultiplier: 100,
        modulationIndex: 0,
        amplitude: 1)
        return oscillator
    }
    
    AudioKit.output = generator
    try! AudioKit.start()
    
    player.play()
    generator.start()
    

    Find the playground ready to use in the Download page ( https://audiokit.io/downloads/ )

    As you can see, apart from declaring a path to the mp3 file when initializing a new AKAudioFile and passing to an AKPlayer instance, there are three steps that you need to occur in a certain order:

    1) Assign an `AKNode` to the AudioKit output
    2) Start the AudioKit engine
    3) Start the `player` to generate output
    4) Start the generator to moderate your sound
    

    The best way to understand why this is to forget about code for a bit and imagine patching things in the real world; and finally, try to imagine the audio flow.

    Hope this helps you and future readers!