in DIY

I should be wiring-up the 4x4pole, but here I am fiddling with breadboards. Suddenly got it into my head that I must build an Euclidean Rhythm based MIDI/CV sequencer. Bjorklund’s algorithm will be used:

The problem reduces to the following: construct a binary sequence of n bits with k one’ s, such that the k one’ s are distributed as evenly as possible among the zero’ s. If k divides evenly (without remainder) into n, then the solution is obvious. For example, if n = 16 and k = 4, the solution is [1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0]. The problem of primary interest is when k and n are relatively prime numbers [23], i.e., when k and n are evenly divisible only by 1.

Toussaint discovered (only in 2004!) that the resulting patterns of spaced pulses often represent the rhythms of many word music styles. This presents a simple way to generate new and interesting drum patterns.

There are already other Euclidean generators out there, and even one in the MIDIbix Seq4, but I have my own nascent ideas, even if I only a little knowledge on how to implement them. Another distraction! 🙂

The logical conclusion to this effort should be a PCB for a unit that can act as a standalone MIDI/CV sequencer in a box, and one that is small enough to be integrated into a Eurorack setup. After some research I decided to start with Arduino. It comes with MDI libraries as standard, and already there are lots of interesting projects out there to reference.

In keeping with the DIY philosophy, I forewent the purchase of an Arduino board and instead opted to set-up a development environment using ATmega microcontroller and the Arduino libraries: – essentially to create an Arduino clone on a breadboard.

I am using the ‘standard’ Arduino chip – the ATmega328p (used in the MIDpal). As I had a spare ATmega644 (used in the Shruthi-1), I decided to breadboard it as well. The 644 is not officially supported by Arduino, however there is an Arduino-compatible bootloader called Sanguino.

IMG_4218

There is plenty of information out there on how to breadboard these chips. The most useful video I found was this one from Notes and Volts, which helped me setup the 328p in no time.

[youtube https://www.youtube.com/watch?v=ufQZnAAxZ7A&w=400&h=255]

In the process, the concept and function of the pins became clear, and I could easily map the ATmega pins to their Arduino equivalents using the following diagram:

atmega328-pinout

For the 644 I used this reference and this pinout diagram:

atmega644-pinout

Once hooked-up, I needed a way to program the chips. Fortuitously I had an Atmel AVRISPmkii to hand. I bought this to program my Shruthi chips and used it for all of 5 minutes a few years ago.

avrispmkii

There are some issues to watch out for when using the AVRIPSMKii with Arduino:

  • The various sources I referenced all used a 10K pull-up resistor on the reset pin, however for the AVRISPMkii to work properly, this pull-up resistor must not have a value higher that 4.7KOhm. See P26 of this document.
  • In Win7, the Atmel USB driver conflicts with the Arduino IDE. A different driver must be installed. Full details here.
  • On Linux, the toolchain and associated libraries need to be installed. Further, to get the Arduino IDE working, the correct USB device permissions must be set specifically for the AVRISPMKii. This is achieved by updatinbg the UDEV rules. See P12 of this document. Note: I had to use ATTR{idProduct} instead of SYSFS{idProduct}.
  • If using avrdude we must always specify that we are using the the port (-P usb). See the tutorial here.
  • A green status LED on AVR indicates that connections are good. With the AVRISP, the board MUST be separately powered (5v) in order for the AVR to detect and program the chip.

OK, so after overcoming the AVRISP driver issues, the next task was to set the fuses and install the Arduino boatloader onto the virgin chips. This requires hooking-up the AVRISP to the correct Arduino/Sanguino Pins. Referencing the pinout diagrams above, making the connections is an easy task, but one that must be approached slowly.

Referencing the AVRISPmkii pinouts:

avrispmkii_pinout

Just to be clear, this is pin 1:

IMG_4210

I made a little breadboard adaptor for it…

IMG_4176

IMG_4178

Ending-up with something like this:

IMG_4197

After triple-checking the connections, I fired-up Arduino IDE. After many failed attempts, I was still not able to bootload the damn things. Attempts at querying with avrdude always returned the following error:

avrdude: Device signature = 0x000000
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.

A web trawl suggested that this was due to the crystal not oscillating. Switching-out the crystal and trying instead a 16Mhz resonator returned the same error.

As it turned out, the default avrdude transfer speed is too fast for the virgin chips, therefore it’s necessary to adjust the baudrate (-B option in avrdude) to allow the initial communication. I didn’t realise this until after I solved it, and this was the problem that soaked-up most of my troubleshooting time. Bah!

The desperate answer in my case was to install Atmel AVR studio 6.2 – an overly torturous and bloated product (1.5Gb install), but one that bore immediate results when following this blog post.

Later, I realised that I could have done this much more quickly with Linux, and without the need for that massive Atmel install. Here are the required commands (Ubuntu).

Now fire-up Arduino IDE. No serial port is recognized on the AVRISPMKii, therefore trying to upload a sketch will return a ‘no Com port‘ error. It took me a few minutes to figure-out that you must instead ‘Upload using Programmer’ i.e press shift when sending the sketch (or just  cntrl-Shift-U). Also, it’s important to ensure you are uploading to the correct board type in the Arduino IDE (Arduino UNO vs Sanguin 644).

I attached a MIDI out port and an LCD, loaded-up a simple MIDI sketch to test it.

IMG_4206

It worked first time. A great start!

Next steps will be to wire-up some pots and buttons, and start writing the code.