Ejemplo n.º 1
0
        public void SplitWavData()
        {
            if (RIFFData.ChunkID != null)
            {
                List <List <byte> > output = new List <List <byte> >();

                RIFFData data = RIFFData;
                for (int i = 0; i < data.Channels; i++)
                {
                    List <byte> channel = new List <byte>(data.SubChunkSize / data.Channels);
                    output.Add(channel);
                }

                int inc = data.Channels * (data.BitsPerSample / 8);
                for (int b = 0; b < data.Data.Length; b += inc)
                {
                    for (int ch = 0; ch < data.Channels; ch++)
                    {
                        for (int s = 0; s < data.BitsPerSample / 8; s++)
                        {
                            output[ch].Add(data.Data[b + s + (ch * data.BitsPerSample / 8)]);
                        }
                    }
                }

                RawChannelData = output;
                PreSaveBuffer  = new List <List <byte> >(RawChannelData);
            }
        }
Ejemplo n.º 2
0
        public void WriteFile(RIFFData riff)
        {
            try {
                FileStream   fs = new FileStream(filePath, FileMode.Create);
                BinaryWriter wr = new BinaryWriter(fs);

                // RIFF Properties
                wr.Write(riff.ChunkID);
                wr.Write(riff.FileSize);
                wr.Write(riff.RIFFType);

                // FMT Properties
                wr.Write(riff.FormatID);
                wr.Write(riff.FormatSize);
                wr.Write(riff.FormatCode);
                wr.Write(riff.Channels);
                wr.Write(riff.SampleRate);
                wr.Write(riff.ByteRate);
                wr.Write(riff.BlockAlign);
                wr.Write(riff.BitsPerSample);
                wr.Write(riff.SubChunkID);
                wr.Write(riff.SubChunkSize);
                wr.Write(riff.Data);

                wr.Close();
                fs.Close();
            } catch (Exception e) {
                System.Diagnostics.Debug.WriteLine(e.StackTrace);
            }
        }
Ejemplo n.º 3
0
        public RIFFData GenerateRIFFData(AudioPanel panel)
        {
            RIFFData riff = new RIFFData();

            // RIFF Properties
            char[] chunkID = { 'R', 'I', 'F', 'F' };
            riff.ChunkID = Encoding.ASCII.GetBytes(chunkID);
            char[] riffType = { 'W', 'A', 'V', 'E' };
            riff.RIFFType = Encoding.ASCII.GetBytes(riffType);

            // FMT Properties
            char[] formatID = { 'f', 'm', 't', ' ' };
            riff.FormatID   = Encoding.ASCII.GetBytes(formatID);
            riff.FormatSize = 16;
            riff.FormatCode = 1;
            if (panel.Menu.IsMono)
            {
                riff.Channels = 1;
            }
            else
            {
                riff.Channels = 2;
            }
            riff.BitsPerSample = panel.Menu.manager.bits[panel.Menu.manager.checkedBits].Value;

            // Check that loaded file is standard samplerate
            // Use the loaded value if not selectable
            if (panel.PanelData.RIFFData.SampleRate != panel.Menu.manager.khz[panel.Menu.manager.checkedKHZ].Value && panel.PanelData.RIFFData.SampleRate != 0)
            {
                riff.SampleRate = panel.PanelData.RIFFData.SampleRate;
            }
            else
            {
                riff.SampleRate = panel.Menu.manager.khz[panel.Menu.manager.checkedKHZ].Value;
            }
            riff.ByteRate   = riff.BitsPerSample / 8 * riff.SampleRate * riff.Channels;
            riff.BlockAlign = (short)(riff.Channels * riff.BitsPerSample / 8);
            char[] subChunkID = { 'd', 'a', 't', 'a' };
            riff.SubChunkID = Encoding.ASCII.GetBytes(subChunkID);

            // Set the data chunk to be loaded data or null
            if (panel.PanelData.RawChannelData != null)
            {
                riff.Data         = Interleave_Bytes(panel, riff);
                riff.SubChunkSize = riff.Data.Length;
                Console.WriteLine("Data size:" + riff.Data.Length);
            }
            else
            {
                riff.SubChunkSize = 0;
                riff.Data         = null;
            }
            riff.FileSize = 36 + riff.SubChunkSize;

            return(riff);
        }
