예제 #1
0
        public WFOTransporter(WaveFileObject obj)
        {
            this.header = obj.header;

            switch (obj.header.bit)
            {
            case 16:
                arrShort = new short[obj.soundData.Count];
                for (int i = 0; i < obj.soundData.Count; i++)
                {
                    arrShort[i] = (short)obj.soundData[i];
                }
                break;

            case 32:
                arrInt = new uint[obj.soundData.Count];
                for (int i = 0; i < obj.soundData.Count; i++)
                {
                    arrInt[i] = (uint)obj.soundData[i];
                }
                break;

            case 64:
                arrDouble = new double[obj.soundData.Count];
                for (int i = 0; i < obj.soundData.Count; i++)
                {
                    arrDouble[i] = (double)obj.soundData[i];
                }
                break;

            default:
                break;
            }
        }
예제 #2
0
    public WaveFileObject[] ToWaveChunksWithOverlaps(int ms)
    {
        double secs         = ms / 1000d;
        long   chunkSamples = (long)(header.sampleRate * secs);
        long   chunkCount   = (((header.dataSize / header.blockSize) / chunkSamples) * 2) - 2;

        WaveFileObject[] waves = new WaveFileObject[chunkCount];

        int osIndex = 0;

        // Even indexes are the original chunks
        // Odd indexes are the overlaps

        for (int i = 0; i < chunkCount / 2; i++)
        {
            for (int j = 0; j < chunkSamples; j++)
            {
                waves[i].soundData[j] = soundData[osIndex];

                if (i == 1)
                {
                    waves[i].soundData[j] = soundData[osIndex - (int)(chunkSamples * .5)];
                }

                if (i > 1 && i < chunkCount - 2)
                {
                    waves[i].soundData[j] = soundData[osIndex - (int)(chunkSamples * .5)];
                }
                osIndex++;
            }

            waves[i].header.dataSize = (uint)chunkSamples * 4;
        }
        return(waves);
    }
    public WaveFileObject[] ToWaveChunksWithOverlaps(int ms, WaveFileObject obj)
    {
        double secs         = ms / 1000d;
        long   chunkSamples = (long)(obj.header.sampleRate * secs);
        long   chunkCount   = (((obj.header.dataSize / obj.header.blockSize) / chunkSamples) * 2) - 2;

        WaveFileObject[] waves = new WaveFileObject[chunkCount];
        int osIndex            = 0;

        for (int i = 0; i < chunkCount; i++)
        {
            waves[i] = new WaveFileObject();
            WavHeader tempHeader = header;

            if (header.bit == 16)
            {
                tempHeader.dataSize  = (uint)chunkSamples * 2;
                tempHeader.blockSize = 2;
                waves[i].soundData   = new List <ushort>();
            }
            if (header.bit == 32)
            {
                tempHeader.dataSize  = (uint)chunkSamples * 4;
                tempHeader.blockSize = 4;
                waves[i].soundData   = new List <uint>();
            }
            if (header.bit == 64)
            {
                tempHeader.dataSize  = (uint)chunkSamples * 8;
                tempHeader.blockSize = 8;
                waves[i].soundData   = new List <double>();
            }

            waves[i].header = tempHeader;
        }

        for (int i = 0; i < chunkCount; i++)
        {
            for (int j = 0; j < chunkSamples; j++)
            {
                if (!IsOdd(i))
                {
                    waves[i].soundData.Add(obj.soundData[osIndex]);
                    osIndex++;
                }
                else
                {
                    waves[i].soundData.Add(obj.soundData[osIndex + j - (int)(chunkSamples * .5)]);
                }
            }
        }
        return(waves);
    }
예제 #4
0
    void Start()
    {
        baseSamplePath = Application.dataPath + "/Resources/SoundSamples";
        server.Initialize();

        // Clean up from last time
        DirectoryInfo di = new DirectoryInfo(baseSamplePath);

        foreach (DirectoryInfo dir in di.GetDirectories())
        {
            dir.Delete(true);
        }

        //Load FFTWBuddy here
        //System.Diagnostics.Process.Start();

        filePaths = Directory.GetFiles(Application.dataPath + "/Resources/TrainingData");
        List <string> correctFilePaths = new List <string>();

        int wavCount = 0;

        for (int i = 0; i < filePaths.Length; i++)
        {
            if (filePaths[i].EndsWith(".wav"))
            {
                correctFilePaths.Add(filePaths[i]);
                wavCount++;
            }
        }

        soundSampleCount = wavCount;
        waveObjects      = new WaveFileObject[wavCount];

        for (int i = 0; i < wavCount; i++)
        {
            waveObjects[i] = new WaveFileObject(correctFilePaths[i]);
        }

        Debug.Log("Number of samples: " + wavCount);

        Thread t = new Thread(new ThreadStart(Process));

        t.Start();

        //double[] arr = new double[waveObjects[0].soundData.Count];
        //waveObjects[1].soundData.CopyTo(arr, 0);

        //WriteWaveFile(arr, baseSamplePath + "/" + "test.wav");
        //Debug.Log("wrote file");
    }
