![]() |
#1 |
Human being with feelings
Join Date: Oct 2006
Location: Southampton, England
Posts: 198
|
![]()
Hi, I have made a very basic JS trance gate effect. You can separately control the pattern for left and right, adjust the pulse width, and create different feels by adjusting the pattern steps per beat. There is a rudimentary graphical display to help demonstrate what the sliders are doing.
It currently re-triggers itself on every beat. I am trying to decide whether it should just do this on beat 0 instead. Any thoughts? (BTW Justin, did you realise that if you have the word "trigger" in a comment, it makes the trigger buttons appear even if you are not using the trigger variable?) Updated: Download v0.4 from REAPER stash. Mark Last edited by markheath; 05-15-2011 at 01:23 PM. Reason: fixed wrong link |
![]() |
![]() |
![]() |
#2 |
Human being with feelings
Join Date: Oct 2006
Location: Southampton, England
Posts: 198
|
![]()
I've made a slight update. There is an additional pattern length slider and the pattern slider bit order is reversed which should make it a bit more intuitive. I've also slightly adjusted the range of the sliders.
I have left it retriggering on every beat. I had originally assumed that beat_position went back to 0.0 at the start of every measure, but it constantly goes up, leaving no way that I know of to detect the start of a new measure. (that will teach me not to test my effect with a single measure looping!). The download location is the same as before. |
![]() |
![]() |
![]() |
#3 |
Human being with feelings
Join Date: Jan 2008
Posts: 1,257
|
![]()
Thanks Mark, this works like a charm.
Works better at slower speeds, nice and easy to adjust. I'm at Bannister Park by the way.
__________________
Music is the best เพลง ที่ดีที่สุดคือ |
![]() |
![]() |
![]() |
#4 |
Human being with feelings
Join Date: Jan 2007
Posts: 576
|
![]()
Looks pretty cool, I'll check it out fully soon.
__________________
Free Synthedit/Synthmaker plugins that I made: runbeerrun dot blogspot dot com |
![]() |
![]() |
![]() |
#5 |
Human being with feelings
Join Date: Sep 2007
Location: Finland
Posts: 240
|
![]()
Thanks Mark. It is very very cool.
It would be nice if one could create patterns with mouse by clicking the pattern view. |
![]() |
![]() |
![]() |
#6 | ||
Human being with feelings
Join Date: Oct 2006
Location: Southampton, England
Posts: 198
|
![]() Quote:
Quote:
|
||
![]() |
![]() |
![]() |
#7 |
Human being with feelings
Join Date: Oct 2006
Location: Southampton, England
Posts: 198
|
![]()
I've added mouse handling now, so it is much easier to set patterns. Download link is the same (see first post)
Mark |
![]() |
![]() |
![]() |
#8 |
Human being with feelings
Join Date: Apr 2008
Location: Civitavecchia (Italy)
Posts: 574
|
![]()
thanx so much Markheat, great effort..
|
![]() |
![]() |
![]() |
#9 |
Human being with feelings
Join Date: Jan 2007
Posts: 576
|
![]()
The mouse draw stuff is nice, I also like the sliders for a more randomized result.
__________________
Free Synthedit/Synthmaker plugins that I made: runbeerrun dot blogspot dot com |
![]() |
![]() |
![]() |
#10 |
Mobile
Join Date: Jan 2006
Location: London & São Paulo. Hardcore commercial REAPERite
Posts: 1,669
|
![]()
Superb contribution!
Respect from M27 near Junction 6 (jus' kiddin') Nice work sir ![]()
__________________
Proudly using REAPER exclusively for... * Media and event music composition & production, sound design + auto-processing at Qsonics.com * Broadcast branding, promos, education & training and narration voice-overs at DrewWhite.com |
![]() |
![]() |
![]() |
#11 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,063
|
![]()
Thank you thank you thank you thank you~!!!!!!!!!!!!!!!!!!!!
This song would have taken me HOURS less work with your plugin... https://stash.reaper.fm/oldsb/92133/K...ggest-Fear.mp3 can you time travel back a bit so I can get the hours back? |
![]() |
![]() |
![]() |
#12 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,063
|
![]()
Could we get a time multiplier/divider knob defaulted at x1 that can be used to set the delay time in larger or smaller divisions of the tempo?
Also a wet/dry knob? Thanks a billion either way! this is awesome |
![]() |
![]() |
![]() |
#13 |
Human being with feelings
Join Date: May 2007
Location: Cape Town
Posts: 327
|
![]()
thanks for this Mark
just downloaded to try it out. I am sure this is going to be really useful |
![]() |
![]() |
![]() |
#14 |
Human being with feelings
Join Date: Jun 2008
Location: Ohio
Posts: 861
|
![]()
Please help, where do I download this into Reaper? Thanks.
|
![]() |
![]() |
![]() |
#15 |
Human being with feelings
Join Date: Oct 2006
Location: Southampton, England
Posts: 198
|
![]()
JS Effects live in the Effects folder under your REAPER installation. For example:
C:\Program Files\REAPER\Effects Create a subfolder under Effects, (I called mine MarkHeath) and copy the downloaded text file into it. Then get rid of the .txt extension. Then reload REAPER and it should be available to select in the effect dialog. Mark |
![]() |
![]() |
![]() |
#16 | |
Human being with feelings
Join Date: Oct 2006
Location: Southampton, England
Posts: 198
|
![]() Quote:
Next time I'm in the mood for editing it, I'll see if I can put your ideas in. Mark |
|
![]() |
![]() |
![]() |
#17 |
Human being with feelings
Join Date: Jun 2006
Posts: 22,701
|
![]()
THIS IS AWESOME !!!!
thank you !!!! can we have a longer graphical display showing more beats? this is perfect@@@@@!!! |
![]() |
![]() |
![]() |
#18 |
Human being with feelings
Join Date: Apr 2008
Posts: 510
|
![]()
Good stuff sir!
![]()
__________________
Blog / Articles / Music / Reaper DJ tutorial JS plugin pack/ JS Wiki / JS tips / JSfxGen Holos / GitHub / GoogleCode / G+ |
![]() |
![]() |
![]() |
#19 |
Human being with feelings
Join Date: Oct 2006
Location: Southampton, England
Posts: 198
|
![]()
OK, so I've finally got round to updating this. You can now have many more steps (up to 64). Beat markers make it a little more obvious what is going on. There is also a wet/dry slider as requested by pipelineaudio (two years ago - sorry!). It uses the @serialize feature to save state. I haven't currently worked out how get it to flag that non-slider state needs to be changed so you won't see [modified] in the REAPER title bar after changing the pattern. Fortunately, if you click save the state is serialized regardless.
Download v0.4 from REAPER stash. Last edited by markheath; 05-15-2011 at 01:23 PM. Reason: wrong link |
![]() |
![]() |
![]() |
#20 |
Human being with feelings
Join Date: Jul 2006
Location: Hungary
Posts: 3,129
|
![]()
do you know LOSER's EQ Ducker?
that can be used as a 'tranceGate', (GATE mode) it needs a MIDI item to trigger. so it can have swing, diff note/gate lenghts, velocity/volume. patterns/MIDI items can be multitaked, so switching or modify the gate pattern is easy.
__________________
panda in the desert |
![]() |
![]() |
![]() |
#21 |
Human being with feelings
Join Date: Oct 2006
Location: Southampton, England
Posts: 198
|
![]()
Looks a very impressive effect. Mine is less ambitious, and just lets you define a simple left and right pattern (slice volumes and swing may come in a later version if I ever have need of them). You can automate the pulse width though, which can give some nice results and would be a little harder to do with midi clips controlling the gate.
|
![]() |
![]() |
![]() |
#22 | |
Human being with feelings
Join Date: Jan 2007
Location: mcr:uk
Posts: 3,945
|
![]()
I missed this one, going to give it a try.
Quote:
Code:
beat_position % ts_num == 0 ? ( // retrig! ); |
|
![]() |
![]() |
![]() |
#23 | ||
Human being with feelings
Join Date: Oct 2006
Location: Southampton, England
Posts: 198
|
![]() Quote:
Quote:
|
||
![]() |
![]() |
![]() |
#24 | ||
Human being with feelings
Join Date: Jan 2007
Location: mcr:uk
Posts: 3,945
|
![]() Quote:
Quote:
Edit: No, I'm wrong. You can't leave comments on that page. Edit again: Oh no, I'm wrong again. You have to log in to leave a comment ![]() |
||
![]() |
![]() |
![]() |
#25 | |
Human being with feelings
Join Date: Oct 2006
Location: Southampton, England
Posts: 198
|
![]() Quote:
|
|
![]() |
![]() |
![]() |
#26 |
Human being with feelings
Join Date: Jan 2007
Location: mcr:uk
Posts: 3,945
|
![]()
Cool effect btw
![]() |
![]() |
![]() |
![]() |
#27 |
Human being with feelings
Join Date: Aug 2008
Location: dusty hot place
Posts: 1,492
|
![]()
Very nice basic trance gate.
About finding it a bit late: I guess some threads need to be resurrected once in a while.
__________________
... yOu aNd mE are ... |
![]() |
![]() |
![]() |
#28 |
Human being with feelings
Join Date: Feb 2008
Location: Romania
Posts: 9
|
![]()
I know this thread is old. I just came across this plugin looking for a fast way to do the "sidechain" effect. This plug works but I don't want to gate all the signal, so I found useful the dry/wet slider.
The problem is that I think there is a bug that causes the dry audio is only on the left channel. How can we fix that ? Right now I'm trying to troubleshoot it myself editing the code. |
![]() |
![]() |
![]() |
#29 |
Human being with feelings
Join Date: May 2012
Posts: 1,232
|
![]()
This might work:
(also added ext_noinit = 1; as i thought it was needed) Code:
slider1:4<1,8,1>pattern steps per beat slider2:0.9<0,1,0.01>pulse width slider3:2<1,8,1>pattern beats slider4:100<0,100,1>wet/dry mix @init ext_noinit = 1; secondspersample = 1/srate; // buffer locations pattern_left = 0; pattern_right = 128; freembuf(257); (loaded == 0) ? ( // set up the default pattern pattern_left[0] = 1; pattern_left[2] = 1; pattern_left[3] = 1; pattern_left[6] = 1; pattern_left[8] = 1; pattern_left[10] = 1; pattern_left[12] = 1; pattern_left[14] = 1; pattern_right[0] = 1; pattern_right[2] = 1; pattern_right[3] = 1; pattern_right[5] = 1; pattern_right[8] = 1; pattern_right[10] = 1; pattern_right[13] = 1; pattern_right[15] = 1; ); @slider pattern_steps_per_beat=slider1; pulsewidth=slider2; slew_rate = 1; // in ms, used to be a slider delta = secondspersample / (slew_rate / 1000); pattern_beats = slider3; pattern_length = pattern_beats * pattern_steps_per_beat; mix = slider4/100; @block samplesperbeat = srate/(tempo/60); samplesperslice = samplesperbeat / pattern_steps_per_beat; @sample inL=spl0; inR=spl1; current_slice = (beat_position * pattern_steps_per_beat)|0; current_slice = current_slice % pattern_length; (current_slice != last_slice) ? current_pos = 0; // retrigger last_slice = current_slice; slice_vol_left = pattern_left[current_slice]; slice_vol_right = pattern_right[current_slice]; // truncate the pulses if pulsewidth < 0 (slice_vol_left) ? (current_pos % samplesperslice) > (samplesperslice * pulsewidth) ? slice_vol_left = 0; (slice_vol_right) ? (current_pos % samplesperslice) > (samplesperslice * pulsewidth) ? slice_vol_right = 0; (multiplier_left < slice_vol_left) ? multiplier_left = min(1,multiplier_left+delta): (multiplier_left > slice_vol_left) ? multiplier_left = max(0,multiplier_left-delta); (multiplier_right < slice_vol_right) ? multiplier_right = min(1,multiplier_right+delta): (multiplier_right > slice_vol_right) ? multiplier_right = max(0,multiplier_right-delta); spl0 = inL * multiplier_left * mix; spl1 = inR * multiplier_right * mix; spl0 += inL * (1-mix); spl1 += inR * (1-mix); current_pos += 1; @serialize // dump out entire left and right volume arrays amt=file_mem(handle,pattern_left,128); amt=file_mem(handle,pattern_right,128); ((file_avail(0) >= 0) & (amt > 0)) ? ( loaded = 1; ); @gfx 320 60 gslice = 0; gspace = 10; gstartx = gspace; gheight = 15; gwidthmax = (120 * pattern_beats) / pattern_length; //30; gleft_y = gspace + gheight; gcurrent_y = gspace * 2 + gleft_y; gright_y = gspace + gcurrent_y + gheight; // has the left mouse button been pressed or released? (mouse_cap != leftbutton_down) ? ( leftbutton_down = (mouse_cap == 1) ? 1 : 0; (leftbutton_down) ? ( (mouse_x >= gstartx && mouse_x < gstartx + pattern_length * gwidthmax) ? ( mouse_slice = ((mouse_x - gstartx) / gwidthmax)|0; (mouse_y >= gleft_y - gheight && mouse_y < gleft_y) ? ( pattern_left[mouse_slice] = pattern_left[mouse_slice] ? 0 : 1; // slider5 += 1; sliderchange(slider5); // attempt to prompt js that state needs to be saved ); (mouse_y >= gright_y - gheight && mouse_y < gright_y) ? ( pattern_right[mouse_slice] = pattern_right[mouse_slice] ? 0 : 1; // slider5 += 1; sliderchange(slider5); // attempt to prompt js that state needs to be saved ); ); ); ); // draw the pattern gfx_a = 1; gslice = 0; loop (pattern_length, gtestbit = pow(2,7-gslice)|0; gslice_vol_left = pattern_left[gslice]; gslice_vol_right = pattern_right[gslice]; gwidth = gwidthmax * pulsewidth; gfx_r = 0.0; // 1 gfx_b = 0.0; // 0.33 gfx_g = 0.33; // 1 gfx_x = gstartX + gslice * gwidthmax; gfx_y = gleft_y; gslice_vol_left ? gfx_rectto(gfx_x + gwidth, gfx_y - gheight) : gfx_lineto(gfx_x + gwidth, gfx_y, 0); gfx_x = gstartX + gslice * gwidthmax; gfx_y = gright_y; gslice_vol_right ? gfx_rectto(gfx_x + gwidth, gfx_y - gheight) : gfx_lineto(gfx_x + gwidth, gfx_y, 0); // draw the current slice marker (current_slice == gslice) ? ( gfx_r = 0.33; gfx_b = 1; gfx_g = 0.33; gfx_x = gstartX + gslice * gwidthmax; gfx_y = gcurrent_y; gfx_rectto(gfx_x + gwidth, gfx_y - gspace); ); gslice +=1; ); gslice = 0; loop (pattern_beats + 1, // draw beat markers gfx_r = 0.5; gfx_b = 0.5; gfx_g = 0.5; gfx_x = gstartX - 2 + gslice * gwidthmax * pattern_steps_per_beat; gfx_y = gleft_y + 5; gfx_lineto(gfx_x, gright_y - gheight - 5, 0); gslice += 1; ); |
![]() |
![]() |
![]() |
Thread Tools | |
|
|