示例#1
0
        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));
        }
示例#2
0
        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));
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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];
        }
示例#6
0
        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];
 }
示例#8
0
 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));
     }
 }
示例#9
0
        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");
        }
示例#10
0
        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();
        }
示例#11
0
        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);
        }
示例#12
0
        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];
        }
示例#13
0
        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);
            }
        }
示例#14
0
 public abstract Effect CreateInstance(XElement element, SynthData data);
 public override Module CreateInstance(XElement element, SynthData data)
 {
     return(new ConstantOscillatorModule(element, data));
 }
示例#16
0
        public override Effect CreateInstance(XElement element, SynthData data)
        {
            var a1 = InvalidEffectSaveElementException.ParseFloat(element.Element("a1"));

            return(new OnePoleFilter(a1));
        }
示例#17
0
 public override Effect CreateInstance(XElement element, SynthData data)
 {
     var gain = InvalidEffectSaveElementException.ParseFloat(element.Element("gain"));
     return new Boost(gain);
 }
示例#18
0
 public override Module CreateInstance(XElement element, SynthData data)
 {
     return(new Transmitter(element));
 }
示例#19
0
        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}");
                }
            }
        }
示例#20
0
 public override Module CreateInstance(XElement element, SynthData data)
 {
     return(new EndModule(element));
 }
示例#21
0
 public override Oscillator CreateInstance(XElement element, SynthData data)
 {
     return(new DCOscillator(InvalidOscillatorSaveElementException.ParseFloat(element.Element("value"))));
 }
示例#22
0
 public override Module CreateInstance(XElement element, SynthData data)
 {
     return(new MidiControllerModule(InvalidModuleSaveElementException.ParseInt(element.Element("controller"))));
 }
示例#23
0
 public abstract Oscillator CreateInstance(XElement element, SynthData data);
示例#24
0
 public override Module CreateInstance(XElement element, SynthData data)
 {
     return(new Multiply());
 }
示例#25
0
 public abstract Module CreateInstance(XElement element, SynthData data);
示例#26
0
 public override Module CreateInstance(XElement element, SynthData data)
 {
     return(new PitchWheelModule());
 }
示例#27
0
        public override Effect CreateInstance(XElement element, SynthData data)
        {
            var numPrevs = InvalidEffectSaveElementException.ParseInt(element.Element("numPrevs"));

            return(new SimpleFilter(numPrevs));
        }
示例#28
0
        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));
        }
示例#29
0
文件: Flip.cs 项目: PenguinAgen/Synth
 public override Effect CreateInstance(XElement element, SynthData data)
 {
     return(new Flip());
 }
示例#30
0
 public override Effect CreateInstance(XElement element, SynthData data)
 {
     return(new LowPassFilter(InvalidEffectSaveElementException.ParseFloat(element.Element("cutoffFrequency"))));
 }