Beispiel #1
0
        /// <summary>
        /// Wave ファイルを開く。
        /// </summary>
        /// <param name="reader">Wave ファイルを格納したストリーム</param>
        public void Open(BinaryWriter writer, FormatHeader header)
        {
            if (this.writer != null)
            {
                this.writer.Close();
            }

            this.writer = writer;
            this.header = header;

            WaveWriter.WriteHeader(writer, header, 0); // データ長は仮に0を入れておく。
        }                                              //Open
Beispiel #2
0
 /// <summary>
 /// データ読み出し。
 /// </summary>
 /// <param name="reader">読み出し元ストリーム</param>
 /// <param name="header">Wave ヘッダ</param>
 /// <param name="length">読み出したい長さ</param>
 /// <param name="l">読み出し先配列(L ch)</param>
 /// <param name="r">読み出し先配列(R ch)</param>
 /// <returns>読み出したデータサンプル数</returns>
 public static int Read(BinaryReader reader, FormatHeader header, uint length, out short[] l, out short[] r)
 {
     if (header.IsStereo)
     {
         l = new short[length];
         r = new short[length];
     }
     else
     {
         l = new short[length];
         r = null;
     }
     return(WaveReader.Read(reader, header, l, r));
 }
Beispiel #3
0
        /// <summary>
        /// データ読み出し。
        /// </summary>
        /// <param name="reader">読み出し元ストリーム</param>
        /// <param name="header">Wave ヘッダ</param>
        /// <param name="length">読み出したい長さ</param>
        /// <param name="l">読み出し先配列(L ch)</param>
        /// <param name="r">読み出し先配列(R ch)</param>
        /// <returns>読み出したデータサンプル数</returns>
        public static int Read(BinaryReader reader, FormatHeader header, short[] l, short[] r)
        {
            uint length = (uint)l.Length;

            int i = 0;

            try
            {
                if (!header.IsStereo)                // モノラル
                {
                    if (!header.Is16Bit)
                    {
                        for (i = 0; i < length; ++i)
                        {
                            l[i] = (short)(reader.ReadByte() - 128);
                        }
                    }
                    else
                    {
                        for (i = 0; i < length; ++i)
                        {
                            l[i] = (short)reader.ReadInt16();
                        }
                    }
                }
                else                 //ステレオ
                {
                    if (!header.Is16Bit)
                    {
                        for (i = 0; i < length; ++i)
                        {
                            l[i] = (short)(reader.ReadByte() - 128);
                            r[i] = (short)(reader.ReadByte() - 128);
                        }
                    }
                    else
                    {
                        for (i = 0; i < length; ++i)
                        {
                            l[i] = (short)reader.ReadInt16();
                            r[i] = (short)reader.ReadInt16();
                        }
                    }
                }                //ステレオ
            }
            catch (EndOfStreamException) {}
            catch (IOException) {}

            return(i);
        }
Beispiel #4
0
        /// <summary>
        /// データ書き出し。
        /// </summary>
        /// <param name="writer">書き込み先ストリーム</param>
        /// <param name="header">Wave ヘッダ</param>
        /// <param name="l">書き込みたいデータ(L ch)</param>
        /// <param name="r">書き込みたいデータ(R ch)</param>
        /// <returns></returns>
        public static int Write(BinaryWriter writer, FormatHeader header, short[] l, short[] r)
        {
            int i = 0;

            try
            {
                int length = l.Length;

                if (!header.IsStereo)                // モノラル
                {
                    if (!header.Is16Bit)
                    {
                        for (i = 0; i < length; ++i)
                        {
                            writer.Write(Util.ClipToByte(l[i]));
                        }
                    }
                    else
                    {
                        for (i = 0; i < length; ++i)
                        {
                            writer.Write(Util.ClipToShort(l[i]));
                        }
                    }
                }
                else                 // ステレオ
                {
                    if (!header.Is16Bit)
                    {
                        for (i = 0; i < length; ++i)
                        {
                            writer.Write(Util.ClipToByte(l[i]));
                            writer.Write(Util.ClipToByte(r[i]));
                        }
                    }
                    else
                    {
                        for (i = 0; i < length; ++i)
                        {
                            writer.Write(Util.ClipToShort(l[i]));
                            writer.Write(Util.ClipToShort(r[i]));
                        }
                    }
                }                //ステレオ
            }
            catch (IOException) { return(0); }
            return(i);
        }
