summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgrm <grm@eyesin.space>2025-02-22 03:40:43 +0200
committergrm <grm@eyesin.space>2025-02-22 03:40:43 +0200
commit35208c579c9e7d0078d786e61f4a323919e2dcdf (patch)
tree022f464e6350c18f76443a6e96eccd02698df7d1
parent500b9a07b93d6cd3e771edc5698e06d163da60f1 (diff)
downloadsynth-project-35208c579c9e7d0078d786e61f4a323919e2dcdf.tar.gz
synth-project-35208c579c9e7d0078d786e61f4a323919e2dcdf.tar.bz2
synth-project-35208c579c9e7d0078d786e61f4a323919e2dcdf.zip
Small fixesHEADmaster
-rw-r--r--.gitignore1
-rw-r--r--Makefile.am2
-rw-r--r--b.c10
-rw-r--r--src/midi.c6
-rw-r--r--src/sound.c14
-rw-r--r--src/sound.h1
-rw-r--r--src/synth_common.h2
-rw-r--r--src/synth_engine.c545
-rw-r--r--src/synth_engine.h4
-rw-r--r--src/synth_gui.c47
-rw-r--r--src/web.c18
11 files changed, 56 insertions, 594 deletions
diff --git a/.gitignore b/.gitignore
index e72bc61..69d6610 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,4 @@ config.status
configure
configure.scan
.deps/
+build/
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index a1489c9..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,2 +0,0 @@
-#SUBDIRS = src . tests
-SUBDIRS = src
diff --git a/b.c b/b.c
index 8eae71f..54e10ab 100644
--- a/b.c
+++ b/b.c
@@ -4,7 +4,7 @@
#define BUILD_DIR "build/"
-int debug_level = 5;
+int debug_level = 0;
void
debug_or_release(B_Cmd* cmd)
@@ -26,7 +26,7 @@ void
inlcude_dirs(B_Cmd* cmd)
{
b_cmd_append(cmd, "-I./src/");
-}
+}
void
cflags(B_Cmd* cmd)
@@ -90,7 +90,7 @@ build_c(bool force,
int dep_rebuild = 0;
if (rebuild_is_needed == 0)
dep_rebuild = b_needs_rebuild(output_path, dep_paths, dep_paths_len);
-
+
if (rebuild_is_needed < 0 || dep_rebuild < 0) return false;
if (force || rebuild_is_needed || dep_rebuild) {
@@ -112,7 +112,7 @@ main(int argc, char *argv[])
B_GO_REBUILD_URSELF(argc, argv);
const char *program_name = b_shift_args(&argc, &argv);
-
+ (void)program_name;
bool force = false;
while (argc > 0) {
@@ -174,7 +174,7 @@ main(int argc, char *argv[])
};
B_Cmd cmd = {0};
-
+
b_mkdir_if_not_exists(BUILD_DIR);
if (!build_c(force, &cmd, synth_paths, B_ARRAY_LEN(synth_paths), synth_deps,
diff --git a/src/midi.c b/src/midi.c
index 5a556e9..429e9df 100644
--- a/src/midi.c
+++ b/src/midi.c
@@ -2,6 +2,8 @@
#include "notes.h"
#include "control.h"
+#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
void midi_decode(uint32_t msg, synth_t * synth) {
@@ -146,7 +148,7 @@ midiCallback(PtTimestamp timestamp, void *userData) {
//printf("%d\n", buf.message);
midi_decode(buf.message, m->synth);
-
+
}
void
@@ -154,7 +156,7 @@ init_midi(midi_t *m, synth_t *synth)
{
m->stream = NULL;
m->synth = synth;
-
+
Pm_Initialize();
printf("midi devs: %d\n", Pm_CountDevices());
diff --git a/src/sound.c b/src/sound.c
index 04b3f9b..9cdb75e 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -1,5 +1,8 @@
#include "sound.h"
#include <portaudio.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
static void
@@ -65,13 +68,14 @@ init_sound(synth_t * synth, PaStreamCallback *streamCallback, const int device_i
if (deviceInfo->maxOutputChannels == 0) {
continue;
}
- //if (!strcmp("HyperX Cloud II Wireless: USB Audio (hw:2,0)", deviceInfo->name)) break;
- printf("dev: %s || %f || %d channels\n", deviceInfo->name, deviceInfo->defaultSampleRate, deviceInfo->maxOutputChannels);
- //if (!strcmp("HDA Intel PCH: ALC1220 Analog (hw:0,0)", deviceInfo->name)) break;
+ printf("dev: %s || %f || id:%d out:%d || lil:%f lol:%f\n", deviceInfo->name,
+ deviceInfo->defaultSampleRate, deviceInfo->maxInputChannels,
+ deviceInfo->maxOutputChannels, deviceInfo->defaultLowInputLatency,
+ deviceInfo->defaultLowOutputLatency);
+
if (c == device_id) break;
c++;
}
-
PaStreamParameters outputParameters;
outputParameters.device = i; Pa_GetDefaultOutputDevice(); /* default output device */
@@ -94,7 +98,7 @@ init_sound(synth_t * synth, PaStreamCallback *streamCallback, const int device_i
if (err != paNoError) {
printf("Error opening stream with %s!!!!!", Pa_GetDeviceInfo(outputParameters.device)->name);
}
-
+
Pa_SetStreamFinishedCallback(synth->stream, &StreamFinished);
Pa_StartStream(synth->stream);
diff --git a/src/sound.h b/src/sound.h
index 384c775..29ec561 100644
--- a/src/sound.h
+++ b/src/sound.h
@@ -2,7 +2,6 @@
#define SOUND_H
#include <portaudio.h>
-#include <string.h>
#include "synth_engine.h"
diff --git a/src/synth_common.h b/src/synth_common.h
index b9d2b90..0110597 100644
--- a/src/synth_common.h
+++ b/src/synth_common.h
@@ -8,7 +8,7 @@
#define VIZ_BUF 1024
#define WIDTH 1024
-#define HEIGHT 600
+#define HEIGHT 1200
#define MIDI_NOTES 128
diff --git a/src/synth_engine.c b/src/synth_engine.c
deleted file mode 100644
index 34f876a..0000000
--- a/src/synth_engine.c
+++ /dev/null
@@ -1,545 +0,0 @@
-#include "synth_engine.h"
-#include "synth_math.h"
-#include "lowpass.h"
-#include "filter.h"
-#include "control.h"
-#include "sound.h"
-#include "osc.h"
-
-#include <string.h>
-
-float
-sin_sample(float amp, float freq, unsigned long long phase, unsigned int sample_rate)
-{
- return amp * sinf(2.0 * M_PI * freq * ((float)phase / (float)sample_rate));
-}
-
-float
-saw_sample(float amp, float freq, unsigned long long phase, unsigned int sample_rate)
-{
- return amp * (0.17 * (1.0 - (2.0 * M_PI * freq * fmod((float)phase, (float)(sample_rate / (freq)))) / (float)sample_rate));
-}
-
-float
-sawX_sample(float amp, float freq, float sm, unsigned long long phase, unsigned int sample_rate)
-{
- float dOutput = 0.0;
- for (float n = 1.0; n < sm; n++)
- dOutput += (sinf(n * 2.0 * M_PI * freq * ((float)phase / (float)sample_rate))) / n;
- return 0.5 * amp * dOutput;
-}
-
-float
-sqr_sample(float amp, float freq, float duty_cycle, unsigned long long phase, unsigned int sample_rate)
-{
- if (duty_cycle < 0.0001 || duty_cycle > 0.9999) {
- duty_cycle = 0.5;
- }
-
- return (fmod((float)phase / (float)sample_rate, 1.0 / freq) < duty_cycle * (1.0 / freq)) ? amp : -amp;
-}
-
-float
-gen10(float f, unsigned long long phase, float x, unsigned int sample_rate)
-{
- return fmodf(phase, sample_rate/f) / (sample_rate/f);
-}
-
-float
-gen110(float f, unsigned long long phase, float x, unsigned int sample_rate)
-{
- float a = fmodf(phase, sample_rate/f);
- return a > (sample_rate/f) / 2.0f ? 0.9999f : -0.9999f;
-}
-
-float
-gen0(float f, midi_note_t * midi_note, float x, unsigned int sample_rate)
-{
- float sample = osc_sin(midi_note->wvt_index);
- midi_note->wvt_index = osc_sin_next(f, midi_note->wvt_index);
- return sample;
-}
-
-float
-gen1(float f, midi_note_t * midi_note, float x, unsigned int sample_rate)
-{
- float sample = osc_saw(midi_note->wvt_index);
- midi_note->wvt_index = osc_saw_next(f, midi_note->wvt_index);
- return sample;
-}
-
-float
-gen2(float f, midi_note_t * midi_note, float x, unsigned int sample_rate)
-{
- float sample = osc_weird(midi_note->wvt_index);
- midi_note->wvt_index = osc_weird_next(f, midi_note->wvt_index);
- return sample;
-}
-
-float
-gen3(float f, midi_note_t * midi_note, float x, unsigned int sample_rate)
-{
- float sample = osc_tri(midi_note->wvt_index);
- midi_note->wvt_index = osc_tri_next(f, midi_note->wvt_index);
- return sample;
-}
-
-float
-gen4(float f, midi_note_t * midi_note, float x, unsigned int sample_rate)
-{
- float sample = osc_sound(midi_note->wvt_index);
- midi_note->wvt_index = osc_sound_next(f, midi_note->wvt_index);
- return sample;
-}
-
-float
-gen5(float f, midi_note_t * midi_note, float x, unsigned int sample_rate)
-{
- float sample = osc_digisaw(midi_note->wvt_index);
- midi_note->wvt_index = osc_digisaw_next(f, midi_note->wvt_index);
- return sample;
-}
-
-float
-gen6(float f, midi_note_t * midi_note, float x, unsigned int sample_rate)
-{
- float sample = osc_sqr(midi_note->wvt_index);
- midi_note->wvt_index = osc_sqr_next(f, midi_note->wvt_index);
- return sample;
-}
-
-float
-lfo(float f, unsigned long long phase, unsigned int sample_rate) {
- return sin_sample(1, f, phase, sample_rate);
-}
-
-int
-notes_active(synth_t *synth)
-{
- int flag = 0;
-
- for (int i = 0; i < MIDI_NOTES; i++) {
- if (!synth->midi_note[i].active)
- continue;
-
- if (!fix_adsr(&synth->adsr,
- (float)synth->midi_note[i].noteOn,
- (float)synth->midi_note[i].noteOff,
- synth->midi_note[i].elapsed,
- synth->midi_note[i].noteOffSample)
- && synth->midi_note[i].noteOff != 0) {
- synth->midi_note[i].freq = 0;
- synth->midi_note[i].channel = -1;
- synth->midi_note[i].noteOn = -1;
- synth->midi_note[i].noteOff = -1;
- synth->midi_note[i].wvt_index = 0;
- synth->midi_note[i].lfo_index = 0;
- synth->midi_note[i].velocity = -1;
- synth->midi_note[i].elapsed = -1;
- synth->midi_note[i].noteOffSample = 0;
- synth->midi_note[i].active = 0;
- } else {
- flag++;
- }
- }
-
- return flag;
-}
-
-float lfo_index;
-
-float
-make_sample(void *synthData, unsigned int sample_rate, int frame)
-{
- synth_t *synth = (synth_t*)synthData;
- float sample = 0.0f;
-
- float n = notes_active(synth);
- if (n == 0) return sample;
-
- float rms = 0;
- for (int i = 0; i < MIDI_NOTES; i++) {
- if (!synth->midi_note[i].active)
- continue;
-
- rms += synth->midi_note[i].velocity * synth->midi_note[i].velocity;
- }
-
- // if rms == 0 we can deduce there are no notes however notes_active handles
- // stopping any already playing notes and if we remove it we need to make
- // sure that notes stop some other way (it also happens every frame)
- rms = sqrt(rms / (float)n);
- // printf("rms %f\n", rms);
-
- for (int i = 0; i < MIDI_NOTES; i++) {
- if (!synth->midi_note[i].active)
- continue;
-
- float adsr = fix_adsr(&synth->adsr,
- synth->midi_note[i].noteOn,
- synth->midi_note[i].noteOff,
- synth->midi_note[i].elapsed,
- synth->midi_note[i].noteOffSample);
-
- float targ_freq = synth->midi_note[i].freq * cc_iget(&synth->cc_pitch, frame, FRAMES_PER_BUFFER);
- targ_freq = targ_freq + targ_freq *
- cc_iget(&synth->cc_lfo_amp, frame, FRAMES_PER_BUFFER) *
- // (1.05946309436/24.0) *
- osc_sin(synth->midi_note[i].lfo_index);
- //(wvt_next(wvt_tri, (wvt_next(wvt_sound, 2 * cc_iget(&synth->cc_lfo_freq, frame, FRAMES_PER_BUFFER), SAMPLE_RATE, &lfo_index) / 2.0 + 0.5) * cc_iget(&synth->cc_lfo_freq, frame, FRAMES_PER_BUFFER), SAMPLE_RATE, &synth->midi_note[i].lfo_index) / 2.0 + 0.5);
-
- synth->midi_note[i].lfo_index = osc_sin_next(cc_iget(&synth->cc_lfo_freq, frame, FRAMES_PER_BUFFER), synth->midi_note[i].lfo_index);
- /* float synth_sample = synth->osctri->ops->sample(synth->osctri, synth->midi_note[i].wvt_index); */
- /* synth->midi_note[i].wvt_index = synth->osctri->ops->next(synth->osctri, targ_freq, synth->midi_note[i].wvt_index); */
- float synth_sample = synth->gen[synth->geni](targ_freq,
- &synth->midi_note[i],
- synth->x,
- sample_rate);
-
- sample += synth->midi_note[i].velocity * adsr * synth_sample;
- }
-
- /* filter */
- if (synth->filter) {
- // ALLL THE FILTERS
- float cutoff = cc_iget(&synth->cc_cutoff, frame, FRAMES_PER_BUFFER);
- float reso = round(cc_iget(&synth->cc_resonance, frame, FRAMES_PER_BUFFER));
-
- //cutoff = cutoff + cutoff * (synth->lfo.amp) * lfo(cc_iget(&synth->cc_lfo_freq, frame, FRAMES_PER_BUFFER), synth->lfo.elapsed, sample_rate);
- if (cutoff == 0) cutoff = 0.001;
- lpf_update(reso, cutoff, sample_rate);
- sample = lpf_filter(sample);
-
- update_bw_low_pass_filter(synth->fff, SAMPLE_RATE,cutoff, reso);
- sample = bw_low_pass(synth->fff, sample);
- }
-
- sample = synth->gain * sample;
-
- // band stop for high freqs
- sample = bw_band_stop(synth->fff2, sample);
-
- if (synth->clamp) sample = clamp(sample, -1, 1);
-
- return sample;
-}
-
-void
-add_to_viz(synth_t *synth, float sample)
-{
- synth->viz.wave[synth->viz.wi++] = sample;
-
- if (synth->viz.wi >= VIZ_BUF) {
- synth->viz.wi = 0;
- }
-}
-
-void
-add_to_fftviz(synth_t *synth, float sample)
-{
- synth->fftviz.wave[synth->fftviz.wi++] = sample;
-
- if (synth->fftviz.wi >= VIZ_BUF) {
- synth->fftviz.wi = 0;
- }
-}
-
-void
-add_to_delay(synth_t *synth, float sample)
-{
- synth->del[synth->deli++] = sample;
-
- if (synth->deli >= SAMPLE_RATE * 10) {
- synth->deli = 0;
- }
-}
-
-void
-increment_synth(synth_t *synth)
-{
- synth->lfo.elapsed++;
- synth->adsr.elapsed++;
- for (int i = 0; i < MIDI_NOTES; i++) {
- if (!synth->midi_note[i].active)
- continue;
-
- synth->midi_note[i].elapsed++;
- }
-}
-
-void
-get_frame(void *outputBuffer, synth_t *synth, int i)
-{
- float *out = (float*)outputBuffer + 2 * i;
- float s = 0.0f;
-
-
- if (!synth->active) {
- lfo_index = 0;
- }
-
- if (!notes_active(synth)) {
- synth->active = 0;
- lfo_index = 0;
- }
-
- if (!synth->delay) {
- synth->counter = 0;
- }
-
- s = make_sample(synth, SAMPLE_RATE, i);
- synth->counter++;
- if (synth->counter >= (int)(synth->del_time * SAMPLE_RATE * 10)) {
- int idx = (synth->deli - (int)(synth->del_time * SAMPLE_RATE * 10)) % (SAMPLE_RATE * 10);
- float tmp;
- if (idx >= 0) {
- tmp = synth->del[idx];
- } else {
- tmp = synth->del[SAMPLE_RATE * 10 + idx];
- }
-
- s = clamp(s + synth->del_feedback * tmp, -1, 1);
- }
-
- add_to_delay(synth, s);
- *out++ = s;
- *out++ = s;
-
- // move time
- increment_synth(synth);
-
- // viz
- add_to_viz(synth, s);
-}
-
-#include "fftw3.h"
-
-int
-get_spectrum(synth_t * synth, float * buffer)
-{
- int fft_output_len = FRAMES_PER_BUFFER / 2 + 1;
- float input[FRAMES_PER_BUFFER];
-
- for( unsigned long i=0; i < FRAMES_PER_BUFFER * 2; i += 2 ) {
- input[i / 2] = buffer[i];
- }
- fftwf_complex* output = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fft_output_len);
-
- fftwf_plan forward_plan = fftwf_plan_dft_r2c_1d(fft_output_len, input, output, FFTW_ESTIMATE);
-
- fftwf_execute(forward_plan);
-
- for (int i=0; i < fft_output_len - 2*fft_output_len/3; i++ ) {
- add_to_fftviz(synth, sqrt(output[i][0] * output[i][0] + output[i][1] * output[i][1]));
- }
-
- fftwf_destroy_plan(forward_plan);
- fftwf_free(output);
-}
-
-int
-process(synth_t * synth, float * buffer)
-{
- int len = FRAMES_PER_BUFFER;
-
- float buf[FRAMES_PER_BUFFER];
-
- for( unsigned long i=0; i < len * 2; i += 2 ) {
- buf[i / 2] = buffer[i];
- }
-
- fftwf_complex* frequency_signal = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * (len / 2 + 1));
- //double* time_signal = (double*)fftwf_malloc(sizeof(double) * len);
-
- fftwf_plan forward_plan = fftwf_plan_dft_r2c_1d(len, buf, frequency_signal, FFTW_ESTIMATE);
- fftwf_plan backward_plan = fftwf_plan_dft_c2r_1d(len, frequency_signal, buf, FFTW_ESTIMATE);
-
- fftwf_execute(forward_plan);
-
- // cont:
- /* printf("ASDASD!!!\n"); */
- /* for (int i=0; i < (len / 2 + 1); i++ ) { */
- /* if (frequency_signal[i][0] > 1) { */
- /* frequency_signal[i][0] = 0; */
- /* } */
- /* if (frequency_signal[i][1] > 1) { */
- /* frequency_signal[i][1] = 0; */
- /* } */
- /* printf("%f %f | \n", sqrt(frequency_signal[i][0] * frequency_signal[i][0] + frequency_signal[i][1] * frequency_signal[i][1]), atan2(frequency_signal[i][1], frequency_signal[i][0])); */
-
- /* /\* float f = atan2(frequency_signal[i][1], frequency_signal[i][0]); *\/ */
- /* /\* if (f > M_PI / 2 && f < 2 * M_PI / 3) { *\/ */
- /* /\* frequency_signal[i][0] = 0.0; *\/ */
- /* /\* frequency_signal[i][1] = 0.0; *\/ */
- /* /\* } *\/ */
- /* } */
-
- /* printf("ASDASD!!!\n"); */
- fftwf_execute(backward_plan);
-
- for (unsigned long i=0; i < len * 2; i += 2) {
- buffer[i] = buf[i / 2] / len ;
- buffer[i + 1] = buf[i / 2] / len ;
- }
-
- fftwf_destroy_plan(forward_plan);
- fftwf_destroy_plan(backward_plan);
- fftwf_free(frequency_signal);
- //fftwf_free(time_signal);
-
- /* for( unsigned long i=0; i < len * 2; i += 2 ) { */
- /* buf[i / 2] = buffer[i]; */
- /* } */
- /* float kernel[7] = {.01, .88, .21, .36, .21, .13, .01}; */
- /* float res[len + 7 - 1]; */
- /* convole(buf, kernel, len, 7, res); */
-
- /* int N = (len + 7 - 1); */
- /* int M = len; */
-
- /* float ratio = (float) N / M; */
-
- /* for (int i = 0; i < M; i++) { */
- /* int index = (int)(i * ratio); */
- /* buf[i] = res[index]; */
- /* } */
-
- /* for (unsigned long i=0; i < len * 2; i += 2) { */
- /* buffer[i] = buf[i / 2] ; */
- /* buffer[i + 1] = buf[i / 2] ; */
- /* } */
-
- return 0;
-}
-
-int
-sound_gen(const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *synthData)
-{
- synth_t *synth = (synth_t*)synthData;
- float *out = (float*)outputBuffer;
-
- float buffer[2 * FRAMES_PER_BUFFER];
-
- (void) timeInfo;
- (void) statusFlags;
- (void) inputBuffer;
-
- // get_changes();
- for (int i = 0; i < synth->cci; i++) {
- cc_prep(synth->ccs[i]);
- }
- // fill buffer
- for( unsigned long i=0; i<framesPerBuffer; i++ ) {
- // use iget inside
- get_frame(buffer, synth, i);
- }
- // process buffer
- // process(synth, buffer);
- get_spectrum(synth, buffer);
-
- // output buffer
- for( unsigned long i=0; i<framesPerBuffer * 2; i += 2 ) {
- // use iget inside
- *out++ = buffer[i];
- *out++ = buffer[i+1];
- }
- // finalize_changes();
- for (int i = 0; i < synth->cci; i++) {
- cc_fix(synth->ccs[i]);
- }
- return paContinue;
-}
-
-void
-init_synth(synth_t * synth)
-{
- synth->cci = 0;
- CC(synth->cc_cutoff, "cutoff", 10, 5000, 30, 5000);
- CC(synth->cc_resonance, "resonance", 1, 10, .02, 1);
- //CC(synth->cc_lfo_freq, "lfo_freq", .01, 10, .02, 1);
- CC(synth->cc_lfo_freq, "lfo_freq", 1, 1000, 2, 1);
- CC(synth->cc_lfo_amp, "lfo_amp", 0, 1, .01, 0);
- CC(synth->cc_pitch, "pitch", -3, 4, 0.01, 1);
- CC(synth->cc_adsr_a, "attack", 0, 3, 0.05, 0.00);
- CC(synth->cc_adsr_d, "decay", 0, 2, 0.05, 0.3);
- CC(synth->cc_adsr_s, "sustain", 0, 1.0f, 0.05f, 0.7f);
- CC(synth->cc_adsr_r, "release", 0, 5, 0.05f, 0.2f);
-
- synth->modi = 0;
-
- synth->gain = 0.5;
- synth->x = 1;
-
- synth->adsr.a = 0.00001f;
- synth->adsr.peak = 1.0f;
- synth->adsr.d = 0.3;
- synth->adsr.s = 0.7;
- synth->adsr.r = 0.4;
- synth->adsr.elapsed = 0;
-
- synth->lfo.freq = 1.0f;
- synth->lfo.amp = 0.0f;
- synth->lfo.elapsed = 0;
-
- for (int i =0; i<MIDI_NOTES; i++) {
- synth->midi_note[i].freq = 0;
- synth->midi_note[i].channel = -1;
- synth->midi_note[i].noteOn = -1;
- synth->midi_note[i].noteOff = -1;
- synth->midi_note[i].velocity = -1;
- synth->midi_note[i].elapsed = -1;
- synth->midi_note[i].active = 0;
- synth->midi_note[i].wvt_index = 0;
- synth->midi_note[i].lfo_index = 0;
- synth->midi_note[i].adsr = &(synth->adsr);
- }
-
- synth->octave = 3;
-
- synth->delay = 0;
- synth->del[SAMPLE_RATE * 10];
- synth->deli = 0;
- synth->del_time = .1;
- synth->del_feedback = 0.5f;
- synth->counter;
-
- synth->filter = 1;
- synth->clamp = 1;
-
- synth->gen[0] = gen0;
- synth->gen[1] = gen1;
- synth->gen[2] = gen2;
- synth->gen[3] = gen3;
- synth->gen[4] = gen4;
- synth->gen[5] = gen5;
- synth->gen[6] = gen6;
- synth->geni = 3;
-
- synth->active = 0;
-
- synth->viz.sample_rate_divider = 1;
- synth->viz.wi = 0;
- synth->fftviz.sample_rate_divider = 1;
- synth->fftviz.wi = 0;
-
- lpf_init();
- synth->fff = create_bw_low_pass_filter(2, SAMPLE_RATE, 400);
- synth->fff2 = create_bw_band_stop_filter(8, SAMPLE_RATE, 15000, 22000);
-
- init_sound(synth, sound_gen);
-
- synth->osctri = make_tri("triangle");
-}
-
-void
-free_synth(synth_t * synth)
-{
- destroy_sound(synth);
-
- free_bw_low_pass(synth->fff);
- free_bw_band_stop(synth->fff2);
-}
diff --git a/src/synth_engine.h b/src/synth_engine.h
index 5ff7d8d..16c2135 100644
--- a/src/synth_engine.h
+++ b/src/synth_engine.h
@@ -1,17 +1,13 @@
#ifndef SYNTH_ENGINE_H
#define SYNTH_ENGINE_H
-#include <stdlib.h>
-#include <stdio.h>
#include <math.h>
#include <portaudio.h>
#include "synth_common.h"
-#include "notes.h"
#include "filter.h"
#include "adsr.h"
#include "control.h"
-#include "osc.h"
#include "pa_ringbuffer.h"
#ifndef M_PI
diff --git a/src/synth_gui.c b/src/synth_gui.c
index 6f8e06b..cb899db 100644
--- a/src/synth_gui.c
+++ b/src/synth_gui.c
@@ -1,4 +1,5 @@
#include "synth_gui.h"
+#include "osc.h"
#include <portaudio.h>
#define RAYGUI_IMPLEMENTATION
#include "raygui.h"
@@ -113,7 +114,7 @@ keyboard(synth_t * synth)
//note = notes[i % 12][(synth->octave + (i / 12)) % 8];
}
}
-
+
int patates[] = {KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, 0};
synth->modi = 0;
for (int i = 0; patates[i]; i++) {
@@ -121,7 +122,7 @@ keyboard(synth_t * synth)
synth->modifiers[synth->modi++] = patates[i];
}
}
-
+
if (IsKeyDown(265)) { // up
for (int i = 0; i < synth->modi; i++) {
if (synth->modifiers[i] == KEY_Z) {
@@ -246,7 +247,7 @@ draw_adsr(synth_t *synth, int x, int y, int width, int height)
int x_prev = x;
for (int i = 0; i < synth->midi_active_n; i++) {
int rec_y = y + height - 1 +
- 4.5 * floor( (width / 24) *
+ 4.5 * floor( (width / 24.0) *
- fix_adsr(&synth->adsr,
synth->midi_active[i]->noteOn,
synth->midi_active[i]->noteOff,
@@ -280,7 +281,7 @@ draw_wave(synth_t *synth, int x, int y, int width, int height)
col = MAGENTA;
else
col = WHITE;
- DrawPixel(i + x , y + height / 2 + floor(50 * synth->viz.wave_viz_buffer[ii + j]), col);
+ DrawPixel(i + x , y + height / 2 + (int)floor(50.0 * synth->viz.wave_viz_buffer[ii + j]), col);
}
}
/* for (int j = 0; j < 100; j++) { */
@@ -297,13 +298,13 @@ draw_fft(synth_t *synth, int x, int y, int width, int height)
size_t fft_output_len = viz_size / 2 + 1;
fftwf_complex* output = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fft_output_len);
-
+
fftwf_plan forward_plan = fftwf_plan_dft_r2c_1d(fft_output_len, synth->viz.fft_input_buffer, output, FFTW_ESTIMATE);
fftwf_execute(forward_plan);
fftwf_destroy_plan(forward_plan);
-
+
// "Squash" into the Logarithmic Scale
float step = 1.06;
float lowf = 1.0f;
@@ -343,7 +344,7 @@ draw_fft(synth_t *synth, int x, int y, int width, int height)
Color color = ColorFromHSV(hue*360, saturation, value);
Vector2 startPos = {
x + i*cell_width + cell_width/2,
- y + height - height*2/3*t,
+ y + height - height*2/3.0*t,
};
Vector2 endPos = {
x + i*cell_width + cell_width/2,
@@ -394,9 +395,9 @@ draw_osc(synth_t * synth, int x, int y, int width, int height)
if (synth->midi_active_n) {
for (int i = 0; i < width; i++) {
- DrawPixel(i + x , y + height / 2 + floor(height/2 * osc_wave[i] / max), RED);
+ DrawPixel(i + x , y + height / 2.0 + floor(height/2.0 * osc_wave[i] / max), RED);
}
- }
+ }
}
@@ -454,7 +455,7 @@ draw_adsr_graph(synth_t * synth, int x, int y, int width, int height)
for (int i = 0; i < width; i++) {
DrawPixel(i + x , y + height - adsr_graph[i], RED);
}
-
+
for (int i = 0; i < synth->midi_active_n; i++) {
midi_note_t * note = synth->midi_active[i];
int elapsed_samples = note->elapsed;
@@ -486,7 +487,7 @@ draw_signals(synth_t * synth, int x, int y, int width, int height)
synth->viz.rate_divider = GuiSlider((Rectangle){ x + (width / 2.0) / 2, y - 12, width / 2.0, 12 }, "", NULL, synth->viz.rate_divider , 1, 150);
int viz_size = width * synth->viz.rate_divider;
-
+
float samples[RING_SIZE];
int rc = PaUtil_ReadRingBuffer( &synth->viz.wave_buffer, &samples, RING_SIZE);
@@ -531,8 +532,8 @@ draw_signals(synth_t * synth, int x, int y, int width, int height)
}
}
-char * flag = NULL;
-char * flag_circle = NULL;
+char * flag = NULL;
+char * flag_circle = NULL;
void
draw_cc_circle(cc_t * cc, int x, int y, int width, int height) {
@@ -553,15 +554,15 @@ draw_cc_circle(cc_t * cc, int x, int y, int width, int height) {
}
if (dx.y < 0) cc_step(cc, 1*x);
if (dx.y > 0) cc_step(cc, -1*x);
- }
+ }
if (IsMouseButtonReleased(0) && flag_circle == cc->name) {
flag_circle = 0;
}
int min = 110;
int max = 110 + (360+70 - 110) * (cc->target) / (cc->max - cc->min);
- DrawRing((Vector2){x + width/2, y + height/2}, width / 2 - 6, width / 2, min, max, 0, Fade(MAROON, 0.7f));
- DrawCircle(x + width/2, y + height/2, width / 2 - 5, BLACK); // Draw circle sector outline
+ DrawRing((Vector2){x + width/2.0, y + height/2.0}, width / 2.0 - 6, width / 2.0, min, max, 0, Fade(MAROON, 0.7f));
+ DrawCircle(x + width/2, y + height/2, width / 2.0 - 5, BLACK); // Draw circle sector outline
char buf[32];
snprintf(buf, sizeof buf, "%0.2f", cc->target);
@@ -603,7 +604,7 @@ draw_cc_hbar(cc_t * cc, int x, int y, int width, int height) {
char tmp[128] = "";
sprintf(tmp, "%f", cc->value);
ws_send_message(tmp);
- }
+ }
if (IsMouseButtonReleased(0) && flag == cc->name) {
flag = 0;
}
@@ -645,7 +646,7 @@ draw_cc_vbar(cc_t * cc, int x, int y, int width, int height) {
//cc->target = cc->min + cc->max - (cc->min + (cc->max - cc->min) * ((((p.y - y) * (float)1/height) - 0) / (1 - 0)));
cc_set(cc, (cc->min + cc->max - (cc->min + (cc->max - cc->min) * ((((p.y - y) * (float)1/height) - 0) / (1 - 0)))));
}
- }
+ }
if (IsMouseButtonReleased(0) && flag == cc->name) {
flag = 0;
}
@@ -667,7 +668,7 @@ void
draw_bars(synth_t * synth, int x, int y, int width, int height, int offset)
{
int count = 0;
-
+
draw_cc_hbar(&synth->cc_adsr_a , x, y + count++ * (height + offset), width, height);
synth->f_adsr_enabled = GuiCheckBox((Rectangle){ x + width + offset, y + (count - 1) * (height + offset), height, 16 }, "", synth->f_adsr_enabled);
draw_cc_hbar(&synth->cc_adsr_peak , x, y + count++ * (height + offset), width, height);
@@ -696,7 +697,7 @@ rayrun(synth_t *synth){
int old_soundcard_id = synth->soundcard_id;
int old_midi_device_id = synth->midi_device_id;
- InitWindow(WIDTH, HEIGHT, "Raylib synth");
+ InitWindow(WIDTH, HEIGHT, "Raylib synth");
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
while (!WindowShouldClose()) {
keyboard(synth);
@@ -735,7 +736,7 @@ rayrun(synth_t *synth){
synth->wvt_pos = GuiSlider((Rectangle){WIDTH / 2.0 - 108, 150 + 42 + 42, 216, 24 }, "", buf, synth->wvt_pos , 0, 127);
set_sound_start(synth->wvt_pos*2048);
set_sound_len(synth->wvt_pos*2048 + 2048);
-
+
draw_bars(synth, 20, 20, 200, 16, 3);
draw_text(synth, WIDTH / 2 - 108, 20);
@@ -765,7 +766,7 @@ rayrun(synth_t *synth){
synth->clamp = GuiToggle((Rectangle){ WIDTH - 100 - 50, 50 + 24 + 6 + 24 + 6, 100, 24 }, "clamp", synth->clamp);
synth->delay = GuiToggle((Rectangle){ WIDTH - 100 - 50, 50 + 24 + 6 + 24 + 6 + 24 + 6, 100, 24 }, "delay", synth->delay);
-
+
if ( GuiButton((Rectangle){ WIDTH - 100 - 50, 50 + 24 + 6 + 24 + 6 + 24 + 6 + 24 + 6 + 24 + 6, 100, 24 }, "SAVE!")) {
save_synth(synth, "asdas");
}
@@ -773,7 +774,7 @@ rayrun(synth_t *synth){
if ( GuiButton((Rectangle){ WIDTH - 100 - 50, 50 + 24 + 6 + 24 + 6 + 24 + 6 + 24 + 6 + 24 + 6 + 24 + 6, 100, 24 }, "LOAD!")) {
load_synth(synth, "asdas");
}
-
+
static int edit_midi = 0;
static int edit_sound = 0;
diff --git a/src/web.c b/src/web.c
index e23d8b2..3a65850 100644
--- a/src/web.c
+++ b/src/web.c
@@ -104,6 +104,10 @@ enum MHD_Result handle_request(void *cls, struct MHD_Connection *connection,
const char *url, const char *method,
const char *version, const char *upload_data,
size_t *upload_data_size, void **con_cls) {
+ (void)version;
+ (void)upload_data;
+ (void)upload_data_size;
+ (void)con_cls;
struct MHD_Response *response;
enum MHD_Result ret;
@@ -126,7 +130,7 @@ enum MHD_Result handle_request(void *cls, struct MHD_Connection *connection,
MHD_destroy_response(response);
return ret;
}
-
+
response = MHD_create_response_from_buffer(strlen(html_content), (void *)html_content, MHD_RESPMEM_PERSISTENT);
ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
MHD_destroy_response(response);
@@ -136,6 +140,7 @@ enum MHD_Result handle_request(void *cls, struct MHD_Connection *connection,
// Callback to handle WebSocket events
static int callback_ws(struct lws *wsi, enum lws_callback_reasons reason,
void *user, void *in, size_t len) {
+ (void)user;
char buf[10000] = "";
char tmp[10000] = "";
switch (reason) {
@@ -175,10 +180,10 @@ static int callback_ws(struct lws *wsi, enum lws_callback_reasons reason,
lws_write(wsi, (unsigned char *)buf, strlen(buf), LWS_WRITE_HTTP);
return -1;
break;
- }
+ }
case LWS_CALLBACK_CLOSED: {
printf("WebSocket connection closed with client: %p\n", wsi);
- }
+ }
default:
break;
}
@@ -187,12 +192,13 @@ static int callback_ws(struct lws *wsi, enum lws_callback_reasons reason,
// Thread function to run the WebSocket server
void *websocket_server_thread(void *arg) {
+ (void)arg;
struct lws_context_creation_info info;
struct lws_context *context;
struct lws_protocols protocols[] = {
//{ "http-only", callback_http, 0, 0 },
- { "ws", callback_ws, 0, 128 },
- { NULL, NULL, 0, 0 } // Terminator
+ { "ws", callback_ws, 0, 128, 0, 0, 0 },
+ { NULL, NULL, 0, 0, 0, 0, 0 } // Terminator
};
memset(&info, 0, sizeof(info));
@@ -251,7 +257,7 @@ void ws_send_message(const char *message) {
memcpy(&buffer[LWS_PRE], message, msg_len);
lws_write(client_wsi, &buffer[LWS_PRE], msg_len, LWS_WRITE_TEXT);
printf("[WS]: Sent <<%s>>\n", message);
-
+
//lws_write(client_wsi, (unsigned char *)message, strlen(message), LWS_WRITE_TEXT);
}
}