and don’t forget about Teletype haiku for examples of what can be done with super short scripts.

4 Likes

Hi all,

I’m trying to write a script that toggles CV.OFF 1 between N 7 and N 12 (a perfect fifth).

I came up with

CV.OFF 1 N ADD 7 MUL 5 MOD O 2

which is an (IMO) idiotic way of using modulus and the O iterator to switch between 7 and 12 (7 + 5).

Is there a better way to achieve this behavior? For the sake of parsimoniousness let’s say without using pattern data.

Thanks!

Try CV.OFF 1 N ADD 7 MUL 5 FLIP. Flip will alternate between 0 and 1.

If we wanna play golf, of course we could shorten it to CV.OFF 1 N + 7 * 5 FLIP

1 Like

FLIP! I knew there had to be something :slight_smile: Thanks

1 Like

and using ternary if: CV.OFF 1 N ? FLIP 7 12

6 Likes

Howdy. I finally built my microsystem and modified the er-301 to talk to teletype via i2c. It’s amazing! However, in the latest release of both, I don’t believe the sc.cv.slew command is actually doing anything. If I use wires, and cv output into the er-301, slides are very apparent. changing cv and cv.slew to sc.cv and sc.cv.slew don’t seem to have the same effect. Any ideas?

I’ve just been learning TT by going through the studies - what a powerful module! I came across one issue that I can’t seem to figure out:

Reading CV values from the Rene via the IN port and passing them through to the CV1 output works like a charm. When I’m writing the values in a pattern though and try to play them back via the CV output, the resulting CV values are way out of range. Is there some kind of division I need to make to go from the TT value range to volt per octave? Thank you for your help!

What sort of values are you storing in your pattern? If they’re note numbers (e.g. 1 = one semitone, 12 = octave), you’ll need to use the N op to scale them up – for instance:
CV 1 N P.NEXT
instead of
CV 1 P.NEXT

But if your pattern contains “raw” values like what you get from reading IN with Rene’s V/Oct output patched in (137 = one semitone, 1638 = octave, etc.), then make sure you’re not using the N op as above – if you are, your CV output will almost always be maxed out (“way out of range” indeed – I’m thinking maybe this is your problem).

Hope that helps. If not, I would also make sure you haven’t set an offset (CV.OFF) on the CV output you’re using.

1 Like

Hey, thank you for your help. I’ve been doing some further investigation and used the following approach:

  • set Rene to four octave mode, with only the note C activated
  • select the lowest note and used the command IN.CALIBRATE.MIN
  • select the highest note and used the command IN.CALIBRATE.MAX

I’m then left with the following values connecting the Rene CV out to the TT IN jack:

C1 = 0
C2 = 4095
C3 = 8232
C4 = 12307
C5 = 16383

I’m sure this requires a simply mathematical calculation to turn these values into VV, but I just couldn’t figure it out. Any help is appreciated!

Hey – I haven’t really used the CALIBRATE ops before, and I was hoping to try this out myself this week but haven’t gotten around to it yet. I’m not sure it’s going to be useful to calibrate the input to a different range than the default, though. It seems like what you’re really looking for is a “reverse VV”. The simplest approximation I know of (if you first reset your input calibration) is:

/ IN VV 1

Unfortunately, thanks to rounding errors, that’s not particularly accurate – for example:

* 800 VV 1

is 12800, but

VV 800

is 13107. I think if you were to use those numbers as pitch CV, that would be a difference of more than two semitones (!).

You could try to account for that rounding error with something like this:

A IN
B / A VV 1
B + B / - A VV B VV 1

But that’s grotesque, and takes up two variables and half a script. I’ve wondered before about creating a VV- op or something like that that would do a reverse lookup using the same table that VV uses… maybe this is a good opportunity to try that.

EDIT: even that last example isn’t all that great, because I think it always rounds down. Fortunately 1/100th of a volt doesn’t make a huge difference.

Oh dear. I just realized SCALE will do the job better, or even IN.SCALE.

1 Like

teletype maps 0…16383 number range to 0…10V output. IN calibration ops are meant to ensure the input accurately reflects this mapping. while you could use them to map to a different range (in your case you’re mapping it to a 4 octave range) the numbers you’ll get from IN won’t work properly when used with CV ops (you will be essentially mapping a 4 octave range to a 10 octave range).

to output values you get from IN you don’t need to use any other ops like VV, you can just use the actual value: CV 1 IN. same if you store these values in a pattern first:

P 1 IN
CV 1 P 1

