o-o-o (pronounced oh-dasho-dasho) is a fm-based synthesizer and a sequencer that is played by connecting dots.



  • norns
  • grid or midigrid (optional)


  • E1 changes instrument
  • E2/E3 changes position
  • K3 adds connection
  • K2 cancels connection
  • K1 for help
  • K1+K3 pauses/plays+saves on play
  • K1+K2 loads current bank
  • K1+E1 changes volume
  • K1+E2 changes current bank
  • K1+E3 adds random (cw) or removes last (ccw)

each dot represents a sound and has an underlying random euclidean rhythm to play that sound. the rhythm is randomly generated based on a seed (PARAMS > seed). the triggered sounds are all generated using an internal FM engine (“Odashodasho” engine). its possible to change the engine to MxSamples in the parameters (PARAMS > engine)

a dot will trigger a sound if it is connected to another dot. a dot with zero incoming connections and at least one outgoing connections will trigger first. upon triggering, it will “arm” all outgoing connections. when a connection is armed, it will cause the connected dot to trigger the next time the rhythm of that dot hits a beat. connections curved up or curved left are going left to right, or down to up, respectively. connections curved down or curved right are going right to left or up to down, respectively.

there are gradients in the rows and columns. these are hard-coded in the script, but you can easily change the behavior through maiden. currently they are coded so that columns on the left typically trigger slower (except pads) and columns on the right trigger faster. rows on the bottom are lower notes and rows at the top are higher notes (except pads). pads are special - each dot actually represents two intervals, where the row specifies root and the column specifies the other two intervals.

the sounds, scales and root notes for each instrument can be changed in the parameters. you can also set each instrument to send to a midi device or to a crow device (one output for pitch, one for envelope). each instrument has 16 slots in a bank which you can save/load patches for individual instruments. the patch saves will include parameters for the instrument as well as connections in the networ. change banks for k1+e2 and save a bank by pausing+starting a track (k1+k3 twice) and load a bank using k1+k2.

the grid is optional and opens up some controls. the first 8 columns mirror the grid on the screen and connections can be made by pressing any two points. the first two rows of the second 8 columns (if using a 8x16 grid) save and recall patch saves - you can save a patch by holding for > 1 second and then releasing, and you can load a patch by quickly pressing and releasing. the other buttons on the grid are for scrolling through the instruments and toggling play:

simultaneous multitrack recording is available if you select PARAMS > record each. this will record all playing instruments into the ~/dust/audio/o-o-o/<date> folder as .flac files. be careful though as this can add up in disk space quickly! the idea here is that you can record multiple instruments and then mix them / add effects to them individually in post.

if using the Odashodasho engine you can switch an instrument from the internal fm engine to a one-shot sample PARAMS > <instrument> > sound. then that sound will be triggered instead of the internal fm engine.

this script wouldn’t exist without Eli Fieldsteel’s FM tutorials, which the internal engine is based. it also wouldn’t exist without goldeneye where @tyleretters first implemented this genius idea of creating a grid of random euclidean rhythms (also thanks for the great grid-map tool!


install with

;install https://github.com/schollz/o-o-o

omfg what an instantly inspiring interface, you are a juggernaut of play


This sounds incredible.
Well done.
Brings to mind all my favourite golden-era WARP idm.


oh my goshhhhhhhh HOW. you are like willie wonka - just churning out magical creations day and night. you’re so inspiring. i can’t wait to play it. i know what i’m doing on my travel day tomorrow.


jeepers! i appreciate what you do. thank you :raised_hands:


Demo sounds awesome and it looks like a lot of fun to play with!! Thank you @infinitedigits!

1 Like

Haha another gem! Thanks :metal: What worked for me especially well was setting sharp attack and quite a short decay on the PAD, then changing the division to something below 1.

1 Like

Increasingly clear that he’s made a Faustian bargain with a higher power of some type. I mean, it’s pure benefit for the rest of us so 🤷


This is just cheating now. Instant vibe.


It comes together so quickly?? this is amazing.


Had to come on here and say thank you @infinitedigits! I already posted a quick video of literally playing with this script for 5 minutes and it’s so fun.

1 Like

I have to agree that this would not have been out of place in some late 90’s Warp records.
Which is not a bad thing at all…:slight_smile:

This is one of these scripts that has so much personality that I would probably not use it to make my own music but considered as a way to listen to yours, it’s really excellent :+1:


Good lord this patch is already awesome and I’m positive it’s only gonna get better the more I play with it. Thanks Zack. You’re a savage dude. It’s hard to keep up with all of your awesome scripts. So many good ones to work with already and you churn them out like jams


I’ve actually had the script running for most of the day and have switched between it and regular music during my work day (mostly adjusting synthesis params bit by bit) and it’s indeed very, very good.

I’ll try to make it spit some euclidean noisy/industrial later, pretty sure I can coax the FM engine into harsher territories :wink:


This is so so so cool! Thakn you so much, this is really fun and rewarding.

Are there plans/is it possible to incorporate Mx.Samples into this type of interface?

I really think i need to learn how to do some coding - starting to feel bad about being all take and no give :disappointed:


This would of course be fantastic.

I’ve been playing for ten minutes and already have something quietly odd cycling away. Wonderful stuff - thanks for another amazing script @infinitedigits !


brimming with inspiration. excellent work!


I always ask for this :sweat_smile: but are you planning to add randomization for connections? I guess I’m super lazy or maybe it is just that randomness factor which is interesting


thanks for the kind words everyone!

yeah that is a plan! probably something like K1+E1 so you can quickly add random connections (as well as quickly remove existing ones).

this is also a plan! this was actually an initial plan but I really wanted to make something that you can just open up and play without any extra inputs, without controllers, and without downloading other scripts/sounds. but mx.samples would be great as an extra option. and now that there are drum samples in mx.samples you can get quite diverse instrumentation which should be neat in o-o-o.

yess! do ittttttt


This would be fantastic!

I only just saw that K1 = K3 pause combination - is it possible to replicate that control per instrument as a button row on the right-hand of a 128 grid, maybe, in a similar way to the l/r buttons at the bottom left of the second set of 64 on the grid which allow for switching instruments?

Here’s a little video of o-o-o and friends at play: