The question is answered, right answer was accepted
render out the audio spectrum data to a UI text
I have this Unity script that I would like converted into C# but also if someone could change it so that the Old On Gui Text uses the new UI text on canvas system that would be awesome.
var qSamples: int = 1024; // array size
var refValue: float = 0.1; // RMS value for 0 dB
var threshold = 0.02; // minimum amplitude to extract pitch
var rmsValue: float; // sound level - RMS
var dbValue: float; // sound level - dB
var pitchValue: float; // sound pitch - Hz
private var samples: float[]; // audio samples
private var spectrum: float[]; // audio spectrum
private var fSample: float;
function Start () {
samples = new float[qSamples];
spectrum = new float[qSamples];
fSample = AudioSettings.outputSampleRate;
}
function AnalyzeSound(){
GetComponent.<AudioSource>().GetOutputData(samples, 0); // fill array with samples
var i: int;
var sum: float = 0;
for (i=0; i < qSamples; i++){
sum += samples[i]*samples[i]; // sum squared samples
}
rmsValue = Mathf.Sqrt(sum/qSamples); // rms = square root of average
dbValue = 20*Mathf.Log10(rmsValue/refValue); // calculate dB
if (dbValue < -160) dbValue = -160; // clamp it to -160dB min
// get sound spectrum
GetComponent.<AudioSource>().GetSpectrumData(spectrum, 0, FFTWindow.BlackmanHarris);
var maxV: float = 0;
var maxN: int = 0;
for (i=0; i < qSamples; i++){ // find max
if (spectrum[i] > maxV && spectrum[i] > threshold){
maxV = spectrum[i];
maxN = i; // maxN is the index of max
}
}
var freqN: float = maxN; // pass the index to a float variable
if (maxN > 0 && maxN < qSamples-1){ // interpolate index using neighbours
var dL = spectrum[maxN-1]/spectrum[maxN];
var dR = spectrum[maxN+1]/spectrum[maxN];
freqN += 0.5*(dR*dR - dL*dL);
}
pitchValue = freqN*(fSample/2)/qSamples; // convert index to frequency
}
var display: GUIText; // drag a GUIText here to show results
function Update () {
if (Input.GetKeyDown("p")){
GetComponent.<AudioSource>().Play();
}
AnalyzeSound();
if (display){
display.text = "RMS: "+rmsValue.ToString("F2")+
" ("+dbValue.ToString("F1")+" dB)\n"+
"Pitch: "+pitchValue.ToString("F0")+" Hz";
}
}
Hey, people here on UA won't do the thing for you ... we're here to help you if you're struggling with a particular point but DEFINITLY NOT to take your order and do all the job ...
Look for hints on how to translate from JS to C# that's quite easy in fact, you just have to change a few things in variable declaration and functions' names ...
GUI Text and 1.6 UI Text are very different, one is "writing" on your screen while the other uses objects in Canvas ... even if we'd translate it for you, since you wouldn't understand what object to add and where to add them, it wouldn't be a solution either.
@$$anonymous$$dRWaylander, That's nice and all but I have had a few kind souls that were willing to help, those I am eternally thankful for, for those that do not want to help for whatever reasons I have no interest in. I come here for such help, not grief ;)
That's not that i don't want to help, see that i do help you on your other question. But UA is not meant for this kind a question (you want your script to be translated for your use, UA is more of a place where questions benefit to everyone and to people that will have the same question later on. Unity Forums is the correct place to deal with your problem).
Anyway i'm glad you could find an answer to your problem, try to change the title of your question to something like "render out the audio spectrum data to a UI text" so it will be useful to others :)
Answer by KnightRiderGuy · Dec 21, 2015 at 05:30 PM
Ok Thanks to one of the very helpful souls on the forum I was able to get this converted so I'll post it here just incase there is anyone else who needs to render out the audio spectrum data to a UI text and not the old very difficult to use onGUI text.
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class SpectrumDataText : MonoBehaviour {
public int qSamples = 1024; // array size
public float refValue = 0.1f; // RMS value for 0 dB
public float threshold = 0.02f; // minimum amplitude to extract pitch
public float rmsValue; // sound level - RMS
public float dbValue; // sound level - dB
public float pitchValue; // sound pitch - Hz
private float[] samples; // audio samples
private float[] spectrum; // audio spectrum
private float fSample;
void Start () {
samples = new float[qSamples];
spectrum = new float[qSamples];
fSample = AudioSettings.outputSampleRate;
}
void AnalyzeSound(){
GetComponent<AudioSource>().GetOutputData(samples, 0); // fill array with samples
int i;
float sum = 0.0f;
for (i=0; i < qSamples; i++){
sum += samples[i]*samples[i]; // sum squared samples
}
rmsValue = Mathf.Sqrt(sum/qSamples); // rms = square root of average
dbValue = 20*Mathf.Log10(rmsValue/refValue); // calculate dB
if (dbValue < -160) dbValue = -160; // clamp it to -160dB min
// get sound spectrum
GetComponent<AudioSource>().GetSpectrumData(spectrum, 0, FFTWindow.BlackmanHarris);
float maxV = 0.0f;
int maxN = 0;
for (i=0; i < qSamples; i++){ // find max
if (spectrum[i] > maxV && spectrum[i] > threshold){
maxV = spectrum[i];
maxN = i; // maxN is the index of max
}
}
float freqN = maxN; // pass the index to a float variable
if (maxN > 0 && maxN < qSamples-1){ // interpolate index using neighbours
var dL = spectrum[maxN-1]/spectrum[maxN];
var dR = spectrum[maxN+1]/spectrum[maxN];
freqN += 0.5f*(dR*dR - dL*dL);
}
pitchValue = freqN*(fSample/2)/qSamples; // convert index to frequency
}
public Text display; // drag a GUIText here to show results
void Update () {
if (Input.GetKeyDown("p")){
GetComponent<AudioSource>().Play();
}
AnalyzeSound();
if (display){
display.text = "RMS: "+rmsValue.ToString("F2")+
" ("+dbValue.ToString("F1")+" dB)\n"+
"Pitch: "+pitchValue.ToString("F0")+" Hz";
}
}
}
Follow this Question
Related Questions
UnityScript to C# Conversion 1 Answer
convert java to c# 1 Answer
Loading saved location from a .cs file in my main menu which is a .js file. 0 Answers
Having trouble with UI text please help 1 Answer
Convert Js yo C# 1 Answer