summaryrefslogblamecommitdiffstats
path: root/src/osc.c
blob: 384f0023f95b53baf931c38ac33e7dd6b26b4aa5 (plain) (tree)















































































                                                                                                                                                                                               
                                      















                                                                    
#include "synth_common.h"
#include "osc.h"

#include <sndfile.h>
#include <stdlib.h>
#include <stddef.h>


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 = 0;

  int current_index = (int)offset;
  return current_index + 1 >= osc->len ? 0 : current_index + 1;
}


float
osc_next_offset(osc_t * osc, float f, float offset)
{
  if (offset >= osc->len) offset = 0;

  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 * ((float)osc->len / 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->end = 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;
}