1 #ifndef __MUSICBOX_H__
2 #define __MUSICBOX_H__
3 
4 #include "../menu.h"
5 #include "pitches.h"
6 
7 extern MENU_TYP musicbox;
8 
9 typedef struct {
10     char *name;
11     int *notes;
12     int *noteDurations;
13     unsigned int noteLength;
14     unsigned int musicTime;
15 } music_t;
16 
17 typedef struct {
18     music_t **music_list;
19     unsigned int music_list_len;
20     int cur_music_index;
21     unsigned int cur_music_note;
22     unsigned int cur_music_time;
23     unsigned int isPlaying;
24 } player_t;
25 
26 int musicbox_init(void);
27 int musicbox_uninit(void);
28 void musicbox_task(void);
29 void musicbox_key_handel(key_code_t key_code);
30 void musicbox_cover_draw(int *draw_index);
31 
32 static uint8_t icon_data_next_song_24_24[] = {
33     0x00, 0x00, 0x00, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00,
34     0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00,
35     0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E,
36     0x3C, 0x18, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
37     0x00, 0x00, 0x00, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00,
38     0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00};
39 static icon_t icon_next_song_24_24 = {icon_data_next_song_24_24, 24, 24};
40 
41 static uint8_t icon_data_previous_song_24_24[] = {
42     0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
43     0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0x00, 0x00, 0x00,
44     0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x18, 0x3C,
45     0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
46     0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
47     0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0x00, 0x00, 0x00};
48 static icon_t icon_previous_song_24_24 = {icon_data_previous_song_24_24, 24,
49                                           24};
50 
51 static uint8_t icon_data_resemu_24_24[] = {
52     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFC, 0xF8, 0xF0,
53     0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
55     0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
56     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x1F, 0x0F,
57     0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
58 static icon_t icon_resume_24_24 = {icon_data_resemu_24_24, 24, 24};
59 
60 static uint8_t icon_data_pause_24_24[] = {
61     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00,
62     0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
64     0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x00,
66     0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
67 static icon_t icon_pause_24_24 = {icon_data_pause_24_24, 24, 24};
68 
69 static uint8_t icon_data_note_32_32[] = {
70     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0,
71     0xF8, 0xF8, 0xF8, 0x7C, 0x7C, 0x7C, 0x3C, 0x3E, 0x3E, 0x3E, 0x9E, 0x9E,
72     0x9F, 0x9F, 0xCF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
73     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x1C, 0x1C,
74     0x0E, 0x0E, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x01, 0x01,
75     0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0,
76     0xC0, 0xC0, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF8,
77     0xFC, 0xFE, 0x9E, 0x0F, 0x0F, 0x0F, 0x0F, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF,
78     0x1F, 0x7F, 0x7F, 0xFF, 0xF3, 0xE1, 0xE1, 0xE1, 0xE1, 0xF3, 0xFF, 0x7F,
79     0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x0F, 0x1F,
80     0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x07, 0x01, 0x00};
81 static icon_t icon_note_32_32 = {icon_data_note_32_32, 32, 32};
82 
83 static int liang_zhi_lao_hu_Notes[] = {
84     NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4,
85     NOTE_C4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_E4, NOTE_F4, NOTE_G4,
86     NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_C4, NOTE_G4,
87     NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_C4, NOTE_D4, NOTE_G3,
88     NOTE_C4, 0,       NOTE_D4, NOTE_G3, NOTE_C4, 0};
89 static int liang_zhi_lao_hu_NoteDurations[] = {
90     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 8, 4, 8, 8, 8,
91     8, 4, 4, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4};
92 static music_t liang_zhi_lao_hu = {"liang_zhi_lao_hu", liang_zhi_lao_hu_Notes,
93                                    liang_zhi_lao_hu_NoteDurations, 34};
94 
95 static int Imperial_March_Notes[] = {
96     // Dart Vader theme (Imperial March) - Star wars
97     // Score available at https://musescore.com/user/202909/scores/1141521
98     // The tenor saxophone part was used
99     // notes from
100     // https://github.com/robsoncouto/arduino-songs/blob/master/imperialmarch/imperialmarch.ino
101 
102     NOTE_A4, NOTE_A4,  NOTE_A4, NOTE_A4, NOTE_A4,  NOTE_A4,  NOTE_F4,
103     REST,    NOTE_A4,  NOTE_A4, NOTE_A4, NOTE_A4,  NOTE_A4,  NOTE_A4,
104     NOTE_F4, REST,     NOTE_A4, NOTE_A4, NOTE_A4,  NOTE_F4,  NOTE_C5,
105 
106     NOTE_A4, NOTE_F4,  NOTE_C5, NOTE_A4, NOTE_E5,  NOTE_E5,  NOTE_E5,
107     NOTE_F5, NOTE_C5,  NOTE_A4, NOTE_F4, NOTE_C5,  NOTE_A4,
108 
109     NOTE_A5, NOTE_A4,  NOTE_A4, NOTE_A5, NOTE_GS5, NOTE_G5,  NOTE_DS5,
110     NOTE_D5, NOTE_DS5, REST,    NOTE_A4, NOTE_DS5, NOTE_D5,  NOTE_CS5,
111 
112     NOTE_C5, NOTE_B4,  NOTE_C5, REST,    NOTE_F4,  NOTE_GS4, NOTE_F4,
113     NOTE_A4, NOTE_C5,  NOTE_A4, NOTE_C5, NOTE_E5,
114 
115     NOTE_A5, NOTE_A4,  NOTE_A4, NOTE_A5, NOTE_GS5, NOTE_G5,  NOTE_DS5,
116     NOTE_D5, NOTE_DS5, REST,    NOTE_A4, NOTE_DS5, NOTE_D5,  NOTE_CS5,
117 
118     NOTE_C5, NOTE_B4,  NOTE_C5, REST,    NOTE_F4,  NOTE_GS4, NOTE_F4,
119     NOTE_A4, NOTE_A4,  NOTE_F4, NOTE_C5, NOTE_A4};
120 
121 static int Imperial_March_NoteDurations[] = {
122     -4, -4, 16, 16, 16, 16, 8,  8,  -4, -4, 16, 16, 16, 16,
123     8,  8,  4,  4,  4,  -8, 16,
124 
125     4,  -8, 16, 2,  4,  4,  4,  -8, 16, 4,  -8, 16, 2,
126 
127     4,  -8, 16, 4,  -8, 16, 16, 16, 8,  8,  8,  4,  -8, 16,
128 
129     16, 16, 16, 8,  8,  4,  -8, 16, 4,  -8, 16, 2,
130 
131     4,  -8, 16, 4,  -8, 16, 16, 16, 8,  8,  8,  4,  -8, 16,
132 
133     16, 16, 16, 8,  8,  4,  -8, 16, 4,  -8, 16, 2};
134 static music_t Imperial_March = {"Imperial_March", Imperial_March_Notes,
135                                  Imperial_March_NoteDurations, 86};
136 
137 #endif
138