MIDI Keyboard Encoder - Arduino Piano/Keyboard (question)

I'm actually just about to start a similar project to convert an old organ console into a MIDI controller for my computer. Magician is right; you have two problems to tackle here: the (hardware) controller and the synthesis. Disclaimer: I'm also a complete newbie to Arduino, but I've done a fair bit of programming and I'm currently studying audio engineering.

Outputting MIDI via USB on the Arduino itself seems perfectly plausible, and also more sensible than wasting serial pins when you're already gifted with USB output :slight_smile: That SpikenzieLabs link looks like it could already have it sorted for you...

There is a library that reads switch matrices here: Arduino Playground - Keypad Library and it comes with its own tutorial: Arduino Playground - KeypadTutorial. It may need a little modification to handle large matrices (I need to read in 200 odd switch inputs!) but it looks like a very good start. The Arduino MIDI libraries look like they can handle all the MIDI output needs you'd ever want, so all you'd need to write is some code to map the output returned by the Keypad library into input for the MIDI library. The Keypad library has both key press and key release handling which you'd use to send your note-on and note-off messages. Handily, there's a built in event listener, which you'd probably want to use to call your own code.

Let me know how you get on; if I come up with anything handy, I'll be sure to stick it up on the Playground.

Well, I'm not sure that downloading Keypad Libraries would help me. So, let me make more clear :slight_smile:
As I told in a previous post I found this wiring diagram ---> http://midikits.net23.net/midi_8x9_keys/keys_8x9_switches.gif
and I think its ideal. It is really easy for me to make so this would be the one I am considering to use (unless sb has a better solution). The hardware issue is really sorted out! My only problem is how I' m going to make the Arduino to translate the short of two pins to binary information ready to be read by a midi software. This my plan:

  1. I Press a key.
  2. A switch creates a closed circuit between 2 Arduino pins.
  3. The Arduino "senses" that.
  4. And begins the "translation" process.
  5. Then it sends out a signal to the MIDI connector.
  6. The signal then is read by a MIDI device (which in my case would be the computer).

I have figured out steps 1, 2 and 6, but I have no idea what to do for steps 3 to 5. Keep in my mind that I'm not sure if this is the process required in order to output a MIDI signal, but I believe that you will understand what my point is.

Thank you for all your answers and help :slight_smile:

This is precisely what the Keypad library does :slight_smile: - take a look at the tutorial. The wiring diagram you posted is a keyboard matrix, which significantly reduces the number of required IO pins. To achieve step 3, you need matrix scanning code (which is what the Keypad library is). As a bonus, the way it is written eliminates the need for the diodes in your wiring diagram, hence the simpler diagram: Arduino Playground - HomePage Of course, instead of a keypad, you have a musical keyboard, but the principle is exactly the same, just with all the keys laid out in a single line instead of rows. There is plenty of info about scanning keyboard matrices on the web, but I suspect it'll just show you that using pre-built Arduino libraries will make life much easier :slight_smile:

Step 4 will be your own code to define which midi signals are sent out for which keys.

Step 5 MIDI signals themselves are dealt with by the MIDI library and whichever USB MIDI solution you choose to use. (Suggest you get it working on normal MIDI first, before getting caught up in USB MIDI stuff...)

If you really want all the details about scanning key matrices:

(Convinced me pretty thoroughly that Arduino was the way to go, but it brings up some interesting stuff nonetheless...)

sammyg:
To achieve step 3, you need matrix scanning code (which is what the Keypad library is). As a bonus, the way it is written eliminates the need for the diodes in your wiring diagram, hence the simpler

sammyg, you are correct that the diodes are not required for preventing shorts between keys on keypads and keyboards. But there is another problem called shadowing where some combinations of multiple keypresses will cause the keyboard driver to think that an extra key is being pressed when it is not. That would mean an extra note would be added to the chord. The solution is to place a diode across every key. All midi keyboards should already have the diodes but if op builds his own he should add them.

Ah, indeed; rather a large oversight on my part. Thank you for pointing this out mstanley and of course, thanks for writing such a useful library :slight_smile:

