Renoise api questions

daw project xml reference and examples tell me that I also might need the unique VST3 ParamIDs. For VST2 it simply is the index, but not so for VST3.

Also looked into active_preset_data, can’t find any hint how to get that VST3 ParamID.

Though it says it is not required, I wonder how else the parameters could be mapped to the plugin. The parameter name?

Is there a way to get the VST3 ParamIDs already?

A Studio One dawproject export shows this structure:

Will test it without a parameterID tomorrow…

  _________________________________________________
 /                                                 \
|   R3N01S3 S0NG C0MP471B1L17Y M0D3 CH3CK (L337)     |
|_____________________________________________________|
|                                                     |
|   1f u w4nna kn0w 1f y0 d0p3 7un3 15 runn1n'        |
|   1n 0ld sk00l m0d3 (SPD, y0!), 7rY:                |
|                                                     |
|   > renoise.song().transport.legacy_playmode        |
|                                                     |
|   r373rnz:                                           |
|     - tru3  = 01d 5k00l m0d3 (SPD, baby!)            |
|     - f4lz3 = m0d3rn TPL m0d3 (T1ckz p3r L1n3)       |
|                                                      |
|   3x4mpl3:                                           |
|     1f renoise.song().transport.legacy_playmode      |
|       pr1n7("C0mp471b1L17Y M0D3: SPD 4c71v47ed!")    |
|     3lz3                                             |
|       pr1n7("M0d3rn M0d3: TPL rul3z!")               |
|                                                      |
|   ⚠️  y0u c4n'7 ch4ng3 17 d1r3c7ly – R34D-0NLY, m8!  |
\_____________________________________________________/

… But gpt is lying to me!

renoise.song().transport.legacy_playmode does not exist in API, at least 6.2 (was it there b4?).

1 Like

Best result from claude:

     β–ˆβ–ˆβ–€β–€β–€β–ˆβ–ˆ β–ˆβ–ˆβ–€β–€β–€β–€β–€ β–ˆβ–ˆβ–€β–€β–ˆβ–ˆ  β–ˆβ–ˆβ–€β–€β–ˆβ–ˆ  β–ˆβ–ˆβ–€β–€β–€  β–ˆβ–ˆβ–€β–€β–€β–€β–€
     β–ˆβ–ˆ   β–ˆβ–ˆ β–ˆβ–ˆ      β–ˆβ–ˆ  β–ˆβ–ˆβ–„ β–ˆβ–ˆ  β–ˆβ–ˆ  β–ˆβ–ˆ     β–ˆβ–ˆ     
     β–ˆβ–ˆβ–€β–€β–€β–ˆβ–ˆ β–ˆβ–ˆβ–€β–€β–€   β–ˆβ–ˆ   β–ˆβ–ˆ β–ˆβ–ˆβ–€β–€β–ˆβ–ˆ  β–ˆβ–ˆβ–€β–€   β–ˆβ–ˆβ–€β–€β–€β–€β–€
     β–ˆβ–ˆ   β–ˆβ–ˆ β–ˆβ–ˆ      β–ˆβ–ˆ  β–„β–ˆβ–ˆ β–ˆβ–ˆ  β–ˆβ–ˆ  β–ˆβ–ˆ     β–ˆβ–ˆ     
     β–ˆβ–ˆ   β–ˆβ–ˆ β–ˆβ–ˆβ–„β–„β–„β–„β–„ β–ˆβ–ˆβ–„β–„β–ˆβ–ˆ  β–ˆβ–ˆ  β–ˆβ–ˆ  β–ˆβ–ˆβ–„β–„β–„  β–ˆβ–ˆβ–„β–„β–„β–„β–„

β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“

β–€β–ˆβ–€ β–ˆβ–€β–€β–ˆ β–ˆβ–€β–€β–ˆ β–ˆβ–€β–€ β–ˆβ–‘β–ˆ β–ˆβ–€β–€ β–ˆβ–€β–€β–ˆ   β–ˆβ–€β–€ β–ˆβ–€β–€β–ˆ β–€β–€β–ˆβ–€β–€ β–ˆ β–ˆβ–€β–€β–ˆ β–ˆβ–€β–€β–„
β–‘β–ˆβ–‘ β–ˆβ–„β–„β–€ β–ˆβ–„β–„β–ˆ β–ˆβ–‘β–‘ β–ˆβ–€β–„ β–ˆβ–€β–€ β–ˆβ–„β–„β–€   β–€β–€β–ˆ β–ˆβ–„β–„β–ˆ β–‘β–‘β–ˆβ–‘β–‘ β–ˆ β–ˆβ–‘β–‘β–ˆ β–ˆβ–‘β–‘β–ˆ
β–„β–ˆβ–„ β–€β–‘β–€β–€ β–€β–‘β–‘β–€ β–€β–€β–€ β–€β–‘β–€ β–€β–€β–€ β–€β–‘β–€β–€   β–€β–€β–€ β–€β–‘β–‘β–€ β–‘β–‘β–€β–‘β–‘ β–€ β–€β–€β–€β–€ β–€β–‘β–‘β–€

1 Like

Yes, I am not sure AI is improving productivity :wink:

2 Likes

There is no smiley that can capture my laughter :slight_smile:
Maybe it needs to be written in legacy API. Who knows :slight_smile:

1 Like

