"wave" --- WAV 파일 읽고 쓰기
*****************************

**소스 코드:** Lib/wave.py

======================================================================

"wave" 모듈은 WAV 음향 형식에 편리한 인터페이스를 제공합니다. 압축/압
축 해제는 지원하지 않지만, 모노/스테레오를 지원합니다.

"wave" 모듈은 다음 함수와 예외를 정의합니다:

wave.open(file, mode=None)

   *file*이 문자열이면, 그 이름의 파일을 엽니다, 그렇지 않으면 파일류
   객체로 처리합니다. *mode*는 다음 중 하나일 수 있습니다:

   "'rb'"
      읽기 전용 모드.

   "'wb'"
      쓰기 전용 모드.

   WAV 파일의 읽기와 쓰기를 동시에 허락하지 않음에 유의하십시오.

   "'rb'" *mode*는 "Wave_read" 객체를 반환하고, "'wb'" *mode*는
   "Wave_write" 객체를 반환합니다. *mode*가 생략되고, 파일류 객체가
   *file*로 전달되면, "file.mode"가 *mode*의 기본값으로 사용됩니다.

   파일류 객체를 전달하면, "close()" 메서드가 호출될 때 wave 객체는 그
   파일을 닫지 않습니다. 파일 객체를 닫는 것은 호출자의 책임입니다.

   "open()" 함수는 "with" 문과 함께 사용할 수 있습니다. "with" 블록이
   완료될 때, "Wave_read.close()"나 "Wave_write.close()" 메서드가 호출
   됩니다.

   버전 3.4에서 변경: 위치 변경할 수 없는(unseekable) 파일에 대한 지원
   이 추가되었습니다.

wave.openfp(file, mode)

   "open()"의 동의어입니다. 이전 버전과의 호환성을 위해 유지됩니다.

   Deprecated since version 3.7, will be removed in version 3.9.

exception wave.Error

   WAV 명세를 위반하거나 구현 결함으로 인해 무언가가 불가능할 때 발생
   하는 에러.


Wave_read 객체
==============

"open()"이 반환하는, Wave_read 객체는 다음과 같은 메서드를 가지고 있습
니다:

Wave_read.close()

   스트림이 "wave"에 의해 열렸다면 스트림을 닫고, 인스턴스를 사용할 수
   없게 만듭니다. 이것은 객체가 가비지 수집될 때 자동으로 호출됩니다.

Wave_read.getnchannels()

   오디오 채널 수를 반환합니다 (모노는 "1", 스테레오는 "2").

Wave_read.getsampwidth()

   샘플 폭을 바이트 단위로 반환합니다.

Wave_read.getframerate()

   샘플링 빈도를 반환합니다.

Wave_read.getnframes()

   오디오 프레임의 수를 반환합니다.

Wave_read.getcomptype()

   압축 유형을 반환합니다 (지원되는 유형은 "'NONE'" 뿐입니다).

Wave_read.getcompname()

   "getcomptype()"의 사람이 읽을 수 있는 버전. 보통 "'not compressed'"
   이 "'NONE'"에 해당합니다.

Wave_read.getparams()

   "get*()" 메서드의 결과와 동등한, "namedtuple()" "(nchannels,
   sampwidth, framerate, nframes, comptype, compname)"를 반환합니다.

Wave_read.readframes(n)

   최대 *n* 프레임의 오디오를 "bytes" 객체로 읽고 반환합니다.

Wave_read.rewind()

   파일 포인터를 오디오 스트림의 시작 부분으로 되감습니다.

다음의 두 메서드는 "aifc" 모듈과의 호환성을 위해 정의되었으며, 흥미로
운 작업을 수행하지 않습니다.

Wave_read.getmarkers()

   "None"을 반환합니다.

Wave_read.getmark(id)

   에러를 발생시킵니다.

다음의 두 메서드는 이들 사이에서 호환 가능한 용어 "위치(position)"를
정의하며, 그 외에는 구현에 따라 다릅니다.

