Piano Attack

A 16-bit shooter flown over a line of sheet music: every key is a bullet · lab 1 · 2026-10-01 · the piano fighter picked · the sheet flat on the ground, picked · two rows with a tunnel · IN THE GAME since the evening of 2026-10-01

The ask

Lionel: "imagine if there is a fighter jet on the left side of the sheet music and it's flying towards the right ... instead of the player having to wait for the C note to come to the playline to play, the player can just spam C 8 times which then hits the first 8 C quarter notes in succession. located under each C quarter note is a little enemy monster or soldier that's actively trying to shoot the plane ... the key is to have players learn the piano from a molecular level, starting with single note, then double notes, then note runs like CDE."

And the same day, on firing early: "the piano plane has a kill range (like maybe at a 45 degree angle right under it) that is the sweet spot. beyond that, the bullets or missles hit less hard ... your gun doesn't freeze when you hit the wrong note, but you waste a bullet. you start off with 10 bullets and every measure that passes you get a set num of bullets."

And an hour later, with the lab in front of him: "let's go with the piano fighter version (vienna world). unused bullets become coins that get added to your score (maybe not 1:1 ratio). also on the sheet music we should see the same ranges (aka within range / hit zone) ... i can't help but wonder if an isometric sheet music scroller on the ground is possible ... just mock this up and let's take a quick look before deciding whether to proceed or not." The first three are on this page; the mock became two tilted sheets, which are in the gallery.

And having looked at both tilts: "we don't need the tilt. try another version like this. the sheet music is on the ground in the large size that it is now. increase the space between the notes on the horizontal axis ... put the soldier on the RIGHT of the note. so that way a big chord can have 4 soldiers to the right of each note. the note lights up when pressed, but the bullets are aimed towards the soldier standing behind ... no more separation between staves ... the soldiers are 2.5d while the sheet music is 2d."

And having flown that: "definitely this flat sheet view is the one we should implement for now ... we can decrease the overall size of the staff as right now it's definitely more than big enough ... we can have 2 rows - the plane can hit the rows on the top, but the row on the bottom is basically the upcoming measures beyond the first row's measures, but this gives the user an idea of what's coming next without having to extend the side view canvas horizontally. (and it can be somethin glike the soldiers go into a tunnel for the 2nd row and then appear on the 1st row). with this we can have a range upgrade that hits the second row too (but with less damage & higher chance of miss)." That is the bench now.

Why it answers the progression question

The plane has six parts (gun, sight, reach, magazine, hull, grenades) and each is bought once and kept. A mission that shoots you down still pays, so the next flight is in a stronger plane whether or not the hands got better. The hands get better anyway: every bullet is a note read off the page and found on the keys.

14missions, from one note to a run of thirty-seconds
50checks on the rules, your own examples among them
19frames from Codex over two rounds, the picked world cut onto one pixel grid
$0spent: the frames are on the Codex plan

The rules, as built

  1. The plane flies at the tempo and never stops. What is under it is due now.
  2. A key is one bullet at the nearest living soldier of that key, in any order, anywhere on the plane's own row.
  3. A bullet is whole inside the sweet spot under the plane and weaker past it: half at one falloff, a third at two. A soldier hit early has to be hit again.
  4. A soldier left standing shoots when its note reaches the plane. The plane loses hull and flies on.
  5. Bullets are the only price of a wrong or an early note. Ten at take-off, a bar's worth as the plane enters each bar. A key with nothing to hit still fires, and the bullet lands where that key is written on the staff.
  6. A shield takes two or three whole bullets: play the figure, then play it again. A better gun does it in one.
  7. Pickups drop from kills: more bullets, grenades (each takes the soldier it is thrown at and his neighbours: one either side in a new plane, more with the Grenades part), an autopilot (it plays the next two bars on the beat and you rest), a repair.
  8. Unused bullets become coins when the plane comes home: half a coin each, on a slider. A wrong note and an early one now cost coins as well as safety.
  9. The hit zone and the range are drawn on the page: yellow where a bullet is whole, pale where it still reaches, faded past that.
  10. The note lights when its key goes down and says what became of its soldier: green when he is down, amber when he is only hurt and wants the note again, red when he got his shot off. The bullet itself goes to the soldier.
  11. The second row is the Reach part's. It shows the measures that follow, and each mark of Reach opens a quarter more of it to the guns. A bullet at a soldier there is a long shot: it keeps half its strength, and three in ten miss.
  12. The game's own rules, since the evening: a note of a dotted quarter or longer is an armored soldier (a half note 3 hp, a whole 5) who fires at the end of his note, and a key held on him is a spray that takes him for three bullets; some notes are crates (ammo, a grenade launcher, a buff) and the bars pay nothing; a soldier's shot may blind, corrupt or confuse the plane for eight beats; a boss mission has a vehicle instead of soldiers; a cleared stretch is flown at double speed; the ammo is a tally of bullets.