Ok, I’ve added now track automation for VST3 fx and VST3i…

Sadly the VST3 parameterID is required. By that value the DAWs will map the automation lane to the plugin parameter.

Only works with Redux VST3, because Redux VST3 simply uses the parameter index as parameterID (just like VST2) and I currently have no other value for the parameterID.

I guess that means that I need to pause the development of the DAWproject export… :worried:

A lot of stuff already works:

  • VST3 plugins
  • Renoise sample instruments
  • Note data
  • Track automation (only if the VST3 uses index as parameterID)
  • Section naming
  • Track coloring and naming
  • Loads fine now into Bitwig and Studio One

What’s missing:

  • Master track automation
  • Any kind of pattern hex automation
  • Redux macro to instrument automation conversion
  • polyphonic aftertouch

What’s not working due to api limitations (please! give me a hint if I am wrong!):

  • VST2 .fxp generation/export
  • AU .aupreset generation/export
  • parameterID mapping, so most automation won’t work
  • Can’t determine the target device of the Instr. Automation Device. Has to be done via a complete track search instead (so the device has to sit on the track where the instrument plays). That <LinkedInstrument> node is missing in the active_preset_data for some reason, if you access it via api. I assume there could be a better way to prevent what was to prevented by that.

Test .xrns:
crystalhammer test.xrns (71.1 KB)
(uses redux instrument automation on track β€œbd”, and shade plugin automation on track β€œpizza”)

Result .dawproject:
Untitled.dawproject.pdf (101.8 KB) - REMOVE .pdf suffix
(misses the pizza shade automation, since UVI Shade VST3 requires a proper parameterID)

1 Like

Did you have a look to see if the parameter ID is somehow available in xrns (xml)?

Not as I can tell… The Song.xml pretty much is a collection of those XMLs you will get while copy-paste action.

I think a DAW not neccessarily does have to use parameter id, it’s mainly for remapping parameters if a plugin vendor would change the order of the plugin parameters in a later version. This would not work in Renoise then, or at least would wrongly map the automation to the parameters then (I’ve actually seen that behaviour already, I think in some Vanhalla VST3). Renoise simply also uses the parameter index for VST3. But it certainly could query and provide the parameter ids of each plugin, even if it does not use it. Other DAWs rely on parameter ids instead. Or at least the daw project file format / spec.

I’ve retested this and it seems to be not possible to create a zip archive with a β€œPK”-header using tar.

Are you sure that this works under Windows?

-acvf does not even create a packed structure under ubuntu. Adding -z does not give me a PK header.

Yes, it def works fine for me on Windows 11.

1 Like

Ah yes, damn it, target filename has to end with β€œ.zip”. Thanks again :slight_smile:

Hi,

is there an easy way to find out the plugin 's local file path? available_plugins only have a custom path. By easy I mean a better, shorter way than:

  1. Find out which os you are using
  2. Find out which cpu type you are using
  3. Find out the Renoise preferences path
  4. Loading Cached[PluginType]_[CpuType].db into sqlite handler
  5. Querying for the actual plugin path β€œLocalFilePath”
  6. Fixing the found path for macOS VST3

Mmmmh… I am trying nasty workaround to find out plugin parameter ids and plugin unique ids using external tools (was easy to do in Rust for VST2, not so for VST3)… But it seems to be a rocky road. Also does not seem to work with AU then, because Looks like Renoise saves the identifier only here, not the path at all, querying Apple’s AU service for that, or so. I have no access here.

Also is there a way to get the available_plugins even if there is no instrument slot added yet?

Thanks for ideas!

PS:

If someone is good in Rust, I would be glad if you could give me some tipps here. I cannot find a single VST3 library which provides solid VST3 plugin hosting functionality for Rust at all. Even annoyed myself using the common AIs, and mostly got hallucinated solutions about non-existing libraries :joy: I wasted half the day with those AIs, damn it.

The VST3 helper tool should basically do the same as:

VST2 Helper Tool

DawProject-Tool/vst2info-tool/src/main.rs at v0.1.2 Β· Jurek-Raben/DawProject-Tool Β· GitHub

which is querying info from the plugin as host, and outputting this shit as JSON.

Continuing here, I am trying to build an .aupreset now from the preset chunkdata… ChatGPT tells me that an aupreset is basically a plist xml like this:

ChatGPT's opinion about .aupreset struct
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>name</key>
    <string>MyPreset</string>
    <key>manufacturer</key>
    <string>MyCompany</string>
    <key>type</key>
    <string>aumu</string> <!-- 'aumu' = MusicEffect -->
    <key>subtype</key>
    <string>abcd</string> <!-- 4-char code of the plugin -->
    <key>version</key>
    <integer>1</integer>
    <key>data</key>
    <data>
    BASE64ENCODEDDATA==
    </data>
  </dict>
</plist>

The active_preset_data chunk seems to be a plist structure which then contains all the data… So theoretically, I β€œonly” have to convert the bplist (which is a binary structure) to an xml format…? This in LUA… :clown_face:

Maybe this library would do the job, unsure: bplist-dissector/bplist.lua at master Β· andydavies/bplist-dissector Β· GitHub

EDIT: Oh wow, this tool does the job:
plutil -convert xml1 -s plist-file

Not sure if plutil comes with xcode…

I think it comes with macOS itself, not entirely sure though.

1 Like

Thanks, using it now in the export tool.