Molly the Poly

Molly the Poly

Classic polysynth with solar system patch creator.

video
Video on Instagram

Juno-6 voice structure with chorus, the extra modulation of a Jupiter-8, and CS-80 inspired ring modulation. This isn’t a proper emulation but you can definitely make space sounds.

The included lib should make it easy to use the engine in other scripts. Uses the same engine commands as Passersby for note on/off etc.

Would love to make this MPE-ready if someone has the hardware and can help out…

Requirements

Norns
MIDI or grid note input (eg, keyboard, sequencer, grid)

Documentation

E1 : Choose a patch planet
E2 : Create a sound

Lots of parameters and modulation to play with!

Download

Molly the Poly v1.1.0
Note that you’ll need to restart after installing an engine.

GitHub

24 Likes

never mind asked in the help section how to save a preset. Nice synth thank you.

might be good to add a note in documentation to reset/restart norns after installing (to activate the new engine)

2 Likes

Just want to say that Molly was very popular with my niece over Easter weekend. She asked if she could “play with the keyboard thing where you blow up the sun to do new stuff.” :slightly_smiling_face:

12 Likes

Oh wow that’s so cool to hear! Thanks for sharing :blush:

1 Like

Just pushed an update with support for using a grid, Earthsea-style, thanks to @jaredpereira for the contribution!

13 Likes

i really love the sound of this synth engine
how can i seq it from the live? do i have to use a midi-usb converter and connect it to the midi out of my Motu? or is it possible to connect the laptoop directly to norns for sequencing it?

USB to MIDI works (I use the iConnectivity mio). I’m not aware of a way to connect laptop to norns directly, but I know there are a few discussions elsewhere on lines about it.

1 Like

thanks mark, yes, i’m doing the same with iConnectivity, just feels that there should be a direct way to connect it, would be great to do that thru the power mini usb

1 Like

would be great to do that thru the power mini usb

that’s not going to happen. the mini usb on norns is a serial tty port and nothing else.

i’d recommend networking norns and your computer and sending OSC.

or, you know, just running Molly in supercollider on the computer.

3 Likes

Hi @markeats (or anyone else who can help) -

I’m working on a sequencer script using Molly the Polly as the engine, and I’ve noticed some clicks when I have a lot of polyphony going on. I’d like to add a parameter to limit the voices (also for creative reasons), but I’m not super familiar with supercollider.

I see the engine has a maxNumVoices classvar, and I’ve gotten as far as adding this:

this.addCommand(\maxNumVoices, "i", { arg msg;
	maxNumVoices = msg[1];
});

Which appears to work if I set the param before I call any noteOn commands, but doesn’t work properly when I update it dynamically after. I suspect I would need to add some logic to to the noteOn command which handles removing voices, but I’m a little lost on where to proceed.

Any suggestions would be much appreciated!

When you say clicks do you mean when voices are stolen (ie, new notes started)? Or more like crackling audio dropouts while notes are just held?

I’d be inclined to keep the maxNumVoices a fixed constant that should be based on the max norns performance (it should already be but we’ve had a few updates since I last tested) and if it’s just about creative intent then limit the voices in the lua script.

It seems to happen when new notes are started. I haven’t tried to reproduce it in your Molly the Polly lua script, though. It’s possible I’m doing something else funky in my script that’s causing performance issues.

Totally understood if you’d prefer to keep it a fixed constant. My first instinct was to put this in the engine, but I would probably have an easier time implementing it in Lua anyway :slight_smile:

I’m just thinking if the clicks are to do with voice start / stop then reducing the count won’t fix it – it may need a little investigating. If you can reproduce it in a simple script or the included one then I can look into it.

This looks so cool! Do you have any videos of this being used?

1 Like

Just the one at the top from me, you might find some from others on Instagram though.

For anyone looking how to save: Press the first button then PSET menu.

2 Likes

Love playing Molly and was hoping to integrate a keymap to ease things up. I got the keymap up and running separate from Molly itself, but when I tried integrating that code into Molly, I ran into a few issues. I changed g:led to grid_device:led, and then I got ‘a nil value’ error and confirmed via a print that grid_device was reading a nil value despite having my grid attached and using it that very moment to play notes back…

Any thoughts on what idiosyncrasies within the script may have brought me to this place // how I may resolve them?