Beispiel #5
0
        /// <summary>
        /// Wave ファイルストリームからヘッダを読み出す。
        /// </summary>
        /// <param name="reader">読み出し元のストリーム</param>
        /// <returns>読み出したヘッダ</returns>
        public static FormatHeader ReadHeader(BinaryReader reader)
        {
            byte[] buf;

            buf = reader.ReadBytes(4);

            if (!Util.Equal(buf, Util.RIFF))
            {
                throw new WaveException("このファイルはRIFF形式ではありません。");
            }

            reader.ReadBytes(4);             //ファイルサイズ読み飛ばし。

            buf = reader.ReadBytes(4);
            if (!Util.Equal(buf, Util.WAVE))
            {
                throw new WaveException("このファイルはwave形式ではありません。");
            }

            // fmt chunk 読み出し
            FormatHeader header;

            while (true)
            {
                buf = reader.ReadBytes(4);
                int    length = reader.ReadInt32();
                byte[] data   = reader.ReadBytes(length);

                if (length < 16)
                {
                    throw new WaveException("ヘッダ長が短すぎます。");
                }
                if (Util.Equal(buf, Util.FMT))
                {
                    unsafe
                    {
                        fixed(byte *p = data)
                        {
                            header = *(FormatHeader *)p;
                        }
                    }
                    break;
                }
            }
            return(header);
        }
Beispiel #6
0
		/// <summary>
		/// Wave ファイルストリームからヘッダを読み出す。
		/// </summary>
		/// <param name="reader">読み出し元のストリーム</param>
		/// <returns>読み出したヘッダ</returns>
		public static FormatHeader ReadHeader(BinaryReader reader)
		{
			byte[] buf;

			buf= reader.ReadBytes(4);

			if(!Util.Equal(buf, Util.RIFF))
			{
				throw new WaveException("このファイルはRIFF形式ではありません。");
			}

			reader.ReadBytes(4); //ファイルサイズ読み飛ばし。

			buf= reader.ReadBytes(4);
			if(!Util.Equal(buf, Util.WAVE))
			{
				throw new WaveException("このファイルはwave形式ではありません。");
			}

			// fmt chunk 読み出し
			FormatHeader header;
			while(true)
			{
				buf = reader.ReadBytes(4);
				int length = reader.ReadInt32();
				byte[] data = reader.ReadBytes(length);

				if(length < 16)
				{
					throw new WaveException("ヘッダ長が短すぎます。");
				}
				if(Util.Equal(buf, Util.FMT))
				{
					unsafe
					{
						fixed(byte* p= data)
						{
							header = *(FormatHeader*)p;
						}
					}
					break;
				}
			}
			return header;
		}
Beispiel #7
0
        /// <summary>
        /// Wave ファイルを開く。
        /// </summary>
        /// <param name="reader">Wave ファイルを格納したストリーム</param>
        public void Open(BinaryReader reader)
        {
            if (this.reader != null)
            {
                this.reader.Close();
            }

            this.reader = reader;

            // ヘッダ読み出し
            this.header = WaveReader.ReadHeader(reader);

            if (this.header.id != 0x0001)
            {
                throw new WaveException("対応していないフォーマットです。");
            }

            // data chunk 読み出し
            int length = ReadDataChunk(reader);

            this.dataLength = (uint)(length / this.header.blockSize);
        }        //Open
Beispiel #8
0
        /// <summary>
        /// Wave ヘッダ(RIFF, fmt chunk, data chunk のデータ長まで)をストリームに書き出す。
        /// </summary>
        /// <param name="writer">書き込み先ストリーム</param>
        /// <param name="header">Wave のヘッダ</param>
        /// <param name="length">データ長(サンプル数)</param>
        public static void WriteHeader(BinaryWriter writer, FormatHeader header, int length)
        {
            byte[] buf;

            length *= header.blockSize;

            writer.Write(Util.RIFF);
            writer.Write((uint)length + 36u);
            writer.Write(Util.WAVE);
            writer.Write(Util.FMT);
            writer.Write((uint)16);

            unsafe
            {
                buf = new byte[16];
                fixed(byte *p = buf)
                {
                    *(FormatHeader *)p = header;
                }
            }
            writer.Write(buf);
            writer.Write(Util.DATA);
            writer.Write((uint)length);
        }
Beispiel #9
0
		/// <summary>
		/// Wave ヘッダ(RIFF, fmt chunk, data chunk のデータ長まで)をストリームに書き出す。
		/// </summary>
		/// <param name="writer">書き込み先ストリーム</param>
		/// <param name="header">Wave のヘッダ</param>
		/// <param name="length">データ長(サンプル数)</param>
		public static void WriteHeader(BinaryWriter writer, FormatHeader header, int length)
		{
			byte[] buf;

			length *= header.blockSize;

			writer.Write(Util.RIFF);
			writer.Write((uint)length + 36u);
			writer.Write(Util.WAVE);
			writer.Write(Util.FMT);
			writer.Write((uint)16);

			unsafe
			{
				buf = new byte[16];
				fixed(byte* p = buf)
				{
					*(FormatHeader*)p = header;
				}
			}
			writer.Write(buf);
			writer.Write(Util.DATA);
			writer.Write((uint)length);
		}
Beispiel #10
0
		public WaveMS(FormatHeader header, Spectrum m, Spectrum s) : base(header)
		{
			this.m = m;
			this.s = s;
		}
Beispiel #11
0
		/// <summary>
		/// データ読み飛ばし。
		/// </summary>
		/// <param name="reader">読み出し元ストリーム</param>
		/// <param name="header">Wave ヘッダ</param>
		/// <param name="length">読み出したい長さ</param>
		/// <returns>ストリームの最後まで達した場合は false</returns>
		public static bool Skip(BinaryReader reader, FormatHeader header, int length)
		{
			try
			{
				int readSize;
				if(!header.IsStereo) // モノラル
					if(!header.Is16Bit) readSize = length;
					else         readSize = length * 2;
				else          // ステレオ
					if(!header.Is16Bit) readSize = length * 2;
				else         readSize = length * 4;
				reader.ReadBytes(readSize);
			}
			catch(EndOfStreamException)
			{
				return false;
			}
			return true;
		}
Beispiel #12
0
		/// <summary>
		/// データ読み出し。
		/// </summary>
		/// <param name="reader">読み出し元ストリーム</param>
		/// <param name="header">Wave ヘッダ</param>
		/// <param name="length">読み出したい長さ</param>
		/// <param name="l">読み出し先配列(L ch)</param>
		/// <param name="r">読み出し先配列(R ch)</param>
		/// <returns>読み出したデータサンプル数</returns>
		public static int Read(BinaryReader reader, FormatHeader header, uint length, out short[]l, out short[] r)
		{
			if(header.IsStereo)
			{
				l = new short[length];
				r = new short[length];
			}
			else
			{
				l = new short[length];
				r = null;
			}
			return WaveReader.Read(reader, header, l, r);
		}
Beispiel #13
0
		/// <summary>
		/// データ読み出し。
		/// </summary>
		/// <param name="reader">読み出し元ストリーム</param>
		/// <param name="header">Wave ヘッダ</param>
		/// <param name="length">読み出したい長さ</param>
		/// <param name="l">読み出し先配列(L ch)</param>
		/// <param name="r">読み出し先配列(R ch)</param>
		/// <returns>読み出したデータサンプル数</returns>
		public static int Read(BinaryReader reader, FormatHeader header, short[]l, short[] r)
		{
			uint length = (uint)l.Length;

			int i = 0;
			try
			{
				if(!header.IsStereo) // モノラル
				{
					if(!header.Is16Bit)
					{
						for(i=0; i<length; ++i)
						{
							l[i] = (short)(reader.ReadByte() - 128);
						}
					}
					else
					{
						for(i=0; i<length; ++i)
						{
							l[i] = (short)reader.ReadInt16();
						}
					}
				}
				else //ステレオ
				{
					if(!header.Is16Bit)
					{
						for(i=0; i<length; ++i)
						{
							l[i] = (short)(reader.ReadByte() - 128);
							r[i] = (short)(reader.ReadByte() - 128);
						}
					}
					else
					{
						for(i=0; i<length; ++i)
						{
							l[i] = (short)reader.ReadInt16();
							r[i] = (short)reader.ReadInt16();
						}
					}
				}//ステレオ
			}
			catch(EndOfStreamException){}
			catch(IOException){}

			return i;
		}
Beispiel #14
0
 /// <summary>
 /// Wave ファイルを開く。
 /// </summary>
 /// <param name="filename">Wave ファイル名</param>
 public void Open(string filename, FormatHeader header)
 {
     Open(new BinaryWriter(new BufferedStream(File.Create(filename))), header);
 }
Beispiel #15
0
 /// <summary>
 /// ストリームに書き込む。
 /// </summary>
 /// <param name="writer">書き込み先ストリーム</param>
 /// <param name="header">Wave のヘッダ</param>
 public WaveWriter(BinaryWriter writer, FormatHeader header)
 {
     this.Open(writer, header);
 }
