How do I synthesize sounds with CoreAudio on iPhone/Mac

后端 未结 3 647
清歌不尽
清歌不尽 2021-01-30 05:38

I\'d like to play a synthesised sound in an iPhone. Instead of using a pre-recorded sound and using SystemSoundID to play an existing binary, I\'d like to synthesise it. Partial

3条回答
  •  我在风中等你
    2021-01-30 06:24

    Davide Vosti's link to http://lists.apple.com/archives/coreaudio-api/2008/Dec/msg00173.html no longer works, since Apple lists seem to be unresponsive. Here is Google's cache for completeness.

    //
    //  AudioUnitTestAppDelegate.m
    //  AudioUnitTest
    //
    //  Created by Marc Vaillant on 11/25/08.
    //  Copyright __MyCompanyName__ 2008. All rights reserved.
    //
    
    #import "AudioUnitTestAppDelegate.h"
    #include 
    //#include "MachTimer.hpp"
    #include 
    #include 
    
    using namespace std;
    
    #define kOutputBus 0
    #define kInputBus 1
    #define SAMPLE_RATE 44100
    
    vector _pcm;
    int _index;
    
    @implementation AudioUnitTestAppDelegate
    
    @synthesize window;
    
    void generateTone(
                    vector& pcm, 
                    int freq, 
                    double lengthMS, 
                    int sampleRate, 
                    double riseTimeMS, 
                    double gain)
    {
      int numSamples = ((double) sampleRate) * lengthMS / 1000.;
      int riseTimeSamples = ((double) sampleRate) * riseTimeMS / 1000.;
    
      if(gain > 1.)
        gain = 1.;
      if(gain < 0.)
        gain = 0.;
    
      pcm.resize(numSamples);
    
      for(int i = 0; i < numSamples; ++i)
      {
        double value = sin(2. * M_PI * freq * i / sampleRate);
        if(i < riseTimeSamples)
          value *= sin(i * M_PI / (2.0 * riseTimeSamples));
        if(i > numSamples - riseTimeSamples - 1)
          value *= sin(2. * M_PI * (i - (numSamples - riseTimeSamples) + riseTimeSamples)/ (4. * riseTimeSamples));
    
        pcm[i] = (int) (value * 32500.0 * gain);
        pcm[i] += (pcm[i]<<16);
      }
    
    }
    
    static OSStatus playbackCallback(void *inRefCon, 
                                      AudioUnitRenderActionFlags *ioActionFlags, 
                                      const AudioTimeStamp *inTimeStamp, 
                                      UInt32 inBusNumber, 
                                      UInt32 inNumberFrames, 
                                      AudioBufferList *ioData) 
    {    
        cout<<"index = "<<_index<
                                                            
提交回复
热议问题