Re: [LAU] GPIO to alsa

From: Len Ovens <len@email-addr-hidden>
Date: Sun Feb 28 2016 - 21:26:10 EET

On Sun, 28 Feb 2016, Raphaël Mouneyres wrote:

> Having some bare keyboards and raspberry-sortof boards, I'd be
> interested in connecting both of them without using a midi interface,
> but only the available GPIO pins available on the board. This is as well
> to save external components and as a programming exercise.

Sort of in the same boat... I have a RPi on order and wish to use it as
the core of a MIDI/OSC/possibly OCA controller. I am using as a control
surface with buttons and encoders in the form of a mixer.

I want it to be cheap as in cost only a little and am finding it less
expensive to buy things than parts. For example, I want displays for
mettering, for encoder values, for switch value. look up encoder rings,
look up the supporting circuitry... not cheap, so I thought I can get a
7inch touch screen to put all that on that will plug right into the Rpi
pretty much $100CAD, but I was able to get a new android 9 inch tablet for
$70CAD which can act as a network teather device over USB. As a bonus, the
same sw I will have to develop to use it, will allow it to be used
wirelessly too.

Switches are also not cheap. even membrane switches end up costing more
than $1 each. I find this mind blowing when I paid $3 at the dollar store
for a keyboard with over 100 switches that comes with a controller built
in. Out of which I built this:
http://www.ovenwerks.net/hardware/3dollarcontrolsurface.html
The SW is user space and talks to Jack MIDI rather than ALSA.. I'll talk
more about that below.

I don't like membrane switches. However I can get a keyboard with cherry
mechanical switches for under $100 with no ledgend on them. (quite a lot
less for Cherry black, not so much less for Cherry Brown) Some of them
even have a LED per key (but not so much an individual method of driving
them I think)

I was originally planning to take my $3 keyboard and cut it up into 4
switch rows and rewire it, and plug the USB into into my RPi... done, I
have the SW to compile on the rpi already to go :) The "rollover" is only
4 and it would probably be nice to have more, but a lot of the mechanical
KB have "n rollover" if they are used with PS2. So I am going to see if I
can set up one of the RPi serial lines to deal with that.

> After searching for information, nothing revelant was found, except a
> experimental python script to read gpio and using the mididings library
> to output messages.

What kind of a keyboard for what use? If you mean a piano style keyboard
then latency becomes more important. I would suggest script may not be the
best way to go. c or c++ makes more sense.

> Is there a existing project which would scan rows/colums of a keyboard
> from the designated(configured) gpios, and throw midi message to an alsa
> midi port ?

My next phase for midikb (the SW I used above) is to add ALSA MIDI to the
mix. However, have you looked at:
http://ucapps.de/
http://wiki.midibox.org/
They do not use the RPi mostly because this project has been around longer
than the RPi.

> Would such a program better be a kernel module or a userland program ?

Personally I would like to get my project out of userland. Right now I am
using Jack so user land it is. But that means I have to give the user
access to the /dev/input/* files which are normally system. This does lend
itself to a possible security problem. (though the same thing may be
possible at the user level in X or whatever session manager is used. So I
would like to move to ALSA because it seems ALSA midi can deal with midi
ports across users (someone correct me if I am wrong). It looks (so far)
easier to run a system service tha "grabs" a keyboard (or the output of a
keyboard scanner) and just outputs MIDI to the ALSA sequencer ports. It is
still possible to tell ALSA "this is a HW device" from there. So that is
the next step in my audio SW training :) Making a kernel module/patch is
at another level of programming which i may attempt some day by starting
with the snd-serial-u16550 or mpu401 code.

In your case you need to learn about the scanning part first. This is
pretty much straight bit bang stuff. If you happen to have a set of
address lines, set to 0x01 output. then input data or input bit at a time.
Then shift left and input again. Not hard. Placement of diodes on switches
is important to allow chording (more than one switch at a time). After you
have this input you will want to do some debounce. Then you have a list of
keys that are down. What you do with them from there is up to you, some
kind of a lookup table to convert from key to MIDI note... 8 address by 8
data lines will give you 64 keys. Thats 16 GPIO lines for no external
circuitry. The RPi is not overflowing with gpio that are not
multipurpose... so maybe try this:
http://pi.gadgetoid.com/article/building-the-pico-piduino
or this:
http://www.hardkernel.com/main/products/prdt_info.php?g_code=G135390529643

Not very comprehensive for sure. However, that is what DIY is all about,
Take the bits, do research, make something new.

Enjoy.

--
Len Ovens
www.ovenwerks.net

_______________________________________________
Linux-audio-user mailing list
Linux-audio-user@email-addr-hidden
http://lists.linuxaudio.org/listinfo/linux-audio-user
Received on Mon Feb 29 00:15:02 2016

This archive was generated by hypermail 2.1.8 : Mon Feb 29 2016 - 00:15:02 EET