public override Effect CreateInstance(XElement element, SynthData data) { var min = InvalidEffectSaveElementException.ParseFloat(element.Element("min")); var max = InvalidEffectSaveElementException.ParseFloat(element.Element("max")); return(new Translate(min, max)); }
public override Effect CreateInstance(XElement element, SynthData data) { var delaySeconds = InvalidEffectSaveElementException.ParseFloat(element.Element("delaySeconds")); var feedback = InvalidEffectSaveElementException.ParseFloat(element.Element("feedback")); return(new Delay(delaySeconds, feedback, data.SampleRate)); }
public void SaveToFile(string name, SynthData data, string path = "", bool preDef = false) { var filePath = (preDef ? data.DefaultBoardsPaths : data.SavedBoardsPaths).FilePath(Path.Combine(path, name + ".xml")); var element = ToXElement(); element.Save(filePath); }
public BoardTemplate SetupBoard(SynthData data) { var board = new BoardTemplate(); board.AddBoard(data.SubBoards["glideSubBoard"]); board.AddBoard(data.SubBoards["pitchWheelSubBoard"]); board.AddBoard(data.SubBoards["volumeControlSubBoard"]); var env1 = new Envelope(30, 240, 0.6f, 40, 3); var o1 = new OscillatorModule(new SawOscillator(), 1); var o2 = new OscillatorModule(new SawOscillator(), 1, 0.08f); var o3 = new OscillatorModule(new SawOscillator(), 1, 11.92f); var d1 = new Distributer(new float[] { 1, 0.7f, 0.0f }, new float[] { 1 }); //var sf1 = new EffectModule(new SimpleFilter(5)); var sf1 = new EffectModule(new Filter(Filter.GenerateSincKernel((float)FilterCutoff.Value, 64, data.SampleRate))); var g1 = new EffectModule(new Boost(0.2f)); var lfo2 = new ConstantOscillatorModule(new SineOscillator(), 1, 0.5f); var p1 = new Pan(); var endLeft = new EndModule(false); var endRight = new EndModule(true); board.Add(endLeft, endRight, sf1, d1, o3, o2, o1, env1, g1, lfo2, p1); //board.AddConnections(glideIn, glideTranslate, glideOut); //board.AddConnection(pitchWheel, pitchShift); //board.AddConnections(volumeControl, volumeTranslate, boardGain); board.AddConnection(env1, o1, destIndex: 0); board.AddConnection(env1, o2, destIndex: 0); board.AddConnection(env1, o3, destIndex: 0); board.AddConnection(o1, d1); board.AddConnection(o2, d1); board.AddConnection(o3, d1); board.AddConnections(d1, g1, sf1, p1); board.AddConnection(p1, endLeft); board.AddConnection(p1, endRight); return(board); }
public InputModule(XElement element, SynthData data) { gain = InvalidModuleSaveElementException.ParseFloat(element.Element("gain")); var outputs = InvalidModuleSaveElementException.ParseInt(element.Element("outputs")); Inputs = new ConnectionsArray(element.Element("inputs")); Outputs = new ConnectionsArray(element.Element("outputs")); output = new float[Outputs.Count]; }
public override Effect CreateInstance(XElement element, SynthData data) { var impulseResponse = new List <float>(); foreach (var value in element.Element("impulseResponse").Elements()) { impulseResponse.Add(InvalidEffectSaveElementException.ParseFloat(value)); } return(new Filter(impulseResponse)); }
private ConstantOscillatorModule(XElement element, SynthData data) { oscillator = data.OscillatorTypes[element.Element("osc").ElementValue("type")].Instance.CreateInstance(element.Element("osc"), data); gain = InvalidModuleSaveElementException.ParseFloat(element.Element("gain")); frequency = InvalidModuleSaveElementException.ParseFloat(element.Element("frequency")); oscillator.Frequency = frequency; Inputs = new ConnectionsArray(element.Element("inputs")); Outputs = new ConnectionsArray(element.Element("outputs")); output = new float[Outputs.Count]; }
public BoardTemplate(XElement element, SynthData data) { modules = new CrossReferencedDictionary <string, Module>(); connections = new List <ConnectionTemplate>(); foreach (var mod in element.Element("modules").Elements()) { string moduleName = mod.Name.LocalName.Substring(MODULE_SAVE_PREFIX.Length); string moduleType = mod.ElementValue("type"); modules[moduleName] = data.ModuleTypes[moduleType].Instance.CreateInstance(mod, data); } foreach (var con in element.Element("connections").Elements()) { connections.Add(new ConnectionTemplate(con)); } }
public MainWindowVM() { SynthData = new SynthData(); Synth = new Synth(SynthData); Pitch = 60; Synth.Play(); MIDIDeviceNames = InputDevice .GetAll() .Select(inputDevice => inputDevice.Name) .ToArray(); Synth.InputDevice = InputDevice.GetByName("Axiom A.I.R. Mini32"); }
public MainWindow() { Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US"); data = new SynthData(); synth = new Synth(data) { MidiSampleProviderCreator = bt => new PolyBoard(bt, 6, data), BoardTemplate = new BoardTemplate() }; InitializeComponent(); updateThread = new Thread(UpdateGUI); updateThread.Start(); RefreshBoard(); }
public ModuleBoard CreateInstance(SynthData data) { var boardModules = new CrossReferencedDictionary <string, Module>(); foreach (var m in modules) { boardModules[m.Key] = m.Value.Clone(); } foreach (var ct in connections) { CreateConnection(ct, boardModules); } var board = new ModuleBoard(boardModules.Keys2.ToArray(), data); return(board); }
public Envelope(XElement element, SynthData data) { SampleRate = data.SampleRate; Attack = InvalidModuleSaveElementException.ParseInt(element.Element("attack")); Decay = InvalidModuleSaveElementException.ParseInt(element.Element("decay")); sustainStart = Attack + Decay; Sustain = InvalidModuleSaveElementException.ParseFloat(element.Element("sustain")); Release = InvalidModuleSaveElementException.ParseInt(element.Element("release")); releaseIncrement = (-Sustain / Release) / (SampleRate / 1000); curValue = -1; Inputs = new ConnectionsArray(element.Element("inputs")); Outputs = new ConnectionsArray(element.Element("outputs")); onValues = CalculateOnValues(); offValues = CalculateOffValues(); output = new float[Outputs.Count]; }
public static void PlayMidi(string midiFile, IMidiSampleProvider msp, SynthData data) { var file = new MidiFile(midiFile); int ticksPerQuarterNote = file.DeltaTicksPerQuarterNote; var events = file.Events.Aggregate((IEnumerable <MidiEvent>) new List <MidiEvent>(), (totalList, list) => totalList.Concat(list)).OrderBy(me => me.AbsoluteTime); var totalEvents = events.Count(); var board = msp.Clone(data); var midi = new Midi(ticksPerQuarterNote); midi.NoteOn += board.HandleNoteOn; midi.NoteOff += board.HandleNoteOff; var synthResult = new SynthResult(data); synthResult.ReplaceSynthProvider(board); var aOut = new WaveOutEvent { DesiredLatency = data.DesiredLatency, DeviceNumber = -1 }; aOut.Init(synthResult); aOut.Play(); long startTime = DateTime.Now.Ticks; foreach (var me in events) { while (DateTime.Now.Ticks - startTime < midi.MidiTicksToDateTimeTicks(me.AbsoluteTime)) { ; } midi.HandleMidiEvent(me); } }
public abstract Effect CreateInstance(XElement element, SynthData data);
public override Module CreateInstance(XElement element, SynthData data) { return(new ConstantOscillatorModule(element, data)); }
public override Effect CreateInstance(XElement element, SynthData data) { var a1 = InvalidEffectSaveElementException.ParseFloat(element.Element("a1")); return(new OnePoleFilter(a1)); }
public override Effect CreateInstance(XElement element, SynthData data) { var gain = InvalidEffectSaveElementException.ParseFloat(element.Element("gain")); return new Boost(gain); }
public override Module CreateInstance(XElement element, SynthData data) { return(new Transmitter(element)); }
public static void PlayMidiToFile(string midiFile, string destFile, IMidiSampleProvider msp, SynthData data) { float sampleNum = 0; var file = new MidiFile(midiFile); int ticksPerQuarterNote = file.DeltaTicksPerQuarterNote; var events = file.Events.Aggregate((IEnumerable <MidiEvent>) new List <MidiEvent>(), (totalList, list) => totalList.Concat(list)).OrderBy(me => me.AbsoluteTime); var totalEvents = events.Count(); var board = msp.Clone(data); var midi = new Midi(ticksPerQuarterNote); midi.NoteOn += board.HandleNoteOn; midi.NoteOff += board.HandleNoteOff; using (var output = new WaveFileWriter(destFile, WaveFormat.CreateIeeeFloatWaveFormat(data.SampleRate, 2))) { int eventCount = 0; foreach (var me in events) { var absSample = midi.MidiTicksToSamples(me.AbsoluteTime, board.SampleRate); var samples = (int)(absSample - sampleNum); var result = new float[samples]; board.Next(result, 0, samples, 1); output.WriteSamples(result, 0, samples); sampleNum = absSample; midi.HandleMidiEvent(me); Console.WriteLine($"{++eventCount}/{totalEvents}"); } } }
public override Module CreateInstance(XElement element, SynthData data) { return(new EndModule(element)); }
public override Oscillator CreateInstance(XElement element, SynthData data) { return(new DCOscillator(InvalidOscillatorSaveElementException.ParseFloat(element.Element("value")))); }
public override Module CreateInstance(XElement element, SynthData data) { return(new MidiControllerModule(InvalidModuleSaveElementException.ParseInt(element.Element("controller")))); }
public abstract Oscillator CreateInstance(XElement element, SynthData data);
public override Module CreateInstance(XElement element, SynthData data) { return(new Multiply()); }
public abstract Module CreateInstance(XElement element, SynthData data);
public override Module CreateInstance(XElement element, SynthData data) { return(new PitchWheelModule()); }
public override Effect CreateInstance(XElement element, SynthData data) { var numPrevs = InvalidEffectSaveElementException.ParseInt(element.Element("numPrevs")); return(new SimpleFilter(numPrevs)); }
public static BoardTemplate LoadFromFile(string name, SynthData data, string path = "", bool preDef = false) { string wholePath = (preDef ? data.DefaultBoardsPaths : data.SavedBoardsPaths).FilePath(Path.Combine(path, name + ".xml")); return(new BoardTemplate(XDocument.Load(wholePath).Root, data)); }
public override Effect CreateInstance(XElement element, SynthData data) { return(new Flip()); }
public override Effect CreateInstance(XElement element, SynthData data) { return(new LowPassFilter(InvalidEffectSaveElementException.ParseFloat(element.Element("cutoffFrequency")))); }