オーディオシステムの現在時刻を返します。
これは秒単位で指定された値であり、オーディオシステムが処理する実際のサンプル数にもとづくため、 Time.time プロパティから取得される時間よりも正確です。
// The code example shows how to implement a metronome that procedurally generates the click sounds via the OnAudioFilterRead callback. // While the game is paused or the suspended, this time will not be updated and sounds playing will be paused. Therefore developers of music scheduling routines do not have to do any rescheduling after the app is unpaused @script RequireComponent(AudioSource) public var bpm : double = 140.0; public var gain : float = 0.5f; public var signatureHi : int = 4; public var signatureLo : int = 4; private var nextTick : double = 0.0; private var amp : float = 0.0f; private var phase : float = 0.0f; private var sampleRate : double = 0.0; private var accent : int; private var running : boolean = false; function Start () { accent = signatureHi; var startTick = AudioSettings.dspTime; sampleRate = AudioSettings.outputSampleRate; nextTick = startTick * sampleRate; running = true; } function OnAudioFilterRead(data:float[], channels:int) { if(!running) return; var samplesPerTick = sampleRate * (60.0f / bpm) * (4.0 / signatureLo); var sample = AudioSettings.dspTime * sampleRate; var dataLen = data.length / channels; for(var n = 0; n < dataLen; n++) { var x : float = gain * amp * Mathf.Sin(phase); for(var i = 0; i < channels; i++) data[n * channels + i] += x; while (sample + n >= nextTick) { nextTick += samplesPerTick; amp = 1.0; if(++accent > signatureHi) { accent = 1; amp *= 2.0; } Debug.Log("Tick: " + accent + "/" + signatureHi); } phase += amp * 0.3; amp *= 0.993; } }
using UnityEngine; using System.Collections; [RequireComponent(typeof(AudioSource))] public class ExampleClass : MonoBehaviour { public double bpm = 140.0F; public float gain = 0.5F; public int signatureHi = 4; public int signatureLo = 4; private double nextTick = 0.0F; private float amp = 0.0F; private float phase = 0.0F; private double sampleRate = 0.0F; private int accent; private bool running = false; void Start() { accent = signatureHi; double startTick = AudioSettings.dspTime; sampleRate = AudioSettings.outputSampleRate; nextTick = startTick * sampleRate; running = true; } void OnAudioFilterRead(float[] data, int channels) { if (!running) return; double samplesPerTick = sampleRate * 60.0F / bpm * 4.0F / signatureLo; double sample = AudioSettings.dspTime * sampleRate; int dataLen = data.length / channels; int n = 0; while (n < dataLen) { float x = gain * amp * Mathf.Sin(phase); int i = 0; while (i < channels) { data[n * channels + i] += x; i++; } while (sample + n >= nextTick) { nextTick += samplesPerTick; amp = 1.0F; if (++accent > signatureHi) { accent = 1; amp *= 2.0F; } Debug.Log("Tick: " + accent + "/" + signatureHi); } phase += amp * 0.3F; amp *= 0.993F; n++; } } }
import UnityEngine import System.Collections [RequireComponent(typeof(AudioSource))] public class ExampleClass(MonoBehaviour): public bpm as double = 140.0F public gain as float = 0.5F public signatureHi as int = 4 public signatureLo as int = 4 private nextTick as double = 0.0F private amp as float = 0.0F private phase as float = 0.0F private sampleRate as double = 0.0F private accent as int private running as bool = false def Start() as void: accent = signatureHi startTick as double = AudioSettings.dspTime sampleRate = AudioSettings.outputSampleRate nextTick = (startTick * sampleRate) running = true def OnAudioFilterRead(data as (float), channels as int) as void: if not running: return samplesPerTick as double = ((sampleRate * (60.0F / bpm)) * (4.0F / signatureLo)) sample as double = (AudioSettings.dspTime * sampleRate) dataLen as int = (data.length / channels) n as int = 0 while n < dataLen: x as float = ((gain * amp) * Mathf.Sin(phase)) i as int = 0 while i < channels: data[((n * channels) + i)] += x i++ while (sample + n) >= nextTick: nextTick += samplesPerTick amp = 1.0F if (++accent) > signatureHi: accent = 1 amp *= 2.0F Debug.Log(((('Tick: ' + accent) + '/') + signatureHi)) phase += (amp * 0.3F) amp *= 0.993F n++