-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
DrumSynths.swift
96 lines (78 loc) · 3.17 KB
/
DrumSynths.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Copyright AudioKit. All Rights Reserved. Revision History at http://github.com/AudioKit/AudioKit/
import AVFoundation
import CAudioKit
#if !os(tvOS)
/// Kick Drum Synthesizer Instrument
public class SynthKick: MIDIInstrument {
var generator: OperationGenerator
/// Create the synth kick voice
///
/// - Parameter midiInputName: Name of the instrument's MIDI input.
public override init(midiInputName: String? = nil) {
generator = OperationGenerator {
let frequency = Operation.lineSegment(trigger: Operation.trigger, start: 120, end: 40, duration: 0.03)
let volumeSlide = Operation.lineSegment(trigger: Operation.trigger, start: 1, end: 0, duration: 0.3)
return Operation.sineWave(frequency: frequency, amplitude: volumeSlide)
.moogLadderFilter(cutoffFrequency: Operation.parameters[0],
resonance: Operation.parameters[1])
}
super.init(midiInputName: midiInputName)
avAudioUnit = generator.avAudioUnit
avAudioNode = generator.avAudioNode
generator.start()
}
/// Function to start, play, or activate the node, all do the same thing
public override func play(noteNumber: MIDINoteNumber, velocity: MIDIVelocity, channel: MIDIChannel = 0) {
generator.parameter1 = (AUValue(velocity) / 127.0 * 366.0) + 300.0
generator.parameter2 = 1.0 - AUValue(velocity) / 127.0
generator.trigger()
}
/// Unneeded stop function since the sounds all decay quickly
public override func stop(noteNumber: MIDINoteNumber) {
// Unneeded
}
}
/// Snare Drum Synthesizer Instrument
public class SynthSnare: MIDIInstrument {
var generator: OperationGenerator
var duration = 0.143
/// Create the synth snare voice
public init(duration: Double = 0.143, resonance: AUValue = 0.9) {
self.duration = duration
self.resonance = resonance
generator = OperationGenerator {
let volSlide = Operation.lineSegment(
trigger: Operation.trigger,
start: 1,
end: 0,
duration: duration)
return Operation.whiteNoise(amplitude: volSlide)
.moogLadderFilter(cutoffFrequency: Operation.parameters[0],
resonance: Operation.parameters[1])
}
super.init()
avAudioUnit = generator.avAudioUnit
avAudioNode = generator.avAudioNode
generator.start()
}
internal var cutoff: AUValue = 1_666 {
didSet {
generator.parameter1 = cutoff
}
}
internal var resonance: AUValue = 0.3 {
didSet {
generator.parameter2 = resonance
}
}
/// Function to start, play, or activate the node, all do the same thing
public override func play(noteNumber: MIDINoteNumber, velocity: MIDIVelocity, channel: MIDIChannel) {
generator.parameter1 = (AUValue(velocity) / 127.0 * 1_600.0) + 300.0
generator.trigger()
}
/// Unneeded stop function since the sounds all decay quickly
public override func stop(noteNumber: MIDINoteNumber) {
// Unneeded
}
}
#endif