Created
May 29, 2018 13:28
-
-
Save mdales/fe362d54568eece5eccff8135df5cf34 to your computer and use it in GitHub Desktop.
This file contains 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
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