feat: raylib and it's window added (#4)

Co-authored-by: HiveBeats <e1lama@protonmail.com>
Reviewed-on: #4
This commit is contained in:
2023-06-17 14:31:18 +03:00
parent a93278f705
commit 320a3cc8e0
2 changed files with 53 additions and 20 deletions

View File

@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
CC="${CXX:-cc}" CC="${CXX:-cc}"
$CC -Wall -std=c11 ./main.c ./parser.c -lm -o ./bin/main $CC -Wall -std=c11 ./main.c ./parser.c -lm -lraylib -o ./bin/main

71
main.c
View File

@@ -4,6 +4,8 @@
#include "math.h" #include "math.h"
#include "parser.h" #include "parser.h"
#include "raylib.h"
#define SAMPLE_RATE 48000.f #define SAMPLE_RATE 48000.f
#define BPM 120.f #define BPM 120.f
#define BEAT_DURATION 60.f/BPM #define BEAT_DURATION 60.f/BPM
@@ -11,19 +13,19 @@
#define VOLUME 0.5f #define VOLUME 0.5f
#define ATTACK_MS 100.f #define ATTACK_MS 100.f
#define PI 3.1415926535f #define SYNTH_PI 3.1415926535f
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// General Sound // General SynthSound
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
typedef struct Sound { typedef struct SynthSound {
float* samples; float* samples;
size_t sample_count; size_t sample_count;
} Sound; } SynthSound;
// frees the original sounds // frees the original sounds
Sound concat_sounds(Sound* sounds, size_t count) { SynthSound concat_sounds(SynthSound* sounds, size_t count) {
size_t total_count = 0; size_t total_count = 0;
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
total_count += sounds[i].sample_count; total_count += sounds[i].sample_count;
@@ -41,7 +43,7 @@ Sound concat_sounds(Sound* sounds, size_t count) {
free(sounds[i].samples); free(sounds[i].samples);
} }
Sound result = { SynthSound result = {
.samples = total, .samples = total,
.sample_count = total_count .sample_count = total_count
}; };
@@ -75,7 +77,7 @@ typedef struct OscillatorGenerationParameter {
float sample; float sample;
} OscillatorGenerationParameter; } OscillatorGenerationParameter;
static Sound get_init_samples(float duration) { static SynthSound get_init_samples(float duration) {
size_t sample_count = (size_t)(duration * SAMPLE_RATE); size_t sample_count = (size_t)(duration * SAMPLE_RATE);
float* samples = malloc(sizeof(float) * sample_count); float* samples = malloc(sizeof(float) * sample_count);
@@ -83,7 +85,7 @@ static Sound get_init_samples(float duration) {
samples[(int)i] = i; samples[(int)i] = i;
} }
Sound res = { SynthSound res = {
.samples = samples, .samples = samples,
.sample_count = sample_count .sample_count = sample_count
}; };
@@ -96,7 +98,7 @@ static float pos(float hz, float x) {
} }
float sineosc(float hz, float x) { float sineosc(float hz, float x) {
return sinf(x * (2.f * PI * hz / SAMPLE_RATE)); return sinf(x * (2.f * SYNTH_PI * hz / SAMPLE_RATE));
} }
static float sign(float v) { static float sign(float v) {
@@ -138,9 +140,9 @@ float multiosc(OscillatorGenerationParameter param) {
return osc_sample; return osc_sample;
} }
static Sound freq(float duration, OscillatorParameterList osc) { static SynthSound freq(float duration, OscillatorParameterList osc) {
Sound samples = get_init_samples(duration); SynthSound samples = get_init_samples(duration);
// Sound attack = get_attack_samples(); // SynthSound attack = get_attack_samples();
float* output = malloc(sizeof(float) * samples.sample_count); float* output = malloc(sizeof(float) * samples.sample_count);
for (int i = 0; i < samples.sample_count; i++) { for (int i = 0; i < samples.sample_count; i++) {
@@ -179,7 +181,7 @@ static Sound freq(float duration, OscillatorParameterList osc) {
*/ */
// return zipped array // return zipped array
Sound res = { SynthSound res = {
.samples = output, .samples = output,
.sample_count = samples.sample_count .sample_count = samples.sample_count
}; };
@@ -188,7 +190,7 @@ static Sound freq(float duration, OscillatorParameterList osc) {
} }
/* /*
static Sound get_attack_samples() { static SynthSound get_attack_samples() {
float attack_time = 0.001 * ATTACK_MS; float attack_time = 0.001 * ATTACK_MS;
size_t sample_count = (size_t)(attack_time * SAMPLE_RATE); size_t sample_count = (size_t)(attack_time * SAMPLE_RATE);
float* attack = malloc(sizeof(float) * sample_count); float* attack = malloc(sizeof(float) * sample_count);
@@ -201,7 +203,7 @@ static Sound get_attack_samples() {
attack[j] = fmin(i, 1.0); attack[j] = fmin(i, 1.0);
} }
Sound res = { SynthSound res = {
.samples = attack, .samples = attack,
.sample_count = sample_count .sample_count = sample_count
}; };
@@ -266,7 +268,7 @@ size_t get_semitone_shift(char* target_note) {
return get_semitone_shift_internal("A4", target_note); return get_semitone_shift_internal("A4", target_note);
} }
Sound note(size_t semitone, float beats) { SynthSound note(size_t semitone, float beats) {
float hz = get_hz_by_semitone(semitone); float hz = get_hz_by_semitone(semitone);
float duration = beats * BEAT_DURATION; float duration = beats * BEAT_DURATION;
@@ -294,7 +296,7 @@ Sound note(size_t semitone, float beats) {
return freq(duration, parameters); return freq(duration, parameters);
} }
Sound get_note_sound(Note input) { SynthSound get_note_sound(Note input) {
float length = 1.f / input.length; float length = 1.f / input.length;
size_t semitone_shift = get_semitone_shift(input.name); size_t semitone_shift = get_semitone_shift(input.name);
return note(semitone_shift, length); return note(semitone_shift, length);
@@ -379,18 +381,44 @@ void pack(uint16_t* d, size_t length) {
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
int main(int argc, char **argv) { int main(int argc, char **argv) {
const size_t width = 1280;
const size_t height = 720;
InitWindow(width, height, "SeeSynth - v0.1");
//SetTargetFPS(60);
// Main game loop
while (!WindowShouldClose()) // Detect window close button or ESC key
{
// Update
//----------------------------------------------------------------------------------
// TODO: Update your variables here
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
BeginDrawing();
ClearBackground(RAYWHITE);
DrawText("Congrats! You created your first window!", 190, 200, 20, LIGHTGRAY);
EndDrawing();
//----------------------------------------------------------------------------------
}
char* input = "A4-4 A4-4 A4-4 A4-4 A4-2 A4-4 A4-4 A4-4 A4-4 A4-4 A4-2 D5-4 D5-4 D5-4 D5-4 D5-4 D5-4 D5-2 C5-4 C5-4 C5-4 C5-4 C5-4 C5-4 C5-2 G4-2 "; char* input = "A4-4 A4-4 A4-4 A4-4 A4-2 A4-4 A4-4 A4-4 A4-4 A4-4 A4-2 D5-4 D5-4 D5-4 D5-4 D5-4 D5-4 D5-2 C5-4 C5-4 C5-4 C5-4 C5-4 C5-4 C5-2 G4-2 ";
char* buf = malloc(strlen(input) + 1); char* buf = malloc(strlen(input) + 1);
strcpy(buf, input); strcpy(buf, input);
NoteArray note_array = parse_notes(buf, strlen(buf)); NoteArray note_array = parse_notes(buf, strlen(buf));
Sound* sounds = malloc(sizeof(Sound) * note_array.count); SynthSound* sounds = malloc(sizeof(SynthSound) * note_array.count);
for (size_t i = 0; i < note_array.count; i++) { for (size_t i = 0; i < note_array.count; i++) {
Note note = note_array.notes[i]; Note note = note_array.notes[i];
sounds[i] = get_note_sound(note); sounds[i] = get_note_sound(note);
} }
Sound song = concat_sounds(sounds, note_array.count); SynthSound song = concat_sounds(sounds, note_array.count);
uint16_t* song_pcm = malloc(sizeof(uint16_t) * song.sample_count); uint16_t* song_pcm = malloc(sizeof(uint16_t) * song.sample_count);
for (size_t i = 0; i < song.sample_count; i++) { for (size_t i = 0; i < song.sample_count; i++) {
song_pcm[i] = toInt16Sample(song.samples[i]); song_pcm[i] = toInt16Sample(song.samples[i]);
@@ -398,5 +426,10 @@ int main(int argc, char **argv) {
pack(song_pcm, song.sample_count); pack(song_pcm, song.sample_count);
// De-Initialization
//--------------------------------------------------------------------------------------
CloseWindow(); // Close window and OpenGL context
//--------------------------------------------------------------------------------------
return 0; return 0;
} }