Old 03-16-2019, 11:47 PM   #1
dasdeck
Human being with feelings
 
Join Date: Sep 2007
Posts: 97
Default upcoming DrumRack (+more) and some questions

Hey!

I'm really enjoying writing some cool LUA code with the reaper API and so far the possibilities seem very rich.

The first idea was to build an abl*ton l*ve like drum rack (I tested the RSK manager, but did not like it), and what I have so far is very promising:



some key features:
  • drag and drop audio files to pads creates layers of reasamplomatic5000 instances
  • drag and drop track templates creates layers from those (using the first track as sound source)
  • create pads/layer from tracks, etc.
  • flip and/or copy pads by drag and drop
  • pads can 'choke' each other
  • pads can have fixed length (time) regular press and release or infintie length / one shot mode
  • solo/mute/edit/delete layers/instruments
  • save kits as track templates
  • flip through kits (wip)
  • no internal state is kept, e.g. the drum rack is completely driven by the track structure underneath and a "hub" plugin distributing the midi data to the pads and layers, which themselves are just plain tracks.

edit:
you can find the source with some info on how to use it here:

https://github.com/dasdeck/reaper


I'm also working on some other utils and (another) UI framework as I go.

The (UI) framework is very much influenced by how the JUCE framework works.
So far it all works very well, however, I'd like to optimize it to make it safe for bigger projects.

and there we come to my questions:
  • Is there a good way to communicate arbitrary data with a specific jsfx instance(for example a midi sequence)? So far I communicate via parameters and global memory, but that seems to have its limits.

That's it for now! Regarding the release, I'm having too much fun right now with new features, I'll try to tame myself and polish some edges so I can publish a usable version very soon (few weeks).

Cheers!

JM
Attached Images
File Type: png DrumRack.png (12.9 KB, 283 views)

Last edited by dasdeck; 03-21-2019 at 08:37 AM.
dasdeck is offline   Reply With Quote
Old 03-17-2019, 12:03 AM   #2
Cranky Emu
Human being with feelings
 
Cranky Emu's Avatar
 
Join Date: Jan 2019
Location: Australia
Posts: 230
Default

Quote:
Originally Posted by dasdeck View Post
I'll try to tame myself and polish some edges so I can publish a usable version very soon (few weeks)
So with this wise machine your making, can you drag samples for instance onto a pad and create your own little drum kit/machine? Will it learn a beat, or does that have to be programmed via some other method?

I would say keep developing it until you feel you have all the (or at least a good number) that most people would be looking to use. Then your not chasing your tail with requests of "But can you add this, oh an a coffee maker to tks"...

Looks good and sounds very promising.
__________________
► C. Emu ◄
♪ DAW: Reaper/Ocenaudio ♫ Audio Interface: Focusrite 2i2
♯ Monitors: Alesis Elevate 6 / Focusrite Scarlett HP-60
Cranky Emu is offline   Reply With Quote
Old 03-17-2019, 01:28 AM   #3
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 2,342
Default

Quote:
Originally Posted by dasdeck View Post
Is there some kind of event (or pattern) to listen to reapers's project state changing? (I want to optimize paint events as well as keep tracks and plugins in sync)
reaper.GetProjectStateChangeCount( proj )

Quote:
Is there a good way to communicate arbitrary data with a specific jsfx instance(for example a midi sequence)? So far I communicate via parameters and global memory, but that seems to have its limits.
Using gmem seems an easiest way. Limits is what, timing?

RS5k manager indeed unusable in some cases, but mostly it can do the same things you mentioned as features.
__________________
SoundCloud | MPL Scripts discussion | ReaPack | Donate
mpl is offline   Reply With Quote
Old 03-17-2019, 01:57 AM   #4
dasdeck
Human being with feelings
 
Join Date: Sep 2007
Posts: 97
Default

Quote:
Originally Posted by mpl View Post
reaper.GetProjectStateChangeCount( proj )
That looks Awesome! Thanks, MPL!

Quote:
Originally Posted by mpl View Post
Using gmem seems an easiest way. Limits is what, timing?
no not timing. I handle timing inside the jsfx. How would you target specific fx instances with gmem?
I could not think of a way to properly identify instances :/. Maybe I'm missing something, like with the GetProjectStateChangeCount().

RS5k manager is a work of genius and art! Though I prefer classic "clean code" (small methods, oop), I can not handle smart people's code .

Can it layer other plugins as well? My goal was something that can layer a sample kick with a synth kick, etc. or generally mix synth sounds with samples.

Cheers!

JM
dasdeck is offline   Reply With Quote
Old 03-17-2019, 02:50 AM   #5
mpl
Human being with feelings
 