Ejemplo n.º 4
0
        public RIFFData ParseBytes()
        {
            RIFFData output = new RIFFData();

            // RIFF Properties
            output.ChunkID = new byte[4];
            Array.Copy(file, 0, output.ChunkID, 0, 4);
            output.FileSize = BitConverter.ToInt32(file, 4);
            Console.WriteLine(output.FileSize + ", " + (output.FileSize - 44));
            output.RIFFType = new byte[4];
            Array.Copy(file, 8, output.RIFFType, 0, 4);

            // FMT Properties
            output.FormatID = new byte[4];
            Array.Copy(file, 12, output.FormatID, 0, 4);
            output.FormatSize    = BitConverter.ToInt32(file, 16);
            output.FormatCode    = BitConverter.ToInt16(file, 20);
            output.Channels      = BitConverter.ToInt16(file, 22);
            output.SampleRate    = BitConverter.ToInt32(file, 24);
            output.ByteRate      = BitConverter.ToInt32(file, 28);
            output.BlockAlign    = BitConverter.ToInt16(file, 32);
            output.BitsPerSample = BitConverter.ToInt16(file, 34);

            output.SubChunkID = new byte[4];
            Array.Copy(file, 36, output.SubChunkID, 0, 4);
            output.SubChunkSize = BitConverter.ToInt32(file, 40);

            // Skip non 'data' SubChunks
            int i = 44;

            while (!Encoding.ASCII.GetString(output.SubChunkID).Equals("data"))
            {
                i += output.SubChunkSize;
                Array.Copy(file, i, output.SubChunkID, 0, 4);
                i += 4;
                output.SubChunkSize = BitConverter.ToInt32(file, i);
                i += 4;
            }

            output.Data = new byte[output.SubChunkSize];
            Array.Copy(file, i, output.Data, 0, output.SubChunkSize);

            return(output);
        }
Ejemplo n.º 5
0
        public byte[] Interleave_Bytes(AudioPanel panel, RIFFData riff)
        {
            int         size   = panel.PanelData.RawChannelData[0].Count;
            List <byte> output = new List <byte>();
            int         inc    = riff.BitsPerSample / 8;

            for (int i = 0; i < size; i += inc)
            {
                for (int ch = 0; ch < riff.Channels; ch++)
                {
                    for (int b = 0; b < inc; b++)
                    {
                        output.Add(panel.PanelData.RawChannelData[ch][i + b]);
                    }
                }
            }

            return(output.ToArray());
        }
Ejemplo n.º 6
0
        public List <byte> IntToByteList(List <int> input, RIFFData riff)
        {
            List <byte> output = new List <byte>();

            switch (riff.BitsPerSample)
            {
            case 8:
                for (int i = 0; i < input.Count; i++)
                {
                    output.Add(Convert.ToByte(input[i]));
                }
                break;

            case 16:
                for (int i = 0; i < input.Count; i++)
                {
                    output.AddRange(BitConverter.GetBytes((Int16)input[i]));
                }
                break;

            case 24:
                for (int i = 0; i < input.Count; i++)
                {
                    byte[] temp = BitConverter.GetBytes((Int32)input[i]);
                    output.Add(temp[1]);
                    output.Add(temp[2]);
                    output.Add(temp[3]);
                }
                break;

            case 32:
                for (int i = 0; i < input.Count; i++)
                {
                    output.AddRange(BitConverter.GetBytes((Int32)input[i]));
                }
                break;
            }

            return(output);
        }
