MCPcopy Create free account
hub / github.com/LabSound/LabSound / grain

Class grain

include/LabSound/extended/GranulationNode.h:18–94  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

16class GranulationNode : public AudioScheduledSourceNode
17{
18 struct grain
19 {
20 std::shared_ptr<AudioBus> sample;
21 std::shared_ptr<AudioBus> window;
22
23 bool in_use {true};
24
25 // Values in samples
26 uint64_t grain_start {0}; // frames into the sample
27 uint64_t grain_duration {0}; // duration, seconds * samplerate
28 uint64_t grain_end {0}; // start + duration
29 uint64_t envelope_index {0};
30
31 double playback_frequency;
32 double sample_increment;
33 double sample_accurate_time; // because of double precision, it's actually subsample-accurate
34
35 // position between 0-1, duration in seconds
36 grain(std::shared_ptr<AudioBus> _sample,
37 std::shared_ptr<AudioBus> _window,
38 const float sample_rate,
39 const double _position_offset,
40 const double _duration,
41 const double _speed)
42 : sample(_sample), window(_window)
43 {
44 grain_start = static_cast<uint64_t>(sample->length() * _position_offset);
45 grain_duration = static_cast<uint64_t>(_duration * sample_rate);
46 grain_end = std::min(static_cast<uint64_t>(sample->length()), grain_start + grain_duration);
47
48 playback_frequency = (1.0 / _duration) * _speed;
49 sample_accurate_time = static_cast<double>((playback_frequency > 0) ? grain_start : grain_end);
50 sample_increment = (playback_frequency != 0.0) ? grain_duration / (sample_rate / playback_frequency) : 0.0;
51 }
52
53 void tick(float * out_buffer, const int num_frames)
54 {
55 const float * windowSamples = window->channel(0)->data();
56
57 for (int i = 0; i < num_frames; ++i)
58 {
59 double result = 0.f;
60
61 if (in_use)
62 {
63 sample_accurate_time += sample_increment;
64
65 // Looping behavior
66 if (sample_accurate_time >= grain_end)
67 {
68 sample_accurate_time = static_cast<double>(grain_start);
69 }
70
71 const uint64_t approximate_sample_index = static_cast<uint64_t>(std::floor(sample_accurate_time));
72 const double remainder = sample_accurate_time - approximate_sample_index;
73
74 uint64_t left = approximate_sample_index;
75 uint64_t right = approximate_sample_index + 1;

Callers 1

setGrainSourceMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected