One more commit.

This commit is contained in:
Andrew Lalis 2017-02-17 10:55:30 +01:00
commit 0be3d7cf68
6 changed files with 160 additions and 212 deletions

View File

@ -1,7 +1,7 @@
#include <U8x8lib.h> #include <U8x8lib.h>
#include <Arduino.h> #include <Arduino.h>
#include <U8g2lib.h> #include <U8g2lib.h>
#include "Musical.h" #include "Pitches.h"
#ifdef U8X8_HAVE_HW_I2C #ifdef U8X8_HAVE_HW_I2C
#include <Wire.h> #include <Wire.h>
#endif #endif
@ -57,129 +57,128 @@ unsigned long blinkerLeftLastUpdate = 0;
char mode = 0; char mode = 0;
bool modePressed = 0; bool modePressed = 0;
unsigned long modePressedTime = 0; unsigned long modePressedTime = 0;
//Left option button. bool leftPressed, rightPressed = 0;
bool leftPressed = 0; unsigned long leftPressedTime, rightPressedTime = 0;
unsigned long leftPressedTime = 0; //Music variables.
//Right option button. short BPM, noteDuration;
bool rightPressed = 0; short* currentSequence;
unsigned long rightPressedTime = 0; bool isPlaying = false;
int currentNoteIndex;
unsigned long noteEndTime;
/* short beep1[] = {
* Song file: bpm, followed by notes and a byte representing what division of a note it is. 3, 100,
*/ NOTE_A4, 4,
short mySong[] = { NOTE_E7, 4,
120, NOTE_C2, 4
NOTE_D5, E,
NOTE_E5, E,
NOTE_F5, Q + E,
NOTE_F5, E,
NOTE_F5, E,
NOTE_G5, E,
NOTE_A5, Q + E,
NOTE_A5, E,
NOTE_A5, E,
NOTE_C5, E,//10
NOTE_G5, Q + E,
NOTE_G5, E,
NOTE_F5, E,
NOTE_E5, E,
NOTE_D5, Q + E,
NOTE_D5, E,
NOTE_D5, E,
NOTE_E5, E,
NOTE_F5, Q + E,
NOTE_F5, E,//20
NOTE_F5, E,
NOTE_G5, E,
NOTE_A5, Q + E,
NOTE_A5, E,
NOTE_A5, E,
NOTE_C5, E,
NOTE_D5, Q + E,
NOTE_D5, E,
NOTE_C5, E,
NOTE_E5, E,//30
NOTE_D5, Q + E,
NOTE_D5, E,
NOTE_D5, E,
NOTE_E5, E,
NOTE_F5, Q,
NOTE_E5, E,
NOTE_E5, E,
NOTE_D5, Q,
NOTE_C5, Q,
NOTE_B5, E,//40
NOTE_B5, E,
NOTE_A5, Q,
NOTE_G5, Q + E,
NOTE_G5, E,
NOTE_F5, E,
NOTE_A5, E,
NOTE_G5, Q + E,
NOTE_G5, Q,
NOTE_F5, S,
NOTE_E5, S,//50
NOTE_F5, Q,
NOTE_F5, S,
NOTE_E5, S,
NOTE_F5, Q,
NOTE_F5, S,
NOTE_E5, S,
NOTE_G5, E,
NOTE_F5, E,
NOTE_E5, E,
NOTE_D5, Q,//60
NOTE_D5, S,
NOTE_C5, S,
NOTE_D5, Q,
NOTE_D5, S,
NOTE_C5, S,
NOTE_D5, Q,
NOTE_C5, S,
NOTE_D5, S,
NOTE_E5, E,
NOTE_F5, E,//70
NOTE_C5, E,
NOTE_D5, Q,
NOTE_D5, S,
NOTE_E5, S,
NOTE_F5, Q,
NOTE_F5, S,
NOTE_G5, S,
NOTE_A5, Q,
NOTE_E5, S,
NOTE_F5, S,//80
NOTE_G5, E,
NOTE_F5, E,
NOTE_E5, E,
NOTE_D5, Q,
NOTE_D5, S,
NOTE_C5, S,
NOTE_D5, Q,
NOTE_D5, S,
NOTE_C5, S,
NOTE_D5, Q,//90
NOTE_C5, S,
NOTE_D5, S,
NOTE_E5, E,
NOTE_F5, E,
NOTE_C5, E,
NOTE_D5, Q + E,
NOTE_D5, Q,
NOTE_REST, E,
NOTE_D5, Q,
NOTE_REST, E,//100
NOTE_D5, Q,
NOTE_REST, E,
NOTE_D5, Q,
NOTE_REST, E
}; };
const short beep1[] = { short skyrim[] = {
100, 104, 120,
NOTE_A4, Q, NOTE_D5, 8,
NOTE_E7, Q, NOTE_E5, 8,
NOTE_C2, Q NOTE_F5, 8 / 3,
NOTE_F5, 8,
NOTE_F5, 8,
NOTE_G5, 8,
NOTE_A5, 8 / 3,
NOTE_A5, 8,
NOTE_A5, 8,
NOTE_C5, 8,//10
NOTE_G5, 8 / 3,
NOTE_G5, 8,
NOTE_F5, 8,
NOTE_E5, 8,
NOTE_D5, 8 / 3,
NOTE_D5, 8,
NOTE_D5, 8,
NOTE_E5, 8,
NOTE_F5, 8 / 3,
NOTE_F5, 8,//20
NOTE_F5, 8,
NOTE_G5, 8,
NOTE_A5, 8 / 3,
NOTE_A5, 8,
NOTE_A5, 8,
NOTE_C5, 8,
NOTE_D5, 8 / 3,
NOTE_D5, 8,
NOTE_C5, 8,
NOTE_E5, 8,//30
NOTE_D5, 8 / 3,
NOTE_D5, 8,
NOTE_D5, 8,
NOTE_E5, 8,
NOTE_F5, 4,
NOTE_E5, 8,
NOTE_E5, 8,
NOTE_D5, 4,
NOTE_C5, 4,
NOTE_B5, 8,//40
NOTE_B5, 8,
NOTE_A5, 4,
NOTE_G5, 8 / 3,
NOTE_G5, 8,
NOTE_F5, 8,
NOTE_A5, 8,
NOTE_G5, 8 / 3,
NOTE_G5, 4,
NOTE_F5, 16,
NOTE_E5, 16,//50
NOTE_F5, 4,
NOTE_F5, 16,
NOTE_E5, 16,
NOTE_F5, 4,
NOTE_F5, 16,
NOTE_E5, 16,
NOTE_G5, 8,
NOTE_F5, 8,
NOTE_E5, 8,
NOTE_D5, 4,//60
NOTE_D5, 16,
NOTE_C5, 16,
NOTE_D5, 4,
NOTE_D5, 16,
NOTE_C5, 16,
NOTE_D5, 4,
NOTE_C5, 16,
NOTE_D5, 16,
NOTE_E5, 8,
NOTE_F5, 8,//70
NOTE_C5, 8,
NOTE_D5, 4,
NOTE_D5, 16,
NOTE_E5, 16,
NOTE_F5, 4,
NOTE_F5, 16,
NOTE_G5, 16,
NOTE_A5, 4,
NOTE_E5, 16,
NOTE_F5, 16,//80
NOTE_G5, 8,
NOTE_F5, 8,
NOTE_E5, 8,
NOTE_D5, 4,
NOTE_D5, 16,
NOTE_C5, 16,
NOTE_D5, 4,
NOTE_D5, 16,
NOTE_C5, 16,
NOTE_D5, 4,//90
NOTE_C5, 16,
NOTE_D5, 16,
NOTE_E5, 8,
NOTE_F5, 8,
NOTE_C5, 8,
NOTE_D5, 8 / 3,
NOTE_D5, 4,
NOTE_REST, 8,
NOTE_D5, 4,
NOTE_REST, 8,//100
NOTE_D5, 4,
NOTE_REST, 8,
NOTE_D5, 4,
NOTE_REST, 8
}; };
//-------------------| //-------------------|
@ -383,10 +382,26 @@ void updateInputs() {
} }
} }
//Updates the music player, and potentially quits the music.
void updateSoundPlay() {
if (isPlaying && (noteEndTime < millis()) && currentNoteIndex < currentSequence[0]) {
//It is necessary to play the next note.
int realNoteIndex = currentNoteIndex * 2 + 2;
int realDuration = noteDuration / currentSequence[currentNoteIndex * 2 + 3];
tone(BUZZER, currentSequence[realNoteIndex], realDuration);
noteEndTime = millis() + realDuration;
currentNoteIndex++;
}
if (currentNoteIndex == currentSequence[0]) {
isPlaying = false;
}
}
//Updates all modules. //Updates all modules.
void updateAll() { void updateAll() {
updateBlinkerStatus(); updateBlinkerStatus();
updateInputs(); updateInputs();
updateSoundPlay();
} }
//-------------------| //-------------------|
@ -451,6 +466,24 @@ void setIndicatorColor(byte red, byte green, byte blue) {
analogWrite(LED_indicatorBlue, blue); analogWrite(LED_indicatorBlue, blue);
} }
//-------------------|
//MUSIC FUNCTIONS: |
//-------------------|
void setBPM(short newBPM) {
BPM = newBPM;
noteDuration = 15000 / BPM;
}
//Begins playing a new sequence of the form: {Length, BPM, note 1, time 1, note 2, time 2, ...}
void playSequence(short* sequence) {
currentSequence = sequence;
setBPM(sequence[1]);
currentNoteIndex = 0;
noteEndTime = 0;
isPlaying = true;
}
//-------------------| //-------------------|
//ERROR CHECKING: | //ERROR CHECKING: |
//-------------------| //-------------------|
@ -489,13 +522,12 @@ void setup() {
startupScreen(); startupScreen();
drawMainScreen(); drawMainScreen();
updateAll(); updateAll();
Musical::setBuzzerPin(BUZZER); playSequence(skyrim);
Musical::playSequence(mySong, 104);
} }
void loop() { void loop() {
updateBlinkerStatus(); updateBlinkerStatus();
updateInputs(); updateInputs();
Musical::update(); updateSoundPlay();
} }

