예제 #1
0
        private void BtnWaveForm_Click(object sender, EventArgs e)
        {
            if (sender is Button btn)
            {
                //Disable the button we clicked on
                btn.Enabled = false;

                //The tag should look like this: 1S  ->  Oscillator 1, sine waveform
                string tag = btn.Tag.ToString();
                //The first char of the tag is the oscillator id
                int oscillatorId = (int)Char.GetNumericValue(tag[0]);
                //The second char of the tag is the type of waveform
                SignalGeneratorType signalGeneratorType = GetSignalGeneratorType(tag[1]);

                if (oscillatorId == OSCILLATOR_1)
                {
                    ChangeWaveType(ref o1, Oscillator1Buttons, signalGeneratorType);
                }
                else if (oscillatorId == OSCILLATOR_2)
                {
                    ChangeWaveType(ref o2, Oscillator2Buttons, signalGeneratorType);
                }
                else if (oscillatorId == OSCILLATOR_3)
                {
                    ChangeWaveType(ref o3, Oscillator3Buttons, signalGeneratorType);
                }
            }
        }
예제 #2
0
 public void PlaySound(MusicalNote note, float gain, float time, SignalGeneratorType signalType)
 {
     PlaySound(
         new MusicalNote[] { note },
         gain,
         time,
         signalType
         );
 }
        public WaveFormPlayerViewModel(string displayName, string groupName, int initialFrequency,
                                       SignalGeneratorType signalType, int duration)
            : base(displayName, groupName)
        {
            _frequency       = initialFrequency;
            _signalType      = signalType;
            _streamGenerator = new StreamGenerator();

            Duration = duration;
        }
예제 #4
0
        private void ManageButtonsActivation(List <Button> buttons, Oscillator oscillator)
        {
            foreach (Button button in buttons)
            {
                //The tag should look like this: 1S  ->  Oscillator 1, sine waveform
                string tag = button.Tag.ToString();
                //The second char of the tag is the type of waveform
                SignalGeneratorType signalGeneratorType = GetSignalGeneratorType(tag[1]);

                button.Enabled = signalGeneratorType != oscillator.WaveType;
            }
        }
예제 #5
0
        public static byte[] Generate(this WaveFormat waveFormat, TimeSpan interval,
                                      SignalGeneratorType type = SignalGeneratorType.Sin, double frequency = 1.0)
        {
            var sampleProvider = new SignalGenerator(waveFormat.SampleRate, waveFormat.Channels)
            {
                Frequency = frequency, Type = type
            };
            var waveProvider = new SampleToWaveProvider(sampleProvider);
            var numBytes     = (int)(interval.TotalSeconds * waveFormat.AverageBytesPerSecond);
            var data         = new byte[numBytes];

            waveProvider.Read(data, 0, data.Length);
            return(data);
        }
예제 #6
0
        private void StartWave(SignalGeneratorType type)
        {
            SignalGeneratorType t = wave.Type;

            wave.Type = type;
            if (t != SignalGeneratorType.Pink)
            {
                driverOut.Stop();
                driverOut.Dispose();
                driverOut = new WaveOut();
                driverOut.Init(wave);
                driverOut.Play();
            }
        }
예제 #7
0
        public Oscillator(double pGain, int pFrequency, SignalGeneratorType pType, bool isEnabled)
        {
            Gain      = pGain;
            Frequency = pFrequency;
            WaveType  = pType;
            IsEnabled = isEnabled;
            _disposed = false;

            _waveOuts = new WaveOut[MIDIPlayer.MAX_MIDI_NOTES];
            for (int i = 0; i < _waveOuts.Length; i++)
            {
                _waveOuts[i] = new WaveOut();
            }
        }
예제 #8
0
 public void SetWaveType(SignalGeneratorType type, OscillatorIndex oscillator)
 {
     if (oscillator == OscillatorIndex.Primary)
     {
         currentPrimaryWaveType = type;
     }
     else if (oscillator == OscillatorIndex.Secondary)
     {
         currentSecondaryWaveType = type;
     }
     //else if (oscillator == OscillatorIndex.LFO)
     //{
     //    LFOWaveType = type;
     //}
 }
예제 #9
0
        private void FillTable(SignalGeneratorType signalGeneratorType)
        {
            waveTable = new float[(int)sampleRate];
            var sigGen = new SignalGenerator(44100, 1)
            {
                Frequency = 1, Gain = 1, Type = signalGeneratorType
            };

            sigGen.Read(waveTable, 0, (int)sampleRate);

            // debug
            System.Diagnostics.Debug.WriteLine(String.Format("start: {0}, mid: {1}, end: {2}", waveTable[0], waveTable[(int)((sampleRate / 2))], waveTable[(int)sampleRate - 1]));

            readPosition = 0;
        }
