/// <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
/// <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)); }
/// <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); }
/// <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); }
/// <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); }
/// <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; }
/// <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
/// <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); }
/// <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); }
public WaveMS(FormatHeader header, Spectrum m, Spectrum s) : base(header) { this.m = m; this.s = s; }
/// <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; }
/// <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); }
/// <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; }
/// <summary> /// Wave ファイルを開く。 /// </summary> /// <param name="filename">Wave ファイル名</param> public void Open(string filename, FormatHeader header) { Open(new BinaryWriter(new BufferedStream(File.Create(filename))), header); }
/// <summary> /// ストリームに書き込む。 /// </summary> /// <param name="writer">書き込み先ストリーム</param> /// <param name="header">Wave のヘッダ</param> public WaveWriter(BinaryWriter writer, FormatHeader header) { this.Open(writer, header); }
/// <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
/// <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; }
public WaveMonaural(FormatHeader header, double[] l) : base(header) { this.l = l; }
/// <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
public WaveTime(FormatHeader header, double[] l, double[] r) : base(header) { this.l = l; this.r = r; }
public WaveFrequency(FormatHeader header, Spectrum l, Spectrum r) : base(header) { this.l = l; this.r = r; }
/// <summary> /// ファイル名を指定して開く。 /// </summary> /// <param name="filename">書き込み先 Wave ファイル名</param> /// <param name="header">Wave のヘッダ</param> public WaveWriter(string filename, FormatHeader header) { this.Open(filename, header); }
public WaveData(FormatHeader header) { this.header = header; }