From 8d37f85defc1bfb102bd9d4a490098d7925dd5c9 Mon Sep 17 00:00:00 2001 From: adrien Date: Mon, 26 Aug 2024 22:34:20 +0200 Subject: [PATCH] change speed, add keynames --- app.js | 192 ++++++++++++++++++++++++++++--------------------- img/cannon.png | Bin 0 -> 19774 bytes img/canon.png | Bin 1130 -> 20000 bytes img/pipe.png | Bin 0 -> 1338 bytes midi/1.mid | Bin 2580 -> 2946 bytes 5 files changed, 112 insertions(+), 80 deletions(-) create mode 100644 img/cannon.png create mode 100644 img/pipe.png diff --git a/app.js b/app.js index cdb1850..5e91539 100644 --- a/app.js +++ b/app.js @@ -1,3 +1,24 @@ +const MAX_LEVEL = 3 +const DRAW_PERIOD = 0.04 // s +const UPDATE_PERIOD = 0.01 // s +const FLOOR = 400 // px +const FIRST_NOTE = 48 // C2 +const LAST_NOTE = 73 // C4 +const FREQUENCIES = [ + // C C♯ / D♭ D D♯ / E♭ E F F♯ / G♭ G G♯ / A♭ A A♯ / B♭ B + 16.35, 17.32, 18.35, 19.45, 20.6, 21.83, 23.12, 24.5, 25.96, 27.5, 29.14, 30.87, + 32.7, 34.65, 36.71, 38.89, 41.2, 43.65, 46.25, 49, 51.91, 55, 58.27, 61.74, + 65.41, 69.3, 73.42, 77.78, 82.41, 87.31, 92.5, 98, 103.83, 110, 116.54, 123.47, + 130.81, 138.59, 146.83, 155.56, 164.81, 174.61, 185, 196, 207.65, 220, 233.08, 246.94, + 261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392, 415.3, 440, 466.16, 493.88, + 523.25, 554.37, 587.33, 622.25, 659.26, 698.46, 739.99, 783.99, 830.61, 880, 932.33, 987.77, + 1046.5, 1108.73, 1174.66, 1244.51, 1318.51, 1396.91, 1479.98, 1567.98, 1661.22, 1760, 1864.66, 1975.53, + 2093, 2217.46, 2349.32, 2489.02, 2637.02, 2793.83, 2959.96, 3135.96, 3322.44, 3520, 3729.31, 3951.07, + 4186.01, 4434.92, 4698.64, 4978.03, 5274.04, 5587.65, 5919.91, 6271.93, 6644.88, 7040, 7458.62, 7902.13, +] +const NOTE_NAMES = ["C", "C♯", "D", "D♯", "E", "F", "F♯", "G", "G♯", "A", "A♯", "B"] + + Array.prototype.remove = function(item) { let index = this.indexOf(item) if (index == 0) { @@ -89,16 +110,18 @@ class Sprite { } -class Canon extends Sprite { +class Cannon extends Sprite { constructor(canvasCtx, note) { let sharp = [1, 3, 6, 8, 10].includes(note % 12) - super(canvasCtx, "canon.png", 34 * (note - FIRST_NOTE) + 66, sharp? 446:450, 11, 26, 4) + super(canvasCtx, "cannon.png", 34 * (note - FIRST_NOTE) + 66, sharp? 422:426, 11, 26, 4) this.note = note + this.key = keyMap[note - FIRST_NOTE].toUpperCase() this.impactHeight = 9 this.impactY = 0 this.sy = sharp? 0 : this.sHeight this.shooting = false this.df = 1 + this.pipeSprite = new Sprite(canvasCtx, "pipe.png", this.x-1, this.y+36, 16, 18) } draw() { @@ -109,6 +132,11 @@ class Canon extends Sprite { } else { if (this.frame > 0) this.frame-- } + this.pipeSprite.draw() + this.canvasCtx.fillStyle = "#d3d6cf" + this.canvasCtx.fillText(this.key, this.pipeSprite.x+2, this.pipeSprite.y+10) + this.canvasCtx.fillStyle = "#222327" + this.canvasCtx.fillText(this.key, this.pipeSprite.x, this.pipeSprite.y+8) super.draw() if (this.frame) { this.canvasCtx.drawImage(this.sprite, this.sWidth*(this.frame), 0, this.sWidth, 1, this.dx, this.impactY, 22, this.dy - this.impactY) @@ -202,23 +230,6 @@ class Whole extends Note { } -const MAX_LEVEL = 2 -const UPDATE_PERIOD = 10 //ms -const FIRST_NOTE = 48 -const LAST_NOTE = 73 -const FREQUENCIES = [ - // C C♯ / D♭ D D♯ / E♭ E F F♯ / G♭ G G♯ / A♭ A A♯ / B♭ B - 16.35, 17.32, 18.35, 19.45, 20.6, 21.83, 23.12, 24.5, 25.96, 27.5, 29.14, 30.87, - 32.7, 34.65, 36.71, 38.89, 41.2, 43.65, 46.25, 49, 51.91, 55, 58.27, 61.74, - 65.41, 69.3, 73.42, 77.78, 82.41, 87.31, 92.5, 98, 103.83, 110, 116.54, 123.47, - 130.81, 138.59, 146.83, 155.56, 164.81, 174.61, 185, 196, 207.65, 220, 233.08, 246.94, - 261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392, 415.3, 440, 466.16, 493.88, - 523.25, 554.37, 587.33, 622.25, 659.26, 698.46, 739.99, 783.99, 830.61, 880, 932.33, 987.77, - 1046.5, 1108.73, 1174.66, 1244.51, 1318.51, 1396.91, 1479.98, 1567.98, 1661.22, 1760, 1864.66, 1975.53, - 2093, 2217.46, 2349.32, 2489.02, 2637.02, 2793.83, 2959.96, 3135.96, 3322.44, 3520, 3729.31, 3951.07, - 4186.01, 4434.92, 4698.64, 4978.03, 5274.04, 5587.65, 5919.91, 6271.93, 6644.88, 7040, 7458.62, 7902.13, -] - let keyMap = keyMapInput.value let playing = false @@ -228,27 +239,19 @@ canvasCtx.webkitImageSmoothingEnabled = false canvasCtx.msImageSmoothingEnabled = false canvasCtx.imageSmoothingEnabled = false -let consoleSprite = new Sprite(canvasCtx, "console.png", canvas.width/2, 554, 480, 86) -let syntheSprite = new Sprite(canvasCtx, "synthe.png", canvas.width/2, 540, 110, 80) -let canonSprites = [] -for (let note=FIRST_NOTE; note canonSprite.draw()) - noteSprites.forEach(noteSprite => noteSprite.draw()) - syntheSprite.draw() - explosionSprites.forEach(explosionSprite => explosionSprite.draw()) -} - - let audioCtx let volume let wave @@ -282,19 +285,32 @@ function init() { onpartialinput() + Tone.Transport.scheduleRepeat(draw, DRAW_PERIOD) + Tone.Transport.scheduleRepeat(update, UPDATE_PERIOD) + showSettings() } - startDialog.onclose = init +function draw() { + canvasCtx.clearRect(0, 0, canvas.width, canvas.height) + + consoleSprite.draw() + cannonSprites.forEach(cannonSprite => cannonSprite.draw()) + noteSprites.forEach(noteSprite => noteSprite.draw()) + syntheSprite.draw() + explosionSprites.forEach(explosionSprite => explosionSprite.draw()) +} + function showSettings() { pause() settingsDialog.showModal() } +window.onblur = showSettings function pause() { Tone.Transport.pause() - window.clearInterval(updateTaskId) + //window.clearInterval(updateTaskId) playing = false } @@ -302,24 +318,14 @@ settingsButton.onclick = showSettings keyMapInput.onchange = function(event) { keyMap = keyMapInput.value -} - -volRange.oninput = function(event) { - volume.gain.linearRampToValueAtTime(volRange.value, audioCtx.currentTime) -} - -modRange.oninput = function(event) { - depth.gain.value = modRange.value -} - -function onpartialinput() { - wave = audioCtx.createPeriodicWave( - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0].concat(Array.from(document.querySelectorAll(".partial")).map(range => range.value)), - {disableNormalization: false,} - ) - for (const note in oscillators) { - oscillators[note].setPeriodicWave(wave) + if (midiKeyboard) { + cannonSprites.forEach((cannonSprite, index) => { + cannonSprite.key = NOTE_NAMES[index % NOTE_NAMES.length] + }) + } else { + cannonSprites.forEach((cannonSprite, index) => { + cannonSprite.key = keyMap[index - FIRST_NOTE].toUpperCase() + }) } } @@ -346,22 +352,44 @@ midiSelect.onfocus = function() { ) } +var midiKeyboard = "" midiSelect.oninput = () => { for (const id in midiIputs) midiIputs[id].onmidimessage = null - if (midiSelect.value) { - midiIputs[midiSelect.value].onmidimessage = onMIDIMessage + midiKeyboard = midiSelect.value + if (midiKeyboard) { + midiIputs[midiKeyboard].onmidimessage = onMIDIMessage + } + keyMapInput.onchange() +} + +volRange.oninput = function(event) { + volume.gain.linearRampToValueAtTime(volRange.value, audioCtx.currentTime) +} + +modRange.oninput = function(event) { + depth.gain.value = modRange.value +} + +function onpartialinput() { + wave = audioCtx.createPeriodicWave( + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0].concat(Array.from(document.querySelectorAll(".partial")).map(range => range.value)), + {disableNormalization: false,} + ) + for (const note in oscillators) { + oscillators[note].setPeriodicWave(wave) } } function onMIDIMessage(event) { let [code, note, velocity] = event.data - if (144 <= code && code <= 159 && canonSprites[note]) { + if (144 <= code && code <= 159 && cannonSprites[note]) { //playNote(note, velocity / 128) - canonSprites[note].shooting = true - } else if (128 <= code && code <= 143 && canonSprites[note]) { + cannonSprites[note].shooting = true + } else if (128 <= code && code <= 143 && cannonSprites[note]) { //stopNote(note) - canonSprites[note].shooting = false + cannonSprites[note].shooting = false } } @@ -377,21 +405,23 @@ function newGame() { let midiSong let noteSprites = [] let explosionSprites = [] +let speed async function nextLevel() { level++ midiSong = await Midi.fromUrl(`midi/${level}.mid`) levelTitle.innerText = `Niveau ${level}` songNameTitle.innerText = midiSong.name + speed = 0.04 * FLOOR / midiSong.header.tempos[0].bpm noteSprites = [] midiSong.tracks.forEach(track => { //console.log(track.name) track.notes.filter(note => FIRST_NOTE <= note.midi && note.midi <= LAST_NOTE).forEach(note => { let noteSprite let durationInQuarter = note.durationTicks / midiSong.header.ppq - if (durationInQuarter <= 0.25) noteSprite = new Sixteenth(canvasCtx, note.midi, 1000*note.duration) - else if (durationInQuarter <= 0.5) noteSprite = new Eighth(canvasCtx, note.midi, 1000*note.duration) - else if (durationInQuarter <= 1) noteSprite = new Quarter(canvasCtx, note.midi, 1000*note.duration) - else noteSprite = new Whole(canvasCtx, note.midi, 1000*note.duration) + if (durationInQuarter <= 0.25) noteSprite = new Sixteenth(canvasCtx, note.midi, note.duration) + else if (durationInQuarter <= 0.5) noteSprite = new Eighth(canvasCtx, note.midi, note.duration) + else if (durationInQuarter <= 1) noteSprite = new Quarter(canvasCtx, note.midi, note.duration) + else noteSprite = new Whole(canvasCtx, note.midi, note.duration) Tone.Transport.scheduleOnce(time => noteSprites.push(noteSprite), note.time) }) }) @@ -406,43 +436,42 @@ let updateTaskId function resume() { playing = true Tone.Transport.start() - updateTaskId = window.setInterval(update, UPDATE_PERIOD) } function update() { noteSprites.forEach(noteSprite => { - noteSprite.y += 0.5 + noteSprite.y += speed }) - noteSprites.filter(noteSprite => noteSprite.y >= 420).forEach(noteSprite => { + noteSprites.filter(noteSprite => noteSprite.y >= FLOOR).forEach(noteSprite => { stopNote(noteSprite.note) let explosionSprite = noteSprite.explose() explosionSprites.push(explosionSprite) explosionSprite.play().then(() => explosionSprites.remove(explosionSprite)) }) - noteSprites = noteSprites.filter(note => note.y < 420) + noteSprites = noteSprites.filter(note => note.y < FLOOR) - canonSprites.forEach(canonSprite => { - let noteSprite = noteSprites.find(noteSprite => noteSprite.note == canonSprite.note) + cannonSprites.forEach(cannonSprite => { + let noteSprite = noteSprites.find(noteSprite => noteSprite.note == cannonSprite.note) if (noteSprite) { - noteSprite.shot = canonSprite.shooting + noteSprite.shot = cannonSprite.shooting if (noteSprite.shot) { noteSprite.duration -= UPDATE_PERIOD if (noteSprite.duration > 0) { - playNote(canonSprite.note) - canonSprite.impactY = noteSprite.y + playNote(cannonSprite.note) + cannonSprite.impactY = noteSprite.y } else { - stopNote(canonSprite.note) + stopNote(cannonSprite.note) let explosionSprite = noteSprite.explose() explosionSprites.push(explosionSprite) explosionSprite.play().then(() => explosionSprites.remove(explosionSprite)) noteSprites.remove(noteSprite) } } else { - stopNote(canonSprite.note) + stopNote(cannonSprite.note) } } else { - stopNote(canonSprite.note) - canonSprite.impactY = 0 + stopNote(cannonSprite.note) + cannonSprite.impactY = 0 } }) } @@ -471,6 +500,8 @@ function stopNote(note) { velocity = oscillators[note].velocity.gain.value oscillators[note].velocity.gain.setValueCurveAtTime([velocity, velocity/10, velocity/20, 0], audioCtx.currentTime + 0.1, 0.5) + oscillators[note].stop(audioCtx.currentTime + 0.6) + delete(oscillators[note]) } @@ -495,13 +526,14 @@ function playNoise(noiseDuration, startGain=0.5, bandHz=1000) { gain.gain.setValueCurveAtTime([startGain, startGain/5, 0], audioCtx.currentTime, noiseDuration) noise.connect(bandpass).connect(gain).connect(audioCtx.destination) noise.start() + noise.stop(audioCtx.currentTime + noiseDuration) } document.onkeydown = function(event) { if (playing && keyMap.includes(event.key)) { event.preventDefault() let note = FIRST_NOTE + keyMap.indexOf(event.key) - canonSprites[note].shooting = true + cannonSprites[note].shooting = true } } @@ -509,6 +541,6 @@ document.onkeyup = function(event) { if (playing && keyMap.includes(event.key)) { event.preventDefault() let note = FIRST_NOTE + keyMap.indexOf(event.key) - canonSprites[note].shooting = false + cannonSprites[note].shooting = false } } \ No newline at end of file diff --git a/img/cannon.png b/img/cannon.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b6656a819f873b0cb9972d3c8292d3b5f81ffc GIT binary patch literal 19774 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 NC}=z?efTu+{{r;|Vvhg- literal 0 HcmV?d00001 diff --git a/img/canon.png b/img/canon.png index f2468128ad07042da5797b1863fbb82850bfef71..136f05bb097335fe5039b03d2cc55fcfcbf5f1c4 100644 GIT binary patch literal 20000 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 diff --git a/img/pipe.png b/img/pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5d357ecf0cbf536139027a06d27f1f64c8bdaf GIT binary patch literal 1338 zcmV-A1;zS_P)EX>4Tx04R}tkv&MmKpe$iTg4((2a6PO$WWc^q9Wo{ zt5Adrp;l;vxAeOib`7kz)Z>sE`~#_#gc4)+|g;xJjV|(EVcDAEQ9eF3_yo_V=-E zH&1}TGjOG~{nZ9A^GSNWtwoQ3fomKh8cJ}t~nO1*4*mZKx(CSV+00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=m;7UA2qz57~uc_02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00RO^L_t(I%Vm;FY?M_LfWLF@ z9jFAxQYfaSozgIEh8BaM;UT82R=2`JS1iCNH6-{*NsRHqW2J7&%EU$!T#&dRB(901 zwKcUQHW2BH>1%MDfl>k?QWKc}zsE(VC5FY#xye1>ch1Q@0`SSH&+Ov)pZNUbQC@zb zldfak6y|S}%ipD9O@f-L4X6nlH*Y`;%){E|S}uKmL0tElFARjRKFP%&FL3p4k+cr7Z*t;*RgtI729^CPkWCcfazmSefc4W-#I~ZI*kDk z0Ojki&Y}{rrEW6-aa@8B@mM@Q5Od_<0fvr$4EuK=#GE+uK2tLf8M-`BmVlUYr&vG? z?%ZCWBGZ7^fKKLTQH6oQVSYIGGjG0o7zu(i5TX^qatsPh9s8(2crabW2Z6zB{baW9 zVc^%_F%#O_UcppYDEv*}8H9*HOjGB63`K)*Zz_i&_y`aYu8)oKd}|Ac@ojGpBYzAM z)N^C*J|YeYG5>mFIyc8?-xX@>Y7hx{kqTfH<^yAs*BKtUjG^F^2t%9##-D%9a_>ft z`^9;@E)`W(yoMN4M<$bDa$=NNAbay4Cg!prC1O_NF;FSX08@g1S%i397{3;&N1lgPU zWei!q?Cp5XMh359`iS~1byTHlS>Mut#=?V%91De8%+BNirEzPDx$O7~yCitE!_-&W z8y~!9-mf)HB+dIu(?rs=9MetPOcQHtZ)dwLbNZwg$F7bSF@zw>?)F_kKrOJfu>lA? z+fYrqF-1^$dIW%%I@_$WwHX&+VSI*FX3Q6FQB$8{K3|}^eiQ3jTPeAS{+?cWN&xWs wM_u-CY?>euY6>VNh3b|jA{Bn=`R;$re~2A7i$r3MLI3~&07*qoM6N<$f{Kh;EdT%j literal 0 HcmV?d00001 diff --git a/midi/1.mid b/midi/1.mid index b2527ceb50a3976bc48a326bf452ef960ef87b2b..a094bab86401b352cf29102a29b6484cfd6c4461 100644 GIT binary patch literal 2946 zcmeHJ&ubG=5T0zsN)hxT2tu7ku>}o1^k6T^_h#msnQ!L3bZ%v<3;^dL21@Mb z+=}}Y(Ff=bU0b$yO3qHrwbk;Ty5c&OYUS6qt=0~9ZRjf3O=tJOt!!@9)UnbnbszuK z@W^tWm2DTg!&gk#-l*AS^~r&{>{RW|4YzFXpdr3htL@%TB&6Vhv$Zrs~6g@pql`{ypbPR-VJlF^1`*Nx7B0n{Qg-M`YjDdBMcq`40Ct{ z(2u*TN(|r#C9qM1i%{lZb5Qo7ljp6qMxMovltt(i2^0k|377&*5ttGn!`lq~4^?Hc ztv534>vJzU!t5lAf=i6$*3 za!AD)ewXLjfJ0`Oq_9arm?a=Bd5n|ujMjwXBynFa1Q}+~b4E}U@w*(n<$Kb2aSRsw zcxq$lU7OPzFSalDE~*8sbe@B^$i5_z?x#pJIR%q9M+04oyctI^6mO}~5)Ul-U=C8@ zX=0fcBIXH5i^bP~VUv4%g*!u^fjeYtg4hsoFDe8d|(JE%qr@&yAy|G1j>V)1>LA>U*rcsIv zPX)_Ev|3oN!PgoF1CQ0@>%kh}P%a^rZ@}4IJ|SONuSN@i%pO&SFGe!b{QPqRQy4;K z6H}YwJcs8wc2_iahdzC6P)#|+9QQQqXxNQh7wXJnpm~&DuX?0c1AE2HVZwP#=&x&z zFGSi~>Pra64Mg*l^H(IpS0nw6Vt6W;x`7phDZ|$;hw-xRlb18}iRSxP|1{prv}jf5 z3$i_iV-X8U@qg;y@nbUO@)rdy?jFBO^;M5vXa z+GW}qQZ}S-Rhlde=~9Cp5j{rc4Wx_akS1X|?ujM^EfcpW*f8-11*;}rrJ$zb!$z1M zRl@YJE^74kH6M=p_z|40;P?p_JSwBc=wB?z?A8_iT&x===2ML|}>2!Ld$d#h>)OT*TfrnOk_*mRYMMu}q)d zaYqM&+acM$Ra)8GyJ!sAB>?% zINAY=vI@hD7H8t978wT~i6~&8!~x0a=pCJn(gVm{2DuZaq?J%pggLjJ9M{A2Kroh~ zXE*^BiDqVsBeS{&=!f=MNE|V>-VB*KNM$}csXoI=u{1MTzRWX0KhhDJT;wEFkD9Zc zR`B<})Pqte+|{4uvgsn2&2{#akN&uucA(6ZpC_%kj{LI{R z3d0N*0}DFWC((ObYczh!iu|=A00viXV&3OTe%Sr{ry=3r|BvsS1TE~UB8J=eIYw+h K4^IE-ZTba4vDsn(