[SCM] calf/master: + Organ: GUI reorganisation (move percussion and foldover to new tab), rewrite percussion section (uses FM now)
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:37:25 UTC 2013
The following commit has been merged in the master branch:
commit 56c425b625fdd6e6b90d48e6590dab24e5b284cf
Author: kfoltman <kfoltman at 78b06b96-2940-0410-b7fc-879d825d01d8>
Date: Fri Jul 25 22:58:04 2008 +0000
+ Organ: GUI reorganisation (move percussion and foldover to new tab), rewrite percussion section (uses FM now)
git-svn-id: https://calf.svn.sourceforge.net/svnroot/calf/trunk@240 78b06b96-2940-0410-b7fc-879d825d01d8
diff --git a/src/calf/organ.h b/src/calf/organ.h
index 82fcc84..f339113 100644
--- a/src/calf/organ.h
+++ b/src/calf/organ.h
@@ -52,8 +52,13 @@ struct organ_parameters {
float foldover;
float percussion_time;
float percussion_level;
- float percussion_timbre;
+ float percussion_wave;
+ float percussion_harmonic;
+ float percussion_fm_wave;
+ float percussion_fm_harmonic;
+ float percussion_fm_depth;
float percussion_trigger;
+ float percussion_vel2amp;
float filter_chain;
float master;
@@ -74,7 +79,8 @@ struct organ_parameters {
organ_parameters() : pitch_bend(1.0f) {}
- inline int get_percussion_timbre() { return dsp::fastf2i_drm(percussion_timbre); }
+ inline int get_percussion_wave() { return dsp::fastf2i_drm(percussion_wave); }
+ inline int get_percussion_fm_wave() { return dsp::fastf2i_drm(percussion_fm_wave); }
};
#define ORGAN_WAVE_BITS 12
@@ -237,7 +243,7 @@ public:
class percussion_voice: public organ_voice_base {
public:
int sample_rate;
- dsp::fixed_point<int64_t, 20> phase, dphase;
+ dsp::fixed_point<int64_t, 20> phase, modphase, dphase, moddphase;
dsp::biquad<float> filter;
percussion_voice(organ_parameters *_parameters)
@@ -247,73 +253,32 @@ public:
void reset() {
phase = 0;
+ modphase = 0;
note = -1;
}
- void note_on(int note, int /*vel*/) {
+ void note_on(int note, int vel) {
// do not reset phase if voice is still running (to prevent clicks, even at cost of slight loss of "percussiveness")
if (!amp.get_active())
{
phase = 0;
+ modphase = 0;
filter.reset_d1();
}
this->note = note;
- amp.set(1.0f);
+ amp.set(1.0f + (vel - 127) * parameters->percussion_vel2amp / 127.0);
update_pitch();
}
void update_pitch()
{
- int timbre = parameters->get_percussion_timbre();
- static const int harm_muls[8] = { 1, 2, 3, 4, 8, 1, 2, 4 };
- dphase.set(synth::midi_note_to_phase(note, 0, sample_rate) * harm_muls[timbre] * parameters->pitch_bend);
+ float phase = synth::midi_note_to_phase(note, 0, sample_rate);
+ dphase.set(phase * parameters->percussion_harmonic * parameters->pitch_bend);
+ moddphase.set(phase * parameters->percussion_fm_harmonic * parameters->pitch_bend);
}
// this doesn't really have a voice interface
- void render_to(float (*buf)[2], int nsamples) {
- if (note == -1)
- return;
-
- if (!amp.get_active())
- return;
- if (parameters->percussion_level < small_value<float>())
- return;
- static const organ_waveform wave_ids[] = { wave_sine, wave_sine, wave_sine, wave_bell, wave_bell, wave_sqr, wave_sqr, wave_sqr };
- float level = parameters->percussion_level * 9;
- // XXXKF the decay needs work!
- double age_const = parameters->perc_decay_const;
- int timbre = parameters->get_percussion_timbre();
- if (timbre < 0 || timbre >= (int)(sizeof(wave_ids) / sizeof(wave_ids[0])))
- return;
- float *data = (*waves)[wave_ids[timbre]].get_level(dphase.get());
- if (!data)
- return;
- if (timbre < 3)
- {
- for (int i = 0; i < nsamples; i++) {
- float osc = level * wave(data, phase);
- osc *= level * amp.get();
- buf[i][0] += osc;
- buf[i][1] += osc;
- amp.age_exp(age_const, 1.0 / 32768.0);
- phase += dphase;
- }
- }
- else
- {
- float av = amp.get();
- filter.set_lp_rbj(400 + 5000 * (av * 0.2 + av * av * 0.8), 0.707, sample_rate);
- for (int i = 0; i < nsamples; i++) {
- float osc = filter.process_d1(level * wave(data, phase));
- osc *= level * amp.get();
- buf[i][0] += osc;
- buf[i][1] += osc;
- amp.age_exp(age_const, 1.0 / 32768.0);
- phase += dphase;
- }
- filter.sanitize_d1();
- }
- }
+ void render_to(float (*buf)[2], int nsamples);
bool get_active() {
return (note != -1) && amp.get_active();
}
@@ -339,7 +304,7 @@ struct drawbar_organ: public synth::basic_synth {
par_pan1, par_pan2, par_pan3, par_pan4, par_pan5, par_pan6, par_pan7, par_pan8, par_pan9,
par_routing1, par_routing2, par_routing3, par_routing4, par_routing5, par_routing6, par_routing7, par_routing8, par_routing9,
par_foldover,
- par_percdecay, par_perclevel, par_perctimbre, par_perctrigger,
+ par_percdecay, par_perclevel, par_percwave, par_percharm, par_percfmwave, par_percfmharm, par_percfmdepth, par_perctrigger, par_percvel2amp,
par_filterchain,
par_master,
par_f1cutoff, par_f1res, par_f1env1, par_f1env2, par_f1env3, par_f1keyf,
diff --git a/src/organ.cpp b/src/organ.cpp
index 2d2c78e..6aadacc 100644
--- a/src/organ.cpp
+++ b/src/organ.cpp
@@ -54,36 +54,17 @@ const char *organ_audio_module::get_gui_xml()
"<vbox border=\"10\">"
"<hbox>"
"<if cond=\"directlink\">"
- "<line-graph param=\"master\" refresh=\"1\"/>"
+ "<align scale-x=\"0.0\" scale-y=\"1.0\" align-x=\"0\" align-y=\"0\">"
+ "<line-graph param=\"master\" refresh=\"1\" width=\"120\" height=\"40\" expand=\"0\" fill=\"0\"/>"
+ "</align>"
"</if>"
- "<vbox>"
- "<label param=\"foldnote\"/>"
- "<align><knob param=\"foldnote\"/></align>"
- "<value param=\"foldnote\"/>"
- "</vbox>"
- "<vbox>"
- "<label param=\"perc_decay\"/>"
- "<knob param=\"perc_decay\" expand=\"0\" fill=\"0\"/>"
- "<value param=\"perc_decay\"/>"
- "</vbox>"
- "<vbox>"
- "<label param=\"perc_level\"/>"
- "<knob param=\"perc_level\" expand=\"0\" fill=\"0\"/>"
- "<value param=\"perc_level\"/>"
- "</vbox>"
- "<vbox>"
- "<label param=\"perc_timbre\"/>"
- "<combo param=\"perc_timbre\"/>"
- "</vbox>"
- "<vbox>"
- "<label param=\"perc_trigger\"/>"
- "<combo param=\"perc_trigger\"/>"
- "</vbox>"
- "<vbox>"
- "<label param=\"master\"/>"
- "<knob param=\"master\"/>"
- "<value param=\"master\"/>"
- "</vbox>"
+ "<align scale-x=\"0.0\" scale-y=\"0.0\" align-x=\"1.0\" align-y=\"0.5\">"
+ "<vbox>"
+ "<label param=\"master\"/>"
+ "<knob param=\"master\"/>"
+ "<value param=\"master\"/>"
+ "</vbox>"
+ "</align>"
"</hbox>"
"<notebook>"
"<vbox page=\"Tone generator\">"
@@ -292,6 +273,67 @@ const char *organ_audio_module::get_gui_xml()
"</vbox>"
"</frame>"
"</hbox>"
+ "<vbox page=\"Advanced\">"
+ "<align scale-x=\"0.8\" scale-y=\"0.3\">"
+ "<frame label=\"Percussive section\">"
+ "<hbox>"
+ "<vbox>"
+ "<label param=\"perc_decay\"/>"
+ "<knob param=\"perc_decay\" expand=\"0\" fill=\"0\"/>"
+ "<value param=\"perc_decay\"/>"
+ "</vbox>"
+ "<vbox>"
+ "<label param=\"perc_level\"/>"
+ "<knob param=\"perc_level\" expand=\"0\" fill=\"0\"/>"
+ "<value param=\"perc_level\"/>"
+ "</vbox>"
+ "<vbox>"
+ "<label param=\"perc_vel2amp\"/>"
+ "<knob param=\"perc_vel2amp\" expand=\"0\" fill=\"0\"/>"
+ "<value param=\"perc_vel2amp\"/>"
+ "</vbox>"
+ "<vbox>"
+ "<label param=\"perc_waveform\"/>"
+ "<combo param=\"perc_waveform\"/>"
+ "</vbox>"
+ "<vbox>"
+ "<label param=\"perc_harmonic\"/>"
+ "<knob param=\"perc_harmonic\" expand=\"0\" fill=\"0\"/>"
+ "<value param=\"perc_harmonic\"/>"
+ "</vbox>"
+ "<vbox>"
+ "<label param=\"perc_fm_waveform\"/>"
+ "<combo param=\"perc_fm_waveform\"/>"
+ "</vbox>"
+ "<vbox>"
+ "<label param=\"perc_fm_harmonic\"/>"
+ "<knob param=\"perc_fm_harmonic\" expand=\"0\" fill=\"0\"/>"
+ "<value param=\"perc_fm_harmonic\"/>"
+ "</vbox>"
+ "<vbox>"
+ "<label param=\"perc_fm_depth\"/>"
+ "<knob param=\"perc_fm_depth\" expand=\"0\" fill=\"0\"/>"
+ "<value param=\"perc_fm_depth\"/>"
+ "</vbox>"
+ "<vbox>"
+ "<label param=\"perc_trigger\"/>"
+ "<combo param=\"perc_trigger\"/>"
+ "</vbox>"
+ "</hbox>"
+ "</frame>"
+ "</align>"
+ "<align scale-x=\"0.8\" scale-y=\"0.3\">"
+ "<frame label=\"Additional settings\">"
+ "<vbox>"
+ "<label param=\"foldnote\"/>"
+ "<align><knob param=\"foldnote\"/></align>"
+ "<value param=\"foldnote\"/>"
+ "</vbox>"
+ "</frame>"
+ "</align>"
+ "<vbox>"
+ "</vbox>"
+ "</vbox>"
"</notebook>"
"</vbox>"
;
@@ -338,10 +380,6 @@ bool organ_audio_module::get_graph(int index, int subindex, float *data, int poi
const char *organ_audio_module::port_names[] = {"Out L", "Out R"};
-const char *organ_percussion_timbre_names[] = {
- "16' Sine", "8' Sine", "5 1/3' Sine",
- "4' Bell", "2' Bell",
- "16' Sqr", "8' Sqr", "4' Sqr" };
const char *organ_percussion_trigger_names[] = { "First note", "Each note", "Each, no retrig" };
const char *organ_wave_names[] = {
@@ -434,10 +472,15 @@ parameter_properties organ_audio_module::param_props[] = {
{ 0, 0, 2, 0, PF_ENUM | PF_SCALE_LINEAR | PF_CTL_COMBO, organ_routing_names, "routing9", "Routing 9" },
{ 96, 0, 127, 128, PF_INT | PF_CTL_KNOB | PF_UNIT_NOTE, NULL, "foldnote", "Foldover" },
- { 200, 10, 3000, 100, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "perc_decay", "Perc. decay" },
- { 0.25, 0, 1, 100, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB, NULL, "perc_level", "Perc. level" },
- { 2, 0, 7, 1, PF_ENUM | PF_CTL_COMBO, organ_percussion_timbre_names, "perc_timbre", "Perc. timbre" },
- { 0, 0, organ_voice_base::perctrig_count - 1, 0, PF_ENUM | PF_CTL_COMBO, organ_percussion_trigger_names, "perc_trigger", "Perc. trigger" },
+ { 200, 10, 3000, 100, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "perc_decay", "P: Decay time" },
+ { 0.25, 0, 1, 100, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB, NULL, "perc_level", "P: Level" },
+ { 2, 0, organ_voice_base::wave_count_small - 1, 1, PF_ENUM | PF_CTL_COMBO, organ_wave_names, "perc_waveform", "P: Waveform" },
+ { 16, 1, 32, 32, PF_INT | PF_SCALE_LINEAR | PF_CTL_KNOB, NULL, "perc_harmonic", "P: Harmonic" },
+ { 2, 0, organ_voice_base::wave_count_small - 1, 1, PF_ENUM | PF_CTL_COMBO, organ_wave_names, "perc_fm_waveform", "P: FM Waveform" },
+ { 16, 1, 32, 32, PF_INT | PF_SCALE_LINEAR | PF_CTL_KNOB, NULL, "perc_fm_harmonic", "P: FM Freq" },
+ { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_PERC, NULL, "perc_fm_depth", "P: FM Depth" },
+ { 0, 0, organ_voice_base::perctrig_count - 1, 0, PF_ENUM | PF_CTL_COMBO, organ_percussion_trigger_names, "perc_trigger", "P: Trigger" },
+ { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_PERC, NULL, "perc_vel2amp", "P: Vel->Amp" },
{ 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "filter_chain", "Filter 1 To 2" },
{ 0.1, 0, 1, 100, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_PROP_OUTPUT_GAIN, NULL, "master", "Volume" },
@@ -1075,6 +1118,46 @@ void organ_audio_module::execute(int cmd_no)
}
}
+void percussion_voice::render_to(float (*buf)[2], int nsamples) {
+ if (note == -1)
+ return;
+
+ if (!amp.get_active())
+ return;
+ if (parameters->percussion_level < small_value<float>())
+ return;
+ float level = parameters->percussion_level * 9;
+ static float zeros[ORGAN_WAVE_SIZE];
+ // XXXKF the decay needs work!
+ double age_const = parameters->perc_decay_const;
+ int timbre = parameters->get_percussion_wave();
+ if (timbre < 0 || timbre >= wave_count_small)
+ return;
+ int timbre2 = parameters->get_percussion_fm_wave();
+ if (timbre2 < 0 || timbre2 >= wave_count_small)
+ timbre2 = wave_sine;
+ float *fmdata = (*waves)[timbre2].get_level(moddphase.get());
+ if (!fmdata)
+ fmdata = zeros;
+ float *data = (*waves)[timbre].get_level(dphase.get());
+ if (!data) {
+ amp.set(0.0);
+ return;
+ }
+ for (int i = 0; i < nsamples; i++) {
+ float fm = wave(fmdata, modphase);
+ fm *= ORGAN_WAVE_SIZE * parameters->percussion_fm_depth * amp.get();
+ modphase += moddphase;
+
+ float osc = level * wave(data, phase);
+ osc *= level * amp.get();
+ buf[i][0] += osc;
+ buf[i][1] += osc;
+ amp.age_exp(age_const, 1.0 / 32768.0);
+ phase += dphase;
+ phase += dsp::fixed_point<int64_t, 20>(fm);
+ }
+}
plugin_command_info *organ_audio_module::get_commands()
{
static plugin_command_info cmds[] = {
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list