Skip to content

Instantly share code, notes, and snippets.

@mdales
Created May 29, 2018 13:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mdales/fe362d54568eece5eccff8135df5cf34 to your computer and use it in GitHub Desktop.
Save mdales/fe362d54568eece5eccff8135df5cf34 to your computer and use it in GitHub Desktop.
import Foundation
struct SoundSample {}
class Effect: Codable {
// Properties we are intersted in
var name: String = ""
var active: Bool = true
init() {
self.name = ""
self.active = true
}
func doEffect(_ s: SoundSample) -> Void {}
// stuff for encoding
private enum CodingKeys: CodingKey {
case name, active
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.name = try container.decode(String.self, forKey: .name)
self.active = try container.decode(Bool.self, forKey: .active)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(name, forKey: .name)
try container.encode(active, forKey: .active)
}
}
class ReverbEffect: Effect {
var delay = 3.2
var feedback = 40.0
override init() {
super.init()
self.name = "Reverb"
}
override func doEffect(_ s: SoundSample) -> Void { /* some custom reverb code here */ }
// stuff for encoding
private enum CodingKeys: CodingKey {
case delay, feedback
}
required init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
self.delay = try container.decode(Double.self, forKey: .delay)
self.feedback = try container.decode(Double.self, forKey: .feedback)
}
override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(delay, forKey: .delay)
try container.encode(feedback, forKey: .feedback)
}
}
class DistortionEffect: Effect {
var gain = 1.5
var tone = 6.0
override init() {
super.init()
self.name = "Distortion"
}
override func doEffect(_ s: SoundSample) -> Void { /* some custom distortion code here */ }
// stuff for encoding
private enum CodingKeys: CodingKey {
case gain, tone
}
required init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
self.gain = try container.decode(Double.self, forKey: .gain)
self.tone = try container.decode(Double.self, forKey: .tone)
}
override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(gain, forKey: .gain)
try container.encode(tone, forKey: .tone)
}
}
let effectsChain = [ReverbEffect(), DistortionEffect()]
// normal operations will be things like this:
let s = SoundSample()
for effect in effectsChain {
effect.doEffect(s)
}
// Then play sample
// Save our chain as JSON for saving and restoring
do {
let jsonData = try JSONEncoder().encode(effectsChain)
let jsonString = String(data: jsonData, encoding: .utf8)
if let json = jsonString {
print(json)
}
// now restore
let newChain = try? JSONDecoder().decode([Effect].self, from:jsonData)
if let new = newChain {
print("We restored the chain: %@", new)
}
} catch {
// blah
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment