WAV 음악파일 속도 변형
1. WAV 파일이란?
WAV(웨이브 오디오 포맷, Waveform audio format)은 마이크로소프트와 IBM의 오디오 파일 표준입니다.
덕분에 해당 포맷에 대해 상세하게 적혀있는 사이트들과 각종 pdf자료들이 존재합니다. 아래는 그중 한 사이트입니다.
http://soundfile.sapp.org/doc/WaveFormat/
아래는 WAV 파일에 대한 포맷 정보입니다.
WAV 파일은 크게 세 개의 영역으로 분류되는 것을 볼 수 있으며, Big Little dndian을 섞어 사용하는 것을 볼 수 있습니다.
Python에서 WAV 파일을 불러와 위의 포맷을 확인해보겠습니다.
단순히 샘플 파일을 하나 갖고 와서 위와 같이 열어보았습니다.
이를 위 사이트(http://soundfile.sapp.org/doc/WaveFormat/)에 나와있는 정보와 비교해보며 보겠습니다.
2. First Block - RIFF 영역 헤더
먼저 Little endian과 Big endian에 따라 hex값을 출력해주는 함수를 만들어주었습니다.
다음으로 위의 사이트에 나와있는 첫 번째 블록 정보를 보았습니다.
ChunkID : "RIFF"라는 문자를 ASCII로 갖고 있음. (big-endian기준 : 0x52494646)
ChunkSize : 전체 파일크기 중 ChunkID와 ChunkSize부분인 8Byte를 제외한 전체 크기를 말함
Format : "WAVE"라는 문자를 갖고 있음 (big-endian기준 : 0x57415645)
이번에는 파이썬에서 보겠습니다.
위와 같이 홈페이지에 나와있는 것과 동일한 ChunkID와 Format값을 갖고 있는 것을 볼 수 있으며, ChunkSize의 값을 10진수로 표시하고 8을 더해 전체 파일크기와 비교해보겠습니다.
보시는 것과 같이 동일한 파일크기를 갖는 것을 볼 수 있습니다.
3. Second Block - fmt 영역 헤더
다음은 두 번째 블록 정보입니다.
Subchunk1ID : "fmt "값을 갖고 있음. (big-endian기준 : 0x666d7420)
Subchunk1Size : Subchunk1의 크기
AudioFormat : PCM 방식이면 1
NumChannels : Mono = 1, Stereo = 2
SampleRate : 샘플링 주기
ByteRate : SampleRate * NumChannels * BPS/8
BlockAlign : NumChannels * BPS/8
BPS : 초당 비트 값
Extra Data
마찬가지로 파이썬에서 실제 데이터로 보겠습니다.
각각의 데이터는 Hex데이터임을 생각하시고 봐주세요.
위의 데이터를 보게 되면, 해당 음원(wav파일)은 아래와 같은 정보를 갖고 있습니다.
PCM 방식 파일 압축, 스테레오 음원, 샘플링 주기는 44100Hz(0xac44), BPS는 16bit
위 정보를 기반으로 음원 재생 프로그램은 노래를 재생하게 되는 중요한 정보입니다.
4. Last Block - data 영역
마지막 블록입니다.
Subchunk2ID : "Data"라는 값을 갖고 있음. (big-endian 기준 : 0x64617461)
Subchunk2Size : Subchunk2의 크기를 말합니다.
Data : 실제 음원 정보를 갖고 있는 데이터입니다.
Data 영역은 Little endian으로 구성되어있는 모습 그대로 표시한 것입니다.
이렇게 해서 일단 WAV 파일의 정보를 모두 확인해보았습니다.
다음장에서는 해당 데이터를 수정하여 음원을 변경하는 것을 보여드리겠습니다.