From a51271035a8591f8221e9ca6bccc5b98e29f23e1 Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Tue, 8 Feb 2011 15:58:19 +0100 Subject: First try to make the compiler up-to-date --- note_compiler/main.cpp | 51 ++++++++++++++++++++++++++++++++++-- note_compiler/parser.cpp | 52 +++++++++++++++++++++++++++++++++++-- note_compiler/programs.h | 40 +++++++++++++++++----------- note_compiler/templates/head.1 | 1 + note_compiler/templates/interface.1 | 3 ++- note_compiler/templates/set_param.1 | 16 +++++++++++- note_compiler/util.cpp | 12 +++++++++ 7 files changed, 154 insertions(+), 21 deletions(-) diff --git a/note_compiler/main.cpp b/note_compiler/main.cpp index 4d3fcae..ee69471 100644 --- a/note_compiler/main.cpp +++ b/note_compiler/main.cpp @@ -36,6 +36,15 @@ void include_file(string file) } } +void write_freqenv_decs() +{ + out << "\t\tdouble freqfactor_factor["<pfactor.fm[i][j], vel);\n" + "\t\t\n" + "\t\tpfactor.freq_env_amount[i]=calc_pfactor(curr_prg->pfactor.freq_env_amount[i], vel);\n" "\t}\n"; out << "}\n"; @@ -258,7 +286,8 @@ void write_apply_pfactor() { out << "\tosc"<>SCALE;\n" "\tfor (int i=0;i<"<>SCALE;\n"; + "\t\tosc"<>SCALE;\n" + "\tosc"<release_key();\n"; else comment << "\t//envelope"<release_key();\n"; + else + comment << "\t//freq-env #"<reattack();\n"; else comment << "\t//envelope"<reattack();\n"; + else + comment << "\t//freq-env #"<100)) //TODO FINDMICH besseres kriterium? + && (env[i].release<0)) env[i].enabled=false; if ( ((filter.env_settings.attack==0) && (filter.env_settings.sustain==1.0) - && (filter.env_settings.release>100)) //TODO FINDMICH siehe oben + && (filter.env_settings.release<0)) || ((filter.env_amount==0) && (filter.env_amount_const==true)) ) filter.env_settings.enabled=false; diff --git a/note_compiler/programs.h b/note_compiler/programs.h index d7acd61..b311696 100644 --- a/note_compiler/programs.h +++ b/note_compiler/programs.h @@ -35,11 +35,31 @@ enum parameter_enum FILTER_TREM_LFO, SYNC_FACTOR, + FREQ_ATTACK, + FREQ_DECAY, + FREQ_SUSTAIN, + FREQ_RELEASE, + FREQ_HOLD, + FREQ_ENV_AMOUNT, PARAMETER_N_ENTRIES, UNKNOWN=-1 }; +struct env_settings_t +{ + bool enabled; + float attack; + bool attack_const; + float decay; + bool decay_const; + float sustain; + bool sustain_const; + float release; + bool release_const; + bool hold; + bool hold_const; +}; struct oscillator_t { @@ -51,6 +71,11 @@ struct oscillator_t bool waveform_const; fixed_t factor; bool factor_const; + + float freq_env_amount; + bool freq_env_amount_const; + env_settings_t freq_env; + fixed_t tremolo_depth; bool tremolo_depth_const; @@ -74,21 +99,6 @@ struct oscillator_t bool sync_const; }; -struct env_settings_t -{ - bool enabled; - float attack; - bool attack_const; - float decay; - bool decay_const; - float sustain; - bool sustain_const; - float release; - bool release_const; - bool hold; - bool hold_const; -}; - struct filter_params_t { bool enabled; diff --git a/note_compiler/templates/head.1 b/note_compiler/templates/head.1 index b50d694..73beec6 100644 --- a/note_compiler/templates/head.1 +++ b/note_compiler/templates/head.1 @@ -13,6 +13,7 @@ using namespace std; int filter_update_frames=0; +int envelope_update_frames=0; int samp_rate=0; fixed_t** wave=NULL; fixed_t** curr_lfo=NULL; diff --git a/note_compiler/templates/interface.1 b/note_compiler/templates/interface.1 index 2ccee41..7a7c58e 100644 --- a/note_compiler/templates/interface.1 +++ b/note_compiler/templates/interface.1 @@ -7,10 +7,11 @@ extern "C" NoteSkel* create_note(int n, float v,program_t &prg, jack_nframes_t p return new Note(n,v,prg,pf,pb,prg_no,vol_fac); } -extern "C" void init_vars(int sr, int fupfr, fixed_t **w, fixed_t **clfo, output_note_func_t* out_n, IntToStr_func_t* its) +extern "C" void init_vars(int sr, int fupfr, int envupfr, fixed_t **w, fixed_t **clfo, output_note_func_t* out_n, IntToStr_func_t* its) { samp_rate=sr; filter_update_frames=fupfr; + envelope_update_frames=envupfr; wave=w; curr_lfo=clfo; IntToStr=its; diff --git a/note_compiler/templates/set_param.1 b/note_compiler/templates/set_param.1 index 21fc983..e99f481 100644 --- a/note_compiler/templates/set_param.1 +++ b/note_compiler/templates/set_param.1 @@ -5,6 +5,13 @@ return; } + if ( ((p.par==FREQ_ATTACK) || (p.par==FREQ_DECAY) || (p.par==FREQ_SUSTAIN) || + (p.par==FREQ_RELEASE) || (p.par==FREQ_HOLD)) && sel_factor_env==NULL ) + { + output_note("NOTE: cannot change parameter for freq-envelope"+IntToStr(p.osc)+" because it's disabled"); + return; + } + switch(p.par) { case ATTACK: sel_env->set_attack(v*samp_rate >>SCALE); break; @@ -13,10 +20,17 @@ case RELEASE: sel_env->set_release(v*samp_rate >>SCALE); break; case HOLD: sel_env->set_hold(v!=0); break; + case FREQ_ATTACK: sel_factor_env->set_attack(v*samp_rate >>SCALE); break; + case FREQ_DECAY: sel_factor_env->set_decay(v*samp_rate >>SCALE); break; + case FREQ_SUSTAIN: sel_factor_env->set_sustain(v); break; + case FREQ_RELEASE: sel_factor_env->set_release(v*samp_rate >>SCALE); break; + case FREQ_HOLD: sel_factor_env->set_hold((v!=0)); break; + case FREQ_ENV_AMOUNT: sel_orig_osc->freq_env_amount=double(v)/ONE; apply_pfactor(); break; + case KSR: sel_osc->ksr=float(v)/ONE; break; case KSL: sel_osc->ksl=float(v)/ONE; break; - case FACTOR: sel_osc->factor=v; break; + case FACTOR: sel_orig_osc->factor=v; sel_osc->factor=v*freqfactor_factor[p.osc]; break; case TREMOLO: sel_osc->tremolo_depth=v; break; case TREM_LFO: sel_osc->tremolo_lfo=v; break; case VIBRATO: sel_osc->vibrato_depth=v; break; diff --git a/note_compiler/util.cpp b/note_compiler/util.cpp index f73b8bb..b3ea1af 100644 --- a/note_compiler/util.cpp +++ b/note_compiler/util.cpp @@ -173,6 +173,18 @@ parameter_enum param_to_enum(string param) return FILTER_TREM_LFO; else if (param=="sync_factor") return SYNC_FACTOR; + else if (param=="freq.env_amount") + return FREQ_ENV_AMOUNT; + else if (param=="freq.attack") + return FREQ_ATTACK; + else if (param=="freq.decay") + return FREQ_DECAY; + else if (param=="freq.sustain") + return FREQ_SUSTAIN; + else if (param=="freq.release") + return FREQ_RELEASE; + else if (param=="freq.hold") + return FREQ_HOLD; else return UNKNOWN; } -- cgit v1.2.1