so you don’t really need to convert it to VV values (but if you wanted to do it with best precision, use SCALE op as it calculates using double precision: SCALE 0 V 10 0 1000 IN) edit: jinx!

5 Likes

PROB is a pre, it can only be used at the beginning of a line. to replicate its behaviour when using the ternary if you can use RAND op:

CV 3 N ? < RAND 100 # 12 0

where # is the probability you want. for probability of 50 you could just use TOSS instead which randomly returns 0 or 1, and since 0 is considered “false” and everything else is considered “true” you can just use it as the condition:

CV 3 N ? TOSS 12 0

2 Likes

Does the IN jack read negative voltages? For example, could I calibrate the zero point to be a negative voltage like -5 V ?

Thanks.

I don’t believe the IN jack reads negative volts.

Ok, I have a question regarding pattern ops. What is the the difference between PN.L and PN.END? If they are different, how come there is no PN.F (F for first) op?

I am playing around with patterns, and have lots of fun manipulating PN.L, I would like to do the same for the beginning of the pattern. I have done so with PN.START, but it doesn’t seem to work the same way.

Hi everyone, where ever you may be.

I am having trouble getting my patterns to start where I want when switching between scenes.

I’m currently testing this out with two scenes:
tt00 - Initializes a few settings and starts the metronome
tt01 - Scene with pattern data. Pattern 0 has values in indices 0-3 and Pattern 1 has values in indices 0-11. Every beat I have two scripts that use PN.NEXT to get the index value.

Currently when I start tt01 from tt00, it start on the second index of both patterns. So, while in tt01, I stopped the metronome and set the index of each pattern to -1 and saved the scene. I reloaded tt00 and started tt01; the patterns started in the correct place.

Then I saved these scenes and brought them to my computer. After some editing, I wrote the scenes back to the Teletype and the patterns start at the second index again.

I think I might have found a bug but would never rule out that I have missed something. Any help would be appreciated.

Can you post your scenes to see what they do?

Also, this is a bump because I don’t understand the distinction between pattern END and LAST. Any help is appreciated.

1 Like

P.L sets the total length of the pattern, the number of slots that will be cycled through. P.START and P.END provide sort of a selection or window, so that smaller loops can be selected for the read head to cycle between. The start/end selection is indicated by the dotted line to the right of each pattern’s values in tracker mode, if you set P.START 3 this column will no longer be lit for the first 3 pattern cells. When you’re advancing with P.NEXT, the read head will wrap when it reaches either the length of the pattern or the P.END. Here’s an example.

2 Likes

I guess what I’m saying is that both are non-destructive and in practice work the same way. The only difference is the way the pattern is color coded (dashed line vs. bright/dim numbers).

I understand the use case. Pattern start and end don’t have aliases so last gets used more frequently.

Sure thing, thanks for taking a look. I’m running the 3.1 firmware.

Here is tt00:

TT00 - START

#7
Y + Y 1

#8
A + A 1
A WRAP A 0 11
TR.P 4

#M
X SCENE; SCRIPT 8
M BPM PRM
M.RESET
W EQ Y 0: BREAK
W != A 11: BREAK
DEL * M / 1023 1024: SCENE 1

#I
M.ACT 0
INIT.CV.ALL; INIT.DATA
A -1; B 0; C 0; D 0
PARAM.SCALE 50 400
M.ACT 1

#P
0	0	0	0
1	1	1	1
0	0	0	0
63	63	63	63

0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0

I start with this scene every time. Like I said in the above post: it initializes things and starts the metronome. I increment the A variable with each beat and when I trigger script 7 the scene will change at the end of the measure.

and here is tt01:

TT01 - SCENE 1

#1
J PN.NEXT 0
TR.PULSE J
CV J 8000
DEL.X 1 BPM M: CV.SET J 0

#7
Y + Y 1

#8
A + A 1
A WRP A 0 11
SCRIPT 1; SCRIPT 2

#M
X SCENE
SCRIPT 8

#I

#P
12	0	0	0
1	1	1	1
0	0	0	0
63	63	63	63

1	0	0	0
2	0	0	0
3	0	0	0
4	0	0	0
1	0	0	0
2	0	0	0
3	0	0	0
4	0	0	0
1	0	0	0
2	0	0	0
3	0	0	0
4	0	0	0
0	0	0	0
0	0	0	0

So what I’m seeing on my end is when it shifts over to Scene 1, the first trigger will be on TR 2. When I stop the metronome, use PN.I 0 -1 to set the index of the pattern, save, and then start over with Scene 0, the first trigger will be on TR 1. When I write this to USB and then back to the Teletype, the first trigger is on TR 2 again.