Changeset 74

Show
Ignore:
Timestamp:
10/08/07 22:17:36 (1 year ago)
Author:
gordonjcp
Message:

now with antialiasing, and improved filters, tone control and volume

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • nekostring/trunk/gui/Makefile

    r73 r74  
    8282CC = gcc 
    8383CCDEPMODE = depmode=gcc3 
    84 CFLAGS = -g -O2 
     84CFLAGS =  
    8585CPP = gcc -E 
    8686CPPFLAGS =  
  • nekostring/trunk/gui/callbacks.c

    r39 r74  
    9696void on_voice_slider_change( GtkWidget *widget, gpointer data ) 
    9797{ 
    98    GtkAdjustment *adj; 
     98//   GtkAdjustment *adj; 
    9999 
    100100 
     
    103103    //float cval = GTK_ADJUSTMENT(widget)->value; // / 10.0f; 
    104104        float cval = gtk_range_get_adjustment(GTK_RANGE(widget))->value; // / 10.0f; 
    105     float value; 
     105//    float value; 
    106106 
    107107        //printf("from slider: %d -> %f\n",index, cval); 
  • nekostring/trunk/gui/callbacks.h

    r39 r74  
    1313#include  
    1414void on_voice_slider_change( GtkWidget *widget, gpointer data ); 
    15  
     15void update_voice_widget(int port, float value); 
    1616extern lo_address osc_host_address; 
    1717extern char *     osc_control_path; 
  • nekostring/trunk/gui/interface.c

    r41 r74  
    9797  gtk_widget_set_size_request (vbox4, 50, 135); 
    9898 
    99   vs_cello = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (1, 0, 1, 0, 0, 0))); 
     99  vs_cello = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (.75, 0, 1, 0, 0, 0))); 
    100100  gtk_widget_show (vs_cello); 
    101101  gtk_box_pack_start (GTK_BOX (vbox4), vs_cello, TRUE, FALSE, 0); 
     
    131131  gtk_widget_set_size_request (vbox6, 50, 135); 
    132132 
    133   vs_violin = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (1, 0, 1, 0, 0, 0))); 
     133  vs_violin = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (.8, 0, 1, 0, 0, 0))); 
    134134  gtk_widget_show (vs_violin); 
    135135  gtk_box_pack_start (GTK_BOX (vbox6), vs_violin, TRUE, FALSE, 0); 
     
    167167  gtk_widget_set_size_request (vbox7, 50, 135); 
    168168 
    169   vs_cspeed = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (1.34706, 0.5, 2, 0, 0, 0))); 
     169  vs_cspeed = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (1, 0.5, 2, 0, 0, 0))); 
    170170  gtk_widget_show (vs_cspeed); 
    171171  gtk_box_pack_start (GTK_BOX (vbox7), vs_cspeed, TRUE, FALSE, 0); 
     
    185185  gtk_widget_set_size_request (vbox8, 50, 135); 
    186186 
    187   vs_cdepth = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 1, 0, 0, 0))); 
     187  vs_cdepth = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0.5, 0, 1, 0, 0, 0))); 
    188188  gtk_widget_show (vs_cdepth); 
    189189  gtk_box_pack_start (GTK_BOX (vbox8), vs_cdepth, TRUE, FALSE, 0); 
     
    202202  gtk_widget_set_size_request (vbox9, 50, 135); 
    203203 
    204   vs_vspeed = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0.5, 0, 1, 0, 0, 0))); 
     204  vs_vspeed = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 0, 0, 0, 0))); 
    205205  gtk_widget_show (vs_vspeed); 
    206206  gtk_box_pack_start (GTK_BOX (vbox9), vs_vspeed, TRUE, FALSE, 0); 
     
    219219  gtk_widget_set_size_request (vbox10, 50, 135); 
    220220 
    221   vs_vdepth = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0.6541176, 0, 1, 0, 0, 0))); 
     221  vs_vdepth = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 0, 0, 0, 0))); 
    222222  gtk_widget_show (vs_vdepth); 
    223223  gtk_box_pack_start (GTK_BOX (vbox10), vs_vdepth, TRUE, FALSE, 0); 
     
    257257  gtk_widget_set_size_request (vbox11, 50, 135); 
    258258 
    259   vscale14 = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0.811765, 0, 1, 0, 0, 0))); 
    260   gtk_widget_show (vscale14); 
    261   gtk_box_pack_start (GTK_BOX (vbox11), vscale14, TRUE, FALSE, 0); 
    262   gtk_widget_set_size_request (vscale14, 50, 120); 
    263   gtk_scale_set_draw_value (GTK_SCALE (vscale14), FALSE); 
    264   gtk_range_set_inverted (GTK_RANGE (vscale14), TRUE); 
     259  vs_tone = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0.75, 0, 1, 0, 0, 0))); 
     260  gtk_widget_show (vs_tone); 
     261  gtk_box_pack_start (GTK_BOX (vbox11), vs_tone, TRUE, FALSE, 0); 
     262  gtk_widget_set_size_request (vs_tone, 50, 120); 
     263  gtk_scale_set_draw_value (GTK_SCALE (vs_tone), FALSE); 
     264  gtk_range_set_inverted (GTK_RANGE (vs_tone), TRUE); 
    265265 
    266266  label18 = gtk_label_new ("Tone"); 
     
    274274  gtk_widget_set_size_request (vbox12, 50, 135); 
    275275 
    276   vscale15 = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0.188235, 0, 1, 0, 0, 0))); 
    277   gtk_widget_show (vscale15); 
    278   gtk_box_pack_start (GTK_BOX (vbox12), vscale15, TRUE, FALSE, 0); 
    279   gtk_widget_set_size_request (vscale15, 50, 120); 
    280   gtk_scale_set_draw_value (GTK_SCALE (vscale15), FALSE); 
    281   gtk_range_set_inverted (GTK_RANGE (vscale15), TRUE); 
     276  vs_volume = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0.7, 0, 1, 0, 0, 0))); 
     277  gtk_widget_show (vs_volume); 
     278  gtk_box_pack_start (GTK_BOX (vbox12), vs_volume, TRUE, FALSE, 0); 
     279  gtk_widget_set_size_request (vs_volume, 50, 120); 
     280  gtk_scale_set_draw_value (GTK_SCALE (vs_volume), FALSE); 
     281  gtk_range_set_inverted (GTK_RANGE (vs_volume), TRUE); 
    282282 
    283283  label19 = gtk_label_new ("Volume"); 
     
    458458  GLADE_HOOKUP_OBJECT (window1, hbox4, "hbox4"); 
    459459  GLADE_HOOKUP_OBJECT (window1, vbox11, "vbox11"); 
    460   GLADE_HOOKUP_OBJECT (window1, vscale14, "vscale14"); 
     460  GLADE_HOOKUP_OBJECT (window1, vs_tone, "vs_tone"); 
    461461  GLADE_HOOKUP_OBJECT (window1, label18, "label18"); 
    462462  GLADE_HOOKUP_OBJECT (window1, vbox12, "vbox12"); 
    463   GLADE_HOOKUP_OBJECT (window1, vscale15, "vscale15"); 
     463  GLADE_HOOKUP_OBJECT (window1, vs_volume, "vs_volume"); 
    464464  GLADE_HOOKUP_OBJECT (window1, label19, "label19"); 
    465465  GLADE_HOOKUP_OBJECT (window1, label17, "label17"); 
     
    511511                        "value_changed", GTK_SIGNAL_FUNC(on_voice_slider_change), 
    512512                        (gpointer)NEKO_PORT_VIBRATO_CHORUS); 
    513         gtk_signal_connect (GTK_OBJECT (vs_vdepth), 
    514                         "value_changed", GTK_SIGNAL_FUNC(on_voice_slider_change), 
    515                         (gpointer)NEKO_PORT_MIX); 
    516  
     513        gtk_signal_connect (GTK_OBJECT (vs_tone), 
     514                        "value_changed", GTK_SIGNAL_FUNC(on_voice_slider_change), 
     515                        (gpointer)NEKO_PORT_TONE); 
     516        gtk_signal_connect (GTK_OBJECT (vs_volume), 
     517                        "value_changed", GTK_SIGNAL_FUNC(on_voice_slider_change), 
     518                        (gpointer)NEKO_PORT_VOLUME); 
    517519 
    518520  return window1; 
  • nekostring/trunk/gui/main.c

    r39 r74  
    2525#include "support.h" 
    2626#include "widgets.h" 
     27#include "callbacks.h" 
    2728 
    2829// define a few globals 
     
    4748} 
    4849 
    49 osc_action_handler(const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data) { 
     50void osc_action_handler(const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data) { 
    5051 
    51       printf("%s\n",user_data); 
     52//    printf("%s\n",user_data); 
    5253 
    5354} 
    5455 
    55 osc_control_handler(const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data) { 
     56int osc_control_handler(const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data) { 
    5657 
    5758    int port; 
  • nekostring/trunk/gui/widgets.h

    r19 r74  
    4242  GtkWidget *hbox4; 
    4343  GtkWidget *vbox11; 
    44   GtkWidget *vscale14
     44  GtkWidget *vs_tone
    4545  GtkWidget *label18; 
    4646  GtkWidget *vbox12; 
    47   GtkWidget *vscale15
     47  GtkWidget *vs_volume
    4848  GtkWidget *label19; 
    4949  GtkWidget *label17; 
  • nekostring/trunk/src/Makefile

    r73 r74  
    8585CC = gcc 
    8686CCDEPMODE = depmode=gcc3 
    87 CFLAGS = -g -O2 
     87CFLAGS =  
    8888CPP = gcc -E 
    8989CPPFLAGS =  
  • nekostring/trunk/src/gui_friendly_patches.c

    r6 r74  
    2020        "nekostrings", 
    2121        0.999, // bass 
    22         1.0, // cello 
     22        .75, // cello 
    2323                1.0, // viola 
    24                 0.6, // violin 
     24                0.8, // violin 
    2525                1.0, // speed 
    2626                1.0, // depth 
     
    3030                0.5, // decay 
    3131                0.0001, // bass decay 
    32                 0.5, // tone 
     32                0.75, // tone 
    3333                .7 // volume 
    3434    } 
  • nekostring/trunk/src/neko_ensemble.c

    r41 r74  
    3636  float x1 = synth->ens_x1; 
    3737  float y1 = synth->ens_y1; 
     38  float lp1 = synth->ens_lp1; 
     39  float lp2 = synth->ens_lp2; 
     40   
    3841 
    3942  float depth1=3; 
    4043  float depth2=*(synth->depth)*2.5; 
    41   float mix=0.5+0.5* *(synth->mix); 
     44  float mix=1;//0.5+0.5* *(synth->mix); 
    4245  float s1, s2;                 // samples from the buffer 
    4346 
    4447  float s_mix_1; //, s_mix_2, s_mix_3;                  // mix for antialiasing 
    4548  float so1,so2,so3; 
    46   float d1,d2
     49  float d1,d2,hp,lowpass,q
    4750 
    4851  //float mult = WAVE_POINTS/6.28; 
    4952 
    50 //printf("%d %d %d %d\n",x1,y1,xomega,yomega); 
     53  lowpass=0.15f+(*(synth->tone)*0.6); 
     54 
    5155  for (sample = 0; sample < sample_count; sample++) 
    5256    { 
    5357      // Write input into delay line 
    5458      // we'll just use left as the input 
    55  
    56       synth->ens_buffer[buffer_pos] = left[sample]; 
     59        lp2 = lp2 + lowpass * lp1; 
     60        hp =  left[sample] - lp2 -1.7 * lp1; 
     61        lp1 = lowpass * hp + lp1; 
     62    synth->ens_buffer[buffer_pos] = lp2; 
    5763 
    5864          // we have two LFOs, a fast one for the vibrato and a slow one for the chorus 
     
    6874 
    6975          //d1=200+20*sin(x1+4.2)+1.0f; d2=0.5*sin(y1+4.2)+1.0f; 
    70           d1 = 200 + 20*sine_wave[(int)(x1+682) & BUF_MASK]+1.0f; d2 = 0.5*sine_wave[(int)(y1+682) & BUF_MASK] + 1.0f; 
     76          d1 = 200 + 20*sine_wave[(int)(x1+682) & BUF_MASK]+1.0f; d2 = 0;//.5*sine_wave[(int)(y1+682) & BUF_MASK] + 1.0f; 
    7177          delay_3 = 1200 + (d1*depth1+d2*depth2 * dr); 
    7278 
     
    123129  synth->ens_x1 = x1; 
    124130  synth->ens_y1 = y1; 
     131  synth->ens_lp1 = lp1; 
     132  synth->ens_lp2 = lp2; 
    125133  synth->buffer_pos = buffer_pos; 
    126134 
  • nekostring/trunk/src/neko_synth.h

    r34 r74  
    8282        float ens_buffer[1280]; 
    8383        float ens_x1, ens_y1; 
     84        float ens_lp1, ens_lp2; 
    8485 
    8586    /* translated controller values */ 
  • nekostring/trunk/src/neko_voice.h

    r36 r74  
    7474    float pos,              /* persistent */ 
    7575          pw;               /* comes from LADSPA port each cycle */ 
     76    int osc_index; 
     77    float osc_audio[MINBLEP_BUFFER_LENGTH]; 
    7678        float hp_last, hp_last_in; 
    7779        float lp_last; 
  • nekostring/trunk/src/neko_voice_render.c

    r73 r74  
    177177void vco(unsigned long sample_count, neko_voice_t *voice, struct blosc *osc, int index, 
    178178        float highpass, float lowpass, float gain, float w) { 
     179 
     180// FIXME - aliasing 
     181// description of problem 
     182// oscillator "buzzes" because of aliasing 
     183// antialiasing minblep is clobbered by the low/highpass filtering 
     184// proposed fix - render osc to osc->buffer, then filter to voice->buffer 
     185// similar to how amplitude is done 
     186 
     187  int index2 = osc->osc_index;  // need this, for the filter code 
    179188  unsigned long sample; 
    180189  float pos = osc->pos; 
     
    188197  float lp3 = osc->lp_d3, lp4=osc->lp_d4; 
    189198   
    190   if (lowpass > .825) lowpass = .825; 
    191   if (highpass < 0.01) highpass = 0.01; 
     199  int osc_index = osc->osc_index; 
     200   
     201  // clamp offscale filter values 
     202  if (highpass < 0.0001) highpass = 0.0001; 
     203  if (highpass > .995) highpass = .995; 
     204  if (lowpass < 0.0001) lowpass = 0.0001; 
     205  if (lowpass > .995) lowpass = .995; 
     206  if (gain < 0.0001) gain = 0.0001; 
     207 
    192208  //freqcut = cutoff[sample] * 2.0f; 
     209 
    193210 
    194211  for (sample=0; sample < sample_count; sample++) { 
     
    197214                pos -= 1.0f; 
    198215                //blosc_place_step_dd(voice->osc_audio, index, pos, w, lowpass*gain); 
     216                blosc_place_step_dd(osc->osc_audio, osc_index, pos, w, gain); 
    199217        } 
    200218 
    201219        out = 1.0f-(2*pos);     // make saw wave 
    202220        out = (out>0?out:0)-0.25; // chop off second half, adjust for DC offset 
     221    osc->osc_audio[osc_index + DD_SAMPLE_DELAY] += gain * out; 
     222    osc_index++; 
     223  } 
    203224 
    204225        // qres goes from 2 (fully down) to 0.05 (fully up) 
    205226 
    206         lp2 = lp2 + lowpass * lp1; 
    207         hp = out - lp2 - 1.17f * lp1; 
    208         lp1 = lowpass * hp + lp1; 
    209          
    210         lp4 = lp4 + highpass * lp3; 
    211         hp = lp2 - lp4 - 1.7f * lp3; 
    212         lp3 = highpass * hp + lp3; 
    213          
    214         out=hp; 
    215                           /* 
    216                           out=(lowpass*out)+((1-lowpass)*lp_last); 
    217                           lp_last=out; 
    218  
    219                           hp_last = highpass * hp_last + out - hp_last_in; 
    220                           hp_last_in = out; 
    221                           out=hp_last; 
    222 */ 
    223               voice->osc_audio[index + DD_SAMPLE_DELAY] += gain * out; 
    224                           index++; 
    225                   } 
     227        for (sample=0; sample < sample_count; sample++) { 
     228                out = osc->osc_audio[index2 + DD_SAMPLE_DELAY]; 
     229        // 12dB/oct filter code 
     230        /* 
     231                lp2 = lp2 + lowpass * lp1; 
     232                hp = out - lp2 - 1.17f * lp1; 
     233                lp1 = lowpass * hp + lp1; 
     234         
     235                lp4 = lp4 + highpass * lp3; 
     236                hp = lp2 - lp4 - 1.7f * lp3; 
     237                lp3 = highpass * hp + lp3; 
     238         
     239                out=hp; 
     240        */ 
     241        // 6dB/oct filter code (more like the Solina filters) 
     242                out=(lowpass*out)+((1-lowpass)*lp_last); 
     243                lp_last=out; 
     244                hp_last = highpass * hp_last + out - hp_last_in; 
     245                hp_last_in = out; 
     246                out=hp_last; 
     247        voice->osc_audio[index + DD_SAMPLE_DELAY] += out; 
     248                index++; 
     249                index2++; 
     250        } 
     251         
     252        if (osc_index > MINBLEP_BUFFER_LENGTH - (NEKO_NUGGET_SIZE + LONGEST_DD_PULSE_LENGTH)) { 
     253                memcpy(osc->osc_audio, osc->osc_audio + osc_index, LONGEST_DD_PULSE_LENGTH * sizeof (float)); 
     254                memset(osc->osc_audio + LONGEST_DD_PULSE_LENGTH, 0, (MINBLEP_BUFFER_LENGTH - LONGEST_DD_PULSE_LENGTH) * sizeof (float)); 
     255                osc_index = 0; 
     256        } 
     257        osc->osc_index = osc_index; 
    226258                        osc->hp_last = hp_last; 
    227259                        osc->hp_last_in = hp_last_in; 
     
    318350 
    319351 
    320         kf = omega1/(float)(synth->sample_rate)
     352        kf = omega1/(float)(synth->sample_rate)*10.0f
    321353 
    322354        //printf("%f %f\n",omega1, kf); 
    323355         
    324356        // generate cello 
    325         vco(sample_count, voice, &voice->osc_cello, osc_index, 0.001, 0.4-(kf/2), *(synth->cello), deltat * omega1/2); 
     357        vco(sample_count, voice, &voice->osc_cello, osc_index, 0.97, 0.3-(kf/2), *(synth->cello), deltat * omega1/2); 
    326358        // generate viola 
    327         vco(sample_count, voice, &voice->osc_viola, osc_index, 0.02, 0.55+kf, *(synth->viola), deltat * omega1); 
     359        vco(sample_count, voice, &voice->osc_viola, osc_index, 0.9-kf, 0.3+kf, *(synth->viola)-(.25-(kf/2)), deltat * omega1); 
    328360        // generate violin 
    329         vco(sample_count, voice, &voice->osc_violin, osc_index, 0.05-kf, 0.95+kf, *(synth->violin), deltat * omega1*2); 
     361         
     362        vco(sample_count, voice, &voice->osc_violin, osc_index, 0.8, 0.35+kf, *(synth->violin)/*-(.25-(kf/2))*/, deltat * omega1*2); 
    330363 
    331364        // apply the VCA, copying the buffer as we go