summaryrefslogblamecommitdiffstats
path: root/src/synth_engine.h
blob: e35e8fb574fa47e2ad06cf57fe6e1f50d30ced68 (plain) (tree)












































































                                                                                                
#ifndef SYNTH_ENGINE_H
#define SYNTH_ENGINE_H

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <portaudio.h>

#include "notes.h"
#include "filter.h"

#define SAMPLE_RATE   (44100)
//#define SAMPLE_RATE   (48000)
#define FRAMES_PER_BUFFER  (210)

#define WIDTH 1024
#define HEIGHT 600

#ifndef M_PI
#define M_PI  (3.14159265)
#endif


typedef struct {
  float a;
  float d;
  float s;
  float r;
  unsigned long long elapsed;
} adsr_t;

typedef struct {
  float freq;
  PaTime noteOn;
  PaTime noteOff;
  int key;
  unsigned long long elapsed;
} note_t;

typedef struct {
  int sample_rate_divider;
} viz_t;

typedef struct {
  float freq_offset;
  float gain;
  float x;

  note_t n;
  adsr_t adsr;

  int octave;

  int multi;
  int filter;
  float cutoff;
  float resonance;
  int clamp;

  float (*gen[4]) (float freq, unsigned long long phase, float x, unsigned int sample_rate);
  int geni;

  BWLowPass* fff;

  viz_t viz;
} synth_t;

float adsr_amplitude(void *synthData, unsigned long long elapsed);
float make_sample(unsigned long long phase, void *synthData, unsigned int sample_rate, int viz);
void init_synth(synth_t * synth);
int sound_gen(const void *inputBuffer, void *outputBuffer,
              unsigned long framesPerBuffer,
              const PaStreamCallbackTimeInfo* timeInfo,
              PaStreamCallbackFlags statusFlags,
              void *synthData);

#endif /* SYNTH_ENGINE_H */