[SCM] calf/master: + Organ: first attempt at adding some subtractive synthesis elements to signal path (VERY incomplete and unoptimized, still fun!)
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:37:07 UTC 2013
The following commit has been merged in the master branch:
commit 520f37b630f30e575b2814d2d5bdfe4f113265bd
Author: kfoltman <kfoltman at 78b06b96-2940-0410-b7fc-879d825d01d8>
Date: Thu Apr 3 23:30:25 2008 +0000
+ Organ: first attempt at adding some subtractive synthesis elements to signal path (VERY incomplete and unoptimized, still fun!)
git-svn-id: https://calf.svn.sourceforge.net/svnroot/calf/trunk@143 78b06b96-2940-0410-b7fc-879d825d01d8
diff --git a/src/calf/modules_synths.h b/src/calf/modules_synths.h
index 84fde40..2d91fc6 100644
--- a/src/calf/modules_synths.h
+++ b/src/calf/modules_synths.h
@@ -204,7 +204,10 @@ public:
par_phase1, par_phase2, par_phase3, par_phase4, par_phase5, par_phase6, par_phase7, par_phase8, par_phase9,
par_pan1, par_pan2, par_pan3, par_pan4, par_pan5, par_pan6, par_pan7, par_pan8, par_pan9,
par_foldover,
- par_percdecay, par_perclevel, par_percharm, par_master, param_count };
+ par_percdecay, par_perclevel, par_percharm, par_master,
+ par_f1cutoff, par_f1res, par_f1env1,
+ par_eg1attack, par_eg1decay, par_eg1sustain, par_eg1release,
+ param_count };
enum { in_count = 0, out_count = 2, support_midi = true, rt_capable = true };
static const char *port_names[];
float *ins[in_count];
diff --git a/src/calf/organ.h b/src/calf/organ.h
index bba3267..82e9343 100644
--- a/src/calf/organ.h
+++ b/src/calf/organ.h
@@ -27,14 +27,20 @@
namespace synth
{
-struct organproc_parameters
-{
- float cutoff;
- float resonance;
- float attack, decay, sustain, release;
-};
-
struct organ_parameters {
+ enum { FilterCount = 1, EnvCount = 1 };
+ struct organ_filter_parameters
+ {
+ float cutoff;
+ float resonance;
+ float envmod[organ_parameters::EnvCount];
+ };
+
+ struct organ_env_parameters
+ {
+ float attack, decay, sustain, release;
+ };
+
float drawbars[9];
float harmonics[9];
float waveforms[9];
@@ -47,7 +53,8 @@ struct organ_parameters {
float percussion_harmonic;
float master;
- organproc_parameters procs[2];
+ organ_filter_parameters filters[organ_parameters::FilterCount];
+ organ_env_parameters envs[organ_parameters::EnvCount];
double perc_decay_const;
float multiplier[9];
@@ -80,10 +87,13 @@ public:
class organ_voice: public synth::voice, public organ_voice_base {
protected:
- enum { Channels = 2, BlockSize = 32 };
+ enum { Channels = 2, BlockSize = 32, EnvCount = organ_parameters::EnvCount, FilterCount = organ_parameters::FilterCount };
float output_buffer[BlockSize][Channels];
bool released;
dsp::fixed_point<int64_t, 52> phase, dphase;
+ biquad<float> filterL, filterR;
+ adsr envs[EnvCount];
+ int age;
public:
organ_voice()
@@ -92,11 +102,21 @@ public:
void reset() {
phase = 0;
+ filterL.reset();
+ filterR.reset();
+ age = 0;
}
void note_on(int note, int /*vel*/) {
reset();
this->note = note;
+ for (int i = 0; i < EnvCount; i++)
+ {
+ organ_parameters::organ_env_parameters &p = parameters->envs[i];
+ float sf = 0.001f;
+ envs[i].set(sf * p.attack, sf * p.decay, p.sustain, sf * p.release, sample_rate / BlockSize);
+ envs[i].note_on();
+ }
dphase.set(synth::midi_note_to_phase(note, 0, sample_rate));
amp.set(1.0f);
released = false;
@@ -145,6 +165,15 @@ public:
}
}
phase += dphase * BlockSize;
+ float fc = parameters->filters[0].cutoff * pow(2.0, parameters->filters[0].envmod[0] * envs[0].value * (1.f / 1200.f));
+ filterL.set_lp_rbj(dsp::clip<float>(fc, 10, 18000), parameters->filters[0].resonance, sample_rate);
+ filterR.copy_coeffs(filterL);
+ envs[0].advance();
+ age++;
+ for (int i=0; i < (int) BlockSize; i++) {
+ output_buffer[i][0] = filterL.process_d1(output_buffer[i][0]);
+ output_buffer[i][1] = filterR.process_d1(output_buffer[i][1]);
+ }
if (released)
{
for (int i=0; i < (int) BlockSize; i++) {
diff --git a/src/organ.cpp b/src/organ.cpp
index 57e7805..0f98ed5 100644
--- a/src/organ.cpp
+++ b/src/organ.cpp
@@ -94,6 +94,36 @@ const char *organ_audio_module::get_gui_xml()
DRAWBAR_UI("8")
DRAWBAR_UI("9")
"</table>"
+ "<hbox>"
+ "<vbox>"
+ " <label param=\"f1_cutoff\" />"
+ " <align><knob param=\"f1_cutoff\" expand=\"0\" fill=\"0\"/></align><value param=\"f1_cutoff\"/>"
+ "</vbox>"
+ "<vbox>"
+ " <label param=\"f1_res\" />"
+ " <align><knob param=\"f1_res\" expand=\"0\" fill=\"0\"/></align><value param=\"f1_res\"/>"
+ "</vbox>"
+ "<vbox>"
+ " <label param=\"f1_env1\" />"
+ " <align><knob param=\"f1_env1\" expand=\"0\" fill=\"0\"/></align><value param=\"f1_env1\"/>"
+ "</vbox>"
+ "<vbox>"
+ " <label param=\"adsr_a\" />"
+ " <align><knob param=\"adsr_a\" expand=\"0\" fill=\"0\"/></align><value param=\"adsr_a\"/>"
+ "</vbox>"
+ "<vbox>"
+ " <label param=\"adsr_d\" />"
+ " <align><knob param=\"adsr_d\" expand=\"0\" fill=\"0\"/></align><value param=\"adsr_d\"/>"
+ "</vbox>"
+ "<vbox>"
+ " <label param=\"adsr_s\" />"
+ " <align><knob param=\"adsr_s\" expand=\"0\" fill=\"0\"/></align><value param=\"adsr_s\"/>"
+ "</vbox>"
+ "<vbox>"
+ " <label param=\"adsr_r\" />"
+ " <align><knob param=\"adsr_r\" expand=\"0\" fill=\"0\"/></align><value param=\"adsr_r\"/>"
+ "</vbox>"
+ "</hbox>"
"</vbox>"
;
}
@@ -171,6 +201,15 @@ parameter_properties organ_audio_module::param_props[] = {
{ 3, 2, 3, 1, PF_ENUM | PF_CTL_COMBO, organ_percussion_harmonic_names, "perc_harm", "Perc. harmonic" },
{ 0.1, 0, 1, 100, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB, NULL, "master", "Volume" },
+
+ { 2000, 20, 20000, 100, PF_FLOAT | PF_SCALE_LOG | PF_UNIT_HZ | PF_CTL_KNOB, NULL, "f1_cutoff", "F1 Cutoff" },
+ { 2, 0.7, 8, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB, NULL, "f1_res", "F1 Res" },
+ { 8000, -10800,10800, 0, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_CENTS, NULL, "f1_env1", "F1 Env1" },
+
+ { 1, 1,20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_a", "EG1 Attack" },
+ { 350, 10,20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_d", "EG1 Decay" },
+ { 0.5, 0, 1, 0, PF_FLOAT | PF_SCALE_PERC, NULL, "adsr_s", "EG1 Sustain" },
+ { 50, 10,20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_r", "EG1 Release" },
};
////////////////////////////////////////////////////////////////////////////
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list