This is the bench; the game is piano-attack.html (🛩 PIANO ATTACK on the menu): a hundred missions built from the partials, lives, gold, gems and bosses. The bench flies the lab's fourteen missions and the game's hundred (the list under Missions) under the game's rules, every one of them on a slider.

Try it. Pick 🤖 ace, 🤖 eager and 🤖 sloppy under the stage to watch three ways of flying the same mission. To fly it yourself, a MIDI keyboard plays it, and so do the letters printed on the keys under the stage. Space takes off and pauses, R starts over.

What is real: the sheet is the game's own engraver, the sound is the game's piano, the rules are one file the tests run. What is the lab's: the coins and the hangar live in this browser only, and every number in the right-hand panel is a guess to be flown.

The bench

HP
AMMO
Try a pickup in flight:

Three bots on this mission, under these rules

Six parts, five marks each. A part is bought once and kept, and coins are paid even for a flight that was shot down.

🪙 0 coins

A slider changes the flight in the air, from the next bullet. The plane's own five follow the hangar unless you override it.

How a bullet weakens
A bar's bullets arrive
A bar is worth a bullet for every
A key hits
The field
Rows
The staff
The spacing of the long notes
Where a soldier stands
The art
The pixel grid
Tempo
The camera
Volume
Soundtrack style
Space take off · pause · next mission   R fly it again

The sheet on the ground, in two rows

You took the flat sheet, and asked for three things on it: a smaller staff, a second row under the plane's own that shows "the upcoming measures beyond the first row's measures", with the soldiers going "into a tunnel for the 2nd row" and coming out on the first, and a range upgrade "that hits the second row too (but with less damage & higher chance of miss)". All three are on the bench. The two rows are one strip of music: what leaves the second row at its left end comes out at the right end of the plane's row.

Two rows. The plane flies over the top row. The row under it is what comes next, greyed because a new plane cannot reach it. A staff space is 20 px here; the first flat sheet had 28.
Sixteenths. The plane's row shows 3 beats of this run and the two rows together 7. The first flat sheet showed 2.
Both hands. Two rows of a grand staff fit at 14 to 15 px to the staff space, a little larger than the side view's 12. Each row has its own clefs.
Chords on two rows. A chord's soldiers still stand in a file, one beside each note.
The Reach part. At Mk III half of the second row is in range, striped as long range. Each mark opens another quarter.
A long shot that landed. Your own case: an F sharp played during the C major bar. With Reach at Mk V it reaches the F sharp of the D major bar on the second row and takes 29% of that soldier. His note goes amber.
A long shot that missed. The same key again, and this bullet went wide: it is spent, the soldier is untouched. Three in ten do this.
The large staff in two rows. The first flat sheet's size, for comparison: it fills the screen and shows 5 beats of the run across both rows.
One row, the smaller staff alone. Still a switch on the bench (Picture, Rows).

