손수 구현한 FFT(Fast Fourier Transform)로 합성 사운드를 분석하고, 그 결과를 떠다니는 사각형으로 시각화하는 작은 파이썬 프로그램입니다. 실행하면 잔잔한 앰비언트 패드 + 실로폰 같은 소리가 흘러나오면서 1000×1000 창에 색깔 사각형들이 나타났다 사라집니다.
이 섹션은 파이썬을 한 번도 안 깔아본 분을 위한 안내다. 이미 해보셨다면 1. 다운로드부터 봐도 된다.
- https://www.python.org/downloads/ 에서 Download Python 3.x.x 버튼을 눌러 설치 파일을 받습니다.
- 설치 파일을 실행하면 첫 화면에 체크박스 두 개가 있는데, 반드시 "Add python.exe to PATH"에 체크해야 한다. 안 하면 나중에 명령어가 안 먹힌다.
- "Install Now" 클릭 → 끝나면 닫기.
- 설치가 잘 됐는지 확인:
- Windows 키 누르고
cmd입력 → 검은 창(명령 프롬프트)이 뜸. - 거기에 다음을 치고 Enter:
python --version Python 3.10.x같은 게 나오면 성공.
- Windows 키 누르고
이 프로젝트는 그래픽 설치 마법사 같은 건 없고, 검은 창에 명령어를 치는 방식으로 진행합니다. 알아둬야 할 것:
- 현재 폴더 보기:
cd(그냥 입력하면 현재 위치 표시) - 폴더 이동:
cd 폴더경로예:cd c:\git\fft-visual - 폴더 안 파일 목록:
dir
이 저장소를 받아서 원하는 위치에 둔다. 예를 들어 c:\git\fft-visual 에 있다고 가정한다.
명령 프롬프트를 열고 그 폴더로 이동:
cd c:\git\fft-visualdir을 쳐서 main.py, app_state.py, sound_draw.py 파일이 보이면 제대로 들어온 것이다.
가상환경은 "이 프로젝트 전용 파이썬 패키지 보관함"이라고 생각하면 된다. 다른 프로젝트랑 안 섞이게 해주는 도구다.
python -m venv venv이 명령을 치면 폴더 안에 venv\ 라는 디렉터리가 생긴다. 잠시 시간이 걸린다.
이제 가상환경을 활성화합니다:
venv\Scripts\activate성공하면 명령 프롬프트의 줄 맨 앞에 (venv) 라고 붙는다. 이게 보여야 다음 단계가 의미가 있다.
매번 새 터미널을 열 때마다
venv\Scripts\activate를 다시 쳐줘야 한다.
가상환경이 활성화된 상태((venv) 표시)에서:
pip install -r requirements.txtrequirements.txt 안에 적힌 세 개의 패키지를 받아온다 (인터넷 연결 필요):
- numpy: 숫자 계산용 (FFT 행렬 연산)
- pygame: 화면에 그림 그리기
- pyaudio: 스피커로 소리 출력
pyaudio 설치가 실패한다면 Windows 사용자는 보통
pip install pipwin후pipwin install pyaudio로 해결된다. 또는 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio 에서 본인 파이썬 버전에 맞는.whl파일을 받아pip install 파일이름.whl로 설치한다.
같은 터미널에서:
python main.py이렇게 표시된다:
Enter execution time (sec, 0-600):
원하는 실행 시간(초)을 입력하고 Enter를 누른다. 예를 들어 30을 치면 30초간 돌아간다. 그냥 Enter만 치면 기본 30초.
곧 1000×1000 크기의 검은 창이 열리고 스피커에서 소리가 나오면서 사각형들이 나타난다.
중간에 끄려면:
- 창 닫기 버튼 클릭
- 또는 키보드 ESC
설치는 한 번만 하면 된다. 두 번째부터는:
cd c:\git\fft-visual
venv\Scripts\activate
python main.py이 세 줄만 치면 끝.
| 증상 | 원인 / 해결 |
|---|---|
'python'은(는) 내부 또는 외부 명령... 아닙니다 |
파이썬 설치 시 PATH 체크 안 함. 파이썬 다시 설치하면서 "Add python.exe to PATH" 켜기 |
'venv\Scripts\activate'을(를) 찾을 수 없습니다 |
현재 폴더가 프로젝트 폴더가 아님. cd 로 다시 이동 |
ModuleNotFoundError: No module named 'numpy' |
venv 활성화 안 됨. (venv) 표시 확인 후 pip install 다시 |
| 사운드가 안 나옴 | pyaudio 설치 실패 또는 시스템 기본 출력 장치 문제. Windows 사운드 설정에서 출력 장치 확인 |
| 창은 떴는데 사각형이 안 보임 | 처음 5초는 페이드인 구간이라 거의 안 들리고 안 보일 수 있음. 잠시 기다려보기 |
fft-visual/
├── main.py # 진입점 — 신스, 스레드, 메인 루프
├── app_state.py # 스레드 간 공유 상태 (링버퍼, 픽셀 버퍼)
├── sound_draw.py # 직접 구현한 FFT + 사각형 생성 함수
├── requirements.txt # 설치할 패키지 목록
├── README.md # 이 파일
└── venv/ # 가상환경 (직접 만질 일 없음)
각 파일의 역할:
- main.py: 프로그램이 시작되는 곳. 사용자 입력을 받고, 사운드를 만드는
DreamPad클래스, 화면을 그리는visual_loop, 그리고 이들을 묶는 메인 루프가 있다. - app_state.py: 여러 스레드(소리 만드는 스레드, 화면 그리는 스레드, 스피커 출력 콜백)가 동시에 접근하는 데이터를 안전하게 보관하는 클래스. 락(lock)으로 충돌 방지.
- sound_draw.py: 푸리에 변환(FFT)을 numpy의 내장 함수 안 쓰고 직접 구현한 것 + FFT 결과(주파수별 세기)를 받아 어떤 사각형을 그릴지 결정하는 함수.
DreamPad가 1초당 48000개의 숫자(샘플)를 만든다 → 이 숫자들이 시간에 따라 위/아래로 흔들리면 스피커가 그걸 진동으로 바꿔서 소리가 된다.- 만든 샘플들은 링 버퍼(원형 큐)에 쌓인다. 한쪽에선 스피커가 꺼내 가고, 한쪽에선 시각화 코드가 들여다본다.
- 시각화 코드는 최근 4096개 샘플을 가져와 FFT를 돌린다. FFT는 "이 신호 안에 어떤 주파수가 얼마나 들어있나"를 알려주는 마법의 수학.
- 가장 강한 주파수 몇 개를 골라 그 강도에 비례하는 크기와 색의 사각형을 만들고 화면 어딘가에 띄운다.
- 사각형은 작은 속도로 떠다니다가 천천히 투명해지면서 사라진다.
코드를 열어서 다음 숫자들을 바꿔보면 분위기가 달라진다. 모두 main.py 또는 sound_draw.py 위쪽에 있다.
| 변수 | 효과 |
|---|---|
VOICE_FREQS |
패드 음높이. 숫자를 키우면 음이 높아짐 |
MALLET_SCALE |
실로폰 음계 |
MALLET_GAIN |
실로폰 음량 (0이면 안 나옴) |
MALLET_DECAY_S |
실로폰 한 음의 길이 (초) |
DELAY_FEEDBACK, DELAY_WET |
공간감 (리버브 비슷) |
ATTACK_SEC |
시작할 때 페이드인 길이 |
| 변수 | 효과 |
|---|---|
spawn_every |
사각형이 생기는 빈도 (작을수록 자주) |
alpha_decay |
사각형이 사라지는 속도 (1에 가까울수록 오래 남음) |
K (gen_rects 안) |
한 번에 생기는 사각형 개수 |
vx, vy 범위 |
사각형이 떠다니는 속도 |
_PALETTE (sound_draw.py 위쪽) |
사각형 색상 목록 |