NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/AnalyerGenData.cs

201 lines
5.5 KiB
C#

using CriWare;
using CriWare.Assets;
using System;
using System.Collections.Generic;
using UnityEngine;
public class AnalyerGenData : MonoBehaviour
{
// Start is called before the first frame update
private CriAtomExOutputAnalyzer analyzer;
float playtime;
private List<float[]> list;
CriAtomSourceForAsset atomAsset;
public Action<List<float[]>> onPlay;
bool islist = false;
void Start()
{
//EditorAudioManager.Instance.Init();
//EditorAudioManager.Instance.Start();
nowtime = 0;
list = new List<float[]>();
analyzer = new CriAtomExOutputAnalyzer(NewConfig());
GenOnePeriodData();
}
public async void SetOnPlay(Action<List<float[]>> action, int time, string musicName)
{
//ResetData();
//AttachAnalyzer();
playtime = time;
onPlay = action;
// EditorAudioManager.Instance.RegisterAnalyzer(analyzer);
//await EditorAudioManager.Instance.PlayAudio("DemoProj_M1");
atomAsset = GameObject.Find("Audio(Singleton)").GetComponent<CriAtomSourceForAsset>();
DebugUtil.Log("时间" + atomAsset.time);
//atomAsset.Play("bgm_01");
islist = true;
}
void GenOnePeriodData()
{
float[] temp3 = new float[16];
for (int i = 0; i < 16; i++)
{
float y = amplitude * Mathf.Sin(i * (2 * (Mathf.PI / 16)));
y = y + 2;
temp3[i] = y;
}
temp3[temp3.Length - 1] = 2;
list.Add(temp3);
float[] lastArray = temp3;
for (int i = 0; i < 16; i++)
{
float[] newArray =new float[16];
for (int j = 0; j < 16; j++)
{
newArray[(j + 1) % 16] = lastArray[j];
}
for (int k = 0; k < 16; k++)
{
lastArray[k] = (newArray[k]);
}
list.Add(newArray);
}
}
void GetNewOnePeriodData()
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 16; j++)
{
}
}
}
private bool SplitBandsOnLogScale(ref float[] iLinearLvs, ref float[] oLogLvs)
{
if (iLinearLvs == null || oLogLvs == null)
return false;
float lowBand, highBand, tmpVal;
int lowBandIdx, highBandIdx, i, j;
int iBandCnt = iLinearLvs.Length;
int oBandCnt = oLogLvs.Length;
for (i = 0; i < oBandCnt; ++i)
{
/* 指定の対数スケールバンドに対応する、リニア周波数軸上の範囲を求める */
lowBand = Mathf.Pow((float)iBandCnt, (float)i / (float)oBandCnt);
highBand = Mathf.Pow((float)iBandCnt, (float)(i + 1) / (float)oBandCnt);
/* 両端を丸める */
lowBandIdx = Mathf.FloorToInt(lowBand) - 1;
highBandIdx = Mathf.FloorToInt(highBand) - 1;
/* 範囲内のレベルの平均値を求める */
tmpVal = 0;
for (j = lowBandIdx; j <= highBandIdx; ++j)
{
tmpVal += iLinearLvs[j];
}
tmpVal = tmpVal / (float)(highBandIdx - lowBandIdx + 1);
/* 対数スケールのレベル値を出力する */
oLogLvs[i] = tmpVal;
}
return true;
}
void ResetData()
{
list.Clear();
nowtime = 0;
}
void AttachAnalyzer()
{
atomAsset.AttachToAnalyzer(analyzer);
}
CriWare.CriAtomExOutputAnalyzer.Config NewConfig()
{
CriWare.CriAtomExOutputAnalyzer.Config config = new CriAtomExOutputAnalyzer.Config();
config.enableSpectrumAnalyzer = true;
config.numSpectrumAnalyzerBands = 16;
return config;
}
float[] levels = new float[16];
float nowtime;
// Update is called once per frame
public float amplitude = 1.0f; // 振幅
public float frequency = 1.0f; // 频率
public float speed = 1.0f; // 波形变化速度
public int minAmplitude = 1; // 最小振幅
public int maxAmplitude = 5; // 最大振幅
void Update()
{
if (!islist)
{
return;
}
//EditorAudioManager.Instance.Update(Time.deltaTime);
//if (nowtime <= playtime)
////{
//// float[] temp = new float[16];
//// float[] logSpectrumLevels = new float[16];
//// analyzer.GetSpectrumLevels(ref temp);
//// SplitBandsOnLogScale(ref temp, ref logSpectrumLevels);
//// //for (int i = 0; i < temp.Length; i++)
//// //{
//// // if (temp[i] * 100 > 10)
//// // {
//// // temp[i] = Mathf.Clamp((2 + temp[i] * 100), 1, 5);
//// // }
//// // else
//// // {
//// // temp[i] = Mathf.Clamp((2 - temp[i] * 100), 1, 5);
//// // }
//// // //temp[i] = (Mathf.Clamp((10 * Mathf.Log10(temp[i])), 1, 5));
//// //}
//// list.Add(logSpectrumLevels);
//// nowtime += Time.deltaTime;
//}
//else
//{
if (islist)
{
onPlay(list);
islist = false;
// EditorAudioManager.Instance.StopAllMusic();
// }
}
}
private void OnDestroy()
{
//EditorAudioManager.Instance.UnregisterAnalyzer(GameObject.Find("Audio(Singleton)"), analyzer);
}
}