mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
Audio visualizer
This commit is contained in:
@@ -18,6 +18,9 @@ namespace GHelper.AnimeMatrix
|
||||
|
||||
public static bool IsValid => mat != null;
|
||||
|
||||
private static long lastPresent;
|
||||
private static List<double> maxes = new List<double>();
|
||||
|
||||
public AniMatrix()
|
||||
{
|
||||
try
|
||||
@@ -164,7 +167,7 @@ namespace GHelper.AnimeMatrix
|
||||
|
||||
}
|
||||
|
||||
private static void WaveIn_DataAvailable(object? sender, WaveInEventArgs e)
|
||||
private void WaveIn_DataAvailable(object? sender, WaveInEventArgs e)
|
||||
{
|
||||
int bytesPerSamplePerChannel = AudioDevice.WaveFormat.BitsPerSample / 8;
|
||||
int bytesPerSample = bytesPerSamplePerChannel * AudioDevice.WaveFormat.Channels;
|
||||
@@ -194,7 +197,50 @@ namespace GHelper.AnimeMatrix
|
||||
double[] paddedAudio = FftSharp.Pad.ZeroPad(AudioValues);
|
||||
double[] fftMag = FftSharp.Transform.FFTmagnitude(paddedAudio);
|
||||
|
||||
mat.PresentAudio(fftMag);
|
||||
PresentAudio(fftMag);
|
||||
}
|
||||
|
||||
private void DrawBar(int pos, double h)
|
||||
{
|
||||
int dx = pos * 2;
|
||||
int dy = 20;
|
||||
|
||||
byte color;
|
||||
|
||||
for (int y = 0; y < h - (h % 2); y++)
|
||||
for (int x = 0; x < 2 - (y % 2); x++)
|
||||
{
|
||||
//color = (byte)(Math.Min(1,(h - y - 2)*2) * 255);
|
||||
mat.SetLedPlanar(x + dx, dy + y, (byte)(h * 255 / 30));
|
||||
mat.SetLedPlanar(x + dx, dy - y, 255);
|
||||
}
|
||||
}
|
||||
|
||||
void PresentAudio(double[] audio)
|
||||
{
|
||||
|
||||
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastPresent) < 70) return;
|
||||
lastPresent = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
||||
|
||||
mat.Clear();
|
||||
|
||||
int size = 20;
|
||||
double[] bars = new double[size];
|
||||
double max = 2, maxAverage;
|
||||
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
bars[i] = Math.Sqrt(audio[i] * 10000);
|
||||
if (bars[i] > max) max = bars[i];
|
||||
}
|
||||
|
||||
maxes.Add(max);
|
||||
if (maxes.Count > 20) maxes.RemoveAt(0);
|
||||
maxAverage = maxes.Average();
|
||||
|
||||
for (int i = 0; i < size; i++) DrawBar(20 - i, bars[i]*20/maxAverage);
|
||||
|
||||
mat.Present();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Source thanks to https://github.com/vddCore/Starlight with some adjustments from me
|
||||
|
||||
using Starlight.Communication;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Drawing.Text;
|
||||
using System.Globalization;
|
||||
@@ -99,8 +98,6 @@ namespace Starlight.AnimeMatrix
|
||||
|
||||
private static AnimeType _model = AnimeType.GA402;
|
||||
|
||||
private static long lastPresent;
|
||||
private static List<double> maxes = new List<double>();
|
||||
|
||||
public AnimeMatrixDevice()
|
||||
: base(0x0B05, 0x193B, 640)
|
||||
@@ -361,48 +358,6 @@ namespace Starlight.AnimeMatrix
|
||||
PresentTextDiagonal(time);
|
||||
}
|
||||
|
||||
private void DrawBar(int pos, double h)
|
||||
{
|
||||
int dx = pos*2;
|
||||
int dy = 20;
|
||||
|
||||
byte color;
|
||||
|
||||
for (int y = 0; y < h - (h % 2); y++)
|
||||
for (int x = 0; x < 2 - (y % 2); x++)
|
||||
{
|
||||
//color = (byte)(Math.Min(1,(h - y - 2)*2) * 255);
|
||||
SetLedPlanar(x + dx, dy + y, (byte)(h* 255 / 30) );
|
||||
SetLedPlanar(x + dx, dy - y, 255);
|
||||
}
|
||||
}
|
||||
|
||||
public void PresentAudio(double[] audio)
|
||||
{
|
||||
|
||||
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastPresent) < 70) return;
|
||||
lastPresent = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
||||
|
||||
Clear();
|
||||
|
||||
int size = 20;
|
||||
double[] bars = new double[size];
|
||||
double max = 2, maxAverage;
|
||||
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
bars[i] = Math.Sqrt(audio[i] * 10000);
|
||||
if (bars[i] > max) max = bars[i];
|
||||
}
|
||||
|
||||
maxes.Add(max);
|
||||
if (maxes.Count > 20) maxes.RemoveAt(0);
|
||||
maxAverage = maxes.Average();
|
||||
|
||||
for (int i = 0; i < size; i++) DrawBar(20 - i, bars[i] / maxAverage * 20);
|
||||
|
||||
Present();
|
||||
}
|
||||
|
||||
|
||||
public void PresentText(string text1, string text2 = "")
|
||||
|
||||
Reference in New Issue
Block a user