working sinusoid patch

This commit is contained in:
Miller Puckette 2021-07-07 14:50:10 -07:00
parent f34cb75ab1
commit 44c02f82ac
4 changed files with 115 additions and 33 deletions

View file

@ -22,6 +22,10 @@ set(COMPONENT_SRCS "weasel.c fifostream.c pdmain.c \
../pd/src/d_resample.c \ ../pd/src/d_resample.c \
../pd/src/d_soundfile.c \ ../pd/src/d_soundfile.c \
../pd/src/d_global.c \ ../pd/src/d_global.c \
../pd/src/d_osc.c \
../pd/src/d_ctl.c \
../pd/src/d_arithmetic.c \
../pd/src/d_dac.c \
../pd/src/x_arithmetic.c \ ../pd/src/x_arithmetic.c \
../pd/src/x_connective.c \ ../pd/src/x_connective.c \
../pd/src/x_interface.c \ ../pd/src/x_interface.c \

View file

@ -10,7 +10,12 @@
#include "audio_type_def.h" #include "audio_type_def.h"
static const char *TAG = "fifostream"; static const char *TAG = "fifostream";
#define BUF_SIZE (100) #define CHANS 2
#define INCHANS CHANS
#define OUTCHANS CHANS
#define BLKSIZE 64
#define BLK_BYTES (BLKSIZE*CHANS*sizeof(short))
extern void pdmain_tick( void); extern void pdmain_tick( void);
typedef struct fifostream { typedef struct fifostream {
@ -40,12 +45,12 @@ static esp_err_t fifostream_open(audio_element_handle_t self)
fifostream->channel = info.channels; fifostream->channel = info.channels;
} }
fifostream->at_eof = 0; fifostream->at_eof = 0;
fifostream->s_buf = (short *)calloc(sizeof(short), BUF_SIZE/2); fifostream->s_buf = (short *)calloc(sizeof(short), BLK_BYTES/sizeof(short));
if (fifostream->s_buf == NULL) { if (fifostream->s_buf == NULL) {
ESP_LOGE(TAG, "calloc buffer failed. (line %d)", __LINE__); ESP_LOGE(TAG, "calloc buffer failed. (line %d)", __LINE__);
return ESP_ERR_NO_MEM; return ESP_ERR_NO_MEM;
} }
memset(fifostream->s_buf, 0, BUF_SIZE); memset(fifostream->s_buf, 0, BLK_BYTES);
return ESP_OK; return ESP_OK;
} }
@ -61,13 +66,54 @@ static esp_err_t fifostream_close(audio_element_handle_t self)
return ESP_OK; return ESP_OK;
} }
int phaseinc = 123;
#define INCHANS 2
#define OUTCHANS 2
#define BLKSIZE 64
float soundin[OUTCHANS * BLKSIZE], soundout[OUTCHANS * BLKSIZE]; float soundin[OUTCHANS * BLKSIZE], soundout[OUTCHANS * BLKSIZE];
#if 0 /* better one that doesn't work for some reason */
static int fifostream_process(audio_element_handle_t self, char *in_buffer,
int in_len)
{
static int cumsamps = 0;
fifostream_t *fifostream = (fifostream_t *)audio_element_getdata(self);
int ret = 0;
int r_size = (fifostream->at_eof ? 0 :
audio_element_input(self, (char *)fifostream->s_buf, BLK_BYTES));
if (r_size >= BLK_BYTES)
{
int i, nsamps = BLKSIZE;
fifostream->byte_num += BLK_BYTES;
for (i = 0; i < BLKSIZE; i+= 2)
{
soundin[i] = fifostream->s_buf[i]/32768;;
soundin[BLKSIZE+i] = fifostream->s_buf[i+1]/32768;
}
pdmain_tick();
for (i = 0; i < BLKSIZE; i+= 2)
{
int ch1 = 32767*soundout[i], ch2 = 32767*soundout[BLKSIZE+i];
if (ch1 > 32767)
ch1 = 32767;
else if (ch1 < -32768)
ch1 = -32768;
if (ch2 > 32767)
ch2 = 32767;
else if (ch2 < -32768)
ch2 = -32768;
fifostream->s_buf[i] = (short)ch1;
fifostream->s_buf[i+1] = (short)ch2;
}
ret = audio_element_output(self, (char *)fifostream->s_buf, BLK_BYTES);
}
else
{
fifostream->at_eof = 1;
ret = 0;
}
return ret;
}
#endif
#if 1
static int fifostream_process(audio_element_handle_t self, char *in_buffer, int in_len) static int fifostream_process(audio_element_handle_t self, char *in_buffer, int in_len)
{ {
static int cumsamps = 0; static int cumsamps = 0;
@ -75,35 +121,48 @@ static int fifostream_process(audio_element_handle_t self, char *in_buffer, int
int ret = 0; int ret = 0;
int r_size = 0; int r_size = 0;
if (fifostream->at_eof == 0) { if (fifostream->at_eof == 0) {
r_size = audio_element_input(self, (char *)fifostream->s_buf, BUF_SIZE); r_size = audio_element_input(self, (char *)fifostream->s_buf, BLK_BYTES);
} }
if (r_size > 0) { if (r_size > 0) {
if (r_size != BUF_SIZE) { if (r_size != BLK_BYTES) {
fifostream->at_eof = 1; fifostream->at_eof = 1;
} }
fifostream->byte_num += r_size; fifostream->byte_num += r_size;
{ {
int i, nsamps = r_size/sizeof(short); int i, nsamps = r_size/(2*sizeof(short));
static int phase; static int phase;
if (nsamps * 2 * sizeof(short) != r_size)
ESP_LOGE("WOMBAT", "odd sample frame size %d", r_size);
for (i = 0; i < nsamps; i++) for (i = 0; i < nsamps; i++)
{ {
phase += phaseinc ; int ch1 = 32767*soundout[i], ch2 = 32767*soundout[BLKSIZE+i];
fifostream->s_buf[i] = (phase >> 3); if (ch1 > 32767)
} ch1 = 32767;
else if (ch1 < -32768)
cumsamps += nsamps; ch1 = -32768;
while (cumsamps >= 128) if (ch2 > 32767)
{ ch2 = 32767;
pdmain_tick(); else if (ch2 < -32768)
cumsamps -= 128; ch2 = -32768;
soundin[phase] = fifostream->s_buf[2*i]/32768;
fifostream->s_buf[2*i] = ch1;
soundin[BLKSIZE+phase] = fifostream->s_buf[2*i+1]/32768;
fifostream->s_buf[2*i+1] = ch2;
phase++;
if (phase == BLKSIZE)
{
pdmain_tick();
phase = 0;
}
} }
} }
ret = audio_element_output(self, (char *)fifostream->s_buf, BUF_SIZE); ret = audio_element_output(self, (char *)fifostream->s_buf, BLK_BYTES);
} else { } else {
ret = r_size; ret = r_size;
} }
return ret; return ret;
} }
#endif
audio_element_handle_t fifostream_init(fifostream_cfg_t *config) audio_element_handle_t fifostream_init(fifostream_cfg_t *config)
{ {

View file

@ -17,14 +17,30 @@ extern t_printhook sys_printhook;
void pdmain_print( const char *s); void pdmain_print( const char *s);
#if 0
static const char patchfile[] = "\ static const char patchfile[] = "\
canvas 274 279 752 643 12;\n\ canvas 274 279 752 643 12;\n\
#X obj 123 146 loadbang;\n\ #X obj 123 146 loadbang;\n\
#X obj 123 171 metro 10000;\n\ #X obj 123 171 metro 1000;\n\
#X obj 123 196 print poodle;\n\ #X obj 123 196 print poodle;\n\
#X connect 0 0 1 0;\n\ #X connect 0 0 1 0;\n\
#X connect 1 0 2 0;\n\ #X connect 1 0 2 0;\n\
"; ";
#endif
static const char patchfile[] = "\
canvas 0 50 604 482 12;\n\
#X obj 179 99 r foo;\n\
#X obj 179 124 osc~ 880;\n\
#X obj 179 149 dac~ 1;\n\
#X obj 257 127 osc~ 880;\n\
#X obj 257 102 r foo2;\n\
#X obj 257 151 dac~ 2;\n\
#X connect 0 0 1 0;\n\
#X connect 1 0 2 0;\n\
#X connect 3 0 5 0;\n\
#X connect 4 0 3 0;\n\
";
static void trymem(int foo) static void trymem(int foo)
{ {
@ -70,16 +86,19 @@ void pd_poll_bt( void)
} }
} }
extern float soundin[], soundout[];
void pdmain_init( void) void pdmain_init( void)
{ {
t_binbuf *b; t_binbuf *b;
sys_printhook = pdmain_print; sys_printhook = pdmain_print;
trymem(1); // 111 trymem(1); // 111
trymem(2);
pd_init(); pd_init();
trymem(100); // 47 trymem(2); // 47
STUFF->st_dacsr = sys_getsr(); STUFF->st_dacsr = sys_getsr();
STUFF->st_soundout = soundout;
STUFF->st_soundin = soundin;
b = binbuf_new(); b = binbuf_new();
@ -102,6 +121,7 @@ void pdmain_tick( void)
pdmain_init(); pdmain_init();
initted = 1; initted = 1;
} }
memset(soundout, 0, 128*sizeof(float));
pd_poll_bt(); pd_poll_bt();
sched_tick(); sched_tick();
} }
@ -110,13 +130,11 @@ void pdmain_tick( void)
t_class *glob_pdobject; t_class *glob_pdobject;
extern int phaseinc;
static void glob_foo(void *dummy, t_floatarg f) static void glob_foo(void *dummy, t_floatarg f)
{ {
post("foo %f", f); post("foo %f", f);
phaseinc = f;
} }
void glob_dsp(void *dummy, t_symbol *s, int argc, t_atom *argv); void glob_dsp(void *dummy, t_symbol *s, int argc, t_atom *argv);
void glob_init( void) void glob_init( void)
@ -207,15 +225,15 @@ void conf_init(void)
d_global_setup(); d_global_setup();
d_soundfile_setup(); d_soundfile_setup();
d_ugen_setup(); d_ugen_setup();
d_dac_setup();
d_ctl_setup();
d_osc_setup();
trymem(11); trymem(11);
} }
/* /*
d_osc_setup();
d_arithmetic_setup(); d_arithmetic_setup();
d_array_setup(); d_array_setup();
d_ctl_setup();
d_dac_setup();
d_delay_setup(); d_delay_setup();
d_filter_setup(); d_filter_setup();
d_math_setup(); d_math_setup();
@ -226,7 +244,7 @@ void conf_init(void)
/* ------- STUBS that do nothing ------------- */ /* ------- STUBS that do nothing ------------- */
int sys_get_outchannels(void) {return(2); } int sys_get_outchannels(void) {return(2); }
int sys_get_inchannels(void) {return(2); } int sys_get_inchannels(void) {return(2); }
float sys_getsr( void) {return (48000);} float sys_getsr( void) {return (44100);}
int sys_getblksize(void) { return (DEFDACBLKSIZE); } int sys_getblksize(void) { return (DEFDACBLKSIZE); }
int pd_compatibilitylevel = 100; int pd_compatibilitylevel = 100;
@ -956,7 +974,8 @@ double sys_getrealtime(void)
(1./1000000.) * (now.tv_usec - then.tv_usec)); (1./1000000.) * (now.tv_usec - then.tv_usec));
} }
/* -------------- DSP basics --------------- */ #if 0
/* -------------- DSP basics - LATER move to d_ugen.c --------------- */
t_int *plus_perform(t_int *w) t_int *plus_perform(t_int *w)
{ {
@ -1080,6 +1099,7 @@ void dsp_add_scalarcopy(t_float *in, t_sample *out, int n)
else else
dsp_add(sig_tilde_perf8, 3, in, out, (t_int)n); dsp_add(sig_tilde_perf8, 3, in, out, (t_int)n);
} }
#endif
/* ------------------ g_traversal.c --------------- */ /* ------------------ g_traversal.c --------------- */

View file

@ -330,7 +330,6 @@ void app_main()
esp_bt_pin_code_t pin_code; esp_bt_pin_code_t pin_code;
esp_bt_gap_set_pin(pin_type, 0, pin_code); esp_bt_gap_set_pin(pin_type, 0, pin_code);
/* pdmain_init(); */
audio_main(); audio_main();
} }