VJ Master 1.0
Real-time audio analysis and visualisation.
Loading...
Searching...
No Matches
ST_AudioProcessingSettings.h
1// Copyright (c) 2025 Aaron Trotter (ShaderTech). All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Engine/DeveloperSettings.h"
7#include "Misc/EnumClassFlags.h"
8#include "Misc/EnumRange.h"
9#include "ST_AudioProcessingSettings.generated.h"
10
18UENUM(BlueprintType, meta = (Bitflags, UseEnumValuesAsMaskValuesInEditor = "true"))
19enum class EAudioIOType : uint8
20{
22 None = 0 UMETA(Hidden),
23
25 PlaybackWaveform = 1 << 0 UMETA(DisplayName = "PlaybackWaveform"),
26
28 PlaybackPlayer = 1 << 1 UMETA(DisplayName = "PlaybackPlayer"),
29
31 PlaybackEnginePlayer = 1 << 2 UMETA(DisplayName = "PlaybackEnginePlayer"),
32
34 CaptureLoopback = 1 << 3 UMETA(DisplayName = "CaptureLoopback"),
35
37 CaptureMicrophone = 1 << 4 UMETA(DisplayName = "CaptureMicrophone"),
38
40 Count = 1 << 5 UMETA(Hidden)
41};
42
46ENUM_CLASS_FLAGS(EAudioIOType);
47
55constexpr bool EnumHasAnyFlags(int32 Flags, EAudioIOType Contains)
56{
57 return (Flags & int32(Contains)) != 0;
58};
59
63ENUM_RANGE_BY_VALUES(EAudioIOType,
64 EAudioIOType::PlaybackWaveform,
65 EAudioIOType::PlaybackPlayer,
66 EAudioIOType::PlaybackEnginePlayer,
67 EAudioIOType::CaptureLoopback,
68 EAudioIOType::CaptureMicrophone
69);
70
76UENUM(BlueprintType)
77enum class EST_AudioFileLocation : uint8
78{
80 ProjectDir = 0 UMETA(DisplayName = "Project Dir"),
81
83 ProjectContentDir = 1 UMETA(DisplayName = "Project Content Dir"),
84
86 ProjectPluginsDir = 2 UMETA(DisplayName = "Project Plugins Dir"),
87
89 EngineDir = 3 UMETA(DisplayName = "Engine Dir"),
90
92 EnginePluginsDir = 4 UMETA(DisplayName = "Engine Plugins Dir")
93};
94
101UENUM(BlueprintType)
102enum class EST_EncodingFormat : uint8
103{
105 Unknown = 0 UMETA(DisplayName = "Unknown"),
106
108 WAV = 1 UMETA(DisplayName = "WAV"),
109
111 Flac = 2 UMETA(DisplayName = "Flac"),
112
114 MP3 = 3 UMETA(DisplayName = "MP3"),
115
117 Vorbis = 4 UMETA(DisplayName = "Vorbis")
118};
119
126UENUM(BlueprintType)
127enum class EST_SampleFormat : uint8
128{
130 Unknown = 0 UMETA(DisplayName = "Unknown"),
131
133 U8 = 1 UMETA(DisplayName = "Unsigned 8-bit"),
134
136 S16 = 2 UMETA(DisplayName = "Signed 16-bit"),
137
139 S24 = 3 UMETA(DisplayName = "Signed 24-bit"),
140
142 S32 = 4 UMETA(DisplayName = "Signed 32-bit"),
143
145 F32 = 5 UMETA(DisplayName = "32-bit Float")
146};
147
153UENUM(BlueprintType)
154enum class EST_WaveformType : uint8
155{
157 Sine = 0 UMETA(DisplayName = "Sine"),
158
160 Square = 1 UMETA(DisplayName = "Square"),
161
163 Triangle = 2 UMETA(DisplayName = "Triangle"),
164
166 Sawtooth = 3 UMETA(DisplayName = "Sawtooth")
167};
168
175UENUM(BlueprintType)
176enum class EST_FilterType : uint8
177{
179 None = 0 UMETA(DisplayName = "No Filter"),
180
182 Butterworth = 1 UMETA(DisplayName = "Butterworth (Smooth)"),
183
185 ChebyshevTypeI = 2 UMETA(DisplayName = "Chebyshev I (Sharp)"),
186};
187
194UENUM(BlueprintType)
195enum class EST_WindowingFunction : uint8
196{
198 Rectangular = 0 UMETA(DisplayName = "Rectangular (no windowing)"),
199
201 Hann = 1 UMETA(DisplayName = "Hann (good balance, smooth edges)"),
202
204 Hamming = 2 UMETA(DisplayName = "Hamming (reduces first side ripple)"),
205
207 BlackmanHarris = 4 UMETA(DisplayName = "Blackman-Harris (strong smoothing, less noise)"),
208
210 Gaussian = 5 UMETA(DisplayName = "Gaussian (soft edges, smooth blend)")
211};
212
218UENUM(BlueprintType)
219enum class EST_SpectrumSpacing : uint8
220{
222 Log = 0 UMETA(DisplayName = "Logarithmic (natural)"),
223
225 Linear = 1 UMETA(DisplayName = "Linear (even)"),
226
228 OctaveSubdivision = 2 UMETA(DisplayName = "Octave Subdivision (Power-of-Two)"),
229
231 Quadratic = 3 UMETA(DisplayName = "Quadratic (Squared Growth)")
232};
233
239UENUM(BlueprintType)
240enum class EST_SpectrumValues : uint8
241{
243 Averages = 0 UMETA(DisplayName = "Averages (smooth)"),
244
246 Peaks = 1 UMETA(DisplayName = "Peaks (noisy)"),
247};
248
254UENUM(BlueprintType)
255enum class EST_SmoothingType : uint8
256{
258 None = 0 UMETA(DisplayName = "None"),
259
261 EMA = 1 UMETA(DisplayName = "Exponential Moving Average"),
262
264 SMA = 2 UMETA(DisplayName = "Simple Moving Average "),
265 // ToDo: Add Gaussian smoothing method in the future.
266};
267
274USTRUCT(BlueprintType)
276{
277 GENERATED_BODY()
278
279public:
281 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
282 EST_SmoothingType SmoothingType = EST_SmoothingType::EMA;
283
285 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "SmoothingType != EST_SmoothingType::None && SmoothingType == EST_SmoothingType::SMA", ClampMin = "0.0", UIMin = "0.0", Tooltip = "Time window (in seconds) used for smoothing values over a set period of time. Larger values result in smoother transitions, while smaller values react more quickly to changes."))
286 float TimeWindow = 0.1f; // 100ms
287
289 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "SmoothingType != EST_SmoothingType::None", ClampMin = "0.0", ClampMax = "1.0", UIMin = "0.0", UIMax = "1.0", Tooltip = "Smoothing factor for averaging over time (0 = No smoothing, 1 = Full smoothing)"))
290 float SmoothingFactor = 0.5f;
291};
292
298USTRUCT(BlueprintType)
300{
301 GENERATED_BODY()
302
303public:
304
309 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
310 EST_FilterType FilterType = EST_FilterType::None;
311
318 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "FilterType == EST_FilterType::ChebyshevTypeI", ClampMin = "0.01", ClampMax = "10.0", UIMin = "0.01", UIMax = "10.0"))
319 float RippleFactor = 0.1f;
320
325 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "FilterType != EST_FilterType::None"))
326 bool bLowPassFilter = false;
327
332 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bLowPassFilter && FilterType != EST_FilterType::None"))
333 float LowPassCutoffHz = 12000.0f;
334
339 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "FilterType != EST_FilterType::None"))
340 bool bBandFilter = false;
341
346 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bBandFilter && FilterType != EST_FilterType::None"))
347 float BandLowerCutoffHz = 100.0f;
348
353 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bBandFilter && FilterType != EST_FilterType::None"))
354 float BandUpperCutoffHz = 12000.0f;
355
360 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bBandFilter && FilterType != EST_FilterType::None"))
361 bool bBandReject = true;
362
367 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "FilterType != EST_FilterType::None"))
368 bool bHighPassFilter = false;
369
374 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bHighPassFilter && FilterType != EST_FilterType::None"))
375 float HighPassCutoffHz = 100.0f;
376};
377
383USTRUCT(BlueprintType)
385{
386 GENERATED_BODY()
387
388public:
393 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
394 EST_WindowingFunction WindowingFunction = EST_WindowingFunction::Hann;
395
402 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "WindowingFunction == EST_WindowingFunction::Gaussian", ClampMin = "0.0", UIMin = "0.0"))
404};
405
411USTRUCT(BlueprintType)
413{
414 GENERATED_BODY()
415
416public:
421 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
423
428 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
430
436 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, ClampMin = "1", UIMin = "1", Tooltip = "Number of frequency bands used in the spectrum analysis. More bands provide finer resolution but increase computational cost."))
437 int32 SpectrumBands = 32;
438
443 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
444 EST_SpectrumSpacing SpectrumSpacing = EST_SpectrumSpacing::Log;
445
450 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
451 EST_SpectrumValues SpectrumValues = EST_SpectrumValues::Averages;
452
457 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "SpectrumSpacing == EST_SpectrumSpacing::Log", Tooltip = "20Hz = Lower bound of human hearing"))
458 float MinFreq = 20.0f;
459
464 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "SpectrumSpacing == EST_SpectrumSpacing::Log"))
466
471 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bOverrideNyquistLimit && SpectrumSpacing == EST_SpectrumSpacing::Log", Tooltip = "Uses CustomMaxFreq instead of NyquistLimit (half the sampling rate)"))
472 float MaxFreq = 20000.0f; // Upper bound
473
478 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
480};
481
487USTRUCT(BlueprintType)
489{
490 GENERATED_BODY()
491
492public:
497 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
498 bool bComputeAmplitude = true;
499
504 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
506
511 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bAmplitudeNormalisation"))
512 float MaxAmplitude = 1.0f;
513
518 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
520};
521
527USTRUCT(BlueprintType)
529{
530 GENERATED_BODY()
531
532public:
537 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
538 bool bComputePitch = true;
539
544 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
546
551 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bPitchNormalisation", Tooltip = "20Hz = Lower bound of human hearing"))
552 float MinFreq = 20.0f;
553
558 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bPitchNormalisation"))
559 float MaxFreq = 20000.0f; // Upper bound
560
565 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
567};
568
574USTRUCT(BlueprintType)
576{
577 GENERATED_BODY()
578
579public:
580
585 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, meta = "Smoothing cannot be None. Beat Tracking requires at least some history."))
586 bool bComputeBeat = true;
587
592 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, ClampMin = "0.0", UIMin = "0.0"))
593 bool bNormalise = false;
594
599 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bNormalise", ClampMin = "0.0", UIMin = "0.0"))
600 float MaxBeatEnergy = 2.0f;
601
606 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, ClampMin = "0.0", UIMin = "0.0"))
607 float BeatThreshold = 1.5f;
608
613 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
615
620 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
622};
623
629USTRUCT(BlueprintType)
631{
632 GENERATED_BODY()
633
634public:
635
640 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
642
647 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
649
654 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
656
661 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
663
668 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
670
675 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
677
682 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
684
689 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
691
696 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, ClampMin = "0", UIMin = "0", Tooltip = "FFT Smoothing factor, be really careful. Each increase scales the buffer by power of 2. Higher = smoother"))
698
703 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
704 bool bSplitChannels = false;
705};
706
712USTRUCT(BlueprintType)
714{
715 GENERATED_BODY()
716
717public:
718
723 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
725
730 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
731 int32 BytesPerFrame = 0;
732
737 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
738 int32 SampleRate = 0;
739
744 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
745 int32 Channels = 0;
746
751 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
752 bool bSplitChannels = false;
753
758 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
759 int32 SampleCount = 0;
760
765 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
767
772 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
774
779 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
781
786 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
788
793 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
794 float SecondsPerPeriod = 0.0f;
795
800 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
801 float TimePerFrame = 0.0f;
802
807 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
809
814 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
816
821 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
823
828 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
830
835 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
837
842 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
843 int32 TotalBins = 0;
844
849 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
850 float FreqPerBin = 0.0f;
851
856 FFFTIOData() = default;
857
866 FFFTIOData(int32 InPeriodSizeInFrames, int32 InBytesPerFrame, int32 InSampleRate, int32 InChannels, FFFTConfig InFFTConfig)
867 : PeriodSizeInFrames(InPeriodSizeInFrames)
868 , BytesPerFrame(InBytesPerFrame)
869 , SampleRate(InSampleRate)
870 , Channels(InChannels)
871 {
872 // Calculate dependent values based on inputs
875
876 // Find next power of 2
877 PaddedPeriodSizeInFramesPerChannel = FMath::RoundUpToPowerOfTwo(PeriodSizeInFrames) * (1 << InFFTConfig.FFTPaddingFactor);
878
881
882 TotalBins = PaddedMagnitudeCount; //PaddedMagnitudeCountWithNyquist but without DC Component
883 // Calculate frequency resolution per bin
884 FreqPerBin = SampleRate / (float)PaddedPeriodSizeInFramesPerChannel; // Nyquist frequency
885
886 // Compute frequency resolution, calculate how much time it takes to process a period of audio samples
887 SecondsPerPeriod = static_cast<float>(SampleRate) / static_cast<float>(PeriodSizeInFrames);
888 // how long each frame takes to process in seconds
889 TimePerFrame = static_cast<float>(PeriodSizeInFrames) / static_cast<float>(SampleRate);
890
891 bSplitChannels = InFFTConfig.bSplitChannels;
892
893 // Set magnitudes history size based on smoothing type
894 switch (InFFTConfig.SpectrumConfig.SmoothingConfig.SmoothingType)
895 {
896 case EST_SmoothingType::EMA:
898 break;
899 case EST_SmoothingType::SMA:
900 MagnitudesHistorySize = FMath::Max(FMath::CeilToInt(InFFTConfig.SmoothingConfig.TimeWindow / TimePerFrame), 1.0f);
901 break;
902 default:
904 break;
905 }
906
907 // Set frequency bands history size based on smoothing type
908 switch (InFFTConfig.SpectrumConfig.SmoothingConfig.SmoothingType)
909 {
910 case EST_SmoothingType::EMA:
912 break;
913 case EST_SmoothingType::SMA:
914 FrequencyBandsHistorySize = FMath::Max(FMath::CeilToInt(InFFTConfig.SpectrumConfig.SmoothingConfig.TimeWindow / TimePerFrame), 1.0f);
915 break;
916 default:
918 break;
919 }
920
921 // Set amplitude history size based on smoothing type
922 switch (InFFTConfig.AmplitudeConfig.SmoothingConfig.SmoothingType)
923 {
924 case EST_SmoothingType::EMA:
926 break;
927 case EST_SmoothingType::SMA:
928 AmplitudeHistorySize = FMath::Max(FMath::CeilToInt(InFFTConfig.AmplitudeConfig.SmoothingConfig.TimeWindow / TimePerFrame), 1.0f);
929 break;
930 default:
932 break;
933 }
934
935 // Set pitch history size based on smoothing type
936 switch (InFFTConfig.PitchConfig.SmoothingConfig.SmoothingType)
937 {
938 case EST_SmoothingType::EMA:
940 break;
941 case EST_SmoothingType::SMA:
942 PitchHistorySize = FMath::Max(FMath::CeilToInt(InFFTConfig.PitchConfig.SmoothingConfig.TimeWindow / TimePerFrame), 1.0f);
943 break;
944 default:
946 break;
947 }
948
949 // Set beat history size based on smoothing type
950 switch (InFFTConfig.BeatConfig.SmoothingConfig.SmoothingType)
951 {
952 case EST_SmoothingType::EMA:
953 BeatHistorySize = 2;
954 break;
955 case EST_SmoothingType::SMA:
956 BeatHistorySize = FMath::Max(FMath::CeilToInt(InFFTConfig.BeatConfig.SmoothingConfig.TimeWindow / TimePerFrame), 1.0f);
957 break;
958 default:
959 BeatHistorySize = 1;
960 break;
961 }
962 }
963
968 {
969 if (bSplitChannels)
970 {
971 return Channels;
972 }
973
974 return 1;
975 }
976
977};
978
982USTRUCT(BlueprintType)
984{
985 GENERATED_BODY()
986
987public:
993 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
994 FString DeviceName = "[System Default]";
995
999 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio")
1001};
1002
1006USTRUCT(BlueprintType)
1007struct FEncoderConfig : public FAudioIOConfig
1008{
1009 GENERATED_BODY()
1010
1011public:
1016 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1017 bool bCanWriteToFile = false;
1018
1023 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bCanWriteToFile"))
1024 EST_AudioFileLocation AudioFileLocation = EST_AudioFileLocation::ProjectPluginsDir;
1025
1030 UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Audio", meta = (SessionRestartRequired, EditCondition = "bCanWriteToFile"))
1031 FString OutputFilePath = "ST_VJMaster/ExampleAudio/VJMaster_ExampleWrite.wav";
1032
1038 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1039 EST_EncodingFormat EncodingFormat = EST_EncodingFormat::WAV;
1040
1046 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1047 EST_SampleFormat SampleFormat = EST_SampleFormat::F32;
1048
1053 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1054 int32 Channels = 2;
1055
1060 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1061 int32 SampleRate = 24000; //48000, 44100
1062
1063 FEncoderConfig() = default;
1064
1071 FEncoderConfig(const FAudioIOConfig& BaseConfig)
1072 {
1073 *this = static_cast<const FEncoderConfig&>(BaseConfig); // Inherit base fields
1074 }
1075};
1076
1080USTRUCT(BlueprintType)
1081struct FDecoderConfig : public FAudioIOConfig
1082{
1083 GENERATED_BODY()
1084
1085public:
1090 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1091 float Gain = 1.0f;
1092
1093 FDecoderConfig() = default;
1094
1101 FDecoderConfig(const FAudioIOConfig& BaseConfig)
1102 {
1103 *this = static_cast<const FDecoderConfig&>(BaseConfig); // Inherit base fields
1104 Gain = 1.0f; // Default for FDecoderConfig-specific field
1105 }
1106};
1107
1111USTRUCT(BlueprintType)
1112struct FCaptureLoopbackConfig : public FEncoderConfig
1113{
1114 GENERATED_BODY()
1115
1116public:
1117 // Inherits from FEncoderConfig, no additional properties
1118};
1119
1123USTRUCT(BlueprintType)
1124struct FCaptureMicrophoneConfig : public FEncoderConfig
1125{
1126 GENERATED_BODY()
1127
1128public:
1129 // Inherits from FEncoderConfig, no additional properties
1130};
1131
1135USTRUCT(BlueprintType)
1136struct FPlaybackWaveformConfig : public FDecoderConfig
1137{
1138 GENERATED_BODY()
1139
1140public:
1141 // Inherits from FDecoderConfig
1142
1148 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1149 EST_SampleFormat SampleFormat = EST_SampleFormat::F32;
1150
1155 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1156 int32 Channels = 2;
1157
1162 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1163 int32 SampleRate = 24000; //48000, 44100
1164
1170 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1171 EST_WaveformType WaveformType = EST_WaveformType::Sine;
1172
1178 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1179 float WaveformAmplitude = 0.2f;
1180
1186 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1187 float WaveformFrequency = 220.0f;
1188};
1189
1193USTRUCT(BlueprintType)
1194struct FPlaybackPlayerConfig : public FDecoderConfig
1195{
1196 GENERATED_BODY()
1197
1198public:
1203 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1204 bool bLooping = true;
1205
1210 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1211 EST_AudioFileLocation AudioFileLocation = EST_AudioFileLocation::ProjectPluginsDir;
1212
1217 UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Audio", meta = (SessionRestartRequired))
1218 FString InputFilePath = "ST_VJMaster/ExampleAudio/VJMaster_Example1.mp3";
1219};
1220
1224USTRUCT(BlueprintType)
1225struct FPlaybackEngineConfig : public FDecoderConfig
1226{
1227 GENERATED_BODY()
1228
1229public:
1234 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (SessionRestartRequired))
1235 EST_AudioFileLocation AudioFileLocation = EST_AudioFileLocation::ProjectPluginsDir;
1236
1241 UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Audio", meta = (SessionRestartRequired))
1242 FString InputFilePath = "../Audio/ExampleRead.wav";
1243};
1244
1245#if WITH_EDITOR
1254DECLARE_MULTICAST_DELEGATE_TwoParams(FOnPostEditChangePropertyDelegate_APS, UObject*, FPropertyChangedEvent&);
1255#endif
1256
1264UCLASS(Config = ST_VJMaster, DefaultConfig, meta = (DisplayName = "ST Audio Processing"))
1265class ST_AUDIOPROCESSING_API UST_AudioProcessingSettings : public UDeveloperSettings
1266{
1267 GENERATED_BODY()
1268
1269public:
1275 UFUNCTION(BlueprintPure, Category = "ShaderTech|AudioProcessing")
1277 {
1278 return GetDefault<UST_AudioProcessingSettings>();
1279 }
1280
1281#if WITH_EDITOR
1287 inline static FOnPostEditChangePropertyDelegate_APS OnPostEditChangeProperty;
1288
1297 virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override
1298 {
1299 Super::PostEditChangeProperty(PropertyChangedEvent);
1300
1301 OnPostEditChangeProperty.Broadcast(this, PropertyChangedEvent);
1302 }
1303#endif
1304
1312 UPROPERTY(config, EditAnywhere, BlueprintReadWrite, Category = "Audio", meta = (Bitmask, BitmaskEnum = "/Script/ST_AudioProcessing.EAudioIOType", EditorRestartRequiredTooltip = "This is a required for creating audio buffers at the beginning of play for materials and compute shaders."))
1314
1319 UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Capture")
1321
1326 UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Capture")
1328
1333 UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Playback")
1335
1340 UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Playback")
1342
1347 UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Playback")
1349
1350protected:
1351
1357 virtual FName GetCategoryName() const override
1358 {
1359 return TEXT("ShaderTech");
1360 }
1361};
Settings class for ST Audio Processing.
Definition ST_AudioProcessingSettings.h:1266
FPlaybackWaveformConfig PlaybackWaveformConfig
Configuration for audio playback waveform.
Definition ST_AudioProcessingSettings.h:1334
virtual FName GetCategoryName() const override
Gets the category name for the developer settings.
Definition ST_AudioProcessingSettings.h:1357
FCaptureLoopbackConfig CaptureLoopbackConfig
Configuration for audio capture loopback.
Definition ST_AudioProcessingSettings.h:1320
FCaptureMicrophoneConfig CaptureMicrophoneConfig
Configuration for audio capture from a microphone.
Definition ST_AudioProcessingSettings.h:1327
FPlaybackPlayerConfig PlaybackPlayerConfig
Configuration for audio playback player.
Definition ST_AudioProcessingSettings.h:1341
static const UST_AudioProcessingSettings * GetST_AudioProcessingSettings()
Gets the default audio processing settings.
Definition ST_AudioProcessingSettings.h:1276
int32 PossibleAudioIOs
A bitmask that determines the types of possible audio I/O. This is a required for creating audio buff...
Definition ST_AudioProcessingSettings.h:1313
FPlaybackEngineConfig PlaybackEngineConfig
Configuration for audio playback engine.
Definition ST_AudioProcessingSettings.h:1348
Structure that holds the configuration for audio input/output.
Definition ST_AudioProcessingSettings.h:984
FFFTConfig FFTConfig
FFT configuration settings.
Definition ST_AudioProcessingSettings.h:1000
FString DeviceName
The name of the audio device. Defaults to "[System Default]" if not specified. @meta (SessionRestartR...
Definition ST_AudioProcessingSettings.h:994
Structure that holds configuration for the capture loopback.
Definition ST_AudioProcessingSettings.h:1113
Structure that holds configuration for capturing from a microphone.
Definition ST_AudioProcessingSettings.h:1125
float Gain
The gain factor for the decoded audio (e.g., 0.5 for half volume, 2.0 for double volume)....
Definition ST_AudioProcessingSettings.h:1091
int32 SampleRate
The sample rate of the audio (e.g., 48000, 44100). @meta (SessionRestartRequired)
Definition ST_AudioProcessingSettings.h:1061
FString OutputFilePath
Path to the output file where audio will be written, only if bCanWriteToFile is true....
Definition ST_AudioProcessingSettings.h:1031
bool bCanWriteToFile
Whether or not the audio can be written to a file. @meta (SessionRestartRequired)
Definition ST_AudioProcessingSettings.h:1017
EST_EncodingFormat EncodingFormat
The encoding format to be used for the audio output.
Definition ST_AudioProcessingSettings.h:1039
EST_AudioFileLocation AudioFileLocation
Where the OutputFilePath Should start. @meta (SessionRestartRequired, EditCondition = "bCanWriteToFil...
Definition ST_AudioProcessingSettings.h:1024
int32 Channels
The number of audio channels (e.g., 1 for mono, 2 for stereo). @meta (SessionRestartRequired)
Definition ST_AudioProcessingSettings.h:1054
EST_SampleFormat SampleFormat
The sample format for the audio data.
Definition ST_AudioProcessingSettings.h:1047
Configuration structure for FFT amplitude settings. Defines parameters for amplitude computation and ...
Definition ST_AudioProcessingSettings.h:489
bool bAmplitudeNormalisation
Whether to normalize the amplitude. Scales the amplitude values to a specified range.
Definition ST_AudioProcessingSettings.h:505
bool bComputeAmplitude
Whether to compute amplitude values. Enables or disables amplitude computation.
Definition ST_AudioProcessingSettings.h:498
float MaxAmplitude
Maximum amplitude value for normalization. Used only if bAmplitudeNormalisation is true.
Definition ST_AudioProcessingSettings.h:512
FFFTSmoothingConfig SmoothingConfig
The smoothing configuration for amplitude values. Controls the smoothing behavior for amplitude value...
Definition ST_AudioProcessingSettings.h:519
Structure that holds configuration settings for the FFT (Fast Fourier Transform) Beat detection.
Definition ST_AudioProcessingSettings.h:576
bool bComputeBeat
Definition ST_AudioProcessingSettings.h:586
float MaxBeatEnergy
Definition ST_AudioProcessingSettings.h:600
FFFTFilterConfig FilterConfig
Definition ST_AudioProcessingSettings.h:621
bool bNormalise
Definition ST_AudioProcessingSettings.h:593
FFFTSmoothingConfig SmoothingConfig
Definition ST_AudioProcessingSettings.h:614
float BeatThreshold
Definition ST_AudioProcessingSettings.h:607
Structure that holds configuration settings for FFT.
Definition ST_AudioProcessingSettings.h:631
FFFTPitchConfig PitchConfig
Definition ST_AudioProcessingSettings.h:655
bool bProcessUnchangedBuffer
Definition ST_AudioProcessingSettings.h:683
FFFTWindowingConfig WindowingConfig
Definition ST_AudioProcessingSettings.h:676
FFFTSmoothingConfig SmoothingConfig
Definition ST_AudioProcessingSettings.h:690
FFFTFilterConfig FilterConfig
Definition ST_AudioProcessingSettings.h:669
FFFTAmplitudeConfig AmplitudeConfig
Definition ST_AudioProcessingSettings.h:648
bool bSplitChannels
Definition ST_AudioProcessingSettings.h:704
int32 FFTPaddingFactor
Definition ST_AudioProcessingSettings.h:697
FFFTSpectrumConfig SpectrumConfig
Definition ST_AudioProcessingSettings.h:641
FFFTBeatConfig BeatConfig
Definition ST_AudioProcessingSettings.h:662
Configuration structure for FFT filter settings. Contains various filter settings including the filte...
Definition ST_AudioProcessingSettings.h:300
bool bHighPassFilter
Whether to apply a high-pass filter. Determines if low frequencies are cut off.
Definition ST_AudioProcessingSettings.h:368
float RippleFactor
Ripple factor for the Chebyshev Type I filter. Only used if FilterType is set to ChebyshevTypeI....
Definition ST_AudioProcessingSettings.h:319
float HighPassCutoffHz
Cutoff frequency for the high-pass filter (in Hz). Only used if bHighPassFilter is true.
Definition ST_AudioProcessingSettings.h:375
float BandUpperCutoffHz
Upper cutoff frequency for the bandpass filter (in Hz). Only used if bBandFilter is true.
Definition ST_AudioProcessingSettings.h:354
bool bBandFilter
Whether to apply a bandpass filter. This filter allows a specific frequency band to pass through.
Definition ST_AudioProcessingSettings.h:340
bool bBandReject
Whether to apply a band-reject filter. This filter eliminates a specific frequency band.
Definition ST_AudioProcessingSettings.h:361
float LowPassCutoffHz
Cutoff frequency for the low-pass filter (in Hz). Only used if bLowPassFilter is true.
Definition ST_AudioProcessingSettings.h:333
bool bLowPassFilter
Whether to apply a low-pass filter. Determines if high frequencies are cut off.
Definition ST_AudioProcessingSettings.h:326
float BandLowerCutoffHz
Lower cutoff frequency for the bandpass filter (in Hz). Only used if bBandFilter is true.
Definition ST_AudioProcessingSettings.h:347
EST_FilterType FilterType
The type of filter to apply. Options include None, ChebyshevTypeI, etc.
Definition ST_AudioProcessingSettings.h:310
int32 PaddedMagnitudeCount
Definition ST_AudioProcessingSettings.h:780
int32 PeriodSizeInFrames
Definition ST_AudioProcessingSettings.h:724
float SecondsPerPeriod
Definition ST_AudioProcessingSettings.h:794
int32 TotalBins
Definition ST_AudioProcessingSettings.h:843
int32 BeatHistorySize
Definition ST_AudioProcessingSettings.h:836
int32 PitchHistorySize
Definition ST_AudioProcessingSettings.h:829
int32 PaddedPeriodSizeInFramesPerChannel
Definition ST_AudioProcessingSettings.h:773
int32 FrequencyBandsHistorySize
Definition ST_AudioProcessingSettings.h:815
int32 SampleCount
Definition ST_AudioProcessingSettings.h:759
int32 BytesPerFrame
Definition ST_AudioProcessingSettings.h:731
int32 Channels
Definition ST_AudioProcessingSettings.h:745
int32 SampleRate
Definition ST_AudioProcessingSettings.h:738
int32 GetChannelMultiplier() const
Definition ST_AudioProcessingSettings.h:967
int32 MagnitudesHistorySize
Definition ST_AudioProcessingSettings.h:808
bool bSplitChannels
Definition ST_AudioProcessingSettings.h:752
int32 PaddedMagnitudeCountWithNyquist
Definition ST_AudioProcessingSettings.h:787
float FreqPerBin
Definition ST_AudioProcessingSettings.h:850
int32 TotalBytesPerPeriod
Definition ST_AudioProcessingSettings.h:766
int32 AmplitudeHistorySize
Definition ST_AudioProcessingSettings.h:822
FFFTIOData()=default
float TimePerFrame
Definition ST_AudioProcessingSettings.h:801
Configuration structure for FFT pitch settings. Defines parameters for pitch computation and normaliz...
Definition ST_AudioProcessingSettings.h:529
bool bComputePitch
Whether to compute pitch values. Enables or disables pitch computation.
Definition ST_AudioProcessingSettings.h:538
bool bPitchNormalisation
Whether to normalize the pitch. Scales the pitch values to a specified range.
Definition ST_AudioProcessingSettings.h:545
float MaxFreq
Maximum frequency for pitch computation (in Hz). Used only if bPitchNormalisation is true.
Definition ST_AudioProcessingSettings.h:559
float MinFreq
Minimum frequency for pitch computation (in Hz). Used only if bPitchNormalisation is true.
Definition ST_AudioProcessingSettings.h:552
FFFTSmoothingConfig SmoothingConfig
The smoothing configuration for pitch values. Controls the smoothing behavior for pitch values over t...
Definition ST_AudioProcessingSettings.h:566
Structure for configuring FFT smoothing options.
Definition ST_AudioProcessingSettings.h:276
EST_SmoothingType SmoothingType
Definition ST_AudioProcessingSettings.h:282
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Audio", meta=(SessionRestartRequired, EditCondition="SmoothingType != EST_SmoothingType::None && SmoothingType == EST_SmoothingType::SMA", ClampMin="0.0", UIMin="0.0", Tooltip="Time window (in seconds) used for smoothing values over a set period of time. Larger values result in smoother transitions, while smaller values react more quickly to changes.")) float TimeWindow=0.1f
Configuration structure for FFT spectrum settings. Defines parameters for frequency band computation,...
Definition ST_AudioProcessingSettings.h:413
FFFTSmoothingConfig SmoothingConfig
The smoothing configuration for the spectrum. Controls the smoothing behavior for spectrum values ove...
Definition ST_AudioProcessingSettings.h:479
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Audio", meta=(SessionRestartRequired, EditCondition="bOverrideNyquistLimit && SpectrumSpacing == EST_SpectrumSpacing::Log", Tooltip="Uses CustomMaxFreq instead of NyquistLimit (half the sampling rate)")) float MaxFreq
Maximum frequency for spectrum analysis (in Hz). Used only if Nyquist limit is overridden.
bool bSpectrumNormalisation
Whether to normalize the spectrum. Scales the spectrum to a specified range.
Definition ST_AudioProcessingSettings.h:429
int32 SpectrumBands
Number of frequency bands to use in the spectrum analysis. A higher value provides finer resolution b...
Definition ST_AudioProcessingSettings.h:437
EST_SpectrumValues SpectrumValues
The type of values to display in the spectrum. Options include averages and peaks.
Definition ST_AudioProcessingSettings.h:451
float MinFreq
Minimum frequency for spectrum analysis (in Hz). Used only if SpectrumSpacing is Logarithmic.
Definition ST_AudioProcessingSettings.h:458
EST_SpectrumSpacing SpectrumSpacing
The type of spectrum spacing to use. Options include logarithmic, linear, octave subdivision,...
Definition ST_AudioProcessingSettings.h:444
bool bComputeFrequencyBands
Whether to compute frequency bands. Enables or disables the frequency band computation in the spectru...
Definition ST_AudioProcessingSettings.h:422
bool bOverrideNyquistLimit
Whether to override the Nyquist limit (half the sampling rate). Used only if SpectrumSpacing is Logar...
Definition ST_AudioProcessingSettings.h:465
Configuration structure for FFT windowing function. Contains the windowing function type and addition...
Definition ST_AudioProcessingSettings.h:385
float GaussianWindowSigma
Sigma parameter for the Gaussian window. Only used if WindowingFunction is set to Gaussian....
Definition ST_AudioProcessingSettings.h:403
EST_WindowingFunction WindowingFunction
The type of windowing function to apply. Options include Hann, Gaussian, etc.
Definition ST_AudioProcessingSettings.h:394
Structure that holds configuration for the playback engine.
Definition ST_AudioProcessingSettings.h:1226
FString InputFilePath
Path to the input file for the playback engine. @meta (SessionRestartRequired)
Definition ST_AudioProcessingSettings.h:1242
EST_AudioFileLocation AudioFileLocation
Where the InputFilePath Should start. @meta (SessionRestartRequired)
Definition ST_AudioProcessingSettings.h:1235
Structure that holds configuration for playback from a player.
Definition ST_AudioProcessingSettings.h:1195
bool bLooping
Whether the audio playback should loop. @meta (SessionRestartRequired)
Definition ST_AudioProcessingSettings.h:1204
EST_AudioFileLocation AudioFileLocation
Where the InputFilePath Should start. @meta (SessionRestartRequired)
Definition ST_AudioProcessingSettings.h:1211
FString InputFilePath
Path to the input file for playback. @meta (SessionRestartRequired)
Definition ST_AudioProcessingSettings.h:1218
Structure that holds configuration for playback of the waveform.
Definition ST_AudioProcessingSettings.h:1137
float WaveformAmplitude
Definition ST_AudioProcessingSettings.h:1179
float WaveformFrequency
Definition ST_AudioProcessingSettings.h:1187
int32 SampleRate
The sample rate of the audio (e.g., 48000, 44100). @meta (SessionRestartRequired)
Definition ST_AudioProcessingSettings.h:1163
EST_WaveformType WaveformType
The waveform type for the audio data.
Definition ST_AudioProcessingSettings.h:1171
int32 Channels
The number of audio channels (e.g., 1 for mono, 2 for stereo). @meta (SessionRestartRequired)
Definition ST_AudioProcessingSettings.h:1156
EST_SampleFormat SampleFormat
The sample format for the audio data.
Definition ST_AudioProcessingSettings.h:1149