Fundamentals
Export Targets
Code Export
Advanced
Patcher UI
Special Topics
RNBO Raspberry Pi OSCQuery Runner
Using Abstractions
How to create and save RNBO abstractions.
Just like Max and Gen, RNBO supports abstractions. These are reusable RNBO patches, saved in the .rnbopat
format. When you change the original abstraction file, any patchers containing an instance of that abstraction will be updated as well. This allows you to build up a library of abstractions, both to fit your own particular workflow, and to share with other RNBO users.
Creating an Abstraction
To create a RNBO abstraction, focus on the window containing the RNBO patcher that you want to turn into an abstraction. Then, press Command-Shift-s
(or Control-Shift-s
on Windows), or select "Save As..." from the file menu. This should bring up a save dialog for the RNBO patcher itself. If you see the .rnbopat
extension on the default file name, then everything is working as expected.
Using an Abstraction
Using abstractions is slightly different depending on whether you're creating a rnbo~ object in a Max patch, or creating a subpatcher in RNBO itself. In a Max patcher, a rnbo~ object will bind to an abstraction if the first argument matches the filename of the abstraction, minus the .rnbopat
extension.
To use an abstraction inside of RNBO, use the p object with the @file
attribute. For example, an object like [p @file my_abstraction]
will load the file "my_abstraction.rnbopat" as an abstraction.
In order for a Max patch or RNBO patch to use an abstraction, the abstraction file must be in Max's search path. The usual rules for the search path apply. See the Max Search Path documentation for details.
Abstraction Arguments
When using an abstraction inside of RNBO with the p object, you can supply arguments to the abstraction with the @args
attribute. These arguments will replace placeholders in the abstraction that use "#n" syntax. For example, if you create an abstraction with box text [p @file my_abstraction @args 440 10]
, then any instance of "#1" in the abstraction will be replaced with "440," and any instance of "#2" will be replaced with "10."
There are some limits to what you can do with this technique. For example, you can't dynamically set the class of an object this way (of course, you couldn't do this in Max either). But object arguments and attribute values will work.