public static float[] CreateTable(int size, WaveformEnum type) { Generator generator; if (type == WaveformEnum.Sine) generator = new SineGenerator(new GeneratorDescriptor()); else if (type == WaveformEnum.Square) generator = new SquareGenerator(new GeneratorDescriptor()); else if (type == WaveformEnum.Triangle) generator = new TriangleGenerator(new GeneratorDescriptor()); else if (type == WaveformEnum.Saw) generator = new SawGenerator(new GeneratorDescriptor()); else if (type == WaveformEnum.WhiteNoise) generator = new WhiteNoiseGenerator(new GeneratorDescriptor()); else return null; float[] table = new float[size]; double phase, increment; phase = generator.StartPhase; increment = generator.Period / size; for (int x = 0; x < table.Length; x++) { table[x] = generator.GetValue(phase); phase += increment; } return table; }
public void Read(string[] description) { ApplyDefault(); for (int x = 0; x < description.Length; x++) { int index = description[x].IndexOf('='); if (index >= 0 && index < description[x].Length) { string paramName = description[x].Substring(0, index).Trim().ToLower(); string paramValue = description[x].Substring(index + 1).Trim(); switch (paramName) { case "loopmode": LoopMethod = Generator.GetLoopModeFromString(paramValue.ToLower()); break; case "type": SamplerType = Generator.GetWaveformFromString(paramValue.ToLower()); break; case "assetname": AssetName = paramValue; break; case "endphase": EndPhase = double.Parse(paramValue); break; case "startphase": StartPhase = double.Parse(paramValue); break; case "loopendphase": LoopEndPhase = double.Parse(paramValue); break; case "loopstartphase": LoopStartPhase = double.Parse(paramValue); break; case "offset": Offset = double.Parse(paramValue); break; case "period": Period = double.Parse(paramValue); break; case "keycenter": case "rootkey": Rootkey = short.Parse(paramValue); break; case "keytrack": KeyTrack = short.Parse(paramValue); break; case "velocitytrack": VelTrack = short.Parse(paramValue); break; case "tune": Tune = short.Parse(paramValue); break; } } } }
private static Generator GetGenerator(WaveformEnum waveform) { switch (waveform) { case WaveformEnum.Saw: return Generator.DefaultSaw; case WaveformEnum.Square: return Generator.DefaultSquare; case WaveformEnum.Triangle: return Generator.DefaultTriangle; default: return Generator.DefaultSine; } }
private void ApplyDefault() { LoopMethod = LoopModeEnum.NoLoop; SamplerType = WaveformEnum.Sine; AssetName = "null"; EndPhase = -1; StartPhase = -1; LoopEndPhase = -1; LoopStartPhase = -1; Offset = 0; Period = -1; Rootkey = -1; KeyTrack = 100; VelTrack = 0; Tune = 0; }
private static Generator GetGenerator(WaveformEnum waveform) { switch (waveform) { case WaveformEnum.Saw: return(Generator.DefaultSaw); case WaveformEnum.Square: return(Generator.DefaultSquare); case WaveformEnum.Triangle: return(Generator.DefaultTriangle); default: return(Generator.DefaultSine); } }
public int Read(BinaryReader reader) { LoopMethod = (LoopModeEnum)reader.ReadInt16(); SamplerType = (WaveformEnum)reader.ReadInt16(); AssetName = IOHelper.Read8BitString(reader, 20); EndPhase = reader.ReadDouble(); StartPhase = reader.ReadDouble(); LoopEndPhase = reader.ReadDouble(); LoopStartPhase = reader.ReadDouble(); Offset = reader.ReadDouble(); Period = reader.ReadDouble(); Rootkey = reader.ReadInt16(); KeyTrack = reader.ReadInt16(); VelTrack = reader.ReadInt16(); Tune = reader.ReadInt16(); return(SIZE); }
public static float[] CreateTable(int size, WaveformEnum type) { Generator generator; if (type == WaveformEnum.Sine) { generator = new SineGenerator(new GeneratorDescriptor()); } else if (type == WaveformEnum.Square) { generator = new SquareGenerator(new GeneratorDescriptor()); } else if (type == WaveformEnum.Triangle) { generator = new TriangleGenerator(new GeneratorDescriptor()); } else if (type == WaveformEnum.Saw) { generator = new SawGenerator(new GeneratorDescriptor()); } else if (type == WaveformEnum.WhiteNoise) { generator = new WhiteNoiseGenerator(new GeneratorDescriptor()); } else { return(null); } float[] table = new float[size]; double phase, increment; phase = generator.StartPhase; increment = generator.Period / size; for (int x = 0; x < table.Length; x++) { table[x] = generator.GetValue(phase); phase += increment; } return(table); }
public int Read(BinaryReader reader) { LoopMethod = (LoopModeEnum)reader.ReadInt16(); SamplerType = (WaveformEnum)reader.ReadInt16(); AssetName = IOHelper.Read8BitString(reader, 20); EndPhase = reader.ReadDouble(); StartPhase = reader.ReadDouble(); LoopEndPhase = reader.ReadDouble(); LoopStartPhase = reader.ReadDouble(); Offset = reader.ReadDouble(); Period = reader.ReadDouble(); Rootkey = reader.ReadInt16(); KeyTrack = reader.ReadInt16(); VelTrack = reader.ReadInt16(); Tune = reader.ReadInt16(); return SIZE; }
public void ComputeWaveform() { currentOctave = StartingOctave; currentPolarity = StartingPolarity; int sinCount = 0; int squareCount = 0; int triangleCount = 0; allSlotsFull = true; // perform the computations for current values foreach (var slot in Slots) { var currentPart = slot.GetCurrentPart(); if (currentPart != null) { if (sideEnum == RobotSideEnum.Left) { currentOctave += currentPart.PartDescriptor.LeftOctave; currentPolarity += currentPart.PartDescriptor.LeftPolarity; switch (currentPart.PartDescriptor.Waveform) { case WaveformEnum.Sin: sinCount++; break; case WaveformEnum.Square: squareCount++; break; case WaveformEnum.Triangle: triangleCount++; break; default: Debug.LogError("Invalid waveform assigned to part, should only be sin, square or triangle waveforms for parts"); break; } } if (sideEnum == RobotSideEnum.Right) { currentOctave += currentPart.PartDescriptor.RightOctave; currentPolarity += currentPart.PartDescriptor.RightPolarity; switch (currentPart.PartDescriptor.Waveform) { case WaveformEnum.Sin: sinCount++; break; case WaveformEnum.Square: squareCount++; break; case WaveformEnum.Triangle: triangleCount++; break; default: Debug.LogError("Invalid waveform assigned to part, should only be sin, square or triangle waveforms for parts"); break; } } } else { allSlotsFull = false; } } if (sinCount > 0) { // check for combination waves with Square and Triangle if (squareCount > 0) { if (triangleCount > 0) { currentWaveEnum = WaveformEnum.Omega; } else { currentWaveEnum = WaveformEnum.Cog; } } else if (triangleCount > 0) { currentWaveEnum = WaveformEnum.Wave; } else { currentWaveEnum = WaveformEnum.Sin; } } else if (squareCount > 0) { // check for combination waves with Triangle if (triangleCount > 0) { currentWaveEnum = WaveformEnum.Saw; } else { currentWaveEnum = WaveformEnum.Square; } } else if (triangleCount > 0) { // no other possible combinations currentWaveEnum = WaveformEnum.Triangle; } // trigger waveform change event WaveformChanged(this); }