View File

@ -21,13 +21,8 @@
<ClInclude Include="__vm\.BicycleControl.vsarduino.h"> <ClInclude Include="__vm\.BicycleControl.vsarduino.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Musical.h"> <ClInclude Include="Pitches.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ClCompile Include="Musical.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project> </Project>

View File

@ -1,57 +0,0 @@
#include "Musical.h"
Musical::Musical()
{
}
Musical::~Musical()
{
}
void Musical::setBPM(short newBPM)
{
BPM = newBPM;
Q = 60000 / BPM;
H = Q * 2;
E = Q / 2;
S = Q / 4;
W = Q * 4;
}
void Musical::setBuzzerPin(short pinNumber)
{
pin = pinNumber;
}
void Musical::playNote(int note, int duration)
{
tone(pin, note, duration);
}
//Plays an array as a musical sequence. Array is: {bpm, note1, time1, note2, time2, ...} Length is the number of notes.
void Musical::playSequence(short * sequence, int length)
{
setBPM(sequence[0]);
currentSong = sequence;
songLength = length;
currentNote = 0;
lastNoteTime = 0;
isPlaying = true;
}
//Updates the playing song to allow multitasking.
void Musical::update()
{
if (isPlaying && lastNoteTime > millis() && currentNote < songLength) {
//It is necessary to play the next note.
playNote(currentSong[currentNote * 2 + 1], currentSong[currentNote * 2 + 2]);
lastNoteTime = millis() + currentSong[currentNote * 2 + 2];
currentNote++;
}
if (currentNote == songLength) {
isPlaying = false;
}
}

View File

@ -1,6 +1,4 @@
#pragma once #pragma once
//Musical notes:
#define NOTE_B0 31 #define NOTE_B0 31
#define NOTE_C1 33 #define NOTE_C1 33
#define NOTE_CS1 35 #define NOTE_CS1 35
@ -90,24 +88,4 @@
#define NOTE_CS8 4435 #define NOTE_CS8 4435
#define NOTE_D8 4699 #define NOTE_D8 4699
#define NOTE_DS8 4978 #define NOTE_DS8 4978
#define NOTE_REST 0 #define NOTE_REST 0
class Musical
{
public:
Musical();
~Musical();
static void setBPM(short newBPM);
static void setBuzzerPin(short pinNumber);
static void playNote(int note, int duration);
static void playSequence(short* sequence, int length);
static void update();
private:
static short BPM, Q, H, E, S, W, pin;
static short* currentSong;
static int songLength;
static bool isPlaying;
static int currentNote;
static unsigned long lastNoteTime;
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long