Ejemplo n.º 7
0
        public void Record_Click(object sender, EventArgs e)
        {
            if (Service.DLLWrapper.Safe)
            {
                if (panel.PanelData.RIFFData.SubChunkSize == 0)
                {
                    recording = !recording;
                    if (recording)
                    {
                        play.Enabled = false;
                        record.Text  = "Stop";
                        WavPackager packager = new WavPackager(null);
                        RIFFData    riff     = packager.GenerateRIFFData(panel);
                        panel.PanelData.RIFFData = riff;
                        Service.DLLWrapper.Record(riff);
                    }
                    else
                    {
                        play.Enabled = true;
                        Enable_Record(false);
                        RIFFData riff = panel.PanelData.RIFFData;
                        riff.Data                = Service.DLLWrapper.RecordStop();
                        riff.SubChunkSize        = riff.Data.Length;
                        panel.PanelData.RIFFData = riff;

                        panel.PanelData.SplitWavData();
                        panel.ClearAllCharts();

                        panel.PanelData.RawChartData.Add(panel.PanelData.GetReadableChannel(0));

                        Workers.ChartRenderWorker worker = new Workers.ChartRenderWorker(panel, 0, true);
                        worker.RunWorkerAsync();

                        if (panel.PanelData.RawChannelData.Count > 1)
                        {
                            panel.Menu.manager.Stereo_Click();
                            panel.Menu.manager.Mono.Enabled = false;

                            panel.PanelData.RawChartData.Add(panel.PanelData.GetReadableChannel(1));

                            Workers.ChartRenderWorker worker2 = new Workers.ChartRenderWorker(panel, 1, true);
                            worker2.RunWorkerAsync();
                        }
                        else
                        {
                            panel.Menu.manager.Mono_Click();
                            panel.Menu.manager.Stereo.Enabled = false;
                        }
                    }

                    panel.Menu.manager.Open_Click();
                }
                else
                {
                    ScrollPanel scroll = (ScrollPanel)panel.ParentRef;
                    scroll.Click_AddChannel(null, EventArgs.Empty);
                    scroll.audioPanels.Last.Value.PlayBar.Record_Click(null, EventArgs.Empty);
                }
            }
            else
            {
                Console.WriteLine("Unsafe Record action attempted and ignored.");
            }
        }
Ejemplo n.º 8
0
        public static List <ComplexNumber> DFTIntegers(List <int> input, TypeKey.Windowing type, RIFFData riff, int binStart, int binEnd)
        {
            List <ComplexNumber> output = new List <ComplexNumber>();

            for (int f = binStart; f < binEnd; f++)
            {
                double reSum = 0;
                double imSum = 0;
                for (int t = 0; t < input.Count; t++)
                {
                    double weight = GetWindowing(t, input.Count, type);
                    double angle  = (2 * Math.PI * t * f) / input.Count;
                    reSum += weight * input[t] * Math.Cos(angle);
                    imSum -= weight * input[t] * Math.Sin(angle);
                }
                reSum /= input.Count;
                imSum /= input.Count;
                ComplexNumber n = new ComplexNumber();
                n.Real      = reSum;
                n.Imaginary = imSum;
                n.SetLength();
                output.Add(n);
            }
            return(output);
        }
