Skip to content

Instantly share code, notes, and snippets.

@davidfloegel
Last active July 13, 2020 18:52
Show Gist options
  • Save davidfloegel/fa662b32a861aee6e8a698580374f8ea to your computer and use it in GitHub Desktop.
Save davidfloegel/fa662b32a861aee6e8a698580374f8ea to your computer and use it in GitHub Desktop.
//
// 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