summaryrefslogblamecommitdiffstats
path: root/src/synth_engine.h
blob: 5ff7d8d33f6ce31119a016266c245362de7f83a8 (plain) (tree)
1
2
3
4
5
6
7
8
9







                      
                         

                   
                 
                    
                
                          
 
            
                         

      

                       


                      
                             
        
 





                               

                  
                             
                                   



                



                       
                         

















                               
 

              
                
                   
 

              

                  
 



                    
                  
                 
                    


                 
               








                      

          
                                    

                                        
 
              
                
 

            

             
            
              
           

                       
                             

                     
             


                   

            


                    
                                                                                           


                 
                   
 
             
                   



                     
                

                       

          
                       





                                                 

                           
#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
#define M_PI (3.14159265)
#endif

#define RING_SIZE 65536

typedef struct lfo_t {
  float freq;
  float amp;
  unsigned long long elapsed;
} lfo_t;

typedef struct midi_note_t {
  float freq;
  int channel;
  PaTime noteOn;
  PaTime noteOff;
  float velocity; // normalized
  float wvt_index;
  float lfo_index;
  unsigned long long elapsed;
  unsigned long long noteOffSample;
  adsr_t * adsr;
  int active;
} midi_note_t;

typedef struct {
  int spectrum_enabled;
  int wave_enabled;
  int adsr_enabled;
  int adsr_graph_enabled;
  int osc_enabled;
  int freeze;
  int rate_divider;

  float *wave_buffer_data;
  PaUtilRingBuffer wave_buffer;

  float *fft_buffer_data;
  PaUtilRingBuffer fft_buffer;

  float *tmp_buffer;
  float *wave_viz_buffer;
  float *fft_input_buffer;
  float *fft_output_buffer;
  float *fft_smooth_buffer;

  int tmp_index;
} synth_viz;

struct midi_t;

typedef struct {
  PaStream *stream;

  int wvt_pos;

  cc_t * ccs[128];
  int cci;

  cc_t cc_pitch;
  cc_t cc_cutoff;
  cc_t cc_resonance;
  cc_t cc_lfo_freq;
  cc_t cc_lfo_amp;
  cc_t cc_adsr_a;
  cc_t cc_adsr_peak;
  cc_t cc_adsr_d;
  cc_t cc_adsr_s;
  cc_t cc_adsr_r;
  cc_t cc_gain;

  cc_t cc_f_adsr_a;
  cc_t cc_f_adsr_peak;
  cc_t cc_f_adsr_d;
  cc_t cc_f_adsr_s;
  cc_t cc_f_adsr_r;

  int autogain;

  float x;

  midi_note_t midi_note[MIDI_NOTES];
  midi_note_t * midi_active[MIDI_NOTES];
  int midi_active_n;

  adsr_t adsr;
  adsr_t f_adsr;

  lfo_t lfo;

  int octave;

  int delay;
  float * del;
  int deli;
  cc_t cc_del_time;
  cc_t cc_del_feedback;
  unsigned long long counter;

  int f_adsr_enabled;
  int filter;
  int biquad;
  char biquad_type;

  int clamp;

  int modifiers[16];
  int modi;

  float (*gen[7]) (float freq, midi_note_t * midi_note, float x, unsigned int sample_rate);
  int geni;

  BWLowPass* fff;
  BWBandStop* fff2;

  int active;
  int sound_active;

  int soundcard_id;
  int midi_device_id;

  synth_viz viz;

  struct midi_t * midi;
} synth_t;

synth_t * init_synth();
void free_synth(synth_t *synth);
void change_soundcard(synth_t *synth);
void change_midi_device(synth_t *synth);

int save_synth(synth_t *synth, const char *path);
int load_synth(synth_t *synth, const char *path);

#endif /* SYNTH_ENGINE_H */