mpl's Avatar
 
Join Date: Oct 2013
Location: Moscow, Russia
Posts: 2,342
Default

Quote:
How would you target specific fx instances with gmem?
Depends on what you want to do exactly (what kind of MIDI data and how would you like to transfer it).

Quote:
Can it layer other plugins as well?
No, it is only designed to organize RS5k instances.
__________________
SoundCloud | MPL Scripts discussion | ReaPack | Donate
mpl is offline   Reply With Quote
Old 03-17-2019, 03:52 AM   #6
dasdeck
Human being with feelings
 
Join Date: Sep 2007
Posts: 97
Default

Quote:
Originally Posted by mpl View Post
Depends on what you want to do exactly (what kind of MIDI data and how would you like to transfer it).
I was thinking of some midi editing scripts/apps.
the idea was to get the midi data from a MediaItem and then send them back to a take based midi fx so one can alter midi data in a non-destructive fashion. Otherwise, I'd have to write the midi data back to the MediaItem, thus altering it.

I would use this for all kinds of ideas, another step sequencer, for example, a groove quantizer, etc.

I was thinking of writing the midi data to different takes/ items, but that approach seems to clutter up the project in a bad way. Unless I'm missing something.

Ideally I'd end up with sometihng link this:

Code:
pluginInstance:sendData('someScopeName', arrayOfMidiEvents)
having a sequencer like midi jsfx is "easy". The midi_delay essentially does this already.
I based my own track utility on this already.

It would be great (and quite easy) to just push arbitrary midi data to the delay buffer.
I just can not wrap my head around on how to properly (and safely!) target specific instances, as they all share the same memory and seemingly have no internal instance ids. (using a parameter seems unsafe for example and relies on manual interaction)

hmmm...

maybe I can assign IDs to the plugin instances via a script? ... I'll try that!
That still makes using the shared buffer quite elaborate though!
Maybe I can wrap this in a clever way

Cheer!
dasdeck is offline   Reply With Quote
Old 03-18-2019, 09:21 AM   #7
TonE
Human being with feelings
 
Join Date: Feb 2009
Location: Reaper HAS send control via midi !!!
Posts: 1,692
Default

Looks like another master entering the Reaper Arena. Thanks for keeping the great Reaper vibe. What you can be sure here, the requests will never end. So building a system for easily adding new stuff would be a wise first step. Let us wait then.

Did you share your older stuff anywhere? Midi loop, global transpose? Github?

Last edited by TonE; 03-18-2019 at 09:39 AM.
TonE is offline   Reply With Quote
Old 03-18-2019, 09:53 AM   #8
ashcat_lt
Human being with feelings
 
Join Date: Dec 2012
Posts: 3,896
Default

IDK if this can help you but I found that in JS the pseudo object namespaces can be leveraged into what seem to be discrete arrays, and that includes the _global namespace.

So you could have something like _global.yourname,yourscript.parameter0[instance].
ashcat_lt is offline   Reply With Quote
Old 03-18-2019, 02:09 PM   #9
Vagelis
Human being with feelings
 
Join Date: Oct 2017
Location: Larisa, Greece
Posts: 201
Default

Oh it looks very promising! Looking forward
Vagelis is offline   Reply With Quote
Old 03-21-2019, 08:38 AM   #10
dasdeck
Human being with feelings
 
Join Date: Sep 2007
Posts: 97
Default

Hey!

I uploaded an early alpha to get some early feedback from you guys.
See the first post.

@ ashcat_lt

Can you try to rephrase the idea of the namespaces? I'm afraid I don't get it :/

Cheers!

JM
dasdeck is offline   Reply With Quote
Old 03-21-2019, 10:28 AM   #11
ashcat_lt
Human being with feelings
 
Join Date: Dec 2012
Posts: 3,896
Default

_global.thing[0] is different from _global.thing[1] and also different from _global.otherthing[0] without having to first declare an offset for otherthing.

Just in general, my.thing[x] , you can use that to build your own arrays and avoid the weird shared buffer with all the index management. The _global namespace is global, though, so can replace gmem, and is a great way to pass information between plugins.

We are trying to set a sort of standard for global variables pretty much like I posted above just to keep from getting in each other's (and our own) way.

Last edited by ashcat_lt; 03-21-2019 at 10:45 AM.
ashcat_lt is offline   Reply With Quote
Old 03-22-2019, 06:50 AM   #12
Ozman
Human being with feelings
 
Join Date: Feb 2015
Posts: 513
Default

I tried it, but was getting errors, i guess from the assumed paths.

I'll just wait to do it the easier way (ReaPack).
Ozman 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 02:28 AM.


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