UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Granulator.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "DSP/Dsp.h"
7#include "DSP/Osc.h"
9#include "DSP/Envelope.h"
10#include "DSP/Amp.h"
12#include "SampleBuffer.h"
13
14namespace Audio
15{
17 {
20
21 Count,
22 };
23
43
44 // Simple class that generates an envelope and lets you retrieve interpolated values at any given fraction
46 {
47 public:
50
52 SIGNALPROCESSING_API float GetValue(const float Fraction) const;
53
54 private:
55 EGrainEnvelopeType CurrentType;
56 TArray<float> GrainEnvelope;
57 };
58
60 {
61 // What oscillator type to use
63
64 // Where in the buffer to seek the grain playback to
66
67 // Duration of the grain
69
70 // Grain pitch scale (if in buffer reading mode)
72
73 // The grain frequency (if in synthesis mode)
74 float Frequency;
75
76 // Grain volume
77 float Volume;
78
79 // Grain pan
80 float Pan;
81 };
82
83 class FGranularSynth;
84
85 // Class representing a grain of audio
86 class FGrain
87 {
88 public:
91
92 // Plays the grain with the supplied grain data
94
95 // Changes the oscillator type for the grain (if the grain is in synth mode)
97
98 // Sets the oscillator frequency
100
101 // Sets the oscillator frequency modulation
103
104 // Sets the grain pitch modulation
106
107 // Sets the grain modulation
109
110 // Sets the pan modulation angle
112
113 // Changes how quickly the grain reads through envelope
115
116 // Queries if this grain is finished playing and needs to be reaped
117 SIGNALPROCESSING_API bool IsDone() const;
118
119 // Generates the next frame from the grain
121
122 protected:
124
125 // Grain id
127
128 // Parent synth
130
131 // Grain data struct
133
134 // The sample buffer reader to use for the grain of the mode is granulation
136
137 // Oscillator to use for synthesis mode
139
140 // The current pitch
142
143 // Current frequency
145
146 // The current volume scale
148
149 // The current pan
151
152 // How quickly we read through the envelope
154
155 // The current frame count the grain is on
157
158 // The end frame count the grain will finish on
160
161 // Speaker map based on the current grain azimuth
163
164 // Scratch buffer for sample reading
166 };
167
168 // A stereo granulator
170 {
171 public:
174
176
177 // Loads a sound wave to use for granular synth mode
179
180 // Plays a granular synthesis "Note"
181 SIGNALPROCESSING_API void NoteOn(const uint32 InMidiNote, const float InVelocity, const float InDurationSec = INDEX_NONE);
182
183 // Note off, triggers release envelope
184 SIGNALPROCESSING_API void NoteOff(const uint32 InMidiNote, const bool bKill);
185
186 // Sets the granular synth attack time
188
189 // Sets the granular synth decay time
191
192 // Sets the granular synth sustain gain
194
195 // Sets the granular synth releas etime
197
198 // Seeks the loaded buffer used for granulation. Grains will spawn from this location
200
201 // Sets whether or not the buffer playback advances on its own or if it just sits in one place
202 SIGNALPROCESSING_API void SetScrubMode(const bool bIsScrubMode);
203
204 // Sets how fast the granular play head for granulation is is played (and in what direction)
206
207 // The rate at which new grains are attempted to be spawned
209
210 // The probability at which a grain will occur when a grain tries to spawn. Allows for sporatic grain generation.
212
213 // Sets the envelope type to use for new grains. Will instantly switch all grains to this envelope type so may cause discontinuities if switched while playing.
215
216 // Sets the grain oscillator type (for use with granular synthesis mode)
218
219 // Sets the base grain volume and randomization range
221
222 // Sets the grain modulation -- allows modulating actively playing grain volumes
224
225 // Sets the base grain pitch and randomization range
227
228 // Sets the grain frequency
230
231 // Sets the grain frequency modulation
233
234 // Sets the grain pitch modulation -- allows modulating actively playing grain pitches
236
237 // Sets the grain azimuth (pan) and randomization range
239
240 // Sets the grain azimuth modulation - allows modulating actively playing grain azimuths
242
243 // Sets the grain duration.
245
246 // Sets the grain duration modulation.
248
249 // Return the number of currently active grains
251
252 // Get current playback time (in granular mode)
254
255 // Returns the duration of the internal loaded sample buffer
257
258 // Generate the next audio buffer
259 SIGNALPROCESSING_API void Generate(float* OutAudiobuffer, const int32 NumFrames);
260
261 protected:
262 // Spawns grains
264
265 // Return wrapped playhead position
267
268
269 // Current grain azimuth modulation
271 {
273 float Base;
275
276 float GetValue() const
277 {
278 return Base + FMath::FRandRange(Range.X, Range.Y);
279 }
280
281 float GetModulation() const
282 {
283 return Modulation;
284 }
285
287 : Modulation(0.0f)
288 , Base(0.0f)
289 {}
290 };
291
294
295 // The single envelope function used by all grains
297
298 // What mode the granular synthesizer is in
300
301 // The oscillator type to use if in synthesis mode
303
304 // Current grain envelope type
306
307 // A pool of free grains. Will dynamically grow to needed grains based on grain density.
312
313 // The rate at which grains are spawned
315
316 // The probability of a grain occurring when it tries to spawn (based off the GrainsPerSecond)
318
319 // The current number of frames since last attempt to spawn
321
322 // The next frame when a grain needs to spawn
324
325 // Counts for overall note duration of the granulator
328
334
335 // Overall envelope of the granulator
339
340 // The buffer which holds the sample to be granulated
342
343 // The current playhead frame
349
350 friend class FGrain;
351 };
352}
353
@ INDEX_NONE
Definition CoreMiscDefines.h:150
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void Init()
Definition LockFreeList.h:4
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Amp.h:27
Definition DynamicsProcessor.h:37
Definition Envelope.h:14
Definition Granulator.h:46
SIGNALPROCESSING_API void GenerateEnvelope(const EGrainEnvelopeType EnvelopeType, const int32 NumFrames)
Definition Granulator.cpp:16
SIGNALPROCESSING_API ~FGrainEnvelope()
Definition Granulator.cpp:12
SIGNALPROCESSING_API float GetValue(const float Fraction) const
Definition Granulator.cpp:185
SIGNALPROCESSING_API FGrainEnvelope()
Definition Granulator.cpp:7
Definition Granulator.h:87
SIGNALPROCESSING_API float GetEnvelopeValue()
Definition Granulator.cpp:329
SIGNALPROCESSING_API void SetDurationScale(const float InDurationScale)
Definition Granulator.cpp:319
float EndFrameCount
Definition Granulator.h:159
SIGNALPROCESSING_API void SetPitchModulation(const float InPitchModulation)
Definition Granulator.cpp:292
float DurationScale
Definition Granulator.h:153
SIGNALPROCESSING_API void SetVolumeModulation(const float InVolumeModulation)
Definition Granulator.cpp:297
float CurrentPitch
Definition Granulator.h:141
FSampleBufferReader SampleBufferReader
Definition Granulator.h:135
SIGNALPROCESSING_API void SetOscFrequencyModuation(const float InFrequencyModulation)
Definition Granulator.cpp:287
SIGNALPROCESSING_API void SetOscType(const EOsc::Type InType)
Definition Granulator.cpp:277
float CurrentVolumeScale
Definition Granulator.h:147
SIGNALPROCESSING_API ~FGrain()
Definition Granulator.cpp:223
float CurrentPan
Definition Granulator.h:150
FGranularSynth * Parent
Definition Granulator.h:129
SIGNALPROCESSING_API bool IsDone() const
Definition Granulator.cpp:324
TArray< float > FrameScratch
Definition Granulator.h:165
SIGNALPROCESSING_API bool GenerateFrame(float *OutStereoFrame)
Definition Granulator.cpp:346
SIGNALPROCESSING_API void SetOscFrequency(const float InFrequency)
Definition Granulator.cpp:282
FGrainData GrainData
Definition Granulator.h:132
float CurrentFrequency
Definition Granulator.h:144
FOsc Osc
Definition Granulator.h:138
int32 GrainId
Definition Granulator.h:126
float CurrentFrameCount
Definition Granulator.h:156
SIGNALPROCESSING_API void SetPanModulation(const float InPanModulation)
Definition Granulator.cpp:302
TArray< float > SpeakerMap
Definition Granulator.h:162
Definition Granulator.h:170
TArray< FGrain > GrainPool
Definition Granulator.h:308
SIGNALPROCESSING_API void SetGrainsPerSecond(const float InNumberOfGrainsPerSecond)
Definition Granulator.cpp:622
FGrainParam Pan
Definition Granulator.h:329
EGrainEnvelopeType GrainEnvelopeType
Definition Granulator.h:305
SIGNALPROCESSING_API FGranularSynth()
Definition Granulator.cpp:375
SIGNALPROCESSING_API void SetGrainOscType(const EOsc::Type InGrainOscType)
Definition Granulator.cpp:654
int32 NumChannels
Definition Granulator.h:293
float GrainProbability
Definition Granulator.h:317
SIGNALPROCESSING_API void NoteOff(const uint32 InMidiNote, const bool bKill)
Definition Granulator.cpp:490
SIGNALPROCESSING_API void NoteOn(const uint32 InMidiNote, const float InVelocity, const float InDurationSec=INDEX_NONE)
Definition Granulator.cpp:464
SIGNALPROCESSING_API void SpawnGrain()
Definition Granulator.cpp:586
SIGNALPROCESSING_API float GetSampleDuration() const
Definition Granulator.cpp:772
SIGNALPROCESSING_API float GetCurrentPlayheadTime() const
Definition Granulator.cpp:767
SIGNALPROCESSING_API float GetWrappedPlayheadPosition(float PlayheadFrame)
Definition Granulator.cpp:564
SIGNALPROCESSING_API void SetGrainPitchModulation(const float InPitchModulation)
Definition Granulator.cpp:711
int32 NoteDurationFrameCount
Definition Granulator.h:326
SIGNALPROCESSING_API void SetGrainVolumeModulation(const float InVolumeModulation)
Definition Granulator.cpp:673
int32 CurrentSpawnFrameCount
Definition Granulator.h:320
float GrainsPerSecond
Definition Granulator.h:314
int32 NumActiveGrains
Definition Granulator.h:346
FGrainEnvelope GrainEnvelope
Definition Granulator.h:296
FAmp Amp
Definition Granulator.h:337
int32 SampleRate
Definition Granulator.h:292
EGranularSynthMode Mode
Definition Granulator.h:299
SIGNALPROCESSING_API void SetPlaybackSpeed(const float InPlaybackSpeed)
Definition Granulator.cpp:581
int32 NoteDurationFrameEnd
Definition Granulator.h:327
FGrainParam Duration
Definition Granulator.h:333
TArray< int32 > DeadGrains
Definition Granulator.h:311
SIGNALPROCESSING_API void SetDecayTime(const float InDecayTimeMSec)
Definition Granulator.cpp:507
SIGNALPROCESSING_API void SetGrainProbability(const float InGrainProbability)
Definition Granulator.cpp:638
TArray< int32 > FreeGrains
Definition Granulator.h:309
SIGNALPROCESSING_API void SetSustainGain(const float InSustainGain)
Definition Granulator.cpp:517
SIGNALPROCESSING_API void SetGrainDuration(const float InBaseDuration, const FVector2D InDurationRange=FVector2D::ZeroVector)
Definition Granulator.cpp:743
TArray< int32 > ActiveGrains
Definition Granulator.h:310
SIGNALPROCESSING_API void LoadSampleBuffer(const TSampleBuffer< int16 > &InSampleBuffer)
Definition Granulator.cpp:459
FDynamicsProcessor DynamicsProcessor
Definition Granulator.h:338
float CurrentPlayHeadFrame
Definition Granulator.h:344
int32 NextSpawnFrame
Definition Granulator.h:323
FGrainParam Volume
Definition Granulator.h:330
SIGNALPROCESSING_API ~FGranularSynth()
Definition Granulator.cpp:394
SIGNALPROCESSING_API void SetGrainFrequency(const float InFrequency, const FVector2D InPitchRange=FVector2D::ZeroVector)
Definition Granulator.cpp:692
SIGNALPROCESSING_API void SetReleaseTime(const float InReleaseTimeMSec)
Definition Granulator.cpp:512
SIGNALPROCESSING_API void SetAttackTime(const float InAttackTimeMSec)
Definition Granulator.cpp:502
TSampleBuffer< int16 > SampleBuffer
Definition Granulator.h:341
bool bScrubMode
Definition Granulator.h:347
FGrainParam Frequency
Definition Granulator.h:332
FLinearEase SeekingPlayheadTimeFrame
Definition Granulator.h:348
SIGNALPROCESSING_API void SeekTime(const float InTimeSec, const float LerpTimeSec=0.0f, const ESeekType::Type InSeekType=ESeekType::FromBeginning)
Definition Granulator.cpp:522
SIGNALPROCESSING_API void SetGrainPanModulation(const float InPanModulation)
Definition Granulator.cpp:730
SIGNALPROCESSING_API void SetGrainEnvelopeType(const EGrainEnvelopeType InGrainEnvelopeType)
Definition Granulator.cpp:643
SIGNALPROCESSING_API void SetGrainPan(const float InBasePan, const FVector2D InPanRange=FVector2D::ZeroVector)
Definition Granulator.cpp:724
SIGNALPROCESSING_API void SetGrainDurationScale(const float InDurationScale)
Definition Granulator.cpp:749
SIGNALPROCESSING_API void SetGrainVolume(const float InBaseVolume, const FVector2D InVolumeRange=FVector2D::ZeroVector)
Definition Granulator.cpp:667
EOsc::Type GrainOscType
Definition Granulator.h:302
SIGNALPROCESSING_API void SetGrainPitch(const float InBasePitch, const FVector2D InPitchRange=FVector2D::ZeroVector)
Definition Granulator.cpp:686
SIGNALPROCESSING_API void SetScrubMode(const bool bIsScrubMode)
Definition Granulator.cpp:559
float PlaybackSpeed
Definition Granulator.h:345
SIGNALPROCESSING_API void SetGrainFrequencyModulation(const float InFrequencyModulation)
Definition Granulator.cpp:698
FGrainParam Pitch
Definition Granulator.h:331
FEnvelope GainEnv
Definition Granulator.h:336
SIGNALPROCESSING_API int32 GetNumActiveGrains() const
Definition Granulator.cpp:762
SIGNALPROCESSING_API void Generate(float *OutAudiobuffer, const int32 NumFrames)
Definition Granulator.cpp:777
Definition Dsp.h:619
Definition Osc.h:252
Definition SampleBufferReader.h:22
Definition SampleBuffer.h:24
Definition Array.h:670
Type
Definition Osc.h:240
Type
Definition SampleBufferReader.h:14
@ FromBeginning
Definition SampleBufferReader.h:15
NO_LOGGING.
Definition AudioMixerPlatformAndroid.cpp:53
EGrainEnvelopeType
Definition Granulator.h:25
EGranularSynthMode
Definition Granulator.h:17
Definition Granulator.h:60
EOsc::Type OscType
Definition Granulator.h:62
float Volume
Definition Granulator.h:77
float BufferSeekTime
Definition Granulator.h:65
float DurationSeconds
Definition Granulator.h:68
float PitchScale
Definition Granulator.h:71
float Pan
Definition Granulator.h:80
float Frequency
Definition Granulator.h:74
Definition Granulator.h:271
float GetModulation() const
Definition Granulator.h:281
float Base
Definition Granulator.h:273
float Modulation
Definition Granulator.h:272
float GetValue() const
Definition Granulator.h:276
FGrainParam()
Definition Granulator.h:286
FVector2D Range
Definition Granulator.h:274
static UE_FORCEINLINE_HINT float FRandRange(float InMin, float InMax)
Definition UnrealMathUtility.h:313
T Y
Definition Vector2D.h:52
T X
Definition Vector2D.h:49
static CORE_API const TVector2< double > ZeroVector
Definition Vector2D.h:63