Ejemplo n.º 9
0
        protected void Paste(object sender, EventArgs e)
        {
            if (Service.DLLWrapper.Safe)
            {
                Cursor cursor = panel.TimeChannel1.ChartArea.CursorX;
                if (panel.PanelData.RawChartData.Count > 0 && panel.ParentRef.ScrollData.IntBuffer.Count > 0)
                {
                    for (int i = 0; i < panel.PanelData.RIFFData.Channels; i++)
                    {
                        int pos = (int)cursor.Position * (panel.PanelData.RIFFData.BitsPerSample / 8);

                        List <int> copyBuffer;
                        if (i < panel.ParentRef.ScrollData.IntBuffer.Count)
                        {
                            copyBuffer = panel.ParentRef.ScrollData.IntBuffer[i];
                        }
                        else
                        {
                            copyBuffer = panel.ParentRef.ScrollData.IntBuffer[0];
                        }

                        RIFFData copyRiff  = panel.ParentRef.ScrollData.BufferRIFF;
                        RIFFData curChRiff = panel.PanelData.RIFFData;
                        // Downsample
                        if (copyRiff.SampleRate > panel.PanelData.RIFFData.SampleRate)
                        {
                            // Generate filter
                            double freqPBin  = (double)copyRiff.SampleRate / copyBuffer.Count;
                            int    pasteFMax = curChRiff.SampleRate / 2;
                            int    bin       = (int)(pasteFMax / freqPBin);
                            bool   bitOffset = (copyRiff.BitsPerSample == 8) != (panel.PanelData.RIFFData.BitsPerSample == 8);
                            FilterAndConvolve(copyBuffer, bin, bitOffset);

                            // Trim copy buffer
                            double          sampleRatio = (double)curChRiff.SampleRate / copyRiff.SampleRate;
                            Func <int, int> mapFunction = Structure.BitMapper.GetMapper(copyRiff.BitsPerSample, panel.PanelData.RIFFData.BitsPerSample);
                            List <int>      trimCopy    = Service.SignalProcessing.Downsample(convolutionResult, sampleRatio, mapFunction);

                            if (i < 2)
                            {
                                List <int> input = panel.PanelData.RawChartData[i];
                                int        index = (int)cursor.Position;
                                input.InsertRange((int)cursor.Position, trimCopy);
                            }

                            // Move new list into channel data
                            panel.PanelData.RawChannelData[i].InsertRange(pos, panel.PanelData.IntToByteList(trimCopy, copyRiff));
                            Console.WriteLine("Downsample complete");
                        }
                        // Upsample
                        else if (copyRiff.SampleRate < panel.PanelData.RIFFData.SampleRate)
                        {
                            // Load stuffed copy samples
                            double          sampleRatio = (double)panel.PanelData.RIFFData.SampleRate / panel.ParentRef.ScrollData.BufferRIFF.SampleRate;
                            Func <int, int> mapFunction = Structure.BitMapper.GetMapper(copyRiff.BitsPerSample, panel.PanelData.RIFFData.BitsPerSample);
                            List <int>      padCopy     = Service.SignalProcessing.Upsample(copyBuffer, sampleRatio, mapFunction);

                            // Filter frequencies above receiver buffer fmax from copy
                            double freqPBin  = (double)panel.PanelData.RIFFData.SampleRate / copyBuffer.Count;
                            int    pasteFMax = panel.ParentRef.ScrollData.BufferRIFF.SampleRate / 2;
                            int    bin       = (int)(pasteFMax / freqPBin);
                            bool   bitOffset = (copyRiff.BitsPerSample != panel.PanelData.RIFFData.BitsPerSample);
                            FilterAndConvolve(padCopy, bin, bitOffset);

                            // Move new list into channel data
                            if (i < 2)
                            {
                                List <int> input = panel.PanelData.RawChartData[i];
                                int        index = (int)cursor.Position;
                                input.InsertRange((int)cursor.Position, convolutionResult);
                            }
                            List <byte> temp = panel.PanelData.IntToByteList(convolutionResult, panel.PanelData.RIFFData);
                            panel.PanelData.RawChannelData[i].InsertRange(pos, temp);
                            Console.WriteLine("Upsample complete");
                        }
                        // Copy is same sample rate
                        else
                        {
                            // Modify bits per sample values
                            if (copyRiff.BitsPerSample != panel.PanelData.RIFFData.BitsPerSample)
                            {
                                Func <int, int> mapFunction     = Structure.BitMapper.GetMapper(copyRiff.BitsPerSample, panel.PanelData.RIFFData.BitsPerSample);
                                List <int>      adjustedBitRate = new List <int>();
                                foreach (int sample in copyBuffer)
                                {
                                    adjustedBitRate.Add(mapFunction(sample));
                                }

                                if (i < 2)
                                {
                                    List <int> input = panel.PanelData.RawChartData[i];
                                    int        index = (int)cursor.Position;
                                    input.InsertRange((int)cursor.Position, adjustedBitRate);
                                }
                                panel.PanelData.RawChannelData[i].InsertRange(pos, panel.PanelData.IntToByteList(adjustedBitRate, panel.PanelData.RIFFData));
                            }
                            else
                            {
                                if (i < 2)
                                {
                                    List <int> input = panel.PanelData.RawChartData[i];
                                    int        index = (int)cursor.Position;
                                    input.InsertRange((int)cursor.Position, copyBuffer);
                                }
                                panel.PanelData.RawChannelData[i].InsertRange(pos, panel.PanelData.IntToByteList(copyBuffer, copyRiff));
                            }
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine("Unsafe Paste() attempted; ignored");
            }
        }