I’m also encountering a slight issue re an expression pedal I’ve wired up for per-note velocity to accommodate for my physical limitations. I created a variable to stand in for the .8 velocity value and then divided the input of the pedal by 127. Unfortunately, when I hit 0 velocity (no pressure on pedal), it doesn’t go to 0 but instead to the last value it was at when I pressed a note (since 0 is a nil value, so the variable fails to update). Any thoughts on how I might change the math there? When I tried adding 1 to the value of the pedal before the / 127, the script failed to load altogether D=

EDIT: This is really my first shot at Norns things – hopefully not overly-silly questions. Going to keep working at it and see if I can figure something out…

it’s been too long for me to remember specific idiosyncrasies with this, but it definitely has some––this was one of the first big new synth engines that norns got, i remember having issues trying to go from the tutorial commands to actually making the same things work with this one. it doesn’t take the same values as the synth engine used in the tutorials. when i was hitting walls it was almost always because i hadn’t followed the variable all the way through the various functions that needed to hit to call the note.

i have probably forgotten too much to be able to help answer your questions but i can maybe get you asking better questions, can you paste the keymap code that is running separately which works?

for the expression pedal, there are a million ways to do this and i am an amateur, but it sounds like you could probably just set the velocity value to 0 by default, something like

    if expPedalValue ~= 0 then 
        velocity = expPedalvalue 
    else 
        velocity = 0 
    end

but this is a complete guess and is basically the first line of norns code i’ve written in half a year. so it’s probably not what you want.

FYI: you can paste code with syntax highlighting on lines if you wrap it in triple backticks (```)

1 Like

Taking the long view, this is even better.

Upon reflection, by work I mean “the things I want to have light up light up” – since it’s in isolation, I have no way to test things like “persistence after a note press” etc. But here is:

g:led(1, 1, 4)
g:led(1, 7, 4)
g:led(1, 8, 15)

g:led(2, 1, 15)
g:led(2, 2, 4)
g:led(2, 3, 4)
g:led(2, 4, 4)
g:led(2, 5, 4)
g:led(2, 6, 4)

g:led(3, 5, 4)
g:led(3, 6, 15)
g:led(3, 7, 4)
g:led(3, 8, 4)

g:led(4, 1, 4)
g:led(4, 2, 4)
g:led(4, 3, 4)
g:led(4, 4, 4)

g:led(5, 3, 4)
g:led(5, 4, 15)
g:led(5, 5, 4)
g:led(5, 6, 4)
g:led(5, 7, 4)
g:led(5, 8, 4)

g:led(6, 1, 4)
g:led(6, 2, 4)
g:led(6, 8, 4)

g:led(7, 1, 4)
g:led(7, 2, 15)
g:led(7, 3, 4)
g:led(7, 4, 4)
g:led(7, 5, 4)
g:led(7, 6, 4)
g:led(7, 7, 4)

g:led(8, 6, 4)
g:led(8, 7, 15)
g:led(8, 8, 4)

g:led(9, 1, 4)
g:led(9, 2, 4)
g:led(9, 3, 4)
g:led(9, 4, 4)
g:led(9, 5, 4)

g:led(10, 4, 4)
g:led(10, 5, 15)
g:led(10, 6, 4)
g:led(10, 7, 4)
g:led(10, 8, 4)

g:led(11, 1, 4)
g:led(11, 2, 4)
g:led(11, 3, 4)

g:led(12, 2, 4)
g:led(12, 3, 15)
g:led(12, 4, 4)
g:led(12, 5, 4)
g:led(12, 6, 4)
g:led(12, 7, 4)
g:led(12, 8, 4)

g:led(13, 1, 4)
g:led(13, 7, 4)
g:led(13, 8, 15)

g:led(14, 1, 15)
g:led(14, 2, 4)
g:led(14, 3, 4)
g:led(14, 4, 4)
g:led(14, 5, 4)
g:led(14, 6, 4)

g:led(15, 5, 4)
g:led(15, 6, 15)
g:led(15, 7, 4)
g:led(15, 8, 4)

g:led(16, 1, 4)
g:led(16, 2, 4)
g:led(16, 3, 4)
g:led(16, 4, 4)

g:refresh()

really very simple.

I’m going to try that elseif solution tomorrow; intuitively, it seems like it’ll work, and, as silly as this’ll sound: I’m stoked that I understand it…