|
|
|
07-30-2020, 03:00 PM
|
#81
|
Human being with feelings
Join Date: Jan 2007
Location: mcr:uk
Posts: 3,891
|
!elaT niaga sknahT
|
|
|
01-11-2021, 09:11 AM
|
#82
|
Human being with feelings
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,653
|
v20210110
*BUMP* New Year, new version!
I've added a new plug-in (insert_to_bus) that can convert an "insert only" effect to a "bus" (wet only) effect by subtracting the dry signal. There are also some minor additions/changes to the libs, see changelog.
|
|
|
01-12-2021, 12:37 AM
|
#83
|
Human being with feelings
Join Date: Jul 2012
Location: Netherlands
Posts: 5,247
|
Great, many thanks Tale !
Forgive me if i missed this but where to find the downloadlink for this update ?
Kind Regards.
|
|
|
01-12-2021, 01:03 AM
|
#85
|
Human being with feelings
Join Date: Jul 2012
Location: Netherlands
Posts: 5,247
|
Aha, thank you !
Keep up the great work you do !
|
|
|
08-06-2021, 09:24 AM
|
#86
|
Human being with feelings
Join Date: Dec 2016
Posts: 61
|
Unfortunately, the Random MIDI Note Generator does not work for me as I had hoped. Whenever I press Play, the same sequence of random notes is played. But every time I press Play, new random notes should be played.
Does anyone have an idea what to change in the code for this?
|
|
|
08-06-2021, 10:31 AM
|
#87
|
Human being with feelings
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,653
|
Quote:
Originally Posted by tom_
Does anyone have an idea what to change in the code for this?
|
Yeah sure. If you add these two lines to the @init section, then it will init the random generator with at a different seed (depeding on the current time in ms):
Code:
t = time_precise();
rng.lcg_init(floor((t - floor(t)) * (2^32 - 3)) + 1);
I guess I could add an extra slider in a future version, so you can switch between repeatable randomness, and "real" randomness, without having to hack the plugin.
|
|
|
08-06-2021, 10:56 AM
|
#88
|
Human being with feelings
Join Date: Dec 2016
Posts: 61
|
Wow, thanks! This works great!
|
|
|
08-16-2021, 06:55 PM
|
#89
|
Human being with feelings
Join Date: Mar 2007
Location: Surrey, BC
Posts: 745
|
Hi Tale,
I've been using the paraphonic wavetable synth, it's nice and simple but can produce quite a variety of pretty cool sounds!
I managed to add the LFO tremolo from your example, which works fine.
I was wondering if you would add in the LFO vibrato that you had in your previous mono/poly synth (which I also still use). I tried looking at the code and figuring it out, but the architecture of that one looks quite different. Plus there's math, which is ultimately my downfall.
If it's a lot of work or not practical or just not something you want to do, that's cool. I'm happy with it as is.
|
|
|
08-19-2021, 09:03 AM
|
#90
|
Human being with feelings
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,653
|
Here's a version with vibrato LFO. Note that I've used my own sine.jsfx-inc for the LFO, just like in mono_synth. However, you could also use my lfo.jsfx-inc instead, like the tremolo example does. That way you could use a single LFO for both tremolo and vibrato, and/or change the waveform to something other than sine.
Code:
desc:Paraphonic wavetable synth
//tags: generator synthesis
//author: Tale
// Copyright (C) 2014-2021 Theo Niessink
// License: LGPL - http://www.gnu.org/licenses/lgpl.html
// \todo Implement sustain pedal, and maybe pitch bend.
slider1:-12.0<-120.0,24.0,0.1>Volume (dB)
slider2:0<-100,100,1>Pan (%)
slider3:0<-1200,1200,1>Tuning (cent)
slider4:0<0,1>-Unused
slider5:3<0,5000,1>Attack (ms)
slider6:1000<1,15000,1>Decay (ms)
slider7:100<0,100,1>Sustain (%)
slider8:8<0,5000,1>Release (ms)
slider9:0<0,1>-Unused
slider10:/Tale/wavetables:Sawtooth.flac:Wavetable
slider11:0<0,1>-Unused
slider12:0<0,100,1>Low-Pass Filter (%)
slider13:3<0,5000,1>Filter Attack (ms)
slider14:1000<1,15000,1>Filter Decay (ms)
slider15:100<0,100,1>Filter Sustain (%)
slider16:8<0,5000,1>Filter Release (ms)
slider17:100<0,100,1>Filter Cutoff (%)
slider18:1.0<0.5,8.0,0.01>Filter Q
slider19:0<0,1>-Unused
slider20:<0,16,1{Any,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>MIDI Ch
slider21:100<0,100,1>Velocity (%)
slider22:0<0,1>-Unused
slider23:0<0,1,1{Off,On}>Phase Lock
slider24:0<0,1>-Unused
slider25:6.0<0.01,12.0,0.001>LFO Rate (Hz)
slider26:0<0,100,1>Vibrato Depth (%)
import midi_queue.jsfx-inc
import adsr.jsfx-inc
import rc_filter.jsfx-inc
import zdf_filter.jsfx-inc
import sine.jsfx-inc
@init
ext_noinit = 1.0;
wavetbl = 0;
num_wavetbls = 8;
wavetbl_len = 4 << (num_wavetbls - 1);
wavetbl_size = num_wavetbls * wavetbl_len;
keyboard = wavetbl + wavetbl_size;
key_size = 4 + 2 + 4;
keyboard_size = 128 * key_size;
midiq.midiq_init(keyboard + keyboard_size);
function int(x) ( x|0 );
function gain(db, inf) ( db <= inf ? 0 : 10^(0.05 * db) );
function cache(x) ( x != this ? ( this = x; 1; ); );
smooth.rc_set(0.0033);
function smooth() ( smooth.lp = this.smooth; this.smooth = smooth.rc_lp(this); );
min_inf = -120.0;
gain0.smooth = gain1.smooth = gain(slider1, min_inf);
function pan(gain, pos)
// global(gain0, gain1)
(
// REAPER default 0 dB pan law (thanks Justin!)
// http://www.askjf.com/index.php?q=2342s
pos *= 0.25*$pi;
gain *= sqrt(2) * (1 - sqrt(0.5) * (1 / cos(pos) - 1));
pos += 0.25*$pi;
gain0 = cos(pos) * gain;
gain1 = sin(pos) * gain;
);
function load_wavetbl()
// global(slider10, wavetbl, wavetbl_len, wavetbl_size, wavetbl_dc)
static(idx)
local(i, fh, nch, sr, tbl)
(
i = int(slider10) + 1;
i != idx ? (
idx = i;
i = 0;
fh = file_open(slider10);
fh >= 0 ? (
file_riff(fh, nch, sr);
nch == 1 && sr == wavetbl_len && file_avail(fh) == wavetbl_size && file_mem(fh, wavetbl, wavetbl_size) == wavetbl_size ? i = idx;
file_close(fh);
);
!i ? memset(wavetbl, 0, wavetbl_size);
);
tbl = wavetbl + wavetbl_size - wavetbl_len;
wavetbl_dc = 0;
loop(wavetbl_len,
wavetbl_dc += tbl[];
tbl += 1;
);
wavetbl_dc /= wavetbl_len;
i;
);
function set_wavetbl(p, note, t)
// global(srate, wavetbl, num_wavetbls, wavetbl_len)
local(dt, n, tbl)
(
dt = 440 * 2^((tuning + note - 69) / 12) / srate;
n = ceil(0.5 / dt) - 1;
tbl = n > 0 ? wavetbl + wavetbl_len * min(num_wavetbls - 1, int(log(n) / log(2))) : -1;
p[0] = note;
p[1] = t;
p[2] = dt;
p[3] = tbl;
);
function get_wavetbl(p, v)
// global(wavetbl, wavetbl_len, wavetbl_dc)
local(note, t, dt, tbl, i, j, lerp)
(
note = p[0];
t = p[1];
dt = p[2];
tbl = p[3];
lerp = t * wavetbl_len;
i = int(lerp);
j = (i + 1) & (wavetbl_len - 1);
lerp -= i;
t += dt * v;
t -= int(t);
p[1] = t;
tbl >= 0 ? (1 - lerp) * tbl[i] + lerp * tbl[j] - wavetbl_dc;
);
function reset_velocity(p, velocity)
(
p[4] = velocity;
);
function set_velocity(p, velocity)
(
p[5] = velocity;
);
function get_velocity(p)
// global(smooth*)
local(velocity)
(
smooth.lp = p[4];
velocity = p[5];
p[4] = smooth.rc_lp(velocity);
);
function load_adsr(p)
instance(state, env, t, s)
(
state = p[6];
env = p[7];
t = p[8];
s = p[9];
);
function store_adsr(p)
instance(state, env, t, s)
(
p[6] = state;
p[7] = env;
p[8] = t;
p[9] = s;
);
function smooth_adsr(g)
// global(smooth*)
instance(s)
(
smooth.lp = s;
this.adsr_sets(smooth.rc_lp(g));
this.adsr_process();
);
function note_on(note, velocity)
// global(keyboard, num_keys, num_release, key_size, env0*, env1*, phase_lock)
local(t, osc, sync, p, end)
(
num_release >= num_keys ? env1.adsr_a(1);
t = 0;
osc = note % 12;
sync = 128;
p = keyboard;
end = p + num_keys * key_size;
while(p < end && p[] != note ? (
phase_lock && p[] < sync && p[] % 12 == osc ? (
sync = p[];
t = p[1];
);
p += key_size;
));
p >= end ? (
num_keys += 1;
t *= 2^((note - sync) / 12);
t -= t|0;
set_wavetbl(p, note, t);
reset_velocity(p, velocity);
env0.adsr_reset();
) : (
env0.load_adsr(p);
env0.state == 8 ? num_release -= 1;
);
set_velocity(p, velocity);
env0.adsr_a(1);
env0.store_adsr(p);
);
function note_off(note)
// global(keyboard, num_keys, num_release, key_size, env0*, env1*)
local(p, end)
(
p = keyboard;
end = p + num_keys * key_size;
while(p < end && p[] != note ? p += key_size);
p < end ? (
env0.load_adsr(p);
env0.state != 8 ? num_release += 1;
env0.adsr_r();
env0.store_adsr(p);
num_release >= num_keys ? env1.adsr_r();
);
);
function all_notes_off()
// global(num_keys, num_release)
(
num_keys = num_release = 0;
);
function process_keys()
// global(keyboard, num_keys, num_release, key_size, env0*, env1*, vcf_amount, vcf_fc, vcf_q, vcf*, lfo*, vib_depth)
static(fc, q)
local(s, p, end, x, v)
(
s = lfo.sin_sin();
vib_depth > 0 ? v = 2^(s * vib_depth) : v = 1;
x = env0.s;
s = 0;
p = keyboard;
end = p + num_keys * key_size;
while(p < end ? (
env0.load_adsr(p);
env0.smooth_adsr(x) ? (
s += env0.env * get_velocity(p) * get_wavetbl(p, v);
env0.store_adsr(p);
p += key_size;
) : (
num_keys -= 1;
num_release -= 1;
end -= key_size;
q = p;
loop(end - p,
q[] = q[key_size];
q += 1;
);
);
1; // while p < end
));
env0.s = x;
env1.adsr_process();
x = vcf_amount + (1 - vcf_amount) * vcf_fc * env1.env;
fc != x || q != vcf_q ? (
fc = x;
q = vcf_q;
vcf.zdf_lp(20 * pow(2, 10 * fc), q);
);
vcf.zdf_svf(s);
);
function process_midi()
// global(midiq*)
local(status)
(
while(midiq.midiq_remove() ? (
status = midiq.msg1 & 0xF0;
// Note On
status == 0x90 && midiq.msg3 ? (
note_on(midiq.msg2, (1.0 - vel_range) + vel_range * midiq.msg3 / 127);
) :
// Note Off
status == 0x80 || status == 0x90 ? (
note_off(midiq.msg2);
) :
// Control Change
midiq.msg1 == 0xB0 ? (
// All Notes Off
midiq.msg2 == 123 ? (
all_notes_off();
);
);
1; // while midiq.midiq_remove()
));
);
@slider
pan(gain(slider1, min_inf), max(-100, min(100, slider2)) * 0.01);
tuning = slider3 * 0.01;
env0.adsr_seta(slider5 * 0.001);
env0.adsr_setd(slider6 * 0.001);
env0.adsr_sets(slider7 * 0.01);
env0.adsr_setr(slider8 * 0.001);
load_wavetbl(); // slider10
vcf_amount = 1 - slider12 * 0.01;
vcf_fc = slider17 * 0.01;
vcf_q = max(0.01, slider18);
env1.adsr_seta(slider13 * 0.001);
env1.adsr_setd(slider14 * 0.001);
env1.adsr_sets(slider15 * 0.01);
env1.adsr_setr(slider16 * 0.001);
midi_ch.cache(max(0, min(16, int(slider20))) - 1) ? all_notes_off();
vel_range = max(0, min(100, slider21)) * 0.01;
phase_lock = slider23 >= 0.5;
lfo.sin_setf(max(0.01, slider25));
vib_depth = max(0, min(100, slider26)) * 0.01 * 0.5/12;
@block
midiq.midiq_collect(midi_ch, 3|8);
@sample
process_midi();
s = process_keys();
spl0 += gain0.smooth() * s;
spl1 += gain1.smooth() * s;
|
|
|
08-19-2021, 03:06 PM
|
#91
|
Human being with feelings
Join Date: Mar 2007
Location: Surrey, BC
Posts: 745
|
Awesome! Thank you so much!
Yes, I was thinking to have them both in one LFO as well, I'll give that a try.
Cheers,
argee
|
|
|
02-15-2022, 03:09 AM
|
#92
|
Human being with feelings
Join Date: Apr 2013
Location: France
Posts: 9,900
|
Having this on reapack + github would be nice
|
|
|
05-10-2022, 01:03 PM
|
#93
|
Human being with feelings
Join Date: Apr 2018
Location: Karlsruhe
Posts: 488
|
Is it possible to install these plugins on Linux?
|
|
|
05-10-2022, 11:28 PM
|
#94
|
Human being with feelings
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,653
|
Yeah, it should be possible, although I haven't tried them on Linux myself. Just like on macOS you will have to download the ZIP and manually copy them to your Effects directory.
|
|
|
05-18-2022, 08:10 AM
|
#95
|
Human being with feelings
Join Date: Aug 2020
Location: Colombia
Posts: 165
|
Hi Tale,
Yesterday I wrote a GUI for your colored noise plugin, I created a copy of your plugin with a different name to avoid confution, for some reason the gray noise cause digital feedback but that only happens when I use the plugin outside your effects folder (I have copied the import libraries you use in the plugin and I haven't being able to figure out what's happening.
Perhaps you can check it?
The files I moved to a sepparated folder are:
- noise.jsfx-inc
- rc_filter
- rc_filter.jsfx-inc
- zdf_filter
- zdf_filter
Thanks in advance!
|
|
|
05-19-2022, 12:08 AM
|
#96
|
Human being with feelings
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,653
|
Quote:
Originally Posted by dagamusik
Yesterday I wrote a GUI for your colored noise plugin, I created a copy of your plugin with a different name to avoid confution, for some reason the gray noise cause digital feedback but that only happens when I use the plugin outside your effects folder (I have copied the import libraries you use in the plugin and I haven't being able to figure out what's happening.
Perhaps you can check it?
|
Cool! It seems to work fine here... Tested with my JSFX Pack from 24 Dec 2021 (maybe with some minor changes).
Quote:
Originally Posted by dagamusik
The files I moved to a sepparated folder are:
- noise.jsfx-inc
- rc_filter
- rc_filter.jsfx-inc
- zdf_filter
- zdf_filter
|
Actually the library files you would need are:
- noise.jsfx-inc
- rbj_filter.jsfx-inc (because noise.jsfx-inc includes this)
- rc_filter.jsfx-inc
- zdf_filter.jsfx-inc
|
|
|
05-19-2022, 04:46 PM
|
#97
|
Human being with feelings
Join Date: Aug 2020
Location: Colombia
Posts: 165
|
Quote:
rbj_filter.jsfx-inc (because noise.jsfx-inc includes this)
|
That was it! Thanks! Hope you don't mind.
|
|
|
05-23-2022, 05:48 AM
|
#98
|
Human being with feelings
Join Date: Jul 2009
Location: Germany
Posts: 2,375
|
Is there a way to get these in Linux?
|
|
|
05-23-2022, 09:34 PM
|
#99
|
Human being with feelings
Join Date: Aug 2020
Location: Colombia
Posts: 165
|
Quote:
Originally Posted by krahosk
Is there a way to get these in Linux?
|
They're JSFX they work in every OS reapers works, I'm actually right now writing from a Linux Machine.
|
|
|
06-25-2022, 01:17 AM
|
#100
|
Human being with feelings
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,653
|
v20220621
I've uploaded an update earlier this week (v20220621), fixing a minor bug in drum_synth, and adding some LFO waveforms.
|
|
|
06-26-2022, 09:45 AM
|
#101
|
Human being with feelings
Join Date: Nov 2020
Posts: 185
|
thank you
question: do you take care (updates) on the GUI synth ?
I ask because I remember I saw it in the old/deprecated folder
|
|
|
06-26-2022, 10:26 AM
|
#102
|
Human being with feelings
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,653
|
Quote:
Originally Posted by whats_up
question: do you take care (updates) on the GUI synth ?
I ask because I remember I saw it in the old/deprecated folder
|
Well, currently mono_synthGUI still works just fine, and still is fully up-to-date with the non-GUI version. Also, it does still benefit from any library improvements.
Should I update the non-GUI mono_synth in the future, then I might still update mono_synthGUI as well. But it's not a priority for me (i.e. I might forget, or I might deem it too much work at some point), that's why I moved it to legacy.
|
|
|
06-26-2022, 10:41 AM
|
#103
|
Human being with feelings
Join Date: Nov 2020
Posts: 185
|
thank you for all your shares
|
|
|
07-22-2022, 07:14 AM
|
#104
|
Human being with feelings
Join Date: Nov 2010
Posts: 1,744
|
Tale! Just found your midi vibrato. Amazing. Exactly what I was looking for!
|
|
|
05-28-2023, 05:01 AM
|
#105
|
Human being with feelings
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,653
|
v20230527
I've updated my JSFX pack with two synths I've created a while back. One is music_box, which is a simplified simulation of a cheap toy music box, and the other is pc_speaker, a square wave mono synth based on the IBM PC speaker.
|
|
|
05-28-2023, 12:08 PM
|
#106
|
Human being with feelings
Join Date: Nov 2020
Posts: 185
|
Quote:
Originally Posted by Tale
I've updated my JSFX pack with two synths I've created a while back. One is music_box, which is a simplified simulation of a cheap toy music box, and the other is pc_speaker, a square wave mono synth based on the IBM PC speaker.
|
thank you very much. will check later
|
|
|
Thread Tools |
|
Display Modes |
Linear Mode
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -7. The time now is 11:56 AM.
|