Here’s a little scene I cooked up this morning. Every four notes of the first pattern is a chord (they’re all maj7’s). The second pattern is the chord progression: the value for each step points to a chord in the first pattern.

Both voices are TXo oscillators. Script 1 triggers the top voice, Script 2 the low voice. Script 3 has the main steady clock into it. All three are triggered by different channels of Tempi. The second line of Script 3 sends a random voltage to Tempi, modulating its state, which is where all the rhythmic variation comes from.

The top voice drunkenly stumbles through the wavetable ( cheers @bpcmusic :wink: )

#1
P.N 0; A + P.RND 36
PROB 50: A + A 12
TO.OSC.N 1 A
TO.OSC.WAVE 1 * DRUNK 20
TO.CV.SLEW 1 TI.PRM 1
TO.CV.SET 1 V 10; TO.CV 1 0

#2
IF NZ B: $ 4
P.N 0; TO.OSC.N 2 + P.NEXT 24
TO.OSC.WIDTH 2 RRAND 10 90
TO.CV.SLEW 2 TI.PRM 2
TO.CV.SET 2 V 3; TO.CV 2 0

#3
EVERY 4: B 1
PROB 50: CV 1 VV RRAND 0 500

#4
P.N 1; A * P.NEXT 4; P.N 0
P.START A; P.END + A 3
P.I P.END
B 0

#5

#6

#7

#8

#M

#I

#P
24	26	0	0
1	1	1	1
12	0	0	0
15	25	63	63

17	0	0	0
21	0	0	0
24	1	0	0
28	1	0	0
10	0	0	0
14	0	0	0
17	1	0	0
21	1	0	0
15	2	0	0
19	0	0	0
22	3	0	0
26	0	0	0
12	0	0	0
16	3	0	0
19	3	0	0
23	0	0	0
8	2	0	0
12	0	0	0
15	4	0	0
19	5	0	0
13	5	0	0
17	4	0	0
20	4	0	0
24	5	0	0
0	2	0	0
0	1	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0
0	0	0	0

#G
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000

0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
23 Likes

@freqout - that scene gave me no ends of joy to read and listen to. It feels so good to see folks exploring the edges of the functionality that I was able to squeeze into the TELEX. That you did it in such a lovely and musical way made it even more so for me.

Thank you so much for sharing.

3 Likes

20 characters of hell yeah :ok_hand::ok_hand:

2 Likes

thanks! those wavetables were a nice surprise. i love it when it veers off into that very metallic sound and then back :slight_smile:

1 Like

Here’s a little idea for Just Type I thought I’d share, maybe you’ve thought of it yourselves: I think of it as “figured bass”. Put Just Friends into synthesis mode, patch a pitch source into IN and let’s go!

Use pattern(s) to store chords: right now I have just the following: -12, -5, 0, 3, 7, 12, which, if 0 represents the root note, gives you a pretty close-set minor chord, with the root tripled and the fifth doubled. Then, adding

JF.NOTE ADD IN N P.NEXT V 10

to a script will read the CV from IN (adding a short DEL might help give better results), choose the next note in our “chord”, and play it out, creating an argeggiated 6 note chord.

Plenty of ways to expand this: using different patterns (or regions of patterns) for different chord qualities or voicings, using a loop to play the full chord at once, putting the CV read into a different script to give Teletype control over when the chord changes, etc.

Actually, come to think of it, if you’re happy just arpeggiating, you could even refactor this to play any oscillator…

17 Likes

thanks for this script!

for those of us without TXi, this script can be modified to use arc encoders via ansible + levels. basically, use LV.CV instead of TI.PRM. tricky bit: there’s no MAP for LV, so use LIM:

Z RAND LV.CV 4
[...]
LIM LV.CV 4 0 800

…etc.

at least, the modified script seems to work with all these changes. i generated quite a bit of blippy computer madness with mangrove’s square and 3sisters’ sine output running into isms’ lpgs. some interesting regular rhythmic syncopation can be achieved with a slower clock (param knob on teletype) and a low jitter value (arc encoder 1; LV.CV 1).

2 Likes

Is there a concise way to shuffle the contents of a pattern?
(not to be confused with shuffled timing, in this case I mean to rearrange all of the values within a pattern)

Once again, something for which a new operator would be perfect as this is just a few lines of C++…
This would actually be a quite useful feature.

With the current TT operators you could implement something like the Fisher-Yates_shuffle but you’d need another script dedicated to that as it won’t fit in one loop line (I could only get it down to 40 characters) :

This is totally untested as I’m nowhere near my Teletype, so probably not working :slight_smile:. And it uses a ton of variables, so not super nice for complex scripts.

[where you want to shuffle the array]

P.N 1; A 4; B 12
L A - B 2: C I; SCRIPT 1

[in script 1]

D RRND C - B 1; 
X P C; P C P D; P D X

The first line initializes things :

  • we work on pattern 1
  • A defines the first index that we want to shuffle and B the last one (in that case from the 4th index to the 12th)

Then we loop over the desired indexes, store the I value in another variable as they are script-dependent and call the desired script (loops working on several lines would make that much less cumbersome). We use script 1 here but it can obviously be any other one.

In the other script, we get a random index in the desired range and then the second line swaps both array elements using a buffer variable (in that case X).

As I said, that’s probably not functional as it’s untested but something like this should basically work.
And an operator for that would be great :slight_smile:.

2 Likes

I’m studying Teletype and as a small exercise, I’ve built a simple euclidean sequencer.
I’m using the tracker to store the values required by ER, as explained here, but instead of using 1 column per trigger output and row 0 for fill, row 1 for length etc, I’m using P0 for fill P1 for length and P2 for rotation. And I’d like to use P3 for the probability.

