코드로 배우는 음악 이론: 왜 12개의 음이 존재할까요

이미지도 숫자, 음성도 숫자로 표현되고 생성하는 시대이니 음성과 음악에 대한 기초를 배워두는 것도 좋은 것 같습니다.

쉬운 설명

악기를 전혀 다루지 못하는 사람이 음악 이론을 코드로 풀어낸 흥미로운 이야기입니다. 우리가 흔히 접하는 "이게 장조 음계니까 외우세요" 같은 주입식 설명 대신, 소리가 만들어지는 원리부터 하나씩 코드로 짜보면서 왜 음이 12개인지, 왜 특정 화음이 듣기 좋은지를 직접 확인해보는 방식이에요. 스피커가 공기를 밀고 당기는 아주 단순한 물리 현상에서 출발해, 숫자(진동수) 하나만 바꿔도 음악이 만들어지는 과정을 보여주는데요. 마치 요리 레시피를 무작정 외우기보다, 재료들이 왜 그렇게 반응하는지 과학적인 원리부터 이해하는 느낌과 비슷합니다.

요약

이 글의 핵심은 '소리는 결국 숫자'라는 기본 원리에서 출발합니다. 스피커는 진동판(콘)을 앞뒤로 움직여 소리를 만드는데, 컴퓨터 입장에서는 이 움직임을 1초에 44,100번 정도 기록한 숫자의 목록으로 다룰 뿐이에요. 오디오 파일은 이 숫자 목록을 저장해둔 것이고, 신디사이저는 그때그때 숫자를 계산해서 소리를 실시간으로 만들어내는 셈이죠.

글쓴이는 웹 브라우저의 Web Audio API를 활용해 가장 단순한 형태의 파형인 사인파를 440Hz로 재생하는 코드부터 시작합니다. 여기서 '440'이라는 숫자는 사람들이 '라(A)' 음으로 부르자고 약속한 진동수일 뿐, 그 자체로는 특별한 의미가 없다는 점을 짚어주는데요. 음악 이론을 '외워야 할 규칙'이 아니라 '물리와 수학에서 자연스럽게 도출되는 결과'로 바라보는 이 글의 시각을 잘 보여줍니다.

또 하나 눈길을 끄는 부분은 '왜 소리가 끝날 때 딸깍하는 소리가 나는가'를 설명하는 대목이에요. 오디오 파형이 중간에 갑자기 뚝 끊기면 스피커 진동판이 순간적으로 튕기면서 잡음이 생기는데, 이를 해결하려면 볼륨이 부드럽게 커졌다가 서서히 줄어드는 곡선인 '엔벨로프(envelope)'가 꼭 필요합니다. 이 개념은 신디사이저나 게임 효과음을 다뤄본 분들에게 친숙한 어택(attack, 소리가 커지는 구간)과 디케이(decay, 소리가 줄어드는 구간)로 자연스럽게 이어지죠. 이처럼 아주 기초적인 물리 현상부터 코드로 하나씩 확인하며 점차 음계와 화음으로 확장해 나가는 구성이 이 글의 매력입니다.

활용 포인트

개발자라면 이 글에서 소개하는 Web Audio API 코드를 웹 브라우저 콘솔 창에 바로 붙여넣어 직접 소리를 들어보실 수 있습니다. 사인파 진동수를 440에서 300, 500 등으로 바꿔보며 소리를 들어보면 '진동수가 곧 음높이'라는 개념을 직관적으로 이해할 수 있거든요. 이런 기초 지식은 웹 게임 효과음이나 알림음 생성기, 간단한 음악 웹 앱 같은 오디오 프로젝트를 만들 때 든든한 이론적 바탕이 됩니다. 기획자나 창작자 입장에서도 '왜 특정 사운드가 듣기 편한지'를 감이 아니라 명확한 원리로 이해할 수 있어, 사운드 디자이너나 개발팀과 소통할 때 훨씬 정확한 표현을 쓸 수 있어요.

음악 이론이 늘 암기 과목처럼 느껴졌던 분들에게도 이 접근법은 무척 유용합니다. 음계나 코드를 무작정 외우는 대신, 프로그래밍의 배열(array)과 숫자 계산으로 직접 만들어보면서 원리를 체득할 수 있으니까요. 덕분에 코딩 교육 자료나 과학·수학·음악을 아우르는 STEAM 융합 교육 콘텐츠를 기획하는 분들에게도 좋은 참고 자료가 됩니다. AI 도구를 활용해 이 글의 코드를 바탕으로 나만의 음계 생성기나 화음 진행 실험 도구를 만들어보는 것도 재미있는 실습이 될 거예요.

주의 사항

이 글은 전체 시리즈 중 도입부에 해당하는 내용만 다루고 있어서, 12개 음이 실제로 어떻게 유도되는지, 음계와 코드가 배열로 구체적으로 어떻게 구현되는지는 원문의 이어지는 내용을 함께 살펴보셔야 합니다. 또한 Web Audio API는 브라우저 종류에 따라 지원 방식이나 세부 동작에 조금씩 차이가 있을 수 있고, 코드 예제를 실행하려면 오디오 컨텍스트(AudioContext)를 미리 설정해야 한다는 점도 참고해 주세요. 음악 이론 자체가 무척 방대한 분야인 만큼, 음색의 차이나 복잡한 화성학의 예외 사례처럼 모든 음악적 요소를 물리와 수학만으로 완벽히 설명할 수는 없다는 점도 염두에 두시면 좋겠습니다.

자체 검증

원문을 꼼꼼히 확인한 결과, 소리가 공기압의 진동이라는 점, 스피커 진동판이 초당 44,100번 정도 위치를 바꾸며 소리를 낸다는 점, 440Hz가 약속에 의해 정해진 '라' 음의 기준이라는 설명은 모두 원문 내용과 일치합니다. 엔벨로프(어택-디케이 구조)를 통해 딸깍거리는 잡음을 해결하는 원리와, 어택을 늘리면 타격감 대신 소리가 서서히 커지는 '스웰링(swelling)' 효과가 난다는 부분도 원문 그대로 정확하게 담았습니다. 다만 원문 자료가 도입부까지만 제공되어, 12음계와 스케일, 코드, 화음 진행이 실제로 어떻게 코드로 도출되는지에 대한 세부 내용은 이번 자료에서 확인하지 못했음을 밝힙니다.

태그

#음악이론 #프로그래밍 #오디오프로그래밍 #WebAudioAPI #개발자학습 #AI #창작도구

원문

https://runjs.app/blog/music-theory-for-programmers

참고자료

MDN Web Docs - Web Audio API

MDN - OscillatorNode

MDN - GainNode (볼륨/엔벨로프 제어)

W3C Web Audio API 공식 명세

← 새정보 전체 보기