I built a MIDI controller with an old organ keyboard, an Arduino and two hc595 shift registers. It is documented in my blog (it's written in french, but maybe the sketch and schematics will be of some help?)

Scanning the keyboard and displaying the result on the serial monitor:

And then sending out MIDI messages:

:~ Hmmmm... All those tutorials confused me... The last one seemed to be the best, but unfortunately it is in French and I couldn't understand what's going on! I downloaded the Keypad and MIDI Libraries and installed them, but I really need some guidance for the code. As I've already mentioned I couldn't figure it out... I suppose that the given codes in the links need to be modified in order to work with my switch setup, which by the way I've built. I used these switches ---> http://www.superdroidrobots.com/images/TE-044-000.jpg and I also used 1N4148 diodes just in case. I installed them on a wooden structure but there are not any keys yet. These will be made later. Anyway... I know that I asked for instructions, but that doesn't obviously work... So, would anyone be kind enough to write the code for me, or give me some clear instructions on how to write the code on my own (don't forget that I want the code to co-operate with the swtitch setup I made).
Sorry for being such a newbie, but I really need to complete this project.
Thanks in advance...

Come on.... Somebody! I' ve already invested money in this project. It would be such a pity if I gave up!

It seems its too big a task for you, as you said yourself...So why dont you start with simpler things instead of expecting someone to do it for you ?!?
Above you have enough information and examples to guide you in your quest... But problem is you dont have the knowledge !! So, start researching and start doing things by steps !! You will get there in the end !!
No need to give up !!

I would say the same as iyahdub, start with very basic thing and only after that, try to integrate more difficult ones.
It will be very difficult to do this kind of project if you can't blink a led or read a port of the arduino.

So firstly try to connect a switch to a arduino port and a led on another port, then try to light the led when pressing the button (using arduino code), i know it looks ridiculous but you will learn how to read a port and write on another.
When you will be more familiar with arduino coding, try to use your switch matrix with the keypad library to light up few leds.
After this you can also try to use the midi library with one switch. (try to do a Midi Noteon using this switch).
When you manage to do all these mini projects, you will abl to combine all theses and finish your project.

What i'm trying to say is: try to split your project into smaller separate part, and do them one after one.

And don't forget .. google is your friend ..

and to help you a bit on midi lib : little-scale: Arduino MIDI out example

Thanks to everybody for your advice I'll get down to bussiness soon!

ypelletier:
I built a MIDI controller with an old organ keyboard, an Arduino and two hc595 shift registers. It is documented in my blog (it's written in french, but maybe the sketch and schematics will be of some help?)

I read French (I live in France) and my native language is English. If you are interested to have parallel French and English versions of those Arduino MIDI blog posts, I would be happy to translate them for you.

It would be great if you did so!

I'm about to start a similar project and although there no guarantee it will be finished any time soon, I will bookmark this topic so I can add a link when I have completed the necessary information gathering...

The project relates to building a basic midi keyboard (61 keys or so), generating on/off, velocity and possibly aftertouch data... Note, I won't use a diode matrix for keyboard scanning, probably something more on the lines of a common bus (polled configuration)... Anyway, I thought I mention it in case you loose interest...

I still have to determine what is necessary to use uno in midi mode, believe I need to reprogram 16u2 and a few other bits and pieces...
Mike

I'm looking forward to seeing your project! Thanks for the reply!

No midi in this on going project of mine, but similar idea using a cheap keyboard -

EDIT - post has been updated a lot - so not a repost. Code is still in need of a tidy up before I publish it, but I can send it to anyone who wants to try it.

Current features are - arpeggio record and play back with adjustable speed, 4 waveforms and transpose

Duane B

Magician:
....
Of course, you can do synthesis on PC, there are open source / free software available on-line

Magician, I spent hours looking for something like that for my project but did not find anything satisfactory.
Closer thing I found is VMPK: http://vmpk.sourceforge.net/
What do you recommend? I am looking of something "Arduino friendly".....

Thanks

OK guys I am wanting to do something similar to what's already been discussed. Basically I have built myself a 4-keyboard (3 manuals and one pedalboard) organ from old 70s analogue organs. There are also 40 tabs (switches). It kind of works as it is but it's nothing great, and the 40 tabs aren't connected to anything at all yet.

So I'm thinking about ignoring the analogue stuff and simply using the keyboards and tabs to generate midi signals, which is not such a big deal I can do keyboard scanning as already discussed, along with debouncing of course, plus I'm capable of reading the midi spec and generating midi protocol - although if I can find a library to do it for me, I don't mind at all!

But I don't really want a midi hardware interface because it's too slow: I want midi over USB. That's the only bit I know nothing about. I suppose I need a library like V-USB but in these forums I've read comments like "Implementing USB within the resource limitations of the these microcontrollers is "non-trivial"", and suggestions that it's best to use a second microcontroller purely for the USB, and that even the V-USB library is still "too complicated". So any pointers greatly welcomed.

The Arduino-compatible Teensy 2.0 and Teensy 2.0 ++ boards have native USB-MIDI. They show up as a class-compliant USB MIDI device and your OS will use it's built-in driver to talk to them. Also, MIDI over USB is faster (so, lower latency) than traditional current-loop DIN MIDI.

The comments about matrix scanning and diodes on your key matrix still apply. Probably useful to tread how a MIDI keyboard works and this DIYAudio forum posting.

So far, velocity sensitivity and channel aftertouch have not been mentioned - do your organ manuals have those?