commit 91c88d74f825f608379f7eece9c19a33aaa68550
parent e730e48a116f046caa244c21d7a169da537834a1
Author: thing1 <thing1@seacrossedlovers.xyz>
Date: Sun, 3 May 2026 16:31:32 +0100
new song
Diffstat:
| M | piano/piano.ino | | | 335 | ++++++++++++++++++++++++++++++++++++++++--------------------------------------- |
| M | piano/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