Korg Volcas are great, affordable, analogue synthesizers for anyone, from people who has just joined the world of electronic music, to experienced music pros that found in them the beauty and simplicity that they provide.
After playing with them a while you get to see some limitations (I don't mean a limitation creativity-wise. People are creating great stuff with out of the box volcas.) such as a small keyboard, and another one (in my case) is the lack of knowledge on music theory. You soon want to create complex chords and different "movement" on your jams and not stick to the 16 beat integrated sequencer. (I repeat, this doesn't mean that you can't create great sound s with them).
I started to experiment on notes that just sounded good with each other and that took me to start reading on why this phenomenon happens. After reading some of https://en.wikipedia.org/wiki/Music_theory everything just made sense. I wanted to create some note combinations, transpose them to another scale, go back and then go to another scale. To achieve this instrument domain skill it takes years of practice (and that's just part of music).
Okay, so I noticed I'm a better software developer as I'm a Musician. So why not let a program do that for me. So some minutes on web searches and arduino uno r3was the best option and just some clicks away.
The main objective of the project is to re use an old arcade controls that where rusting at home and use the 7 buttons and 8 position joystick to move in one (for now) chrod progression and map the seven notes of the selected scale to the arcade buttons to send MIDI signal to the KORG volcas.
So, in schematics (Soon i'll upload a complete image) you can see how MIDI cable is connected using pin 1 for serial output. In code below there are two options for serial baud configuration that can be switched for midi (31250) or for the arduino IDE serial monitor that works on a different baud rate (last one is helpful for debugging purposes i.e. prtinting out "i pushed a button".).
Since buttons are digital input, each one of them must be connected to ground when they are not pressed, so ,a 10K resistor must be connected to the signal of the button. Please refer to diagram below on how its done.
Pins 2,3,4,5,6,7 and 8 will correspond to each one of the arcade buttons.
The joystick of this old arcade consists of 4 switches triggered by a stick providing us a set of combinations that we interpret as joystick positions.
The UP, DOWN, LEFT, RIGHT switches are connected to pins 8,9,10 and 11. Respectively.
MIDI information is written on pin 1 , used for serial output. This por is used also for uploading the sketch files, so be ware that a midi signal might be sent to a connected device if it's turned on. I repeatedly locked my volca when I was developing the software.
So after wiring everything up I'll tell you what's going on on the code.
First, As I mentioned before, chord progressions are the structure of many songs and they rely on some defined structures or scales. You can get the concept of it in the following video by Fretjam :
So if we take a look on our base note (f# in code, you can replace it by any other.), there's a scale related to it. This scale is given by half tone or whole tone increments. So to solve this there is an integer array representing the lenght "jumps" that are required from the base note to each one of the resulting scale note. So, the first element of the array is 0, because we do not need to add anything to the base note.
Also let's consider that there are several types of scales in our example we will need only these three for now. Each one with a different distance between notes.
So who says which type of scale will be used? the progression, so there is another array for it.
Initially i was using chars to select the type but its much easier to use 1-3 integers for it.
In this case I used the Ionian Progression, which has seven steps with a different mode assigned to each one. So, Joystick has 8 positions considering the ones that are between up, down, left and right.
Each time joystick is moved, the algorithm will calculate the offset for every button and map a note to it.
And that's it!
Here's a demo with the complete button mapping.