From 57e22e10bda788512d4503c7579d20b0bab1b2b4 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 14 Mar 2023 04:49:09 +0000 Subject: [PATCH] birds read --- projects/birds | Bin 0 -> 57600 bytes projects/birds.c | 148 ++++++++++++++++++++++++++++++++++++++++++----- submodules/SDL | 2 +- 3 files changed, 136 insertions(+), 14 deletions(-) create mode 100755 projects/birds diff --git a/projects/birds b/projects/birds new file mode 100755 index 0000000000000000000000000000000000000000..339fe0c920d1c047ab2c6bf34e949d92ca5356ef GIT binary patch literal 57600 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 G@xK8``N5q4 literal 0 HcmV?d00001 diff --git a/projects/birds.c b/projects/birds.c index 95d9249..09de9f0 100644 --- a/projects/birds.c +++ b/projects/birds.c @@ -27,6 +27,7 @@ * */ +//#define RANDOM_BIRD //#define SINE_ACCURATE #ifdef SINE_ACCURATE @@ -112,15 +113,18 @@ static void vg_dsp_process( float *stereo_in, float *stereo_out ); struct synth_bird { - int harmonic_4[4]; + int harmonic_4[4], + fm_oscillator; + float poly; + int x,a,l,v, frame; - int frame,length; + int pattern_length; struct synth_bird_signature { float c0, c1, c2, c3, length, pause; - int lfo_hz, - fm; /* lfo modulation depth (+/- hz) */ + int lfo_hz; + float fm; /* lfo modulation depth (+/- hz) */ } pattern[]; }; @@ -146,14 +150,16 @@ static int birdsynth_pattern_count_signatures( const char *pattern ) static void birdsynth_pattern_decode( struct synth_bird *bird, const char *pattern ) { - bird->length = 0; + bird->pattern_length = 0; const char *c = pattern; while( *c ) { if( *c == '{' ) { - struct synth_bird_signature *sig = &bird->pattern[ bird->length ++ ]; + struct synth_bird_signature *sig = + &bird->pattern[ bird->pattern_length ++ ]; + sig->c0 = 3000.0f; sig->c1 = -800.0f; sig->c2 = 1500.0f; @@ -161,11 +167,13 @@ static void birdsynth_pattern_decode( struct synth_bird *bird, sig->length = 0.5f; sig->pause = 0.1f; sig->lfo_hz = 30; - sig->fm = 100; + sig->fm = 10.0f; - sscanf( c, "{%f,%f,%f,%f,%f,%f,%d,%d}", +#if 0 + sscanf( c, "{%f,%f,%f,%f,%f,%f,%d,%f}", &sig->c0, &sig->c1, &sig->c2, &sig->c3, &sig->length, &sig->pause, &sig->lfo_hz, &sig->fm ); +#endif } c ++; @@ -180,18 +188,113 @@ static struct synth_bird *birdsynth_malloc_create( const char *pattern ) struct synth_bird *bird = malloc( sizeof(struct synth_bird) + s * sizeof(struct synth_bird_signature) ); - + birdsynth_pattern_decode( bird, pattern ); + + bird->harmonic_4[0] = 0; + bird->harmonic_4[1] = 0; + bird->harmonic_4[2] = 0; + bird->harmonic_4[3] = 0; + bird->fm_oscillator = 0; + bird->poly = 0.0f; + bird->x = 0; + bird->a = 1; + bird->l = bird->pattern[0].length * 44100.0f; + bird->v = 0; + bird->frame = 0; + return bird; } +static void synthbird_generate_samples( struct synth_bird *bird, + float *stereo_buffer, int samples ) +{ + for( int _=0; _x ++; + if( bird->x >= bird->l ) + { + if( bird->a ) + { + bird->a = 0; + bird->l = bird->pattern[ bird->frame ].pause * 44100.0f; + } + else + { + bird->frame ++; + + if( bird->frame >= bird->pattern_length ) + bird->frame = 0; + + bird->a = 1; + bird->l = bird->pattern[ bird->frame ].length * 44100.0f; + } + + bird->x = 0; + } + + if( bird->a ) + { + bird->v += 40; + if( bird->v > 44100 ) bird->v = 44100; + } + else + { + bird->v -= 40; + if( bird->v < 0 ) bird->v = 0; + } + + struct synth_bird_signature *sig = &bird->pattern[ bird->frame ]; + + sig->c0 = 3000.0f; + sig->c1 = -800.0f; + sig->c2 = 1500.0f; + sig->c3 = -860.0f; + sig->length = 0.5f; + sig->pause = 0.1f; + sig->lfo_hz = 30; + sig->fm = 10.0f; + float level = bird->v; + level *= (1.0f/44100.0f); + + if( bird->a ) + { + float t = ((float)bird->x * (1.0f/(float)bird->l))*2.0f - 1.0f, + tt = t*t, + ttt = tt*t; + + bird->poly = sig->c0 + t*sig->c1 + tt*sig->c2 + ttt*sig->c3; + } + + bird->fm_oscillator = WRAP1S( bird->fm_oscillator + sig->lfo_hz ); + float fm = sine_44100_1( bird->fm_oscillator ) * sig->fm; + + int freq = bird->poly + fm; + bird->harmonic_4[0] = WRAP1S( bird->harmonic_4[0] + freq*1 ); + bird->harmonic_4[1] = WRAP1S( bird->harmonic_4[1] + freq*2 ); + bird->harmonic_4[2] = WRAP1S( bird->harmonic_4[2] + freq*3 ); + bird->harmonic_4[3] = WRAP1S( bird->harmonic_4[3] + freq*4 ); + + float v[4]; + sine_44100_4( bird->harmonic_4, v ); + float s = v[0] + + v[1] * 0.5f + + v[2] * 0.25f + + v[3] * 0.125f; + + s *= level; + + stereo_buffer[ _*2+0 ] = s; + stereo_buffer[ _*2+1 ] = s; + } +} + int main( int argc, char *argv[] ) { vg_dsp_init(); - struct synth_bird *bird = birdsynth_malloc_create( "" ); - - int f0=2500, o1=0, f1=30; +#if RANDOM_BIRD + int f0=4500, o1=0, f1=30; int adsr=0; int o0[4]={0,0,0,0}; @@ -265,7 +368,25 @@ int main( int argc, char *argv[] ) s0 *= level; float stereo[2] = { s0, s0 }; - //vg_dsp_process( stereo, stereo ); + vg_dsp_process( stereo, stereo ); + + int16_t l = stereo[0] * 10000.0f, + r = stereo[1] * 10000.0f; + + fwrite( &l, 2,1, stdout ); + fwrite( &r, 2,1, stdout ); + } +#else + + struct synth_bird *bird = birdsynth_malloc_create( "" ); + + for(int _=0;_<44100*60;_++){ + float stereo[2] = { 0.0f, 0.0f }; + + synthbird_generate_samples( bird, stereo, 1 ); +#if 0 + vg_dsp_process( stereo, stereo ); +#endif int16_t l = stereo[0] * 10000.0f, r = stereo[1] * 10000.0f; @@ -273,6 +394,7 @@ int main( int argc, char *argv[] ) fwrite( &l, 2,1, stdout ); fwrite( &r, 2,1, stdout ); } +#endif } diff --git a/submodules/SDL b/submodules/SDL index eef4d3c..06492c5 160000 --- a/submodules/SDL +++ b/submodules/SDL @@ -1 +1 @@ -Subproject commit eef4d3c86a653f91b7221c80809ba8ab56f94cf1 +Subproject commit 06492c598158cf825a18aececaf7511d7fd04f48 -- 2.25.1