I ported Noi modules

Beautiful VCV lineup, surprised I haven’t heard of them before.

v2.0.0-dev12.2 needed.

https://drive.google.com/drive/folders/1UWzGrsmvtfXJEDopqq1BTxEoySWiCwic?dmr=1&ec=wgc-drive-globalnav-goto

5 Likes

these are really awesome, loving the resonator and grain verb, ty much!!

Hey Thank you! That was fast!

Just out of curiosity, once the 2.0 firmware becomes official does that mean that these along with the other ported modules on this forum would be part of or available on the main downloads page or will ported plugins always be found in their respective githubs?

Great question. I have been very lazy about my mm-plugin metadata setup, not sure if @danngreen can answer how I can best keep that tidy for future release (or potentially get them listed on the 4ms plugins site?)

We’ve been thinking about this, too. I’m typing up a README for publishing releases right now.

The way our website works is we give it a list of github repos and a list of plugin names to search for in those repos. The .mmplugin file needs to be in a Github Release. Our script scans the Releases for the latest version. Versions like vX.X-dev-12 will go into the dev plugins zip file, and versions without the current dev version string will get listed on the main plugin site (unless they are version v0.x or contain dev in the version name).

Also, the plugin-mm.json file will need to contain the list of modules.

1 Like

I wrote up a bit about what’s needed for a plugin to be scanned by our scripts and hosted. There’s a fair bit of complexity since there could be multiple versions, and certain versions work with v1.x firmware vs v2.x latest firmware vs. older v2.x firmware… But I think we have it figured out now.

I tried to put all the info in this document, including an example github workflow script (which is not necessary but is nice because it builds it for you). You also can manually create releases on github and upload the file you built.

Let me know if you need help getting any of that set up.

4 Likes

Thank you so much for porting

1 Like

Updated with a cleaner repo and I think a new NOI looper module called pruners (?)

I also updated the plugin-mm.json - to save your sanity @danngreen should I tag you each time I provide a valid plugin-mm.json to request it being listed?

1 Like

Great! All that needs to happen is the .mmplugin file needs to appear in the Releases (here: Releases · Ericxgao/metamodule-nozori · GitHub)

You can manually create a release (“Draft New Release” button) or you can use a github workflow to do it automatically. I have a sample workflow file and some screenshots to help with that process in the release README: metamodule-plugin-sdk/docs/release.md at v2.0-dev · 4ms/metamodule-plugin-sdk · GitHub

The other thing is to follow the naming convention outlined in that document when you name the .mmplugin file. This helps our website knows which version is which (e.g. dev-12 or some other dev, or if it’s a v1.x plugin). Also good naming helps users know if they have the latest version or need to download a new one, and which firmware a given mmplugin file will run on.
The mmplugin file needs to be named like this:
[BrandSlug]-v[plugin-version]-[sdk-version].mmplugin

So it could be Nozoid-v0.2-dev-12.mmplugin for instance if it’s built with the dev-12 SDK and you want to call your build “v0.2”. Then the next release you make, you will bump your version up, perhaps to Nozoid-v0.3-dev-12.mmplugin. When we release dev-13 (soon), you’ll need to re-compile with the new SDK and call the file Nozoid-v0.3-dev-13.mmplugin

Once we have v2.0 as official, then the tag will change from dev-13 to fw-2.0.

Yes, that’d be great, just PM or tag. I’ll run the scan+update script which will check your repo for new releases and put them on our site.
We also will periodically scan for new releases, so if you publish anything new that matches that naming format, then it’ll eventually end up on the site even if you forget to tell us.
If by change you want to publish a release but don’t want it on our site, you can mark it as a “Pre-release” or just don’t use the exact naming convention.

1 Like

@etcetc thanks for your hard work, been using these consistently since you ported them.

1 Like

It looks like Hellebore has a memory leak of around 8-9MB or so.
To see:

  • Check the free RAM (e.g. 139MB)
  • Create a new patch with Hellebore only
  • Check the free RAM (e.g. 157MB)
  • Close that patch by creating another new patch with no modules (or pick the 4ms Atvert2 or some thing known to not leak)
  • Check the free RAM (e.g. 148MB)

Each time you add a Hellebore and then close the patch, memory grows by about 3% (or about 9MB) and never comes down.

The cpu-load tester found this problem, it ran out of memory trying to run patches with this module at various block sizes and jack/knob configurations.

Fixed in the latest release and managed to optimize it to bring down to 50% cpu

2 Likes

Looks good now.
Sinesis is crashing the cpu load tester now. I was able to get it to crash by creating a patch of several Sinesis, auto-mapping one of them and then closing and re-opening the patch.

Thanks - I think fixed now, I had to just rebuild it on the latest plugin-sdk.

I’m still getting Sinesis to crash, using the v1.0.3-dev-13 release.

Unfortunately I haven’t been able to reproduce it when making a patch manually. The CPU load tester crashes 100% of the time on this module, but making a patch manually only crashes occasionally.

I’m deep into debugging the plugin unloading/reloading crash, but this one is the only module failing in the cpu tests so I wanted to report it.

Any ideas? I’ll try debugging it when I get a chance.

Hmm that’s odd. I’m trying to reproduce it on simulator but no luck - not sure how else to fix it if I can’t get stack trace, if you have any ideas.

Yeah I thought I had a totally reproducible test case and then it just started working again.

I’ll put the JTAG debugger on it while the CPU load test runs and hopefully get something useful from that.

Aha! Sinensis is OK, it’s Pruners that has a memory leak.
It’s not huge enough of a leak to crash while testing Pruners, but it leaves little free memory for Sinensis to run, so that’s why it crashes on that module.

Ok… so it’s true Pruners has a memory leak. I think it might be from this extra allocation:

You fixed something similar in ring_buffer already.

The problem with Sinensis is here:

These are uninitialized floats, so their value will be whatever happened to be in that memory location when the module is instantiated.

The oneinFour divider only writes their values every 4th time process() is called. So the first three times, their random/uninitialized values are read.
In particular it was crashing here:

Randomly, sometimes numberOfBand is some huge number and this eventually tries to access memory out of range. I saw this attempt at memory access earlier but mistakenly thought it was because Pruners had left the heap full.