예제 #10
0
        public static byte[] Generate(this TimeSpan interval, int rate = 8000, int channels = 1,
                                      SignalGeneratorType type         = SignalGeneratorType.Sin, double frequency = 1.0)
        {
            var waveFormat     = WaveFormat.CreateIeeeFloatWaveFormat(rate, channels);
            var sampleProvider = new SignalGenerator(rate, channels)
            {
                Frequency = frequency, Type = type
            };
            var waveProvider = new SampleToWaveProvider(sampleProvider);
            var numBytes     = (int)(interval.TotalSeconds * waveFormat.AverageBytesPerSecond);
            var data         = new byte[numBytes];

            waveProvider.Read(data, 0, data.Length);
            return(data);
        }
예제 #11
0
        public void SetSignalGeneratorType(SignalGeneratorType signalGeneratorType)
        {
            if (SignalGeneratorType == signalGeneratorType)
            {
                return;
            }

            if (signalGeneratorType == SignalGeneratorType.Sin ||
                signalGeneratorType == SignalGeneratorType.Square ||
                signalGeneratorType == SignalGeneratorType.SawTooth ||
                signalGeneratorType == SignalGeneratorType.Triangle)
            {
                SignalGeneratorType = signalGeneratorType;
                FillTable(signalGeneratorType);
            }
            else
            {
                throw new NotSupportedException("Unsupported SignalGeneratorType");
            }
        }
예제 #12
0
        private void SetInstrument(InstrumentType instrument)
        {
            signalType = SignalGeneratorType.Sin;
            switch (instrument)
            {
            case InstrumentType.Horn:
                signalType = SignalGeneratorType.SawTooth;
                break;

            case InstrumentType.Flute:
                signalType = SignalGeneratorType.Triangle;
                break;

            case InstrumentType.Clarinet:
                signalType = SignalGeneratorType.Square;
                break;

            case InstrumentType.Recorder:
                signalType = SignalGeneratorType.Sin;
                break;
            }
        }
예제 #13
0
파일: Song.cs 프로젝트: xlar54/sidmaker
        public static void PlaySingleNote(Object n)
        {
            Note note = (Note)n;

            int msduration = getDuration(note);

            SignalGeneratorType t = SignalGeneratorType.Triangle;

            if (note.waveform == Waveforms.Triangle)
            {
                t = SignalGeneratorType.Triangle;
            }
            else if (note.waveform == Waveforms.Sawtooth)
            {
                t = SignalGeneratorType.SawTooth;
            }
            else if (note.waveform == Waveforms.Pulse)
            {
                t = SignalGeneratorType.Square;
            }


            var signal = new NAudio.Wave.SampleProviders.SignalGenerator()
            {
                Gain      = 0.8,
                Frequency = note.frequency,
                Type      = t
            }.Take(TimeSpan.FromMilliseconds(msduration));

            using (var wo = new WaveOutEvent())
            {
                wo.Init(signal);
                wo.Play();
                while (wo.PlaybackState == PlaybackState.Playing)
                {
                    //Thread.Sleep(1);
                }
            }
        }
예제 #14
0
        private SignalGeneratorType GetSignalGeneratorType(char waveCode)
        {
            SignalGeneratorType signalGeneratorType = SignalGeneratorType.Sin;

            if (waveCode == SQUARE_CODE)
            {
                signalGeneratorType = SignalGeneratorType.Square;
            }
            else if (waveCode == SAWTOOTH_CODE)
            {
                signalGeneratorType = SignalGeneratorType.SawTooth;
            }
            else if (waveCode == TRIANGLE_CODE)
            {
                signalGeneratorType = SignalGeneratorType.Triangle;
            }
            else if (waveCode == WHITE_CODE)
            {
                signalGeneratorType = SignalGeneratorType.White;
            }

            return(signalGeneratorType);
        }