예제 #5
0
    public static WaveFileObject ReadWaveFile(string path)
    {
        WaveFileObject tempObj = new WaveFileObject();

        using (FileStream fs = new FileStream(path, FileMode.Open))
            using (BinaryReader br = new BinaryReader(fs))
            {
                try
                {
                    tempObj.header.riff       = br.ReadBytes(4);
                    tempObj.header.size       = br.ReadUInt32();
                    tempObj.header.wavID      = br.ReadBytes(4);
                    tempObj.header.fmtID      = br.ReadBytes(4);
                    tempObj.header.fmtSize    = br.ReadUInt32();
                    tempObj.header.format     = br.ReadUInt16();
                    tempObj.header.channels   = br.ReadUInt16();
                    tempObj.header.sampleRate = br.ReadUInt32();
                    tempObj.header.bytePerSec = br.ReadUInt32();
                    tempObj.header.blockSize  = br.ReadUInt16();
                    tempObj.header.bit        = br.ReadUInt16();
                    tempObj.header.dataID     = br.ReadBytes(4);
                    tempObj.header.dataSize   = br.ReadUInt32();

                    for (int i = 0; i < tempObj.header.dataSize / tempObj.header.blockSize; i++)
                    {
                        tempObj.soundData.Add((short)br.ReadUInt16());
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    throw;
                }
                finally
                {
                    if (br != null)
                    {
                        br.Close();
                    }
                    if (fs != null)
                    {
                        fs.Close();
                    }
                }
            }
        return(tempObj);
    }
예제 #6
0
    public static void WriteWaveFile(WaveFileObject obj, string path)
    {
        using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
            using (BinaryWriter bw = new BinaryWriter(fs))
            {
                try
                {
                    bw.Write(obj.header.riff);
                    bw.Write(obj.header.size);
                    bw.Write(obj.header.wavID);
                    bw.Write(obj.header.fmtID);
                    bw.Write(obj.header.fmtSize);
                    bw.Write(obj.header.format);
                    bw.Write(obj.header.channels);
                    bw.Write(obj.header.sampleRate);
                    bw.Write(obj.header.bytePerSec);
                    bw.Write(obj.header.blockSize);
                    bw.Write(obj.header.bit);
                    bw.Write(obj.header.dataID);
                    bw.Write(obj.header.dataSize);

                    for (int i = 0; i < obj.header.dataSize / obj.header.blockSize; i++)
                    {
                        if (i < obj.soundData.Count)
                        {
                            bw.Write((ushort)obj.soundData[i]);
                        }
                        else
                        {
                            bw.Write(0);
                        }
                    }
                }
                finally
                {
                    if (bw != null)
                    {
                        bw.Close();
                    }
                    if (fs != null)
                    {
                        fs.Close();
                    }
                }
            }
        return;
    }
예제 #7
0
    public WaveFileObject[] ToWaveChunks(int ms)
    {
        double secs         = ms / 1000d;
        long   chunkSamples = (long)(header.sampleRate * secs);
        long   chunkCount   = (header.dataSize / header.blockSize) / chunkSamples;

        WaveFileObject[] waves = new WaveFileObject[chunkCount];

        int osIndex = 0;

        for (int i = 0; i < chunkCount; i++)
        {
            for (int j = 0; j < chunkSamples; j++)
            {
                waves[i].soundData[j] = soundData[osIndex];
                osIndex++;
            }

            waves[i].header.dataSize = (uint)chunkSamples * 4;
        }

        return(waves);
    }
예제 #8
0
    public WaveFileObject[] ToWaveChunksWithOverlaps(int ms, WaveFileObject obj)
    {
        double secs         = ms / 1000d;
        long   chunkSamples = (long)(obj.header.sampleRate * secs * obj.header.channels);
        long   chunkCount   = ((obj.soundData.Count / chunkSamples) * 2) - 2;

        WaveFileObject[] waves = new WaveFileObject[chunkCount];
        int osIndex            = 0;


        //Debug.Log("chunkCount " + chunkCount);
        Debug.Log("chunkSamples " + chunkSamples);
        //Debug.Log("sampleRate " + obj.header.sampleRate);
        //Debug.Log("size " + obj.header.size);
        //Debug.Log("Block size " + obj.header.blockSize);
        //Debug.Log("Block size " + obj.header.bit);


        Debug.Log("starting waves");

        for (int i = 0; i < chunkCount; i++)
        {
            waves[i] = new WaveFileObject();
            WavHeader tempHeader = header;

            if (header.bit == 16)
            {
                tempHeader.dataSize  = (uint)chunkSamples * 2;
                tempHeader.blockSize = 2;
                waves[i].soundData   = new List <short>();
            }
            if (header.bit == 32)
            {
                tempHeader.dataSize  = (uint)chunkSamples * 4;
                tempHeader.blockSize = 4;
                waves[i].soundData   = new List <uint>();
            }
            if (header.bit == 64)
            {
                tempHeader.dataSize  = (uint)chunkSamples * 8;
                tempHeader.blockSize = 8;
                waves[i].soundData   = new List <double>();
            }

            waves[i].header = tempHeader;
        }

        for (int i = 0; i < chunkCount; i++)
        {
            //Debug.Log("Chunk count: " + i + " / " + chunkCount);
            //Debug.Log("osIndex : " + osIndex);
            //Debug.Log("soundDataCount : " + obj.soundData.Count);

            for (int j = 0; j < chunkSamples; j++)
            {
                if (!IsOdd(i))
                {
                    waves[i].soundData.Add(obj.soundData[osIndex]);
                    //Debug.Log(obj.soundData[osIndex]);
                    osIndex++;
                }
                else
                {
                    waves[i].soundData.Add(obj.soundData[osIndex + j - (int)(chunkSamples * .5)]);
                }
            }
        }
        Debug.Log("returning waves");
        return(waves);
    }
예제 #9
0
    public static WaveFileObject ReadWaveFile(string path)
    {
        WaveFileObject tempObj = new WaveFileObject();

        using (FileStream fs = new FileStream(path, FileMode.Open))
            using (BinaryReader br = new BinaryReader(fs))
            {
                try
                {
                    tempObj.header.riff  = br.ReadBytes(4);
                    tempObj.header.size  = br.ReadUInt32();
                    tempObj.header.wavID = br.ReadBytes(4);
                    byte[] temp  = br.ReadBytes(4);
                    string chunk = System.Text.Encoding.UTF8.GetString(temp);
                    if (chunk != "fmt ")
                    {
                        byte[] junk = br.ReadBytes(36);
                    }
                    else
                    {
                        tempObj.header.fmtID = temp;
                    }
                    tempObj.header.fmtSize    = br.ReadUInt32();
                    tempObj.header.format     = br.ReadUInt16();
                    tempObj.header.channels   = br.ReadUInt16();
                    tempObj.header.sampleRate = br.ReadUInt32();
                    tempObj.header.bytePerSec = br.ReadUInt32();
                    tempObj.header.blockSize  = br.ReadUInt16();
                    tempObj.header.bit        = br.ReadUInt16();
                    tempObj.header.dataID     = br.ReadBytes(4);
                    tempObj.header.dataSize   = br.ReadUInt32();

                    if (tempObj.header.bit == 16)
                    {
                        tempObj.soundData = new List <ushort>();

                        for (int i = 0; i < tempObj.header.dataSize / (tempObj.header.bit / 8); i++)
                        {
                            tempObj.soundData.Add(br.ReadUInt16());
                        }
                    }

                    if (tempObj.header.bit == 32)
                    {
                        tempObj.soundData = new List <uint>();

                        for (int i = 0; i < tempObj.header.dataSize / tempObj.header.blockSize; i++)
                        {
                            tempObj.soundData.Add(br.ReadUInt32());
                        }
                    }

                    if (tempObj.header.bit == 64)
                    {
                        tempObj.soundData = new List <double>();

                        for (int i = 0; i < tempObj.header.dataSize / tempObj.header.blockSize; i++)
                        {
                            tempObj.soundData.Add(br.ReadDouble());
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    throw;
                }
                finally
                {
                    if (br != null)
                    {
                        br.Close();
                    }
                    if (fs != null)
                    {
                        fs.Close();
                    }
                }
            }
        return(tempObj);
    }
예제 #10
0
 public SamplePopData(DataSample sample, string path, WaveFileObject wav)
 {
     this.dataSample   = sample;
     this.waveFilePath = path;
     this.wavObj       = wav;
 }