2016-04-15 14 views
0

Ich versuche, mein iPhone eine Melodie spielen zu lassen, ohne zuvor aufgezeichnete Dateien zu verwenden. Was sind meine Möglichkeiten hier? AVAudioEngine, AudioKit? Ich habe sie angeschaut, aber die Lernkurve ist relativ steil für etwas, von dem ich hoffe, dass es einfach ist. Sie erscheinen auch als Werkzeuge zum Erzeugen von Klangeffekten bei einem PCM-Pufferfenster.Wie kann ich ein iOS-Gerät programmgesteuert Musik wiedergeben lassen?

Ich möchte in der Lage sein, etwas zu tun wie

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

Vorzugsweise wie ein Instrument klingen oder zumindest nicht wie eine reine Sinuswelle.

Antwort

0

EDIT: Der Code unten wurde von AudioKit

Für jeden fragen, diese ersetzt worden ist; Ich habe es (irgendwie) funktionieren lassen, indem ich Code ähnlich dem folgenden verwendet habe.

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 
    } 
} 

Aber es klingt nicht gut genug, so dass ich mit Abtasten der Notizen gegangen ich brauche und nur stattdessen AVAudioPlayer sie zu spielen.

Verwandte Themen