Your asks, as built

  • A smaller staff. Three sizes under Picture: small, medium and large. Medium is the default: 20 px to a staff space on one staff. The soldiers shrink with it, to two thirds.
  • Two rows. The plane's own on top, the upcoming measures under it. A soldier walks into the wall at the left of the second row and comes out of the wall at the right of the first.
  • The plane hits the top row. All of it, and nothing past it, whatever the plane.
  • Reach hits the second row. A quarter of it for each mark. A bullet there keeps half its strength and misses three times in ten.

What to know

  • Two hands is the tight case. Two rows of a grand staff only fit at 14 to 15 px, whatever size is picked. It reads, and it is small.
  • A long shot is for spare bullets. In the bot runs a pilot who fires at everything, in a plane with every part at Mk V, clears all 14 missions but wastes 106 of 926 bullets on misses and leaves soldiers standing on 7. Reach alone did nothing for him: he runs dry on his own row first.
  • The tunnel is drawn in code. Two brick walls with the same banner. If the rows stay, they want real art.
  • Only bots have flown it.

What I would look at first

  • The size. Medium against large on a one-hand mission: large is easier to read, medium shows half as much again.
  • Whether the second row is worth its height on two-hand missions, where it costs the most.
  • The long shot's numbers. Half and three in ten are guesses, on two sliders under Rules.
★ Decide in the gallery

To try a long shot yourself: Hangar, +500 coins, buy Reach, then fly Scale Storm and play an F sharp during the first bar.

The spacing and the size are separate

A run is not widened by making everything larger. The engraver spaces notes by their length and then keeps anything from touching anything else, with a margin. The lab sets that margin as wide as it goes: a staff space to the right of every note and a staff space to the left of whatever comes next, a note, its sharp or a rest. So an eighth, a sixteenth and a thirty-second each get a notehead and a soldier's room, and a long note keeps its ordinary width.

The two meet in one place. The margin stops at two staff spaces, so the room a soldier can be given shrinks with the staff, and the soldier with it: full size on a staff of 26 px and up, two thirds down to 13 px. That is why the medium staff has the smaller soldier.

What came before this is in the gallery: the first flat sheet, the tilt straight back, and the first tilt and the isometric view.

The world: the piano fighter

Picked, 2026-10-01: "let's go with the piano fighter version (vienna world)". A clavichord biplane, a walnut fortepiano fighter and a black concert grand jet, the keyboard as the nose in all three; wind-up tin soldiers, a drummer behind his drum and a tuba cannon; Vienna's skyline at golden hour. The jet world it was drawn against is kept in the gallery.

The mock screen, one Codex frame. The notes over the soldiers are Codex's own drawing of a staff.
The cast as drawn: the Mk I, II and III airframes the hangar grows through; a rifleman (1 bullet), a drummer (2), a tuba cannon (3).

Why it fits

  • The game already has a ladder of pianos. A better piano being a stronger fighter needs no second explanation.
  • It sits in the Vienna world: the skyline is St. Stephen's, the enemies are toys, nobody is hurt.
  • The keyboard is the plane's nose, so the thing you play is the thing that shoots.

What to watch

  • A grand piano seen from the side is a thick wedge. At 222 pixels wide it reads as a plane; smaller, it reads as a box.
  • The Mk III's lid fin is tall, and its gloss speckles on the chunky grid where the wooden two cut cleanly.

One pixel grid

An image model does not draw on a grid. What comes back looks like pixel art and is not: the soldiers were drawn on cells of 11 to 12 pixels, the tuba cannon and the grand on 7. Side by side they would read as different games. tools/attack_art.py build puts every sprite on one grid, twice.

At the size the lab draws them. Top row: chunky ×3 (a soldier is 20 art pixels tall, each drawn as 3 screen pixels, the SNES read). Bottom row: fine ×2 (30 art pixels at 2). The bench switches between them, and which one is still yours to say.

How a frame becomes a sprite

The palette is cut at full size (20 colours a sprite), then each art pixel takes the commonest colour of the block it covers. Averaging the block was tried beside it and is muddier: a red coat and a white strap average to pink, where the vote keeps one of them. Alpha is a vote too, so an edge is on or off.

