Last active
July 13, 2020 18:52
-
-
Save davidfloegel/fa662b32a861aee6e8a698580374f8ea to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// FListener.swift | |
// harmonic | |
// | |
// Created by David Floegel on 05/07/2020. | |
// | |
import Foundation | |
import AudioKit | |
@objc(FListener) | |
class FListener: NSObject { | |
var mic: AKMicrophone! | |
var tracker: AKFrequencyTracker! | |
var silence: AKBooster! | |
var startTime: TimeInterval = 0 | |
var recordedFrequencies: [[Double]] = [] | |
var timer: Timer? | |
override init() { | |
super.init() | |
self.deinitListener() | |
} | |
@objc | |
static func requiresMainQueueSetup() -> Bool { | |
return true | |
} | |
@objc | |
func initListener() { | |
try? AudioKit.stop() | |
AKSettings.audioInputEnabled = true | |
self.mic = AKMicrophone() | |
let filter = AKLowPassFilter(self.mic) | |
filter.cutoffFrequency = 20000 | |
filter.resonance = 0 | |
self.tracker = AKFrequencyTracker(filter) | |
self.silence = AKBooster(tracker, gain: 0) | |
self.tracker.stop() | |
AudioKit.output = self.silence | |
try? AudioKit.start() | |
} | |
@objc | |
func deinitListener() { | |
do { | |
try AudioKit.stop() | |
} catch { | |
print(error) | |
} | |
} | |
@objc | |
func startListening() { | |
self.startTime = NSDate().timeIntervalSince1970 | |
self.tracker.start() | |
DispatchQueue.main.async(execute: { | |
Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.collectFrequencies), userInfo: nil, repeats: true) | |
print("Timer started") | |
}) | |
} | |
@objc | |
func stopTracking() { | |
self.timer?.invalidate() | |
self.tracker.stop() | |
} | |
@objc | |
func collectFrequencies() { | |
if (self.tracker != nil && self.tracker.isStarted) { | |
let f = self.tracker.frequency | |
let a = self.tracker.amplitude | |
let t = NSDate().timeIntervalSince1970 - self.startTime | |
if f > 100 && f <= 900 { | |
self.recordedFrequencies.append([t, f, a]) | |
} | |
} | |
} | |
@objc | |
func listen(_ callback: RCTResponseSenderBlock) { | |
if (self.tracker != nil && self.tracker.isStarted) { | |
let f = self.tracker.frequency | |
let a = self.tracker.amplitude | |
let t = NSDate().timeIntervalSince1970 - self.startTime | |
if f > 100 && f <= 900 { | |
self.recordedFrequencies.append([t, f, a]) | |
callback([f, a]) | |
} | |
} | |
} | |
@objc | |
func getFrequencies(_ callback: RCTResponseSenderBlock) { | |
callback([self.recordedFrequencies]) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment