Go Back   Cockos Incorporated Forums > REAPER Forums > ReaScript, JSFX, REAPER Plug-in Extensions, Developer Forum

Reply
 
Thread Tools Display Modes
Old 12-30-2015, 07:37 AM   #41
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by mpl View Post
I`ll do some tests with formula parser
Why a "parser"? Do you know of Lua's loadstring that allows strings to be handled as executable Lua code?

Performance may be an issue with that, but I can do some benchmarking...
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
Xenakios is offline   Reply With Quote
Old 12-30-2015, 07:45 AM   #42
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

Quote:
Why a "parser"
Yes, I called it wrong, because it is lua native feature. I meant tests to prevent some potential errors (for example, limit value beetween 0 and 1 or wrap it).
mpl is offline   Reply With Quote
Old 12-30-2015, 07:55 AM   #43
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by mpl View Post
Yes, I called it wrong, because it is lua native feature. I meant tests to prevent some potential errors (for example, limit value beetween 0 and 1 or wrap it).
Cool.

Looks like doing the load(string) thing in Lua can give a pretty OK performance! As long as the formula isn't super complicated, the speed is certainly enough.

For example a mapping formula like : "0.25+0.75*inputvalue^2.0" can be run 1 000 000 (a million) times in about 0.13 seconds. (On my i7 desktop machine...)
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
Xenakios is offline   Reply With Quote
Old 12-30-2015, 08:05 AM   #44
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

Good to know! I think most performance issues here going from graphics, so I optimised it as much as I can.
mpl is offline   Reply With Quote
Old 12-30-2015, 08:49 AM   #45
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

The result of Lua's load function should be cached of course, so that the load isn't done needlessly if the formula hasn't changed.
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
Xenakios is offline   Reply With Quote
Old 12-30-2015, 11:17 PM   #46
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

Hm, i'm not sure here is it really better to cache formula result (if so, which step for caching?) or use loadstring directly.
mpl is offline   Reply With Quote
Old 12-31-2015, 12:37 AM   #47
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by mpl View Post
Hm, i'm not sure here is it really better to cache formula result (if so, which step for caching?) or use loadstring directly.
It is MUCH slower to do the load call each time the formula result is needed. I just tested that. I suppose a good place in the code for compiling the string and caching the result is after wherever the user can change the mapping formula.

Note that the load function doesn't itself return the actual result of the formula, it returns a function that can be later called. (Or nil if the function couldn't be compiled properly.)

The benchmarking code I did yesterday that provides fast results :
Code:
inputvalue=0.0
local thecodestring="0.25+0.76*math.sin(inputvalue)^2.0"
local thefunction=load("return "..thecodestring)
local t0=reaper.time_precise()
for i=0, 10000000 do
  inputvalue = 1.0/10000000*i
  local y = thefunction()
  if y<0.0 then y=0.0 end
  if y>1.0 then y=1.0 end
end
local t1=reaper.time_precise()
reaper.ShowConsoleMsg("running took "..t1-t0.." seconds\n")
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.

Last edited by Xenakios; 12-31-2015 at 12:47 AM.
Xenakios is offline   Reply With Quote
Old 12-31-2015, 12:51 AM   #48
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

Thanks for test, Xen!
Quote:
running took 3.8486671308056 seconds
on i5 4210U notebook
One more question to you. Ok, I caching formula results. How do you think, is it faster to store values to reaper array or to native lua table. Is there some performance difference beetween them?

I think, step of 0.00001 or something is ok for caching.

Last edited by mpl; 12-31-2015 at 12:57 AM.
mpl is offline   Reply With Quote
Old 12-31-2015, 01:02 AM   #49
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by mpl View Post
Thanks for test, Xen!
on i5 4210U notebook
One more question to you. Ok, I caching formula results. How do you think, is it faster to store values to reaper array or to native lua table. Is there some performance difference beetween them?

I think, step of 0.00001 or something is ok for caching.
No, I don't mean caching as in storing the result of the compiled function into an array! (Lua's tables used as arrays are not fast anyway. And there isn't a way with the Reaper arrays to set and get the individual elements, right...?)

I mean storing the result of load outside where the result of the produced function is needed. See how in the example code I compile the formula string once outside the loop, store the function into "thefunction" and then reuse the "thefunction" over and over inside the loop.

Here's by the way a nicer version of it that doesn't depend on the global variable "inputvalue" :
Code:
local thecodestring="0.9-0.8*x^2.0"
local thefunction=load("local x = ... return "..thecodestring)
if thefunction~=nil then
  local t0=reaper.time_precise()
  local iters=10000000
  for i=0, iters do
      local x = 1.0/iters*i
      local y = thefunction(x)
      if y<0.0 then y=0.0 end
      if y>1.0 then y=1.0 end
      --reaper.ShowConsoleMsg(y.."\n")
  end
  local t1=reaper.time_precise()
  reaper.ShowConsoleMsg("Running took "..t1-t0.." seconds\n")
else reaper.ShowConsoleMsg("Expression could not be compiled\n")
end
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
Xenakios is offline   Reply With Quote
Old 12-31-2015, 01:11 AM   #50
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

Ah, cache function, got it.
mpl is offline   Reply With Quote
Old 12-31-2015, 01:12 AM   #51
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by mpl View Post
Ah, cache function, got it.
Sorry, if I wasn't so clear about it.
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
Xenakios is offline   Reply With Quote
Old 12-31-2015, 02:53 AM   #52
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

Seems FixedLearn engine works already (currently midi only)



(I just move one Ch1CC0 fader, and when I change map, it automatically learn to parameter on same slider position and remove other learns from parameters in other maps at same slider position)
mpl is offline   Reply With Quote
Old 12-31-2015, 06:44 AM   #53
J Reverb
Human being with feelings
 
Join Date: Jul 2009
Posts: 1,071
Default

Amazing !
Is soft takeover possible on fixed learn settings?
J Reverb is offline   Reply With Quote
Old 12-31-2015, 07:01 AM   #54
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

MIDI Learn has some bitshift stuff which needs time to understand, but I`ll take a look.
Unfortunately REAPER doesn`t allow to learn parameter natively (by native window with mode selector and checks) within running defer function. You can check it if you rightclick on existing slider - > MIDIOSC Learn test.
mpl is offline   Reply With Quote
Old 12-31-2015, 07:29 AM   #55
J Reverb
Human being with feelings
 
Join Date: Jul 2009
Posts: 1,071
Default

Right Gotcha !
When linking map to last touched track the map changes but the last map is still active, is this intended behavior ?

Thanks and happy new year !
J Reverb is offline   Reply With Quote
Old 12-31-2015, 07:36 AM   #56
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

Linking functions are rough coded. Please make a gif, so I will know where to find bug.

Last edited by mpl; 12-31-2015 at 09:51 AM.
mpl is offline   Reply With Quote
Old 12-31-2015, 08:01 AM   #57
J Reverb
Human being with feelings
 
Join Date: Jul 2009
Posts: 1,071
Default

Can't make a gif at the moment but steps as follows.

Select track 1
Select map 1
Link current map to last touched track

Select track 2
Select map 2
Link current map to last touched track

Select track 1
Map 1 is selected in GUI but map 2 (track 2) is still active, however if you select the maps directly in GUI the fixed learn switches fine.
J Reverb is offline   Reply With Quote
Old 12-31-2015, 08:05 AM   #58
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

Thanks, I'll take a look.
mpl is offline   Reply With Quote
Old 01-01-2016, 09:59 AM   #59
Spacemen Tree
Human being with feelings
 
Spacemen Tree's Avatar
 
Join Date: Mar 2013
Posts: 515
Default

This is becoming a monster of a script! Great stuff!

Can I ask how you got access to MIDI via script?

I am trying out something in lua and I need to listen to MIDI and OSC i/o to work as conditionals for some routines. Nothing fancy really.

If you have any ideas you can share do it here please:

http://forum.cockos.com/showthread.p...99#post1615699

(It's just I don't want to pollute your thread with out of bounds questioning that's not related to your script )

Have a nice year man. Hug.
__________________
"After silence, that which comes nearest to expressing the inexpressible is music", Aldous Huxley
Spacemen Tree is offline   Reply With Quote
Old 01-02-2016, 03:12 AM   #60
digitalfix
Human being with feelings
 
Join Date: Nov 2015
Posts: 86
Default

Really liking this Michael. Will be interested to see where you go with the formulas and whether I'll be able to use it as a way to have LFOs modulate other LFOs ala FL.
digitalfix is offline   Reply With Quote
Old 01-03-2016, 02:46 AM   #61
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

Xenakios, I just tried caching formula functions, this works faster, thanks! The only thing I don`t like it is they don`t shown in variables list, but if I give it to console it shown like "function: 0CA0F6B8". So it would be better to have it visible for debug (I don`t know is it possible?).

J Reverb should works now

digitalfix you can do it with JS lfo generator

Last edited by mpl; 01-03-2016 at 06:59 AM.
mpl is offline   Reply With Quote
Old 01-03-2016, 07:31 AM   #62
J Reverb
Human being with feelings
 
Join Date: Jul 2009
Posts: 1,071
Default

Yep works perfectly !

After recording CC data to the current track with map selected I have to clear the sliders to enable playback.
Would it be possible to have Enable/Disable current map.
Like a playback mode for each map, effectively bypassing the current map until needed?
This is with fixed learn.

Awesome now with soft takeover by the way ! This is becoming very very cool !
J Reverb is offline   Reply With Quote
Old 01-03-2016, 07:47 AM   #63
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

J Reverb, FixedLearn is global thing, so do you wanna to clear all learn (this also erase any existed learn in parameters linked to sliders) or just bypass it for current map (so fixedlearn will not set learn for current map sliders)?
mpl is offline   Reply With Quote
Old 01-03-2016, 07:58 AM   #64
J Reverb
Human being with feelings
 
Join Date: Jul 2009
Posts: 1,071
Default

Yes I think bypass/enable it for current map (so fixedlearn will not set learn for current map sliders). Effectively the same as clearing sliders but just disabling them instead.
J Reverb is offline   Reply With Quote
Old 01-04-2016, 07:59 AM   #65
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

Formulas:

Last edited by mpl; 01-04-2016 at 11:22 AM.
mpl is offline   Reply With Quote
Old 01-04-2016, 09:41 AM   #66
musicbynumbers
Human being with feelings
 
musicbynumbers's Avatar
 
Join Date: Jun 2009
Location: South, UK
Posts: 14,214
Default

holy cow! that's brilliant!

This and some kind of transfer graph (so you can dictate what the input value is at the output for limiting and reversing one control to another one) is going to be amazing!

Will be donating to this one for sure when it's at version 1
__________________
subproject FRs click here
note: don't search for my pseudonym on the web. The "musicbynumbers" you find is not me or the name I use for my own music.
musicbynumbers is offline   Reply With Quote
Old 01-04-2016, 11:58 AM   #67
vitalker
Human being with feelings
 
vitalker's Avatar
 
Join Date: Dec 2012
Posts: 13,333
Default

Wow! Mpl you're magician! It looks pretty cool and it should be very useful(maybe even more useful than in FL studio).
vitalker is online now   Reply With Quote
Old 01-04-2016, 01:35 PM   #68
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

musicbynumbers, like this?

mpl is offline   Reply With Quote
Old 01-04-2016, 02:11 PM   #69
musicbynumbers
Human being with feelings
 
musicbynumbers's Avatar
 
Join Date: Jun 2009
Location: South, UK
Posts: 14,214
Default

woo hoo! brilliant!

If this is in the test version, I'm going to try this now!
__________________
subproject FRs click here
note: don't search for my pseudonym on the web. The "musicbynumbers" you find is not me or the name I use for my own music.
musicbynumbers is offline   Reply With Quote
Old 01-04-2016, 03:36 PM   #70
musicbynumbers
Human being with feelings
 
musicbynumbers's Avatar
 
Join Date: Jun 2009
Location: South, UK
Posts: 14,214
Default

Just tried it now. So powerful! Especially since you can record automation too so one parameter can control many for sound design without having to record the linked parameters in as well!

This is probably asking too much but it would be great if the mapping could go as far as say 8 equal points on the X/Y graphically that can be controlled (inputting numbers is fine if mouse is too much trouble) so that we can get full control over input to output without having to know exactly how the function should be written.

Basically like the included image. where these points can be dragged around to make whatever transfer curve needed (within say 8 points)
https://i.imgur.com/vRONxV8.jpg

It might be possible now but I'm not sure what I'd have to input

This kind of control is needed for getting the "alignments" between plugins parameters just right I find. Especially for where we use them which is in a lot of car engine synthesis. Normally I have to have the synths on one track and then use parameter linking but this could be even more powerful already!

You have now the limit preset which is very useful but with the above you could map say the whole range of the input (0 to 1) to say just the top half of the linked parameter (0.5 to 1).

I'm sure that's doable now but it's too late here and I can't think of what I'd need to put in! lol


again.. this is awesome and I'll be donating to you for sure MPL. You've "knocked it out the park" again!

.
__________________
subproject FRs click here
note: don't search for my pseudonym on the web. The "musicbynumbers" you find is not me or the name I use for my own music.
musicbynumbers is offline   Reply With Quote
Old 01-04-2016, 04:14 PM   #71
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

I added scaleto(function,limit_low,limit_high) operator for scaling output (0.63). Match curve seems hard to implement, but I will take a look what I can do.
mpl is offline   Reply With Quote
Old 01-04-2016, 04:40 PM   #72
musicbynumbers
Human being with feelings
 
musicbynumbers's Avatar
 
Join Date: Jun 2009
Location: South, UK
Posts: 14,214
Default

Quote:
Originally Posted by mpl View Post
I added scaleto(function,limit_low,limit_high) operator for scaling output (0.63). Match curve seems hard to implement, but I will take a look what I can do.
Thanks MPL. No worries if not, I'd happily donate more if it's a time issue (if that would help)

This is definitely a dream come true if possible!

On a positive note, I did remember how to get some basic limiting by doing crude things like "y = x*0.5+0.5" which although it's missing parenthesis etc seems to work how I expected it (mapping full range to only the top half of the other parameter) so that's cool.

I can't recall yet though how to then maybe add additional calculations on top of this to effect some of the transfer graph by adding a log or exponential element to it as well as what I've done already.

That's where I get stuck

Even if your match curve option was just 10 groups of numbers representing the coordinates like the below as a preset..

"1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8, 9:9, 10:10" (which would be no change)

but you could change it to say an approximation of what I had above "y = x*0.5+0.5" by changing it to the below..


"1:5, 2:5.5, 3:6, 4:6.5, 5:7, 6:7.5, 7:8, 8:8.5, 9:9, 10:10" (which would be close to the same thing but I can't be bothered to work out the proper numbers but hopefully it makes sense)

There would have to obviously still be interpolation between each set of coordinates but this is such a common programming need that there is probably already some code written that would help here.

Again, totally still amazing even without this but thought I'd ask!
__________________
subproject FRs click here
note: don't search for my pseudonym on the web. The "musicbynumbers" you find is not me or the name I use for my own music.
musicbynumbers is offline   Reply With Quote
Old 01-04-2016, 05:13 PM   #73
J Reverb
Human being with feelings
 
Join Date: Jul 2009
Posts: 1,071
Default

Huge round of applause !! This is so powerful
Really comes into it's own if you use ReaControlMidi as take fx on a blank midi item and use the CC envelope to provide the data, it's like automation on steroids.

Top draw mpl !

When setting up fixed learn is it possible to have it set up parameter modulation/link from MIDI or FX param automatically with the corresponding cc# ? as an option ?

Thanks for bypass function and Formulas is awesome !

Happy days !
J Reverb is offline   Reply With Quote
Old 01-04-2016, 05:20 PM   #74
musicbynumbers
Human being with feelings
 
musicbynumbers's Avatar
 
Join Date: Jun 2009
Location: South, UK
Posts: 14,214
Default

Just been trying out the fixed learn with OSC and it's awesome!

do you think the map slider will also be assignable to OSC at some point so we can switch maps remotely?

Also, found one semi bug though that might not be related to the mapping panel but instead reaper..

If you put reaper into touch automation mode and then use an OSC device (via fixed learn) to control a parameter. Reaper will record the automation just fine but if you then press stop and then press play again whilst still in touch mode. Reaper will start overwriting the automation with the last value of the parameter. The strange thing is though, if you then stop and start again it's fine. Seems like there is a little lag between it not sending out automation. Probably a reaper bug but thought you should know
__________________
subproject FRs click here
note: don't search for my pseudonym on the web. The "musicbynumbers" you find is not me or the name I use for my own music.
musicbynumbers is offline   Reply With Quote
Old 01-04-2016, 11:03 PM   #75
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

musicbynumbers,
Quote:
map slider will also be assignable to OSC
While testing I already did it for myself (you should also enable "Use external actions").

About automation bug.
I did NOT tested this with automation (only manual click/drag with mouse and MIDICC/OSC), so I surprised it even works
All I can say here - my script don`t do something related to automation modes, only get/set values + get/set parameter learn.

About formulas.
I just added some "short" functions for overview. You can type whatever you want using lua math: http://lua-users.org/wiki/MathLibraryTutorial
Examples like
Quote:
math.cos(x*(math.pi / 4))
-0.4+math.exp(x-0.25)/2.14
are OK for my script also.

Last edited by mpl; 01-05-2016 at 03:05 AM.
mpl is offline   Reply With Quote
Old 01-05-2016, 03:13 AM   #76
musicbynumbers
Human being with feelings
 
musicbynumbers's Avatar
 
Join Date: Jun 2009
Location: South, UK
Posts: 14,214
Default

Thanks MPL. Will have a look at all this stuff soon!

There probably is already a way then to have each value equal different amounts but not sure if they can then be interpolated together. I'll have a look.

As for automation. It really does work amazingly well it's only that it gets stuck transmitting the last value on stop/start but clears the 2nd time. I can live with that
__________________
subproject FRs click here
note: don't search for my pseudonym on the web. The "musicbynumbers" you find is not me or the name I use for my own music.
musicbynumbers is offline   Reply With Quote
Old 01-05-2016, 06:38 AM   #77
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

I tried to make match(x) function which quantize x value to closest value in drawn graph (by mouse, step is 0.01, so graph is per wire and consists of 100 points, but using it crash Reaper, I can't figured out why (maybe too much text for storing into external state). It worked about 5-6 ways, but now it crash every time, so I disabled it. Maybe I`ll return to this later.

Last edited by mpl; 01-05-2016 at 07:26 AM.
mpl is offline   Reply With Quote
Old 01-05-2016, 07:54 AM   #78
musicbynumbers
Human being with feelings
 
musicbynumbers's Avatar
 
Join Date: Jun 2009
Location: South, UK
Posts: 14,214
Default

Quote:
Originally Posted by mpl View Post
I tried to make match(x) function which quantize x value to closest value in drawn graph (by mouse, step is 0.01, so graph is per wire and consists of 100 points, but using it crash Reaper, I can't figured out why (maybe too much text for storing into external state). It worked about 5-6 ways, but now it crash every time, so I disabled it. Maybe I`ll return to this later.
Thanks for trying though!

It wouldn't even need that many points or resolution if it can be made to be stable. Even 2 or 3 points of precision would be enough to get a bit of fine tuning done.

It's more about a user friendly way to control the curves etc but it can wait. (it would be amazing though as it would bypass the need for working out some of the maths for just normal use.)
__________________
subproject FRs click here
note: don't search for my pseudonym on the web. The "musicbynumbers" you find is not me or the name I use for my own music.

Last edited by musicbynumbers; 01-05-2016 at 08:05 AM.
musicbynumbers is offline   Reply With Quote
Old 01-05-2016, 11:45 PM   #79
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 3,960
Default

Released. Hope it will works fine and will be useful for creative people.
mpl is offline   Reply With Quote
Old 01-06-2016, 04:12 AM   #80
musicbynumbers
Human being with feelings
 
musicbynumbers's Avatar
 
Join Date: Jun 2009
Location: South, UK
Posts: 14,214
Default

Quote:
Originally Posted by mpl View Post
Released. Hope it will works fine and will be useful for creative people.
Congrats MPL! This is another completely fantastic script again!

Will send you a donation later.

Love the new presets including the match curve which lets you draw it in! thanks for getting that working!

The one thing with it I've found so far is that because the vertical positions are quantised to tenths only. This means you can't get a smooth gradual line that is not exactly diagonal.

Is there anything I can add to the equation there that would allow me to smooth it or would it be possible to have a version with higher resolution on the vertical axis so that it's not always diagonal?

Thanks!
__________________
subproject FRs click here
note: don't search for my pseudonym on the web. The "musicbynumbers" you find is not me or the name I use for my own music.
musicbynumbers is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 07:52 AM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.