44 lines
1.1 KiB
C
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);
|