#include "synth_common.h" #include "osc.h" #include #include #include float osc_interpolate(float offset, float start, float end) { // linear interpolation between start and end float m = (end - start) / (1 - 0); float b = start /* + m * 0 */; // the value to pick float x = offset - (int)offset; return m * x + b; } int osc_next_index(osc_t * osc, float offset) { if (offset >= osc->len) offset = fmodf(osc->start + offset, osc->len - osc->start); if (offset < osc->start) offset = osc->start + fmodf(osc->start + offset, osc->len - osc->start); int current_index = (int)offset; return current_index + 1 >= osc->len ? osc->start : current_index + 1; } float osc_next_offset(osc_t * osc, float f, float offset) { if (offset >= osc->len) offset = fmodf(osc->start + offset, osc->len - osc->start); if (offset < osc->start) offset = osc->start + fmodf(osc->start + offset, osc->len - osc->start); if (osc->type == SAMPLE) { // this makes A2 be the base ??? // A2 = 220.0 Hz is base ??? // get this from osc* f = f / (16.35160 * pow(2, (2 + 5 / 12.0))); } float step = f * ((osc->len - osc->start) / (float)SAMPLE_RATE); offset += step; if (offset >= osc->len) { offset -= osc->len; } return offset; } int osc_load_wav(osc_t * osc, const char * path) { SNDFILE* file; SF_INFO fileInfo; int numSamplesRead; // Open the WAV file file = sf_open(path, SFM_READ, &fileInfo); if (!file) { printf("Failed to open the WAV file: %s\n", sf_strerror(NULL)); return -1; } printf("Opened %s: \n", path); printf("frames: %ld sr: %d chan: %d format: %d sections: %d seekable: %d\n", fileInfo.frames, fileInfo.samplerate, fileInfo.channels, fileInfo.format, fileInfo.sections, fileInfo.seekable); // Ensure the WAV file has only one channel if (fileInfo.channels != 1) { printf("Only mono WAV files are supported.\n"); sf_close(file); return -1; } osc->len = fileInfo.frames; osc->data = (float *) malloc(sizeof(float) * fileInfo.frames); // Read the WAV file into the buffer numSamplesRead = sf_readf_float(file, osc->data, fileInfo.frames); /* float max = -1000; */ /* float min = 1000; */ /* for (int i = 0; i < numSamplesRead; i++) { */ /* float s = osc_sound_data[i]; */ /* // printf("Sample %d: %f\n", i, s); */ /* if (s < min) min = s; */ /* if (s > max) max = s; */ /* } */ /* printf("Min: %f Max: %f\n", min, max); */ // Close the WAV file sf_close(file); return 0; }