2016-04-15 9 views
0

私は自分のiPhoneをあらかじめ録音したファイルを使わずに曲を作ろうとしています。私の選択肢は何ですか? AVAudioEngine、AudioKit?私はそれらを見てきましたが、学習曲線は、私が望んでいるものが比較的簡単です。彼らはまた、PCMバッファウィンドウが与えられていると、効果的な効果を作り出すツールのように思えます。iOSデバイスで音楽をプログラム的に再生させるにはどうすればよいですか?

私は

pitchCreator.play(["C4", "E4", "G4"], durations: [1, 1, 1]) 

。好ましくは、楽器のように聞こえるか、少なくとも純粋な正弦波を好きではないような何かをできるようにしたいと思います。

答えて

0

EDIT:次のコードはこれを不思議誰にもAudioKit

に置き換えられました。私はそれを以下のようなコードを使って動作させました。

class PitchCreator { 
    var engine: AVAudioEngine 
    var player: AVAudioPlayerNode 
    var mixer: AVAudioMixerNode 
    var buffer: AVAudioPCMBuffer 

    init() { 
    engine = AVAudioEngine() 
    player = AVAudioPlayerNode() 
    mixer = engine.mainMixerNode; 
    buffer = AVAudioPCMBuffer(PCMFormat: player.outputFormatForBus(0), frameCapacity: 100) 
    buffer.frameLength = 4096 
    engine.attachNode(player) 
    engine.connect(player, to: mixer, format: player.outputFormatForBus(0)) 
    } 

    func play(frequency: Float) { 
    let signal = self.createSignal(frequency, amplitudes: [1.0, 0.5, 0.3, 0.1], bufferSize: Int(buffer.frameLength), sampleRate: Float(mixer.outputFormatForBus(0).sampleRate)) 
    for i in 0 ..< signal.count { 
     buffer.floatChannelData.memory[i] = 0.5 * signal[i] 
    } 
    do { 
     try engine.start() 
     player.play() 
     player.scheduleBuffer(buffer, atTime: nil, options: .Loops, completionHandler: nil) 
    } catch {} 
    } 

    func stop() { 
    engine.stop() 
    player.stop() 
    } 

    func createSignal(frequency: Float, amplitudes: [Float], bufferSize: Int, sampleRate: Float) -> [Float] { 
    let π = Float(M_PI) 
    let T = sampleRate/frequency 
    var x = [Float](count: bufferSize, repeatedValue: 0.0) 
    for k in 0 ..< x.count { 
     for h in 0 ..< amplitudes.count { 
     x[k] += amplitudes[h] * sin(2.0 * π * Float(h + 1) * Float(k)/T) 
     } 
    } 
    return x 
    } 
} 

しかし私は必要な音符をサンプリングして、代わりにAVAudioPlayerを使用して再生しています。

関連する問題