2022-11-21 17:56:52 +01:00

294 lines
12 KiB
GLSL

Shader "AudioLink/Debug/AudioLinkDebug"
{
Properties
{
_SpectrumGain ("Spectrum Gain", Float) = 1.
_SampleGain ("Sample Gain", Float) = 1.
_SeparatorColor ("Seperator Color", Color) = (.5,.5,0.,1.)
_SpectrumColorMix ("Spectrum Color Mix", Range(0, 1)) = 0
_SampleColorL ("Left Waveform", Color) = (.5, .5, .9, 1.)
_SampleColorR ("Right Waveform", Color) = (.9, .5, .5, 1.)
_SampleColorC ("Center Waveform", Color) = (.0, .0, .0, .0)
_SpectrumFixedColor ("Spectrum Fixed color", Color) = (.9, .9, .9,1.)
_SpectrumFixedColorForSlow ("Spectrum Fixed color for slow", Color) = (.9, .9, .9,1.)
_BaseColor ("Base Color", Color) = (0, 0, 0, 0)
_UnderSpectrumColor ("Under-Spectrum Color", Color) = (1, 1, 1, .1)
_SampleVertOffset( "Sample Vertical OFfset", Float ) = 0.0
_SpectrumVertOffset( "Spectrum Vertical OFfset", Float ) = 0.0
_SampleThickness ("Sample Thickness", Float) = .02
_SpectrumThickness ("Spectrum Thickness", Float) = .01
_WaveformZoom ("Waveform Zoom", Float) = 2.0
_VUOpacity( "VU Opacity", Float) = 0.5
[ToggleUI] _ShowVUInMain("Show VU In Main", Float) = 0
[ToggleUI] _EnableColorChord("Show ColorChord", Float) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
#include "/Assets/AudioLink/Shaders/AudioLink.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
float _SpectrumGain;
float _SampleGain;
float _SpectrumColorMix;
float4 _SeparatorColor;
float _SampleThickness;
float _SpectrumThickness;
float _SampleVertOffset;
float4 _SampleColorL;
float4 _SampleColorR;
float4 _SampleColorC;
float4 _SpectrumFixedColor;
float4 _SpectrumFixedColorForSlow;
float4 _BaseColor;
float4 _UnderSpectrumColor;
float _SpectrumVertOffset;
float _VUOpacity;
float _ShowVUInMain;
float _WaveformZoom;
float _EnableColorChord;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv * float2(1.25, 1.15);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float2 iuv = i.uv;
float4 spectrum_value = 0;
uint noteno = iuv.x * AUDIOLINK_EXPBINS * AUDIOLINK_EXPOCT;
float notenof = iuv.x * AUDIOLINK_EXPBINS * AUDIOLINK_EXPOCT;
uint readno = noteno % AUDIOLINK_EXPBINS;
float readnof = fmod(notenof, AUDIOLINK_EXPBINS);
int reado = (noteno / AUDIOLINK_EXPBINS);
float readof = notenof / AUDIOLINK_EXPBINS;
spectrum_value = AudioLinkLerpMultiline( ALPASS_DFT + float2( notenof, 0 ) ) * _SpectrumGain;
spectrum_value.x *= 1.; // Quick, unfiltered spectrum.
spectrum_value.y *= 1.; // Slower, filtered spectrum
float4 coloro = _BaseColor;
//Output any debug notes
if( _EnableColorChord > 0.5 )
{
#define MAXNOTES 10
#define PASS_SIX_OFFSET int2(12,22) //Pass 6: ColorChord Notes Note: This is reserved to 32,16.
int selnote = (int)(iuv.x * 10);
float4 NoteSummary = AudioLinkData( ALPASS_CCINTERNAL );
float4 Note = AudioLinkData( ALPASS_CCINTERNAL + uint2(selnote+1,0) );
float intensity = clamp( Note.z * .01, 0, 1 );
if( abs( iuv.y - intensity ) < 0.05 && intensity > 0 )
{
return float4(AudioLinkCCtoRGB( Note.x, 1.0, AUDIOLINK_ROOTNOTE ), 1.);
}
if( iuv.y > 1 )
{
#define PASS_EIGHT_OFFSET int2(0,24)
//Output Linear
return AudioLinkData( PASS_EIGHT_OFFSET + uint2( iuv.x * 128, 0 ) );
}
}
if( iuv.x < 1. )
{
//The first-note-segmenters
float3 vertical_bars = max(0.,1.3-length(readnof-1.3) );
coloro += float4( vertical_bars * _SeparatorColor, 1. );
//Waveform
// Get whole waveform would be / 1.
float sinpull = (AUDIOLINK_EXPBINS * AUDIOLINK_EXPOCT - 1 - notenof) / _WaveformZoom; //2. zooms into the first half.
sinpull = clamp( sinpull, 0.5, 2045.5 ); //Prevent overflows.
float4 sinewaveval = AudioLinkLerpMultiline( ALPASS_WAVEFORM + float2( sinpull, 0 ) ) * _SampleGain;
//If line has more significant slope, roll it extra wide.
float ddd = 1.+length(float2(ddx( sinewaveval.x ),ddy(sinewaveval.y)))*20;
float sinewavevalC = sinewaveval.x;
float sinewavevalL = sinewaveval.x + sinewaveval.a;
float sinewavevalR = sinewaveval.x - sinewaveval.a;
coloro += _SampleColorR * max( 100.*((_SampleThickness*ddd)-abs( sinewavevalR - iuv.y*2.+1. + _SampleVertOffset )), 0. );
coloro += _SampleColorL * max( 100.*((_SampleThickness*ddd)-abs( sinewavevalL - iuv.y*2.+1. + _SampleVertOffset )), 0. );
coloro += _SampleColorC * max( 100.*((_SampleThickness*ddd)-abs( sinewavevalC - iuv.y*2.+1. + _SampleVertOffset )), 0. );
//Under-spectrum first
float rval = clamp( _SpectrumThickness - iuv.y + spectrum_value.z + _SpectrumVertOffset, 0., 1. );
rval = min( 1., 1000*rval );
coloro = lerp( coloro, _UnderSpectrumColor, rval * _UnderSpectrumColor.a );
//Spectrum-Line second
rval = max( _SpectrumThickness - abs( spectrum_value.z - iuv.y + _SpectrumVertOffset), 0. );
rval = min( 1., 1000*rval );
coloro = lerp( coloro, fixed4( lerp( AudioLinkCCtoRGB(noteno, 1.0, AUDIOLINK_ROOTNOTE ), _SpectrumFixedColor, _SpectrumColorMix ), 1.0 ), rval );
//Other Spectrum-Line second
rval = max( _SpectrumThickness - abs( spectrum_value.x - iuv.y + _SpectrumVertOffset), 0. );
rval = min( 1., 1000*rval );
coloro = lerp( coloro, fixed4( lerp( AudioLinkCCtoRGB(noteno, 1.0, AUDIOLINK_ROOTNOTE ), _SpectrumFixedColorForSlow, _SpectrumColorMix ), 1.0 ), rval );
}
//Potentially draw
if( _ShowVUInMain > 0.5 && iuv.x > 1-1/8. && iuv.x < 1. && iuv.y > 0.5 )
{
iuv.x = (((iuv.x * 8.)-7) + 1.);
iuv.y = (iuv.y*2.) -1.;
}
if( iuv.x >= 1 && iuv.x < 2. )
{
float UVy = iuv.y;
float UVx = iuv.x-1.;
float Marker = 0.;
float Value = 0.;
float4 Marker4 = AudioLinkData( ALPASS_GENERALVU + int2( 9, 0 ) );
float4 Value4 = AudioLinkData( ALPASS_GENERALVU + int2( 8, 0 ) );
float whichVUMeter = UVx * 16;
if( whichVUMeter <= 2 )
{
//P-P
if( whichVUMeter <= 1 )
{
Marker = Marker4.x;
Value = Value4.x;
}
else
{
Marker = Marker4.y;
Value = Value4.y;
}
}
else
{
//RMS
if( whichVUMeter <= 3 )
{
Marker = Marker4.z;
Value = Value4.z;
}
else
{
Marker = Marker4.w;
Value = Value4.w;
}
}
if( glsl_mod( whichVUMeter, 1.0 ) < 0.1 ) { Marker = 0; Value = 0; }
Marker = log( Marker ) * 10.;
Value = log( Value ) * 10.;
float4 VUColor = 0.;
int c = floor( UVy * 20 );
float cp = glsl_mod( UVy * 20, 1. );
float guard_separator = 0.02;
float gsx = guard_separator * (.8-100.*length( float2( ddx(UVx), ddy(UVx))) )*1.;
float gsy = guard_separator * (.8-100.*length( float2( ddx(UVy), ddy(UVy))) )*1.;
if( UVx > 0.50 + gsx )
{
if( c > 18 )
VUColor = float4( 1., 0., 0., 1. );
else if( c > 15 )
VUColor = float4( 0.8, 0.8, 0., 1. );
else
VUColor = float4( 0., 1., 0., 1. );
}
else if( UVx <= 0.50 - gsx )
{
if( c > 15 )
VUColor = float4( 1., 0., 0., 1. );
else if( c > 12 )
VUColor = float4( 0.8, 0.8, 0., 1. );
else
VUColor = float4( 0., 1., 0., 1. );
}
float thisdb = (-1+UVy) * 30;
float VUColorspectrum_valuesity = 0.;
//Historical Peak
if( abs( thisdb - Marker ) < 0.2 )
{
VUColorspectrum_valuesity = 1.;
}
else
{
if( cp > gsy*20. )
{
if( thisdb < Value )
{
VUColorspectrum_valuesity = 0.4;
}
}
else
{
VUColorspectrum_valuesity = 0.02;
}
}
VUColor *= VUColorspectrum_valuesity;
coloro = lerp( VUColor, coloro, _VUOpacity );
}
// apply fog
UNITY_APPLY_FOG(i.fogCoord, coloro);
return coloro;
//Graph-based spectrogram.
}
ENDCG
}
}
}