Skip to content

Commit 35353b3

Browse files
committed
Completed adding the Talkbox
1 parent e75434d commit 35353b3

File tree

3 files changed

+58
-12
lines changed

3 files changed

+58
-12
lines changed

Sources/CSoundpipeAudioKit/Effects/Talkbox.mm

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010

1111
class TalkboxDSP : public SoundpipeDSPBase {
1212
private:
13-
sp_talkbox *talkbox;
13+
sp_talkbox *talkboxL;
14+
sp_talkbox *talkboxR;
1415
ParameterRamper qualityRamp{1.0};
1516

1617
public:
@@ -21,32 +22,43 @@
2122

2223
void init(int channelCount, double sampleRate) override {
2324
SoundpipeDSPBase::init(channelCount, sampleRate);
24-
sp_talkbox_create(&talkbox);
25-
sp_talkbox_init(sp, talkbox);
25+
sp_talkbox_create(&talkboxL);
26+
sp_talkbox_init(sp, talkboxL);
27+
sp_talkbox_create(&talkboxR);
28+
sp_talkbox_init(sp, talkboxR);
2629
}
2730

2831
void deinit() override {
2932
SoundpipeDSPBase::deinit();
30-
sp_talkbox_destroy(&talkbox);
33+
sp_talkbox_destroy(&talkboxL);
34+
sp_talkbox_destroy(&talkboxR);
3135
}
3236

3337
void reset() override {
3438
SoundpipeDSPBase::reset();
3539
if (!isInitialized) return;
36-
sp_talkbox_init(sp, talkbox);
40+
sp_talkbox_init(sp, talkboxL);
41+
sp_talkbox_init(sp, talkboxR);
3742
}
3843

3944
void process(FrameRange range) override {
4045
for (int i : range) {
41-
float sourceIn = inputSample(0, i); // source input (first input stream)
42-
float excitationIn = input2Sample(0, i); // excitation input (second input stream)
43-
float outSample;
46+
float sourceInL = inputSample(0, i); // modulator input left
47+
float sourceInR = inputSample(1, i); // modulator input right
48+
float excitationInL = input2Sample(0, i); // carrier input left
49+
float excitationInR = input2Sample(1, i); // carrier input right
50+
float outSampleL;
51+
float outSampleR;
4452

45-
talkbox->quality = qualityRamp.getAndStep();
46-
47-
sp_talkbox_compute(sp, talkbox, &sourceIn, &excitationIn, &outSample);
53+
float quality = qualityRamp.getAndStep();
54+
talkboxL->quality = quality;
55+
talkboxR->quality = quality;
4856

49-
outputSample(0, i) = outSample;
57+
sp_talkbox_compute(sp, talkboxL, &sourceInL, &excitationInL, &outSampleL);
58+
sp_talkbox_compute(sp, talkboxR, &sourceInR, &excitationInR, &outSampleR);
59+
60+
outputSample(0, i) = outSampleL;
61+
outputSample(1, i) = outSampleR;
5062
}
5163
}
5264
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright AudioKit. All Rights Reserved. Revision History at http://github.com/AudioKit/AudioKit/
2+
3+
import AudioKit
4+
import SoundpipeAudioKit
5+
import XCTest
6+
import AVFoundation
7+
8+
class TalkboxTests: XCTestCase {
9+
func testTalkbox() {
10+
let engine = AudioEngine()
11+
12+
let url = Bundle.module.url(forResource: "12345", withExtension: "wav", subdirectory: "TestResources")!
13+
let source = AudioPlayer(url: url)!
14+
15+
// Excitation/carrier (harmonically rich signal)
16+
let excitation = DynamicOscillator(waveform: Table(.sawtooth), frequency: 220, amplitude: 1.0)
17+
18+
// Create talkbox with both signals
19+
let talkbox = Talkbox(source, excitation: excitation)
20+
21+
engine.output = talkbox
22+
23+
let audio = engine.startTest(totalDuration: 5.0)
24+
25+
// Start both signals
26+
source.play()
27+
excitation.play()
28+
29+
audio.append(engine.render(duration: 5.0))
30+
31+
testMD5(audio)
32+
}
33+
}

Tests/SoundpipeAudioKitTests/ValidatedMD5s.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,5 @@ let validatedMD5s: [String: String] = [
5050
"-[PhaseLockedVocoderTests testDefault]": "eb9fe2d8ee2e3b3d6527a4e139c2686e",
5151
"-[PitchTapTests testBasic]": "5b6ae6252df77df298996a7367a00a9e",
5252
"-[PluckedStringTests testDefault]": "3f13907e6e916b7a4bf6046a4cbf0764",
53+
"-[TalkboxTests testTalkbox]": "3ce43649658faa30bdb46124e48d00fb",
5354
]

0 commit comments

Comments
 (0)