-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
66 lines (57 loc) · 1.85 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Small Melody - created by Andrey Shapovalov. 2020
#include <stdio.h>
#include <stdbool.h>
#include <windows.h>
#include <math.h>
typedef struct Note {
unsigned char duration : 2;
unsigned char note : 6;
} Note;
unsigned char testMusicBlock[] = {
0b00010110,0b01011000,0b00010110,0b01011001,0b00010100,0b00010100,0b00011000,0b01010001,0b00011000,0b01010100,0b00011000,0b00010001,0b01000000
};
Note* charToNote(unsigned char value){
Note* note = malloc(sizeof(Note));
note->duration = value >> (unsigned int)6;
note->note = (value << (unsigned int)2)>>2;
return note;
}
int noteNumberToFrequency(unsigned char number){
float baseFreq = 440; //A4
unsigned int baseNumber = 20;
if(number == 0){
return 0;
}
if(number == baseNumber){
return (int)baseFreq;
}
float result = baseFreq;
if(number < baseNumber){
result /= (float)pow(1.06,baseNumber-number);
} else if(number > baseNumber){
result *= (float)pow(1.06,number-baseNumber);
}
return (int)roundf(result);
}
int main() {
// Convert bytes to Note struct
Note* melody[sizeof(testMusicBlock)/sizeof(unsigned char)];
for(int i = 0; i < sizeof(testMusicBlock)/sizeof(unsigned char); i++){
melody[i] = charToNote(testMusicBlock[i]);
}
// Calculate bpm delay (delay between beats)
int bpm = 170;
DWORD delay = 1000*(60.0/(bpm));
// Play loop
while(true){
int ticksLeft = melody[0]->duration + 1;
unsigned int currentNoteNumber = 0;
while(currentNoteNumber < sizeof(melody)/sizeof(Note*)-1){
Beep(noteNumberToFrequency(melody[currentNoteNumber]->note),delay*ticksLeft);
//free(melody[currentNoteNumber]);
currentNoteNumber++;
ticksLeft = melody[currentNoteNumber]->duration + 1;
}
}
return 0;
}