Beispiel #16
0
		/// <summary>
		/// Wave ファイルを開く。
		/// </summary>
		/// <param name="reader">Wave ファイルを格納したストリーム</param>
		public void Open(BinaryWriter writer, FormatHeader header)
		{
			if(this.writer != null)
			{
				this.writer.Close();
			}

			this.writer = writer;
			this.header = header;

			WaveWriter.WriteHeader(writer, header, 0); // データ長は仮に0を入れておく。
		}//Open
Beispiel #17
0
		/// <summary>
		/// データ書き出し。
		/// </summary>
		/// <param name="writer">書き込み先ストリーム</param>
		/// <param name="header">Wave ヘッダ</param>
		/// <param name="l">書き込みたいデータ(L ch)</param>
		/// <param name="r">書き込みたいデータ(R ch)</param>
		/// <returns></returns>
		public static int Write(BinaryWriter writer, FormatHeader header, short[] l, short[] r)
		{
			int i = 0;

			try
			{
				int length = l.Length;

				if(!header.IsStereo) // モノラル
				{
					if(!header.Is16Bit)
					{
						for(i=0; i<length; ++i)
						{
							writer.Write(Util.ClipToByte(l[i]));
						}
					}
					else
					{
						for(i=0; i<length; ++i)
						{
							writer.Write(Util.ClipToShort(l[i]));
						}
					}
				}
				else // ステレオ
				{
					if(!header.Is16Bit)
					{
						for(i=0; i<length; ++i)
						{
							writer.Write(Util.ClipToByte(l[i]));
							writer.Write(Util.ClipToByte(r[i]));
						}
					}
					else
					{
						for(i=0; i<length; ++i)
						{
							writer.Write(Util.ClipToShort(l[i]));
							writer.Write(Util.ClipToShort(r[i]));
						}
					}
				}//ステレオ
			}
			catch(IOException){return 0;}
			return i;
		}
Beispiel #18
0
		public WaveMonaural(FormatHeader header, double[] l) : base(header)
		{
			this.l = l;
		}
Beispiel #19
0
		/// <summary>
		/// Wave ファイルを開く。
		/// </summary>
		/// <param name="reader">Wave ファイルを格納したストリーム</param>
		public void Open(BinaryReader reader)
		{
			if(this.reader != null)
			{
				this.reader.Close();
			}

			this.reader = reader;

			// ヘッダ読み出し
			this.header = WaveReader.ReadHeader(reader);

			if(this.header.id != 0x0001)
			{
				throw new WaveException("対応していないフォーマットです。");
			}

			// data chunk 読み出し
			int length = ReadDataChunk(reader);
			this.dataLength = (uint)(length / this.header.blockSize);
		}//Open
Beispiel #20
0
		/// <summary>
		/// ストリームに書き込む。
		/// </summary>
		/// <param name="writer">書き込み先ストリーム</param>
		/// <param name="header">Wave のヘッダ</param>
		public WaveWriter(BinaryWriter writer, FormatHeader header)
		{
			this.Open(writer, header);
		}
Beispiel #21
0
		/// <summary>
		/// Wave ファイルを開く。
		/// </summary>
		/// <param name="filename">Wave ファイル名</param>
		public void Open(string filename, FormatHeader header)
		{
			Open(new BinaryWriter(new BufferedStream(File.Create(filename))), header);
		}
Beispiel #22
0
		public WaveTime(FormatHeader header, double[] l, double[] r) : base(header)
		{
			this.l = l;
			this.r = r;
		}
Beispiel #23
0
		public WaveFrequency(FormatHeader header, Spectrum l, Spectrum r) : base(header)
		{
			this.l = l;
			this.r = r;
		}
Beispiel #24
0
 /// <summary>
 /// ファイル名を指定して開く。
 /// </summary>
 /// <param name="filename">書き込み先 Wave ファイル名</param>
 /// <param name="header">Wave のヘッダ</param>
 public WaveWriter(string filename, FormatHeader header)
 {
     this.Open(filename, header);
 }
Beispiel #25
0
		public WaveData(FormatHeader header)
		{
			this.header = header;
		}
Beispiel #26
0
		/// <summary>
		/// ファイル名を指定して開く。
		/// </summary>
		/// <param name="filename">書き込み先 Wave ファイル名</param>
		/// <param name="header">Wave のヘッダ</param>
		public WaveWriter(string filename, FormatHeader header)
		{
			this.Open(filename, header);
		}