728x90
반응형
728x170
TestProject.zip0.01MBtest.wav0.17MB
▶ WAVERIFF.cs
namespace TestProject
{
/// <summary>
/// WAVE RIFF
/// </summary>
public class WAVERIFF
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 청크 ID
/// </summary>
/// 4바이트 : 빅 엔디안
/// 'RIFF' 문자를 저장한다.
/// <remarks>
/// </remarks>
public string ChunkID;
/// <summary>
/// 청크 크기
/// </summary>
/// <remarks>
/// 4바이트 : 리틀 엔디안
/// 전체 파일 크기 - 8
/// </remarks>
public uint ChunkSize;
/// <summary>
/// 포맷
/// </summary>
/// <remarks>
/// 4바이트 : 빅 엔디안
/// 파일 형식을 나타낸다.
/// WAVE 파일의 경우 'WAVE' 문자를 저장한다.
/// </remarks>
public string Format;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - WAVERIFF()
/// <summary>
/// 생성자
/// </summary>
public WAVERIFF()
{
ChunkID = "RIFF";
ChunkSize = 0;
Format = "WAVE";
}
#endregion
}
}
반응형
▶ WAVEFMT.cs
namespace TestProject
{
/// <summary>
/// WAVE FMT
/// </summary>
public class WAVEFMT
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 청크 ID
/// </summary>
/// <remarks>
/// 4바이트 : 빅 엔디안
/// 'fmt '라는 문자를 저장한다.
/// </remarks>
public string ChunkID;
/// <summary>
/// 청크 크기
/// </summary>
/// <remarks>
/// 4바이트 : 리틀 엔디안
/// ChunkSize 항목 이후 항목들의 크기를 저장한다.
/// 고정 값 16을 저장한다.
/// </remarks>
public uint ChunkSize;
/// <summary>
/// 오디오 포맷
/// </summary>
/// <remarks>
/// 2바이트 : 리틀 엔디안
/// PCM의 경우 1을 저장한다.
/// </remarks>
public ushort AudioFormat;
/// <summary>
/// 채널 수
/// </summary>
/// <remarks>
/// 2바이트 : 리틀 엔디안
/// 모노 : 1, [data][data][data]...
/// 스테레오 : 2, [left][right]...
/// 3 채널 : 3, [left][right][center]...
/// 쿼드 : 4, [front left][front right][rear left][rear right]...
/// 4 채널 : 5, [left][center][right][surround]...
/// 6 채널 : 6, [left center][left][center][right center][right][surround]...
/// </remarks>
public ushort ChannelCount;
/// <summary>
/// 초당 샘플 수
/// </summary>
/// <remarks>
/// 4바이트 : 리틀 엔디안
/// </remarks>
public uint SampleCountPerSecond;
/// <summary>
/// 초당 평균 바이트 수
/// </summary>
/// <remarks>
/// 4바이트 : 리틀 엔디안
/// </remarks>
public uint AverageByteCountPerSecond;
/// <summary>
/// 블럭 정렬
/// </summary>
/// <remarks>
/// 2바이트 : 리틀 엔디안
/// 샘플 프레임 크기
/// 모노 : 샘플 크기 * 1
/// 스테렝 : 샘플 크기 * 2
/// </remarks>
public ushort BlockAlignment;
/// <summary>
/// 샘플당 비트 수
/// </summary>
/// <remarks>
/// 2바이트 : 리틀 엔디안
/// </remarks>
public ushort BitCountPerSample;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - WAVEFMT()
/// <summary>
/// 생성자
/// </summary>
public WAVEFMT()
{
ChunkID = "fmt ";
ChunkSize = 16;
AudioFormat = 1;
ChannelCount = 2;
SampleCountPerSecond = 44100;
BitCountPerSample = 16;
BlockAlignment = (ushort)(ChannelCount * (BitCountPerSample / 8));
AverageByteCountPerSecond = SampleCountPerSecond * BlockAlignment;
}
#endregion
}
}
728x90
▶ WAVEDATA.cs
namespace TestProject
{
/// <summary>
/// WAVE 데이터
/// </summary>
public class WAVEDATA
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 청크 ID
/// </summary>
/// <remarks>
/// 4바이트 : 빅 엔디안
/// 'data' 문자를 저장한다.
/// </remarks>
public string ChunkID;
/// <summary>
/// 청크 크기
/// </summary>
/// <remarks>
/// 4바이트 : 리틀 엔디안
/// </remarks>
public uint ChunkSize;
/// <summary>
/// 값 배열
/// </summary>
public short[] ValueArray;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - WAVEDATA()
/// <summary>
/// 생성자
/// </summary>
public WAVEDATA()
{
ChunkID = "data";
ChunkSize = 0;
ValueArray = new short[0];
}
#endregion
}
}
300x250
▶ WaveGenerator.cs
using System;
using System.IO;
namespace TestProject
{
/// <summary>
/// WAVE 제너레이터
/// </summary>
public class WaveGenerator
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 헤더
/// </summary>
private WAVERIFF header;
/// <summary>
/// 포맷
/// </summary>
private WAVEFMT format;
/// <summary>
/// 데이터
/// </summary>
private WAVEDATA data;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - WaveGenerator()
/// <summary>
/// 생성자
/// </summary>
public WaveGenerator()
{
this.header = new WAVERIFF();
this.format = new WAVEFMT();
this.data = new WAVEDATA();
uint sampleCount = this.format.SampleCountPerSecond * this.format.ChannelCount;
this.data.ValueArray = new short[sampleCount];
int amplitude = 32760; // 16비트 오디오용 최대 진폭
double frequency = 440.0d; // Concert A : 440Hz
double tone = (Math.PI * 2 * frequency) / sampleCount;
for(uint i = 0; i < sampleCount - 1; i++)
{
for(int channel = 0; channel < this.format.ChannelCount; channel++)
{
this.data.ValueArray[i + channel] = Convert.ToInt16(amplitude * Math.Sin(tone * i));
}
}
this.data.ChunkSize = (uint)(this.data.ValueArray.Length * (this.format.BitCountPerSample / 8));
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 저장하기 - Save(filePath)
/// <summary>
/// 저장하기
/// </summary>
/// <param name="filePath">파일 경로</param>
public void Save(string filePath)
{
FileStream stream = new FileStream(filePath, FileMode.Create);
BinaryWriter writer = new BinaryWriter(stream);
// RIFF
writer.Write(header.ChunkID.ToCharArray());
writer.Write(header.ChunkSize);
writer.Write(header.Format.ToCharArray());
// FMT
writer.Write(format.ChunkID.ToCharArray());
writer.Write(format.ChunkSize);
writer.Write(format.AudioFormat);
writer.Write(format.ChannelCount);
writer.Write(format.SampleCountPerSecond);
writer.Write(format.AverageByteCountPerSecond);
writer.Write(format.BlockAlignment);
writer.Write(format.BitCountPerSample);
// DATA
writer.Write(data.ChunkID.ToCharArray());
writer.Write(data.ChunkSize);
foreach(short value in data.ValueArray)
{
writer.Write(value);
}
writer.Seek(4, SeekOrigin.Begin);
uint filesize = (uint)writer.BaseStream.Length;
writer.Write(filesize - 8);
writer.Close();
stream.Close();
}
#endregion
}
}
▶ Program.cs
namespace TestProject
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
WaveGenerator generator = new WaveGenerator();
generator.Save("d:\\test.wav");
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] 파일 저장소 사용하기 (0) | 2022.01.02 |
---|---|
[C#/COMMON] Stream 클래스 : 스트림 복사하기 (0) | 2022.01.01 |
[C#/COMMON] 누겟 설치 : System.Management (0) | 2021.12.26 |
[C#/COMMON] ManagementObjectSearcher 클래스 : 오디오 장치 열거하기 (0) | 2021.12.26 |
[C#/COMMON] 누겟 설치 : FftSharp (0) | 2021.12.17 |
[C#/COMMON] WAV 파일 생성하기 (0) | 2021.12.08 |
[C#/COMMON] 누겟 설치 : PdfSharp (0) | 2021.11.29 |
[C#/COMMON] 누겟 설치 : CookComputing.XmlRPCv2 (0) | 2021.11.29 |
[C#/COMMON] 닷넷 프레임워크 소스 코드에서 닷넷 프레임워크 버전 일괄 변경하기 (0) | 2021.11.29 |
[C#/COMMON] Internet Explorer의 브라우저 에뮬레이션 모드 설정하기 (0) | 2021.11.23 |
[C#/COMMON] Process 클래스 : CloseMainWindow/Kill 메소드를 사용해 아웃룩 프로세스 제거하기 (0) | 2021.11.23 |
댓글을 달아 주세요