Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

fft-visual

손수 구현한 FFT(Fast Fourier Transform)로 합성 사운드를 분석하고, 그 결과를 떠다니는 사각형으로 시각화하는 작은 파이썬 프로그램입니다. 실행하면 잔잔한 앰비언트 패드 + 실로폰 같은 소리가 흘러나오면서 1000×1000 창에 색깔 사각형들이 나타났다 사라집니다.


0. 파이썬을 처음 써본다면

이 섹션은 파이썬을 한 번도 안 깔아본 분을 위한 안내다. 이미 해보셨다면 1. 다운로드부터 봐도 된다.

0-1. 파이썬 설치 (Windows 기준)

  1. https://www.python.org/downloads/ 에서 Download Python 3.x.x 버튼을 눌러 설치 파일을 받습니다.
  2. 설치 파일을 실행하면 첫 화면에 체크박스 두 개가 있는데, 반드시 "Add python.exe to PATH"에 체크해야 한다. 안 하면 나중에 명령어가 안 먹힌다.
  3. "Install Now" 클릭 → 끝나면 닫기.
  4. 설치가 잘 됐는지 확인:
    • Windows 키 누르고 cmd 입력 → 검은 창(명령 프롬프트)이 뜸.
    • 거기에 다음을 치고 Enter:
      python --version
      
    • Python 3.10.x 같은 게 나오면 성공.

0-2. 명령 프롬프트(터미널) 기본

이 프로젝트는 그래픽 설치 마법사 같은 건 없고, 검은 창에 명령어를 치는 방식으로 진행합니다. 알아둬야 할 것:

  • 현재 폴더 보기: cd (그냥 입력하면 현재 위치 표시)
  • 폴더 이동: cd 폴더경로 예: cd c:\git\fft-visual
  • 폴더 안 파일 목록: dir

1. 프로젝트 다운로드

이 저장소를 받아서 원하는 위치에 둔다. 예를 들어 c:\git\fft-visual 에 있다고 가정한다.

명령 프롬프트를 열고 그 폴더로 이동:

cd c:\git\fft-visual

dir을 쳐서 main.py, app_state.py, sound_draw.py 파일이 보이면 제대로 들어온 것이다.


2. 가상환경(venv) 만들기

가상환경은 "이 프로젝트 전용 파이썬 패키지 보관함"이라고 생각하면 된다. 다른 프로젝트랑 안 섞이게 해주는 도구다.

python -m venv venv

이 명령을 치면 폴더 안에 venv\ 라는 디렉터리가 생긴다. 잠시 시간이 걸린다.

이제 가상환경을 활성화합니다:

venv\Scripts\activate

성공하면 명령 프롬프트의 줄 맨 앞에 (venv) 라고 붙는다. 이게 보여야 다음 단계가 의미가 있다.

매번 새 터미널을 열 때마다 venv\Scripts\activate를 다시 쳐줘야 한다.


3. 필요한 패키지 설치

가상환경이 활성화된 상태((venv) 표시)에서:

pip install -r requirements.txt

requirements.txt 안에 적힌 세 개의 패키지를 받아온다 (인터넷 연결 필요):

  • numpy: 숫자 계산용 (FFT 행렬 연산)
  • pygame: 화면에 그림 그리기
  • pyaudio: 스피커로 소리 출력

pyaudio 설치가 실패한다면 Windows 사용자는 보통 pip install pipwinpipwin install pyaudio로 해결된다. 또는 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio 에서 본인 파이썬 버전에 맞는 .whl 파일을 받아 pip install 파일이름.whl로 설치한다.


4. 실행

같은 터미널에서:

python main.py

이렇게 표시된다:

Enter execution time (sec, 0-600):

원하는 실행 시간(초)을 입력하고 Enter를 누른다. 예를 들어 30을 치면 30초간 돌아간다. 그냥 Enter만 치면 기본 30초.

곧 1000×1000 크기의 검은 창이 열리고 스피커에서 소리가 나오면서 사각형들이 나타난다.

중간에 끄려면:

  • 창 닫기 버튼 클릭
  • 또는 키보드 ESC

5. 다음 번에 다시 실행할 때

설치는 한 번만 하면 된다. 두 번째부터는:

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 결과(주파수별 세기)를 받아 어떤 사각형을 그릴지 결정하는 함수.

어떻게 작동하나 (개념)

  1. DreamPad가 1초당 48000개의 숫자(샘플)를 만든다 → 이 숫자들이 시간에 따라 위/아래로 흔들리면 스피커가 그걸 진동으로 바꿔서 소리가 된다.
  2. 만든 샘플들은 링 버퍼(원형 큐)에 쌓인다. 한쪽에선 스피커가 꺼내 가고, 한쪽에선 시각화 코드가 들여다본다.
  3. 시각화 코드는 최근 4096개 샘플을 가져와 FFT를 돌린다. FFT는 "이 신호 안에 어떤 주파수가 얼마나 들어있나"를 알려주는 마법의 수학.
  4. 가장 강한 주파수 몇 개를 골라 그 강도에 비례하는 크기와 색의 사각형을 만들고 화면 어딘가에 띄운다.
  5. 사각형은 작은 속도로 떠다니다가 천천히 투명해지면서 사라진다.

조절해보기

코드를 열어서 다음 숫자들을 바꿔보면 분위기가 달라진다. 모두 main.py 또는 sound_draw.py 위쪽에 있다.

사운드 (main.py의 DreamPad 클래스)

변수 효과
VOICE_FREQS 패드 음높이. 숫자를 키우면 음이 높아짐
MALLET_SCALE 실로폰 음계
MALLET_GAIN 실로폰 음량 (0이면 안 나옴)
MALLET_DECAY_S 실로폰 한 음의 길이 (초)
DELAY_FEEDBACK, DELAY_WET 공간감 (리버브 비슷)
ATTACK_SEC 시작할 때 페이드인 길이

시각 (main.py의 visual_loop 함수, sound_draw.py의 gen_rects)

변수 효과
spawn_every 사각형이 생기는 빈도 (작을수록 자주)
alpha_decay 사각형이 사라지는 속도 (1에 가까울수록 오래 남음)
K (gen_rects 안) 한 번에 생기는 사각형 개수
vx, vy 범위 사각형이 떠다니는 속도
_PALETTE (sound_draw.py 위쪽) 사각형 색상 목록

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages