Polyphonic Synthesizer
마우스 클릭 또는 키보드로 연주하는 2옥타브 폴리포닉 신시사이저.
keyboard — C3 to B4
C3a
D3s
E3d
F3f
G3g
A3h
B3j
C4k
D4l
E4;
w
e
t
y
u
o
p
예제 악보
keyboard shortcuts
white: a s d f g h j k l ; black: w e t y u o p
waveform
attack — 20 ms
0 ms500 ms
release — 300 ms
50 ms2000 ms
master volume — 70%
delay effect
이 실험에 대해
각 음표마다 독립적인 OscillatorNode를 생성해 동시에 여러 음을 낼 수 있다(폴리포닉). 어택은 소리가 최대 볼륨에 도달하는 시간, 릴리즈는 키를 떼고 소리가 사라지는 시간이다. 딜레이는 DelayNode에 피드백 루프를 연결해 에코 효과를 만든다.
핵심 코드
// 폴리포닉: 음표마다 독립적인 osc + gain
function noteOn(freq: number) {
const osc = ctx.createOscillator()
const gain = ctx.createGain()
osc.type = waveType
osc.frequency.value = freq
// 어택 엔벨로프
const now = ctx.currentTime
gain.gain.setValueAtTime(0, now)
gain.gain.linearRampToValueAtTime(0.4, now + attack / 1000)
osc.connect(gain)
gain.connect(master)
osc.start()
}
// 릴리즈 엔벨로프
function noteOff(note: string) {
const now = ctx.currentTime
gain.gain.exponentialRampToValueAtTime(
0.0001, now + release / 1000
)
osc.stop(now + release / 1000 + 0.05)
}
// 딜레이 피드백 루프
delay.connect(feedback) // delay → feedback
feedback.connect(delay) // feedback → delay (루프)
delay.connect(master) // 딜레이 출력 → 마스터