hackathon

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 91c88d74f825f608379f7eece9c19a33aaa68550
parent e730e48a116f046caa244c21d7a169da537834a1
Author: thing1 <thing1@seacrossedlovers.xyz>
Date:   Sun,  3 May 2026 16:31:32 +0100

new song

Diffstat:
Mpiano/piano.ino | 335++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mpiano/tones.h | 190++++++++++++++++++++++++++++++++++++++++----------------------------------------
2 files changed, 266 insertions(+), 259 deletions(-)

diff --git a/piano/piano.ino b/piano/piano.ino @@ -1,164 +1,171 @@ -#include <XPT2046_Touchscreen.h> -#include <TFT_eSPI.h> - -#include "tones.h" - -#define SIZE(arr) (sizeof(arr) / sizeof(arr[0])) - -#define XPT2046_IRQ 36 -#define XPT2046_MOSI 32 -#define XPT2046_MISO 39 -#define XPT2046_CLK 25 -#define XPT2046_CS 33 - -#define BG (~(249 << 11) + ~(194 << 5) + ~43) - - -uint32_t timer = 0; -uint8_t note = 0; -uint8_t song[] = { - 1, 3, 2, 1, - 1, 3, 2, 1, - 1, 2, 3, 4, - 1, 2, 3, 4, -}; - -TFT_eSPI tft = TFT_eSPI(); -SPIClass mySpi = SPIClass(VSPI); -XPT2046_Touchscreen ts(XPT2046_CS, XPT2046_IRQ); - -void setup() { - mySpi.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS); - - ts.begin(mySpi); - ts.setRotation(1); - - tft.init(); - tft.setRotation(1); - - tft.fillScreen(BG); - tft.setTextColor(TFT_WHITE, TFT_BLACK); - - int width = (tft.width() / 7); - for (int i = 0; i < 7; i++) - //tft.fillRect(width * i + 3, 150, width - 6, 90, ~TFT_WHITE); - tft.fillSmoothRoundRect(width * i + 3, 150, width - 6, 90, 10, ~TFT_WHITE); - - for (int i = 0; i < 7; i++) { - switch (i) { - case 0: case 1: case 3: case 4: case 5: - //tft.fillRect(width * i + width * 0.75, 150, width / 2, 60, ~TFT_BLACK); - tft.fillSmoothRoundRect(width * i + width * 0.75, 150, width / 2, 60, 10, ~TFT_BLACK); - break; - } - } -} - -void drawBg() { - tft.fillRect(0, 0, tft.width(), 150, BG); -} - -void playTone(TS_Point *p) { - noTone(26); - if (p->y < 2000) - return; - - int width = 3800 / 7; - if (p->y > 2000 && p->y < 3350) { - for (int i = 0; i < 7; i++) { - if (p->x > width * i + width * 0.75 && p->x < width * i + width * 0.75 + width / 2) { - switch (i) { - case 0: - tone(26, NOTE_CS4, 100); - return; - case 1: - tone(26, NOTE_DS4, 100); - return; - case 3: - tone(26, NOTE_FS4, 100); - return; - case 4: - tone(26, NOTE_GS4, 100); - return; - case 5: - tone(26, NOTE_AS4, 100); - return; - } - } - } - } - - if (p->x < width) - tone(26, NOTE_C4, 100); - else if (p->x < width * 2) - tone(26, NOTE_D4, 100); - else if (p->x < width * 3) - tone(26, NOTE_E4, 100); - else if (p->x < width * 4) - tone(26, NOTE_F4, 100); - else if (p->x < width * 5) - tone(26, NOTE_G4, 100); - else if (p->x < width * 6) - tone(26, NOTE_A4, 100); - else if (p->x < width * 7) - tone(26, NOTE_B4, 100); -} - -int getNote(TS_Point *p) { - noTone(26); - if (p->y < 2000) - return -1; - - int width = 3800 / 7; - - if (p->x < width) - return 0; - else if (p->x < width * 2) - return 1; - else if (p->x < width * 3) - return 2; - else if (p->x < width * 4) - return 3; - else if (p->x < width * 5) - return 4; - else if (p->x < width * 6) - return 5; - else if (p->x < width * 7) - return 6; -} - -void loop() { - static int i; - - if (ts.tirqTouched() && ts.touched()) { - TS_Point p = ts.getPoint(); - playTone(&p); - if (getNote(&p) == song[note]) { - if (timer > 100) { - note++; - timer = 0; - } - } - } - - if (timer % 10) { - drawBg(); - } - - if (note < SIZE(song)) { - int width = (tft.width() / 7); - - if (++i % 4) - timer++; - tft.fillRect(song[note] * width, timer, width, 30, ~TFT_BLACK); - - if (timer > 150 - 30) { - timer = 0; - tft.println("YOU LOOSE"); - while (1) continue; - } - } else { - tft.println("YOU WIN"); - while (1) continue; - } -} +#include <XPT2046_Touchscreen.h> +#include <TFT_eSPI.h> + +#include "tones.h" + +#define SIZE(arr) (sizeof(arr) / sizeof(arr[0])) + +#define XPT2046_IRQ 36 +#define XPT2046_MOSI 32 +#define XPT2046_MISO 39 +#define XPT2046_CLK 25 +#define XPT2046_CS 33 + +#define BG (~(249 << 11) + ~(194 << 5) + ~43) + + +uint32_t timer = 0; +uint8_t note = 0; +uint8_t song[] = { + 1, 3, 2, 1, + 1, 3, 2, 1, + 1, 2, 3, 4, + 1, 2, 3, 4, + 1, 1, 0, 2, + 4, 5, 4, 5, + 1, 3, 2, 1, + 1, 3, 2, 1, + 1, 2, 3, 4, + 1, 2, 3, 4, + +}; + +TFT_eSPI tft = TFT_eSPI(); +SPIClass mySpi = SPIClass(VSPI); +XPT2046_Touchscreen ts(XPT2046_CS, XPT2046_IRQ); + +void setup() { + mySpi.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS); + + ts.begin(mySpi); + ts.setRotation(1); + + tft.init(); + tft.setRotation(1); + + tft.fillScreen(BG); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + int width = (tft.width() / 7); + for (int i = 0; i < 7; i++) + //tft.fillRect(width * i + 3, 150, width - 6, 90, ~TFT_WHITE); + tft.fillSmoothRoundRect(width * i + 3, 150, width - 6, 90, 10, ~TFT_WHITE); + + for (int i = 0; i < 7; i++) { + switch (i) { + case 0: case 1: case 3: case 4: case 5: + //tft.fillRect(width * i + width * 0.75, 150, width / 2, 60, ~TFT_BLACK); + tft.fillSmoothRoundRect(width * i + width * 0.75, 150, width / 2, 60, 10, ~TFT_BLACK); + break; + } + } +} + +void drawBg() { + tft.fillRect(0, 0, tft.width(), 150, BG); +} + +void playTone(TS_Point *p) { + noTone(26); + if (p->y < 2000) + return; + + int width = 3800 / 7; + if (p->y > 2000 && p->y < 3350) { + for (int i = 0; i < 7; i++) { + if (p->x > width * i + width * 0.75 && p->x < width * i + width * 0.75 + width / 2) { + switch (i) { + case 0: + tone(26, NOTE_CS4, 100); + return; + case 1: + tone(26, NOTE_DS4, 100); + return; + case 3: + tone(26, NOTE_FS4, 100); + return; + case 4: + tone(26, NOTE_GS4, 100); + return; + case 5: + tone(26, NOTE_AS4, 100); + return; + } + } + } + } + + if (p->x < width) + tone(26, NOTE_C4, 100); + else if (p->x < width * 2) + tone(26, NOTE_D4, 100); + else if (p->x < width * 3) + tone(26, NOTE_E4, 100); + else if (p->x < width * 4) + tone(26, NOTE_F4, 100); + else if (p->x < width * 5) + tone(26, NOTE_G4, 100); + else if (p->x < width * 6) + tone(26, NOTE_A4, 100); + else if (p->x < width * 7) + tone(26, NOTE_B4, 100); +} + +int getNote(TS_Point *p) { + noTone(26); + if (p->y < 2000) + return -1; + + int width = 3800 / 7; + + if (p->x < width) + return 0; + else if (p->x < width * 2) + return 1; + else if (p->x < width * 3) + return 2; + else if (p->x < width * 4) + return 3; + else if (p->x < width * 5) + return 4; + else if (p->x < width * 6) + return 5; + else if (p->x < width * 7) + return 6; +} + +void loop() { + static int i; + + if (ts.tirqTouched() && ts.touched()) { + TS_Point p = ts.getPoint(); + playTone(&p); + if (getNote(&p) == song[note]) { + if (timer > 100) { + note++; + timer = 0; + } + } + } + + if (timer % 10) { + drawBg(); + } + + if (note < SIZE(song)) { + int width = (tft.width() / 7); + + if (++i % 4) + timer++; + tft.fillRect(song[note] * width, timer, width, 30, ~TFT_BLACK); + + if (timer > 150 - 30) { + timer = 0; + tft.println("YOU LOOSE"); + while (1) continue; + } + } else { + tft.println("YOU WIN"); + while (1) continue; + } +} diff --git a/piano/tones.h b/piano/tones.h @@ -1,95 +1,95 @@ -/************************************************* - - * Public Constants - - *************************************************/ - -#define NOTE_B0 31 -#define NOTE_C1 33 -#define NOTE_CS1 35 -#define NOTE_D1 37 -#define NOTE_DS1 39 -#define NOTE_E1 41 -#define NOTE_F1 44 -#define NOTE_FS1 46 -#define NOTE_G1 49 -#define NOTE_GS1 52 -#define NOTE_A1 55 -#define NOTE_AS1 58 -#define NOTE_B1 62 -#define NOTE_C2 65 -#define NOTE_CS2 69 -#define NOTE_D2 73 -#define NOTE_DS2 78 -#define NOTE_E2 82 -#define NOTE_F2 87 -#define NOTE_FS2 93 -#define NOTE_G2 98 -#define NOTE_GS2 104 -#define NOTE_A2 110 -#define NOTE_AS2 117 -#define NOTE_B2 123 -#define NOTE_C3 131 -#define NOTE_CS3 139 -#define NOTE_D3 147 -#define NOTE_DS3 156 -#define NOTE_E3 165 -#define NOTE_F3 175 -#define NOTE_FS3 185 -#define NOTE_G3 196 -#define NOTE_GS3 208 -#define NOTE_A3 220 -#define NOTE_AS3 233 -#define NOTE_B3 247 -#define NOTE_C4 262 -#define NOTE_CS4 277 -#define NOTE_D4 294 -#define NOTE_DS4 311 -#define NOTE_E4 330 -#define NOTE_F4 349 -#define NOTE_FS4 370 -#define NOTE_G4 392 -#define NOTE_GS4 415 -#define NOTE_A4 440 -#define NOTE_AS4 466 -#define NOTE_B4 494 -#define NOTE_C5 523 -#define NOTE_CS5 554 -#define NOTE_D5 587 -#define NOTE_DS5 622 -#define NOTE_E5 659 -#define NOTE_F5 698 -#define NOTE_FS5 740 -#define NOTE_G5 784 -#define NOTE_GS5 831 -#define NOTE_A5 880 -#define NOTE_AS5 932 -#define NOTE_B5 988 -#define NOTE_C6 1047 -#define NOTE_CS6 1109 -#define NOTE_D6 1175 -#define NOTE_DS6 1245 -#define NOTE_E6 1319 -#define NOTE_F6 1397 -#define NOTE_FS6 1480 -#define NOTE_G6 1568 -#define NOTE_GS6 1661 -#define NOTE_A6 1760 -#define NOTE_AS6 1865 -#define NOTE_B6 1976 -#define NOTE_C7 2093 -#define NOTE_CS7 2217 -#define NOTE_D7 2349 -#define NOTE_DS7 2489 -#define NOTE_E7 2637 -#define NOTE_F7 2794 -#define NOTE_FS7 2960 -#define NOTE_G7 3136 -#define NOTE_GS7 3322 -#define NOTE_A7 3520 -#define NOTE_AS7 3729 -#define NOTE_B7 3951 -#define NOTE_C8 4186 -#define NOTE_CS8 4435 -#define NOTE_D8 4699 -#define NOTE_DS8 4978 +/************************************************* + + * Public Constants + + *************************************************/ + +#define NOTE_B0 31 +#define NOTE_C1 33 +#define NOTE_CS1 35 +#define NOTE_D1 37 +#define NOTE_DS1 39 +#define NOTE_E1 41 +#define NOTE_F1 44 +#define NOTE_FS1 46 +#define NOTE_G1 49 +#define NOTE_GS1 52 +#define NOTE_A1 55 +#define NOTE_AS1 58 +#define NOTE_B1 62 +#define NOTE_C2 65 +#define NOTE_CS2 69 +#define NOTE_D2 73 +#define NOTE_DS2 78 +#define NOTE_E2 82 +#define NOTE_F2 87 +#define NOTE_FS2 93 +#define NOTE_G2 98 +#define NOTE_GS2 104 +#define NOTE_A2 110 +#define NOTE_AS2 117 +#define NOTE_B2 123 +#define NOTE_C3 131 +#define NOTE_CS3 139 +#define NOTE_D3 147 +#define NOTE_DS3 156 +#define NOTE_E3 165 +#define NOTE_F3 175 +#define NOTE_FS3 185 +#define NOTE_G3 196 +#define NOTE_GS3 208 +#define NOTE_A3 220 +#define NOTE_AS3 233 +#define NOTE_B3 247 +#define NOTE_C4 262 +#define NOTE_CS4 277 +#define NOTE_D4 294 +#define NOTE_DS4 311 +#define NOTE_E4 330 +#define NOTE_F4 349 +#define NOTE_FS4 370 +#define NOTE_G4 392 +#define NOTE_GS4 415 +#define NOTE_A4 440 +#define NOTE_AS4 466 +#define NOTE_B4 494 +#define NOTE_C5 523 +#define NOTE_CS5 554 +#define NOTE_D5 587 +#define NOTE_DS5 622 +#define NOTE_E5 659 +#define NOTE_F5 698 +#define NOTE_FS5 740 +#define NOTE_G5 784 +#define NOTE_GS5 831 +#define NOTE_A5 880 +#define NOTE_AS5 932 +#define NOTE_B5 988 +#define NOTE_C6 1047 +#define NOTE_CS6 1109 +#define NOTE_D6 1175 +#define NOTE_DS6 1245 +#define NOTE_E6 1319 +#define NOTE_F6 1397 +#define NOTE_FS6 1480 +#define NOTE_G6 1568 +#define NOTE_GS6 1661 +#define NOTE_A6 1760 +#define NOTE_AS6 1865 +#define NOTE_B6 1976 +#define NOTE_C7 2093 +#define NOTE_CS7 2217 +#define NOTE_D7 2349 +#define NOTE_DS7 2489 +#define NOTE_E7 2637 +#define NOTE_F7 2794 +#define NOTE_FS7 2960 +#define NOTE_G7 3136 +#define NOTE_GS7 3322 +#define NOTE_A7 3520 +#define NOTE_AS7 3729 +#define NOTE_B7 3951 +#define NOTE_C8 4186 +#define NOTE_CS8 4435 +#define NOTE_D8 4699 +#define NOTE_DS8 4978