Production-ready, cost-effective solution
on
Olimex A20 OLinuXino Micro

GPIO CONNECTION DIAGRAM
Pressing a key activates two contacts: first A(0,1,2,3,4,5,6,7), then B(0,1,2,3,4,5,6,7).
P0 = MIDI CH0, 8x(4+4) Pedal0, A0=(PD24,PD25,PD26,PD27), B0=(null)
K1 = MIDI CH1, 8x(8+8) Keyboard1, A1=(PG0,PG1,PE0,PE1,PH16,PH17,PB4,PB5), B1=(PG2,PG3,PE2,PE3,PH18,PH19,PB6,PB7)
K2 = MIDI CH2, 8x(8+8) Keyboard2, A2=(PG4,PG5,PE4,PE5,PH20,PH21,PB10,PB11), B2=(PG6,PG7,PE6,PE7,PH22,PH23,PB12,PB13)
K3 = MIDI CH3, 8x(8+8) Keyboard3, A3=(PG8,PG9,PE8,PE9,PH24,PH25,PH12,PH13), B3=(PG10,PG11,PE10,PE11,PH26,PH27,PH14,PH15)
K4 = MIDI CH4, 8x(8+8) Keyboard4, A4=(PI0,PI1,PI10,PI11,PC17,PC18,PH9,PH0), B4=(PI2,PI3,PI14,PI15,PC23,PC24,PH10,PB3)
The diode matrix is driven by the output lines. There are 3 equivalent synchronous outputs O(0,1,2,3,4,5,6,7). The electrical resistance must be added according to need. In each case the pulse is very short (~10us) but can be adjusted via software with a MIDI configuration command.
O0=(PD16,PD17,PD18,PD19,PD20,PD21,PD22,PD23)
O1=(PD8,PD9,PD10,PD11,PD12,PD13,PD14,PD15)
O2=(PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7)
BenckmarkMIDI check MIDI performance on
USB OTG port as
"Linux Gadget" USB MIDI virtual device
> running on Linux release 4.1.5-rt5 (version #1 SMP PREEMPT RT Fri Sep 11 03:20:44 CEST 2015) on x86_64
> set_realtime_priority(SCHED_FIFO, 99).. done.
> clock resolution: 0.000000001 s
> interval between measurements: 0.500 .. 1.000 ms
> sampling 1000000 midi latency values - please wait ...
> press Ctrl+C to abort test
> done.
> latency distribution:
...
0.059 - 0.060 ms: 75 #
0.060 - 0.061 ms: 4781 ######
0.061 - 0.062 ms: 10766 #############
0.062 - 0.063 ms: 8139 ##########
0.063 - 0.064 ms: 19781 ########################
0.064 - 0.065 ms: 20799 #########################
0.065 - 0.066 ms: 20535 #########################
0.066 - 0.067 ms: 20687 #########################
0.067 - 0.068 ms: 20491 #########################
0.068 - 0.069 ms: 20061 ########################
0.069 - 0.070 ms: 20034 ########################
0.070 - 0.071 ms: 20140 ########################
0.071 - 0.072 ms: 20848 #########################
0.072 - 0.073 ms: 24566 ##############################
0.073 - 0.074 ms: 27959 ##################################
0.074 - 0.075 ms: 30584 #####################################
0.075 - 0.076 ms: 33069 ########################################
0.076 - 0.077 ms: 36450 ############################################
0.077 - 0.078 ms: 37557 ##############################################
0.078 - 0.079 ms: 39061 ###############################################
0.079 - 0.080 ms: 38794 ###############################################
0.080 - 0.081 ms: 39553 ################################################
0.081 - 0.082 ms: 41265 ##################################################
0.082 - 0.083 ms: 38730 ###############################################
0.083 - 0.084 ms: 22118 ###########################
0.084 - 0.085 ms: 23029 ############################
0.085 - 0.086 ms: 23170 ############################
0.086 - 0.087 ms: 22896 ############################
0.087 - 0.088 ms: 22775 ############################
0.088 - 0.089 ms: 23106 ############################
0.089 - 0.090 ms: 22956 ############################
0.090 - 0.091 ms: 23344 ############################
0.091 - 0.092 ms: 22948 ############################
0.092 - 0.093 ms: 22661 ###########################
0.093 - 0.094 ms: 20392 #########################
0.094 - 0.095 ms: 17507 #####################
0.095 - 0.096 ms: 15593 ###################
0.096 - 0.097 ms: 13152 ################
0.097 - 0.098 ms: 10093 ############
0.098 - 0.099 ms: 7286 #########
0.099 - 0.100 ms: 7438 #########
0.100 - 0.101 ms: 7595 #########
0.101 - 0.102 ms: 7531 #########
0.102 - 0.103 ms: 7406 #########
0.103 - 0.104 ms: 6494 ########
0.104 - 0.105 ms: 4312 #####
0.105 - 0.106 ms: 4094 #####
0.106 - 0.107 ms: 4345 #####
0.107 - 0.108 ms: 4112 #####
0.108 - 0.109 ms: 4225 #####
0.109 - 0.110 ms: 4163 #####
0.110 - 0.111 ms: 4272 #####
0.111 - 0.112 ms: 4223 #####
0.112 - 0.113 ms: 4193 #####
0.113 - 0.114 ms: 4088 #####
0.114 - 0.115 ms: 3847 #####
0.115 - 0.116 ms: 3246 ####
0.116 - 0.117 ms: 2400 ###
0.117 - 0.118 ms: 1517 ##
0.118 - 0.119 ms: 644 #
0.119 - 0.120 ms: 176 #
0.120 - 0.121 ms: 162 #
0.121 - 0.122 ms: 120 #
0.122 - 0.123 ms: 162 #
0.123 - 0.124 ms: 151 #
0.124 - 0.125 ms: 145 #
0.125 - 0.126 ms: 112 #
0.126 - 0.127 ms: 96 #
0.127 - 0.128 ms: 84 #
0.128 - 0.129 ms: 95 #
0.129 - 0.130 ms: 87 #
0.130 - 0.131 ms: 80 #
0.131 - 0.132 ms: 86 #
0.132 - 0.133 ms: 78 #
0.133 - 0.134 ms: 89 #
0.134 - 0.135 ms: 67 #
0.135 - 0.136 ms: 62 #
0.136 - 0.137 ms: 60 #
0.137 - 0.138 ms: 43 #
0.138 - 0.139 ms: 30 #
0.139 - 0.140 ms: 14 #
0.140 - 0.141 ms: 13 #
0.141 - 0.142 ms: 6 #
0.142 - 0.143 ms: 11 #
0.143 - 0.144 ms: 7 #
0.144 - 0.145 ms: 5 #
0.145 - 0.146 ms: 5 #
0.146 - 0.147 ms: 6 #
0.147 - 0.148 ms: 8 #
0.148 - 0.149 ms: 8 #
0.149 - 0.150 ms: 7 #
0.150 - 0.151 ms: 6 #
0.151 - 0.152 ms: 7 #
0.152 - 0.153 ms: 6 #
0.153 - 0.154 ms: 5 #
0.154 - 0.155 ms: 3 #
0.155 - 0.156 ms: 1 #
...
0.163 - 0.164 ms: 1 #
> SUCCESS
best latency was 0.059 ms
worst latency was 0.163 ms, which is great.