Teletype workflow, basics, and questions

N.B is fast enough to be used in a script, I do that all the time.

R is reverse bitwise notation. It’s useful in this context, as it lets you define the scale “from left to right” or “from the root and up the chromatic scale”.

The discussion related to the R notation is here: Teletype 3.2+ feature requests and discussions - #305 by desolationjones

1 Like

Ok, I get it, B for Binary and R for Reversed binary. Makes sense now !

1 Like

I’ve been spending lots of time with Teletype lately, and I have a few questions.

One is about Teletype expanders.
It looks like supply chain issues have hit all of the obvious input/output expanders: TXo, TXi and Ansible. I’m watching all of the usual used listings for any of those, but I haven’t seen any of those in a while.
At the moment I’m needing for more inputs, ideally more encoders for live interaction that is clumsy to live code. I’ve seen a number of references to the Expert Sleepers CVM-8 being a possible input option, but I can’t find much to refer to. If that is an input option, I have a couple slider modules to use a voltage sources that I could jack into the CVM-8. There are also IC2 fader modules like the Michigan Synth Works F8R, but those are all pretty big when I really just want 4ish input sources.
Are there any other input expander options that I haven’t found?

The other question is about “scheduling”.
My question is: if I’m using the metronome script to trigger synchronized scripts, I’m wondering about a clean method to fire a script once on a synchronized call from the metronome script.
What I’m doing works, but I have a feeling there’s something better. In “M” I have:

IF EQ A 0 : $ 1; A 1

Whenever I set A to 0, it fires $ 1, and doesn’t re-fire until I set A to 0 again. That is my desired result, I just have a feeling there must be a tidier way to do it. Any other strategies?

Not sure if this work:
? EZ A $ 1 0

EZ x is tidier a bit.


TXo and TXi have been difficult to obtain long before the 2020s mess and I believe they were always DIY or third-party builds.

I like the Tesseract Sweet Sixteen. Yes it’s big-ish – but it serves not just as 16 faders (and CV inputs!) for Teletype but as a USB MIDI controller, CV-to-MIDI CC converter, and analog faders/attenuators. Honestly the most used, most useful module that I own.

1 Like

Interesting - I’ve never looked hard at that module. So are the values that you get over IC2 the value from the fader position when unjacked, and when something is jacked in, you get the value from the CV input attentuated to the fader level? I couldn’t quite tell from their website.

1 Like

Yep, that’s how it works.

1 Like

You could also do $ A; A 0 and have the script fire only when A is not 0. This has the advantage of allowing you to fire a different script each time.

The key to this technique is that $ 0 does nothing.


I’m having a hard time trying to initialize my scenes properly. When I switch scenes, I often encounter problems because some values/states are left ‘non-neutral’ from the previous scene.
This is usually CV, TO.CV, CV.OFF, TO.CV.OFF, JF.SHIFT, and variables. Initializing all of them is tedious, and forgetting one of them is quite easy and can lead do critical problems in a live situation.
We have some tools like INIT.CV.ALL that help, but could we imagine a ‘super INIT’ command that would init :

  • All CVs including expanders
  • All TRs including expanders
  • All variables to 0
  • All JF voices to CV 0, velocity V 5
  • JF.SHIFT 0
  • etc…

Any thoughts ?

1 Like

I’d love an init OP that resets teletype back the the state after booting into a blank scene.


I have the CVM 8 and the F8R.

I use the CVM for getting volt/oct CV into the teletype. It works well. It also works for other types of CV obviously. However, you need to use generic i2c ops to do this - they do work but they’re a bit more verbose and take up space in scripts. I have made a custom teletype firmware that has a CVM op for getting CV into teletype if you’re interested. I haven’t implemented the other functions of the CVM though (midi etc).

The F8R is cool and works well over i2c. You can also use it to control other modules over cv at the same time. In theory this should allow you to make very playable patches. I haven’t really started to dig into this yet (too many new modules, too little time). Can confirm the i2c works well though. In theory the F8R should be incredibly powerful with, for example, Disting EX by way of teletype. That should let you do some really interesting things. I’ll dig into that world at some point.

Since the JF parameters are not stored in Teletype, I don’t know if those would ever be included in an init OP. I suppose the I2C devices could each have their own init but that makes more, not fewer OPs to remember. Probably the best bet is to figure out which commands are needed for your super init and copy/paste them to the first line of every scene’s I script. (hopefully it fits on one line?)

It kind of surprises me that INIT doesn’t accomplish this. What does it miss?

Well…I always thought I was missing something obvious. But now I can tell : to me, INIT does nothing (that I found) !

I don’t really see your point here, as they are controlled by TT and become part of a system. At least for the expanders, I don’t see why it wouldn’t be treated as the rest of the TT cv/states. To me, the same goes to JF.

1 Like

If you’re willing to share, that would be much appreciated. Beyond just using CVM, I have been looking at the Teletype source trying to get a sense of how to extend it for my own purposes. Seeing how you modified it for CVM would be super helpful.

1 Like

It should initialize the following to their defaults while preserving calibration:

  • Variables
  • Pattern data
  • Grid config
  • Random seed
  • MIDI config
  • Active delays
  • Stored N.B/X scales
  • Stack
  • Script contents
  • Turtle
  • LAST times
  • TIME elapsed

If you’re willing to share, that would be much appreciated. Beyond just using CVM, I have been looking at the Teletype source trying to get a sense of how to extend it for my own purposes. Seeing how you modified it for CVM would be super helpful.

Sure. Here’s the branch. There’s a few other bits in that branch, so here’s the specific CVM commit if you’re interested in the implementation specifically.

Fair enough ! 20 characters of shame.

(cannot make consecutive posts, so : )

Curious if someone can help me with this :
how would you make slowing down ratchets ? Like, 10 triggers, each one being a bit more spaced from the previous one.

EDIT : found a way. If anyone has a better/different, please discuss !

A 0; $ 5


A + 1 A
DEL * 20 A: $ 5```

I am getting really stuck on a script, so I don’t know if this is the right place? I am trying to use the time parameter to basically create a 32s loop, playing samples on my blackbox at specific times.

I have two patterns, one with midi note numbers to trigger pads (PN 0) on my 1010 blackbox, the other with the times (in ms) these pads should be triggered (PN 1). I am using the I2C2MIDI to send midi to the blackbox. Here’s my code (that doesn’t work haha)

B PN 0 O; D TIME + 100
IF >< TIME C D: I2M.N B 127

This just doesn’t work and I somehow knew it wouldn’t. It basically either misses the timepoint or triggers multiple times (which turns of the MIDI note on and off sequentially). I tried incorporating the D variable to not have to precisely hit the timepoint. There must be a much easier way to achieve this?

I thought about using a loop to loop through the 15 different indices of the patterns on each run of the script but I’m having trouble getting an IF statement in a loop.

1 Like

Not sure if it’s the best suggestion, but could you rather use the timing pattern to setup delay times ?
So either re-write it so you fill it with relative values instead of absolute time, or calculate the difference between a step and the previous one (but would be problematic at the end of the pattern).
Hope this helps.


You’re heading in the right direction with using the loop, however you’ll need to dedicate another script to execute each iteration of the loop to accomplish anything complex. My go to approach is this:

L 0 15: A I; $ 2

With A being any free variable not currently storing anything important. Then within script 2 use A as you would use I in the loop statement.

Hope that will help in some way!