fix time to screen
This commit is contained in:
parent
f2b1e696bb
commit
1286d0b8c4
29
app.js
29
app.js
@ -1,11 +1,15 @@
|
|||||||
const MAX_LEVEL = 3
|
const MAX_LEVEL = 3
|
||||||
const DRAW_PERIOD = 0.04 // s
|
const DRAW_PERIOD = 0.04 // s
|
||||||
|
const FLOOR = 390 // px
|
||||||
|
const TIME_TO_SCREEN = 10 // s
|
||||||
const UPDATE_PERIOD = 0.01 // s
|
const UPDATE_PERIOD = 0.01 // s
|
||||||
const FLOOR = 386 // px
|
const STEP = FLOOR * UPDATE_PERIOD / TIME_TO_SCREEN // px
|
||||||
const FIRST_NOTE = 48 // C2
|
const FIRST_NOTE = 48 // C2
|
||||||
const LAST_NOTE = 73 // C4
|
const LAST_NOTE = 73 // C4
|
||||||
|
const NOTE_NAMES = [
|
||||||
|
"C", "C♯", "D", "D♯", "E", "F", "F♯", "G", "G♯", "A", "A♯", "B"
|
||||||
|
]
|
||||||
const FREQUENCIES = [
|
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,
|
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,
|
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,
|
65.41, 69.3, 73.42, 77.78, 82.41, 87.31, 92.5, 98, 103.83, 110, 116.54, 123.47,
|
||||||
@ -16,7 +20,6 @@ const FREQUENCIES = [
|
|||||||
2093, 2217.46, 2349.32, 2489.02, 2637.02, 2793.83, 2959.96, 3135.96, 3322.44, 3520, 3729.31, 3951.07,
|
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,
|
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) {
|
Array.prototype.remove = function(item) {
|
||||||
@ -220,7 +223,7 @@ class Quarter extends Note {
|
|||||||
|
|
||||||
class Whole extends Note {
|
class Whole extends Note {
|
||||||
constructor(canvasCtx, note, duration, velocity) {
|
constructor(canvasCtx, note, duration, velocity) {
|
||||||
super(canvasCtx, note, duration, velocity, 36, 99, 36, 40, 1)
|
super(canvasCtx, note, duration, velocity, 36, 100, 36, 40, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
animate() {}
|
animate() {}
|
||||||
@ -297,6 +300,7 @@ function init() {
|
|||||||
Tone.Transport.scheduleRepeat(draw, DRAW_PERIOD)
|
Tone.Transport.scheduleRepeat(draw, DRAW_PERIOD)
|
||||||
Tone.Transport.scheduleRepeat(update, UPDATE_PERIOD)
|
Tone.Transport.scheduleRepeat(update, UPDATE_PERIOD)
|
||||||
|
|
||||||
|
settingsDialog.onclose = newGame
|
||||||
showSettings()
|
showSettings()
|
||||||
}
|
}
|
||||||
startDialog.onclose = init
|
startDialog.onclose = init
|
||||||
@ -394,19 +398,14 @@ function onMIDIMessage(event) {
|
|||||||
let [code, note, velocity] = event.data
|
let [code, note, velocity] = event.data
|
||||||
|
|
||||||
if (144 <= code && code <= 159 && cannonSprites[note]) {
|
if (144 <= code && code <= 159 && cannonSprites[note]) {
|
||||||
//playNote(note, velocity / 128)
|
|
||||||
cannonSprites[note].shooting = true
|
cannonSprites[note].shooting = true
|
||||||
} else if (128 <= code && code <= 143 && cannonSprites[note]) {
|
} else if (128 <= code && code <= 143 && cannonSprites[note]) {
|
||||||
//stopNote(note)
|
|
||||||
cannonSprites[note].shooting = false
|
cannonSprites[note].shooting = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
settingsDialog.onclose = newGame
|
|
||||||
|
|
||||||
let level
|
let level
|
||||||
function newGame() {
|
function newGame() {
|
||||||
settingsDialog.onclose = resume
|
|
||||||
level = 0
|
level = 0
|
||||||
nextLevel()
|
nextLevel()
|
||||||
}
|
}
|
||||||
@ -414,13 +413,12 @@ function newGame() {
|
|||||||
let midiSong
|
let midiSong
|
||||||
let noteSprites = []
|
let noteSprites = []
|
||||||
let explosionSprites = []
|
let explosionSprites = []
|
||||||
let speed
|
async function nextLevel(time=0) {
|
||||||
async function nextLevel() {
|
Tone.Transport.pause()
|
||||||
level++
|
level++
|
||||||
midiSong = await Midi.fromUrl(`midi/${level}.mid`)
|
midiSong = await Midi.fromUrl(`midi/${level}.mid`)
|
||||||
levelTitle.innerText = `Niveau ${level}`
|
levelTitle.innerText = `Niveau ${level}`
|
||||||
songNameTitle.innerText = midiSong.name
|
songNameTitle.innerText = midiSong.name
|
||||||
speed = 4 * UPDATE_PERIOD * FLOOR / midiSong.header.tempos[0].bpm
|
|
||||||
noteSprites = []
|
noteSprites = []
|
||||||
midiSong.tracks.forEach(track => {
|
midiSong.tracks.forEach(track => {
|
||||||
//console.log(track.name)
|
//console.log(track.name)
|
||||||
@ -431,10 +429,10 @@ async function nextLevel() {
|
|||||||
else if (durationInQuarter <= 0.5) noteSprite = new Eighth(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 if (durationInQuarter <= 1) noteSprite = new Quarter(canvasCtx, note.midi, note.duration)
|
||||||
else noteSprite = new Whole(canvasCtx, note.midi, note.duration)
|
else noteSprite = new Whole(canvasCtx, note.midi, note.duration)
|
||||||
Tone.Transport.scheduleOnce(time => noteSprites.push(noteSprite), note.time)
|
Tone.Transport.scheduleOnce(time => noteSprites.push(noteSprite), time + note.time)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
Tone.Transport.scheduleOnce(time => nextLevel, midiSong.duration)
|
Tone.Transport.scheduleOnce(time => nextLevel(time), time + midiSong.duration + TIME_TO_SCREEN)
|
||||||
|
|
||||||
levelDialog.showModal()
|
levelDialog.showModal()
|
||||||
}
|
}
|
||||||
@ -443,13 +441,14 @@ levelDialog.onclose = resume
|
|||||||
|
|
||||||
let updateTaskId
|
let updateTaskId
|
||||||
function resume() {
|
function resume() {
|
||||||
|
settingsDialog.onclose = resume
|
||||||
playing = true
|
playing = true
|
||||||
Tone.Transport.start()
|
Tone.Transport.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
function update(time) {
|
function update(time) {
|
||||||
noteSprites.forEach(noteSprite => {
|
noteSprites.forEach(noteSprite => {
|
||||||
noteSprite.y += speed
|
noteSprite.y += STEP
|
||||||
})
|
})
|
||||||
noteSprites.filter(noteSprite => noteSprite.y >= FLOOR).forEach(noteSprite => {
|
noteSprites.filter(noteSprite => noteSprite.y >= FLOOR).forEach(noteSprite => {
|
||||||
stopNote(noteSprite.note)
|
stopNote(noteSprite.note)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user