2020-11-15 21:29:25 +01:00
/*! @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 .
*/
2020-11-15 20:14:26 +01:00
# 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))
2020-11-29 23:49:58 +01:00
// duration: pause duration as multiple of 40ns
# define PAUSE(duration) (0x30000 | ((duration >> 10) & 0xffff))
2020-11-30 18:49:36 +01:00
# define TEXT(id) (0x40000 | id)
2020-11-15 20:14:26 +01:00
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 [ ] ;
2020-11-29 23:49:58 +01:00
const uint32_t strophe1 [ ] ;
2020-11-30 17:49:23 +01:00
const uint32_t strophe2 [ ] ;
2020-11-29 23:49:58 +01:00
const uint32_t main_melody [ ] ;
const uint32_t * cpu32EntryPoint = main_melody ;
2020-11-15 20:14:26 +01:00
2020-11-29 23:49:58 +01:00
const uint32_t CALL_REFRAIN = CALL + 0 ;
2020-11-15 20:14:26 +01:00
const uint32_t CALL_QUADRUPEL = CALL + 1 ;
2020-11-29 23:49:58 +01:00
const uint32_t CALL_STROPHE1 = CALL + 2 ;
2020-11-30 17:49:23 +01:00
const uint32_t CALL_STROPHE2 = CALL + 3 ;
const uint32_t GOTO_MAIN_MELODY = 4 ;
2020-11-15 20:14:26 +01:00
const uint32_t * jumplabels [ ] = {
2020-11-15 21:29:25 +01:00
refrain ,
quadrupel ,
2020-11-29 23:49:58 +01:00
strophe1 ,
2020-11-30 17:49:23 +01:00
strophe2 ,
2020-11-29 23:49:58 +01:00
main_melody ,
2020-11-15 20:14:26 +01:00
} ;
const uint32_t * * cppu32JumpLabels = jumplabels ;
2020-11-30 18:49:36 +01:00
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 " ,
} ;
2020-11-15 20:14:26 +01:00
const uint32_t quadrupel [ ] = {
2020-11-30 18:49:36 +01:00
TEXT ( 15 ) ,
2020-11-15 21:29:25 +01:00
TONE ( GIS , TACT / 16 ) ,
TONE ( B , TACT / 16 ) ,
TONE ( CIS , TACT / 16 ) ,
TONE ( B , TACT / 16 ) ,
RETURN ,
2020-11-15 20:14:26 +01:00
} ;
const uint32_t refrain [ ] = {
2020-11-15 21:29:25 +01:00
CALL_QUADRUPEL ,
2020-11-30 18:49:36 +01:00
TEXT ( 16 ) ,
2020-11-15 21:29:25 +01:00
TONE ( F , TACT * 3 / 16 ) ,
TONE ( F , TACT * 3 / 16 ) ,
TONE ( DIS , TACT * 3 / 8 ) ,
CALL_QUADRUPEL ,
2020-11-30 18:49:36 +01:00
TEXT ( 17 ) ,
2020-11-15 21:29:25 +01:00
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 ,
2020-11-30 18:49:36 +01:00
TEXT ( 18 ) ,
2020-11-15 21:29:25 +01:00
TONE ( CIS , TACT / 4 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( C , TACT * 3 / 16 ) ,
TONE ( B , TACT / 16 ) ,
TONE ( GIS , TACT / 4 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 19 ) ,
2020-11-15 21:29:25 +01:00
TONE ( GIS , TACT / 8 ) ,
TONE ( DIS , TACT / 4 ) ,
TONE ( CIS , TACT / 2 ) ,
CALL_QUADRUPEL ,
2020-11-30 18:49:36 +01:00
TEXT ( 20 ) ,
2020-11-15 21:29:25 +01:00
TONE ( F , TACT * 3 / 16 ) ,
TONE ( F , TACT * 3 / 16 ) ,
TONE ( DIS , TACT * 3 / 8 ) ,
CALL_QUADRUPEL ,
2020-11-30 18:49:36 +01:00
TEXT ( 21 ) ,
2020-11-15 21:29:25 +01:00
TONE ( GIS2 , TACT / 4 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT * 3 / 16 ) ,
TONE ( C , TACT / 16 ) ,
TONE ( B , TACT / 8 ) ,
CALL_QUADRUPEL ,
2020-11-30 18:49:36 +01:00
TEXT ( 22 ) ,
2020-11-15 21:29:25 +01:00
TONE ( CIS , TACT / 4 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( C , TACT * 3 / 16 ) ,
TONE ( B , TACT / 16 ) ,
TONE ( GIS , TACT / 4 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 23 ) ,
2020-11-15 21:29:25 +01:00
TONE ( GIS , TACT / 8 ) ,
TONE ( DIS , TACT / 4 ) ,
TONE ( CIS , TACT / 2 ) ,
2020-11-29 23:49:58 +01:00
RETURN ,
} ;
const uint32_t strophe1 [ ] = {
PAUSE ( TACT / 4 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 1 ) ,
2020-11-29 23:49:58 +01:00
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 2 ) ,
2020-11-29 23:49:58 +01:00
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 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 3 ) ,
2020-11-29 23:49:58 +01:00
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
PAUSE ( TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 4 ) ,
2020-11-29 23:49:58 +01:00
TONE ( GIS , TACT / 8 ) ,
TONE ( GIS2 , TACT / 4 ) ,
TONE ( GIS2 , TACT / 8 ) ,
TONE ( DIS , TACT * 5 / 8 ) ,
PAUSE ( TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 5 ) ,
2020-11-29 23:49:58 +01:00
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 6 ) ,
2020-11-29 23:49:58 +01:00
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 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 7 ) ,
2020-11-29 23:49:58 +01:00
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 8 ) ,
2020-11-29 23:49:58 +01:00
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( GIS , TACT / 4 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 9 ) ,
2020-11-29 23:49:58 +01:00
TONE ( DIS , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( DIS , TACT / 2 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 10 ) ,
2020-11-29 23:49:58 +01:00
TONE ( CIS , TACT * 5 / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 11 ) ,
2020-11-29 23:49:58 +01:00
TONE ( DIS , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 12 ) ,
2020-11-29 23:49:58 +01:00
TONE ( DIS , TACT / 4 ) ,
TONE ( GIS , TACT / 4 ) ,
PAUSE ( TACT / 4 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 13 ) ,
2020-11-29 23:49:58 +01:00
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
PAUSE ( TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 14 ) ,
2020-11-29 23:49:58 +01:00
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( DIS , TACT * 3 / 8 ) ,
RETURN ,
} ;
2020-11-30 17:49:23 +01:00
const uint32_t strophe2 [ ] = {
PAUSE ( TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 24 ) ,
2020-11-30 17:49:23 +01:00
TONE ( CIS , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 25 ) ,
2020-11-30 17:49:23 +01:00
TONE ( B , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( DIS , TACT * 3 / 8 ) ,
PAUSE ( TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 26 ) ,
2020-11-30 17:49:23 +01:00
TONE ( C , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( GIS , TACT / 2 ) ,
PAUSE ( TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 27 ) ,
2020-11-30 17:49:23 +01:00
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 28 ) ,
2020-11-30 17:49:23 +01:00
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( GIS , TACT / 4 ) ,
PAUSE ( TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 29 ) ,
2020-11-30 17:49:23 +01:00
TONE ( GIS2 , TACT / 8 ) ,
TONE ( GIS2 , TACT / 8 ) ,
TONE ( DIS , TACT / 4 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 30 ) ,
2020-11-30 17:49:23 +01:00
TONE ( F , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
PAUSE ( TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 31 ) ,
2020-11-30 17:49:23 +01:00
TONE ( CIS , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 32 ) ,
2020-11-30 17:49:23 +01:00
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 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 33 ) ,
2020-11-30 17:49:23 +01:00
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 34 ) ,
2020-11-30 17:49:23 +01:00
TONE ( B , TACT / 8 ) ,
TONE ( GIS , TACT / 4 ) ,
PAUSE ( TACT / 4 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 35 ) ,
2020-11-30 17:49:23 +01:00
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( F , TACT / 4 ) ,
TONE ( DIS , TACT / 4 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 36 ) ,
2020-11-30 17:49:23 +01:00
TONE ( CIS , TACT * 5 / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 37 ) ,
2020-11-30 17:49:23 +01:00
TONE ( DIS , TACT / 4 ) , // 1/8 tact before, 1/8 tact after
TONE ( DIS , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 38 ) ,
2020-11-30 17:49:23 +01:00
TONE ( DIS , TACT / 4 ) ,
TONE ( GIS , TACT / 4 ) ,
PAUSE ( TACT / 4 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 39 ) ,
2020-11-30 17:49:23 +01:00
TONE ( GIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 40 ) ,
2020-11-30 17:49:23 +01:00
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
PAUSE ( TACT / 8 ) ,
2020-11-30 18:49:36 +01:00
TEXT ( 41 ) ,
2020-11-30 17:49:23 +01:00
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( DIS , TACT / 4 ) ,
RETURN ,
} ;
2020-11-29 23:49:58 +01:00
const uint32_t main_melody [ ] = {
CALL_STROPHE1 ,
CALL_REFRAIN ,
2020-11-30 17:49:23 +01:00
CALL_STROPHE2 ,
CALL_REFRAIN ,
CALL_REFRAIN ,
2020-11-29 23:49:58 +01:00
GOTO_MAIN_MELODY ,
2020-11-15 20:14:26 +01:00
} ;