@@ -102,4 +102,55 @@ export function playMonch() { |
| 102 | 102 | |
| 103 | 103 | body.start(now) |
| 104 | 104 | body.stop(now + bodyLength) |
| 105 | + |
| 106 | + // Tonal body - soft pitched "chomp" character |
| 107 | + // Primary tone - warm mid frequency |
| 108 | + const tone1 = ctx.createOscillator() |
| 109 | + tone1.type = 'triangle' |
| 110 | + tone1.frequency.setValueAtTime(280, now) |
| 111 | + tone1.frequency.linearRampToValueAtTime(180, now + 0.08) |
| 112 | + |
| 113 | + const tone1Env = ctx.createGain() |
| 114 | + tone1Env.gain.setValueAtTime(0, now) |
| 115 | + tone1Env.gain.linearRampToValueAtTime(0.12, now + 0.015) // Soft attack |
| 116 | + tone1Env.gain.linearRampToValueAtTime(0.06, now + 0.05) |
| 117 | + tone1Env.gain.linearRampToValueAtTime(0, now + 0.1) |
| 118 | + |
| 119 | + tone1.connect(tone1Env) |
| 120 | + tone1Env.connect(highPass) |
| 121 | + tone1.start(now) |
| 122 | + tone1.stop(now + 0.12) |
| 123 | + |
| 124 | + // Secondary harmonic - adds richness |
| 125 | + const tone2 = ctx.createOscillator() |
| 126 | + tone2.type = 'sine' |
| 127 | + tone2.frequency.setValueAtTime(420, now) |
| 128 | + tone2.frequency.linearRampToValueAtTime(300, now + 0.06) |
| 129 | + |
| 130 | + const tone2Env = ctx.createGain() |
| 131 | + tone2Env.gain.setValueAtTime(0, now) |
| 132 | + tone2Env.gain.linearRampToValueAtTime(0.06, now + 0.01) |
| 133 | + tone2Env.gain.linearRampToValueAtTime(0, now + 0.07) |
| 134 | + |
| 135 | + tone2.connect(tone2Env) |
| 136 | + tone2Env.connect(highPass) |
| 137 | + tone2.start(now) |
| 138 | + tone2.stop(now + 0.1) |
| 139 | + |
| 140 | + // Soft low "gulp" undertone - filtered to be safe |
| 141 | + const gulp = ctx.createOscillator() |
| 142 | + gulp.type = 'sine' |
| 143 | + gulp.frequency.setValueAtTime(200, now + 0.02) |
| 144 | + gulp.frequency.linearRampToValueAtTime(160, now + 0.1) |
| 145 | + |
| 146 | + const gulpEnv = ctx.createGain() |
| 147 | + gulpEnv.gain.setValueAtTime(0, now) |
| 148 | + gulpEnv.gain.linearRampToValueAtTime(0, now + 0.02) // Delayed start |
| 149 | + gulpEnv.gain.linearRampToValueAtTime(0.08, now + 0.04) |
| 150 | + gulpEnv.gain.linearRampToValueAtTime(0, now + 0.12) |
| 151 | + |
| 152 | + gulp.connect(gulpEnv) |
| 153 | + gulpEnv.connect(highPass) |
| 154 | + gulp.start(now) |
| 155 | + gulp.stop(now + 0.15) |
| 105 | 156 | } |