Wave_read.setpos(pos)

   파일 포인터를 지정된 위치로 설정합니다.

Wave_read.tell()

   현재 파일 포인터 위치를 반환합니다.


Wave_write 객체
===============

위치 변경할 수 있는(seekable) 출력 스트림의 경우, 실제로 기록된 프레임
수를 반영하도록 "wave" 헤더가 자동으로 갱신됩니다. 위치 변경할 수 없는
(unseekable) 스트림의 경우, 첫 번째 프레임 데이터를 쓸 때, *nframes*
값이 정확해야 합니다. 정확한 *nframes* 값을 실현하려면 "close()"가 호
출되기 전에 기록될 프레임 수로 "setnframes()"나 "setparams()"를 호출한
다음, "writeframesraw()"를 사용하여 프레임 데이터를 쓰거나, 기록할 모
든 프레임 데이터로 "writeframes()"를 호출할 수 있습니다. 후자의 경우
"writeframes()"는 데이터의 프레임 수를 계산하고 프레임 데이터를 기록하
기 전에 적절한 *nframes*를 설정합니다.

"open()"에 의해 반환된, Wave_write 객체에는 다음과 같은 메서드가 있습
니다:

버전 3.4에서 변경: 위치 변경할 수 없는(unseekable) 파일에 대한 지원이
추가되었습니다.

Wave_write.close()

   *nframes*를 올바르게 만들고, 파일이 "wave"로 열렸으면 파일을 닫습니
   다. 이 메서드는 객체가 가비지 수집될 때 호출됩니다. 출력 스트림이
   위치 변경할 수 없고 *nframes*가 실제로 기록된 프레임 수와 일치하지
   않으면 예외를 일으킵니다.

Wave_write.setnchannels(n)

   채널 수를 설정합니다.

Wave_write.setsampwidth(n)

   샘플 폭을 *n* 바이트로 설정합니다.

Wave_write.setframerate(n)

   프레임 속도를 *n*으로 설정합니다.

   버전 3.2에서 변경: 이 메서드에 대한 비 정수 입력은 가장 가까운 정수
   로 자리 올림 됩니다.

Wave_write.setnframes(n)

   프레임 수를 *n*으로 설정합니다. 실제로 쓴 프레임 수가 다르면 나중에
   변경됩니다 (이 변경 시도는 출력 스트림이 위치 변경할 수 없으면 에러
   를 발생시킵니다).

Wave_write.setcomptype(type, name)

   압축 유형과 설명을 설정합니다. 현재, 압축 유형 "NONE" 만 지원됩니다
   . 즉, 압축하지 않습니다.

Wave_write.setparams(tuple)

   *tuple*은 "(nchannels, sampwidth, framerate, nframes, comptype,
   compname)"이어야 하며, "set*()" 메서드에 유효한 값이어야 합니다. 모
   든 파라미터를 설정합니다.

Wave_write.tell()

   파일의 현재 위치를 반환하는데, "Wave_read.tell()" 과
   "Wave_read.setpos()" 메서드와 같은 면책 조항이 적용됩니다.

Wave_write.writeframesraw(data)

   *nframes*를 수정하지 않고 오디오 프레임을 씁니다.

   버전 3.4에서 변경: 이제 모든 *바이트열류 객체*가 허락됩니다.

Wave_write.writeframes(data)

   오디오 프레임을 기록하고 *nframes*를 올바르게 만듭니다. 출력 스트림
   이 위치 변경할 수 없고 *data*를 기록한 후에 기록된 총 프레임 수가
   *nframes*에 대해 이전에 설정된 값과 일치하지 않으면 에러가 발생시킵
   니다.

   버전 3.4에서 변경: 이제 모든 *바이트열류 객체*가 허락됩니다.

"writeframes()"나 "writeframesraw()"를 호출한 후 파라미터를 설정하는
것이 유효하지 않고, 이를 시도하면 "wave.Error"가 발생함에 유의하십시오
.
