Teletype 3.2+ feature requests and discussions

That is a cool idea!

Ternary ? OP to the rescue :smiley:

1 Like

if you use a variable you can make conditions shorter:

#1
L 0 3: A 1; $ 3

#2
L 1 16: A 2; $ 3

#3
IF EQ A 1: //do something for script 1
IF EQ A 1: //do something else for script 1
IF EQ A 2: //do something for script 2
IF EQ A 2: //do something else for script 2

can also store the condition itself in a variable (at the cost of losing a line):

#3
J EQ A 1; K EQ A 2
IF J: //do something for script 1
IF J: //do something else for script 1
IF K: //do something for script 2
IF K: //do something else for script 2

another variation of this is using the same script for regular duties as well as being an extension for init:

#I
I 1; SCRIPT 8

#8
IF I: // init stuff
IF I: I 0; BREAK
// regular stuff
5 Likes

The second example looks great! The first and last one raise questions for me (and I may be in the wrong thread at this point so feel free to relocate :wink:)

Example 1: is that valid syntax? I didn’t think you could have semicolon separated ops on the same line as a colon op but maybe I’m remembering wrong or remembering old news. If it is valid does it execute both of those in a loop?

Example 3: does local I get passed from the calling script if you aren’t calling via an L op?

yeah, you can have several semicolon separated statements after a modifier. if the modifier is a loop, it will execute all of the statements on each iteration (so in my example it will continue assigning 1 to A which isn’t necessary but allows us to save a line, otherwise you’d have to set A before you execute the loop).

you just can’t have several modifiers on the same line: EVERY 5: L 1 4: SCRIPT 2 is not allowed, for instance.

and yeah, local I gets passed from the calling script regardless of whether you call a script from a loop.

2 Likes

Thanks, I learned some things today then! I can put those to work for me!

1 Like

i also forgot that while I is initialized from a calling script, it’s set to 0 when a script is triggered from a trigger input / keyboard / grid. so my example 3 can be simplified further:

#I
I 1; SCRIPT 8

#8
IF I: // init stuff
IF I: BREAK
// regular stuff

some background on I behaviour if you’re curious: (Teletype) Asynchronous tasks and variable scope

1 Like

One more question if I may, since you just changed the rules of the game for me. XD

#1
IF EQ X 0: A 1; B 2

When this op executes, does B get set to 2 only if X is zero?

Or more generally do all semicolon separated ops after a modifier get affected by the modifier?

correct, a modifier will be applied to all of the semicolon separated ops after :

1 Like

I’m so sorry but my brain is wired in “can we shorten this”-mode from so much time on the teletype, I would write

IF ! X: A 1; B 2

3 Likes

I was thinking about creating something along the lines (no pun intended) of Compass with Teletype and Magneto, and how it would be nice to be able to use the Tracker view with chars/symbols. I personally feel that it’s easier to give meaning to a char or symbol than to a number that would trigger an action. Let’s say for example you’re triggering a sequence of actions from the tracker view. Using “S” or “^” for using a shift CV trigger, or “I” or “∞” for the infinite transport control would be much clearer than a number. To prevent scripting confusion, there could be some kind of a char or ascii op. Any thoughts?

I think it sounds cool but there is no OP which accepts chars or symbols, so there is a lot of fuzziness between the overall concept and the suite of needed OPs to make that concept worthwhile. The only direct use I can think of is accepting the currently-existing variables as input into the tracker to allow evaluating them as numbers when retrieved.

A way to bypass would be to only allow the chars etc to be inputted in the patterns, and when they’re retrieved from a pattern index interpret them as the ascii code (always a number)

I wonder if this propsal has ever made it to something?

I tried to get there by averaging a looped addition of twelve random values but I could not figure out how to get it asymetric as @zebra suggested in that thread and how it’s known from the Buchla 266. An extended version of it’s second stored random function would be very useful - a bell curved distribution with parameters for the shape of the curve like Skewness and Variance. It’s great for pseudo random melodies and stuff…

4 Likes

Dear Teletype community. A friend of mine is building me a DIY Arc, I would like to connect it to the Teletype, the same way I connect my DIY Grid. As far as I can see, libavr32 already supports arc messages (monome_ring_…), but there are no Arc OPs in the Teletype? Should not be hard to add a few? (If this has already been discussed, I would be happy about pointers to readup). I might just implement this privately for myself, but I guess I should do so in a way, that it could be at least considered for inclusion in the main branch at some point in the future.

Another request which comes to my mind would be the inverse BPM function which was found to be lacking in the “Teletype Talk” YouTube tutorial. If it has not been already done.

It is a hard design problem, even if the code ends up simple. What are you hoping these OPs will do?

I think * / 30000 M 2 would work. A hypothetical inverse OP could save 6-8 characters, though. In what context was BPM needed as a whole number of beats per minute rather than the period in milliseconds?

I think * / 30000 M 2 would work. A hypothetical inverse OP could save 6-8 characters, though.

If it is that easy, the feature might not be necessary. I was trusting the reviewer in this video, who goes to great lengths and chooses a rather inefficient looping strategy to calculate the inverse https://youtu.be/mMAhjRKrpZE?t=1155

I think the idea is mostly to have a more intuitive feedback, maybe also for quickly adjusting other devices working with BPM inputs on the modular.

It is a hard design problem, even if the code ends up simple. What are you hoping these OPs will do?

I guess, first of all to use the encoder knobs as virtual potentiometers, to set CV etc., and then set the LED feedback, similar to how it works for Grid (but without the graphical representation). Like setting a virtual scale, and then doing operations over ranges on this scale, or transposing the scale itself.

@EqualTemperament wow, you really took the long way around on that one :laughing:

2 Likes

I too would love to be able to easily shift randomness to a certain center or edge.

In other environments I would normally do it like this:

  • Generate a random number x between 0 and 1
  • x^2 or x^3 etc for shifting down towards 0
  • x^1/2 or x^1/3 etc for shifting up towards 1

With TT, I would do something like this as a crude workaround, which is not so elegant:

J RND 100
PROB 20: J RRND 80 100

Or maybe I am missing something?
I know there is CHAOS but it seems too specific for that use case.

1 Like

I’m most interested in a way to distribute random as well…

Hello @scanner_darkly, I would like to implement I2C-OPs for the ZRNA FPAA board. How do we start this correctly? Current I2C address seems to be 0x15, is that ok, or will there be a conflict with existing hardware?

Main site: https://zrna.org
Examples: https://zrna.org/docs/quickstart
Existing python I2C client: https://github.com/zrna-research/zrna-api/blob/16a4fa981e5e21202a0ad78a9b18ffa298ef17d0/zrna/util.py
Definition of remote procedure interface: https://github.com/zrna-research/zrna-api/blob/16a4fa981e5e21202a0ad78a9b18ffa298ef17d0/proto/zr.proto