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-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 ;
const uint32_t quadrupel [ ] = {
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 ,
TONE ( F , TACT * 3 / 16 ) ,
TONE ( F , TACT * 3 / 16 ) ,
TONE ( DIS , TACT * 3 / 8 ) ,
CALL_QUADRUPEL ,
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 ,
TONE ( CIS , TACT / 4 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( C , TACT * 3 / 16 ) ,
TONE ( B , TACT / 16 ) ,
TONE ( GIS , TACT / 4 ) ,
TONE ( GIS , TACT / 8 ) ,
TONE ( DIS , TACT / 4 ) ,
TONE ( CIS , TACT / 2 ) ,
CALL_QUADRUPEL ,
TONE ( F , TACT * 3 / 16 ) ,
TONE ( F , TACT * 3 / 16 ) ,
TONE ( DIS , TACT * 3 / 8 ) ,
CALL_QUADRUPEL ,
TONE ( GIS2 , TACT / 4 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT * 3 / 16 ) ,
TONE ( C , TACT / 16 ) ,
TONE ( B , TACT / 8 ) ,
CALL_QUADRUPEL ,
TONE ( CIS , TACT / 4 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( C , TACT * 3 / 16 ) ,
TONE ( B , TACT / 16 ) ,
TONE ( GIS , TACT / 4 ) ,
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 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
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 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
PAUSE ( TACT / 8 ) ,
TONE ( GIS , TACT / 8 ) ,
TONE ( GIS2 , TACT / 4 ) ,
TONE ( GIS2 , TACT / 8 ) ,
TONE ( DIS , TACT * 5 / 8 ) ,
PAUSE ( TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
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 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( GIS , TACT / 4 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( DIS , TACT / 2 ) ,
TONE ( CIS , TACT * 5 / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( DIS , TACT / 4 ) ,
TONE ( GIS , TACT / 4 ) ,
PAUSE ( TACT / 4 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
PAUSE ( TACT / 8 ) ,
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 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( DIS , TACT * 3 / 8 ) ,
PAUSE ( TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( GIS , TACT / 2 ) ,
PAUSE ( TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( GIS , TACT / 4 ) ,
PAUSE ( TACT / 8 ) ,
TONE ( GIS2 , TACT / 8 ) ,
TONE ( GIS2 , TACT / 8 ) ,
TONE ( DIS , TACT / 4 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
PAUSE ( TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
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 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( GIS , TACT / 4 ) ,
PAUSE ( TACT / 4 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( F , TACT / 4 ) ,
TONE ( DIS , TACT / 4 ) ,
TONE ( CIS , TACT * 5 / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( DIS , TACT / 4 ) , // 1/8 tact before, 1/8 tact after
TONE ( DIS , TACT / 8 ) ,
TONE ( DIS , TACT / 8 ) ,
TONE ( F , TACT / 8 ) ,
TONE ( DIS , TACT / 4 ) ,
TONE ( GIS , TACT / 4 ) ,
PAUSE ( TACT / 4 ) ,
TONE ( GIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
TONE ( C , TACT / 8 ) ,
TONE ( CIS , TACT / 8 ) ,
TONE ( B , TACT / 8 ) ,
PAUSE ( TACT / 8 ) ,
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
} ;