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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
#include <stdio.h>
#include "sounds.h"
#include <alsa/asoundlib.h>
#include <raylib.h>
#include <pthread.h>
#include <stdbool.h>
typedef struct {
char key;
float freq;
} freq_map;
int main() {
snd_pcm_t *sound_device;
int err;
err = snd_pcm_open(&sound_device, "default", SND_PCM_STREAM_PLAYBACK, 0);
if (err < 0) {
printf("error: failed to open device: %s", snd_strerror(err));
return 1;
}
err = set_hw_params(sound_device);
if (err < 0) {
printf("error: failed to set parameters: %s", snd_strerror(err));
return 1;
}
SetConfigFlags(FLAG_WINDOW_RESIZABLE);
InitWindow(800, 800, "crynth");
SetTargetFPS(60);
message_queue queue;
mqueue_init(&queue);
sound_thread_meta sound_thread_params = {
.pcm = sound_device,
.queue = &queue,
};
pthread_t sound_thread;
pthread_create(&sound_thread, NULL, sound_thread_start, &sound_thread_params);
/* synth_message param_message = { */
/* .type = MSG_PARAM_CHANGE, */
/* .param_change = { */
/* .param_type = PARAM_OSC, */
/* .value = OSC_SINE, */
/* }, */
/* }; */
/* mqueue_push(&queue, param_message); */
/* param_message = (synth_message){ */
/* .type = MSG_PARAM_CHANGE, */
/* .param_change = { */
/* .param_type = PARAM_VOLUME, */
/* .value = 0.2, */
/* }, */
/* }; */
/* mqueue_push(&queue, param_message); */
int keys[12] = {
KEY_Z,
KEY_S,
KEY_X,
KEY_D,
KEY_C,
KEY_V,
KEY_G,
KEY_B,
KEY_H,
KEY_N,
KEY_J,
KEY_M,
};
while (!WindowShouldClose()) {
for (int i = 0; i < 12; i++) {
if (IsKeyPressed(keys[i])) {
synth_message message = {
.type = MSG_NOTE_ON,
.note = {
.note_id = i,
},
};
mqueue_push(&queue, message);
}
if (IsKeyReleased(keys[i])) {
synth_message message = {
.type = MSG_NOTE_OFF,
.note = {
.note_id = i,
},
};
mqueue_push(&queue, message);
}
}
BeginDrawing();
ClearBackground(RAYWHITE);
EndDrawing();
}
synth_message stop_msg = {.type = MSG_STOP};
mqueue_push(&queue, stop_msg);
CloseWindow();
pthread_join(sound_thread, NULL);
check(snd_pcm_close(sound_device));
return 0;
}
|