static var dspTime : double
Description
Returns the current time of the audio system. This is a value specified in seconds and based on the actual number of samples the audio system processes and is therefore much more precise than the time obtained via the Time.time property.
@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 example : 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(AudioSource)]
class example(MonoBehaviour):
public bpm as double = 140.0F
public gain as single = 0.5F
public signatureHi as int = 4
public signatureLo as int = 4
private nextTick as double = 0.0F
private amp as single = 0.0F
private phase as single = 0.0F
private sampleRate as double = 0.0F
private accent as int
private running as bool = false
def Start():
accent = signatureHi
startTick as double = AudioSettings.dspTime
sampleRate = AudioSettings.outputSampleRate
nextTick = (startTick * sampleRate)
running = true
def OnAudioFilterRead(data as (single), channels as int):
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 single = ((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++