コード例 #1
0
ファイル: Form1.cs プロジェクト: Adamsmith6300/WaveEditor
        /// <summary>Cuts out a section from the raw samples array.</summary>
        /// <param name="posXStart">The position in the rawSamples array to start the cut.</param>
        /// <param name="posXFinish">The position in the rawSamples array to end the cut.</param>
        private void cutRawSamples(int posXStart, int posXFinish)
        {
            //cut & save raw samples
            int length = (int)Math.Abs(posXFinish - posXStart);

            cutSamples = new double[length];
            Array.Copy(rawSamples, posXStart, cutSamples, 0, length);
            //make new arr for raw samples minus the cut
            double[] newRawSamples = new double[rawSamples.Length - length];
            //copy left side of cut into new arr
            Array.Copy(rawSamples, 0, newRawSamples, 0, posXStart);
            //copy right side of cut int arr
            Array.Copy(rawSamples, posXFinish, newRawSamples, posXStart, (rawSamples.Length - (posXStart + length)));
            //reinitialize rawsamples
            rawSamples = new double[newRawSamples.Length];
            //copy new raw samples into old raw samples variable
            Array.Copy(newRawSamples, 0, rawSamples, 0, newRawSamples.Length);
            dataSize = rawSamples.Length / numChannels;
            DataFormats.Format myFormat = DataFormats.GetFormat("cutData");
            ClipboardData      cd       = new ClipboardData();

            cd.Sr = this.sampleRate;
            cd.Cs = cutSamples;
            DataObject myDataObject = new DataObject(myFormat.Name, cd);

            Clipboard.SetDataObject(myDataObject);
            refreshChart();
        }
コード例 #2
0
ファイル: Form1.cs プロジェクト: Adamsmith6300/WaveEditor
        /// <summary>Downsamples sound data.</summary>
        /// <param name="csData">The sample data.</param>
        /// <returns>the new samples array after downsampling.</returns>
        private double[] downSample(ClipboardData csData)
        {
            ComplexNum[] nyquistFilter        = genSampleFilter((int)this.sampleRate, csData);
            double[]     nyquistFilterWeights = idft(nyquistFilter);
            double[]     samples = filterSelect(nyquistFilterWeights, csData.Cs);
            int          factor  = (int)(csData.Sr / this.sampleRate);

            double[] newSamples = new double[csData.Cs.Length / factor];
            for (int i = 0; i < newSamples.Length; ++i)
            {
                newSamples[i] = samples[i * factor];
            }
            return(newSamples);
        }
コード例 #3
0
ファイル: Form1.cs プロジェクト: Adamsmith6300/WaveEditor
        /// <summary>Upsamples sound data.</summary>
        /// <param name="csData">The sample data.</param>
        /// <returns>the new samples array after upsampling.</returns>
        private double[] upSample(ClipboardData csData)
        {
            int factor = (int)(this.sampleRate / csData.Sr);

            double[] newSamples = new double[csData.Cs.Length * factor];
            for (int i = 0; i < csData.Cs.Length; ++i)
            {
                for (int j = 0; j < factor; ++j)
                {
                    newSamples[(i * factor) + j] = csData.Cs[i];
                }
            }
            ComplexNum[] nyquistFilter        = genSampleFilter((int)this.sampleRate, csData);
            double[]     nyquistFilterWeights = idft(nyquistFilter);
            newSamples = filterSelect(nyquistFilterWeights, newSamples);
            return(newSamples);
        }
コード例 #4
0
ファイル: Form1.cs プロジェクト: Adamsmith6300/WaveEditor
        /// <summary>Copies a section of the raw samples.</summary>
        /// <param name="posXStart">The position in the rawSamples array to start the copy.</param>
        /// <param name="posXFinish">The position in the rawSamples array to end the copy.</param>
        private void copyRawSamples(int posXStart, int posXFinish)
        {
            //cut & save raw samples
            int length = (int)Math.Abs(posXFinish - posXStart);

            cutSamples = new double[length];
            Array.Copy(rawSamples, posXStart, cutSamples, 0, length);

            DataFormats.Format myFormat = DataFormats.GetFormat("cutData");
            ClipboardData      cd       = new ClipboardData();

            cd.Sr = this.sampleRate;
            cd.Cs = cutSamples;
            DataObject myDataObject = new DataObject(myFormat.Name, cd);

            Clipboard.SetDataObject(myDataObject);
        }
コード例 #5
0
ファイル: Form1.cs プロジェクト: Adamsmith6300/WaveEditor
        /// <summary>Pastes rawSamples from the clipboard. If there are any.</summary>
        /// <param name="posX">The position to paste the samples in the rawSamples array.</param>
        private void pasteRawSamples(int posX)
        {
            DataFormats.Format myFormat          = DataFormats.GetFormat("cutData");
            IDataObject        myRetrievedObject = Clipboard.GetDataObject();
            ClipboardData      csData            = (ClipboardData)myRetrievedObject.GetData(myFormat.Name);

            if (csData != null)
            {
                if (csData.Cs == null || csData.Cs.Length <= 0 || csData.Sr <= 0)
                {
                    return;
                }

                int      length        = csData.Cs.Length;
                double[] newCutSamples = csData.Cs;
                if (csData.Sr > this.sampleRate)
                {
                    //downSample
                    newCutSamples = downSample(csData);
                    int factor = (int)(csData.Sr / this.sampleRate);
                    length = csData.Cs.Length / factor;
                }
                if (csData.Sr < this.sampleRate)
                {
                    //upSample
                    newCutSamples = upSample(csData);
                    int factor = (int)(this.sampleRate / csData.Sr);
                    length = csData.Cs.Length * factor;
                }
                double[] newRawSamples = new double[rawSamples.Length + length];
                //paste left side of cut into new arr
                Array.Copy(rawSamples, 0, newRawSamples, 0, posX);
                //paste cutout section
                Array.Copy(newCutSamples, 0, newRawSamples, posX + 1, newCutSamples.Length);
                //paste right side of cut int arr
                Array.Copy(rawSamples, posX, newRawSamples, (posX + length), rawSamples.Length - posX);
                //reinitialize rawsamples
                rawSamples = new double[newRawSamples.Length];
                //copy new raw samples into old raw samples variable
                Array.Copy(newRawSamples, 0, rawSamples, 0, newRawSamples.Length);
                dataSize = rawSamples.Length / numChannels;
                refreshChart();
            }
        }
コード例 #6
0
ファイル: Form1.cs プロジェクト: Adamsmith6300/WaveEditor
        /// <summary>Generates a filter to filter out aliases for upsampling/downsampling.</summary>
        /// <param name="newSampleRate">The new sample rate to determine the nyquist limit.</param>
        /// <param name="csData">The sample data.</param>
        /// <returns>ComplexNum array representing the filter.</returns>
        private ComplexNum[] genSampleFilter(int newSampleRate, ClipboardData csData)
        {
            ComplexNum[] filter = new ComplexNum[csData.Cs.Length / 10];
            int          freq   = newSampleRate / 2;
            int          bin    = (freq * filter.Length) / newSampleRate;

            for (int i = 0; i < filter.Length; ++i)
            {
                filter[i] = new ComplexNum();
                if (i <= bin)
                {
                    filter[i].Re = 1.0;
                    filter[i].Im = 1.0;
                }
                else
                {
                    filter[i].Re = 0.0;
                    filter[i].Im = 0.0;
                }
            }
            return(filter);
        }