void lb302Synth::db24Toggled() { delete vcf; if(db24Toggle.value()) { vcf = new lb302Filter3Pole(&fs); } else { vcf = new lb302FilterIIR2(&fs); } recalcFilter(); }
void lb302Synth::initNote( lb302Note *n) { catch_decay = 0; vco_inc = n->vco_inc; // Always reset vca on non-dead notes, and // Only reset vca on decaying(decayed) and never-played if(n->dead == 0 || (vca_mode==1 || vca_mode==3)) { //printf(" good\n"); sample_cnt = 0; vca_mode = 0; // LB303: //vca_a = 0; } else { vca_mode = 2; } // Initiate Slide // TODO: Break out into function, should be called again on detuneChanged if (vco_slideinc) { //printf(" sliding\n"); vco_slide = vco_inc-vco_slideinc; // Slide amount vco_slidebase = vco_inc; // The REAL frequency vco_slideinc = 0; // reset from-note } else { vco_slide = 0; } // End break-out // Slide-from note, save inc for next note if (slideToggle.value()) { vco_slideinc = vco_inc; // May need to equal vco_slidebase+vco_slide if last note slid } recalcFilter(); if(n->dead ==0){ // Swap next two blocks?? vcf->playNote(); // Ensure envelope is recalculated vcf_envpos = ENVINC; // Double Check //vca_mode = 0; //vca_a = 0.0; } }
// TODO: Split into one function per knob. envdecay doesn't require // recalcFilter. void lb302Synth::filterChanged() { fs.cutoff = vcf_cut_knob.value(); fs.reso = vcf_res_knob.value(); fs.envmod = vcf_mod_knob.value(); fs.dist = LB_DIST_RATIO*dist_knob.value(); float d = 0.2 + (2.3*vcf_dec_knob.value()); d *= engine::mixer()->processingSampleRate(); // d *= smpl rate fs.envdecay = pow(0.1, 1.0/d * ENVINC); // decay is 0.1 to the 1/d * ENVINC // vcf_envdecay is now adjusted for both // sampling rate and ENVINC recalcFilter(); }
void lb302Synth::initNote( lb302Note *n) { catch_decay = 0; vco_inc = n->vco_inc; // Always reset vca on non-dead notes, and // Only reset vca on decaying(decayed) and never-played if(n->dead == 0 || (vca_mode==1 || vca_mode==3)) { //printf(" good\n"); sample_cnt = 0; vca_mode = 0; // LB303: //vca_a = 0; } else { vca_mode = 2; } initSlide(); // Slide-from note, save inc for next note if (slideToggle.value()) { vco_slideinc = vco_inc; // May need to equal vco_slidebase+vco_slide if last note slid } recalcFilter(); if(n->dead ==0){ // Swap next two blocks?? #if QT_VERSION >= 0x050000 vcf.load()->playNote(); #else vcf->playNote(); #endif // Ensure envelope is recalculated vcf_envpos = ENVINC; // Double Check //vca_mode = 0; //vca_a = 0.0; } }
void lb302Synth::db24Toggled() { vcf = vcfs[db24Toggle.value()]; // These recalcFilter calls might suck recalcFilter(); }
lb302Synth::lb302Synth( InstrumentTrack * _instrumentTrack ) : Instrument( _instrumentTrack, &lb302_plugin_descriptor ), vcf_cut_knob( 0.75f, 0.0f, 1.5f, 0.005f, this, tr( "VCF Cutoff Frequency" ) ), vcf_res_knob( 0.75f, 0.0f, 1.25f, 0.005f, this, tr( "VCF Resonance" ) ), vcf_mod_knob( 0.1f, 0.0f, 1.0f, 0.005f, this, tr( "VCF Envelope Mod" ) ), vcf_dec_knob( 0.1f, 0.0f, 1.0f, 0.005f, this, tr( "VCF Envelope Decay" ) ), dist_knob( 0.0f, 0.0f, 1.0f, 0.01f, this, tr( "Distortion" ) ), wave_shape( 0.0f, 0.0f, 7.0f, this, tr( "Waveform" ) ), slide_dec_knob( 0.6f, 0.0f, 1.0f, 0.005f, this, tr( "Slide Decay" ) ), slideToggle( false, this, tr( "Slide" ) ), accentToggle( false, this, tr( "Accent" ) ), deadToggle( false, this, tr( "Dead" ) ), db24Toggle( false, this, tr( "24dB/oct Filter" ) ) { connect( engine::getMixer(), SIGNAL( sampleRateChanged( ) ), this, SLOT ( filterChanged( ) ) ); connect( &vcf_cut_knob, SIGNAL( dataChanged( ) ), this, SLOT ( filterChanged( ) ) ); connect( &vcf_res_knob, SIGNAL( dataChanged( ) ), this, SLOT ( filterChanged( ) ) ); connect( &vcf_mod_knob, SIGNAL( dataChanged( ) ), this, SLOT ( filterChanged( ) ) ); connect( &vcf_dec_knob, SIGNAL( dataChanged( ) ), this, SLOT ( filterChanged( ) ) ); connect( &db24Toggle, SIGNAL( dataChanged( ) ), this, SLOT ( db24Toggled( ) ) ); connect( &dist_knob, SIGNAL( dataChanged( ) ), this, SLOT ( filterChanged( ))); // SYNTH vco_inc = 0.0; vco_c = 0; vco_k = 0; vco_slide = 0; vco_slideinc = 0; vco_slidebase = 0; fs.cutoff = 0; fs.envmod = 0; fs.reso = 0; fs.envdecay = 0; fs.dist = 0; vcf_envpos = ENVINC; // Start VCA on an attack. vca_mode = 3; vca_a = 0; //vca_attack = 1.0 - 0.94406088; vca_attack = 1.0 - 0.96406088; vca_decay = 0.99897516; vco_shape = SAWTOOTH; // Experimenting with a0 between original (0.5) and 1.0 vca_a0 = 0.5; vca_a = 9; vca_mode = 3; vcf = new lb302FilterIIR2(&fs); sample_cnt = 0; release_frame = 1<<24; catch_frame = 0; catch_decay = 0; recalcFilter(); last_offset = 0; new_freq = -1; current_freq = -1; delete_freq = -1; InstrumentPlayHandle * iph = new InstrumentPlayHandle( this ); engine::getMixer()->addPlayHandle( iph ); filterChanged(); }