2009-06-25 16 views
5

録音されたオーディオをディスクに保存したり、(リアルタイムで)再生したときの音程を変更する方法を探しています。私はオーディオユニットがこれに使用できることを理解しています。 iPhoneはオーディオユニットのサポートが限られています(たとえば、カスタムオーディオユニットを作成/使用することはできません)がありますが、すぐに利用できるオーディオユニットがいくつかあります。そのうちの1つはAUPitchです。iPhoneでオーディオユニットを使用する方法

どのようにオーディオユニット(具体的にはAUPitch)を使用しますか?あなたは何とかオーディオキューにそれをフックしますか?オーディオユニットを連鎖させることは可能ですか(たとえば、エコーエフェクトとピッチの変更を同時に追加するなど)

EDIT:iPhone SDKのヘッダーを調べた後(私はAudioUnit.hと思うが、今はMacの前ではない)、AUPitchがコメントアウトされていることに気づいた。結局のところ、AUPitchはiPhone上で利用できるようには見えません。言っなどAUPitchへの参照を見つけることが、今のより困難、

、私は」 - 水抜き水抜き

Appleは後半のdeveloper.apple.comで自分のiPhone SDKのドキュメントを組織し、より良い持っているようです私はまだiPhoneでAudio Units(一般的に)を使用しているときの質の高い回答に興味があります。

答えて

4

ここには、RemoteIOオーディオユニットを使用するための非常に良いリソースがあります(http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/)。 iPhoneのAudio Unitsでの私の経験では、コールバック関数で手動で変換を実装できることが分かりました。そうすることで、あなたが問題を解決するかもしれません。

1

iPhoneのピッチを変更することについては、OpenALが道のりです。ピッチをサポートするOpenALサウンドエンジンの素晴らしい例は、www.71squared.comのSoundManagerクラスをご覧ください。

+0

OpenALはリアルタイムの音程変化のみをサポートしていますので、変更されたオーディオを保存することはできません – hyd00

0
- (void)modifySpeedOf:(CFURLRef)inputURL byFactor:(float)factor andWriteTo:(CFURLRef)outputURL { 

    ExtAudioFileRef inputFile = NULL; 
    ExtAudioFileRef outputFile = NULL; 

    AudioStreamBasicDescription destFormat; 

    destFormat.mFormatID = kAudioFormatLinearPCM; 
    destFormat.mFormatFlags = kAudioFormatFlagsCanonical; 
    destFormat.mSampleRate = 44100 * factor; 
    destFormat.mBytesPerPacket = 2; 
    destFormat.mFramesPerPacket = 1; 
    destFormat.mBytesPerFrame = 2; 
    destFormat.mChannelsPerFrame = 1; 
    destFormat.mBitsPerChannel = 16; 
    destFormat.mReserved = 0; 

    ExtAudioFileCreateWithURL(outputURL, kAudioFileCAFType, 
           &destFormat, NULL, kAudioFileFlags_EraseFile, &outputFile); 

    ExtAudioFileOpenURL(inputURL, &inputFile); 

    //find out how many frames is this file long 
    SInt64 length = 0; 
    UInt32 dataSize2 = (UInt32)sizeof(length); 
    ExtAudioFileGetProperty(inputFile, 
          kExtAudioFileProperty_FileLengthFrames, &dataSize2, &length); 

    SInt16 *buffer = (SInt16*)malloc(kBufferSize * sizeof(SInt16)); 

    UInt32 totalFramecount = 0; 

    AudioBufferList bufferList; 
    bufferList.mNumberBuffers = 1; 
    bufferList.mBuffers[0].mNumberChannels = 1; 
    bufferList.mBuffers[0].mData = buffer; // pointer to buffer of audio data 
    bufferList.mBuffers[0].mDataByteSize = kBufferSize * 
    sizeof(SInt16); // number of bytes in the buffer 

    while(true) { 

     UInt32 frameCount = kBufferSize * sizeof(SInt16)/2; 
     // Read a chunk of input 
     ExtAudioFileRead(inputFile, &frameCount, &bufferList); 
     totalFramecount += frameCount; 

     if (!frameCount || totalFramecount >= length) { 
      //termination condition 
      break; 
     } 
     ExtAudioFileWrite(outputFile, frameCount, &bufferList); 
    } 

    free(buffer); 

    ExtAudioFileDispose(inputFile); 
    ExtAudioFileDispose(outputFile); 

} 

それは私が、前にこのためNewTimePitchオーディオユニットを使用しましたそのためのオーディオコンポーネント説明が

var newTimePitchDesc = AudioComponentDescription(componentType: kAudioUnitType_FormatConverter, 
     componentSubType: kAudioUnitSubType_NewTimePitch, 
     componentManufacturer: kAudioUnitManufacturer_Apple, 
     componentFlags: 0, 
     componentFlagsMask: 0) 

、あなたは、ピッチを変更することができている要因

0

に基づいてピッチを変更しますパラメータにAudioUnitSetParamaterを呼び出します。たとえば、これは-1000セント

err = AudioUnitSetParameter(newTimePitchAudioUnit, 
     kNewTimePitchParam_Pitch, 
     kAudioUnitScope_Global, 
     0, 
     -1000, 
     0) 

でピッチを変更

// Parameters for AUNewTimePitch 
enum { 
     // Global, rate, 1/32 -> 32.0, 1.0 
    kNewTimePitchParam_Rate       = 0, 
     // Global, Cents, -2400 -> 2400, 1.0 
    kNewTimePitchParam_Pitch      = 1, 
     // Global, generic, 3.0 -> 32.0, 8.0 
    kNewTimePitchParam_Overlap      = 4, 
     // Global, Boolean, 0->1, 1 
    kNewTimePitchParam_EnablePeakLocking   = 6 
}; 

に従いますが、あなただけの目的のためにピッチパラメータを変更する必要がありますように、このオーディオユニットのパラメータがあります。これを実装する方法のガイドについては、ジャスティンの答えを参照してください。

関連する問題