프로그래밍 언어/유용한코드

파이썬으로 사인파,사각파,삼각파,톱니파 음원 만들기

원원 2025. 9. 5. 23:48

안녕하세요. 파이썬으로 사인파, 사각파, 삼각파, 톱니파 음원을 만들어보겠습니다.

WAVE_TYPE에 원하는 파형을 입력하면 됩니다. ("sine" or "square" or "triangle" or "sawtooth")
WAV파일 파라미터에는 원하는 WAV파일 정보를 입력하면 됩니다.
파이썬을 실행시키면 아래와같은 wav파일이 소스코드가있는 디렉토리에 만들어집니다.
파일명은 <파형타입>_<주파수>Hz_<샘플레이트>Hz_<비트깊이>bit_<진폭(dBFS)>_<파일시간>sec.wav가 됩니다.

import numpy as np
import wave
import os

# === 파형 종류 선택 ===
# "sine", "square", "triangle", "sawtooth"
WAVE_TYPE = "square"

# WAV 파일 파라미터
sample_rate = 48000   # 48 kHz
duration = 10.0       # 11초
freq = 1000           # 1000 Hz
bit_depth = 16        # 비트 깊이 (샘플당 비트 수)

# === 진폭을 dBFS 단위로 지정 ===
# 예: "0dB", "-6dB", "-12dB"
amp_db = "0dB"

# 1) dB → 실제 amplitude 값 변환
max_val = 2**(bit_depth - 1) - 1  # 16-bit 최대치 32767
db_value = float(amp_db.replace("dB", ""))  # "–6dB" -> –6.0
amplitude = int(max_val * 10**(db_value / 20))

# 2) 시간축 생성
num_samples = int(sample_rate * duration)
t = np.linspace(0, duration, num_samples, endpoint=False)

# 3) 파형 생성
if WAVE_TYPE == "sine":
    wave_data = amplitude * np.sin(2 * np.pi * freq * t)
elif WAVE_TYPE == "square":
    wave_data = amplitude * np.sign(np.sin(2 * np.pi * freq * t))
elif WAVE_TYPE == "triangle":
    wave_data = (2 * amplitude / np.pi) * np.arcsin(np.sin(2 * np.pi * freq * t))
elif WAVE_TYPE == "sawtooth":
    wave_data = (2 * amplitude / np.pi) * np.arctan(np.tan(np.pi * freq * t))
else:
    raise ValueError("지원하지 않는 파형 타입입니다!")

wave_data = wave_data.astype(np.int16)

# 4) 스테레오 신호 변환
stereo_data = np.column_stack((wave_data, wave_data)).flatten()

# 5) 파일 이름 자동 생성
script_dir = os.path.dirname(os.path.abspath(__file__))
filename = os.path.join(
    script_dir,
    f"{WAVE_TYPE}_{freq}Hz_{sample_rate}Hz_{bit_depth}bit_{amp_db}_{int(duration)}sec.wav"
)

# 6) WAV 파일 저장
with wave.open(filename, 'w') as wf:
    wf.setnchannels(2)
    wf.setsampwidth(bit_depth // 8)
    wf.setframerate(sample_rate)
    wf.writeframes(stereo_data.tobytes())

print(f"WAV 파일 생성 완료: {filename}")