So, for example on row 0, I have :
4 16 0 100

In a script, I wrote :

Z + 0 A
X PN 2 Z
Y ER PN 0 Z PN 1 Z - T X
Y && Y LT RAND 100 PN 4 Z
IF Y: SC.TR.P 1

I use the variable A as an offset, it gives me the possibility to quickly jump to another euclidean sequence/ another row in the tracker.

The problem is that even if the probability is set to 100 in the tracker, some triggers are not sent, very few of them, but it happens sometimes, so I’m wondering if there’s a better way to write multiple conditions, to combine If and Probability. Is there a problem with the syntax of this script or the order of execution ?

Thanks.

The trouble is this line: Y && Y LT RAND 100 PN 4 Z. Let’s talk through it. we’re saying set Y to be AND of Y (which is 1 or 0) and LT RAND 100 PN 4 Z. But the problem, is that if RAND 100 rolls 100 and PN 4 Z IS 100, the answer to “is RAND 100 less than PN 4 Z?” is no, because 100 is not strictly less than itself. The fix is easy! Replace LT by LTE, which means less-than-or-equal, and has nothing to do with cell phones.

4 Likes

Oh, great ! I understand, and it’s working as exepcted now. Thanks a lot !

1 Like

What is advancing T?

I’d try this:

B PN 1 A
O.MAX B
Y ER PN 0 A B - O PN 2 A
PROB PN 3 A: SC.TR.P Y

(Assuming “SC.TR.P 0” does nothing, as “TR.P 0” does.)

Or instead of relying on O, which I inevitably want to reference on another line every time I use it,
T WRAP + 1 T 0 B

1 Like

Thank you.

It’s in script 2

T ADD 1 T
SCRIPT 3
SCRIPT 4

And script 1 only contains the reset, maybe that’s not particularly great.
T 0

I’m not familiar with the syntax yet, it takes me some time to read the script that you’re suggesting, sorry. I think I understand your code and I will try it but at the end there is:
PROB PN 3 A: SC.TR.P Y
I imagine that SC.TR.P 0 does nothing indeed but I plan to use many similar scripts,multiple euclidean sequences in my scene, SC.TR.P 2, SC.TR.P 3 etc, I should have mentioned that. So I’m not sure I can write the last line like that.

2 Likes

I did kind of write it more for conciseness than readability. I expect PROB PN 3 A: SC.TR.P * Y 3 would work if it fits on a line, your way is clearer as long as you have the lines to spare :slight_smile:

I’ve noticed that depending on Euclidean pattern length, sometimes variables wind up resetting out of sync with the pattern when they hit their maximum or overflow to 0, so I usually wrap them to some multiple of the pattern length. For instance, if the same counter is going to drive a length 8 pattern and a length 12 pattern, I’ll reset it at 24 (or use a separate counter for each pattern).

1 Like

Ah yes, I get it, yes I think that would work :slight_smile:
thanks !

Edit :

I’ve modified your code and tried :

Z + A 0
B PN 1 Z; O.MAX B
Y ER PN 0 Z B - O PN 2 Z
PROB PN 3 Z: SC.TR.P * Y 1

the first line sets variable Z —> row + offset so I can type A 4 in live mode to jump to another “sequence” for example. I’ve also added O 0 in another script (I don’t know if I need to reset the counter). For some reason, it’s not working as expected, I’m testing with a simple 8 16 0 sequence but the beat is not regular. It would be very useful to use this counter / O variable , especially if they can be independent, I didn’t know that. Is it a global variable or is it “one per script” ?

I ended up using the following script, I can have many euclidean seq with probability.

#1

T 0

#2

L 0  7 : $ 3 
T + 1 T

#3

Z + I A; X PN 2 Z
Y ER PN 0 Z PN 1 Z - T X
PROB PN 3 Z: SC.TR.P * Y + I 1

and A is the offset variable for the tracker that I can optionally use to jump to another sequence.

hey, i had a question on your marbles script, specifically clock jitter. if i wanted to isolate just the bit that reads a knob position to determine how much jitter, if any, is applied to the M clock, where would i look? what needs to be modified in the script?

i can use either LV.CV for an arc encoder, or the PARAM knob on teletype itself; i don’t have the TI expander.

i’ve managed to get kria’s clock jittering wildly, but i can’t seem to limit it or affect it with an arc encoder at all. kria never settles back down to its base regular clock at M 220 when the jitter knob is zeroed out.

i’m looking to get a regular kria clock tempo at M 220, no jitter, when the knob is fully CCW. and then at max jitter when the knob is fully clockwise, but only within a small range of possibilities, so jitter shouldn’t vary by more than, say, 40. i don’t want to adjust tempo at all–ideally, the same knob should set it back to 220 when jitter is back to 0.

here’s what i have so far (using variable D; the others are taken):

#7
D RSH LV.CV 1 7
PROB D: Y RAND - X / X 9
PROB - 100 D: Y 0

#M
LIM LV.CV 1 0 12850
X >> PRM 4; M X
SCRIPT 7
KR.CLK 0

#I
M 220; M.ACT 1

Wanted to check this with you after seeing this post as I have been trying this out, the Kria+JF.vox control. I seem to be getting sync problems, it can run ok for awhile then it would start dropping beats. And when the pattern on Kria changes, it also drops. Does this happen to you?

weird, i have never had any issues like that no. very, very solid. maybe firmware? not sure how to check just friends (prob the most recent) but my TT is 3.0.0 22D6CE8

You’re right, it is most likely the order of my code that is causing that.