Resources for building a sequencer from scratch?

Makes sense! Thanks for the detailed response!

2 Likes

I haven’t tested any Elektron boxes recently, but back in 2015 MIDI Clock output from the Analog series was much less stable than what Ableton managed to generate on OS X though a cheap Behringer interface.

1 Like

Following :popcorn:

2 Likes

I just wanted to throw up some more axoloti love haha! Axoloti works great if you’re like me and not very good at coding as there are plenty of objects to build synths and fx units without digging deeper but if you do code then you can make and adapt objects so you get the best of both.

The SQ is pretty damn good and the microcontroller comes on a board with midi in/out micro usb an sd card and stereo audio in and out all done for you. To add physical components there are solder pads on the board for around 20 analogue and digital ins and outs and gound and power pads as well.
You can also store several patches on the sd card so it could be a synth, load another an its an fx unit. There are some of the mutable instruments open source modules on there as well.
Check this mini buchla number - the video in the first post has a sound demo : D

1 Like

Midibox? http://www.ucapps.de/midibox_seq.html

I keep almost pulling the trigger on one of the new full kits from the midiphy guys https://www.midiphy.com/en/news/

I’ve built a Klee and have breadboarded a number of small 555 based sequencer circuits, but never anything from the software side. I think if I did I would start by looking at some of the teensy based eurorack projects on GitHub. Specifically the ornament and crime stuff. As a number of folks have written sequencers for that firmware.

1 Like

+1 for trying out a few easy designs using 555, 4017 etc on a breadboard. It’ll introduce you to hardware and you’ll be able to interface any PIC/Arduino boards too. Do a bit of reading up on logic gates, shift registers, multiplexers etc. By reading I mean the data Sheets for the chips. Have a look around for some old diy electronics books, they’re a great reference resource while you’re learning.

3 Likes

When i think of sequencers most lacking point at this time - is that general automation thing - i.e. volume curves, that lowers volume over time for X bars. I dont know why its so hard to program an automation layer, which is recording this in a linear fashion, or why its not possible to place a trig, which sets volume of the track to a certain level, or does a fade in/out after X bars.
(its ofc possible with abelton live etc.) Maybe circlon can do it - i didnt read its manual.
(Same for other midi CC is thinkable - essentially triggers that trigger mathematical functions /curves)

Also what i think would be cool, if there would be triggers, which are triggering whole musical phrases, instead of a single note. Maybe a track , which is triggering other tracks to start /stop.

1 Like

That’s solid advice. I moved onto axoloti after building Arduino synths an tinkering with various other electronics so had some experience. Probably wouldn’t have gone straight to soldering an £80 odd circuit board.

2 Likes

When you just want to get your hands dirty for the first time (without the need to build your own hardware first) I would highly suggest to make your own firmware for the Novation Launchpad Pro. It’s quite simply:

5 Likes

It’s definitely not automatically better but it “can” be better. When you have some “unknown code (operating system)” sharing the processor you don’t have control over what gets priority all of the time.

When you write code on a microcontroller you are in charge of every piece of code running on it and what interrupts what when or what get priority over something else.

You can still make mistakes or compromises that can affect the clock quality, no doubt.

2 Likes

In the audio world (read: the core processing loops) or when using micro controllers you won’t do any (dynamic) memory management at all, because it’s simply too slow and not predictable.

2 Likes

Yea something like Rust comes to mind but the LLVM doesn’t have that many convenient targets for the world of controllers. So C it is for most of this I guess!

1 Like

and/or Assembly Language :crazy_face:

https://upload.wikimedia.org/wikipedia/commons/f/f3/Motorola_6800_Assembly_Language.png

3 Likes

Yea I’d rather not hahahaha

2 Likes

:joy: Yeah, it’s simple, so simple that it’ll take you forever to do anything remotely complex.

Telling bits to move out of the way for new bits is for computers… or Assembly language lovers!

2 Likes

Codecademy licenses are much cheaper than Elektron boxes :slight_smile:

2 Likes

I had some time this evening and played around alittle bit with an ESP32.
It currently plays 3 tracks, 32 steps, 1/32 per step, each track is configured by passing stepcount, pulsecount and offset to an euclidean “algorithm”.
ESP32 sends MidiClock and the notes via Serial to my Mac. There I have “hairless-midiserial” running, that sends the midi data from the controller to my digitakt.
It is hard to hear on my phone, but there is a offbeat hihat running too.

Code is currently handling up to 8 tracks (can handle more, but I just started). Configuration is done in code, so no interface yet.

Next will be playing around with scales and Chordprogression patterns to generate a bass-line and some chords.

I will see, how much of a music-result I can get with pure c++ coding. If I am happy with the result, I can think about making it useable with buttons and a display. But I know myself. I am not the best in finishing started projects :stuck_out_tongue:

Thats the configuration for that simple FotF:

tracks[0].setChannel( 1); // Kick
tracks[0].euclid( 32, 4, 0);
tracks[0].setNote( 40);

tracks[1].setChannel( 3); // HiHat
tracks[1].setNote( 60);
tracks[1].euclid( 32, 4, 4);

tracks[2].setChannel( 2); // Snare
tracks[2].setNote( 60);
tracks[2].euclid( 32, 2, 8);

