Tone Gen
Has clicking problem in between each cycle.unknown
plain_text
a year ago
3.6 kB
12
Indexable
using UnityEngine; using UnityEngine.UI; using System.Collections; [RequireComponent(typeof(AudioSource))] // Has clicking public class ToneGenerator : MonoBehaviour { public Slider volumeSlider; public Text frequencyText; private float currentFrequency = 100f; private const float minFrequency = 1f; private const float maxFrequency = 10000f; private const float frequencyStep = 1f; private const float frequencyStep5 = 5f; private const float frequencyStep10 = 10f; private AudioSource audioSource; private bool generatingTone = false; void Start() { audioSource = GetComponent<AudioSource>(); // Set initial volume if (volumeSlider != null) { volumeSlider.onValueChanged.AddListener(ChangeVolume); volumeSlider.value = 0.5f; // Set initial volume to half } // Set initial frequency UpdateFrequencyText(); StartTone(); } public void ChangeVolume(float value) { audioSource.volume = value; } public void IncreaseFrequency() { currentFrequency += frequencyStep; if (currentFrequency > maxFrequency) currentFrequency = maxFrequency; UpdateFrequencyText(); } public void DecreaseFrequency() { currentFrequency -= frequencyStep; if (currentFrequency < minFrequency) currentFrequency = minFrequency; UpdateFrequencyText(); } public void IncreaseFrequencyBy5() { currentFrequency += frequencyStep5; if (currentFrequency > maxFrequency) currentFrequency = maxFrequency; UpdateFrequencyText(); } public void DecreaseFrequencyBy5() { currentFrequency -= frequencyStep5; if (currentFrequency < minFrequency) currentFrequency = minFrequency; UpdateFrequencyText(); } public void IncreaseFrequencyBy10() { currentFrequency += frequencyStep10; if (currentFrequency > maxFrequency) currentFrequency = maxFrequency; UpdateFrequencyText(); } public void DecreaseFrequencyBy10() { currentFrequency -= frequencyStep10; if (currentFrequency < minFrequency) currentFrequency = minFrequency; UpdateFrequencyText(); } private void UpdateFrequencyText() { if (frequencyText != null) frequencyText.text = "Frequency: " + currentFrequency.ToString("F0") + " Hz"; } public void StartTone() { if (!generatingTone) { generatingTone = true; StartCoroutine(GenerateTone()); } } public void StopTone() { generatingTone = false; } private IEnumerator GenerateTone() { float[] samples = new float[44100]; // Assuming sample rate of 44100 Hz while (generatingTone) { float increment = currentFrequency * 2 * Mathf.PI / 44100; float angle = 0f; for (int i = 0; i < samples.Length; i++) { samples[i] = Mathf.Sin(angle); angle += increment; } audioSource.clip = AudioClip.Create("Tone", samples.Length, 1, 44100, false); audioSource.clip.SetData(samples, 0); audioSource.Play(); yield return new WaitForSeconds(samples.Length / 44100f); // Wait for the duration of the audio clip } } }
Editor is loading...
Leave a Comment