/**
Mini piano for Arduino.
You can control the colorful buttons with your keyboard:
After starting the simulation, click anywhere in the diagram to focus it.
Then press any key between 1 and 8 to play the piano (1 is the lowest note,
8 is the highest).
Copyright (C) 2021, Uri Shaked. Released under the MIT License.
*/
#include "pitches.h" // definiowanie częstotliwości nut muzycznych
#define SPEAKER_PIN 8 // zdefiniowanie pinu, do którego podłączony jest głośnik
const uint8_t buttonPins[] = { 12, 11, 10, 9, 7, 6, 5, 4 };
const int buttonTones[] = {
NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5
// tablica z częstotliwościami nut, które odpowiadają przyciskom
};
const int numTones = sizeof(buttonPins) / sizeof(buttonPins[0]);
// oblicza liczbę tonów na podstawie rozmiaru tablicy
const uint8_t startSequenceButton = 3;
const uint8_t stopSequenceButton = 2;
const uint8_t playSequenceButton = A4;
const uint8_t resetSequenceButton = A5;
int sequence[200]; // tablica do przechowywania sekwencji, 200 miejsc
int sequenceLength = 0;
bool recording = false;
void setup() {
for (uint8_t i = 0; i < numTones; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
// przyciski po naciśnięciu przechodzą ze stanu LOW w HIGH
}
pinMode(SPEAKER_PIN, OUTPUT); // głośnik jest ustawiany jako wyjście
pinMode(startSequenceButton, INPUT_PULLUP);
pinMode(stopSequenceButton, INPUT_PULLUP);
pinMode(playSequenceButton, INPUT_PULLUP);
pinMode(resetSequenceButton, INPUT_PULLUP);
}
void loop() {
int pitch = 0; // zmienna służąca do przechowywania aktualnej częstotliwości nuty
bool keydepressed = false;
for (uint8_t i = 0; i < numTones; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
pitch = buttonTones[i];
break; // Przerwij pętlę po znalezieniu wciśniętego przycisku
}
}
if (pitch == 0 ) {
keydepressed = true;
}
if (recording && sequenceLength < 200) {
// Zarejestruj dźwięk tylko jeśli jest inny od ostatniego
if (pitch != 0) {
if (keydepressed == true ) {
sequence[sequenceLength++] = pitch;
keydepressed = false;
}
else {
if (sequenceLength == 0 || sequence[sequenceLength - 1] != pitch) {
sequence[sequenceLength++] = pitch;
}
}
}
// if (pitch != 0 && (sequenceLength == 0 || sequence[sequenceLength - 1] != pitch)) {
//sequence[sequenceLength++] = pitch;
}
if (digitalRead(startSequenceButton) == LOW) {
recording = true;
sequenceLength = 0; // rozpocznij nową sekwencję
delay(500); // opóźnienie dla stabilności
}
if (digitalRead(stopSequenceButton) == LOW) {
recording = false; // zatrzymanie rejestrowania sekwencji
delay(300); // opóźnienie dla stabilności
}
if (digitalRead(playSequenceButton) == LOW) {
for (int i = 0; i < sequenceLength; i++) {
tone(SPEAKER_PIN, sequence[i]);
delay(300);
noTone(SPEAKER_PIN);
}
delay(300); // opóźnienie dla stabilności
}
if (digitalRead(resetSequenceButton) == LOW) {
sequenceLength = 0; // resetowanie sekwencji
delay(300); // opóźnienie dla stabilności
}
if (pitch) {
tone(SPEAKER_PIN, pitch); // jeśli zmiana jest różna od zera, przycisk jest naciśnięty
// odgrywa się dźwięk
} else {
noTone(SPEAKER_PIN);
// jeśli jest równa zero, nic się nie odgrywa
}
}