The euclid for track 0 is not in the video, as the sequence defaults to a FotF, because I tested with it.

5 Likes

That’s a ton of fun. Can choose different Rythm Generators (while having only one implemented) and different Note Generator (Having currently 2 Different kind of Arps now) combined with Euclidean Patterns that makes nice bass lines. Also have a simple harmony arp running.
Think I will implement a scale system next, that you can feed a scale, a Progression and it will use euclidean to decide when to change chords. All melody based features shall know about scale and Chord and play based on one of them.
Adding a way to decide melody and rythm by hand shouldn’t be an issue either.

Currently I am only playing 32th notes, need a system to handle Notenlength too.

Moving on faster than i thought…

1 Like

I now have a Progression Object that takes Scale and Chord-Progression Informations and provides the Tracks with the correct notes.
Currently using the notes is not that advanced. There is one type, that just takes the root note and plays it in an euclidean pattern and one that takes the chord notes and plays them again in an euclidean pattern.
I can define Arp Size (how many notes to play) and an offset, so it spreads it out over the octaves.
Currently the Arp-Sequencer doesn’t know when the Chord Progression changes, so by defining different pattern lengths for progression and arp, it all sound way less boring than it is :stuck_out_tongue:
Notes can have different length now. Currently in poly 8 mode, just so be sure, I don’t waste too much ram :wink:
Working on pad chords now…

Update:
Sorry, for spamming here…

It seems to go together quite fine!

I tell the code what to play:
That48 is a C4. The 32 is the 1/32 it should wait between chord changes. So its 1 bar.

Progression p( 48, 32);

Then I tell it what intervals (Major scale) and if the interval is played as minor or major chord (faster than checking against notes in scale). Maybe I change that, when I introduce more modes/scales and don’t want to add them all.
I also tell the system, that it should play a progression out of 4 chords, thats in this case I V VI and IV

p.setMode( INTERVALS_MAJOR, CHORDS_MAJOR);
p.setProgression( 4, PROGRESSION_1564);

Than I have 7 tracks to 7 different midi channels. For each track I can define a lot of stuff. The Midi Channel. What Rythm Pattern to play (I feed it a Euclidean all the time with different settings, steps, pulses and offset).
The Devider is used to slow the sequencer down for that track. That way I can play the 32 step arp-patter in 1/8th note instead of 1/32th.
I also can set Notelength and a “Melody”. The Melody defines, what notes are played. SingleNote just takes the Root-Note. Arp takes the Progressions Chord-Notes and plays an uprising sequence over it. Pad just takes the Chord, transposes it, if needed and plays it.
Legato defines if playing the same note, that is already playing stops and restarts it, or just enhances the length of the already playing note. That way I can create strummed chords out of an Arp Pattern.

Now I need a display and some buttons/knobs to play around with it!

MIDI goes into Digitakt for Channel 1-3 as Drums and then sent to Blofeld for some random factory presets :stuck_out_tongue:

tracks[0].setActive( true);
tracks[0].setChannel( 1); // Kick
tracks[0].setRythm( new Euclidean( 1, 1, 0));
tracks[0].setDevider( 8);

tracks[1].setActive( true);
tracks[1].setChannel( 3); // HiHat
tracks[1].setRythm( new Euclidean( 32, 4, 4));

tracks[2].setActive( true);
tracks[2].setChannel( 2); // Snare
tracks[2].setRythm( new Euclidean( 32, 2, 8));

tracks[3].setActive( true);
tracks[3].setChannel( 5); // Bass
tracks[3].setRythm( new Euclidean( 32, 4, 4));
tracks[3].setMelody( new SingleNote());
tracks[3].setVelocity( 120);
tracks[3].setNoteLength( 1);

tracks[4].setActive( true);
tracks[4].setChannel( 4); // Arp
tracks[4].setRythm( new Euclidean( 32, 13, 0));
tracks[4].setDevider( 2);
tracks[4].setVelocity( 120);
tracks[4].setNoteLength( 8);
tracks[4].setLegato( false);
tracks[4].setMelody( new Arp( 8, -12));

tracks[5].setActive( true);
tracks[5].setVelocity( 64);
tracks[5].setChannel( 6); // Pad
tracks[5].setRythm( new Euclidean( 32, 1, 0));
tracks[5].setNoteLength( 32);
tracks[5].setMelody( new Pad( 3, 0));

tracks[6].setActive( true);
tracks[6].setVelocity( 100);
tracks[6].setChannel( 7); // Chords
tracks[6].setRythm( new Euclidean( 32, 6, 4));
tracks[6].setDevider( 2);
tracks[6].setNoteLength( 2);
tracks[6].setMelody( new Pad( 3, 0));
5 Likes

On a completely different note (excuse the pun) here’s part of a simple design I did a while ago. Really need to crack on with it at some point. 16 steps, up/down/up&down, push button control all up and running across a couple of breadboards. Got most of it drawn up including a couple of 7 segment displays and variable gate per step. All done with (at the time) readily available CMOS logic. In fact I think the only discontinued part, in DIP package, is the 4067 mux. Shouldn’t be difficult to use a couple of 4051’s for example.

2 Likes