What the sprites do not have yet

Frames. Each is one drawing, moved by code: the plane bobs and kicks, a soldier flashes when hit, an explosion is drawn in squares. Codex does not hold a sprite steady across frames (the walking pianos' idle frames varied 4.5 to 7.6% in size on Codex, against 0.6 to 2.9% on gpt-image-2), so a walk or a firing cycle is the next round's question, not this one's.

Which engine

Canvas 2D, inside the game. A screen of this is under two hundred sprites, and any of the engines below draws that without effort, so drawing speed decides nothing. What decides it is that the mode sits on four things the game already has and an outside engine would have to rebuild or reach across a bridge for: the engraved sheet, the MIDI input, the piano, and the account.

EngineWhat it would giveWhat it would cost hereVerdict
Canvas 2D
the browser's own, as this lab
Sprites at whole-number scale with smoothing off. Shares the page with the engraved sheet, so a soldier is drawn at its notehead's own x.No shaders. A CRT filter or ten thousand particles would want more.Use it.
PixiJS
a 2D renderer on WebGL or WebGPU
Batched sprites, filters, palette swaps, the same code on a Canvas fallback. A renderer only: it does not want the loop, the input or the sound.A library to vendor and a GPU context beside the sheet's layers.The step up, if the look ever asks for shaders. The rules do not change: they never touch the screen.
Phaser
a whole 2D game framework
Scenes, physics, tilemaps, its own input, loader and audio.It expects to own the loop, the input and the sound, and the game owns all three. Nothing here collides or tiles.No.
three.js / Babylon
both already vendored
A camera and lights. A plane that banks in 3D, a ground that tilts.For flat sprites it is more code than Canvas 2D for the same picture, and pixel snapping is by hand.Not for 2D. Keep it for the hands.
Godot
4.x, exported to the web
The best 2D tools of the list, and it does export: single-threaded since 4.3, WebGL 2, Web MIDI in every browser but Safari.A second program in the page: about 40 MB of WebAssembly, 5 MB compressed (Godot's own figure for 4.3), a build step in a repo that has none, and the sheet, the judge, the piano and the wallet either rebuilt inside it or called across a JavaScript bridge every frame.Only if Piano Attack becomes its own download, the way Atlantis was weighed.
UnrealNothing a 16-bit side-scroller uses.No browser export: found on 2026-09-17, and streaming was ruled out on cost.No.
BlenderNot an engine. A sprite factory: one model of the piano fighter rendered in every bank and turn, then cut to the grid, so every frame agrees.A model to build.Later, for animation frames Codex cannot hold steady.

What is yours to call

Each of these is a switch on the bench, set to my reading of what you said. Fly both sides before deciding.

The rows and the size

Two rows or one, and which of the three staff sizes. Both are switches under Picture, and the gallery round has them side by side.

What a long shot is worth

A quarter of the second row for each mark of Reach, half the strength, three misses in ten. The last two are sliders under Rules. As they stand, the second row is somewhere to spend spare bullets, not a way through a mission.

What an unused bullet is worth

Half a coin, rounded down, paid only to a plane that comes home. A clean first mission brings its ten bullets back: 5 coins on top of 67. A Mk V magazine brings thirty.

How a bullet weakens

Sweet spot is your second telling: whole for two beats ahead, then half at every four. By bar is your example read to the letter: this bar 100%, the next 50%, the one after 33%. Set the sweet spot as long as the reach and you have your first telling, where every bullet kills.

When the bullets arrive

"Every measure that passes" could be the bar behind or the bar ahead. Entering a bar is the default, because a dense bar after a quiet one otherwise opens with too few. A bar is worth a bullet for every hit it needs, so a shielded bar pays double.

Not built

Fingering (you said to leave it). Held notes: a half note is one bullet, like a quarter. Animation frames. The wallet: the coins here are the lab's. A mission from a real piece, though Excalibur's phrases are cut and waiting.