From 498d5466fd1c273ae08ec104cc868793ee7fadc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Willi=20B=C3=BCcking?= Date: Wed, 21 Jun 2023 14:38:31 +0200 Subject: [PATCH 1/6] add second FFT-Function with real and imaginary output for resynthesis --- VL.Audio.vl | 270 ++++++++++++++++++++++++++++-- src/Backup/VL.Audio.sln | 25 +++ src/Signals/Sinks/FFTOutSignal.cs | 8 + src/UpgradeLog.htm | Bin 0 -> 32934 bytes src/VL.Audio.sln | 4 +- 5 files changed, 289 insertions(+), 18 deletions(-) create mode 100644 src/Backup/VL.Audio.sln create mode 100644 src/UpgradeLog.htm diff --git a/VL.Audio.vl b/VL.Audio.vl index 71a869d..fa37a82 100644 --- a/VL.Audio.vl +++ b/VL.Audio.vl @@ -1,6 +1,6 @@  - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/src/Nodes/NodeFactory.cs b/src/Nodes/NodeFactory.cs index 83d10eb..08cebb4 100644 --- a/src/Nodes/NodeFactory.cs +++ b/src/Nodes/NodeFactory.cs @@ -22,6 +22,7 @@ public NodeFactory(string directory = default, string directoryToWatch = default Directory = directory; DirectoryToWatch = directoryToWatch; + var builder = ImmutableArray.CreateBuilder(); //sources builder.Add(new NodeDescription(this, typeof(ADSRSignal), "ADSR", "Source", "Generates an ADSR envelope in 0..1 range", "", "envelope")); diff --git a/src/Signals/Sinks/FFTOutSignal.cs b/src/Signals/Sinks/FFTOutSignal.cs index 09f4340..0779bf5 100644 --- a/src/Signals/Sinks/FFTOutSignal.cs +++ b/src/Signals/Sinks/FFTOutSignal.cs @@ -70,9 +70,8 @@ public WindowFunction WindowFunc double[] FFFTBuffer = new double[1]; Complex[] FFFTComplexBuffer = new Complex[1]; public float[] FFTOut = new float[2]; - public float[] FFTOutFull = new float[2]; - public float[] FFTOutRealVal = new float[2]; - public float[] FFTOutImagVal = new float[2]; + public double[] FFTOutRealVal = new double[2]; + public double[] FFTOutImagVal = new double[2]; double[] FWindow = new double[1]; private float FdBRange; @@ -90,9 +89,8 @@ protected override void FillBuffer(float[] buffer, int offset, int count) FFFTBuffer = new double[fftSize]; FFFTComplexBuffer = new Complex[fftSize]; FFTOut = new float[fftSize/2]; - FFTOutFull = new float[fftSize / 2]; - FFTOutRealVal = new float[fftSize / 2]; - FFTOutImagVal = new float[fftSize / 2]; + FFTOutRealVal = new double[fftSize / 2]; + FFTOutImagVal = new double[fftSize / 2]; FWindow = AudioUtils.CreateWindowDouble(fftSize, WindowFunc); } @@ -119,8 +117,8 @@ void CalcFFT(float[] ringbufferData) var lastValue = FFTOut[n]; var newValue = (float)Decibels.LinearToDecibels(Math.Max(complex[n].MagnitudeSquared, FMindB)) / FdBRange + 1; FFTOut[n] = newValue * (1 - Smoothing) + lastValue * Smoothing; - FFTOutRealVal[n] = (float)complex[n].Real; - FFTOutImagVal[n] = (float)complex[n].Imaginary; + FFTOutRealVal[n] = complex[n].Real; + FFTOutImagVal[n] = complex[n].Imaginary; } } } From b84242201a86b6572a0e01a6d6046fd96227ebc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Willi=20B=C3=BCcking?= Date: Tue, 27 Jun 2023 16:19:06 +0200 Subject: [PATCH 3/6] add separate IFFT-Function with double-precision. --- "runtimes/VL.Audio - Verkn\303\274pfung.lnk" | Bin 0 -> 1641 bytes src/Nodes/NodeFactory.cs | 1 + src/Signals/Sources/IFFTSignalDouble.cs | 167 +++++++++++++++++++ 3 files changed, 168 insertions(+) create mode 100644 "runtimes/VL.Audio - Verkn\303\274pfung.lnk" create mode 100644 src/Signals/Sources/IFFTSignalDouble.cs diff --git "a/runtimes/VL.Audio - Verkn\303\274pfung.lnk" "b/runtimes/VL.Audio - Verkn\303\274pfung.lnk" new file mode 100644 index 0000000000000000000000000000000000000000..f179891878a59067bd8e86c184dda8fded217000 GIT binary patch literal 1641 zcmcIjPe_wt82@cbXmwB=Vqz+Rq14tlHCrR`&un@aDv4t8f#$Y!Zf>^EPrXEk4wAZ4 zXc8G#)*=cNih?pd)g@v`gw`cI6cr^Nf({+}y`RmwNMncI@q6Cqd!A>{|JMOPXV8-Z z3mS!e1Sv=(f3kY=YSHwvZY1fl{==QvttqM3t=n%$C2$iGJ@Z*I8Y<+z^6vCQ?%#Kg*gUBHy}<@|$#?;O=LMdv?V8G2q-!MD*) z9b-?m@)l>n*y}V727N|J(#AY9{_*&HBxJwYvGn@8uDGpaVmP#D_?G^-A-OucLJt2+ zf0wT|mHubx+uYRH^i`UBYs1Cb@Q+Bwv~p(O809VzIFG0zwjNPF3Som4GGb3k#&(ZD zM*RB9TdrAj{fa~?+6j@0gja@J?N1#R+moLem-bKeygEyHvak>dOGFcAX(kR6#TsXZ z1xNTRLn);tI7&OA6IzL~Qp$w3gwhg?H`C5S2r8tdw6yS7CIazv6CxRDt>DpWZFbtN zHGTW&wJ-MyDBmdzL^5nMpZuT82Z)+BGTzOP8l2|NyS42MvipAWLCVFMBSfUz-Oj@D zvBmU%w)Frs?v*(Y=&+ a5nAH97hNmHbCUgntIN0}Y#0*q==lZru_!kH literal 0 HcmV?d00001 diff --git a/src/Nodes/NodeFactory.cs b/src/Nodes/NodeFactory.cs index 08cebb4..a54d47c 100644 --- a/src/Nodes/NodeFactory.cs +++ b/src/Nodes/NodeFactory.cs @@ -31,6 +31,7 @@ public NodeFactory(string directory = default, string directoryToWatch = default builder.Add(new NodeDescription(this, typeof(ValueToAudioSignal), "V2A", "Source", "Converts a value into a static audio signal", "", "")); builder.Add(new NodeDescription(this, typeof(GranulatorSignal), "Granulator2 (Internal)", "Source", "Reads grains from an audio file", "", "granular synthesis")); builder.Add(new NodeDescription(this, typeof(IFFTSignal), "IFFT", "Source", "Creates an audio signal from spectrum data", "", "additive synthesis inverse")); + builder.Add(new NodeDescription(this, typeof(IFFTSignalDouble), "IFFTDouble", "Source", "Creates an audio signal from spectrum data", "", "additive synthesis inverse")); builder.Add(new NodeDescription(this, typeof(ValueSequenceSignal), "ValueSequence2 (Internal)", "Source", "Generates a sequence of values which are played back as an audio signal", "", "sequencer clip loop")); //filter diff --git a/src/Signals/Sources/IFFTSignalDouble.cs b/src/Signals/Sources/IFFTSignalDouble.cs new file mode 100644 index 0000000..5e34ea6 --- /dev/null +++ b/src/Signals/Sources/IFFTSignalDouble.cs @@ -0,0 +1,167 @@ +/* + * Created by SharpDevelop. + * User: TF + * Date: 02.05.2015 + * Time: 12:09 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.Collections.Generic; +using Lomont; +using VL.Lib.Collections; + +namespace VL.Audio +{ + public class IFFTPullBufferDouble : CircularPullBuffer + { + public IFFTPullBufferDouble(SigParam> fftDataReal, SigParam> fftDataImag, int size, WindowFunction window) + : base(size) + { + FFFTDataReal = fftDataReal; + FFFTDataImag = fftDataImag; + RealImagData = new double[size]; + TimeDomain = new float[size]; + Window = AudioUtils.CreateWindowDouble(size, window); + WindowFunc = window; + WindowFunc = window; + PullCount = size; + } + + readonly SigParam> FFFTDataReal; + readonly SigParam> FFFTDataImag; + readonly double[] RealImagData; + readonly double[] Window; + public readonly WindowFunction WindowFunc; + readonly float[] TimeDomain; + readonly LomontFFT FFFT = new LomontFFT(); + + public double Gain = 1; + + public override void Pull(int count) + { + var real = FFFTDataReal.Value ?? Spread.Empty; + var imag = FFFTDataImag.Value ?? Spread.Empty; + + var copyCount = Math.Min(count / 2, Math.Max(real.Count, imag.Count)); + var j = 0; + + if (real.Count > imag.Count) + { + if (imag.Count == 0) + { + for (int i = 0; i < copyCount; i++) + { + RealImagData[j++] = real[i]; + RealImagData[j++] = 0.0; + } + } + else + { + for (int i = 0; i < copyCount; i++) + { + RealImagData[j++] = real[i]; + RealImagData[j++] = imag[AudioUtils.Zmod(i, imag.Count)]; + } + } + } + else if(real?.Count == imag?.Count) + { + for (int i = 0; i < copyCount; i++) + { + RealImagData[j++] = real[i]; + RealImagData[j++] = imag[i]; + } + } + else + { + if (real.Count == 0) + { + for (int i = 0; i < copyCount; i++) + { + RealImagData[j++] = 0.0; + RealImagData[j++] = imag[i]; + } + } + else + { + for (int i = 0; i < copyCount; i++) + { + RealImagData[j++] = real[AudioUtils.Zmod(i, real.Count)]; + RealImagData[j++] = imag[i]; + } + } + } + + if(copyCount < count/2) + { + + for (int i = copyCount; i < count/2; i++) + { + RealImagData[j++] = 0; + RealImagData[j++] = 0; + } + } + + FFFT.RealFFT(RealImagData, false); + + //RealImagData[0] = RealImagData[1]; + + TimeDomain.WriteDoubleWindowed(RealImagData, Window, 0, count, Gain); + + Write(TimeDomain, 0, count); + } + } + + /// + /// Description of IFFTSignal. + /// + public class IFFTSignalDouble : AudioSignal + { + SigParam> FFTDataReal = new SigParam>("FFT Data Real"); + SigParam> FFTDataImag = new SigParam>("FFT Data Imaginary"); + SigParam FWindowFunc = new SigParam("Window Function"); + SigParam FGain = new SigParam("Gain", 0.5); + SigParam FBufferSize = new SigParam("IFFT Buffer Size", true); + + public IFFTSignalDouble() + { + } + + IFFTPullBufferDouble FIFFTBuffer; + + int NextPow2(int val) + { + var result = 2; + while(result < val) + { + result *= 2; + } + + return result; + } + + protected override void FillBuffer(float[] buffer, int offset, int count) + { + //recreate ring buffer? + var size = Math.Max(NextPow2(FFTDataReal.Value?.Count ?? 0), NextPow2(FFTDataImag.Value?.Count ?? 0)) * 2; + + if (size < count) + { + FBufferSize.Value = 0; + return; + } + + if(FIFFTBuffer == null || size != FIFFTBuffer.PullCount || FWindowFunc.Value != FIFFTBuffer.WindowFunc) + { + FIFFTBuffer = new IFFTPullBufferDouble(FFTDataReal, FFTDataImag, size, FWindowFunc.Value); + FBufferSize.Value = size; + } + + FIFFTBuffer.Gain = FGain.Value; + + //perform IFFT + FIFFTBuffer.Read(buffer, offset, count); + } + } +} From 6b0642deafb4f04ca525437c5e721d6df849c55c Mon Sep 17 00:00:00 2001 From: Willi Date: Wed, 28 Jun 2023 14:54:16 +0200 Subject: [PATCH 4/6] remove unnecessarily created files --- "runtimes/VL.Audio - Verkn\303\274pfung.lnk" | Bin 1641 -> 0 bytes src/Backup/VL.Audio.sln | 25 ------------------- src/UpgradeLog.htm | Bin 32934 -> 0 bytes 3 files changed, 25 deletions(-) delete mode 100644 "runtimes/VL.Audio - Verkn\303\274pfung.lnk" delete mode 100644 src/Backup/VL.Audio.sln delete mode 100644 src/UpgradeLog.htm diff --git "a/runtimes/VL.Audio - Verkn\303\274pfung.lnk" "b/runtimes/VL.Audio - Verkn\303\274pfung.lnk" deleted file mode 100644 index f179891878a59067bd8e86c184dda8fded217000..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1641 zcmcIjPe_wt82@cbXmwB=Vqz+Rq14tlHCrR`&un@aDv4t8f#$Y!Zf>^EPrXEk4wAZ4 zXc8G#)*=cNih?pd)g@v`gw`cI6cr^Nf({+}y`RmwNMncI@q6Cqd!A>{|JMOPXV8-Z z3mS!e1Sv=(f3kY=YSHwvZY1fl{==QvttqM3t=n%$C2$iGJ@Z*I8Y<+z^6vCQ?%#Kg*gUBHy}<@|$#?;O=LMdv?V8G2q-!MD*) z9b-?m@)l>n*y}V727N|J(#AY9{_*&HBxJwYvGn@8uDGpaVmP#D_?G^-A-OucLJt2+ zf0wT|mHubx+uYRH^i`UBYs1Cb@Q+Bwv~p(O809VzIFG0zwjNPF3Som4GGb3k#&(ZD zM*RB9TdrAj{fa~?+6j@0gja@J?N1#R+moLem-bKeygEyHvak>dOGFcAX(kR6#TsXZ z1xNTRLn);tI7&OA6IzL~Qp$w3gwhg?H`C5S2r8tdw6yS7CIazv6CxRDt>DpWZFbtN zHGTW&wJ-MyDBmdzL^5nMpZuT82Z)+BGTzOP8l2|NyS42MvipAWLCVFMBSfUz-Oj@D zvBmU%w)Frs?v*(Y=&+ a5nAH97hNmHbCUgntIN0}Y#0*q==lZru_!kH diff --git a/src/Backup/VL.Audio.sln b/src/Backup/VL.Audio.sln deleted file mode 100644 index 5abeb19..0000000 --- a/src/Backup/VL.Audio.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.3.32825.248 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VL.Audio", "VL.Audio.csproj", "{EEF53D4C-9734-44FE-9C40-3BDD345D8AE8}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {EEF53D4C-9734-44FE-9C40-3BDD345D8AE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EEF53D4C-9734-44FE-9C40-3BDD345D8AE8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EEF53D4C-9734-44FE-9C40-3BDD345D8AE8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EEF53D4C-9734-44FE-9C40-3BDD345D8AE8}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1C3F540F-C837-4FE3-B5BC-6563002CAD86} - EndGlobalSection -EndGlobal diff --git a/src/UpgradeLog.htm b/src/UpgradeLog.htm deleted file mode 100644 index 47096650456cfaaf1b2c1f4a9ac54d071d0a9818..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32934 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

pXAStSbtlOUd(}AjVCYm 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 Date: Wed, 28 Jun 2023 14:55:15 +0200 Subject: [PATCH 5/6] revert accidentially changed VL.Audio.sln back to previous version --- src/VL.Audio.sln | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VL.Audio.sln b/src/VL.Audio.sln index 644234d..5abeb19 100644 --- a/src/VL.Audio.sln +++ b/src/VL.Audio.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31911.196 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32825.248 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VL.Audio", "VL.Audio.csproj", "{EEF53D4C-9734-44FE-9C40-3BDD345D8AE8}" EndProject From 97c24f748b1b29a0930668d2cbde9f58740a2369 Mon Sep 17 00:00:00 2001 From: Willi Date: Wed, 28 Jun 2023 15:03:11 +0200 Subject: [PATCH 6/6] revert accidental changes to VL.Audio.vl --- VL.Audio.vl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/VL.Audio.vl b/VL.Audio.vl index 210f0f9..7469e3f 100644 --- a/VL.Audio.vl +++ b/VL.Audio.vl @@ -29753,12 +29753,12 @@ - - - - + + + + - - + + \ No newline at end of file