From 3d52e114a0f608e58bc99cfc6faaeb41cfcf84c7 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 14 Mar 2023 08:08:58 +0000 Subject: [PATCH] birds --- projects/birds | Bin 57600 -> 20976 bytes projects/birds.c | 132 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 93 insertions(+), 39 deletions(-) diff --git a/projects/birds b/projects/birds index 339fe0c920d1c047ab2c6bf34e949d92ca5356ef..9c38f4e24e0d4c6f3a6f4a254895ab6908af49af 100755 GIT binary patch literal 20976 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 G@xK8``N5q4 diff --git a/projects/birds.c b/projects/birds.c index 09de9f0..a015fe6 100644 --- a/projects/birds.c +++ b/projects/birds.c @@ -115,13 +115,14 @@ struct synth_bird { int harmonic_4[4], fm_oscillator; + float poly; int x,a,l,v, frame; int pattern_length; struct synth_bird_signature { - float c0, c1, c2, c3, length, pause; + float c0, c1, c2, c3, length, pause, h0, h1, h2, h3; int lfo_hz; float fm; /* lfo modulation depth (+/- hz) */ @@ -168,12 +169,15 @@ static void birdsynth_pattern_decode( struct synth_bird *bird, sig->pause = 0.1f; sig->lfo_hz = 30; sig->fm = 10.0f; + sig->h0 = 1.0f; + sig->h1 = 0.5f; + sig->h2 = 0.2f; + sig->h3 = 0.125f; -#if 0 - sscanf( c, "{%f,%f,%f,%f,%f,%f,%d,%f}", + sscanf( c, "{%f,%f,%f,%f,%d,%f,%f,%f,%f,%f,%f,%f}", &sig->c0, &sig->c1, &sig->c2, &sig->c3, - &sig->length, &sig->pause, &sig->lfo_hz, &sig->fm ); -#endif + &sig->lfo_hz, &sig->fm, &sig->length, &sig->pause, + &sig->h0, &sig->h1, &sig->h2, &sig->h3 ); } c ++; @@ -214,7 +218,7 @@ static void synthbird_generate_samples( struct synth_bird *bird, bird->x ++; if( bird->x >= bird->l ) { - if( bird->a ) + if( bird->a && (bird->pattern[bird->frame].pause!=0.0f) ) { bird->a = 0; bird->l = bird->pattern[ bird->frame ].pause * 44100.0f; @@ -240,20 +244,12 @@ static void synthbird_generate_samples( struct synth_bird *bird, } else { - bird->v -= 40; + bird->v -= 100; 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); @@ -270,17 +266,17 @@ static void synthbird_generate_samples( struct synth_bird *bird, 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 ); + bird->harmonic_4[0] = WRAP1S( bird->harmonic_4[0] + (freq*1) ); + bird->harmonic_4[1] = WRAP1S( bird->harmonic_4[1] + (freq*6)/5 ); + bird->harmonic_4[2] = WRAP1S( bird->harmonic_4[2] + (freq*8)/7 ); + bird->harmonic_4[3] = WRAP1S( bird->harmonic_4[3] + (freq*13)/12 ); 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; + float s = v[0] * sig->h0 + + v[1] * sig->h1 + + v[2] * sig->h2 + + v[3] * sig->h3 ; s *= level; @@ -378,15 +374,67 @@ int main( int argc, char *argv[] ) } #else - struct synth_bird *bird = birdsynth_malloc_create( "" ); - - for(int _=0;_<44100*60;_++){ + struct synth_bird *warbling_vireo = birdsynth_malloc_create( + "{4000,100,100,0,60,200,0.134,0.1}," /* 1 */ + "{4200,-500,1700,0,60,96,0.1,0.05}," /* 2 */ + "{2400,-1200,1000,1700,60,96,0.1,0.0}," /* 3 */ + "{3100,200,-10,-1100,60,90,0.06,0.04}," /* 4 */ + "{4600,-2000,0,1300,60,10,0.13,0.07}," /* 5 */ + "{2700,-300,700,800,60,10,0.05,0.0}," /* 6 */ + "{3600,-300,0,0,60,20,0.09,0.07}," /* 7 */ + "{4800,1240,300,0,60,20,0.05,0.07}," /* 8 */ + "{2700,-800,150,1000,60,160,0.08,0.02}," /* 9 */ + "{2700,-800,150,1000,60,160,0.12,0.08}," /* 10 */ + "{6300,-100,-3200,1000,60,100,0.1,0.04}," /* 11 */ + "{4260,-200,300,1100,60,20,0.16,3.0}," /* 12 */ + ); + + struct synth_bird *pied_monarch = birdsynth_malloc_create( + "{2200,700,-300,0,60,0,0.18,0.13, 0.6,0.05,0,0}," + "{2200,700,-300,0,60,0,0.17,0.12, 0.8,0.05,0,0}," + "{2200,700,-300,0,60,0,0.16,0.11, 0.9,0.05,0,0}," + "{2200,700,-300,0,60,0,0.14,0.09, 1,0.05,0,0}," + "{2200,700,-300,0,60,0,0.12,0.07, 1,0.05,0,0}," + "{2200,700,-300,0,60,0,0.11,0.06, 1,0.05,0,0}," + "{2200,700,-300,0,60,0,0.10,0.05, 1,0.05,0,0}," + "{2200,700,-300,0,60,0,0.10,0.05, 1,0.05,0,0}," + "{2200,700,-300,0,60,0,0.10,0.05, 1,0.05,0,0}," + "{2200,700,-300,0,60,0,0.10,0.05, 1,0.05,0,0}," + "{2200,700,-300,0,60,0,0.10,0.05, 1,0.05,0,0}," + "{2200,700,-300,0,60,0,0.10,6.05, 1,0.05,0,0}," + ); + + struct synth_bird *bridled_honeyeater = birdsynth_malloc_create( + "{2000,-1000,600,0,30,60,0.1,0.1, 1.0,0.0,0.0,0.0}," + "{4000,0,-200,-200,30,60,0.1,0.1, 0.8,0.25,0.25,0.25}," + "{4000,0,-700,-800,60,20,0.06,0.01, 0.9,0.1,0,0}," + "{3950,0,-700,-800,60,20,0.07,0.01, 0.9,0.1,0,0}," + "{3900,0,-700,-800,60,20,0.08,0.01, 0.9,0.1,0,0}," + "{3850,0,-700,-800,60,20,0.09,0.01, 0.9,0.1,0,0}," + "{3800,0,-700,-800,60,20,0.10,0.02, 0.9,0.2,0.1,0}," + "{3750,0,-700,-800,60,20,0.11,0.05, 0.9,0.4,0.2,0}," + "{3700,0,-700,-800,60,20,0.12,0.2, 0.3,0.1,0,0}," + "{2600,1300,600,0,60,20,0.1,4.0, 0.97,0.03,0,0}," + ); + + for(;;){ float stereo[2] = { 0.0f, 0.0f }; - - synthbird_generate_samples( bird, stereo, 1 ); -#if 0 + + float b[2]; + synthbird_generate_samples( pied_monarch, b, 1 ); + stereo[0] += b[0] * 0.4f; + stereo[1] += b[1] * 0.3f; + + synthbird_generate_samples( warbling_vireo, b, 1 ); + stereo[0] += b[0] * 0.5f; + stereo[1] += b[1] * 0.4f; + + synthbird_generate_samples( bridled_honeyeater, b, 1 ); + stereo[0] += b[0] * 0.6f; + stereo[1] += b[1] * 0.6f; + + vg_dsp_process( stereo, stereo ); -#endif int16_t l = stereo[0] * 10000.0f, r = stereo[1] * 10000.0f; @@ -498,7 +546,9 @@ static inline void dsp_process_schroeder( struct dsp_schroeder *sch, } /* temporary global design */ -static struct dsp_lpf __lpf_mud_free; +static struct dsp_lpf __lpf_mud_free, + __hpf_mud_free; + static struct dsp_delay __echos[8]; static struct dsp_lpf __echos_lpf[8]; static struct dsp_schroeder __diffusion_chain[8]; @@ -514,11 +564,12 @@ static void vg_dsp_init( void ) dsp_init_lpf( &__lpf_mud_free, 125.0f ); + dsp_init_lpf( &__hpf_mud_free, 500.0f ); float sizes[] = { 2.0f, 4.0f, 8.0f, 16.0f, 32.0f, 64.0f, 128.0f, 256.0f }; - float reflection_variance = 0.1f; + float reflection_variance = 0.04f; for( int i=0; i<8; i++ ) { @@ -538,7 +589,7 @@ static void vg_dsp_init( void ) for( int i=0; i<8; i++ ) { - dsp_init_schroeder( __diffusion_chain+i, diffusions[i]/1000.0f, 0.8f ); + dsp_init_schroeder( __diffusion_chain+i, diffusions[i]/1000.0f, 0.7f ); } } @@ -557,7 +608,7 @@ static void vg_dsp_process( float *stereo_in, float *stereo_out ) dsp_write_lpf( __echos_lpf+i, &echo ); dsp_read_lpf( __echos_lpf+i, &echo ); - recieved += echo * echo_tunings[i]*0.997; + recieved += echo * echo_tunings[i]*0.9; } float diffused = recieved; @@ -567,7 +618,10 @@ static void vg_dsp_process( float *stereo_in, float *stereo_out ) dsp_process_schroeder( __diffusion_chain+i, &diffused, &diffused ); } - float total = in_total + (diffused*0.1f + recieved*0.9f); + float total = in_total + (diffused*0.5f + recieved*0.5f); + + dsp_write_lpf( &__hpf_mud_free, &total ); + dsp_read_lpf( &__hpf_mud_free, &total ); float low_mud; dsp_write_lpf( &__lpf_mud_free, &total ); @@ -578,9 +632,9 @@ static void vg_dsp_process( float *stereo_in, float *stereo_out ) for( int i=0; i<8; i++ ) dsp_write_delay( __echos+i, &total ); - stereo_out[0] = stereo_in[0]*0.25f; - stereo_out[1] = stereo_in[1]*0.25f; - stereo_out[0] += diffused*0.5f+recieved*0.9f; - stereo_out[1] += diffused*0.5f+recieved*0.9f; + stereo_out[0] = stereo_in[0]*0.1f; + stereo_out[1] = stereo_in[1]*0.1f; + stereo_out[0] += diffused*0.4f+recieved*0.9f; + stereo_out[1] += diffused*0.4f+recieved*0.9f; } -- 2.25.1