using System; using System.Collections; using System.Collections.Generic; namespace Wavelet_Tracker { public class WaveletEchoMachine : MachineParameterisedBase { private const string type = "Wavelet Echo"; private const string author = "Internal"; private const int version = 1; private MachineParameterContinuous delayParam; Random qwer; public WaveletEchoMachine(string name) : base(type, author, version, name) { qwer = new Random((int) System.DateTime.Now.Ticks + this.GetHashCode()); machineLimitations = MachineLimitations.ProcessWaveletsAndPCM; } protected override void endProductionImpl(long interval) { long etime = (long)(delayParam.calcEndValue() * (App.TIME_RES / 1000)); float edecay = (float)(1.0 - (float)parameters[1].parameterValue); int numEchoes = 1; float testVal = 1.0f; while (testVal > 0.001f) { testVal *= edecay; numEchoes++; } List list = inputs[0].buffer.getForProcessing(playTime, interval, true); for (int x = 0; x < list.Count; x++) { SoundEvent e = list[x]; if (e.eventType == EventType.AUDIO_WAVELETS) { WaveletEvent w = (WaveletEvent) e; float wamp = w.amplitude; long wtime = w.startTime; for (int y = 0; y < numEchoes; y++) { WaveletEvent v = new WaveletEvent(w.frequency, wamp, w.length, w.phase, wtime); outputs[0].buffer.addEvent(v); wamp *= edecay; wtime += (long) (qwer.NextDouble() * etime); } } if (e.eventType == EventType.AUDIO_PCM) { PCMEvent w = (PCMEvent)e; long start = w.startTime; long end = w.endTime; for (int y = 0; y < numEchoes; y++) { PCMEvent v = w.makeCopy(); v.amplify(edecay); long shift = (long)(qwer.NextDouble() * etime); v.timeshift(shift); outputs[0].buffer.addEvent(v); } } } } protected override void endSeekImpl(long seekTime) { } protected override void endSetupParametersImpl() { parameters = new MachineParameter[2]; delayParam = new MachineParameterContinuous("Max Delay", 0, 0.02f); delayParam.multiplier = 10000; delayParam.exponent = 2.0; delayParam.label = "ms"; parameters[0] = delayParam; MachineParameterContinuous decay = new MachineParameterContinuous("Decay", 0, 0.2f); decay.multiplier = 100; decay.label = "%"; parameters[1] = decay; } protected override void endSetupInputOutputImpl() { outputs = new MachineConnection[1]; outputs[0] = new MachineConnection("Output"); inputs = new MachineConnection[1]; inputs[0] = new MachineConnection("Input"); } protected override void endTickImpl(ArrayList parameterChanges) { } } }