2 * Example audio modules - monosynth
4 * Copyright (C) 2001-2007 Krzysztof Foltman
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General
17 * Public License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301 USA
26 #include <jack/jack.h>
28 #include <calf/giface.h>
29 #include <calf/modules_synths.h>
32 using namespace calf_plugins
;
37 static const char *monosynth_mod_src_names
[] = {
47 static const char *monosynth_mod_dest_names
[] = {
60 monosynth_audio_module::monosynth_audio_module()
61 : mod_matrix(mod_matrix_data
, mod_matrix_slots
, monosynth_mod_src_names
, monosynth_mod_dest_names
)
63 , inertia_pitchbend(1)
64 , inertia_pressure(64)
68 void monosynth_audio_module::activate() {
73 inertia_pitchbend
.set_now(1.f
);
76 modwheel_value_int
= 0;
77 inertia_cutoff
.set_now(*params
[par_cutoff
]);
78 inertia_pressure
.set_now(0);
82 last_pwshift1
= last_pwshift2
= 0;
85 waveform_family
<MONOSYNTH_WAVE_BITS
> *monosynth_audio_module::waves
;
87 void monosynth_audio_module::precalculate_waves(progress_report_iface
*reporter
)
89 float data
[1 << MONOSYNTH_WAVE_BITS
];
90 bandlimiter
<MONOSYNTH_WAVE_BITS
> bl
;
95 static waveform_family
<MONOSYNTH_WAVE_BITS
> waves_data
[wave_count
];
98 enum { S
= 1 << MONOSYNTH_WAVE_BITS
, HS
= S
/ 2, QS
= S
/ 4, QS3
= 3 * QS
};
102 reporter
->report_progress(0, "Precalculating waveforms");
104 // yes these waves don't have really perfect 1/x spectrum because of aliasing
106 for (int i
= 0 ; i
< HS
; i
++)
107 data
[i
] = (float)(i
* 1.0 / HS
),
108 data
[i
+ HS
] = (float)(i
* 1.0 / HS
- 1.0f
);
109 waves
[wave_saw
].make(bl
, data
);
111 // this one is dummy, fake and sham, we're using a difference of two sawtooths for square wave due to PWM
112 for (int i
= 0 ; i
< S
; i
++)
113 data
[i
] = (float)(i
< HS
? -1.f
: 1.f
);
114 waves
[wave_sqr
].make(bl
, data
, 4);
116 for (int i
= 0 ; i
< S
; i
++)
117 data
[i
] = (float)(i
< (64 * S
/ 2048)? -1.f
: 1.f
);
118 waves
[wave_pulse
].make(bl
, data
);
120 for (int i
= 0 ; i
< S
; i
++)
121 data
[i
] = (float)sin(i
* M_PI
/ HS
);
122 waves
[wave_sine
].make(bl
, data
);
124 for (int i
= 0 ; i
< QS
; i
++) {
126 data
[i
+ QS
] = 1 - i
* iQS
,
127 data
[i
+ HS
] = - i
* iQS
,
128 data
[i
+ QS3
] = -1 + i
* iQS
;
130 waves
[wave_triangle
].make(bl
, data
);
132 for (int i
= 0, j
= 1; i
< S
; i
++) {
133 data
[i
] = -1 + j
* 1.0 / HS
;
137 waves
[wave_varistep
].make(bl
, data
);
139 for (int i
= 0; i
< S
; i
++) {
140 data
[i
] = (min(1.f
, (float)(i
/ 64.f
))) * (1.0 - i
* 1.0 / S
) * (-1 + fmod (i
* i
* 8/ (S
* S
* 1.0), 2.0));
142 waves
[wave_skewsaw
].make(bl
, data
);
143 for (int i
= 0; i
< S
; i
++) {
144 data
[i
] = (min(1.f
, (float)(i
/ 64.f
))) * (1.0 - i
* 1.0 / S
) * (fmod (i
* i
* 8/ (S
* S
* 1.0), 2.0) < 1.0 ? -1.0 : +1.0);
146 waves
[wave_skewsqr
].make(bl
, data
);
149 reporter
->report_progress(50, "Precalculating waveforms");
151 for (int i
= 0; i
< S
; i
++) {
153 float p
= i
* 1.0 / QS3
;
154 data
[i
] = sin(M_PI
* p
* p
* p
);
156 float p
= (i
- QS3
* 1.0) / QS
;
157 data
[i
] = -0.5 * sin(3 * M_PI
* p
* p
);
160 waves
[wave_test1
].make(bl
, data
);
161 for (int i
= 0; i
< S
; i
++) {
162 data
[i
] = exp(-i
* 1.0 / HS
) * sin(i
* M_PI
/ HS
) * cos(2 * M_PI
* i
/ HS
);
164 normalize_waveform(data
, S
);
165 waves
[wave_test2
].make(bl
, data
);
166 for (int i
= 0; i
< S
; i
++) {
167 //int ii = (i < HS) ? i : S - i;
169 data
[i
] = (ii
* 1.0 / HS
) * sin(i
* 3 * M_PI
/ HS
+ 2 * M_PI
* sin(M_PI
/ 4 + i
* 4 * M_PI
/ HS
)) * sin(i
* 5 * M_PI
/ HS
+ 2 * M_PI
* sin(M_PI
/ 8 + i
* 6 * M_PI
/ HS
));
171 waves
[wave_test3
].make(bl
, data
);
172 for (int i
= 0; i
< S
; i
++) {
173 data
[i
] = sin(i
* 2 * M_PI
/ HS
+ sin(i
* 2 * M_PI
/ HS
+ 0.5 * M_PI
* sin(i
* 18 * M_PI
/ HS
)) * sin(i
* 1 * M_PI
/ HS
+ 0.5 * M_PI
* sin(i
* 11 * M_PI
/ HS
)));
175 waves
[wave_test4
].make(bl
, data
);
176 for (int i
= 0; i
< S
; i
++) {
177 data
[i
] = sin(i
* 2 * M_PI
/ HS
+ 0.2 * M_PI
* sin(i
* 13 * M_PI
/ HS
) + 0.1 * M_PI
* sin(i
* 37 * M_PI
/ HS
)) * sin(i
* M_PI
/ HS
+ 0.2 * M_PI
* sin(i
* 15 * M_PI
/ HS
));
179 waves
[wave_test5
].make(bl
, data
);
180 for (int i
= 0; i
< S
; i
++) {
182 data
[i
] = sin(i
* 2 * M_PI
/ HS
);
185 data
[i
] = sin(i
* 4 * M_PI
/ HS
);
188 data
[i
] = sin(i
* 8 * M_PI
/ HS
);
190 data
[i
] = sin(i
* 8 * M_PI
/ HS
) * (S
- i
) / (S
/ 8);
192 waves
[wave_test6
].make(bl
, data
);
193 for (int i
= 0; i
< S
; i
++) {
194 int j
= i
>> (MONOSYNTH_WAVE_BITS
- 11);
195 data
[i
] = (j
^ 0x1D0) * 1.0 / HS
- 1;
197 waves
[wave_test7
].make(bl
, data
);
198 for (int i
= 0; i
< S
; i
++) {
199 int j
= i
>> (MONOSYNTH_WAVE_BITS
- 11);
200 data
[i
] = -1 + 0.66 * (3 & ((j
>> 8) ^ (j
>> 10) ^ (j
>> 6)));
202 waves
[wave_test8
].make(bl
, data
);
204 reporter
->report_progress(100, "");
208 bool monosynth_audio_module::get_graph(int index
, int subindex
, float *data
, int points
, cairo_iface
*context
)
210 monosynth_audio_module::precalculate_waves(NULL
);
211 // printf("get_graph %d %p %d wave1=%d wave2=%d\n", index, data, points, wave1, wave2);
212 if (index
== par_wave1
|| index
== par_wave2
) {
215 enum { S
= 1 << MONOSYNTH_WAVE_BITS
};
216 float value
= *params
[index
];
217 int wave
= dsp::clip(dsp::fastf2i_drm(value
), 0, (int)wave_count
- 1);
219 uint32_t shift
= index
== par_wave1
? last_pwshift1
: last_pwshift2
;
221 shift
= (int32_t)(0x78000000 * (*params
[index
== par_wave1
? par_pw1
: par_pw2
]));
222 int flag
= (wave
== wave_sqr
);
224 shift
= (flag
? S
/2 : 0) + (shift
>> (32 - MONOSYNTH_WAVE_BITS
));
225 int sign
= flag
? -1 : 1;
226 if (wave
== wave_sqr
)
228 float *waveform
= waves
[wave
].original
;
229 for (int i
= 0; i
< points
; i
++)
230 data
[i
] = (sign
* waveform
[i
* S
/ points
] + waveform
[(i
* S
/ points
+ shift
) & (S
- 1)]) / (sign
== -1 ? 1 : 2);
233 if (index
== par_filtertype
) {
236 if (subindex
> (is_stereo_filter() ? 1 : 0))
238 for (int i
= 0; i
< points
; i
++)
240 typedef complex<double> cfloat
;
241 double freq
= 20.0 * pow (20000.0 / 20.0, i
* 1.0 / points
);
243 dsp::biquad_d1_lerp
<float> &f
= subindex
? filter2
: filter
;
244 float level
= f
.freq_gain(freq
, srate
);
245 if (!is_stereo_filter())
246 level
*= filter2
.freq_gain(freq
, srate
);
249 data
[i
] = log(level
) / log(1024.0) + 0.5;
253 return get_static_graph(index
, subindex
, *params
[index
], data
, points
, context
);
256 void monosynth_audio_module::calculate_buffer_oscs(float lfo
)
258 int flag1
= (wave1
== wave_sqr
);
259 int flag2
= (wave2
== wave_sqr
);
260 int32_t shift1
= last_pwshift1
;
261 int32_t shift2
= last_pwshift2
;
262 int32_t shift_target1
= (int32_t)(0x78000000 * dsp::clip11(*params
[par_pw1
] + lfo
* *params
[par_lfopw
] + 0.01f
* moddest
[moddest_o1pw
]));
263 int32_t shift_target2
= (int32_t)(0x78000000 * dsp::clip11(*params
[par_pw2
] + lfo
* *params
[par_lfopw
] + 0.01f
* moddest
[moddest_o2pw
]));
264 int32_t shift_delta1
= ((shift_target1
>> 1) - (last_pwshift1
>> 1)) >> (step_shift
- 1);
265 int32_t shift_delta2
= ((shift_target2
>> 1) - (last_pwshift2
>> 1)) >> (step_shift
- 1);
267 last_pwshift1
= shift_target1
;
268 last_pwshift2
= shift_target2
;
270 shift1
+= (flag1
<< 31);
271 shift2
+= (flag2
<< 31);
272 float mix1
= 1 - 2 * flag1
, mix2
= 1 - 2 * flag2
;
274 float new_xfade
= dsp::clip
<float>(xfade
+ 0.01f
* moddest
[moddest_oscmix
], 0.f
, 1.f
);
275 float cur_xfade
= last_xfade
;
276 float xfade_step
= (new_xfade
- cur_xfade
) * (1.0 / step_size
);
278 for (uint32_t i
= 0; i
< step_size
; i
++)
280 float osc1val
= osc1
.get_phaseshifted(shift1
, mix1
);
281 float osc2val
= osc2
.get_phaseshifted(shift2
, mix2
);
282 float wave
= osc1val
+ (osc2val
- osc1val
) * cur_xfade
;
284 shift1
+= shift_delta1
;
285 shift2
+= shift_delta2
;
286 cur_xfade
+= xfade_step
;
288 last_xfade
= new_xfade
;
291 void monosynth_audio_module::calculate_buffer_ser()
293 filter
.big_step(1.0 / step_size
);
294 filter2
.big_step(1.0 / step_size
);
295 for (uint32_t i
= 0; i
< step_size
; i
++)
297 float wave
= buffer
[i
] * fgain
;
298 wave
= filter
.process(wave
);
299 wave
= filter2
.process(wave
);
301 fgain
+= fgain_delta
;
305 void monosynth_audio_module::calculate_buffer_single()
307 filter
.big_step(1.0 / step_size
);
308 for (uint32_t i
= 0; i
< step_size
; i
++)
310 float wave
= buffer
[i
] * fgain
;
311 wave
= filter
.process(wave
);
313 fgain
+= fgain_delta
;
317 void monosynth_audio_module::calculate_buffer_stereo()
319 filter
.big_step(1.0 / step_size
);
320 filter2
.big_step(1.0 / step_size
);
321 for (uint32_t i
= 0; i
< step_size
; i
++)
323 float wave1
= buffer
[i
] * fgain
;
324 float wave2
= phaseshifter
.process_ap(wave1
);
325 buffer
[i
] = fgain
* filter
.process(wave1
);
326 buffer2
[i
] = fgain
* filter2
.process(wave2
);
327 fgain
+= fgain_delta
;
331 void monosynth_audio_module::lookup_waveforms()
333 osc1
.waveform
= waves
[wave1
== wave_sqr
? wave_saw
: wave1
].get_level(osc1
.phasedelta
);
334 osc2
.waveform
= waves
[wave2
== wave_sqr
? wave_saw
: wave2
].get_level(osc2
.phasedelta
);
335 if (!osc1
.waveform
) osc1
.waveform
= silence
;
336 if (!osc2
.waveform
) osc2
.waveform
= silence
;
341 void monosynth_audio_module::delayed_note_on()
343 force_fadeout
= false;
347 target_freq
= freq
= 440 * pow(2.0, (queue_note_on
- 69) / 12.0);
348 velocity
= queue_vel
;
349 ampctl
= 1.0 + (queue_vel
- 1.0) * *params
[par_vel2amp
];
350 fltctl
= 1.0 + (queue_vel
- 1.0) * *params
[par_vel2filter
];
365 switch((int)*params
[par_oscmode
])
368 osc2
.phase
= 0x80000000;
371 osc2
.phase
= 0x40000000;
374 osc1
.phase
= osc2
.phase
= 0x40000000;
377 osc1
.phase
= 0x40000000;
378 osc2
.phase
= 0xC0000000;
381 // rand() is crap, but I don't have any better RNG in Calf yet
382 osc1
.phase
= rand() << 16;
383 osc2
.phase
= rand() << 16;
391 if (legato
>= 2 && !gate
)
395 if (!(legato
& 1) || envelope
.released()) {
400 float modsrc
[modsrc_count
] = { 1, velocity
, inertia_pressure
.get_last(), modwheel_value
, 0, 0.5+0.5*last_lfov
};
401 calculate_modmatrix(moddest
, moddest_count
, modsrc
);
404 void monosynth_audio_module::set_sample_rate(uint32_t sr
) {
406 crate
= sr
/ step_size
;
407 odcr
= (float)(1.0 / crate
);
408 phaseshifter
.set_ap(1000.f
, sr
);
411 inertia_cutoff
.ramp
.set_length(crate
/ 30); // 1/30s
412 inertia_pitchbend
.ramp
.set_length(crate
/ 30); // 1/30s
415 void monosynth_audio_module::calculate_step()
417 if (queue_note_on
!= -1)
422 dsp::zero(buffer
, step_size
);
423 if (is_stereo_filter())
424 dsp::zero(buffer2
, step_size
);
428 lfo
.set_freq(*params
[par_lforate
], crate
);
429 float porta_total_time
= *params
[par_portamento
] * 0.001f
;
431 if (porta_total_time
>= 0.00101f
&& porta_time
>= 0) {
432 // XXXKF this is criminal, optimize!
433 float point
= porta_time
/ porta_total_time
;
438 freq
= start_freq
+ (target_freq
- start_freq
) * point
;
439 // freq = start_freq * pow(target_freq / start_freq, point);
443 float lfov
= lfo
.get() * std::min(1.0f
, lfo_clock
/ *params
[par_lfodelay
]);
444 lfov
= lfov
* dsp::lerp(1.f
, modwheel_value
, *params
[par_mwhl_lfo
]);
446 if (fabs(*params
[par_lfopitch
]) > small_value
<float>())
447 lfo_bend
= pow(2.0f
, *params
[par_lfopitch
] * lfov
* (1.f
/ 1200.0f
));
448 inertia_pitchbend
.step();
451 float env
= envelope
.value
;
454 // this should be optimized heavily; I think I'll do it when MIDI in Ardour 3 gets stable :>
455 float modsrc
[modsrc_count
] = { 1, velocity
, inertia_pressure
.get(), modwheel_value
, env
, 0.5+0.5*lfov
};
456 calculate_modmatrix(moddest
, moddest_count
, modsrc
);
458 inertia_cutoff
.set_inertia(*params
[par_cutoff
]);
459 cutoff
= inertia_cutoff
.get() * pow(2.0f
, (lfov
* *params
[par_lfofilter
] + env
* fltctl
* *params
[par_envmod
] + moddest
[moddest_cutoff
]) * (1.f
/ 1200.f
));
460 if (*params
[par_keyfollow
] > 0.01f
)
461 cutoff
*= pow(freq
/ 264.f
, *params
[par_keyfollow
]);
462 cutoff
= dsp::clip(cutoff
, 10.f
, 18000.f
);
463 float resonance
= *params
[par_resonance
];
464 float e2r
= *params
[par_envtores
];
465 float e2a
= *params
[par_envtoamp
];
466 resonance
= resonance
* (1 - e2r
) + (0.7 + (resonance
- 0.7) * env
* env
) * e2r
+ moddest
[moddest_resonance
];
467 float cutoff2
= dsp::clip(cutoff
* separation
, 10.f
, 18000.f
);
468 float newfgain
= 0.f
;
469 if (filter_type
!= last_filter_type
)
471 filter
.y2
= filter
.y1
= filter
.x2
= filter
.x1
= filter
.y1
;
472 filter2
.y2
= filter2
.y1
= filter2
.x2
= filter2
.x1
= filter2
.y1
;
473 last_filter_type
= filter_type
;
478 filter
.set_lp_rbj(cutoff
, resonance
, srate
);
480 newfgain
= min(0.7f
, 0.7f
/ resonance
) * ampctl
;
483 filter
.set_hp_rbj(cutoff
, resonance
, srate
);
485 newfgain
= min(0.7f
, 0.7f
/ resonance
) * ampctl
;
488 filter
.set_lp_rbj(cutoff
, resonance
, srate
);
489 filter2
.set_lp_rbj(cutoff2
, resonance
, srate
);
490 newfgain
= min(0.5f
, 0.5f
/ resonance
) * ampctl
;
493 filter
.set_lp_rbj(cutoff
, resonance
, srate
);
494 filter2
.set_br_rbj(cutoff2
, 1.0 / resonance
, srate
);
495 newfgain
= min(0.5f
, 0.5f
/ resonance
) * ampctl
;
498 filter
.set_hp_rbj(cutoff
, resonance
, srate
);
499 filter2
.set_br_rbj(cutoff2
, 1.0 / resonance
, srate
);
500 newfgain
= min(0.5f
, 0.5f
/ resonance
) * ampctl
;
503 filter
.set_lp_rbj(cutoff
, resonance
, srate
);
504 filter2
.set_lp_rbj(cutoff2
, resonance
, srate
);
505 newfgain
= min(0.7f
, 0.7f
/ resonance
) * ampctl
;
508 filter
.set_bp_rbj(cutoff
, resonance
, srate
);
513 filter
.set_bp_rbj(cutoff
, resonance
, srate
);
514 filter2
.set_bp_rbj(cutoff2
, resonance
, srate
);
519 if (*params
[par_envtoamp
] > 0.f
)
520 newfgain
*= 1.0 - (1.0 - aenv
) * e2a
;
521 if (moddest
[moddest_attenuation
] != 0.f
)
522 newfgain
*= dsp::clip
<float>(1 - moddest
[moddest_attenuation
] * moddest
[moddest_attenuation
], 0.f
, 1.f
);
523 fgain_delta
= (newfgain
- fgain
) * (1.0 / step_size
);
524 calculate_buffer_oscs(lfov
);
529 case flt_hpbr
: // Oomek's wish
530 calculate_buffer_ser();
535 calculate_buffer_single();
539 calculate_buffer_stereo();
542 if ((envelope
.state
== adsr::STOP
&& !gate
) || force_fadeout
|| (envelope
.state
== adsr::RELEASE
&& *params
[par_envtoamp
] <= 0.f
))
544 enum { ramp
= step_size
* 4 };
545 for (int i
= 0; i
< step_size
; i
++)
546 buffer
[i
] *= (ramp
- i
- stop_count
) * (1.0f
/ ramp
);
547 if (is_stereo_filter())
548 for (int i
= 0; i
< step_size
; i
++)
549 buffer2
[i
] *= (ramp
- i
- stop_count
) * (1.0f
/ ramp
);
550 stop_count
+= step_size
;
551 if (stop_count
>= ramp
)
556 void monosynth_audio_module::note_on(int note
, int vel
)
558 queue_note_on
= note
;
560 queue_vel
= vel
/ 127.f
;
564 void monosynth_audio_module::note_off(int note
, int vel
)
567 // If releasing the currently played note, try to get another one from note stack.
568 if (note
== last_key
) {
571 last_key
= note
= stack
.nth(stack
.count() - 1);
573 target_freq
= freq
= dsp::note_to_hz(note
);
588 void monosynth_audio_module::channel_pressure(int value
)
590 inertia_pressure
.set_inertia(value
* (1.0 / 127.0));
593 void monosynth_audio_module::control_change(int controller
, int value
)
598 modwheel_value_int
= (modwheel_value_int
& 127) | (value
<< 7);
599 modwheel_value
= modwheel_value_int
/ 16383.0;
602 modwheel_value_int
= (modwheel_value_int
& (127 << 7)) | value
;
603 modwheel_value
= modwheel_value_int
/ 16383.0;
605 case 120: // all sounds off
606 force_fadeout
= true;
608 case 123: // all notes off
617 void monosynth_audio_module::deactivate()
626 void monosynth_audio_module::set_frequency()
628 float detune_scaled
= (detune
- 1); // * log(freq / 440);
629 if (*params
[par_scaledetune
] > 0)
630 detune_scaled
*= pow(20.0 / freq
, (double)*params
[par_scaledetune
]);
631 float p1
= 1, p2
= 1;
632 if (moddest
[moddest_o1detune
] != 0)
633 p1
= pow(2.0, moddest
[moddest_o1detune
] * (1.0 / 1200.0));
634 if (moddest
[moddest_o2detune
] != 0)
635 p2
= pow(2.0, moddest
[moddest_o2detune
] * (1.0 / 1200.0));
636 osc1
.set_freq(freq
* (1 - detune_scaled
) * p1
* inertia_pitchbend
.get_last() * lfo_bend
, srate
);
637 osc2
.set_freq(freq
* (1 + detune_scaled
) * p2
* inertia_pitchbend
.get_last() * lfo_bend
* xpose
, srate
);
641 void monosynth_audio_module::params_changed()
644 envelope
.set(*params
[par_attack
] * sf
, *params
[par_decay
] * sf
, std::min(0.999f
, *params
[par_sustain
]), *params
[par_release
] * sf
, srate
/ step_size
, *params
[par_fade
] * sf
);
645 filter_type
= dsp::fastf2i_drm(*params
[par_filtertype
]);
646 decay_factor
= odcr
* 1000.0 / *params
[par_decay
];
647 separation
= pow(2.0, *params
[par_cutoffsep
] / 1200.0);
648 wave1
= dsp::clip(dsp::fastf2i_drm(*params
[par_wave1
]), 0, (int)wave_count
- 1);
649 wave2
= dsp::clip(dsp::fastf2i_drm(*params
[par_wave2
]), 0, (int)wave_count
- 1);
650 detune
= pow(2.0, *params
[par_detune
] / 1200.0);
651 xpose
= pow(2.0, *params
[par_osc2xpose
] / 12.0);
652 xfade
= *params
[par_oscmix
];
653 legato
= dsp::fastf2i_drm(*params
[par_legato
]);
654 master
.set_inertia(*params
[par_master
]);
656 if (wave1
!= prev_wave1
|| wave2
!= prev_wave2
)
661 uint32_t monosynth_audio_module::process(uint32_t offset
, uint32_t nsamples
, uint32_t inputs_mask
, uint32_t outputs_mask
)
663 if (!running
&& queue_note_on
== -1) {
664 for (uint32_t i
= 0; i
< nsamples
/ step_size
; i
++)
668 uint32_t op
= offset
;
669 uint32_t op_end
= offset
+ nsamples
;
671 if (output_pos
== 0) {
672 if (running
|| queue_note_on
!= -1)
676 dsp::zero(buffer
, step_size
);
680 uint32_t ip
= output_pos
;
681 uint32_t len
= std::min(step_size
- output_pos
, op_end
- op
);
682 if (is_stereo_filter())
683 for(uint32_t i
= 0 ; i
< len
; i
++) {
684 float vol
= master
.get();
685 outs
[0][op
+ i
] = buffer
[ip
+ i
] * vol
,
686 outs
[1][op
+ i
] = buffer2
[ip
+ i
] * vol
;
689 for(uint32_t i
= 0 ; i
< len
; i
++)
690 outs
[0][op
+ i
] = outs
[1][op
+ i
] = buffer
[ip
+ i
] * master
.get();
693 if (output_pos
== step_size
)