예제 #15
0
        public StreamGenerationResult GenerateStream(SignalGeneratorType signalType, int frequency, int durationInSeconds)
        {
            _signalGenerator.Frequency = frequency;
            _signalGenerator.Gain      = 1;
            _signalGenerator.Type      = signalType;

            var bufferSize  = _signalGenerator.WaveFormat.AverageBytesPerSecond * durationInSeconds;
            var sampleCount = _signalGenerator.WaveFormat.SampleRate * durationInSeconds;

            var waveShortData = new short[bufferSize];

            _signalGenerator.Read(waveShortData, bufferSize);
            var waveByteData = waveShortData.ToByteArray();

            var waveStream = new WaveMemoryStream(_signalGenerator.WaveFormat);

            waveStream.SetData(waveByteData, sampleCount);

            return(new StreamGenerationResult
            {
                Amplitudes = waveShortData,
                WaveStream = waveStream.CreateStream()
            });
        }
        private void WaveTypeSimple_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            SignalGeneratorType WaveType = new SignalGeneratorType();

            switch (WaveTypeSimple.SelectedIndex)
            {
            case 0:
                WaveType = SignalGeneratorType.Sin;
                break;

            case 1:
                WaveType = SignalGeneratorType.Square;
                break;

            case 2:
                WaveType = SignalGeneratorType.Triangle;
                break;

            case 3:
                WaveType = SignalGeneratorType.SawTooth;
                break;

            case 4:
                WaveType = SignalGeneratorType.White;
                break;

            case 5:
                WaveType = SignalGeneratorType.Pink;
                break;

            case 6:
                WaveType = SignalGeneratorType.Sweep;
                break;
            }
            SimpleGenerator.Type = WaveType;
        }
        private void Play_Click(object sender, RoutedEventArgs e)
        {
            switch (Generato_type.SelectedIndex)
            {
            case 0:
                SignalGeneratorType WaveType = new SignalGeneratorType();
                switch (WaveTypeSimple.SelectedIndex)
                {
                case 0:
                    WaveType = SignalGeneratorType.Sin;
                    break;

                case 1:
                    WaveType = SignalGeneratorType.Square;
                    break;

                case 2:
                    WaveType = SignalGeneratorType.Triangle;
                    break;

                case 3:
                    WaveType = SignalGeneratorType.SawTooth;
                    break;

                case 4:
                    WaveType = SignalGeneratorType.White;
                    break;

                case 5:
                    WaveType = SignalGeneratorType.Pink;
                    break;

                case 6:
                    WaveType = SignalGeneratorType.Sweep;
                    break;
                }
                double Testtime      = Convert.ToDouble(SimpleTime.Text.Trim());
                double TestFrequency = Convert.ToDouble(SimpleFrequency.Text.Trim());
                SimpleGenerator.Gain = SimpleGainSlider.Value;

                MainParam InputParams = new MainParam(WaveType, TestFrequency, Testtime);
                Thread    myThread    = new Thread(new ThreadStart(() => PlaySimpleMusic(InputParams)));
                myThread.Start();
                double a;
                double d;
                double s;
                double r;
                if (Main_Gain_ADSR_Box.IsChecked == true)
                {
                    Thread SimpleGainADSRThread = new Thread(new ThreadStart(() => SimpleGainADSR_Work(5, 3, 0.5, 2)));
                    SimpleGainADSRThread.Start();
                }
                if (Main_Frequency_ADSR_Box.IsChecked == true)
                {
                    Thread SimpleFrequencyADSRThread = new Thread(new ThreadStart(() => PlaySimpleMusic(InputParams)));
                    SimpleFrequencyADSRThread.Start();
                }
                break;

            case 1:
                double[] notearr   = new double[80];
                int      timequant = 5;
                notearr[0] = 440;
                notearr[1] = 320;
                notearr[2] = 200;
                notearr[3] = 150;
                notearr[4] = 240;
                notearr[5] = 370;
                NotetableGeneretor.Type = SignalGeneratorType.Sin;
                Thread myThread2 = new Thread(new ThreadStart(() => PlayTableMusic(notearr, timequant)));
                myThread2.Start();
                break;

            case 2:
                break;
            }
        }
예제 #18
0
        public async void PlaySound(MusicalNote[] musicalNotes, float gain, float time, SignalGeneratorType signalType)
        {
            var waveFormat = WaveFormat.CreateIeeeFloatWaveFormat(44100, 2);
            var mix        = new MixingSampleProvider(waveFormat);

            foreach (var I in musicalNotes)
            {
                var Signal = new SignalGenerator
                {
                    Gain      = gain,
                    Frequency = I.Frequency,
                    Type      = signalType
                }
                .Take(TimeSpan.FromSeconds(time));

                mix.AddMixerInput(Signal);
            }
            AudioOut.Stop();
            AudioOut.Init(mix);
            AudioOut.Play();
            while (AudioOut.PlaybackState == PlaybackState.Playing)
            {
                await Task.Delay((int)time * 1000);
            }
        }
예제 #19
0
 private void StartWave(SignalGeneratorType type)
 {
     SignalGeneratorType t = wave.Type;
     wave.Type = type;
     if (t != SignalGeneratorType.Pink)
     {
         driverOut.Stop();
         driverOut.Dispose();
         driverOut = new WaveOut();
         driverOut.Init(wave);
         driverOut.Play();
     }
 }
예제 #20
0
 private void ChangeWaveType(ref Oscillator oscillator, List <Button> buttons, SignalGeneratorType signalGeneratorType)
 {
     oscillator.WaveType = signalGeneratorType;
     ManageButtonsActivation(buttons, oscillator);
 }
예제 #21
0
 public MainParam(SignalGeneratorType wave, double freq, double time)
 {
     WaveForm  = wave;
     Frequency = freq;
     Time      = time;
 }
예제 #22
0
 public WaveTable(float frequency, float amplitude, SignalGeneratorType signalGeneratorType)
 {
     SetFrequency(frequency);
     SetAmplitude(amplitude);
     SetSignalGeneratorType(signalGeneratorType);    // setting this will fill the table
 }