From 90df10e14189d445fb3b3419f1a28c8bde3bb891 Mon Sep 17 00:00:00 2001 From: adrien Date: Sat, 31 Aug 2024 01:37:27 +0200 Subject: [PATCH] Play Him Off, Keyboard Cat --- app.js | 120 ++++++++++++++++++++++++++++------------------------- midi/1.mid | Bin 2762 -> 811 bytes 2 files changed, 64 insertions(+), 56 deletions(-) diff --git a/app.js b/app.js index df1ff00..0a564f1 100644 --- a/app.js +++ b/app.js @@ -409,16 +409,6 @@ midiSelect.oninput = () => { window.localStorage.midiKeyboard = midiKeyboard } -function onMIDIMessage(event) { - let [code, note, velocity] = event.data - - if (144 <= code && code <= 159 && cannonSprites[note]) { - cannonSprites[note].shooting = true - } else if (128 <= code && code <= 143 && cannonSprites[note]) { - cannonSprites[note].shooting = false - } -} - volRange.oninput = function(event) { volume.gain.linearRampToValueAtTime(volRange.value, audioCtx.currentTime) } @@ -486,6 +476,39 @@ function resume() { Tone.Transport.start() } +document.onkeydown = function(event) { + if (playing && keyMap.includes(event.key)) { + event.preventDefault() + let note = FIRST_NOTE + keyMap.indexOf(event.key) + shoot(note) + } +} + +document.onkeyup = function(event) { + if (playing && keyMap.includes(event.key)) { + event.preventDefault() + let note = FIRST_NOTE + keyMap.indexOf(event.key) + stopShoot(note) + } +} + +function onMIDIMessage(event) { + let [code, note, velocity] = event.data + if (144 <= code && code <= 159 && cannonSprites[note]) { + shoot(note) + } else if (128 <= code && code <= 143 && cannonSprites[note]) { + stopShoot(note) + } +} + +function shoot(note) { + cannonSprites[note].shooting = true +} + +function stopShoot(note) { + cannonSprites[note].shooting = false +} + function update(time) { noteSprites.filter(noteSprite => !noteSprite.shot).forEach(noteSprite => { noteSprite.y += STEP @@ -508,10 +531,11 @@ function update(time) { cannonSprites.filter(cannonSprite => cannonSprite.shooting).forEach(cannonSprite => { let noteSprite = noteSprites.find(noteSprite => noteSprite.note == cannonSprite.note) + cannonSprite.impactY = noteSprite?.y || 0 if (noteSprite) { + cannonSprite.impactY = noteSprite.y if (!noteSprite.shot) { playNote(noteSprite.note, noteSprite.velocity, noteSprite.duration, time) - cannonSprite.impactY = noteSprite.y noteSprite.shot = true window.setTimeout(() => { noteSprites.remove(noteSprite) @@ -526,39 +550,6 @@ function update(time) { }) } -function victory(time) { - canvas.classList = "victory" - victoryDialog.showModal() -} - -function gameOver(time) { - playing = false - - cannonSprites.forEach(cannonSprite => { - let explosionSprite = cannonSprite.explose() - explosionSprites.push(explosionSprite) - explosionSprite.play().then(() => explosionSprites.remove(explosionSprite)) - }) - - noteSprites.forEach(noteSprite => { - let explosionSprite = noteSprite.explose() - explosionSprites.push(explosionSprite) - explosionSprite.play().then(() => explosionSprites.remove(explosionSprite)) - }) - noteSprites = [] - playNoise(0.7, 400, 2, time) - - Tone.Transport.clear(updateTaskId) - Tone.Transport.scheduleOnce((time) => { - Tone.Transport.stop(time) - }, time + 0.1) - gameOverDialog.showModal() -} - -victoryDialog.onclose = gameOverDialog.onclose = function() { - document.location = "" -} - function playNote(note, velocity=0.7, duration=0, time=0) { if(oscillators[note]) return @@ -617,18 +608,35 @@ function playNoise(startGain=0.5, bandHz=1000, duration, time) { noise.stop(time + duration) } -document.onkeydown = function(event) { - if (playing && keyMap.includes(event.key)) { - event.preventDefault() - let note = FIRST_NOTE + keyMap.indexOf(event.key) - cannonSprites[note].shooting = true - } +function victory(time) { + canvas.classList = "victory" + victoryDialog.showModal() } -document.onkeyup = function(event) { - if (playing && keyMap.includes(event.key)) { - event.preventDefault() - let note = FIRST_NOTE + keyMap.indexOf(event.key) - cannonSprites[note].shooting = false - } +function gameOver(time) { + playing = false + + cannonSprites.forEach(cannonSprite => { + let explosionSprite = cannonSprite.explose() + explosionSprites.push(explosionSprite) + explosionSprite.play().then(() => explosionSprites.remove(explosionSprite)) + }) + + noteSprites.forEach(noteSprite => { + let explosionSprite = noteSprite.explose() + explosionSprites.push(explosionSprite) + explosionSprite.play().then(() => explosionSprites.remove(explosionSprite)) + }) + noteSprites = [] + playNoise(0.7, 400, 2, time) + + Tone.Transport.clear(updateTaskId) + Tone.Transport.scheduleOnce((time) => { + Tone.Transport.stop(time) + }, time + 0.1) + gameOverDialog.showModal() +} + +victoryDialog.onclose = gameOverDialog.onclose = function() { + document.location = "" } \ No newline at end of file diff --git a/midi/1.mid b/midi/1.mid index dedc7a40d237e38edc3ba1dd634ddb29b71353bd..84cdb04191d08cf40cd6e8a57cc2f8ac59d76b8f 100644 GIT binary patch literal 811 zcmbV~&q~8U5XPrzv7)v&LA|)*MWHm{CDfJ>$ibo%s}xbhL;h^rV3X7|5_77hH%~qI zAbkWM#Wz`JuxvvQMa=2j*>Ap``H@zq?*hOEr@?o<2e3584AOWlhg#*WGS~ zUGdZot;l7j6@yTY&2X4TUauds6X%q@;m4MxW;k$p1fsZWM%;?I%j}fhh9lm?1RmhU zVLy(C=c<|{Ni~ue{_Dtds!r&uAa3&8FLMz0g@UrT2||V6*_0G#J8FAY5LVcl5x)TD zTLwG<6kT`(SUrme1s9#;?i{z@0e1|1470}B^y0k%`!j=tfx;wVW-A%b#70jUJt$0= z2Ftb@wbigK<6b1nO2#vB@YNEwqcC9VFWWQ<(lDq_qK-l*p=T=@5BAqFNT(p3f@GUC zX>_NdX(7QiXaFQEZ+dvWQzI7bLE*i;ncbOhX1a%Z8aoy0Er&xyM-3uGtsw4sDl4ie`kbJnGm3^i zx<~YYsCSL+!X@hFRC~3VqmU>CRtiSRvXV7Ql$EGalIp;Nea8ux4pPk|ecBc8q-s^6 zX{bNLZLb;JP6SA;e;zkba7NXe8K0oKPlTt*f~Dtk3B_{hF==)u3k=J+2idM?d<+|5 ziruCRV1^aDlY^h_XD}zUlgWLv;76E+<*b1yK(>u9YD;b}+EAnqC)S4V$L8ePi}LN< z1-a1kO7}UeiS7~sUf2alZektffY+eRxx3VVwLmTUjO(y{*T7DF zz(xZgZi<~^L@9xa11SN>I=&pEE+G<%cqw76c(>tO-DZT_^!^pX>=$9D^W@N+orapj zH%~MtMYndsrQqAX4%awmC`|S-;)3C-{Uo;0M1ga48fmrKOk*jFFOCH>Ga}}oVPrtH zp{~oVb77hU{Tgjm>iijM6-bjv>L%xsrxio}MHhLXEJ>4d0vco&c}aeo_Zx`Nz9 z)ic8REtvF5(oL`tB+5k~of{)XfVgaOi<>g#^aDl{JGiA>q{jKpzND5w)(MFV!0Iob_;NOsev*tnaUJG;qu|FyfPo zQG)&J$EJ}u5SlCqdio*g>3_?>`+|*M{dDegj=B`AxPgZ)(OACi)-Z(^@XEA6Csf2y zVba3&)<2>%*4%hZ*fiNECO#|S(x`YMR-7{vyp*toB|w(!0}^=nv4lta=>+x4uYQA; zfcU{oP8nkADA*j=MR2X4s(-XJldvR=l4ets7%Tm}+e{Ev_!>CIEhG>rb*TLL`Cr3I zCAMNw?A