378 lines
7.9 KiB
C
378 lines
7.9 KiB
C
/*! @file melody.c
|
|
|
|
@brief store Never Gonna Give You Up
|
|
@author Lukas Fürderer
|
|
@version V1.0
|
|
@date 15.11.2020
|
|
|
|
This file contains the main app function and init.
|
|
*/
|
|
|
|
#include "melody.h"
|
|
|
|
// freq: wave duration as multiple of 40ns
|
|
// duration: total duration as multiple of 40ns
|
|
#define TONE(freq, duration) ((((uint32_t)freq & 0xffff) << 16) | (((uint32_t)duration / (uint32_t)freq) & 0xffff))
|
|
|
|
// duration: pause duration as multiple of 40ns
|
|
#define PAUSE(duration) (0x30000 | ((duration >> 10) & 0xffff))
|
|
|
|
#define TEXT(id) (0x40000 | id)
|
|
|
|
const uint32_t TACT = 2120 * 1000 * 25; // 2.12 seconds for one tact
|
|
|
|
const uint32_t GIS2 = 30098;
|
|
const uint32_t F = 35793;
|
|
const uint32_t DIS = 40177;
|
|
const uint32_t CIS = 45097;
|
|
const uint32_t C = 47778;
|
|
const uint32_t B = 53629;
|
|
const uint32_t GIS = 60197;
|
|
|
|
const uint32_t CALL = 0x10000;
|
|
const uint32_t RETURN = 0x20000;
|
|
|
|
const uint32_t refrain[];
|
|
const uint32_t quadrupel[];
|
|
const uint32_t strophe1[];
|
|
const uint32_t strophe2[];
|
|
const uint32_t main_melody[];
|
|
const uint32_t *cpu32EntryPoint = main_melody;
|
|
|
|
const uint32_t CALL_REFRAIN = CALL + 0;
|
|
const uint32_t CALL_QUADRUPEL = CALL + 1;
|
|
const uint32_t CALL_STROPHE1 = CALL + 2;
|
|
const uint32_t CALL_STROPHE2 = CALL + 3;
|
|
const uint32_t GOTO_MAIN_MELODY = 4;
|
|
|
|
const uint32_t *jumplabels[] = {
|
|
refrain,
|
|
quadrupel,
|
|
strophe1,
|
|
strophe2,
|
|
main_melody,
|
|
};
|
|
const uint32_t **cppu32JumpLabels = jumplabels;
|
|
|
|
const char *cpcTexts[] = {
|
|
" ", // 0
|
|
" We're no strangers ",
|
|
" to love ",
|
|
" You know the rules ",
|
|
" and so do I ",
|
|
"A full commitment's ", // 5
|
|
"what I'm thinking of",
|
|
" You wouldn't ",
|
|
" get this from ",
|
|
" any other guy ",
|
|
" I just wanna ", // 10
|
|
" tell you how I'm ",
|
|
" feeling ",
|
|
" Gotta make you ",
|
|
" understand ",
|
|
" Never gonna ", // 15
|
|
" give you up ",
|
|
" let you down ",
|
|
" run around and ",
|
|
" desert you ",
|
|
" make you cry ", // 20
|
|
" say goodbye ",
|
|
" tell a lie ",
|
|
" and hurt you ",
|
|
" We've known ",
|
|
" each other ", // 25
|
|
" for so long ",
|
|
" Your heart's ",
|
|
" been aching but ",
|
|
" You're too shy ",
|
|
" to say it ", // 30
|
|
"Inside we both know ",
|
|
"what's been going on",
|
|
" We know the game ",
|
|
" and we're ",
|
|
" gonna play it ", // 35
|
|
" And if you ",
|
|
" ask me how I'm ",
|
|
" feeling ",
|
|
" Don't tell me ",
|
|
" you're too ", // 40
|
|
" blind to see ",
|
|
};
|
|
|
|
const uint32_t quadrupel[] = {
|
|
TEXT(15),
|
|
TONE(GIS, TACT / 16),
|
|
TONE(B, TACT / 16),
|
|
TONE(CIS, TACT / 16),
|
|
TONE(B, TACT / 16),
|
|
RETURN,
|
|
};
|
|
|
|
const uint32_t refrain[] = {
|
|
CALL_QUADRUPEL,
|
|
|
|
TEXT(16),
|
|
TONE(F, TACT * 3 / 16),
|
|
TONE(F, TACT * 3 / 16),
|
|
TONE(DIS, TACT * 3 / 8),
|
|
CALL_QUADRUPEL,
|
|
|
|
TEXT(17),
|
|
TONE(DIS, TACT * 3 / 16),
|
|
TONE(DIS, TACT * 3 / 16),
|
|
TONE(CIS, TACT * 3 / 16),
|
|
TONE(C, TACT / 16),
|
|
TONE(B, TACT / 8),
|
|
CALL_QUADRUPEL,
|
|
|
|
TEXT(18),
|
|
TONE(CIS, TACT / 4),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(C, TACT * 3 / 16),
|
|
TONE(B, TACT / 16),
|
|
TONE(GIS, TACT / 4),
|
|
TEXT(19),
|
|
TONE(GIS, TACT / 8),
|
|
|
|
TONE(DIS, TACT / 4),
|
|
TONE(CIS, TACT / 2),
|
|
CALL_QUADRUPEL,
|
|
|
|
TEXT(20),
|
|
TONE(F, TACT * 3 / 16),
|
|
TONE(F, TACT * 3 / 16),
|
|
TONE(DIS, TACT * 3 / 8),
|
|
CALL_QUADRUPEL,
|
|
|
|
TEXT(21),
|
|
TONE(GIS2,TACT / 4),
|
|
TONE(C, TACT / 8),
|
|
TONE(CIS, TACT * 3 / 16),
|
|
TONE(C, TACT / 16),
|
|
TONE(B, TACT / 8),
|
|
CALL_QUADRUPEL,
|
|
|
|
TEXT(22),
|
|
TONE(CIS, TACT / 4),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(C, TACT * 3 / 16),
|
|
TONE(B, TACT / 16),
|
|
TONE(GIS, TACT / 4),
|
|
TEXT(23),
|
|
TONE(GIS, TACT / 8),
|
|
|
|
TONE(DIS, TACT / 4),
|
|
TONE(CIS, TACT / 2),
|
|
|
|
RETURN,
|
|
};
|
|
|
|
const uint32_t strophe1[] = {
|
|
PAUSE(TACT / 4),
|
|
TEXT(1),
|
|
TONE(B, TACT / 8),
|
|
TONE(C, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
TEXT(2),
|
|
TONE(DIS, TACT / 8),
|
|
|
|
TONE(C, TACT * 3 / 16), // 1/8 tact before, 1/16 tact after
|
|
|
|
TONE(B, TACT / 16),
|
|
TONE(GIS, TACT * 7 / 8),
|
|
|
|
PAUSE(TACT / 8),
|
|
TEXT(3),
|
|
TONE(B, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(C, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
PAUSE(TACT / 8),
|
|
TEXT(4),
|
|
TONE(GIS, TACT / 8),
|
|
|
|
TONE(GIS2,TACT / 4),
|
|
TONE(GIS2,TACT / 8),
|
|
TONE(DIS, TACT * 5 / 8),
|
|
|
|
PAUSE(TACT / 8),
|
|
TEXT(5),
|
|
TONE(B, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(C, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TEXT(6),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(DIS, TACT / 8),
|
|
|
|
PAUSE(TACT / 8),
|
|
TONE(C, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(C, TACT / 16),
|
|
TONE(B, TACT / 16),
|
|
TONE(GIS, TACT / 2),
|
|
|
|
PAUSE(TACT / 8),
|
|
TEXT(7),
|
|
TONE(B, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(C, TACT / 8),
|
|
TEXT(8),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(GIS, TACT / 4),
|
|
|
|
TEXT(9),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(F, TACT / 8),
|
|
TONE(DIS, TACT / 2),
|
|
|
|
TEXT(10),
|
|
TONE(CIS, TACT * 5 / 8),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(F, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
|
|
TEXT(11),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(F, TACT / 8),
|
|
TEXT(12),
|
|
TONE(DIS, TACT / 4),
|
|
TONE(GIS, TACT / 4),
|
|
|
|
PAUSE(TACT / 4),
|
|
TEXT(13),
|
|
TONE(B, TACT / 8),
|
|
TONE(C, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
PAUSE(TACT / 8),
|
|
TEXT(14),
|
|
TONE(DIS, TACT / 8),
|
|
|
|
TONE(F, TACT / 8),
|
|
TONE(DIS, TACT * 3 / 8),
|
|
|
|
RETURN,
|
|
};
|
|
|
|
const uint32_t strophe2[] = {
|
|
PAUSE(TACT / 8),
|
|
TEXT(24),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
TEXT(25),
|
|
TONE(B, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(DIS, TACT * 3 / 8),
|
|
|
|
PAUSE(TACT / 8),
|
|
TEXT(26),
|
|
TONE(C, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(GIS, TACT / 2),
|
|
|
|
PAUSE(TACT / 8),
|
|
TEXT(27),
|
|
TONE(B, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TEXT(28),
|
|
TONE(C, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(GIS, TACT / 4),
|
|
|
|
PAUSE(TACT / 8),
|
|
TEXT(29),
|
|
TONE(GIS2,TACT / 8),
|
|
TONE(GIS2,TACT / 8),
|
|
TONE(DIS, TACT / 4),
|
|
TEXT(30),
|
|
TONE(F, TACT / 8),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
|
|
PAUSE(TACT / 8),
|
|
TEXT(31),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TEXT(32),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(DIS, TACT / 8),
|
|
|
|
PAUSE(TACT / 8),
|
|
TONE(C, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(GIS, TACT / 2),
|
|
|
|
PAUSE(TACT / 8),
|
|
TEXT(33),
|
|
TONE(B, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(C, TACT / 8),
|
|
TONE(CIS, TACT / 8),
|
|
TEXT(34),
|
|
TONE(B, TACT / 8),
|
|
TONE(GIS, TACT / 4),
|
|
|
|
PAUSE(TACT / 4),
|
|
TEXT(35),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(F, TACT / 8),
|
|
TONE(F, TACT / 4),
|
|
TONE(DIS, TACT / 4),
|
|
|
|
TEXT(36),
|
|
TONE(CIS, TACT * 5 / 8),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(F, TACT / 8),
|
|
|
|
TEXT(37),
|
|
TONE(DIS, TACT / 4), // 1/8 tact before, 1/8 tact after
|
|
|
|
TONE(DIS, TACT / 8),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(F, TACT / 8),
|
|
TEXT(38),
|
|
TONE(DIS, TACT / 4),
|
|
TONE(GIS, TACT / 4),
|
|
|
|
PAUSE(TACT / 4),
|
|
TEXT(39),
|
|
TONE(GIS, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
TONE(C, TACT / 8),
|
|
TEXT(40),
|
|
TONE(CIS, TACT / 8),
|
|
TONE(B, TACT / 8),
|
|
PAUSE(TACT / 8),
|
|
|
|
TEXT(41),
|
|
TONE(DIS, TACT / 8),
|
|
TONE(F, TACT / 8),
|
|
TONE(DIS, TACT / 4),
|
|
|
|
RETURN,
|
|
};
|
|
|
|
const uint32_t main_melody[] = {
|
|
CALL_STROPHE1,
|
|
CALL_REFRAIN,
|
|
CALL_STROPHE2,
|
|
CALL_REFRAIN,
|
|
CALL_REFRAIN,
|
|
GOTO_MAIN_MELODY,
|
|
};
|