TRIPLES LFO Eurorack Module (Shameless Selfpromotion ahead!)


The symbol is the garden variety @

I certainly understand why Frank doesn’t want to spell out his email in plaintext only for millions of spam bots to harvest it.


I know it’s “at” m e . C0m . Do you have the prefix of it?


Try fcdaniels @ etc :slight_smile: It should work.


Thanks bud


pin 11 is still unused right?
what could it be used for?

maybe we could try to have a retrigger input.
if i am correct the interrupt can only use one condition at a time. so because it uses the timer right now we cant use a hardware interupt on that pin for retrigger.
might it be fast enough to read pin 11 in the main loop and/or interrupt anyways?

maybe with a small circuit (cap + diode and resistor to make the cap unload slower than load) to make very small triggers a bit longer so that they can get read.


at the end of the inerrupt it says:
'settimer 65395
settimer 65450
looks like you played around with the timer length here.
how did you come up with the number?


Indeed TRIPLES uses three interrupt driven Phase Accumulators for the LFOs, each one reading a 256 Byte Wavetable thats rendered into the misused Serial Input Buffer RAM (smart as i am :wink: )

The settings of the timer at the end of the interrupt routine are tuned by hand and adjust the amount of time scheduled to the main event loop. As the Interrupt is no Hardware Interrupt but emulated by the PicAxes OS it takes some time to jump back to the main Event loop, so if you make the remaining time to short (above 65450) the timer runs out before the interrupt is left, so no new interrupt is called from there. If you make it longer the update Frequency of the Phase Accumulators is lowered.

You are welcome to use Pin 11 for whatever you want (indeed an upcoming blue module will use an otherwise unused pin to illuminate the inside of the case in certain conditions, so your modules won’t fear in the dark…), but be aware that the update rate won’t be much above 20Hz (as long as you won’t lower the PhaseAccumulators Update Frequency…) AND you need additional circuitry (use 1/2 MPC6002 as Voltage follower to protect and clamp the Input) and another jack which i didn’t want to cram in - its already dense:

You find Pin 11 readily available below the Quartz, you can spot there 3 Pads, the rectangular is GND (always on my boards indicating PIN1 on Chips or GND), next is PIN 7 (A.4, output only) and nearest to the Chip its PIN 11 (C.0 IN/OUT - no A/D channel). You wouldn’t be able to use Hardware Interrupt on these pins cause this is only available on defined Pins on the PicAxe (B.0, B.1, B.2 on the 28x2 used in Triples).

The Upcoming RED LFO will have all kinds of Syncing features like RESET on trigger, TAP Tempo and Serial linking. TRIPLES is designed to be 3 free running auxiliary LFOs.

After all these explanations: How do you like it? :wink:


thanks for the explanation.

i wanted to only do a short test for funtionality yesterday after building and found myself noodeling with the modular for quite a while…
i guess that means i realy like it :wink:

it is my first lfo and only mod source besides 4x ad and one basic adsr so it upped my game quite a bit.


finally getting my package from the post office tomorrow: went just before closing to the one 2 blocks down the street from me and apparently the post office that delivers my mail is 2 miles away!

No wonder California is bankrupt…


Another idea would be using both available pins as Triggers for LFO 1 + 2, triggering when the Phase accumulator overflows……You could then sync your Envelopes to the LFO.


@fcd72: Perhaps you should have called your module “Several Species of Small Furry Animals Gathered Together in a Cave and Grooving with a PicAxe”, in reference to Ummagumma?




Or maybe Careful with that picaxe, Eugene


Got the last parts in today and it’s almost finished.
I just noticed the picaxe28x2 i ordered is just a normal pic18f25 … Could i have ordered just any pic18f25? or is the picaxe something special?


Oh just found it… there is a special bootloader pre-installed.


Yups, the PicAxe OS is preinstalled, but don’t fear - its only a few cents more expensive than the vanilla Pic. Drop me an eMail, ill send you the newest Triples Firmware….


Finally found time to upload the firmware…

Frank, You Rock! This is a wonderful module! So much LFO power in such a small package…
I’ve only got the first LFO output led that’s not working. I’ll have to check what i did wrong.
A few suggestions:
The LFO out led’s could be a bit brighter. Maybe i’ll change the resistors on those.
The LFO’s could be much slower… I like my like my LFO’s at 20 seconds :slight_smile: … I’ll have a look at the code to see how to change that.


If the LFO Output works and its just the LED you most likely have reversed it. Regarding the LFO Frequency: the LFOs are just 8 Bits - if you make them that slow you might hear the low resolution.

The Tempo for the selected LFO is set in Line 355 (Version 0.4)

> tempo_INC=tempoPot_value*phaseIncrement_constant

and as i was so clever to use as Constant you can simply change this in Line 110

> SYMBOL phaseIncrement_constant=20

Without touching the Code. Just lower it to make the LFOs slower.


I was expecting the LFO’s to be steppy because you advertised them as olds school 8 bit … But i didn’t hear any steppyness yet.
Changing the constant also changes the fastest LFO’s. I’d like to just increase the range.


You then need a bit more clever mechanism than just a simple multiplication.
As you you have plenty of space left in the eeprom (there are only the lowest 7 Bytes used….) you could use a simple Lookup table here.
Use the EEPROM Command to define the EEPROMs content at download (don’t forget to remove the #no_data compiler directive….) and look up the EEPROM like this:

First define a WORD variable “lookup_position_word” and a BYTE Variable " lookup_position_byte"

Then change replacing line 355 with something like this:

> lookup_position_word = tempoPot_value*tempoPot_value 'YOU NEED TO READ A WORD VALUE SO THE POSITION IS QUANTIZED BY 2

> lookup_position_word = lookup_position_word + 7 'ADD OFFSET, LOWEST 7 BYTES USED FOR SAVING LFOs STATUS



> READ lookup_position_byte, WORD tempo_INC 'READ WORD VARIABLE tempo_inc FROM EEPROM

So now you can store in your EEPROM the direct Values for the Increment, instead of calculating them and use any response curve you would like to extend the range. The values are stored as WORD Variable in Big Endian Order (MSB, LSB) starting at EEPROM Position 7.

Alternatively you could move the Sinus Table from Table Memory to EEPROM Memory and use the TABLE for full 256 Bytes saving you the hassle to check for overrun and give you full 7 Bits for the Tempo (instead of only 121 Values….)


I’m surprised how much of the code i can mess with without noticing any changes…