beeps 0.3.6 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.doc/ext/beeps/beeps.cpp +7 -0
- data/.doc/ext/beeps/high_pass.cpp +63 -0
- data/.doc/ext/beeps/low_pass.cpp +63 -0
- data/.doc/ext/beeps/native.cpp +8 -0
- data/.doc/ext/beeps/oscillator.cpp +87 -10
- data/.doc/ext/beeps/processor.cpp +14 -1
- data/.doc/ext/beeps/reverb.cpp +99 -0
- data/.doc/ext/beeps/signals.cpp +128 -0
- data/ChangeLog.md +24 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/beeps.gemspec +2 -2
- data/ext/beeps/beeps.cpp +8 -0
- data/ext/beeps/high_pass.cpp +66 -0
- data/ext/beeps/low_pass.cpp +66 -0
- data/ext/beeps/native.cpp +8 -0
- data/ext/beeps/oscillator.cpp +95 -12
- data/ext/beeps/processor.cpp +15 -1
- data/ext/beeps/reverb.cpp +106 -0
- data/ext/beeps/signals.cpp +136 -0
- data/include/beeps/beeps.h +2 -2
- data/include/beeps/defs.h +3 -0
- data/include/beeps/filter.h +118 -17
- data/include/beeps/generator.h +50 -17
- data/include/beeps/processor.h +23 -6
- data/include/beeps/ruby/filter.h +33 -0
- data/include/beeps/ruby/signals.h +40 -0
- data/include/beeps/signals.h +1 -1
- data/lib/beeps/processor.rb +46 -1
- data/lib/beeps/signals.rb +19 -0
- data/lib/beeps.rb +1 -0
- data/src/analyser.cpp +34 -37
- data/src/beeps.cpp +7 -6
- data/src/envelope.cpp +60 -46
- data/src/file_in.cpp +6 -6
- data/src/gain.cpp +5 -5
- data/src/high_pass.cpp +57 -0
- data/src/low_pass.cpp +57 -0
- data/src/mic_in.cpp +16 -14
- data/src/mixer.cpp +38 -20
- data/src/oscillator.cpp +260 -168
- data/src/pitch_shift.cpp +6 -6
- data/src/processor.cpp +118 -11
- data/src/processor.h +8 -0
- data/src/reverb.cpp +124 -0
- data/src/sequencer.cpp +18 -14
- data/src/signals.cpp +264 -106
- data/src/signals.h +28 -89
- data/src/sound.cpp +28 -20
- data/src/time_stretch.cpp +6 -6
- data/src/win32/signals.cpp +8 -7
- data/src/x_pass.h +51 -0
- data/test/helper.rb +14 -0
- data/test/test_analyser.rb +26 -0
- data/test/test_envelope.rb +55 -0
- data/test/test_file_in.rb +22 -1
- data/test/test_gain.rb +28 -0
- data/test/test_high_pass.rb +41 -0
- data/test/test_low_pass.rb +41 -0
- data/test/test_mixer.rb +63 -0
- data/test/test_oscillator.rb +58 -0
- data/test/test_pitch_shift.rb +32 -0
- data/test/test_processor.rb +7 -0
- data/test/test_signals.rb +60 -0
- data/test/test_time_stretch.rb +36 -0
- metadata +48 -10
data/src/signals.cpp
CHANGED
@@ -6,7 +6,6 @@
|
|
6
6
|
#include <algorithm>
|
7
7
|
#include <AudioFile.h>
|
8
8
|
#include <CDSPResampler.h>
|
9
|
-
#include "beeps/beeps.h"
|
10
9
|
#include "beeps/exception.h"
|
11
10
|
|
12
11
|
|
@@ -14,6 +13,87 @@ namespace Beeps
|
|
14
13
|
{
|
15
14
|
|
16
15
|
|
16
|
+
class Frames : public stk::StkFrames
|
17
|
+
{
|
18
|
+
|
19
|
+
typedef stk::StkFrames Super;
|
20
|
+
|
21
|
+
public:
|
22
|
+
|
23
|
+
Frames (
|
24
|
+
unsigned int nframes = 0,
|
25
|
+
unsigned int nchannels = 1,
|
26
|
+
double sample_rate = 0)
|
27
|
+
: Super(nframes, nchannels)
|
28
|
+
{
|
29
|
+
if (sample_rate == 0)
|
30
|
+
sample_rate = Beeps::sample_rate();
|
31
|
+
|
32
|
+
if (nframes <= 0)
|
33
|
+
argument_error(__FILE__, __LINE__);
|
34
|
+
if (nchannels <= 0)
|
35
|
+
argument_error(__FILE__, __LINE__);
|
36
|
+
if (sample_rate <= 0)
|
37
|
+
argument_error(__FILE__, __LINE__);
|
38
|
+
|
39
|
+
setDataRate(sample_rate);
|
40
|
+
}
|
41
|
+
|
42
|
+
Frames (const Frames& obj)
|
43
|
+
: Super(obj)
|
44
|
+
{
|
45
|
+
setDataRate(obj.dataRate());
|
46
|
+
}
|
47
|
+
|
48
|
+
void slice (uint start_, uint end_)
|
49
|
+
{
|
50
|
+
assert(!saved_data_);
|
51
|
+
|
52
|
+
size_t start = start_;
|
53
|
+
size_t end = end_;
|
54
|
+
if (start > nFrames_ || end > nFrames_)
|
55
|
+
argument_error(__FILE__, __LINE__);
|
56
|
+
|
57
|
+
saved_data_ = data_;
|
58
|
+
saved_nFrames_ = nFrames_;
|
59
|
+
saved_size_ = size_;
|
60
|
+
saved_bufferSize_ = bufferSize_;
|
61
|
+
|
62
|
+
data_ += start * nChannels_;
|
63
|
+
nFrames_ = end - start;
|
64
|
+
size_ = nFrames_ * nChannels_;
|
65
|
+
bufferSize_ = size_;
|
66
|
+
}
|
67
|
+
|
68
|
+
void unslice ()
|
69
|
+
{
|
70
|
+
assert(saved_data_);
|
71
|
+
|
72
|
+
data_ = saved_data_;
|
73
|
+
nFrames_ = saved_nFrames_;
|
74
|
+
size_ = saved_size_;
|
75
|
+
bufferSize_ = saved_bufferSize_;
|
76
|
+
|
77
|
+
saved_data_ = NULL;
|
78
|
+
saved_nFrames_ = 0;
|
79
|
+
saved_size_ = 0;
|
80
|
+
saved_bufferSize_ = 0;
|
81
|
+
}
|
82
|
+
|
83
|
+
const Sample* data () const
|
84
|
+
{
|
85
|
+
return data_;
|
86
|
+
}
|
87
|
+
|
88
|
+
private:
|
89
|
+
|
90
|
+
Sample* saved_data_ = NULL;
|
91
|
+
|
92
|
+
size_t saved_nFrames_ = 0, saved_size_ = 0, saved_bufferSize_ = 0;
|
93
|
+
|
94
|
+
};// Frames
|
95
|
+
|
96
|
+
|
17
97
|
struct Signals::Data
|
18
98
|
{
|
19
99
|
|
@@ -27,16 +107,9 @@ namespace Beeps
|
|
27
107
|
Signals
|
28
108
|
Signals_create (uint capacity, uint nchannels, double sample_rate)
|
29
109
|
{
|
30
|
-
if (capacity <= 0)
|
31
|
-
argument_error(__FILE__, __LINE__);
|
32
|
-
if (nchannels <= 0)
|
33
|
-
argument_error(__FILE__, __LINE__);
|
34
|
-
|
35
|
-
if (sample_rate <= 0) sample_rate = Beeps::sample_rate();
|
36
|
-
|
37
110
|
Signals s;
|
38
|
-
s.self->frames.reset(
|
39
|
-
|
111
|
+
s.self->frames.reset(
|
112
|
+
new Frames(capacity * nchannels, nchannels, sample_rate));
|
40
113
|
return s;
|
41
114
|
}
|
42
115
|
|
@@ -47,25 +120,17 @@ namespace Beeps
|
|
47
120
|
{
|
48
121
|
if (!channels)
|
49
122
|
argument_error(__FILE__, __LINE__);
|
50
|
-
if (nsamples <= 0)
|
51
|
-
argument_error(__FILE__, __LINE__);
|
52
|
-
if (nchannels <= 0)
|
53
|
-
argument_error(__FILE__, __LINE__);
|
54
|
-
|
55
|
-
if (sample_rate <= 0) sample_rate = Beeps::sample_rate();
|
56
123
|
|
57
|
-
|
58
|
-
|
124
|
+
Signals s = Signals_create(nsamples, nchannels, sample_rate);
|
125
|
+
s.self->nsamples = nsamples;
|
59
126
|
|
60
127
|
for (uint channel = 0; channel < nchannels; ++channel)
|
61
128
|
{
|
62
|
-
|
63
|
-
|
129
|
+
Sample* p = Signals_at(&s, 0, channel);
|
130
|
+
for (uint i = 0; i < nsamples; ++i, p += nchannels)
|
131
|
+
*p = channels[channel][i];
|
64
132
|
}
|
65
133
|
|
66
|
-
Signals s;
|
67
|
-
s.self->frames.reset(frames);
|
68
|
-
s.self->nsamples = nsamples;
|
69
134
|
return s;
|
70
135
|
}
|
71
136
|
|
@@ -92,58 +157,112 @@ namespace Beeps
|
|
92
157
|
signals->self->frames->resize(capacity, signals->nchannels());
|
93
158
|
}
|
94
159
|
|
160
|
+
uint
|
161
|
+
Signals_tick (Signals* signals, std::function<void(stk::StkFrames*)> fun)
|
162
|
+
{
|
163
|
+
if (!signals)
|
164
|
+
argument_error(__FILE__, __LINE__);
|
165
|
+
if (!*signals)
|
166
|
+
argument_error(__FILE__, __LINE__);
|
167
|
+
|
168
|
+
fun(signals->self->frames.get());
|
169
|
+
Signals_set_nsamples(signals, signals->capacity());
|
170
|
+
return signals->nsamples();
|
171
|
+
}
|
172
|
+
|
173
|
+
uint
|
174
|
+
Signals_tick (
|
175
|
+
Signals* output, const Signals& input,
|
176
|
+
std::function<void(stk::StkFrames*, const stk::StkFrames&)> fun)
|
177
|
+
{
|
178
|
+
if (!output)
|
179
|
+
argument_error(__FILE__, __LINE__);
|
180
|
+
if (!*output)
|
181
|
+
argument_error(__FILE__, __LINE__);
|
182
|
+
if (!input)
|
183
|
+
argument_error(__FILE__, __LINE__);
|
184
|
+
|
185
|
+
Signals_clear(output, input.nsamples());
|
186
|
+
Signals_set_nsamples(output, output->capacity());
|
187
|
+
|
188
|
+
fun(output->self->frames.get(), *input.self->frames);
|
189
|
+
return output->nsamples();
|
190
|
+
}
|
191
|
+
|
192
|
+
uint
|
193
|
+
Signals_tick (
|
194
|
+
Signals* signals, uint start, uint end,
|
195
|
+
std::function<void(stk::StkFrames*)> fun)
|
196
|
+
{
|
197
|
+
if (!signals)
|
198
|
+
argument_error(__FILE__, __LINE__);
|
199
|
+
if (!*signals)
|
200
|
+
argument_error(__FILE__, __LINE__);
|
201
|
+
if (start > end)
|
202
|
+
argument_error(__FILE__, __LINE__);
|
203
|
+
|
204
|
+
if (start == 0 && end == signals->capacity())
|
205
|
+
return Signals_tick(signals, fun);
|
206
|
+
|
207
|
+
signals->self->frames->slice(start, end);
|
208
|
+
fun(signals->self->frames.get());
|
209
|
+
signals->self->frames->unslice();
|
210
|
+
Signals_set_nsamples(signals, end);
|
211
|
+
return end;
|
212
|
+
}
|
213
|
+
|
95
214
|
void
|
96
|
-
|
215
|
+
Signals_fill (Signals* signals, uint nsamples, Sample value)
|
97
216
|
{
|
98
|
-
|
217
|
+
if (!signals)
|
218
|
+
argument_error(__FILE__, __LINE__);
|
219
|
+
if (!*signals)
|
220
|
+
argument_error(__FILE__, __LINE__);
|
99
221
|
|
100
|
-
|
101
|
-
|
222
|
+
Signals_clear(signals);
|
223
|
+
Signals_set_nsamples(signals, nsamples);
|
102
224
|
|
103
|
-
|
104
|
-
size_t size =
|
225
|
+
Sample* p = Signals_at(signals, 0);
|
226
|
+
size_t size = nsamples * signals->nchannels();
|
105
227
|
for (size_t i = 0; i < size; ++i)
|
106
228
|
*p++ = value;
|
107
|
-
|
108
|
-
Signals_set_nsamples(signals, nsamples);
|
109
229
|
}
|
110
230
|
|
111
231
|
static uint
|
112
|
-
|
232
|
+
copy_samples (Signals* to, const Signals& from, uint from_offset)
|
113
233
|
{
|
114
234
|
assert(to && *to && from);
|
115
235
|
|
116
236
|
if (from_offset >= from.nsamples())
|
117
237
|
return 0;
|
118
238
|
|
119
|
-
uint
|
120
|
-
uint
|
121
|
-
uint
|
122
|
-
uint
|
123
|
-
|
124
|
-
|
239
|
+
uint to_nchannels = to->nchannels();
|
240
|
+
uint from_nchannels = from.nchannels();
|
241
|
+
uint to_offset = to->nsamples();
|
242
|
+
uint to_nsamples = to->capacity() - to_offset;
|
243
|
+
uint from_nsamples = from.nsamples();
|
244
|
+
uint copy_nsamples =
|
245
|
+
std::min(from_offset + to_nsamples, from_nsamples) - from_offset;
|
125
246
|
|
126
|
-
|
127
|
-
const Frames* from_frames = Signals_get_frames(&from);
|
128
|
-
assert(to_frames && from_frames);
|
129
|
-
|
130
|
-
for (uint channel = 0; channel < to_frames->nchannels(); ++channel)
|
247
|
+
for (uint channel = 0; channel < to_nchannels; ++channel)
|
131
248
|
{
|
132
|
-
uint from_channel
|
133
|
-
|
249
|
+
uint from_channel = channel < from_nchannels ? channel : 0;
|
250
|
+
Sample* to_p = Signals_at(to, to_offset, channel);
|
251
|
+
const Sample* from_p = Signals_at(from, from_offset, from_channel);
|
134
252
|
for (uint i = 0; i < copy_nsamples; ++i)
|
135
253
|
{
|
136
|
-
|
137
|
-
|
254
|
+
*to_p = *from_p;
|
255
|
+
to_p += to_nchannels;
|
256
|
+
from_p += from_nchannels;
|
138
257
|
}
|
139
258
|
}
|
140
259
|
|
141
|
-
to->self->nsamples
|
260
|
+
Signals_set_nsamples(to, to->self->nsamples + copy_nsamples);
|
142
261
|
return copy_nsamples;
|
143
262
|
}
|
144
263
|
|
145
264
|
static uint
|
146
|
-
|
265
|
+
resample (Signals* to, const Signals& from, uint from_offset)
|
147
266
|
{
|
148
267
|
assert(to && *to && from);
|
149
268
|
|
@@ -174,16 +293,12 @@ namespace Beeps
|
|
174
293
|
from.sample_rate(), to->sample_rate(), from_nsamples);
|
175
294
|
r8b::CFixedBuffer<double> from_buf(from_nsamples), to_buf(to_nsamples);
|
176
295
|
|
177
|
-
|
178
|
-
const Frames* from_frames = Signals_get_frames(&from);
|
179
|
-
assert(to_frames && from_frames);
|
180
|
-
|
181
|
-
for (uint channel = 0; channel < to_frames->nchannels(); ++channel)
|
296
|
+
for (uint channel = 0; channel < to->nchannels(); ++channel)
|
182
297
|
{
|
183
|
-
uint from_channel = channel <
|
298
|
+
uint from_channel = channel < from.nchannels() ? channel : 0;
|
184
299
|
|
185
300
|
for (uint i = 0; i < from_nsamples; ++i)
|
186
|
-
from_buf[i] =
|
301
|
+
from_buf[i] = *Signals_at(from, from_offset + i, from_channel);
|
187
302
|
|
188
303
|
resampler.clear();
|
189
304
|
resampler.oneshot(
|
@@ -191,10 +306,10 @@ namespace Beeps
|
|
191
306
|
(double*) to_buf, to_nsamples);
|
192
307
|
|
193
308
|
for (uint i = 0; i < to_nsamples; ++i)
|
194
|
-
|
309
|
+
*Signals_at(to, to_offset + i, channel) = to_buf[i];
|
195
310
|
}
|
196
311
|
|
197
|
-
to->self->nsamples
|
312
|
+
Signals_set_nsamples(to, to->self->nsamples + to_nsamples);
|
198
313
|
return from_nsamples;
|
199
314
|
}
|
200
315
|
|
@@ -211,9 +326,9 @@ namespace Beeps
|
|
211
326
|
Signals_clear(to);
|
212
327
|
|
213
328
|
if (to->sample_rate() == from.sample_rate())
|
214
|
-
return
|
329
|
+
return copy_samples(to, from, from_offset);
|
215
330
|
else
|
216
|
-
return
|
331
|
+
return resample(to, from, from_offset);
|
217
332
|
}
|
218
333
|
|
219
334
|
void
|
@@ -224,14 +339,13 @@ namespace Beeps
|
|
224
339
|
if (signals->nchannels() != add.nchannels())
|
225
340
|
argument_error(__FILE__, __LINE__);
|
226
341
|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
uint nframes = std::min(sigf->nframes(), addf->nframes());
|
342
|
+
Sample* sig_p = Signals_at(signals, 0);
|
343
|
+
const Sample* add_p = Signals_at(add, 0);
|
344
|
+
uint nsamples = std::min(signals->nsamples(), add.nsamples());
|
345
|
+
uint size = nsamples * signals->nchannels();
|
232
346
|
|
233
|
-
for (uint i = 0; i <
|
234
|
-
*
|
347
|
+
for (uint i = 0; i < size; ++i, ++sig_p, ++add_p)
|
348
|
+
*sig_p += *add_p;
|
235
349
|
}
|
236
350
|
|
237
351
|
void
|
@@ -244,17 +358,52 @@ namespace Beeps
|
|
244
358
|
if (signals->capacity() != multiplier.capacity())
|
245
359
|
argument_error(__FILE__, __LINE__);
|
246
360
|
|
247
|
-
|
248
|
-
|
249
|
-
uint nchannels = sigf->nchannels();
|
250
|
-
uint nframes = sigf->nframes();
|
361
|
+
uint nchannels = signals->nchannels();
|
362
|
+
uint nsamples = signals->nsamples();
|
251
363
|
|
252
364
|
for (uint ch = 0; ch < nchannels; ++ch)
|
253
365
|
{
|
254
|
-
|
255
|
-
|
256
|
-
for (uint i = 0; i <
|
257
|
-
*
|
366
|
+
Sample* sig_p = Signals_at(signals, 0, ch);
|
367
|
+
const Sample* mul_p = Signals_at(multiplier, 0, 0);
|
368
|
+
for (uint i = 0; i < nsamples; ++i, sig_p += nchannels, ++mul_p)
|
369
|
+
*sig_p *= *mul_p;
|
370
|
+
}
|
371
|
+
}
|
372
|
+
|
373
|
+
void
|
374
|
+
Signals_offset_and_scale (
|
375
|
+
Signals* signals, float offset, float scale,
|
376
|
+
int channel, uint start, int end_)
|
377
|
+
{
|
378
|
+
if (!signals)
|
379
|
+
argument_error(__FILE__, __LINE__);
|
380
|
+
|
381
|
+
uint signals_nsamples = signals->nsamples();
|
382
|
+
uint end = end_ < 0 ? signals_nsamples : (uint) end_;
|
383
|
+
if (start > signals_nsamples)
|
384
|
+
argument_error(__FILE__, __LINE__);
|
385
|
+
if (end > signals_nsamples)
|
386
|
+
argument_error(__FILE__, __LINE__);
|
387
|
+
if (end < start)
|
388
|
+
argument_error(__FILE__, __LINE__);
|
389
|
+
|
390
|
+
if (offset == 0 && scale == 1) return;
|
391
|
+
|
392
|
+
uint nchannels = signals->nchannels();
|
393
|
+
uint nsamples = end - start;
|
394
|
+
|
395
|
+
if (channel >= 0)
|
396
|
+
{
|
397
|
+
Sample* p = Signals_at(signals, start, channel);
|
398
|
+
for (uint i = 0; i < nsamples; ++i, p += nchannels)
|
399
|
+
*p = *p * scale + offset;
|
400
|
+
}
|
401
|
+
else
|
402
|
+
{
|
403
|
+
uint size = nchannels * nsamples;
|
404
|
+
Sample* p = Signals_at(signals, start, 0);
|
405
|
+
for (uint i = 0; i < size; ++i, ++p)
|
406
|
+
*p = *p * scale + offset;
|
258
407
|
}
|
259
408
|
}
|
260
409
|
|
@@ -262,7 +411,8 @@ namespace Beeps
|
|
262
411
|
void
|
263
412
|
write_samples (Signals* signals, const SignalSamples<T>& samples, long nsamples_)
|
264
413
|
{
|
265
|
-
uint
|
414
|
+
uint nchannels = signals->nchannels();
|
415
|
+
uint nsamples = nsamples_ < 0 ? samples.nsamples() : (uint) nsamples_;
|
266
416
|
|
267
417
|
if (!signals)
|
268
418
|
argument_error(__FILE__, __LINE__);
|
@@ -273,17 +423,15 @@ namespace Beeps
|
|
273
423
|
if (signals->capacity() < nsamples)
|
274
424
|
argument_error(__FILE__, __LINE__);
|
275
425
|
|
276
|
-
|
277
|
-
assert(f);
|
278
|
-
|
279
|
-
for (uint channel = 0; channel < signals->nchannels(); ++channel)
|
426
|
+
for (uint channel = 0; channel < nchannels; ++channel)
|
280
427
|
{
|
281
|
-
|
282
|
-
|
283
|
-
|
428
|
+
Sample* sig_p = Signals_at(signals, 0, channel);
|
429
|
+
const T* buf = samples.channel(channel);
|
430
|
+
for (uint i = 0; i < nsamples; ++i, sig_p += nchannels)
|
431
|
+
*sig_p = buf[i];
|
284
432
|
}
|
285
433
|
|
286
|
-
signals
|
434
|
+
Signals_set_nsamples(signals, nsamples);
|
287
435
|
}
|
288
436
|
|
289
437
|
template <>
|
@@ -307,29 +455,39 @@ namespace Beeps
|
|
307
455
|
{
|
308
456
|
if (!signals)
|
309
457
|
argument_error(__FILE__, __LINE__);
|
458
|
+
if (nsamples > signals->capacity())
|
459
|
+
argument_error(__FILE__, __LINE__);
|
310
460
|
|
311
461
|
signals->self->nsamples = nsamples;
|
312
462
|
}
|
313
463
|
|
314
|
-
|
315
|
-
|
464
|
+
Sample*
|
465
|
+
Signals_at (Signals* signals, uint index, uint channel)
|
316
466
|
{
|
317
|
-
|
467
|
+
if (!signals)
|
468
|
+
argument_error(__FILE__, __LINE__);
|
469
|
+
if (!*signals)
|
470
|
+
argument_error(__FILE__, __LINE__);
|
471
|
+
|
472
|
+
return &(*signals->self->frames)(index, channel);
|
318
473
|
}
|
319
474
|
|
320
|
-
|
321
|
-
|
475
|
+
const Sample*
|
476
|
+
Signals_at (const Signals* signals, uint index, uint channel)
|
322
477
|
{
|
323
|
-
|
324
|
-
|
478
|
+
return Signals_at(const_cast<Signals*>(signals), index, channel);
|
479
|
+
}
|
325
480
|
|
326
|
-
|
481
|
+
const Sample*
|
482
|
+
Signals_at (const Signals& signals, uint index, uint channel)
|
483
|
+
{
|
484
|
+
return Signals_at(const_cast<Signals*>(&signals), index, channel);
|
327
485
|
}
|
328
486
|
|
329
|
-
|
330
|
-
|
487
|
+
float
|
488
|
+
Signals_get_seconds (const Signals& signals)
|
331
489
|
{
|
332
|
-
return
|
490
|
+
return (float) (signals.nsamples() / signals.sample_rate());
|
333
491
|
}
|
334
492
|
|
335
493
|
static void
|
@@ -338,20 +496,20 @@ namespace Beeps
|
|
338
496
|
{
|
339
497
|
assert(buffer && signals);
|
340
498
|
|
341
|
-
|
342
|
-
|
499
|
+
uint nchannels = signals.nchannels();
|
500
|
+
uint nsamples = signals.nsamples();
|
343
501
|
|
344
502
|
buffer->clear();
|
345
|
-
for (uint ch = 0; ch <
|
503
|
+
for (uint ch = 0; ch < nchannels; ++ch)
|
346
504
|
{
|
347
505
|
buffer->emplace_back(std::vector<float>());
|
348
506
|
auto& channel = buffer->back();
|
349
507
|
|
350
|
-
|
351
|
-
channel.reserve(nframes);
|
508
|
+
channel.reserve(nsamples);
|
352
509
|
|
353
|
-
|
354
|
-
|
510
|
+
const Sample* p = Signals_at(signals, 0, ch);
|
511
|
+
for (uint i = 0; i < nsamples; ++i, p += nchannels)
|
512
|
+
channel.push_back(*p);
|
355
513
|
}
|
356
514
|
}
|
357
515
|
|
@@ -392,7 +550,7 @@ namespace Beeps
|
|
392
550
|
uint
|
393
551
|
Signals::nchannels () const
|
394
552
|
{
|
395
|
-
return self->frames ? self->frames->
|
553
|
+
return self->frames ? self->frames->channels() : 0;
|
396
554
|
}
|
397
555
|
|
398
556
|
uint
|
@@ -404,7 +562,7 @@ namespace Beeps
|
|
404
562
|
uint
|
405
563
|
Signals::capacity () const
|
406
564
|
{
|
407
|
-
return self->frames ? self->frames->
|
565
|
+
return self->frames ? self->frames->frames() : 0;
|
408
566
|
}
|
409
567
|
|
410
568
|
bool
|
@@ -413,7 +571,7 @@ namespace Beeps
|
|
413
571
|
return self->nsamples == 0;
|
414
572
|
}
|
415
573
|
|
416
|
-
const
|
574
|
+
const Sample*
|
417
575
|
Signals::samples () const
|
418
576
|
{
|
419
577
|
return self->frames ? self->frames->data() : NULL;
|
@@ -422,7 +580,7 @@ namespace Beeps
|
|
422
580
|
Signals::operator bool () const
|
423
581
|
{
|
424
582
|
const Frames* f = self->frames.get();
|
425
|
-
return f && f->dataRate() > 0 && f->
|
583
|
+
return f && f->dataRate() > 0 && f->channels() > 0 && f->frames() > 0;
|
426
584
|
}
|
427
585
|
|
428
586
|
bool
|