chord/audio.h
2024-05-15 07:36:04 -05:00

44 lines
1.1 KiB
C

#pragma once
#include<ctype.h>
#include<fcntl.h>
#include<math.h>
#include<portaudio.h>
#include<stdbool.h>
#include<stdint.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<unistd.h>
typedef struct Audio
{
size_t samplerate;
size_t nsamples;
size_t channels;
uint16_t*data;
} Audio;
Audio aud_new(size_t samplerate,size_t nsamples,size_t channels);
void aud_free(Audio*aud);
// Audio data manipulation
#define PI 3.141592653589793
#define SEMITONE_CONSTANT 1.0594630943592953 // pow(2,1/12.0)
#define raisesemitone(freq,nsemitones) ((freq)*pow(SEMITONE_CONSTANT,(nsemitones)))
// Generate chord in Audio struct
// starting at base freq, and using
// all specified semitone intervals
#define makechord(aud,freq,...) do{double _f=(freq);int _l[]={__VA_ARGS__};aud_tri((aud),_f,GEN);for(size_t i=0;i<sizeof(_l)/sizeof(int);++i)aud_tri((aud),raisesemitone(_f,_l[i]),ADD);}while(0)
enum{GEN,ADD};
void aud_avg(Audio*aud,size_t blocksize);
void aud_env(Audio*aud);
void aud_rnd(Audio*aud,size_t mode);
void aud_sine(Audio*aud,double freq,size_t mode);
void aud_tri(Audio*aud,double freq,size_t mode);
void aud_zero(Audio*aud);